@samitouri / QOS-React-2 / commits / 1b45e24392

Add Flight SSR benchmark fixture (#36180)

This PR adds a benchmark fixture for measuring the performance overhead of the React Server Components (RSC) Flight rendering compared to plain Fizz server-side rendering. ### Motivation Performance discussions around RSC (e.g. #36143, #35125) have highlighted the need for reproducible benchmarks that accurately measure the cost that Flight adds on top of Fizz. This fixture provides multiple benchmark modes that can be used to track performance improvements across commits, compare Node vs Edge (web streams) overhead, and identify bottlenecks in Flight serialization and deserialization. ### What it measures The benchmark renders a dashboard app with ~25 components (16 client components), 200 product rows with nested data (~325KB Flight payload), and ~250 Suspense boundaries in the async variant. It compares 8 render variants: Fizz-only and Flight+Fizz, across Node and Edge stream APIs, with both synchronous and asynchronous apps. ### Benchmark modes - **`yarn bench`** runs a sequential in-process benchmark with realistic Flight script injection (tee + `TransformStream`/`Transform` buffered injection), matching what real frameworks do when inlining the RSC payload into the HTML response for hydration. - **`yarn bench:bare`** runs the same benchmark without script injection, isolating the React-internal rendering cost. This is best for tracking changes to Flight serialization or Fizz rendering. - **`yarn bench:server`** starts an HTTP server and uses `autocannon` to measure real req/s at `c=1` and `c=10`. The `c=1` results provide a clean signal for tracking React-internal changes, while `c=10` reflects throughput under concurrent load. - **`yarn bench:concurrent`** runs an in-process concurrent benchmark with 50 in-flight renders via `Promise.all`, measuring throughput without HTTP overhead. - **`yarn bench:profile`** collects CPU profiles via the V8 inspector and reports the top functions by self-time along with GC pause data. - **`yarn start`** starts the HTTP server for manual browser testing. Appending `.rsc` to any Flight URL serves the raw Flight payload. ### Key findings during development On Node 22, the Flight+Fizz overhead compared to Fizz-only rendering is roughly: - **Without script injection** (`bench:bare`): ~2.2x for sync, ~1.3x for async - **With script injection** (`bench:server`, c=1): ~2.9x for sync, ~1.8x for async - **Edge vs Node** adds another ~30% for sync and ~10% for async, driven by the stream plumbing for script injection (tee + `TransformStream` buffering) The async variant better represents real-world applications where server components fetch data asynchronously. Its lower overhead reflects the fact that Flight serialization and Fizz rendering can overlap with I/O wait times, making the added Flight cost a smaller fraction of total request time. The benchmark also revealed that the Edge vs Node gap is negligible for Fizz-only rendering (~1-2%) but grows to ~15% for Flight+Fizz sync even without script injection. With script injection (tee + `TransformStream` buffering), the gap roughly doubles to ~30% for sync. The async variants show smaller gaps (~5% without, ~10% with injection).

Hendrik Liebau committed Apr 2, 2026 at 19:00 UTC 1b45e2439289fd8e094c44161c89e06c5488671e
39 files changed +4126
fixtures/flight-ssr-bench/README.md new
+62
@@ -0,0 +1,62 @@
1 +# Flight SSR Benchmark
2 +
3 +Measures the performance overhead of the React Server Components (RSC) Flight pipeline compared to plain Fizz server-side rendering, across both Node and Edge (web streams) APIs.
4 +
5 +## Prerequisites
6 +
7 +Build React from the repo root first:
8 +
9 +```sh
10 +yarn build-for-flight-prod
11 +```
12 +
13 +Then install the fixture's dependencies:
14 +
15 +```sh
16 +cd fixtures/flight-ssr-bench
17 +yarn install
18 +```
19 +
20 +## Scripts
21 +
22 +| Script | Purpose |
23 +| --- | --- |
24 +| `yarn bench` | Sequential benchmark with Flight script injection (realistic framework pipeline). Best for measuring Edge vs Node overhead. |
25 +| `yarn bench:bare` | Sequential benchmark without script injection. Best for measuring React-internal changes (e.g. Flight serialization optimizations) with less noise from stream plumbing. |
26 +| `yarn bench:server` | HTTP server benchmark using autocannon at c=1 and c=10. Best for measuring real-world req/s. The c=1 results are also useful for tracking React-internal changes. |
27 +| `yarn bench:concurrent` | In-process concurrent benchmark (50 in-flight renders). Measures throughput under load without HTTP overhead. |
28 +| `yarn bench:profile` | CPU profiling via V8 inspector. Saves `.cpuprofile` files to `build/profiles/`. |
29 +| `yarn start` | Starts the HTTP server for manual browser testing at `http://localhost:3001`. Append `.rsc` to any Flight URL to see the raw Flight payload. |
30 +
31 +## What it measures
32 +
33 +Each script benchmarks 8 render variants:
34 +
35 +- **Fizz (Node, sync/async)** -- plain `renderToPipeableStream`, no RSC
36 +- **Fizz (Edge, sync/async)** -- plain `renderToReadableStream`, no RSC
37 +- **Flight + Fizz (Node, sync/async)** -- full RSC pipeline: Flight server (`renderToPipeableStream`) -> Flight client (`createFromNodeStream`) -> Fizz (`renderToPipeableStream`)
38 +- **Flight + Fizz (Edge, sync/async)** -- full RSC pipeline: Flight server (`renderToReadableStream`) -> Flight client (`createFromReadableStream`) -> Fizz (`renderToReadableStream`)
39 +
40 +The "sync" variants use a fully synchronous app (no Suspense boundaries). The "async" variants use per-row async components with staggered delays and individual Suspense boundaries (~250 boundaries per render).
41 +
42 +### Script injection
43 +
44 +The `yarn bench` and `yarn bench:server` scripts simulate what real frameworks do: tee the Flight stream and inject `<script>` hydration tags into the HTML output. This uses a `setTimeout(0)`-buffered Transform/TransformStream to avoid splitting mid-HTML-tag. `yarn bench:bare` skips this for cleaner React-internal measurement.
45 +
46 +## Test app
47 +
48 +A dashboard with ~25 components (16 client components), rendering:
49 +
50 +- 200 product rows with nested reviews, specifications, and supplier data (~325KB Flight payload)
51 +- 50 activity feed items
52 +- Stats grid with 24-month chart data
53 +- Sidebar with navigation and recent activity
54 +
55 +## Output
56 +
57 +The overhead tables show two comparisons:
58 +
59 +1. **Flight overhead** -- Flight+Fizz vs Fizz-only (how much RSC adds)
60 +2. **Edge vs Node** -- web streams vs Node streams (stream implementation cost)
61 +
62 +Delta is shown as percentage change plus a factor (e.g. `+120% 2.20x` means 2.2x slower).
fixtures/flight-ssr-bench/bench-server.js new
+350
@@ -0,0 +1,350 @@
1 +'use strict';
2 +
3 +require('@babel/register')({
4 + presets: [['@babel/preset-react', {runtime: 'automatic'}]],
5 + plugins: ['@babel/plugin-transform-modules-commonjs'],
6 + only: [/\/src\//],
7 +});
8 +
9 +const http = require('http');
10 +const {Readable} = require('stream');
11 +const webpack = require('webpack');
12 +
13 +const {clientManifest, ssrManifest} = require('./webpack-mock');
14 +const {
15 + renderFizzNode,
16 + renderFizzEdge,
17 + renderFlightFizzNode,
18 + renderFlightFizzEdge,
19 +} = require('./render-helpers');
20 +const {printGrid} = require('./print-helpers');
21 +
22 +// ---------------------------------------------------------------------------
23 +// Build
24 +// ---------------------------------------------------------------------------
25 +
26 +function build() {
27 + const config = require('./webpack.config');
28 + return new Promise(function (resolve, reject) {
29 + webpack(config, function (err, stats) {
30 + if (err) {
31 + reject(err);
32 + return;
33 + }
34 + if (stats.hasErrors()) {
35 + reject(new Error(stats.toString({errors: true})));
36 + return;
37 + }
38 + console.log(
39 + stats.toString({colors: true, modules: false, entrypoints: false})
40 + );
41 + resolve();
42 + });
43 + });
44 +}
45 +
46 +// ---------------------------------------------------------------------------
47 +// Server
48 +// ---------------------------------------------------------------------------
49 +
50 +const ITEM_COUNT = 200;
51 +const PORT = 3001;
52 +
53 +async function main() {
54 + console.log('Building RSC bundle...\n');
55 + await build();
56 +
57 + const {
58 + renderRSCNode,
59 + renderRSCEdge,
60 + App: RSCApp,
61 + AppAsync: RSCAppAsync,
62 + } = require('./build/rsc-bundle.js');
63 + const App = require('./src/App.js').default;
64 + const AppAsync = require('./src/AppAsync.js').default;
65 +
66 + function pipeStreamToRes(stream, res) {
67 + if (typeof stream.pipe === 'function') {
68 + // Node Readable stream
69 + stream.pipe(res);
70 + } else {
71 + // Web ReadableStream — convert to Node stream for HTTP response
72 + Readable.fromWeb(stream).pipe(res);
73 + }
74 + }
75 +
76 + function pipeToRes(streamOrPromise, res) {
77 + if (typeof streamOrPromise.then === 'function') {
78 + streamOrPromise.then(
79 + function (stream) {
80 + pipeStreamToRes(stream, res);
81 + },
82 + function (err) {
83 + console.error(err);
84 + if (!res.headersSent) res.writeHead(500);
85 + res.end();
86 + }
87 + );
88 + } else {
89 + pipeStreamToRes(streamOrPromise, res);
90 + }
91 + }
92 +
93 + const routes = {
94 + '/fizz-node-sync': function (res) {
95 + pipeToRes(renderFizzNode(App, ITEM_COUNT), res);
96 + },
97 + '/fizz-node-async': function (res) {
98 + pipeToRes(renderFizzNode(AppAsync, ITEM_COUNT), res);
99 + },
100 + '/fizz-edge-sync': function (res) {
101 + pipeToRes(renderFizzEdge(App, ITEM_COUNT), res);
102 + },
103 + '/fizz-edge-async': function (res) {
104 + pipeToRes(renderFizzEdge(AppAsync, ITEM_COUNT), res);
105 + },
106 + '/flight-node-sync': function (res) {
107 + pipeToRes(
108 + renderFlightFizzNode(
109 + renderRSCNode,
110 + RSCApp,
111 + ITEM_COUNT,
112 + clientManifest,
113 + ssrManifest
114 + ),
115 + res
116 + );
117 + },
118 + '/flight-node-sync.rsc': function (res) {
119 + pipeStreamToRes(renderRSCNode(clientManifest, RSCApp, ITEM_COUNT), res);
120 + },
121 + '/flight-node-async': function (res) {
122 + pipeToRes(
123 + renderFlightFizzNode(
124 + renderRSCNode,
125 + RSCAppAsync,
126 + ITEM_COUNT,
127 + clientManifest,
128 + ssrManifest
129 + ),
130 + res
131 + );
132 + },
133 + '/flight-node-async.rsc': function (res) {
134 + pipeStreamToRes(
135 + renderRSCNode(clientManifest, RSCAppAsync, ITEM_COUNT),
136 + res
137 + );
138 + },
139 + '/flight-edge-sync': function (res) {
140 + pipeToRes(
141 + renderFlightFizzEdge(
142 + renderRSCEdge,
143 + RSCApp,
144 + ITEM_COUNT,
145 + clientManifest,
146 + ssrManifest
147 + ),
148 + res
149 + );
150 + },
151 + '/flight-edge-sync.rsc': function (res) {
152 + pipeStreamToRes(renderRSCEdge(clientManifest, RSCApp, ITEM_COUNT), res);
153 + },
154 + '/flight-edge-async': function (res) {
155 + pipeToRes(
156 + renderFlightFizzEdge(
157 + renderRSCEdge,
158 + RSCAppAsync,
159 + ITEM_COUNT,
160 + clientManifest,
161 + ssrManifest
162 + ),
163 + res
164 + );
165 + },
166 + '/flight-edge-async.rsc': function (res) {
167 + pipeStreamToRes(
168 + renderRSCEdge(clientManifest, RSCAppAsync, ITEM_COUNT),
169 + res
170 + );
171 + },
172 + };
173 +
174 + const server = http.createServer(function (req, res) {
175 + const handler = routes[req.url];
176 + if (!handler) {
177 + if (req.url === '/' || req.url === '') {
178 + res.writeHead(200, {'Content-Type': 'text/html'});
179 + res.end(
180 + '<html><body><h1>Flight SSR Bench</h1><ul>' +
181 + Object.keys(routes)
182 + .map(function (r) {
183 + return '<li><a href="' + r + '">' + r + '</a></li>';
184 + })
185 + .join('') +
186 + '</ul></body></html>'
187 + );
188 + return;
189 + }
190 + res.writeHead(404);
191 + res.end('Not found');
192 + return;
193 + }
194 + const contentType = req.url.endsWith('.rsc')
195 + ? 'text/x-component'
196 + : 'text/html';
197 + res.writeHead(200, {'Content-Type': contentType});
198 + handler(res);
199 + });
200 +
201 + await new Promise(function (resolve) {
202 + server.listen(PORT, resolve);
203 + });
204 +
205 + console.log('\nServer listening on http://localhost:%d', PORT);
206 + console.log('Endpoints:');
207 + for (const route of Object.keys(routes)) {
208 + console.log(' http://localhost:%d%s', PORT, route);
209 + }
210 +
211 + if (!process.argv.includes('--bench')) {
212 + return;
213 + }
214 +
215 + // Run autocannon against each endpoint.
216 + // Use a fixed request count (amount) instead of duration so that all
217 + // in-flight requests complete before autocannon closes connections.
218 + const autocannon = require('autocannon');
219 + const concurrencyLevels = [1, 10];
220 + const WARMUP_AMOUNT = 200;
221 + const BENCH_AMOUNT = 1000;
222 +
223 + function runAutocannon(benchUrl, connections, amount) {
224 + return new Promise(function (resolve, reject) {
225 + const instance = autocannon({url: benchUrl, connections, amount});
226 + autocannon.track(instance, {
227 + renderProgressBar: false,
228 + renderResultsTable: false,
229 + });
230 + instance.on('done', resolve);
231 + instance.on('error', reject);
232 + });
233 + }
234 +
235 + for (const c of concurrencyLevels) {
236 + console.log(
237 + '\n--- HTTP Benchmark (%d warmup, c=%d, %d requests) ---\n',
238 + WARMUP_AMOUNT,
239 + c,
240 + BENCH_AMOUNT
241 + );
242 +
243 + const results = {};
244 + const benchRoutes = Object.keys(routes).filter(function (r) {
245 + return !r.endsWith('.rsc');
246 + });
247 + const labelWidth = Math.max(
248 + ...benchRoutes.map(function (r) {
249 + return r.length - 1;
250 + })
251 + );
252 +
253 + const header =
254 + ''.padEnd(labelWidth) +
255 + ' ' +
256 + 'req/s'.padStart(14) +
257 + ' ' +
258 + 'p50'.padStart(8) +
259 + ' ' +
260 + 'p99'.padStart(8);
261 + console.log(' ' + header);
262 + console.log(' ' + '-'.repeat(header.length));
263 +
264 + for (const route of benchRoutes) {
265 + const label = route.slice(1);
266 + const benchUrl = 'http://localhost:' + PORT + route;
267 +
268 + // Warmup
269 + await runAutocannon(benchUrl, c, WARMUP_AMOUNT);
270 +
271 + const data = await runAutocannon(benchUrl, c, BENCH_AMOUNT);
272 + const reqPerSec = (1000 / data.latency.mean) * data.connections;
273 + const latencyMedian = data.latency.p50;
274 + const latencyP99 = data.latency.p99;
275 + const errors = data.errors + data.timeouts;
276 +
277 + results[label] = {reqPerSec, latencyMedian, latencyP99};
278 +
279 + let line =
280 + ' ' +
281 + label.padEnd(labelWidth) +
282 + ' ' +
283 + String(reqPerSec.toFixed(1)).padStart(8) +
284 + ' req/s' +
285 + ' ' +
286 + String(latencyMedian).padStart(5) +
287 + ' ms' +
288 + ' ' +
289 + String(latencyP99).padStart(5) +
290 + ' ms';
291 + if (errors > 0) {
292 + line += ' (' + errors + ' errors)';
293 + }
294 + console.log(line);
295 + }
296 +
297 + const rps = function (r) {
298 + return r.reqPerSec;
299 + };
300 +
301 + console.log('\n--- Flight overhead (c=%d) ---\n', c);
302 + printGrid(
303 + ['Fizz', 'Flight+Fizz'],
304 + [
305 + ['Node sync', results['fizz-node-sync'], results['flight-node-sync']],
306 + [
307 + 'Node async',
308 + results['fizz-node-async'],
309 + results['flight-node-async'],
310 + ],
311 + ['Edge sync', results['fizz-edge-sync'], results['flight-edge-sync']],
312 + [
313 + 'Edge async',
314 + results['fizz-edge-async'],
315 + results['flight-edge-async'],
316 + ],
317 + ],
318 + rps,
319 + 'req/s'
320 + );
321 +
322 + console.log('\n--- Edge vs Node (c=%d) ---\n', c);
323 + printGrid(
324 + ['Node', 'Edge'],
325 + [
326 + ['Fizz sync', results['fizz-node-sync'], results['fizz-edge-sync']],
327 + ['Fizz async', results['fizz-node-async'], results['fizz-edge-async']],
328 + [
329 + 'Flight+Fizz sync',
330 + results['flight-node-sync'],
331 + results['flight-edge-sync'],
332 + ],
333 + [
334 + 'Flight+Fizz async',
335 + results['flight-node-async'],
336 + results['flight-edge-async'],
337 + ],
338 + ],
339 + rps,
340 + 'req/s'
341 + );
342 + }
343 +
344 + server.close();
345 +}
346 +
347 +main().catch(function (err) {
348 + console.error(err);
349 + process.exit(1);
350 +});
fixtures/flight-ssr-bench/bench.js new
+726
@@ -0,0 +1,726 @@
1 +'use strict';
2 +
3 +require('@babel/register')({
4 + presets: [['@babel/preset-react', {runtime: 'automatic'}]],
5 + plugins: ['@babel/plugin-transform-modules-commonjs'],
6 + only: [/\/src\//],
7 +});
8 +
9 +const path = require('path');
10 +const fs = require('fs');
11 +const webpack = require('webpack');
12 +const inspector = require('node:inspector');
13 +
14 +const {clientManifest, ssrManifest} = require('./webpack-mock');
15 +
16 +const PROFILE_MODE = process.argv.includes('--profile');
17 +const CONCURRENT_MODE = process.argv.includes('--concurrent');
18 +const INJECT = !process.argv.includes('--no-injection');
19 +
20 +// ---------------------------------------------------------------------------
21 +// Build
22 +// ---------------------------------------------------------------------------
23 +
24 +function build() {
25 + const config = require('./webpack.config');
26 + return new Promise(function (resolve, reject) {
27 + webpack(config, function (err, stats) {
28 + if (err) {
29 + reject(err);
30 + return;
31 + }
32 + if (stats.hasErrors()) {
33 + reject(new Error(stats.toString({errors: true})));
34 + return;
35 + }
36 + console.log(
37 + stats.toString({colors: true, modules: false, entrypoints: false})
38 + );
39 + resolve();
40 + });
41 + });
42 +}
43 +
44 +// ---------------------------------------------------------------------------
45 +// Render helpers
46 +// ---------------------------------------------------------------------------
47 +
48 +const {
49 + renderFizzNode: renderFizzNodeStream,
50 + renderFizzEdge: renderFizzEdgeStream,
51 + renderFlightFizzNode: renderFlightFizzNodeStream,
52 + renderFlightFizzEdge: renderFlightFizzEdgeStream,
53 + nodeStreamToString,
54 + webStreamToString,
55 +} = require('./render-helpers');
56 +const {printGrid} = require('./print-helpers');
57 +
58 +function renderFizzNode(AppComponent, itemCount) {
59 + return nodeStreamToString(renderFizzNodeStream(AppComponent, itemCount));
60 +}
61 +
62 +function renderFizzEdge(AppComponent, itemCount) {
63 + return renderFizzEdgeStream(AppComponent, itemCount).then(webStreamToString);
64 +}
65 +
66 +function renderFlightFizzNode(renderRSCNode, AppComponent, itemCount) {
67 + return nodeStreamToString(
68 + renderFlightFizzNodeStream(
69 + renderRSCNode,
70 + AppComponent,
71 + itemCount,
72 + clientManifest,
73 + ssrManifest,
74 + {inject: INJECT}
75 + )
76 + );
77 +}
78 +
79 +function renderFlightFizzEdge(renderRSCEdge, AppComponent, itemCount) {
80 + return renderFlightFizzEdgeStream(
81 + renderRSCEdge,
82 + AppComponent,
83 + itemCount,
84 + clientManifest,
85 + ssrManifest,
86 + {inject: INJECT}
87 + ).then(webStreamToString);
88 +}
89 +
90 +// ---------------------------------------------------------------------------
91 +// Benchmarking
92 +// ---------------------------------------------------------------------------
93 +
94 +const canGC = typeof globalThis.gc === 'function';
95 +
96 +async function runBenchmark(name, fn, iterations, warmup) {
97 + if (canGC) globalThis.gc();
98 +
99 + // Warmup
100 + for (let i = 0; i < warmup; i++) {
101 + await fn();
102 + }
103 +
104 + // Collect GC pauses during timed iterations.
105 + let gcCount = 0;
106 + let gcTotalMs = 0;
107 + const gcObs = new PerformanceObserver(list => {
108 + for (const entry of list.getEntries()) {
109 + gcCount++;
110 + gcTotalMs += entry.duration;
111 + }
112 + });
113 + gcObs.observe({entryTypes: ['gc']});
114 +
115 + // Timed iterations
116 + const times = [];
117 + for (let i = 0; i < iterations; i++) {
118 + const start = performance.now();
119 + await fn();
120 + times.push(performance.now() - start);
121 + }
122 + gcObs.disconnect();
123 +
124 + // Trim top/bottom 5% to remove outliers
125 + const sorted = [...times].sort((a, b) => a - b);
126 + const trimCount = Math.floor(sorted.length * 0.05);
127 + const trimmed = sorted.slice(trimCount, sorted.length - trimCount);
128 +
129 + const mean = trimmed.reduce((s, t) => s + t, 0) / trimmed.length;
130 + const median = sorted[Math.floor(sorted.length / 2)];
131 + const stddev = Math.sqrt(
132 + trimmed.reduce((s, t) => s + (t - mean) ** 2, 0) / trimmed.length
133 + );
134 + const p95 = sorted[Math.floor(sorted.length * 0.95)];
135 + const min = sorted[0];
136 + const max = sorted[sorted.length - 1];
137 +
138 + return {
139 + name,
140 + mean,
141 + median,
142 + stddev,
143 + p95,
144 + min,
145 + max,
146 + iterations,
147 + gcCount,
148 + gcTotalMs,
149 + };
150 +}
151 +
152 +function printResult(result) {
153 + console.log(' %s:', result.name);
154 + console.log(' Mean: %s ms', result.mean.toFixed(2));
155 + console.log(' Median: %s ms', result.median.toFixed(2));
156 + console.log(' Stddev: %s ms', result.stddev.toFixed(2));
157 + console.log(' P95: %s ms', result.p95.toFixed(2));
158 + console.log(' Min: %s ms', result.min.toFixed(2));
159 + console.log(' Max: %s ms', result.max.toFixed(2));
160 + console.log(
161 + ' GC: %d pauses, %s ms total (%s ms/iter)',
162 + result.gcCount,
163 + result.gcTotalMs.toFixed(1),
164 + (result.gcTotalMs / result.iterations).toFixed(2)
165 + );
166 +}
167 +
168 +async function runConcurrent(name, fn, total, concurrency, warmup) {
169 + if (canGC) globalThis.gc();
170 +
171 + for (let i = 0; i < warmup; i++) {
172 + await fn();
173 + }
174 +
175 + let gcCount = 0;
176 + let gcTotalMs = 0;
177 + const gcObs = new PerformanceObserver(list => {
178 + for (const entry of list.getEntries()) {
179 + gcCount++;
180 + gcTotalMs += entry.duration;
181 + }
182 + });
183 + gcObs.observe({entryTypes: ['gc']});
184 +
185 + const latencies = new Array(total);
186 + let completed = 0;
187 + let launched = 0;
188 +
189 + const start = performance.now();
190 + await new Promise(resolve => {
191 + function launch() {
192 + while (launched < total && launched - completed < concurrency) {
193 + const idx = launched++;
194 + const t0 = performance.now();
195 + fn().then(() => {
196 + latencies[idx] = performance.now() - t0;
197 + completed++;
198 + if (completed === total) {
199 + resolve();
200 + } else {
201 + launch();
202 + }
203 + });
204 + }
205 + }
206 + launch();
207 + });
208 + const elapsed = performance.now() - start;
209 + gcObs.disconnect();
210 +
211 + const sorted = [...latencies].sort((a, b) => a - b);
212 + const mean = sorted.reduce((s, t) => s + t, 0) / sorted.length;
213 + const p95 = sorted[Math.floor(sorted.length * 0.95)];
214 +
215 + return {
216 + name,
217 + reqPerSec: (total / elapsed) * 1000,
218 + mean,
219 + p95,
220 + total,
221 + concurrency,
222 + gcCount,
223 + gcTotalMs,
224 + };
225 +}
226 +
227 +function printConcurrentResult(result) {
228 + console.log(' %s:', result.name);
229 + console.log(' Req/s: %s', result.reqPerSec.toFixed(1));
230 + console.log(' Mean: %s ms', result.mean.toFixed(2));
231 + console.log(' P95: %s ms', result.p95.toFixed(2));
232 + console.log(
233 + ' GC: %d pauses, %s ms total (%s ms/req)',
234 + result.gcCount,
235 + result.gcTotalMs.toFixed(1),
236 + (result.gcTotalMs / result.total).toFixed(2)
237 + );
238 +}
239 +
240 +// ---------------------------------------------------------------------------
241 +// CPU Profiling
242 +// ---------------------------------------------------------------------------
243 +
244 +function startProfiler() {
245 + const session = new inspector.Session();
246 + session.connect();
247 + return new Promise(function (resolve, reject) {
248 + session.post('Profiler.enable', function (err) {
249 + if (err) {
250 + reject(err);
251 + return;
252 + }
253 + session.post('Profiler.start', function (err2) {
254 + if (err2) {
255 + reject(err2);
256 + return;
257 + }
258 + resolve(session);
259 + });
260 + });
261 + });
262 +}
263 +
264 +function stopProfiler(session, outputPath) {
265 + return new Promise(function (resolve, reject) {
266 + session.post('Profiler.stop', function (err, {profile}) {
267 + if (err) {
268 + reject(err);
269 + return;
270 + }
271 + fs.mkdirSync(path.dirname(outputPath), {recursive: true});
272 + fs.writeFileSync(outputPath, JSON.stringify(profile));
273 + session.post('Profiler.disable');
274 + session.disconnect();
275 + resolve(profile);
276 + });
277 + });
278 +}
279 +
280 +function printTopFunctions(profile, topN) {
281 + // Aggregate self-time per function from the profile nodes.
282 + const selfTimes = new Map();
283 + for (const node of profile.nodes) {
284 + const name = node.callFrame.functionName || '(anonymous)';
285 + const loc = node.callFrame.url
286 + ? node.callFrame.url.replace(/.*\//, '') + ':' + node.callFrame.lineNumber
287 + : '(native)';
288 + const key = name + ' @ ' + loc;
289 + const hitCount = node.hitCount || 0;
290 + selfTimes.set(key, (selfTimes.get(key) || 0) + hitCount);
291 + }
292 +
293 + const sorted = [...selfTimes.entries()]
294 + .sort((a, b) => b[1] - a[1])
295 + .slice(0, topN);
296 +
297 + const totalSamples = profile.nodes.reduce((s, n) => s + (n.hitCount || 0), 0);
298 +
299 + console.log(' Top %d functions by self-time:', topN);
300 + for (const [key, hits] of sorted) {
301 + const pct = ((hits / totalSamples) * 100).toFixed(1);
302 + console.log(' %s%% - %s', pct, key);
303 + }
304 +}
305 +
306 +async function profileRun(name, fn, warmup, iterations, outputPath) {
307 + // Warmup (unprofiled)
308 + for (let i = 0; i < warmup; i++) {
309 + await fn();
310 + }
311 +
312 + // Collect GC pauses during the profiled run.
313 + let gcCount = 0;
314 + let gcTotalMs = 0;
315 + const gcObs = new PerformanceObserver(list => {
316 + for (const entry of list.getEntries()) {
317 + gcCount++;
318 + gcTotalMs += entry.duration;
319 + }
320 + });
321 + gcObs.observe({entryTypes: ['gc']});
322 +
323 + // Profiled run
324 + const session = await startProfiler();
325 + for (let i = 0; i < iterations; i++) {
326 + await fn();
327 + }
328 + const profile = await stopProfiler(session, outputPath);
329 + gcObs.disconnect();
330 +
331 + console.log(' %s → %s', name, outputPath);
332 + printTopFunctions(profile, 10);
333 + console.log(
334 + ' GC: %d pauses, %s ms total (%s ms/iter)',
335 + gcCount,
336 + gcTotalMs.toFixed(1),
337 + (gcTotalMs / iterations).toFixed(2)
338 + );
339 +}
340 +
341 +// ---------------------------------------------------------------------------
342 +// Main
343 +// ---------------------------------------------------------------------------
344 +
345 +async function main() {
346 + console.log('Building RSC bundle...\n');
347 + await build();
348 +
349 + const {
350 + renderRSCNode,
351 + renderRSCEdge,
352 + App: RSCApp,
353 + AppAsync: RSCAppAsync,
354 + } = require('./build/rsc-bundle.js');
355 + const App = require('./src/App.js').default;
356 + const AppAsync = require('./src/AppAsync.js').default;
357 +
358 + const ITEM_COUNT = 200;
359 +
360 + const WARMUP = 50;
361 + const ITERATIONS = 1000;
362 + const PROFILE_WARMUP = 50;
363 + const PROFILE_ITERATIONS = 500;
364 +
365 + // --- Verify renders ---
366 + console.log('\n--- Verifying renders ---\n');
367 +
368 + const fizzNodeHtml = await renderFizzNode(App, ITEM_COUNT);
369 + console.log('Fizz (Node, sync): %d bytes', fizzNodeHtml.length);
370 +
371 + const flightFizzNodeHtml = await renderFlightFizzNode(
372 + renderRSCNode,
373 + RSCApp,
374 + ITEM_COUNT
375 + );
376 + console.log(
377 + 'Flight + Fizz (Node, sync): %d bytes',
378 + flightFizzNodeHtml.length
379 + );
380 +
381 + const fizzNodeAsyncHtml = await renderFizzNode(AppAsync, ITEM_COUNT);
382 + console.log('Fizz (Node, async): %d bytes', fizzNodeAsyncHtml.length);
383 +
384 + const flightFizzNodeAsyncHtml = await renderFlightFizzNode(
385 + renderRSCNode,
386 + RSCAppAsync,
387 + ITEM_COUNT
388 + );
389 + console.log(
390 + 'Flight + Fizz (Node, async):%d bytes',
391 + flightFizzNodeAsyncHtml.length
392 + );
393 +
394 + const fizzEdgeHtml = await renderFizzEdge(App, ITEM_COUNT);
395 + console.log('Fizz (Edge, sync): %d bytes', fizzEdgeHtml.length);
396 +
397 + const fizzEdgeAsyncHtml = await renderFizzEdge(AppAsync, ITEM_COUNT);
398 + console.log('Fizz (Edge, async): %d bytes', fizzEdgeAsyncHtml.length);
399 +
400 + const flightFizzEdgeHtml = await renderFlightFizzEdge(
401 + renderRSCEdge,
402 + RSCApp,
403 + ITEM_COUNT
404 + );
405 + console.log(
406 + 'Flight + Fizz (Edge, sync): %d bytes',
407 + flightFizzEdgeHtml.length
408 + );
409 +
410 + const flightFizzEdgeAsyncHtml = await renderFlightFizzEdge(
411 + renderRSCEdge,
412 + RSCAppAsync,
413 + ITEM_COUNT
414 + );
415 + console.log(
416 + 'Flight + Fizz (Edge, async):%d bytes',
417 + flightFizzEdgeAsyncHtml.length
418 + );
419 +
420 + // --- CPU Profiling ---
421 + if (PROFILE_MODE) {
422 + console.log(
423 + '\n--- CPU Profiling (%d warmup, %d iterations) ---\n',
424 + PROFILE_WARMUP,
425 + PROFILE_ITERATIONS
426 + );
427 +
428 + const profileDir = path.resolve(__dirname, 'build/profiles');
429 +
430 + await profileRun(
431 + 'Fizz (Node, sync)',
432 + () => renderFizzNode(App, ITEM_COUNT),
433 + PROFILE_WARMUP,
434 + PROFILE_ITERATIONS,
435 + path.join(profileDir, 'fizz-node-sync.cpuprofile')
436 + );
437 +
438 + await profileRun(
439 + 'Flight + Fizz (Node, sync)',
440 + () => renderFlightFizzNode(renderRSCNode, RSCApp, ITEM_COUNT),
441 + PROFILE_WARMUP,
442 + PROFILE_ITERATIONS,
443 + path.join(profileDir, 'flight-fizz-node-sync.cpuprofile')
444 + );
445 +
446 + await profileRun(
447 + 'Fizz (Node, async)',
448 + () => renderFizzNode(AppAsync, ITEM_COUNT),
449 + PROFILE_WARMUP,
450 + PROFILE_ITERATIONS,
451 + path.join(profileDir, 'fizz-node-async.cpuprofile')
452 + );
453 +
454 + await profileRun(
455 + 'Flight + Fizz (Node, async)',
456 + () => renderFlightFizzNode(renderRSCNode, RSCAppAsync, ITEM_COUNT),
457 + PROFILE_WARMUP,
458 + PROFILE_ITERATIONS,
459 + path.join(profileDir, 'flight-fizz-node-async.cpuprofile')
460 + );
461 +
462 + await profileRun(
463 + 'Fizz (Edge, sync)',
464 + () => renderFizzEdge(App, ITEM_COUNT),
465 + PROFILE_WARMUP,
466 + PROFILE_ITERATIONS,
467 + path.join(profileDir, 'fizz-edge-sync.cpuprofile')
468 + );
469 +
470 + await profileRun(
471 + 'Flight + Fizz (Edge, sync)',
472 + () => renderFlightFizzEdge(renderRSCEdge, RSCApp, ITEM_COUNT),
473 + PROFILE_WARMUP,
474 + PROFILE_ITERATIONS,
475 + path.join(profileDir, 'flight-fizz-edge-sync.cpuprofile')
476 + );
477 +
478 + await profileRun(
479 + 'Fizz (Edge, async)',
480 + () => renderFizzEdge(AppAsync, ITEM_COUNT),
481 + PROFILE_WARMUP,
482 + PROFILE_ITERATIONS,
483 + path.join(profileDir, 'fizz-edge-async.cpuprofile')
484 + );
485 +
486 + await profileRun(
487 + 'Flight + Fizz (Edge, async)',
488 + () => renderFlightFizzEdge(renderRSCEdge, RSCAppAsync, ITEM_COUNT),
489 + PROFILE_WARMUP,
490 + PROFILE_ITERATIONS,
491 + path.join(profileDir, 'flight-fizz-edge-async.cpuprofile')
492 + );
493 +
494 + console.log(
495 + '\nProfiles saved to build/profiles/. Open in Chrome DevTools or speedscope.app.'
496 + );
497 +
498 + return;
499 + }
500 +
501 + // --- Concurrent Benchmark ---
502 + if (CONCURRENT_MODE) {
503 + const CONCURRENCY = 50;
504 + const TOTAL = 1000;
505 + const CONC_WARMUP = 20;
506 +
507 + console.log(
508 + '\n--- Concurrent Benchmark (%d warmup, %d concurrency, %d requests, %d items) ---\n',
509 + CONC_WARMUP,
510 + CONCURRENCY,
511 + TOTAL,
512 + ITEM_COUNT
513 + );
514 +
515 + const fizzNodeSync = await runConcurrent(
516 + 'Fizz (Node, sync)',
517 + () => renderFizzNode(App, ITEM_COUNT),
518 + TOTAL,
519 + CONCURRENCY,
520 + CONC_WARMUP
521 + );
522 + printConcurrentResult(fizzNodeSync);
523 +
524 + const flightFizzNodeSync = await runConcurrent(
525 + 'Flight + Fizz (Node, sync)',
526 + () => renderFlightFizzNode(renderRSCNode, RSCApp, ITEM_COUNT),
527 + TOTAL,
528 + CONCURRENCY,
529 + CONC_WARMUP
530 + );
531 + printConcurrentResult(flightFizzNodeSync);
532 +
533 + const fizzNodeAsync = await runConcurrent(
534 + 'Fizz (Node, async)',
535 + () => renderFizzNode(AppAsync, ITEM_COUNT),
536 + TOTAL,
537 + CONCURRENCY,
538 + CONC_WARMUP
539 + );
540 + printConcurrentResult(fizzNodeAsync);
541 +
542 + const flightFizzNodeAsync = await runConcurrent(
543 + 'Flight + Fizz (Node, async)',
544 + () => renderFlightFizzNode(renderRSCNode, RSCAppAsync, ITEM_COUNT),
545 + TOTAL,
546 + CONCURRENCY,
547 + CONC_WARMUP
548 + );
549 + printConcurrentResult(flightFizzNodeAsync);
550 +
551 + const fizzEdgeSync = await runConcurrent(
552 + 'Fizz (Edge, sync)',
553 + () => renderFizzEdge(App, ITEM_COUNT),
554 + TOTAL,
555 + CONCURRENCY,
556 + CONC_WARMUP
557 + );
558 + printConcurrentResult(fizzEdgeSync);
559 +
560 + const flightFizzEdgeSync = await runConcurrent(
561 + 'Flight + Fizz (Edge, sync)',
562 + () => renderFlightFizzEdge(renderRSCEdge, RSCApp, ITEM_COUNT),
563 + TOTAL,
564 + CONCURRENCY,
565 + CONC_WARMUP
566 + );
567 + printConcurrentResult(flightFizzEdgeSync);
568 +
569 + const fizzEdgeAsync = await runConcurrent(
570 + 'Fizz (Edge, async)',
571 + () => renderFizzEdge(AppAsync, ITEM_COUNT),
572 + TOTAL,
573 + CONCURRENCY,
574 + CONC_WARMUP
575 + );
576 + printConcurrentResult(fizzEdgeAsync);
577 +
578 + const flightFizzEdgeAsync = await runConcurrent(
579 + 'Flight + Fizz (Edge, async)',
580 + () => renderFlightFizzEdge(renderRSCEdge, RSCAppAsync, ITEM_COUNT),
581 + TOTAL,
582 + CONCURRENCY,
583 + CONC_WARMUP
584 + );
585 + printConcurrentResult(flightFizzEdgeAsync);
586 +
587 + const rps = r => r.reqPerSec;
588 +
589 + console.log('\n--- Flight overhead ---\n');
590 + printGrid(
591 + ['Fizz', 'Flight+Fizz'],
592 + [
593 + ['Node sync', fizzNodeSync, flightFizzNodeSync],
594 + ['Node async', fizzNodeAsync, flightFizzNodeAsync],
595 + ['Edge sync', fizzEdgeSync, flightFizzEdgeSync],
596 + ['Edge async', fizzEdgeAsync, flightFizzEdgeAsync],
597 + ],
598 + rps,
599 + 'req/s',
600 + 'higher is better'
601 + );
602 +
603 + console.log('\n--- Edge vs Node ---\n');
604 + printGrid(
605 + ['Node', 'Edge'],
606 + [
607 + ['Fizz sync', fizzNodeSync, fizzEdgeSync],
608 + ['Fizz async', fizzNodeAsync, fizzEdgeAsync],
609 + ['Flight+Fizz sync', flightFizzNodeSync, flightFizzEdgeSync],
610 + ['Flight+Fizz async', flightFizzNodeAsync, flightFizzEdgeAsync],
611 + ],
612 + rps,
613 + 'req/s',
614 + 'higher is better'
615 + );
616 +
617 + return;
618 + }
619 +
620 + // --- Benchmark ---
621 + console.log(
622 + '\n--- Benchmark (%d warmup, %d iterations, %d items) ---\n',
623 + WARMUP,
624 + ITERATIONS,
625 + ITEM_COUNT
626 + );
627 +
628 + const fizzNodeSync = await runBenchmark(
629 + 'Fizz (Node, sync)',
630 + () => renderFizzNode(App, ITEM_COUNT),
631 + ITERATIONS,
632 + WARMUP
633 + );
634 + printResult(fizzNodeSync);
635 +
636 + const flightFizzNodeSync = await runBenchmark(
637 + 'Flight + Fizz (Node, sync)',
638 + () => renderFlightFizzNode(renderRSCNode, RSCApp, ITEM_COUNT),
639 + ITERATIONS,
640 + WARMUP
641 + );
642 + printResult(flightFizzNodeSync);
643 +
644 + const fizzNodeAsync = await runBenchmark(
645 + 'Fizz (Node, async)',
646 + () => renderFizzNode(AppAsync, ITEM_COUNT),
647 + ITERATIONS,
648 + WARMUP
649 + );
650 + printResult(fizzNodeAsync);
651 +
652 + const flightFizzNodeAsync = await runBenchmark(
653 + 'Flight + Fizz (Node, async)',
654 + () => renderFlightFizzNode(renderRSCNode, RSCAppAsync, ITEM_COUNT),
655 + ITERATIONS,
656 + WARMUP
657 + );
658 + printResult(flightFizzNodeAsync);
659 +
660 + const fizzEdgeSync = await runBenchmark(
661 + 'Fizz (Edge, sync)',
662 + () => renderFizzEdge(App, ITEM_COUNT),
663 + ITERATIONS,
664 + WARMUP
665 + );
666 + printResult(fizzEdgeSync);
667 +
668 + const flightFizzEdgeSync = await runBenchmark(
669 + 'Flight + Fizz (Edge, sync)',
670 + () => renderFlightFizzEdge(renderRSCEdge, RSCApp, ITEM_COUNT),
671 + ITERATIONS,
672 + WARMUP
673 + );
674 + printResult(flightFizzEdgeSync);
675 +
676 + const fizzEdgeAsync = await runBenchmark(
677 + 'Fizz (Edge, async)',
678 + () => renderFizzEdge(AppAsync, ITEM_COUNT),
679 + ITERATIONS,
680 + WARMUP
681 + );
682 + printResult(fizzEdgeAsync);
683 +
684 + const flightFizzEdgeAsync = await runBenchmark(
685 + 'Flight + Fizz (Edge, async)',
686 + () => renderFlightFizzEdge(renderRSCEdge, RSCAppAsync, ITEM_COUNT),
687 + ITERATIONS,
688 + WARMUP
689 + );
690 + printResult(flightFizzEdgeAsync);
691 +
692 + const median = r => r.median;
693 +
694 + console.log('\n--- Flight overhead ---\n');
695 + printGrid(
696 + ['Fizz', 'Flight+Fizz'],
697 + [
698 + ['Node sync', fizzNodeSync, flightFizzNodeSync],
699 + ['Node async', fizzNodeAsync, flightFizzNodeAsync],
700 + ['Edge sync', fizzEdgeSync, flightFizzEdgeSync],
701 + ['Edge async', fizzEdgeAsync, flightFizzEdgeAsync],
702 + ],
703 + median,
704 + 'ms',
705 + 'median, lower is better'
706 + );
707 +
708 + console.log('\n--- Edge vs Node ---\n');
709 + printGrid(
710 + ['Node', 'Edge'],
711 + [
712 + ['Fizz sync', fizzNodeSync, fizzEdgeSync],
713 + ['Fizz async', fizzNodeAsync, fizzEdgeAsync],
714 + ['Flight+Fizz sync', flightFizzNodeSync, flightFizzEdgeSync],
715 + ['Flight+Fizz async', flightFizzNodeAsync, flightFizzEdgeAsync],
716 + ],
717 + median,
718 + 'ms',
719 + 'median, lower is better'
720 + );
721 +}
722 +
723 +main().catch(function (err) {
724 + console.error(err);
725 + process.exit(1);
726 +});
fixtures/flight-ssr-bench/package.json new
+34
@@ -0,0 +1,34 @@
1 +{
2 + "name": "flight-ssr-bench",
3 + "version": "0.1.0",
4 + "private": true,
5 + "devEngines": {
6 + "node": "20.x || 22.x"
7 + },
8 + "dependencies": {
9 + "@babel/core": "^7.16.0",
10 + "@babel/preset-react": "^7.22.5",
11 + "@babel/register": "^7.28.6",
12 + "babel-loader": "^8.2.3",
13 + "react": "experimental",
14 + "react-dom": "experimental",
15 + "react-server-dom-webpack": "experimental",
16 + "autocannon": "^8.0.0",
17 + "webpack": "^5.64.4"
18 + },
19 + "scripts": {
20 + "copy-modules": "cp -r ../../build/oss-experimental/* ./node_modules/",
21 + "prebench": "yarn copy-modules",
22 + "prebench:bare": "yarn copy-modules",
23 + "prebench:profile": "yarn copy-modules",
24 + "prebench:concurrent": "yarn copy-modules",
25 + "prebench:server": "yarn copy-modules",
26 + "prestart": "yarn copy-modules",
27 + "start": "NODE_ENV=production node bench-server.js",
28 + "bench": "NODE_ENV=production node --expose-gc bench.js",
29 + "bench:profile": "NODE_ENV=production node --expose-gc bench.js --profile",
30 + "bench:bare": "NODE_ENV=production node --expose-gc bench.js --no-injection",
31 + "bench:concurrent": "NODE_ENV=production node --expose-gc bench.js --concurrent",
32 + "bench:server": "NODE_ENV=production node bench-server.js --bench"
33 + }
34 +}
fixtures/flight-ssr-bench/print-helpers.js new
+54
@@ -0,0 +1,54 @@
1 +'use strict';
2 +
3 +function printGrid(colHeaders, rows, getValue, unit, note) {
4 + const labelWidth = Math.max(
5 + ...rows.map(function (r) {
6 + return r[0].length;
7 + })
8 + );
9 + const suffix = unit ? ' ' + unit : '';
10 + const fmtVal = function (v) {
11 + return (v.toFixed(1) + suffix).padStart(10 + suffix.length);
12 + };
13 + const fmtPct = function (v) {
14 + return ((v >= 0 ? '+' : '') + v.toFixed(1) + '%').padStart(8);
15 + };
16 + const fmtFactor = function (va, vb) {
17 + return ((vb / va).toFixed(2) + 'x').padStart(7);
18 + };
19 + const colWidth = 10 + suffix.length;
20 +
21 + const header =
22 + ''.padEnd(labelWidth) +
23 + ' ' +
24 + colHeaders
25 + .map(function (h) {
26 + return h.padStart(colWidth);
27 + })
28 + .join(' ') +
29 + ' Delta Factor';
30 + console.log(' ' + header);
31 + console.log(' ' + '-'.repeat(header.length));
32 + for (const [label, a, b] of rows) {
33 + const va = getValue(a);
34 + const vb = getValue(b);
35 + const pct = ((vb - va) / va) * 100;
36 + console.log(
37 + ' ' +
38 + label.padEnd(labelWidth) +
39 + ' ' +
40 + fmtVal(va) +
41 + ' ' +
42 + fmtVal(vb) +
43 + ' ' +
44 + fmtPct(pct) +
45 + ' ' +
46 + fmtFactor(va, vb)
47 + );
48 + }
49 + if (note) {
50 + console.log(' (%s)', note);
51 + }
52 +}
53 +
54 +module.exports = {printGrid};
fixtures/flight-ssr-bench/render-helpers.js new
+329
@@ -0,0 +1,329 @@
1 +'use strict';
2 +
3 +const {PassThrough, Transform} = require('stream');
4 +
5 +// ---------------------------------------------------------------------------
6 +// Fizz (Node) — renders App directly via Node streams.
7 +// Returns a Node Readable stream of HTML.
8 +// ---------------------------------------------------------------------------
9 +
10 +function renderFizzNode(AppComponent, itemCount) {
11 + const React = require('react');
12 + const {renderToPipeableStream} = require('react-dom/server');
13 +
14 + const output = new PassThrough();
15 + const {pipe} = renderToPipeableStream(
16 + React.createElement(AppComponent, {itemCount}),
17 + {
18 + onShellReady() {
19 + pipe(output);
20 + },
21 + onError(e) {
22 + console.error('Fizz Node error:', e);
23 + output.destroy(e);
24 + },
25 + }
26 + );
27 + return output;
28 +}
29 +
30 +// ---------------------------------------------------------------------------
31 +// Fizz (Edge) — renders App directly via web streams.
32 +// Returns a promise that resolves to a web ReadableStream of HTML.
33 +// ---------------------------------------------------------------------------
34 +
35 +function renderFizzEdge(AppComponent, itemCount) {
36 + const React = require('react');
37 + const {renderToReadableStream} = require('react-dom/server');
38 +
39 + return renderToReadableStream(React.createElement(AppComponent, {itemCount}));
40 +}
41 +
42 +// ---------------------------------------------------------------------------
43 +// Flight + Fizz (Node) — RSC render → tee → Fizz + script injection.
44 +// HTML chunks are buffered within a tick to avoid injecting scripts mid-tag.
45 +// Returns a Node Readable stream of HTML with injected Flight scripts.
46 +// ---------------------------------------------------------------------------
47 +
48 +function renderFlightFizzNode(
49 + renderRSCNode,
50 + AppComponent,
51 + itemCount,
52 + clientManifest,
53 + ssrManifest,
54 + opts
55 +) {
56 + const inject = !opts || opts.inject !== false;
57 + const React = require('react');
58 + const {renderToPipeableStream} = require('react-dom/server');
59 + const {createFromNodeStream} = require('react-server-dom-webpack/client');
60 +
61 + const {pipe: rscPipe} = renderRSCNode(
62 + clientManifest,
63 + AppComponent,
64 + itemCount
65 + );
66 +
67 + let flightStream;
68 + let flightScripts = '';
69 + if (inject) {
70 + // Tee the Flight stream into SSR + script injection
71 + const trunk = new PassThrough();
72 + const forSsr = new PassThrough();
73 + const forInline = new PassThrough();
74 + trunk.pipe(forSsr);
75 + trunk.pipe(forInline);
76 +
77 + forInline.on('data', function (chunk) {
78 + flightScripts +=
79 + '<script>(self.__FLIGHT_DATA||=[]).push(' +
80 + JSON.stringify(chunk.toString()) +
81 + ')</script>';
82 + });
83 +
84 + rscPipe(trunk);
85 + flightStream = forSsr;
86 + } else {
87 + flightStream = new PassThrough();
88 + rscPipe(flightStream);
89 + }
90 +
91 + let cachedResult;
92 + function Root() {
93 + if (!cachedResult) {
94 + cachedResult = createFromNodeStream(flightStream, ssrManifest);
95 + }
96 + return React.use(cachedResult);
97 + }
98 +
99 + const output = new PassThrough();
100 +
101 + const {pipe} = renderToPipeableStream(React.createElement(Root), {
102 + onShellReady() {
103 + if (inject) {
104 + // Buffer HTML chunks within a tick to avoid injecting scripts mid-tag.
105 + const trailer = '</body></html>';
106 + let buffered = [];
107 + let timeout = null;
108 + const injector = new Transform({
109 + transform(chunk, _encoding, cb) {
110 + buffered.push(chunk);
111 + if (!timeout) {
112 + timeout = setTimeout(() => {
113 + for (const buf of buffered) {
114 + let str = buf.toString();
115 + if (str.endsWith(trailer)) {
116 + str = str.slice(0, -trailer.length);
117 + }
118 + this.push(str);
119 + }
120 + buffered.length = 0;
121 + timeout = null;
122 + if (flightScripts) {
123 + this.push(flightScripts);
124 + flightScripts = '';
125 + }
126 + }, 0);
127 + }
128 + cb();
129 + },
130 + flush(cb) {
131 + if (timeout) {
132 + clearTimeout(timeout);
133 + for (const buf of buffered) {
134 + let str = buf.toString();
135 + if (str.endsWith(trailer)) {
136 + str = str.slice(0, -trailer.length);
137 + }
138 + this.push(str);
139 + }
140 + buffered.length = 0;
141 + }
142 + if (flightScripts) {
143 + this.push(flightScripts);
144 + flightScripts = '';
145 + }
146 + this.push(trailer);
147 + cb();
148 + },
149 + });
150 + pipe(injector);
151 + injector.pipe(output);
152 + } else {
153 + pipe(output);
154 + }
155 + },
156 + onError(e) {
157 + console.error('Flight+Fizz Node error:', e);
158 + output.destroy(e);
159 + },
160 + });
161 +
162 + return output;
163 +}
164 +
165 +// ---------------------------------------------------------------------------
166 +// Flight + Fizz (Edge) — RSC render → tee → Fizz + script injection via web
167 +// streams. HTML chunks are buffered within a tick to avoid injecting scripts
168 +// mid-tag. The </body></html> trailer is stripped, Flight scripts injected,
169 +// and the trailer re-added at flush.
170 +// Returns a promise that resolves to a web ReadableStream.
171 +// ---------------------------------------------------------------------------
172 +
173 +function renderFlightFizzEdge(
174 + renderRSCEdge,
175 + AppComponent,
176 + itemCount,
177 + clientManifest,
178 + ssrManifest,
179 + opts
180 +) {
181 + const inject = !opts || opts.inject !== false;
182 + const React = require('react');
183 + const {renderToReadableStream} = require('react-dom/server');
184 + const {
185 + createFromReadableStream,
186 + } = require('react-server-dom-webpack/client.edge');
187 +
188 + const webStream = renderRSCEdge(clientManifest, AppComponent, itemCount);
189 +
190 + let forSsr;
191 + let injector;
192 +
193 + if (inject) {
194 + const htmlTrailer = '</body></html>';
195 + const enc = new TextEncoder();
196 +
197 + let forInline;
198 + [forSsr, forInline] = webStream.tee();
199 +
200 + let resolveInline;
201 + const inlinePromise = new Promise(function (r) {
202 + resolveInline = r;
203 + });
204 + const htmlDecoder = new TextDecoder();
205 + let buffered = [];
206 + let timeout = null;
207 +
208 + function flushBuffered(controller) {
209 + for (const chunk of buffered) {
210 + let buf = htmlDecoder.decode(chunk, {stream: true});
211 + if (buf.endsWith(htmlTrailer)) {
212 + buf = buf.slice(0, -htmlTrailer.length);
213 + }
214 + controller.enqueue(enc.encode(buf));
215 + }
216 + const remaining = htmlDecoder.decode();
217 + if (remaining.length) {
218 + let buf = remaining;
219 + if (buf.endsWith(htmlTrailer)) {
220 + buf = buf.slice(0, -htmlTrailer.length);
221 + }
222 + controller.enqueue(enc.encode(buf));
223 + }
224 + buffered.length = 0;
225 + timeout = null;
226 + }
227 +
228 + function writeFlightChunk(data, controller) {
229 + controller.enqueue(
230 + enc.encode(
231 + '<script>(self.__FLIGHT_DATA||=[]).push(' +
232 + JSON.stringify(data) +
233 + ')</script>'
234 + )
235 + );
236 + }
237 +
238 + injector = new TransformStream({
239 + start(controller) {
240 + (async function () {
241 + const reader = forInline.getReader();
242 + const decoder = new TextDecoder('utf-8', {fatal: true});
243 + for (;;) {
244 + const {done, value} = await reader.read();
245 + if (done) break;
246 + writeFlightChunk(decoder.decode(value, {stream: true}), controller);
247 + }
248 + const remaining = decoder.decode();
249 + if (remaining.length) {
250 + writeFlightChunk(remaining, controller);
251 + }
252 + resolveInline();
253 + })();
254 + },
255 + transform(chunk, controller) {
256 + buffered.push(chunk);
257 + if (!timeout) {
258 + timeout = setTimeout(function () {
259 + flushBuffered(controller);
260 + }, 0);
261 + }
262 + },
263 + async flush(controller) {
264 + await inlinePromise;
265 + if (timeout) {
266 + clearTimeout(timeout);
267 + flushBuffered(controller);
268 + }
269 + controller.enqueue(enc.encode(htmlTrailer));
270 + },
271 + });
272 + } else {
273 + forSsr = webStream;
274 + }
275 +
276 + const cachedResult = createFromReadableStream(forSsr, {
277 + serverConsumerManifest: ssrManifest,
278 + });
279 + function Root() {
280 + return React.use(cachedResult);
281 + }
282 +
283 + return renderToReadableStream(React.createElement(Root)).then(
284 + function (htmlStream) {
285 + return injector ? htmlStream.pipeThrough(injector) : htmlStream;
286 + }
287 + );
288 +}
289 +
290 +// ---------------------------------------------------------------------------
291 +// Utilities: collect streams into strings.
292 +// ---------------------------------------------------------------------------
293 +
294 +function nodeStreamToString(nodeStream) {
295 + return new Promise(function (resolve, reject) {
296 + const chunks = [];
297 + nodeStream.on('data', function (chunk) {
298 + chunks.push(chunk);
299 + });
300 + nodeStream.on('end', function () {
301 + resolve(Buffer.concat(chunks).toString('utf-8'));
302 + });
303 + nodeStream.on('error', reject);
304 + });
305 +}
306 +
307 +function webStreamToString(webStream) {
308 + const reader = webStream.getReader();
309 + const chunks = [];
310 + function read() {
311 + return reader.read().then(function ({done, value}) {
312 + if (done) {
313 + return Buffer.concat(chunks).toString('utf-8');
314 + }
315 + chunks.push(Buffer.from(value));
316 + return read();
317 + });
318 + }
319 + return read();
320 +}
321 +
322 +module.exports = {
323 + renderFizzNode,
324 + renderFizzEdge,
325 + renderFlightFizzNode,
326 + renderFlightFizzEdge,
327 + nodeStreamToString,
328 + webStreamToString,
329 +};
fixtures/flight-ssr-bench/rsc-client-ref-loader.js new
+22
@@ -0,0 +1,22 @@
1 +'use strict';
2 +
3 +const url = require('url');
4 +
5 +// Webpack loader that runs in the RSC compilation.
6 +// When a module starts with 'use client', it replaces the entire source
7 +// with a client module proxy. This makes the RSC renderer serialize a
8 +// client reference into the Flight stream instead of rendering the component.
9 +module.exports = function rscClientRefLoader(source) {
10 + const trimmed = source.trimStart();
11 + if (
12 + trimmed.startsWith("'use client'") ||
13 + trimmed.startsWith('"use client"')
14 + ) {
15 + const href = url.pathToFileURL(this.resourcePath).href;
16 + return [
17 + `const { createClientModuleProxy } = require('react-server-dom-webpack/server');`,
18 + `module.exports = createClientModuleProxy(${JSON.stringify(href)});`,
19 + ].join('\n');
20 + }
21 + return source;
22 +};
fixtures/flight-ssr-bench/src/App.js new
+18
@@ -0,0 +1,18 @@
1 +import Shell from './components/Shell';
2 +import Sidebar from './components/Sidebar';
3 +import Dashboard from './components/Dashboard';
4 +import Footer from './components/Footer';
5 +
6 +export default function App({itemCount}) {
7 + return (
8 + <html>
9 + <body>
10 + <Shell>
11 + <Sidebar itemCount={itemCount} />
12 + <Dashboard itemCount={itemCount} />
13 + <Footer />
14 + </Shell>
15 + </body>
16 + </html>
17 + );
18 +}
fixtures/flight-ssr-bench/src/AppAsync.js new
+18
@@ -0,0 +1,18 @@
1 +import Shell from './components/Shell';
2 +import Sidebar from './components/Sidebar';
3 +import DashboardAsync from './components/DashboardAsync';
4 +import Footer from './components/Footer';
5 +
6 +export default function AppAsync({itemCount}) {
7 + return (
8 + <html>
9 + <body>
10 + <Shell>
11 + <Sidebar itemCount={itemCount} />
12 + <DashboardAsync itemCount={itemCount} />
13 + <Footer />
14 + </Shell>
15 + </body>
16 + </html>
17 + );
18 +}
fixtures/flight-ssr-bench/src/components/ActivityFeed.js new
+21
@@ -0,0 +1,21 @@
1 +import ActivityItem from './ActivityItem';
2 +
3 +export default function ActivityFeed({activities}) {
4 + return (
5 + <div className="activity-feed">
6 + <h3>Recent Activity</h3>
7 + <ul className="activity-list">
8 + {activities.map(activity => (
9 + <ActivityItem
10 + key={activity.id}
11 + type={activity.type}
12 + user={activity.user}
13 + message={activity.message}
14 + timestamp={activity.timestamp}
15 + details={activity.details}
16 + />
17 + ))}
18 + </ul>
19 + </div>
20 + );
21 +}
fixtures/flight-ssr-bench/src/components/ActivityItem.js new
+27
@@ -0,0 +1,27 @@
1 +'use client';
2 +
3 +export default function ActivityItem({
4 + type,
5 + user,
6 + message,
7 + timestamp,
8 + details,
9 +}) {
10 + return (
11 + <li className={'activity-item activity-' + type}>
12 + <div className="activity-icon" data-type={type} />
13 + <div className="activity-content">
14 + <p className="activity-message">{message}</p>
15 + <div className="activity-meta">
16 + <span className="activity-user">{user}</span>
17 + <span className="activity-time">{timestamp}</span>
18 + {details && (
19 + <span className="activity-details">
20 + {details.amount} &middot; {details.items} items
21 + </span>
22 + )}
23 + </div>
24 + </div>
25 + </li>
26 + );
27 +}
fixtures/flight-ssr-bench/src/components/Avatar.js new
+13
@@ -0,0 +1,13 @@
1 +'use client';
2 +
3 +export default function Avatar({name, role, src}) {
4 + return (
5 + <div className="avatar-container">
6 + <img className="avatar-img" src={src} alt={name} width={32} height={32} />
7 + <div className="avatar-info">
8 + <span className="avatar-name">{name}</span>
9 + <span className="avatar-role">{role}</span>
10 + </div>
11 + </div>
12 + );
13 +}
fixtures/flight-ssr-bench/src/components/Badge.js new
+6
@@ -0,0 +1,6 @@
1 +'use client';
2 +
3 +export default function Badge({count, variant}) {
4 + const className = 'badge' + (variant ? ' badge-' + variant : '');
5 + return <span className={className}>{count}</span>;
6 +}
fixtures/flight-ssr-bench/src/components/ChartPanel.js new
+24
@@ -0,0 +1,24 @@
1 +'use client';
2 +
3 +export default function ChartPanel({title, data, type}) {
4 + const maxVal = Math.max(...data.map(d => d.value));
5 + return (
6 + <div className="chart-panel">
7 + <h3 className="chart-title">{title}</h3>
8 + <div className={'chart chart-' + type}>
9 + {data.map(point => (
10 + <div key={point.month} className="chart-bar-group">
11 + <div
12 + className="chart-bar"
13 + style={{height: Math.round((point.value / maxVal) * 100) + '%'}}
14 + />
15 + <span className="chart-label">{point.month}</span>
16 + <span className="chart-value">
17 + ${(point.value / 1000).toFixed(0)}k
18 + </span>
19 + </div>
20 + ))}
21 + </div>
22 + </div>
23 + );
24 +}
fixtures/flight-ssr-bench/src/components/Dashboard.js new
+32
@@ -0,0 +1,32 @@
1 +import StatsGrid from './StatsGrid';
2 +import ProductTable from './ProductTable';
3 +import ActivityFeed from './ActivityFeed';
4 +import ChartPanel from './ChartPanel';
5 +import {generateProducts, generateActivities, generateStats} from './data';
6 +
7 +export default function Dashboard({itemCount}) {
8 + const products = generateProducts(itemCount);
9 + const activities = generateActivities(Math.min(itemCount, 50));
10 + const stats = generateStats();
11 +
12 + return (
13 + <main className="dashboard">
14 + <div className="dashboard-header">
15 + <h1>Dashboard Overview</h1>
16 + <p className="dashboard-subtitle">
17 + Welcome back. Here is what is happening with your store today.
18 + </p>
19 + </div>
20 + <StatsGrid stats={stats} />
21 + <div className="dashboard-grid">
22 + <div className="dashboard-main">
23 + <ProductTable products={products} />
24 + </div>
25 + <div className="dashboard-aside">
26 + <ChartPanel title="Revenue" data={stats.revenueByMonth} type="bar" />
27 + <ActivityFeed activities={activities} />
28 + </div>
29 + </div>
30 + </main>
31 + );
32 +}
fixtures/flight-ssr-bench/src/components/DashboardAsync.js new
+144
@@ -0,0 +1,144 @@
1 +import {Suspense} from 'react';
2 +import StatsGrid from './StatsGrid';
3 +import TableRow from './TableRow';
4 +import TableHeader from './TableHeader';
5 +import Pagination from './Pagination';
6 +import ActivityItem from './ActivityItem';
7 +import ChartPanel from './ChartPanel';
8 +import Skeleton from './Skeleton';
9 +import {generateProducts, generateActivities, generateStats} from './data';
10 +
11 +function fetchData(generator, ...args) {
12 + return new Promise(resolve => {
13 + setTimeout(() => resolve(generator(...args)), 1);
14 + });
15 +}
16 +
17 +function fetchDelayed(value, delayMs) {
18 + return new Promise(resolve => {
19 + setTimeout(() => resolve(value), delayMs);
20 + });
21 +}
22 +
23 +async function AsyncStatsSection() {
24 + const stats = await fetchData(generateStats);
25 + return <StatsGrid stats={stats} />;
26 +}
27 +
28 +const productColumns = [
29 + {key: 'name', label: 'Product'},
30 + {key: 'sku', label: 'SKU'},
31 + {key: 'category', label: 'Category'},
32 + {key: 'price', label: 'Price'},
33 + {key: 'stock', label: 'Stock'},
34 + {key: 'status', label: 'Status'},
35 + {key: 'rating', label: 'Rating'},
36 +];
37 +
38 +async function AsyncProductRow({product, delay}) {
39 + const resolved = await fetchDelayed(product, delay);
40 + return <TableRow product={resolved} columns={productColumns} />;
41 +}
42 +
43 +async function AsyncProductSection({itemCount}) {
44 + const products = await fetchData(generateProducts, itemCount);
45 + return (
46 + <div className="product-table-container">
47 + <div className="table-toolbar">
48 + <h2>Products</h2>
49 + <span className="table-count">{products.length} items</span>
50 + </div>
51 + <table className="product-table">
52 + <thead>
53 + <tr>
54 + {productColumns.map(col => (
55 + <TableHeader key={col.key} column={col} />
56 + ))}
57 + </tr>
58 + </thead>
59 + <tbody>
60 + {products.map((product, i) => (
61 + <Suspense
62 + key={product.id}
63 + fallback={
64 + <tr>
65 + <td colSpan={7}>Loading...</td>
66 + </tr>
67 + }>
68 + <AsyncProductRow product={product} delay={1 + (i % 5)} />
69 + </Suspense>
70 + ))}
71 + </tbody>
72 + </table>
73 + <Pagination total={products.length} pageSize={20} />
74 + </div>
75 + );
76 +}
77 +
78 +async function AsyncChartSection() {
79 + const stats = await fetchData(generateStats);
80 + return <ChartPanel title="Revenue" data={stats.revenueByMonth} type="bar" />;
81 +}
82 +
83 +async function AsyncActivityItem({activity, delay}) {
84 + const resolved = await fetchDelayed(activity, delay);
85 + return (
86 + <ActivityItem
87 + type={resolved.type}
88 + user={resolved.user}
89 + message={resolved.message}
90 + timestamp={resolved.timestamp}
91 + details={resolved.details}
92 + />
93 + );
94 +}
95 +
96 +async function AsyncActivitySection({itemCount}) {
97 + const activities = await fetchData(
98 + generateActivities,
99 + Math.min(itemCount, 50)
100 + );
101 + return (
102 + <div className="activity-feed">
103 + <h3>Recent Activity</h3>
104 + <ul className="activity-list">
105 + {activities.map((activity, i) => (
106 + <Suspense key={activity.id} fallback={<li>Loading...</li>}>
107 + <AsyncActivityItem activity={activity} delay={1 + (i % 5)} />
108 + </Suspense>
109 + ))}
110 + </ul>
111 + </div>
112 + );
113 +}
114 +
115 +export default function DashboardAsync({itemCount}) {
116 + return (
117 + <main className="dashboard">
118 + <div className="dashboard-header">
119 + <h1>Dashboard Overview</h1>
120 + <p className="dashboard-subtitle">
121 + Welcome back. Here is what is happening with your store today.
122 + </p>
123 + </div>
124 + <Suspense fallback={<Skeleton type="stats" />}>
125 + <AsyncStatsSection />
126 + </Suspense>
127 + <div className="dashboard-grid">
128 + <div className="dashboard-main">
129 + <Suspense fallback={<Skeleton type="table" />}>
130 + <AsyncProductSection itemCount={itemCount} />
131 + </Suspense>
132 + </div>
133 + <div className="dashboard-aside">
134 + <Suspense fallback={<Skeleton type="chart" />}>
135 + <AsyncChartSection />
136 + </Suspense>
137 + <Suspense fallback={<Skeleton type="feed" />}>
138 + <AsyncActivitySection itemCount={itemCount} />
139 + </Suspense>
140 + </div>
141 + </div>
142 + </main>
143 + );
144 +}
fixtures/flight-ssr-bench/src/components/Footer.js new
+47
@@ -0,0 +1,47 @@
1 +import FooterLink from './FooterLink';
2 +
3 +const footerSections = [
4 + {
5 + title: 'Product',
6 + links: ['Features', 'Pricing', 'Changelog', 'Docs', 'API Reference'],
7 + },
8 + {
9 + title: 'Company',
10 + links: ['About', 'Blog', 'Careers', 'Press', 'Partners'],
11 + },
12 + {
13 + title: 'Support',
14 + links: ['Help Center', 'Contact', 'Status', 'Community', 'Security'],
15 + },
16 + {
17 + title: 'Legal',
18 + links: ['Privacy', 'Terms', 'Cookie Policy', 'Licenses', 'GDPR'],
19 + },
20 +];
21 +
22 +export default function Footer() {
23 + return (
24 + <footer className="app-footer">
25 + <div className="footer-grid">
26 + {footerSections.map(section => (
27 + <div key={section.title} className="footer-section">
28 + <h4>{section.title}</h4>
29 + <ul>
30 + {section.links.map(link => (
31 + <li key={link}>
32 + <FooterLink
33 + href={'/' + link.toLowerCase().replace(/\s+/g, '-')}>
34 + {link}
35 + </FooterLink>
36 + </li>
37 + ))}
38 + </ul>
39 + </div>
40 + ))}
41 + </div>
42 + <div className="footer-bottom">
43 + <p>&copy; 2026 Acme Inc. All rights reserved.</p>
44 + </div>
45 + </footer>
46 + );
47 +}
fixtures/flight-ssr-bench/src/components/FooterLink.js new
+9
@@ -0,0 +1,9 @@
1 +'use client';
2 +
3 +export default function FooterLink({href, children}) {
4 + return (
5 + <a className="footer-link" href={href}>
6 + {children}
7 + </a>
8 + );
9 +}
fixtures/flight-ssr-bench/src/components/Header.js new
+22
@@ -0,0 +1,22 @@
1 +'use client';
2 +
3 +import Avatar from './Avatar';
4 +import SearchBar from './SearchBar';
5 +import NotificationBell from './NotificationBell';
6 +
7 +export default function Header({title, user}) {
8 + return (
9 + <header className="app-header">
10 + <div className="header-left">
11 + <h1 className="header-title">{title}</h1>
12 + </div>
13 + <div className="header-center">
14 + <SearchBar placeholder="Search products, orders, customers..." />
15 + </div>
16 + <div className="header-right">
17 + <NotificationBell count={3} />
18 + <Avatar name={user.name} role={user.role} src={user.avatar} />
19 + </div>
20 + </header>
21 + );
22 +}
fixtures/flight-ssr-bench/src/components/NavLink.js new
+10
@@ -0,0 +1,10 @@
1 +'use client';
2 +
3 +export default function NavLink({href, icon, children}) {
4 + return (
5 + <a className="nav-link" href={href}>
6 + <span className="nav-icon" data-icon={icon} />
7 + <span className="nav-label">{children}</span>
8 + </a>
9 + );
10 +}
fixtures/flight-ssr-bench/src/components/NotificationBell.js new
+10
@@ -0,0 +1,10 @@
1 +'use client';
2 +
3 +export default function NotificationBell({count}) {
4 + return (
5 + <button className="notification-bell" aria-label="Notifications">
6 + <span className="bell-icon">&#128276;</span>
7 + {count > 0 && <span className="notification-badge">{count}</span>}
8 + </button>
9 + );
10 +}
fixtures/flight-ssr-bench/src/components/Pagination.js new
+26
@@ -0,0 +1,26 @@
1 +'use client';
2 +
3 +export default function Pagination({total, pageSize}) {
4 + const pageCount = Math.ceil(total / pageSize);
5 + const pages = [];
6 + for (let i = 1; i <= pageCount; i++) {
7 + pages.push(i);
8 + }
9 + return (
10 + <div className="pagination">
11 + <button className="pagination-btn" disabled>
12 + Previous
13 + </button>
14 + <div className="pagination-pages">
15 + {pages.map(page => (
16 + <button
17 + key={page}
18 + className={'pagination-page' + (page === 1 ? ' active' : '')}>
19 + {page}
20 + </button>
21 + ))}
22 + </div>
23 + <button className="pagination-btn">Next</button>
24 + </div>
25 + );
26 +}
fixtures/flight-ssr-bench/src/components/ProductTable.js new
+40
@@ -0,0 +1,40 @@
1 +import TableRow from './TableRow';
2 +import TableHeader from './TableHeader';
3 +import Badge from './Badge';
4 +import Pagination from './Pagination';
5 +
6 +const columns = [
7 + {key: 'name', label: 'Product'},
8 + {key: 'sku', label: 'SKU'},
9 + {key: 'category', label: 'Category'},
10 + {key: 'price', label: 'Price'},
11 + {key: 'stock', label: 'Stock'},
12 + {key: 'status', label: 'Status'},
13 + {key: 'rating', label: 'Rating'},
14 +];
15 +
16 +export default function ProductTable({products}) {
17 + return (
18 + <div className="product-table-container">
19 + <div className="table-toolbar">
20 + <h2>Products</h2>
21 + <span className="table-count">{products.length} items</span>
22 + </div>
23 + <table className="product-table">
24 + <thead>
25 + <tr>
26 + {columns.map(col => (
27 + <TableHeader key={col.key} column={col} />
28 + ))}
29 + </tr>
30 + </thead>
31 + <tbody>
32 + {products.map(product => (
33 + <TableRow key={product.id} product={product} columns={columns} />
34 + ))}
35 + </tbody>
36 + </table>
37 + <Pagination total={products.length} pageSize={20} />
38 + </div>
39 + );
40 +}
fixtures/flight-ssr-bench/src/components/SearchBar.js new
+11
@@ -0,0 +1,11 @@
1 +'use client';
2 +
3 +export default function SearchBar({placeholder}) {
4 + return (
5 + <div className="search-bar">
6 + <span className="search-icon">&#128269;</span>
7 + <input type="search" className="search-input" placeholder={placeholder} />
8 + <kbd className="search-shortcut">&#8984;K</kbd>
9 + </div>
10 + );
11 +}
fixtures/flight-ssr-bench/src/components/Shell.js new
+16
@@ -0,0 +1,16 @@
1 +import Header from './Header';
2 +import ThemeProvider from './ThemeProvider';
3 +
4 +export default function Shell({children}) {
5 + return (
6 + <ThemeProvider theme="light">
7 + <div className="app-shell">
8 + <Header
9 + title="Acme Dashboard"
10 + user={{name: 'Jane Smith', role: 'Admin', avatar: '/img/avatar.png'}}
11 + />
12 + <div className="app-content">{children}</div>
13 + </div>
14 + </ThemeProvider>
15 + );
16 +}
fixtures/flight-ssr-bench/src/components/Sidebar.js new
+58
@@ -0,0 +1,58 @@
1 +import NavLink from './NavLink';
2 +import SidebarSection from './SidebarSection';
3 +import Badge from './Badge';
4 +
5 +const navItems = [
6 + {href: '/', label: 'Dashboard', icon: 'home'},
7 + {href: '/products', label: 'Products', icon: 'box', count: 142},
8 + {href: '/orders', label: 'Orders', icon: 'cart', count: 38},
9 + {href: '/customers', label: 'Customers', icon: 'users'},
10 + {href: '/analytics', label: 'Analytics', icon: 'chart'},
11 + {href: '/settings', label: 'Settings', icon: 'gear'},
12 +];
13 +
14 +const recentItems = [
15 + {id: 1, label: 'Order #1234', status: 'pending'},
16 + {id: 2, label: 'Order #1235', status: 'shipped'},
17 + {id: 3, label: 'Order #1236', status: 'delivered'},
18 + {id: 4, label: 'Return #891', status: 'processing'},
19 +];
20 +
21 +export default function Sidebar({itemCount}) {
22 + return (
23 + <aside className="sidebar">
24 + <nav className="sidebar-nav">
25 + <SidebarSection title="Navigation">
26 + {navItems.map(item => (
27 + <NavLink key={item.href} href={item.href} icon={item.icon}>
28 + {item.label}
29 + {item.count != null && <Badge count={item.count} />}
30 + </NavLink>
31 + ))}
32 + </SidebarSection>
33 + <SidebarSection title="Recent Activity">
34 + {recentItems.map(item => (
35 + <div key={item.id} className="recent-item">
36 + <span className="recent-label">{item.label}</span>
37 + <Badge count={item.status} variant="status" />
38 + </div>
39 + ))}
40 + </SidebarSection>
41 + <SidebarSection title="Quick Stats">
42 + <div className="stat">
43 + <span className="stat-label">Total Items</span>
44 + <span className="stat-value">{itemCount}</span>
45 + </div>
46 + <div className="stat">
47 + <span className="stat-label">Active Users</span>
48 + <span className="stat-value">1,247</span>
49 + </div>
50 + <div className="stat">
51 + <span className="stat-label">Revenue</span>
52 + <span className="stat-value">$84,320</span>
53 + </div>
54 + </SidebarSection>
55 + </nav>
56 + </aside>
57 + );
58 +}
fixtures/flight-ssr-bench/src/components/SidebarSection.js new
+10
@@ -0,0 +1,10 @@
1 +'use client';
2 +
3 +export default function SidebarSection({title, children}) {
4 + return (
5 + <div className="sidebar-section">
6 + <h3 className="sidebar-section-title">{title}</h3>
7 + <div className="sidebar-section-content">{children}</div>
8 + </div>
9 + );
10 +}
fixtures/flight-ssr-bench/src/components/Skeleton.js new
+9
@@ -0,0 +1,9 @@
1 +'use client';
2 +
3 +export default function Skeleton({type}) {
4 + return (
5 + <div className={'skeleton skeleton-' + type} aria-busy="true">
6 + <div className="skeleton-shimmer" />
7 + </div>
8 + );
9 +}
fixtures/flight-ssr-bench/src/components/StatCard.js new
+24
@@ -0,0 +1,24 @@
1 +'use client';
2 +
3 +export default function StatCard({title, value, change, trend, sparkline}) {
4 + return (
5 + <div className="stat-card">
6 + <div className="stat-card-header">
7 + <span className="stat-card-title">{title}</span>
8 + <span className={'stat-card-change trend-' + trend}>{change}</span>
9 + </div>
10 + <div className="stat-card-value">{value}</div>
11 + <div className="stat-card-sparkline">
12 + {sparkline.map((point, i) => (
13 + <span
14 + key={i}
15 + className="sparkline-bar"
16 + style={{
17 + height: Math.round((point / Math.max(...sparkline)) * 100) + '%',
18 + }}
19 + />
20 + ))}
21 + </div>
22 + </div>
23 + );
24 +}
fixtures/flight-ssr-bench/src/components/StatsGrid.js new
+18
@@ -0,0 +1,18 @@
1 +import StatCard from './StatCard';
2 +
3 +export default function StatsGrid({stats}) {
4 + return (
5 + <div className="stats-grid">
6 + {stats.cards.map(card => (
7 + <StatCard
8 + key={card.title}
9 + title={card.title}
10 + value={card.value}
11 + change={card.change}
12 + trend={card.trend}
13 + sparkline={card.sparkline}
14 + />
15 + ))}
16 + </div>
17 + );
18 +}
fixtures/flight-ssr-bench/src/components/TableHeader.js new
+10
@@ -0,0 +1,10 @@
1 +'use client';
2 +
3 +export default function TableHeader({column}) {
4 + return (
5 + <th className="table-header" data-column={column.key}>
6 + <span className="table-header-label">{column.label}</span>
7 + <span className="table-header-sort" aria-label="Sort" />
8 + </th>
9 + );
10 +}
fixtures/flight-ssr-bench/src/components/TableRow.js new
+31
@@ -0,0 +1,31 @@
1 +'use client';
2 +
3 +import Badge from './Badge';
4 +
5 +export default function TableRow({product, columns}) {
6 + return (
7 + <tr className="table-row">
8 + {columns.map(col => (
9 + <td key={col.key} className="table-cell" data-column={col.key}>
10 + {col.key === 'status' ? (
11 + <Badge count={product[col.key]} variant="status" />
12 + ) : col.key === 'price' ? (
13 + <span className="price">${product[col.key]}</span>
14 + ) : col.key === 'rating' ? (
15 + <span className="rating">
16 + <span className="star">&#9733;</span> {product[col.key]}
17 + <span className="review-count">({product.reviewCount})</span>
18 + </span>
19 + ) : col.key === 'name' ? (
20 + <div className="product-name-cell">
21 + <span className="product-name">{product.name}</span>
22 + <span className="product-category">{product.category}</span>
23 + </div>
24 + ) : (
25 + product[col.key]
26 + )}
27 + </td>
28 + ))}
29 + </tr>
30 + );
31 +}
fixtures/flight-ssr-bench/src/components/ThemeProvider.js new
+9
@@ -0,0 +1,9 @@
1 +'use client';
2 +
3 +export default function ThemeProvider({theme, children}) {
4 + return (
5 + <div className={'theme-' + theme} data-theme={theme}>
6 + {children}
7 + </div>
8 + );
9 +}
fixtures/flight-ssr-bench/src/components/data.js new
+293
@@ -0,0 +1,293 @@
1 +const categories = [
2 + 'Electronics',
3 + 'Clothing',
4 + 'Home & Garden',
5 + 'Sports',
6 + 'Books',
7 + 'Toys',
8 + 'Food',
9 + 'Health',
10 +];
11 +const statuses = ['In Stock', 'Low Stock', 'Out of Stock', 'Discontinued'];
12 +const activityTypes = [
13 + 'order_placed',
14 + 'order_shipped',
15 + 'order_delivered',
16 + 'refund_requested',
17 + 'review_posted',
18 + 'product_added',
19 + 'stock_alert',
20 + 'payment_received',
21 +];
22 +const userNames = [
23 + 'Alice Johnson',
24 + 'Bob Williams',
25 + 'Carol Davis',
26 + 'Dan Miller',
27 + 'Eve Wilson',
28 + 'Frank Moore',
29 + 'Grace Taylor',
30 + 'Henry Anderson',
31 + 'Iris Thomas',
32 + 'Jack Jackson',
33 +];
34 +const reviewTexts = [
35 + 'Great product, exactly what I needed. The quality exceeded my expectations and shipping was fast.',
36 + 'Decent value for the price. Some minor issues with packaging but the product itself works well.',
37 + 'Not what I expected based on the description. Returning this item for a refund.',
38 + 'Outstanding quality and craftsmanship. Would highly recommend to anyone looking for this type of item.',
39 + 'Average product, nothing special. Does what it says but nothing more than that.',
40 +];
41 +
42 +export function generateProducts(count) {
43 + const products = [];
44 + for (let i = 0; i < count; i++) {
45 + products.push({
46 + id: i,
47 + name: 'Product ' + i,
48 + sku: 'SKU-' + String(i).padStart(6, '0'),
49 + price: (((i * 17 + 3) % 9999) / 100).toFixed(2),
50 + category: categories[i % categories.length],
51 + status: statuses[i % statuses.length],
52 + stock: (i * 7 + 13) % 500,
53 + rating: (((i * 3 + 1) % 50) / 10).toFixed(1),
54 + reviewCount: (i * 13 + 5) % 200,
55 + description:
56 + 'This is a detailed description for product ' +
57 + i +
58 + '. It includes specifications, features, and other relevant information that a customer might need.',
59 + tags: [
60 + categories[(i + 1) % categories.length].toLowerCase(),
61 + i % 2 === 0 ? 'featured' : 'new',
62 + i % 3 === 0 ? 'sale' : 'regular',
63 + ],
64 + dimensions: {
65 + weight: ((i * 3 + 1) % 100) / 10,
66 + width: ((i * 7 + 2) % 50) + 5,
67 + height: ((i * 11 + 3) % 40) + 5,
68 + depth: ((i * 13 + 4) % 30) + 2,
69 + unit: 'cm',
70 + },
71 + supplier: {
72 + name: 'Supplier ' + (i % 20),
73 + leadTime: (i % 14) + 1 + ' days',
74 + minOrder: ((i * 3) % 50) + 10,
75 + contact: 'supplier' + (i % 20) + '@example.com',
76 + address: {
77 + street: ((100 + i * 7) % 9999) + ' Industrial Blvd',
78 + city: ['Portland', 'Austin', 'Denver', 'Seattle', 'Boston'][i % 5],
79 + state: ['OR', 'TX', 'CO', 'WA', 'MA'][i % 5],
80 + zip: String(10000 + ((i * 37) % 89999)),
81 + },
82 + },
83 + specifications: {
84 + material: ['Aluminum', 'Plastic', 'Steel', 'Wood', 'Carbon Fiber'][
85 + i % 5
86 + ],
87 + color: ['Black', 'White', 'Silver', 'Blue', 'Red', 'Green'][i % 6],
88 + warranty: (i % 3) + 1 + ' years',
89 + certifications: [
90 + i % 2 === 0 ? 'CE' : 'FCC',
91 + i % 3 === 0 ? 'RoHS' : 'UL',
92 + 'ISO 9001',
93 + ],
94 + },
95 + reviews: [
96 + {
97 + author: userNames[(i * 3) % userNames.length],
98 + rating: ((i * 7 + 3) % 5) + 1,
99 + date:
100 + '2026-0' +
101 + ((i % 3) + 1) +
102 + '-' +
103 + String((i % 28) + 1).padStart(2, '0'),
104 + text: reviewTexts[i % reviewTexts.length],
105 + helpful: (i * 11 + 2) % 50,
106 + },
107 + {
108 + author: userNames[(i * 3 + 1) % userNames.length],
109 + rating: ((i * 11 + 1) % 5) + 1,
110 + date:
111 + '2026-0' +
112 + ((i % 3) + 1) +
113 + '-' +
114 + String(((i + 5) % 28) + 1).padStart(2, '0'),
115 + text: reviewTexts[(i + 2) % reviewTexts.length],
116 + helpful: (i * 7 + 5) % 30,
117 + },
118 + {
119 + author: userNames[(i * 3 + 2) % userNames.length],
120 + rating: ((i * 13 + 2) % 5) + 1,
121 + date:
122 + '2026-0' +
123 + ((i % 3) + 1) +
124 + '-' +
125 + String(((i + 10) % 28) + 1).padStart(2, '0'),
126 + text: reviewTexts[(i + 4) % reviewTexts.length],
127 + helpful: (i * 3 + 1) % 20,
128 + },
129 + ],
130 + });
131 + }
132 + return products;
133 +}
134 +
135 +export function generateActivities(count) {
136 + const activities = [];
137 + for (let i = 0; i < count; i++) {
138 + activities.push({
139 + id: i,
140 + type: activityTypes[i % activityTypes.length],
141 + user: userNames[i % userNames.length],
142 + timestamp:
143 + '2026-03-' +
144 + String((i % 28) + 1).padStart(2, '0') +
145 + 'T' +
146 + String((i * 7) % 24).padStart(2, '0') +
147 + ':' +
148 + String((i * 13) % 60).padStart(2, '0') +
149 + ':00Z',
150 + details: {
151 + orderId: '#' + String(10000 + i),
152 + amount: '$' + ((i * 23 + 7) % 999).toFixed(2),
153 + items: ((i * 3 + 1) % 5) + 1,
154 + shippingMethod: ['Standard', 'Express', 'Overnight', 'Economy'][i % 4],
155 + paymentMethod: ['Credit Card', 'PayPal', 'Apple Pay', 'Wire Transfer'][
156 + i % 4
157 + ],
158 + },
159 + message:
160 + userNames[i % userNames.length] +
161 + ' ' +
162 + activityTypes[i % activityTypes.length].replace(/_/g, ' ') +
163 + ' for order #' +
164 + (10000 + i),
165 + });
166 + }
167 + return activities;
168 +}
169 +
170 +export function generateStats() {
171 + return {
172 + totalRevenue: '$1,284,320.50',
173 + totalOrders: 8432,
174 + totalCustomers: 3841,
175 + conversionRate: '3.2%',
176 + avgOrderValue: '$152.30',
177 + returnsRate: '2.1%',
178 + cards: [
179 + {
180 + title: 'Total Revenue',
181 + value: '$1,284,320',
182 + change: '+12.5%',
183 + trend: 'up',
184 + sparkline: [65, 59, 80, 81, 56, 55, 72, 84, 91, 88, 95, 102],
185 + },
186 + {
187 + title: 'Orders',
188 + value: '8,432',
189 + change: '+8.2%',
190 + trend: 'up',
191 + sparkline: [28, 48, 40, 19, 86, 27, 90, 65, 72, 81, 56, 88],
192 + },
193 + {
194 + title: 'Customers',
195 + value: '3,841',
196 + change: '+4.1%',
197 + trend: 'up',
198 + sparkline: [12, 19, 25, 32, 28, 35, 42, 38, 45, 51, 48, 55],
199 + },
200 + {
201 + title: 'Conversion Rate',
202 + value: '3.2%',
203 + change: '-0.3%',
204 + trend: 'down',
205 + sparkline: [3.8, 3.5, 3.2, 3.6, 3.1, 3.4, 3.0, 3.3, 3.5, 3.2, 3.1, 3.2],
206 + },
207 + ],
208 + revenueByMonth: [
209 + {month: 'Jan 25', value: 72000, orders: 480, returns: 24},
210 + {month: 'Feb 25', value: 78000, orders: 520, returns: 31},
211 + {month: 'Mar 25', value: 85000, orders: 567, returns: 28},
212 + {month: 'Apr 25', value: 92000, orders: 613, returns: 35},
213 + {month: 'May 25', value: 88000, orders: 587, returns: 29},
214 + {month: 'Jun 25', value: 105000, orders: 700, returns: 42},
215 + {month: 'Jul 25', value: 112000, orders: 747, returns: 38},
216 + {month: 'Aug 25', value: 98000, orders: 653, returns: 33},
217 + {month: 'Sep 25', value: 115000, orders: 767, returns: 41},
218 + {month: 'Oct 25', value: 108000, orders: 720, returns: 36},
219 + {month: 'Nov 25', value: 120000, orders: 800, returns: 44},
220 + {month: 'Dec 25', value: 118320, orders: 789, returns: 39},
221 + {month: 'Jan 26', value: 85000, orders: 567, returns: 28},
222 + {month: 'Feb 26', value: 92000, orders: 613, returns: 32},
223 + {month: 'Mar 26', value: 95000, orders: 633, returns: 30},
224 + {month: 'Apr 26', value: 110000, orders: 733, returns: 37},
225 + {month: 'May 26', value: 118000, orders: 787, returns: 40},
226 + {month: 'Jun 26', value: 105000, orders: 700, returns: 35},
227 + {month: 'Jul 26', value: 122000, orders: 813, returns: 43},
228 + {month: 'Aug 26', value: 115000, orders: 767, returns: 38},
229 + {month: 'Sep 26', value: 128000, orders: 853, returns: 45},
230 + {month: 'Oct 26', value: 125000, orders: 833, returns: 42},
231 + {month: 'Nov 26', value: 135000, orders: 900, returns: 47},
232 + {month: 'Dec 26', value: 130000, orders: 867, returns: 44},
233 + ],
234 + topCategories: [
235 + {
236 + name: 'Electronics',
237 + revenue: 420000,
238 + orders: 2800,
239 + avgPrice: 150,
240 + growth: '+15.2%',
241 + },
242 + {
243 + name: 'Clothing',
244 + revenue: 310000,
245 + orders: 2100,
246 + avgPrice: 147.6,
247 + growth: '+8.7%',
248 + },
249 + {
250 + name: 'Home & Garden',
251 + revenue: 225000,
252 + orders: 1500,
253 + avgPrice: 150,
254 + growth: '+12.1%',
255 + },
256 + {
257 + name: 'Sports',
258 + revenue: 180000,
259 + orders: 1200,
260 + avgPrice: 150,
261 + growth: '+5.3%',
262 + },
263 + {
264 + name: 'Books',
265 + revenue: 149320,
266 + orders: 832,
267 + avgPrice: 179.5,
268 + growth: '+2.1%',
269 + },
270 + {
271 + name: 'Toys',
272 + revenue: 95000,
273 + orders: 680,
274 + avgPrice: 139.7,
275 + growth: '+18.4%',
276 + },
277 + {
278 + name: 'Food',
279 + revenue: 82000,
280 + orders: 1640,
281 + avgPrice: 50,
282 + growth: '+6.8%',
283 + },
284 + {
285 + name: 'Health',
286 + revenue: 73000,
287 + orders: 520,
288 + avgPrice: 140.4,
289 + growth: '+22.1%',
290 + },
291 + ],
292 + };
293 +}
fixtures/flight-ssr-bench/src/entry-rsc.js new
+22
@@ -0,0 +1,22 @@
1 +import {
2 + renderToPipeableStream,
3 + renderToReadableStream,
4 +} from 'react-server-dom-webpack/server';
5 +import App from './App';
6 +import AppAsync from './AppAsync';
7 +
8 +export function renderRSCNode(clientManifest, Component, itemCount) {
9 + return renderToPipeableStream(
10 + <Component itemCount={itemCount} />,
11 + clientManifest
12 + );
13 +}
14 +
15 +export function renderRSCEdge(clientManifest, Component, itemCount) {
16 + return renderToReadableStream(
17 + <Component itemCount={itemCount} />,
18 + clientManifest
19 + );
20 +}
21 +
22 +export {App, AppAsync};
fixtures/flight-ssr-bench/webpack-mock.js new
+62
@@ -0,0 +1,62 @@
1 +'use strict';
2 +
3 +const path = require('path');
4 +const url = require('url');
5 +const fs = require('fs');
6 +
7 +const clientModules = {};
8 +const clientManifest = {};
9 +const ssrModuleMap = {};
10 +let moduleIdx = 0;
11 +
12 +function registerClientModule(modulePath) {
13 + const id = String(moduleIdx++);
14 + const chunkId = 'chunk-' + id;
15 + const absPath = path.resolve(__dirname, modulePath);
16 + const actualExports = require(absPath);
17 + clientModules[id] = actualExports;
18 +
19 + const href = url.pathToFileURL(absPath).href;
20 + clientManifest[href] = {id, chunks: [chunkId, absPath], name: '*'};
21 + ssrModuleMap[id] = {'*': {id, chunks: [chunkId, absPath], name: '*'}};
22 +}
23 +
24 +// Auto-register all 'use client' components by scanning src/
25 +const srcDirs = [
26 + path.resolve(__dirname, 'src'),
27 + path.resolve(__dirname, 'src/components'),
28 +];
29 +for (const dir of srcDirs) {
30 + if (!fs.existsSync(dir)) continue;
31 + for (const file of fs.readdirSync(dir)) {
32 + if (!file.endsWith('.js')) continue;
33 + const filePath = path.join(dir, file);
34 + const source = fs.readFileSync(filePath, 'utf-8');
35 + if (
36 + source.trimStart().startsWith("'use client'") ||
37 + source.trimStart().startsWith('"use client"')
38 + ) {
39 + registerClientModule(filePath);
40 + }
41 + }
42 +}
43 +
44 +global.__webpack_require__ = function (id) {
45 + if (clientModules[id]) {
46 + return clientModules[id];
47 + }
48 + throw new Error('Unknown module: ' + id);
49 +};
50 +global.__webpack_chunk_load__ = function () {
51 + return new Promise(function (resolve) {
52 + setImmediate(resolve);
53 + });
54 +};
55 +
56 +const ssrManifest = {
57 + moduleMap: ssrModuleMap,
58 + moduleLoading: null,
59 + serverModuleMap: null,
60 +};
61 +
62 +module.exports = {clientManifest, ssrManifest};
fixtures/flight-ssr-bench/webpack.config.js new
+45
@@ -0,0 +1,45 @@
1 +'use strict';
2 +
3 +const path = require('path');
4 +
5 +module.exports = {
6 + name: 'rsc',
7 + target: 'node',
8 + entry: './src/entry-rsc.js',
9 + output: {
10 + path: path.resolve(__dirname, 'build'),
11 + filename: 'rsc-bundle.js',
12 + library: {type: 'commonjs2'},
13 + clean: true,
14 + },
15 + resolve: {
16 + // This is the key: react-server condition makes `react` resolve to the
17 + // server variant that supports async components, server references, etc.
18 + conditionNames: ['react-server', 'node', 'require'],
19 + extensions: ['.js', '.jsx'],
20 + },
21 + module: {
22 + rules: [
23 + {
24 + // Custom loader that replaces 'use client' modules with client
25 + // reference proxies. Must run before babel.
26 + enforce: 'pre',
27 + test: /\.jsx?$/,
28 + exclude: /node_modules/,
29 + loader: path.resolve(__dirname, 'rsc-client-ref-loader.js'),
30 + },
31 + {
32 + test: /\.jsx?$/,
33 + exclude: /node_modules/,
34 + loader: require.resolve('babel-loader'),
35 + options: {
36 + presets: [['@babel/preset-react', {runtime: 'automatic'}]],
37 + },
38 + },
39 + ],
40 + },
41 + // Production mode but no minification — we want optimized code paths
42 + // but readable profiles and a fair comparison between approaches.
43 + mode: 'production',
44 + optimization: {minimize: false},
45 +};
fixtures/flight-ssr-bench/yarn.lock new
+1463
@@ -0,0 +1,1463 @@
1 +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 +# yarn lockfile v1
3 +
4 +
5 +"@assemblyscript/loader@^0.19.21":
6 + version "0.19.23"
7 + resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.19.23.tgz#7fccae28d0a2692869f1d1219d36093bc24d5e72"
8 + integrity sha512-ulkCYfFbYj01ie1MDOyxv2F6SpRN1TOj7fQxbP07D6HmeR+gr2JLSmINKjga2emB+b1L2KGrFKBTc+e00p54nw==
9 +
10 +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0":
11 + version "7.29.0"
12 + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c"
13 + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==
14 + dependencies:
15 + "@babel/helper-validator-identifier" "^7.28.5"
16 + js-tokens "^4.0.0"
17 + picocolors "^1.1.1"
18 +
19 +"@babel/compat-data@^7.28.6":
20 + version "7.29.0"
21 + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d"
22 + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==
23 +
24 +"@babel/core@^7.16.0":
25 + version "7.29.0"
26 + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322"
27 + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==
28 + dependencies:
29 + "@babel/code-frame" "^7.29.0"
30 + "@babel/generator" "^7.29.0"
31 + "@babel/helper-compilation-targets" "^7.28.6"
32 + "@babel/helper-module-transforms" "^7.28.6"
33 + "@babel/helpers" "^7.28.6"
34 + "@babel/parser" "^7.29.0"
35 + "@babel/template" "^7.28.6"
36 + "@babel/traverse" "^7.29.0"
37 + "@babel/types" "^7.29.0"
38 + "@jridgewell/remapping" "^2.3.5"
39 + convert-source-map "^2.0.0"
40 + debug "^4.1.0"
41 + gensync "^1.0.0-beta.2"
42 + json5 "^2.2.3"
43 + semver "^6.3.1"
44 +
45 +"@babel/generator@^7.29.0":
46 + version "7.29.1"
47 + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50"
48 + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==
49 + dependencies:
50 + "@babel/parser" "^7.29.0"
51 + "@babel/types" "^7.29.0"
52 + "@jridgewell/gen-mapping" "^0.3.12"
53 + "@jridgewell/trace-mapping" "^0.3.28"
54 + jsesc "^3.0.2"
55 +
56 +"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3":
57 + version "7.27.3"
58 + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5"
59 + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==
60 + dependencies:
61 + "@babel/types" "^7.27.3"
62 +
63 +"@babel/helper-compilation-targets@^7.28.6":
64 + version "7.28.6"
65 + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25"
66 + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==
67 + dependencies:
68 + "@babel/compat-data" "^7.28.6"
69 + "@babel/helper-validator-option" "^7.27.1"
70 + browserslist "^4.24.0"
71 + lru-cache "^5.1.1"
72 + semver "^6.3.1"
73 +
74 +"@babel/helper-globals@^7.28.0":
75 + version "7.28.0"
76 + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
77 + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
78 +
79 +"@babel/helper-module-imports@^7.28.6":
80 + version "7.28.6"
81 + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c"
82 + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==
83 + dependencies:
84 + "@babel/traverse" "^7.28.6"
85 + "@babel/types" "^7.28.6"
86 +
87 +"@babel/helper-module-transforms@^7.28.6":
88 + version "7.28.6"
89 + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e"
90 + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==
91 + dependencies:
92 + "@babel/helper-module-imports" "^7.28.6"
93 + "@babel/helper-validator-identifier" "^7.28.5"
94 + "@babel/traverse" "^7.28.6"
95 +
96 +"@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6":
97 + version "7.28.6"
98 + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8"
99 + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==
100 +
101 +"@babel/helper-string-parser@^7.27.1":
102 + version "7.27.1"
103 + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
104 + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
105 +
106 +"@babel/helper-validator-identifier@^7.28.5":
107 + version "7.28.5"
108 + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4"
109 + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
110 +
111 +"@babel/helper-validator-option@^7.27.1":
112 + version "7.27.1"
113 + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f"
114 + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
115 +
116 +"@babel/helpers@^7.28.6":
117 + version "7.29.2"
118 + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49"
119 + integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==
120 + dependencies:
121 + "@babel/template" "^7.28.6"
122 + "@babel/types" "^7.29.0"
123 +
124 +"@babel/parser@^7.28.6", "@babel/parser@^7.29.0":
125 + version "7.29.2"
126 + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1"
127 + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==
128 + dependencies:
129 + "@babel/types" "^7.29.0"
130 +
131 +"@babel/plugin-syntax-jsx@^7.28.6":
132 + version "7.28.6"
133 + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee"
134 + integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==
135 + dependencies:
136 + "@babel/helper-plugin-utils" "^7.28.6"
137 +
138 +"@babel/plugin-transform-react-display-name@^7.28.0":
139 + version "7.28.0"
140 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de"
141 + integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==
142 + dependencies:
143 + "@babel/helper-plugin-utils" "^7.27.1"
144 +
145 +"@babel/plugin-transform-react-jsx-development@^7.27.1":
146 + version "7.27.1"
147 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98"
148 + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==
149 + dependencies:
150 + "@babel/plugin-transform-react-jsx" "^7.27.1"
151 +
152 +"@babel/plugin-transform-react-jsx@^7.27.1":
153 + version "7.28.6"
154 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz#f51cb70a90b9529fbb71ee1f75ea27b7078eed62"
155 + integrity sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==
156 + dependencies:
157 + "@babel/helper-annotate-as-pure" "^7.27.3"
158 + "@babel/helper-module-imports" "^7.28.6"
159 + "@babel/helper-plugin-utils" "^7.28.6"
160 + "@babel/plugin-syntax-jsx" "^7.28.6"
161 + "@babel/types" "^7.28.6"
162 +
163 +"@babel/plugin-transform-react-pure-annotations@^7.27.1":
164 + version "7.27.1"
165 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879"
166 + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==
167 + dependencies:
168 + "@babel/helper-annotate-as-pure" "^7.27.1"
169 + "@babel/helper-plugin-utils" "^7.27.1"
170 +
171 +"@babel/preset-react@^7.22.5":
172 + version "7.28.5"
173 + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.28.5.tgz#6fcc0400fa79698433d653092c3919bb4b0878d9"
174 + integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==
175 + dependencies:
176 + "@babel/helper-plugin-utils" "^7.27.1"
177 + "@babel/helper-validator-option" "^7.27.1"
178 + "@babel/plugin-transform-react-display-name" "^7.28.0"
179 + "@babel/plugin-transform-react-jsx" "^7.27.1"
180 + "@babel/plugin-transform-react-jsx-development" "^7.27.1"
181 + "@babel/plugin-transform-react-pure-annotations" "^7.27.1"
182 +
183 +"@babel/register@^7.28.6":
184 + version "7.28.6"
185 + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.28.6.tgz#f54461dd32f6a418c1eb1f583c95ed0b7266ea4c"
186 + integrity sha512-pgcbbEl/dWQYb6L6Yew6F94rdwygfuv+vJ/tXfwIOYAfPB6TNWpXUMEtEq3YuTeHRdvMIhvz13bkT9CNaS+wqA==
187 + dependencies:
188 + clone-deep "^4.0.1"
189 + find-cache-dir "^2.0.0"
190 + make-dir "^2.1.0"
191 + pirates "^4.0.6"
192 + source-map-support "^0.5.16"
193 +
194 +"@babel/template@^7.28.6":
195 + version "7.28.6"
196 + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57"
197 + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==
198 + dependencies:
199 + "@babel/code-frame" "^7.28.6"
200 + "@babel/parser" "^7.28.6"
201 + "@babel/types" "^7.28.6"
202 +
203 +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0":
204 + version "7.29.0"
205 + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a"
206 + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==
207 + dependencies:
208 + "@babel/code-frame" "^7.29.0"
209 + "@babel/generator" "^7.29.0"
210 + "@babel/helper-globals" "^7.28.0"
211 + "@babel/parser" "^7.29.0"
212 + "@babel/template" "^7.28.6"
213 + "@babel/types" "^7.29.0"
214 + debug "^4.3.1"
215 +
216 +"@babel/types@^7.27.3", "@babel/types@^7.28.6", "@babel/types@^7.29.0":
217 + version "7.29.0"
218 + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7"
219 + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==
220 + dependencies:
221 + "@babel/helper-string-parser" "^7.27.1"
222 + "@babel/helper-validator-identifier" "^7.28.5"
223 +
224 +"@colors/colors@1.5.0":
225 + version "1.5.0"
226 + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
227 + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
228 +
229 +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
230 + version "0.3.13"
231 + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
232 + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
233 + dependencies:
234 + "@jridgewell/sourcemap-codec" "^1.5.0"
235 + "@jridgewell/trace-mapping" "^0.3.24"
236 +
237 +"@jridgewell/remapping@^2.3.5":
238 + version "2.3.5"
239 + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
240 + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
241 + dependencies:
242 + "@jridgewell/gen-mapping" "^0.3.5"
243 + "@jridgewell/trace-mapping" "^0.3.24"
244 +
245 +"@jridgewell/resolve-uri@^3.1.0":
246 + version "3.1.2"
247 + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
248 + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
249 +
250 +"@jridgewell/source-map@^0.3.3":
251 + version "0.3.11"
252 + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba"
253 + integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==
254 + dependencies:
255 + "@jridgewell/gen-mapping" "^0.3.5"
256 + "@jridgewell/trace-mapping" "^0.3.25"
257 +
258 +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
259 + version "1.5.5"
260 + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
261 + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
262 +
263 +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
264 + version "0.3.31"
265 + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
266 + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
267 + dependencies:
268 + "@jridgewell/resolve-uri" "^3.1.0"
269 + "@jridgewell/sourcemap-codec" "^1.4.14"
270 +
271 +"@minimistjs/subarg@^1.0.0":
272 + version "1.0.0"
273 + resolved "https://registry.yarnpkg.com/@minimistjs/subarg/-/subarg-1.0.0.tgz#484fdfebda9dc32087d7c7999ec6350684fb42d2"
274 + integrity sha512-Q/ONBiM2zNeYUy0mVSO44mWWKYM3UHuEK43PKIOzJCbvUnPoMH1K+gk3cf1kgnCVJFlWmddahQQCmrmBGlk9jQ==
275 + dependencies:
276 + minimist "^1.1.0"
277 +
278 +"@types/eslint-scope@^3.7.7":
279 + version "3.7.7"
280 + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5"
281 + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==
282 + dependencies:
283 + "@types/eslint" "*"
284 + "@types/estree" "*"
285 +
286 +"@types/eslint@*":
287 + version "9.6.1"
288 + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584"
289 + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==
290 + dependencies:
291 + "@types/estree" "*"
292 + "@types/json-schema" "*"
293 +
294 +"@types/estree@*", "@types/estree@^1.0.8":
295 + version "1.0.8"
296 + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
297 + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
298 +
299 +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.9":
300 + version "7.0.15"
301 + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
302 + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
303 +
304 +"@types/node@*":
305 + version "25.5.0"
306 + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31"
307 + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==
308 + dependencies:
309 + undici-types "~7.18.0"
310 +
311 +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
312 + version "1.14.1"
313 + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6"
314 + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
315 + dependencies:
316 + "@webassemblyjs/helper-numbers" "1.13.2"
317 + "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
318 +
319 +"@webassemblyjs/floating-point-hex-parser@1.13.2":
320 + version "1.13.2"
321 + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb"
322 + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==
323 +
324 +"@webassemblyjs/helper-api-error@1.13.2":
325 + version "1.13.2"
326 + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7"
327 + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==
328 +
329 +"@webassemblyjs/helper-buffer@1.14.1":
330 + version "1.14.1"
331 + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b"
332 + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==
333 +
334 +"@webassemblyjs/helper-numbers@1.13.2":
335 + version "1.13.2"
336 + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d"
337 + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==
338 + dependencies:
339 + "@webassemblyjs/floating-point-hex-parser" "1.13.2"
340 + "@webassemblyjs/helper-api-error" "1.13.2"
341 + "@xtuc/long" "4.2.2"
342 +
343 +"@webassemblyjs/helper-wasm-bytecode@1.13.2":
344 + version "1.13.2"
345 + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b"
346 + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==
347 +
348 +"@webassemblyjs/helper-wasm-section@1.14.1":
349 + version "1.14.1"
350 + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348"
351 + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==
352 + dependencies:
353 + "@webassemblyjs/ast" "1.14.1"
354 + "@webassemblyjs/helper-buffer" "1.14.1"
355 + "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
356 + "@webassemblyjs/wasm-gen" "1.14.1"
357 +
358 +"@webassemblyjs/ieee754@1.13.2":
359 + version "1.13.2"
360 + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba"
361 + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==
362 + dependencies:
363 + "@xtuc/ieee754" "^1.2.0"
364 +
365 +"@webassemblyjs/leb128@1.13.2":
366 + version "1.13.2"
367 + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0"
368 + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==
369 + dependencies:
370 + "@xtuc/long" "4.2.2"
371 +
372 +"@webassemblyjs/utf8@1.13.2":
373 + version "1.13.2"
374 + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1"
375 + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==
376 +
377 +"@webassemblyjs/wasm-edit@^1.14.1":
378 + version "1.14.1"
379 + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597"
380 + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==
381 + dependencies:
382 + "@webassemblyjs/ast" "1.14.1"
383 + "@webassemblyjs/helper-buffer" "1.14.1"
384 + "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
385 + "@webassemblyjs/helper-wasm-section" "1.14.1"
386 + "@webassemblyjs/wasm-gen" "1.14.1"
387 + "@webassemblyjs/wasm-opt" "1.14.1"
388 + "@webassemblyjs/wasm-parser" "1.14.1"
389 + "@webassemblyjs/wast-printer" "1.14.1"
390 +
391 +"@webassemblyjs/wasm-gen@1.14.1":
392 + version "1.14.1"
393 + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570"
394 + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==
395 + dependencies:
396 + "@webassemblyjs/ast" "1.14.1"
397 + "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
398 + "@webassemblyjs/ieee754" "1.13.2"
399 + "@webassemblyjs/leb128" "1.13.2"
400 + "@webassemblyjs/utf8" "1.13.2"
401 +
402 +"@webassemblyjs/wasm-opt@1.14.1":
403 + version "1.14.1"
404 + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b"
405 + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==
406 + dependencies:
407 + "@webassemblyjs/ast" "1.14.1"
408 + "@webassemblyjs/helper-buffer" "1.14.1"
409 + "@webassemblyjs/wasm-gen" "1.14.1"
410 + "@webassemblyjs/wasm-parser" "1.14.1"
411 +
412 +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1":
413 + version "1.14.1"
414 + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb"
415 + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
416 + dependencies:
417 + "@webassemblyjs/ast" "1.14.1"
418 + "@webassemblyjs/helper-api-error" "1.13.2"
419 + "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
420 + "@webassemblyjs/ieee754" "1.13.2"
421 + "@webassemblyjs/leb128" "1.13.2"
422 + "@webassemblyjs/utf8" "1.13.2"
423 +
424 +"@webassemblyjs/wast-printer@1.14.1":
425 + version "1.14.1"
426 + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07"
427 + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==
428 + dependencies:
429 + "@webassemblyjs/ast" "1.14.1"
430 + "@xtuc/long" "4.2.2"
431 +
432 +"@xtuc/ieee754@^1.2.0":
433 + version "1.2.0"
434 + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
435 + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
436 +
437 +"@xtuc/long@4.2.2":
438 + version "4.2.2"
439 + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
440 + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
441 +
442 +acorn-import-phases@^1.0.3:
443 + version "1.0.4"
444 + resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7"
445 + integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==
446 +
447 +acorn-loose@^8.3.0:
448 + version "8.5.2"
449 + resolved "https://registry.yarnpkg.com/acorn-loose/-/acorn-loose-8.5.2.tgz#a7cc7dfbb7c8f3c2e55b055db640dc657e278d26"
450 + integrity sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==
451 + dependencies:
452 + acorn "^8.15.0"
453 +
454 +acorn@^8.15.0, acorn@^8.16.0:
455 + version "8.16.0"
456 + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a"
457 + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
458 +
459 +ajv-formats@^2.1.1:
460 + version "2.1.1"
461 + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
462 + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
463 + dependencies:
464 + ajv "^8.0.0"
465 +
466 +ajv-keywords@^3.5.2:
467 + version "3.5.2"
468 + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
469 + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
470 +
471 +ajv-keywords@^5.1.0:
472 + version "5.1.0"
473 + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
474 + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
475 + dependencies:
476 + fast-deep-equal "^3.1.3"
477 +
478 +ajv@^6.12.4:
479 + version "6.14.0"
480 + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a"
481 + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==
482 + dependencies:
483 + fast-deep-equal "^3.1.1"
484 + fast-json-stable-stringify "^2.0.0"
485 + json-schema-traverse "^0.4.1"
486 + uri-js "^4.2.2"
487 +
488 +ajv@^8.0.0, ajv@^8.9.0:
489 + version "8.18.0"
490 + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc"
491 + integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==
492 + dependencies:
493 + fast-deep-equal "^3.1.3"
494 + fast-uri "^3.0.1"
495 + json-schema-traverse "^1.0.0"
496 + require-from-string "^2.0.2"
497 +
498 +ansi-regex@^5.0.1:
499 + version "5.0.1"
500 + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
501 + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
502 +
503 +ansi-styles@^4.1.0:
504 + version "4.3.0"
505 + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
506 + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
507 + dependencies:
508 + color-convert "^2.0.1"
509 +
510 +asynckit@^0.4.0:
511 + version "0.4.0"
512 + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
513 + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
514 +
515 +autocannon@^8.0.0:
516 + version "8.0.0"
517 + resolved "https://registry.yarnpkg.com/autocannon/-/autocannon-8.0.0.tgz#72b3ade6ec63dca0dc3be157c873d0a27e3f3745"
518 + integrity sha512-fMMcWc2JPFcUaqHeR6+PbmEpTxCrPZyBUM95oG4w3ngJ8NfBNas/ZXA+pTHXLqJ0UlFVTcy05GC25WxKx/M20A==
519 + dependencies:
520 + "@minimistjs/subarg" "^1.0.0"
521 + chalk "^4.1.0"
522 + char-spinner "^1.0.1"
523 + cli-table3 "^0.6.0"
524 + color-support "^1.1.1"
525 + cross-argv "^2.0.0"
526 + form-data "^4.0.0"
527 + has-async-hooks "^1.0.0"
528 + hdr-histogram-js "^3.0.0"
529 + hdr-histogram-percentiles-obj "^3.0.0"
530 + http-parser-js "^0.5.2"
531 + hyperid "^3.0.0"
532 + lodash.chunk "^4.2.0"
533 + lodash.clonedeep "^4.5.0"
534 + lodash.flatten "^4.4.0"
535 + manage-path "^2.0.0"
536 + on-net-listen "^1.1.1"
537 + pretty-bytes "^5.4.1"
538 + progress "^2.0.3"
539 + reinterval "^1.1.0"
540 + retimer "^3.0.0"
541 + semver "^7.3.2"
542 + timestring "^6.0.0"
543 +
544 +babel-loader@^8.2.3:
545 + version "8.4.1"
546 + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.4.1.tgz#6ccb75c66e62c3b144e1c5f2eaec5b8f6c08c675"
547 + integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==
548 + dependencies:
549 + find-cache-dir "^3.3.1"
550 + loader-utils "^2.0.4"
551 + make-dir "^3.1.0"
552 + schema-utils "^2.6.5"
553 +
554 +base64-js@^1.2.0, base64-js@^1.3.1:
555 + version "1.5.1"
556 + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
557 + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
558 +
559 +baseline-browser-mapping@^2.9.0:
560 + version "2.10.10"
561 + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz#e74bd066724c1d8d7d8ea75fc3be25389a7a5c56"
562 + integrity sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==
563 +
564 +big.js@^5.2.2:
565 + version "5.2.2"
566 + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
567 + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
568 +
569 +browserslist@^4.24.0, browserslist@^4.28.1:
570 + version "4.28.1"
571 + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95"
572 + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
573 + dependencies:
574 + baseline-browser-mapping "^2.9.0"
575 + caniuse-lite "^1.0.30001759"
576 + electron-to-chromium "^1.5.263"
577 + node-releases "^2.0.27"
578 + update-browserslist-db "^1.2.0"
579 +
580 +buffer-from@^1.0.0:
581 + version "1.1.2"
582 + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
583 + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
584 +
585 +buffer@^5.2.1:
586 + version "5.7.1"
587 + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
588 + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
589 + dependencies:
590 + base64-js "^1.3.1"
591 + ieee754 "^1.1.13"
592 +
593 +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
594 + version "1.0.2"
595 + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
596 + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
597 + dependencies:
598 + es-errors "^1.3.0"
599 + function-bind "^1.1.2"
600 +
601 +caniuse-lite@^1.0.30001759:
602 + version "1.0.30001781"
603 + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz#344b47c03eb8168b79c3c158b872bcfbdd02a400"
604 + integrity sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==
605 +
606 +chalk@^4.1.0:
607 + version "4.1.2"
608 + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
609 + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
610 + dependencies:
611 + ansi-styles "^4.1.0"
612 + supports-color "^7.1.0"
613 +
614 +char-spinner@^1.0.1:
615 + version "1.0.1"
616 + resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081"
617 + integrity sha512-acv43vqJ0+N0rD+Uw3pDHSxP30FHrywu2NO6/wBaHChJIizpDeBUd6NjqhNhy9LGaEAhZAXn46QzmlAvIWd16g==
618 +
619 +chrome-trace-event@^1.0.2:
620 + version "1.0.4"
621 + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b"
622 + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==
623 +
624 +cli-table3@^0.6.0:
625 + version "0.6.5"
626 + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f"
627 + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==
628 + dependencies:
629 + string-width "^4.2.0"
630 + optionalDependencies:
631 + "@colors/colors" "1.5.0"
632 +
633 +clone-deep@^4.0.1:
634 + version "4.0.1"
635 + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
636 + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
637 + dependencies:
638 + is-plain-object "^2.0.4"
639 + kind-of "^6.0.2"
640 + shallow-clone "^3.0.0"
641 +
642 +color-convert@^2.0.1:
643 + version "2.0.1"
644 + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
645 + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
646 + dependencies:
647 + color-name "~1.1.4"
648 +
649 +color-name@~1.1.4:
650 + version "1.1.4"
651 + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
652 + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
653 +
654 +color-support@^1.1.1:
655 + version "1.1.3"
656 + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
657 + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
658 +
659 +combined-stream@^1.0.8:
660 + version "1.0.8"
661 + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
662 + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
663 + dependencies:
664 + delayed-stream "~1.0.0"
665 +
666 +commander@^2.20.0:
667 + version "2.20.3"
668 + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
669 + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
670 +
671 +commondir@^1.0.1:
672 + version "1.0.1"
673 + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
674 + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
675 +
676 +convert-source-map@^2.0.0:
677 + version "2.0.0"
678 + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
679 + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
680 +
681 +cross-argv@^2.0.0:
682 + version "2.0.0"
683 + resolved "https://registry.yarnpkg.com/cross-argv/-/cross-argv-2.0.0.tgz#2e7907ba3246f82c967623a3e8525925bbd6c0ad"
684 + integrity sha512-YIaY9TR5Nxeb8SMdtrU8asWVM4jqJDNDYlKV21LxtYcfNJhp1kEsgSa6qXwXgzN0WQWGODps0+TlGp2xQSHwOg==
685 +
686 +debug@^4.1.0, debug@^4.3.1:
687 + version "4.4.3"
688 + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
689 + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
690 + dependencies:
691 + ms "^2.1.3"
692 +
693 +delayed-stream@~1.0.0:
694 + version "1.0.0"
695 + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
696 + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
697 +
698 +dunder-proto@^1.0.1:
699 + version "1.0.1"
700 + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
701 + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
702 + dependencies:
703 + call-bind-apply-helpers "^1.0.1"
704 + es-errors "^1.3.0"
705 + gopd "^1.2.0"
706 +
707 +electron-to-chromium@^1.5.263:
708 + version "1.5.322"
709 + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.322.tgz#9c24e49f7098ca19bc87c0e9c7e0ad6ffe4fddca"
710 + integrity sha512-vFU34OcrvMcH66T+dYC3G4nURmgfDVewMIu6Q2urXpumAPSMmzvcn04KVVV8Opikq8Vs5nUbO/8laNhNRqSzYw==
711 +
712 +emoji-regex@^8.0.0:
713 + version "8.0.0"
714 + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
715 + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
716 +
717 +emojis-list@^3.0.0:
718 + version "3.0.0"
719 + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
720 + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
721 +
722 +enhanced-resolve@^5.20.0:
723 + version "5.20.1"
724 + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0"
725 + integrity sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==
726 + dependencies:
727 + graceful-fs "^4.2.4"
728 + tapable "^2.3.0"
729 +
730 +es-define-property@^1.0.1:
731 + version "1.0.1"
732 + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
733 + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
734 +
735 +es-errors@^1.3.0:
736 + version "1.3.0"
737 + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
738 + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
739 +
740 +es-module-lexer@^2.0.0:
741 + version "2.0.0"
742 + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz#f657cd7a9448dcdda9c070a3cb75e5dc1e85f5b1"
743 + integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==
744 +
745 +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
746 + version "1.1.1"
747 + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
748 + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
749 + dependencies:
750 + es-errors "^1.3.0"
751 +
752 +es-set-tostringtag@^2.1.0:
753 + version "2.1.0"
754 + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
755 + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
756 + dependencies:
757 + es-errors "^1.3.0"
758 + get-intrinsic "^1.2.6"
759 + has-tostringtag "^1.0.2"
760 + hasown "^2.0.2"
761 +
762 +escalade@^3.2.0:
763 + version "3.2.0"
764 + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
765 + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
766 +
767 +eslint-scope@5.1.1:
768 + version "5.1.1"
769 + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
770 + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
771 + dependencies:
772 + esrecurse "^4.3.0"
773 + estraverse "^4.1.1"
774 +
775 +esrecurse@^4.3.0:
776 + version "4.3.0"
777 + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
778 + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
779 + dependencies:
780 + estraverse "^5.2.0"
781 +
782 +estraverse@^4.1.1:
783 + version "4.3.0"
784 + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
785 + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
786 +
787 +estraverse@^5.2.0:
788 + version "5.3.0"
789 + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
790 + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
791 +
792 +events@^3.2.0:
793 + version "3.3.0"
794 + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
795 + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
796 +
797 +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
798 + version "3.1.3"
799 + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
800 + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
801 +
802 +fast-json-stable-stringify@^2.0.0:
803 + version "2.1.0"
804 + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
805 + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
806 +
807 +fast-uri@^3.0.1:
808 + version "3.1.0"
809 + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa"
810 + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==
811 +
812 +find-cache-dir@^2.0.0:
813 + version "2.1.0"
814 + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
815 + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
816 + dependencies:
817 + commondir "^1.0.1"
818 + make-dir "^2.0.0"
819 + pkg-dir "^3.0.0"
820 +
821 +find-cache-dir@^3.3.1:
822 + version "3.3.2"
823 + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
824 + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
825 + dependencies:
826 + commondir "^1.0.1"
827 + make-dir "^3.0.2"
828 + pkg-dir "^4.1.0"
829 +
830 +find-up@^3.0.0:
831 + version "3.0.0"
832 + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
833 + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
834 + dependencies:
835 + locate-path "^3.0.0"
836 +
837 +find-up@^4.0.0:
838 + version "4.1.0"
839 + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
840 + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
841 + dependencies:
842 + locate-path "^5.0.0"
843 + path-exists "^4.0.0"
844 +
845 +form-data@^4.0.0:
846 + version "4.0.5"
847 + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053"
848 + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
849 + dependencies:
850 + asynckit "^0.4.0"
851 + combined-stream "^1.0.8"
852 + es-set-tostringtag "^2.1.0"
853 + hasown "^2.0.2"
854 + mime-types "^2.1.12"
855 +
856 +function-bind@^1.1.2:
857 + version "1.1.2"
858 + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
859 + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
860 +
861 +gensync@^1.0.0-beta.2:
862 + version "1.0.0-beta.2"
863 + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
864 + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
865 +
866 +get-intrinsic@^1.2.6:
867 + version "1.3.0"
868 + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
869 + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
870 + dependencies:
871 + call-bind-apply-helpers "^1.0.2"
872 + es-define-property "^1.0.1"
873 + es-errors "^1.3.0"
874 + es-object-atoms "^1.1.1"
875 + function-bind "^1.1.2"
876 + get-proto "^1.0.1"
877 + gopd "^1.2.0"
878 + has-symbols "^1.1.0"
879 + hasown "^2.0.2"
880 + math-intrinsics "^1.1.0"
881 +
882 +get-proto@^1.0.1:
883 + version "1.0.1"
884 + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
885 + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
886 + dependencies:
887 + dunder-proto "^1.0.1"
888 + es-object-atoms "^1.0.0"
889 +
890 +glob-to-regexp@^0.4.1:
891 + version "0.4.1"
892 + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
893 + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
894 +
895 +gopd@^1.2.0:
896 + version "1.2.0"
897 + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
898 + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
899 +
900 +graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4:
901 + version "4.2.11"
902 + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
903 + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
904 +
905 +has-async-hooks@^1.0.0:
906 + version "1.0.0"
907 + resolved "https://registry.yarnpkg.com/has-async-hooks/-/has-async-hooks-1.0.0.tgz#3df965ade8cd2d9dbfdacfbca3e0a5152baaf204"
908 + integrity sha512-YF0VPGjkxr7AyyQQNykX8zK4PvtEDsUJAPqwu06UFz1lb6EvI53sPh5H1kWxg8NXI5LsfRCZ8uX9NkYDZBb/mw==
909 +
910 +has-flag@^4.0.0:
911 + version "4.0.0"
912 + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
913 + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
914 +
915 +has-symbols@^1.0.3, has-symbols@^1.1.0:
916 + version "1.1.0"
917 + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
918 + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
919 +
920 +has-tostringtag@^1.0.2:
921 + version "1.0.2"
922 + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
923 + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
924 + dependencies:
925 + has-symbols "^1.0.3"
926 +
927 +hasown@^2.0.2:
928 + version "2.0.2"
929 + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
930 + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
931 + dependencies:
932 + function-bind "^1.1.2"
933 +
934 +hdr-histogram-js@^3.0.0:
935 + version "3.0.1"
936 + resolved "https://registry.yarnpkg.com/hdr-histogram-js/-/hdr-histogram-js-3.0.1.tgz#b281e90d6ca80ee656bc378dafa39d7239b90855"
937 + integrity sha512-l3GSdZL1Jr1C0kyb461tUjEdrRPZr8Qry7jByltf5JGrA0xvqOSrxRBfcrJqqV/AMEtqqhHhC6w8HW0gn76tRQ==
938 + dependencies:
939 + "@assemblyscript/loader" "^0.19.21"
940 + base64-js "^1.2.0"
941 + pako "^1.0.3"
942 +
943 +hdr-histogram-percentiles-obj@^3.0.0:
944 + version "3.0.0"
945 + resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c"
946 + integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==
947 +
948 +http-parser-js@^0.5.2:
949 + version "0.5.10"
950 + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075"
951 + integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==
952 +
953 +hyperid@^3.0.0:
954 + version "3.3.0"
955 + resolved "https://registry.yarnpkg.com/hyperid/-/hyperid-3.3.0.tgz#2042bb296b7f1d5ba0797a5705469af0899c8556"
956 + integrity sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==
957 + dependencies:
958 + buffer "^5.2.1"
959 + uuid "^8.3.2"
960 + uuid-parse "^1.1.0"
961 +
962 +ieee754@^1.1.13:
963 + version "1.2.1"
964 + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
965 + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
966 +
967 +is-fullwidth-code-point@^3.0.0:
968 + version "3.0.0"
969 + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
970 + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
971 +
972 +is-plain-object@^2.0.4:
973 + version "2.0.4"
974 + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
975 + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
976 + dependencies:
977 + isobject "^3.0.1"
978 +
979 +isobject@^3.0.1:
980 + version "3.0.1"
981 + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
982 + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
983 +
984 +jest-worker@^27.4.5:
985 + version "27.5.1"
986 + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
987 + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
988 + dependencies:
989 + "@types/node" "*"
990 + merge-stream "^2.0.0"
991 + supports-color "^8.0.0"
992 +
993 +js-tokens@^4.0.0:
994 + version "4.0.0"
995 + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
996 + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
997 +
998 +jsesc@^3.0.2:
999 + version "3.1.0"
1000 + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
1001 + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
1002 +
1003 +json-parse-even-better-errors@^2.3.1:
1004 + version "2.3.1"
1005 + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
1006 + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
1007 +
1008 +json-schema-traverse@^0.4.1:
1009 + version "0.4.1"
1010 + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
1011 + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
1012 +
1013 +json-schema-traverse@^1.0.0:
1014 + version "1.0.0"
1015 + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
1016 + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
1017 +
1018 +json5@^2.1.2, json5@^2.2.3:
1019 + version "2.2.3"
1020 + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
1021 + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
1022 +
1023 +kind-of@^6.0.2:
1024 + version "6.0.3"
1025 + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
1026 + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
1027 +
1028 +loader-runner@^4.3.1:
1029 + version "4.3.1"
1030 + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3"
1031 + integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==
1032 +
1033 +loader-utils@^2.0.4:
1034 + version "2.0.4"
1035 + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
1036 + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
1037 + dependencies:
1038 + big.js "^5.2.2"
1039 + emojis-list "^3.0.0"
1040 + json5 "^2.1.2"
1041 +
1042 +locate-path@^3.0.0:
1043 + version "3.0.0"
1044 + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
1045 + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
1046 + dependencies:
1047 + p-locate "^3.0.0"
1048 + path-exists "^3.0.0"
1049 +
1050 +locate-path@^5.0.0:
1051 + version "5.0.0"
1052 + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
1053 + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
1054 + dependencies:
1055 + p-locate "^4.1.0"
1056 +
1057 +lodash.chunk@^4.2.0:
1058 + version "4.2.0"
1059 + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc"
1060 + integrity sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==
1061 +
1062 +lodash.clonedeep@^4.5.0:
1063 + version "4.5.0"
1064 + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
1065 + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
1066 +
1067 +lodash.flatten@^4.4.0:
1068 + version "4.4.0"
1069 + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
1070 + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
1071 +
1072 +lru-cache@^5.1.1:
1073 + version "5.1.1"
1074 + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
1075 + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
1076 + dependencies:
1077 + yallist "^3.0.2"
1078 +
1079 +make-dir@^2.0.0, make-dir@^2.1.0:
1080 + version "2.1.0"
1081 + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
1082 + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
1083 + dependencies:
1084 + pify "^4.0.1"
1085 + semver "^5.6.0"
1086 +
1087 +make-dir@^3.0.2, make-dir@^3.1.0:
1088 + version "3.1.0"
1089 + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
1090 + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
1091 + dependencies:
1092 + semver "^6.0.0"
1093 +
1094 +manage-path@^2.0.0:
1095 + version "2.0.0"
1096 + resolved "https://registry.yarnpkg.com/manage-path/-/manage-path-2.0.0.tgz#f4cf8457b926eeee2a83b173501414bc76eb9597"
1097 + integrity sha512-NJhyB+PJYTpxhxZJ3lecIGgh4kwIY2RAh44XvAz9UlqthlQwtPBf62uBVR8XaD8CRuSjQ6TnZH2lNJkbLPZM2A==
1098 +
1099 +math-intrinsics@^1.1.0:
1100 + version "1.1.0"
1101 + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
1102 + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
1103 +
1104 +merge-stream@^2.0.0:
1105 + version "2.0.0"
1106 + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
1107 + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
1108 +
1109 +mime-db@1.52.0:
1110 + version "1.52.0"
1111 + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
1112 + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
1113 +
1114 +mime-types@^2.1.12, mime-types@^2.1.27:
1115 + version "2.1.35"
1116 + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
1117 + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
1118 + dependencies:
1119 + mime-db "1.52.0"
1120 +
1121 +minimist@^1.1.0:
1122 + version "1.2.8"
1123 + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
1124 + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
1125 +
1126 +ms@^2.1.3:
1127 + version "2.1.3"
1128 + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
1129 + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
1130 +
1131 +neo-async@^2.6.1, neo-async@^2.6.2:
1132 + version "2.6.2"
1133 + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
1134 + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
1135 +
1136 +node-releases@^2.0.27:
1137 + version "2.0.36"
1138 + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d"
1139 + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==
1140 +
1141 +on-net-listen@^1.1.1:
1142 + version "1.1.2"
1143 + resolved "https://registry.yarnpkg.com/on-net-listen/-/on-net-listen-1.1.2.tgz#671e55a81c910fa7e5b1e4d506545e9ea0f2e11c"
1144 + integrity sha512-y1HRYy8s/RlcBvDUwKXSmkODMdx4KSuIvloCnQYJ2LdBBC1asY4HtfhXwe3UWknLakATZDnbzht2Ijw3M1EqFg==
1145 +
1146 +p-limit@^2.0.0, p-limit@^2.2.0:
1147 + version "2.3.0"
1148 + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
1149 + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
1150 + dependencies:
1151 + p-try "^2.0.0"
1152 +
1153 +p-locate@^3.0.0:
1154 + version "3.0.0"
1155 + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
1156 + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
1157 + dependencies:
1158 + p-limit "^2.0.0"
1159 +
1160 +p-locate@^4.1.0:
1161 + version "4.1.0"
1162 + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
1163 + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
1164 + dependencies:
1165 + p-limit "^2.2.0"
1166 +
1167 +p-try@^2.0.0:
1168 + version "2.2.0"
1169 + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
1170 + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
1171 +
1172 +pako@^1.0.3:
1173 + version "1.0.11"
1174 + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
1175 + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
1176 +
1177 +path-exists@^3.0.0:
1178 + version "3.0.0"
1179 + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
1180 + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
1181 +
1182 +path-exists@^4.0.0:
1183 + version "4.0.0"
1184 + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
1185 + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1186 +
1187 +picocolors@^1.1.1:
1188 + version "1.1.1"
1189 + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
1190 + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
1191 +
1192 +pify@^4.0.1:
1193 + version "4.0.1"
1194 + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
1195 + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
1196 +
1197 +pirates@^4.0.6:
1198 + version "4.0.7"
1199 + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22"
1200 + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==
1201 +
1202 +pkg-dir@^3.0.0:
1203 + version "3.0.0"
1204 + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
1205 + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
1206 + dependencies:
1207 + find-up "^3.0.0"
1208 +
1209 +pkg-dir@^4.1.0:
1210 + version "4.2.0"
1211 + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
1212 + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
1213 + dependencies:
1214 + find-up "^4.0.0"
1215 +
1216 +pretty-bytes@^5.4.1:
1217 + version "5.6.0"
1218 + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
1219 + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
1220 +
1221 +progress@^2.0.3:
1222 + version "2.0.3"
1223 + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
1224 + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
1225 +
1226 +punycode@^2.1.0:
1227 + version "2.3.1"
1228 + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
1229 + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
1230 +
1231 +react-dom@experimental:
1232 + version "0.0.0-experimental-c0d218f0-20260324"
1233 + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.0.0-experimental-c0d218f0-20260324.tgz#7b815747298ee973188135e0c76f0ad11b07fbf9"
1234 + integrity sha512-GUuoLbzQKthaq4q489w9cK0ygVFzZmvVyO7/8VWjxN3QDc+jSL9Kr/ErTYRRSi8E50D8b+oATwSyhThbw23SUw==
1235 + dependencies:
1236 + scheduler "0.0.0-experimental-c0d218f0-20260324"
1237 +
1238 +react-server-dom-webpack@experimental:
1239 + version "0.0.0-experimental-c0d218f0-20260324"
1240 + resolved "https://registry.yarnpkg.com/react-server-dom-webpack/-/react-server-dom-webpack-0.0.0-experimental-c0d218f0-20260324.tgz#467584b76cff6f7d2f1e6729f6baabf3fcad1b31"
1241 + integrity sha512-h+hwxL+XoWtJEQILwAs3eLJy1jq2oYQkWy6BKBhkAut96Bu9lZrsv1jBvqM1Qrqk0SUptwL8fq9NJzf40a0E9A==
1242 + dependencies:
1243 + acorn-loose "^8.3.0"
1244 + neo-async "^2.6.1"
1245 + webpack-sources "^3.2.0"
1246 +
1247 +react@experimental:
1248 + version "0.0.0-experimental-c0d218f0-20260324"
1249 + resolved "https://registry.yarnpkg.com/react/-/react-0.0.0-experimental-c0d218f0-20260324.tgz#47c300467702a2c51949da6778a62f3e26e8227c"
1250 + integrity sha512-nPA7pQyKQfUUilYIY7BQu52sk9b3EtCksE6WhPTx73R+WZgtHyDg6v1MVExERBI9CmCaxbDessGvDpa3aNdMiQ==
1251 +
1252 +reinterval@^1.1.0:
1253 + version "1.1.0"
1254 + resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7"
1255 + integrity sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==
1256 +
1257 +require-from-string@^2.0.2:
1258 + version "2.0.2"
1259 + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
1260 + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
1261 +
1262 +retimer@^3.0.0:
1263 + version "3.0.0"
1264 + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df"
1265 + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==
1266 +
1267 +scheduler@0.0.0-experimental-c0d218f0-20260324:
1268 + version "0.0.0-experimental-c0d218f0-20260324"
1269 + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.0.0-experimental-c0d218f0-20260324.tgz#7b941bfbb39d196c5950f794c7bc55d70d173f29"
1270 + integrity sha512-4qflKJbb94NetORoYzvxKYgkV/ka3M66o9hjQmqOJSfIIk5EAmORwXDXAqPOX3n5MQF/vrlGYBL3MXiQY3ERjw==
1271 +
1272 +schema-utils@^2.6.5:
1273 + version "2.7.1"
1274 + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
1275 + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
1276 + dependencies:
1277 + "@types/json-schema" "^7.0.5"
1278 + ajv "^6.12.4"
1279 + ajv-keywords "^3.5.2"
1280 +
1281 +schema-utils@^4.3.0, schema-utils@^4.3.3:
1282 + version "4.3.3"
1283 + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46"
1284 + integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==
1285 + dependencies:
1286 + "@types/json-schema" "^7.0.9"
1287 + ajv "^8.9.0"
1288 + ajv-formats "^2.1.1"
1289 + ajv-keywords "^5.1.0"
1290 +
1291 +semver@^5.6.0:
1292 + version "5.7.2"
1293 + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
1294 + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
1295 +
1296 +semver@^6.0.0, semver@^6.3.1:
1297 + version "6.3.1"
1298 + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
1299 + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
1300 +
1301 +semver@^7.3.2:
1302 + version "7.7.4"
1303 + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a"
1304 + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==
1305 +
1306 +shallow-clone@^3.0.0:
1307 + version "3.0.1"
1308 + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
1309 + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
1310 + dependencies:
1311 + kind-of "^6.0.2"
1312 +
1313 +source-map-support@^0.5.16, source-map-support@~0.5.20:
1314 + version "0.5.21"
1315 + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
1316 + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
1317 + dependencies:
1318 + buffer-from "^1.0.0"
1319 + source-map "^0.6.0"
1320 +
1321 +source-map@^0.6.0:
1322 + version "0.6.1"
1323 + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
1324 + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
1325 +
1326 +string-width@^4.2.0:
1327 + version "4.2.3"
1328 + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1329 + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
1330 + dependencies:
1331 + emoji-regex "^8.0.0"
1332 + is-fullwidth-code-point "^3.0.0"
1333 + strip-ansi "^6.0.1"
1334 +
1335 +strip-ansi@^6.0.1:
1336 + version "6.0.1"
1337 + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1338 + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
1339 + dependencies:
1340 + ansi-regex "^5.0.1"
1341 +
1342 +supports-color@^7.1.0:
1343 + version "7.2.0"
1344 + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1345 + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1346 + dependencies:
1347 + has-flag "^4.0.0"
1348 +
1349 +supports-color@^8.0.0:
1350 + version "8.1.1"
1351 + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
1352 + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
1353 + dependencies:
1354 + has-flag "^4.0.0"
1355 +
1356 +tapable@^2.3.0:
1357 + version "2.3.2"
1358 + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.2.tgz#86755feabad08d82a26b891db044808c6ad00f15"
1359 + integrity sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==
1360 +
1361 +terser-webpack-plugin@^5.3.17:
1362 + version "5.4.0"
1363 + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz#95fc4cf4437e587be11ecf37d08636089174d76b"
1364 + integrity sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==
1365 + dependencies:
1366 + "@jridgewell/trace-mapping" "^0.3.25"
1367 + jest-worker "^27.4.5"
1368 + schema-utils "^4.3.0"
1369 + terser "^5.31.1"
1370 +
1371 +terser@^5.31.1:
1372 + version "5.46.1"
1373 + resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.1.tgz#40e4b1e35d5f13130f82793a8b3eeb7ec3a92eee"
1374 + integrity sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==
1375 + dependencies:
1376 + "@jridgewell/source-map" "^0.3.3"
1377 + acorn "^8.15.0"
1378 + commander "^2.20.0"
1379 + source-map-support "~0.5.20"
1380 +
1381 +timestring@^6.0.0:
1382 + version "6.0.0"
1383 + resolved "https://registry.yarnpkg.com/timestring/-/timestring-6.0.0.tgz#b0c7c331981ecf2066ce88bcfb8ee3ae32e7a0f6"
1384 + integrity sha512-wMctrWD2HZZLuIlchlkE2dfXJh7J2KDI9Dwl+2abPYg0mswQHfOAyQW3jJg1pY5VfttSINZuKcXoB3FGypVklA==
1385 +
1386 +undici-types@~7.18.0:
1387 + version "7.18.2"
1388 + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9"
1389 + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==
1390 +
1391 +update-browserslist-db@^1.2.0:
1392 + version "1.2.3"
1393 + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d"
1394 + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
1395 + dependencies:
1396 + escalade "^3.2.0"
1397 + picocolors "^1.1.1"
1398 +
1399 +uri-js@^4.2.2:
1400 + version "4.4.1"
1401 + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
1402 + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
1403 + dependencies:
1404 + punycode "^2.1.0"
1405 +
1406 +uuid-parse@^1.1.0:
1407 + version "1.1.0"
1408 + resolved "https://registry.yarnpkg.com/uuid-parse/-/uuid-parse-1.1.0.tgz#7061c5a1384ae0e1f943c538094597e1b5f3a65b"
1409 + integrity sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==
1410 +
1411 +uuid@^8.3.2:
1412 + version "8.3.2"
1413 + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
1414 + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
1415 +
1416 +watchpack@^2.5.1:
1417 + version "2.5.1"
1418 + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102"
1419 + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==
1420 + dependencies:
1421 + glob-to-regexp "^0.4.1"
1422 + graceful-fs "^4.1.2"
1423 +
1424 +webpack-sources@^3.2.0, webpack-sources@^3.3.4:
1425 + version "3.3.4"
1426 + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891"
1427 + integrity sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==
1428 +
1429 +webpack@^5.64.4:
1430 + version "5.105.4"
1431 + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.4.tgz#1b77fcd55a985ac7ca9de80a746caffa38220169"
1432 + integrity sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==
1433 + dependencies:
1434 + "@types/eslint-scope" "^3.7.7"
1435 + "@types/estree" "^1.0.8"
1436 + "@types/json-schema" "^7.0.15"
1437 + "@webassemblyjs/ast" "^1.14.1"
1438 + "@webassemblyjs/wasm-edit" "^1.14.1"
1439 + "@webassemblyjs/wasm-parser" "^1.14.1"
1440 + acorn "^8.16.0"
1441 + acorn-import-phases "^1.0.3"
1442 + browserslist "^4.28.1"
1443 + chrome-trace-event "^1.0.2"
1444 + enhanced-resolve "^5.20.0"
1445 + es-module-lexer "^2.0.0"
1446 + eslint-scope "5.1.1"
1447 + events "^3.2.0"
1448 + glob-to-regexp "^0.4.1"
1449 + graceful-fs "^4.2.11"
1450 + json-parse-even-better-errors "^2.3.1"
1451 + loader-runner "^4.3.1"
1452 + mime-types "^2.1.27"
1453 + neo-async "^2.6.2"
1454 + schema-utils "^4.3.3"
1455 + tapable "^2.3.0"
1456 + terser-webpack-plugin "^5.3.17"
1457 + watchpack "^2.5.1"
1458 + webpack-sources "^3.3.4"
1459 +
1460 +yallist@^3.0.2:
1461 + version "3.1.1"
1462 + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
1463 + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
package.json
+1
@@ -128,6 +128,7 @@
128 "build-for-devtools-dev": "yarn build-for-devtools --type=NODE_DEV",
129 "build-for-devtools-prod": "yarn build-for-devtools --type=NODE_PROD",
130 "build-for-flight-dev": "cross-env RELEASE_CHANNEL=experimental node ./scripts/rollup/build.js react/index,react/jsx,react.react-server,react-dom/index,react-dom/client,react-dom/server,react-dom.react-server,react-dom-server.node,react-dom-server-legacy.node,scheduler,react-server-dom-webpack/,react-server-dom-unbundled/ --type=NODE_DEV,ESM_PROD,NODE_ES2015 && mv ./build/node_modules ./build/oss-experimental",
131 + "build-for-flight-prod": "cross-env RELEASE_CHANNEL=experimental node ./scripts/rollup/build.js react/index,react/jsx,react.react-server,react-dom/index,react-dom/client,react-dom/server,react-dom.react-server,react-dom-server.node,react-dom-server-legacy.node,scheduler,react-server-dom-webpack/,react-server-dom-unbundled/ --type=NODE_PROD,ESM_PROD,NODE_ES2015 && mv ./build/node_modules ./build/oss-experimental",
132 "build-for-vt-dev": "cross-env RELEASE_CHANNEL=experimental node ./scripts/rollup/build.js react/index,react/jsx,react-dom/index,react-dom/client,react-dom/server,react-dom-server.node,react-dom-server-legacy.node,scheduler --type=NODE_DEV && mv ./build/node_modules ./build/oss-experimental",
133 "flow-typed-install": "yarn flow-typed install --skip --skipFlowRestart --ignore-deps=dev",
134 "linc": "node ./scripts/tasks/linc.js",