diff --git a/.eslintrc.js b/.eslintrc.js
index 00e3094b06347..d8ffb89c3846f 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -325,6 +325,7 @@ module.exports = {
'packages/react-noop-renderer/**/*.js',
'packages/react-refresh/**/*.js',
'packages/react-server-dom-esm/**/*.js',
+ 'packages/react-server-dom-vite/**/*.js',
'packages/react-server-dom-webpack/**/*.js',
'packages/react-test-renderer/**/*.js',
'packages/react-debug-tools/**/*.js',
@@ -416,7 +417,7 @@ module.exports = {
},
{
files: [
- 'packages/react-native-renderer/**/*.js',
+ 'packages/react-native-renderer/**/*.js'
],
globals: {
nativeFabricUIManager: 'readonly',
@@ -429,6 +430,13 @@ module.exports = {
__webpack_require__: 'readonly',
},
},
+ {
+ files: ['packages/react-server-dom-vite/**/*.js'],
+ globals: {
+ __vite_preload__: 'readonly',
+ __vite_require__: 'readonly',
+ },
+ },
{
files: ['packages/scheduler/**/*.js'],
globals: {
diff --git a/fixtures/flight-vite/.gitignore b/fixtures/flight-vite/.gitignore
new file mode 100644
index 0000000000000..89967363fce28
--- /dev/null
+++ b/fixtures/flight-vite/.gitignore
@@ -0,0 +1,20 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/fixtures/flight-vite/package.json b/fixtures/flight-vite/package.json
new file mode 100644
index 0000000000000..279245c81ccc4
--- /dev/null
+++ b/fixtures/flight-vite/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "flight-vite",
+ "type": "module",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@vitejs/plugin-react": "^4.0.0",
+ "body-parser": "^1.20.1",
+ "browserslist": "^4.18.1",
+ "busboy": "^1.6.0",
+ "compression": "^1.7.4",
+ "concurrently": "^7.3.0",
+ "nodemon": "^2.0.19",
+ "prompts": "^2.4.2",
+ "react": "experimental",
+ "react-dev-utils": "^12.0.1",
+ "react-dom": "experimental",
+ "undici": "^5.20.0",
+ "vite": "^4.3.9"
+ },
+ "scripts": {
+ "predev": "cp -r ../../build/oss-experimental/* ./node_modules/",
+ "prebuild": "cp -r ../../build/oss-experimental/* ./node_modules/",
+ "prestart": "cp -r ../../build/oss-experimental/* ./node_modules/",
+ "dev": "concurrently \"npm run dev:region\" \"npm run dev:global\"",
+ "dev:global": "NODE_ENV=development BUILD_PATH=dist node server/global",
+ "dev:region": "NODE_ENV=development BUILD_PATH=dist node --inspect --conditions=react-server server/region",
+ "start": "concurrently \"npm run start:region\" \"npm run start:global\"",
+ "start:global": "NODE_ENV=production node server/global",
+ "start:region": "NODE_ENV=production node --conditions=react-server server/region",
+ "build": "node scripts/build.js"
+ }
+}
diff --git a/fixtures/flight-vite/public/favicon.ico b/fixtures/flight-vite/public/favicon.ico
new file mode 100644
index 0000000000000..5c125de5d897c
Binary files /dev/null and b/fixtures/flight-vite/public/favicon.ico differ
diff --git a/fixtures/flight-vite/scripts/build.js b/fixtures/flight-vite/scripts/build.js
new file mode 100644
index 0000000000000..075bf639f0fc1
--- /dev/null
+++ b/fixtures/flight-vite/scripts/build.js
@@ -0,0 +1,181 @@
+'use strict';
+
+// Do this as the first thing so that any code reading it knows the right env.
+process.env.BABEL_ENV = 'production';
+process.env.NODE_ENV = 'production';
+
+// Makes the script crash on unhandled rejections instead of silently
+// ignoring them. In the future, promise rejections that are not handled will
+// terminate the Node.js process with a non-zero exit code.
+process.on('unhandledRejection', err => {
+ throw err;
+});
+
+const path = require('path');
+const chalk = require('chalk');
+const fs = require('fs-extra');
+const {builtinModules} = require('module');
+
+function hash(str) {
+ let hash = 0;
+
+ for (let i = 0; i < str.length; i++) {
+ hash += str.charCodeAt(i);
+ }
+
+ return hash;
+}
+
+async function build() {
+ const vite = await import('vite');
+ const {default: reactServer} = await import('react-server-dom-vite/plugin');
+ const serverModules = new Set();
+ const clientModules = new Set();
+
+ // Building the react server bundle, includes App entry point and
+ // server actions
+ let bundle = await vite.build({
+ build: {
+ rollupOptions: {
+ input: ['src/App.jsx'],
+ external: [...builtinModules.map(m => `node:${m}`)],
+ onwarn: (warning, warn) => {
+ // suppress warnings about source map issues for now
+ // these are caused originally by rollup trying to complain about directives
+ // in the middle of the files
+ // TODO: fix source map issues
+ if (warning.code === 'SOURCEMAP_ERROR') {
+ return;
+ }
+ },
+ output: {
+ // preserve the export names of the server actions in chunks
+ minifyInternalExports: false,
+ manualChunks: chunk => {
+ // server references should be emitted as separate chunks
+ // so that we can load them individually when server actions
+ // are called. we need to do this in manualChunks because we don't
+ // want to run a preanalysis pass just to identify these
+ if (serverModules.has(chunk)) {
+ return `${hash(chunk)}`;
+ }
+ },
+ format: 'cjs',
+ // we want to control the chunk names so that we can load them
+ // individually when server actions are called
+ chunkFileNames: '[name].cjs',
+ },
+ },
+ ssr: true,
+ ssrManifest: true,
+ ssrEmitAssets: true,
+ target: 'node18',
+ manifest: true,
+ outDir: 'build/react-server',
+ },
+ resolve: {
+ conditions: ['node', 'import', 'react-server', process.env.NODE_ENV],
+ },
+ plugins: [
+ reactServer({
+ hash,
+ onClientReference: id => {
+ clientModules.add(id);
+ },
+ onServerReference: id => {
+ serverModules.add(id);
+ },
+ }),
+ ],
+ ssr: {
+ noExternal: true,
+ external: ['react', 'react-dom', 'react-server-dom-vite'],
+ },
+ });
+
+ // Building the SSR server bundle, includes the client components for SSR
+ await vite.build({
+ build: {
+ rollupOptions: {
+ onwarn: (warning, warn) => {
+ // suppress warnings about source map issues for now
+ // these are caused originally by rollup trying to complain about directives
+ // in the middle of the files
+ // TODO: fix source map issues
+ if (warning.code === 'SOURCEMAP_ERROR') {
+ return;
+ }
+ },
+ input: {
+ entry: 'src/index.js',
+ ...Object.fromEntries(
+ [...clientModules.values()].map(c => [hash(c), c])
+ ),
+ },
+ output: {
+ entryFileNames: chunk => {
+ return chunk.name + '.cjs';
+ },
+ format: 'cjs',
+ },
+ },
+ ssr: true,
+ ssrManifest: true,
+ ssrEmitAssets: true,
+ target: 'node18',
+ manifest: true,
+ outDir: 'build/server',
+ },
+ ssr: {
+ external: ['react', 'react-dom', 'react-server-dom-vite'],
+ },
+ });
+
+ // Building the client bundle, includes the client entry point and client components for hydration
+ await vite.build({
+ build: {
+ rollupOptions: {
+ input: {
+ entry: 'src/index.js',
+ ...Object.fromEntries(
+ [...clientModules.values()].map(c => [hash(c), c])
+ ),
+ },
+ onwarn: (warning, warn) => {
+ // suppress warnings about source map issues for now
+ // these are caused originally by rollup trying to complain about directives
+ // in the middle of the files
+ // TODO: fix source map issues
+ if (warning.code === 'SOURCEMAP_ERROR') {
+ return;
+ }
+ },
+ output: {
+ // we want to control the names of the client component chunks
+ // so that we can load them individually when they are requested
+ entryFileNames: chunk => {
+ return chunk.name + '.js';
+ },
+ },
+ treeshake: true,
+ // required otherwise rollup will remove the exports since they are not used
+ // by the other entries
+ preserveEntrySignatures: 'exports-only',
+ },
+ ssrManifest: true,
+ target: 'esnext',
+ manifest: true,
+ outDir: 'build/static',
+ },
+ ssr: {
+ external: ['react', 'react-dom', 'react-server-dom-vite'],
+ },
+ });
+
+ // copy assets from react-server build to static build, this includes stylesheets improted from server components
+ await fs.promises.cp('build/react-server/assets', 'build/static/assets', {
+ recursive: true,
+ });
+}
+
+build();
diff --git a/fixtures/flight-vite/scripts/package.json b/fixtures/flight-vite/scripts/package.json
new file mode 100644
index 0000000000000..5bbefffbabee3
--- /dev/null
+++ b/fixtures/flight-vite/scripts/package.json
@@ -0,0 +1,3 @@
+{
+ "type": "commonjs"
+}
diff --git a/fixtures/flight-vite/scripts/test.js b/fixtures/flight-vite/scripts/test.js
new file mode 100644
index 0000000000000..bad5a20e3d0ee
--- /dev/null
+++ b/fixtures/flight-vite/scripts/test.js
@@ -0,0 +1,51 @@
+'use strict';
+
+// Do this as the first thing so that any code reading it knows the right env.
+process.env.BABEL_ENV = 'test';
+process.env.NODE_ENV = 'test';
+process.env.PUBLIC_URL = '';
+
+// Makes the script crash on unhandled rejections instead of silently
+// ignoring them. In the future, promise rejections that are not handled will
+// terminate the Node.js process with a non-zero exit code.
+process.on('unhandledRejection', err => {
+ throw err;
+});
+
+// Ensure environment variables are read.
+require('../config/env');
+
+const jest = require('jest');
+const execSync = require('child_process').execSync;
+let argv = process.argv.slice(2);
+
+function isInGitRepository() {
+ try {
+ execSync('git rev-parse --is-inside-work-tree', {stdio: 'ignore'});
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+function isInMercurialRepository() {
+ try {
+ execSync('hg --cwd . root', {stdio: 'ignore'});
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+
+// Watch unless on CI or explicitly running all tests
+if (
+ !process.env.CI &&
+ argv.indexOf('--watchAll') === -1 &&
+ argv.indexOf('--watchAll=false') === -1
+) {
+ // https://github.com/facebook/create-react-app/issues/5210
+ const hasSourceControl = isInGitRepository() || isInMercurialRepository();
+ argv.push(hasSourceControl ? '--watch' : '--watchAll');
+}
+
+jest.run(argv);
diff --git a/fixtures/flight-vite/server/global.js b/fixtures/flight-vite/server/global.js
new file mode 100644
index 0000000000000..151e12dc4331b
--- /dev/null
+++ b/fixtures/flight-vite/server/global.js
@@ -0,0 +1,242 @@
+'use strict';
+
+// This is a server to host CDN distributed resources like module source files and SSR
+
+const path = require('path');
+const url = require('url');
+
+const fs = require('fs').promises;
+const compress = require('compression');
+const chalk = require('chalk');
+const express = require('express');
+const http = require('http');
+const vite = require('vite');
+
+const {renderToPipeableStream} = require('react-dom/server');
+const {createFromNodeStream} = require('react-server-dom-vite/client');
+
+const moduleBasePath = new URL('../src', url.pathToFileURL(__filename)).href;
+
+async function createApp() {
+ const app = express();
+
+ app.use(compress());
+
+ function request(options, body) {
+ return new Promise((resolve, reject) => {
+ const req = http.request(options, res => {
+ resolve(res);
+ });
+ req.on('error', e => {
+ reject(e);
+ });
+ body.pipe(req);
+ });
+ }
+
+ let getClientAsset;
+
+ if (process.env.NODE_ENV === 'development') {
+ const vite = await import('vite');
+ const {default: reactRefresh} = await import('@vitejs/plugin-react');
+ const viteServer = await vite.createServer({
+ appType: 'custom',
+ server: {middlewareMode: true},
+ plugins: [
+ reactRefresh(),
+ {
+ name: 'react-server-dom-vite:react-refresh',
+ handleHotUpdate({file}) {
+ // clear vite module cache so when its imported again, we will
+ // get the new version
+ globalThis.__vite_module_cache__.delete(file);
+ },
+ },
+ ],
+ ssr: {
+ external: ['react', 'react-dom', 'react-server-dom-vite'],
+ },
+ });
+
+ globalThis.__vite_module_cache__ = new Map();
+ globalThis.__vite_preload__ = metadata => {
+ const existingPromise = __vite_module_cache__.get(metadata.specifier);
+ if (existingPromise) {
+ if (existingPromise.status === 'fulfilled') {
+ return null;
+ }
+ return existingPromise;
+ } else {
+ const modulePromise = viteServer.ssrLoadModule(metadata.specifier);
+ modulePromise.then(
+ value => {
+ const fulfilledThenable = modulePromise;
+ fulfilledThenable.status = 'fulfilled';
+ fulfilledThenable.value = value;
+ },
+ reason => {
+ const rejectedThenable = modulePromise;
+ rejectedThenable.status = 'rejected';
+ rejectedThenable.reason = reason;
+ }
+ );
+ __vite_module_cache__.set(metadata.specifier, modulePromise);
+ return modulePromise;
+ }
+ };
+
+ globalThis.__vite_require__ = metadata => {
+ let moduleExports;
+ // We assume that preloadModule has been called before, which
+ // should have added something to the module cache.
+ const promise = __vite_module_cache__.get(metadata.specifier);
+ if (promise) {
+ if (promise.status === 'fulfilled') {
+ moduleExports = promise.value;
+ } else {
+ throw promise.reason;
+ }
+ return moduleExports[metadata.name];
+ } else {
+ throw new Error('Module not found in cache: ' + id);
+ }
+ };
+
+ app.use('/__refresh', (req, res) => {
+ viteServer.ws.send('reload-rsc', {});
+ });
+
+ app.use(viteServer.middlewares);
+
+ getClientAsset = id => {
+ return path.join(viteServer.config.root, id);
+ };
+ } else {
+ globalThis.__vite_module_cache__ = new Map();
+ globalThis.__vite_preload__ = metadata => {
+ return null;
+ };
+
+ globalThis.__vite_require__ = metadata => {
+ const module = require(path.join(
+ process.cwd(),
+ 'build',
+ 'server',
+ metadata.specifier + '.cjs'
+ ));
+
+ if (metadata.name === 'default') {
+ return module;
+ }
+ return module[metadata.name];
+ };
+
+ app.use(express.static('build/static'));
+
+ const clientManifest = JSON.parse(
+ await fs.readFile(path.join('build', 'static', 'manifest.json'), 'utf-8')
+ );
+ getClientAsset = id => {
+ return clientManifest[id].file;
+ };
+ }
+
+ app.all('/', async function (req, res) {
+ const proxiedHeaders = {
+ 'X-Forwarded-Host': req.hostname,
+ 'X-Forwarded-For': req.ips,
+ 'X-Forwarded-Port': 3000,
+ 'X-Forwarded-Proto': req.protocol,
+ };
+ // Proxy other headers as desired.
+ if (req.get('rsc-action')) {
+ proxiedHeaders['Content-type'] = req.get('Content-type');
+ proxiedHeaders['rsc-action'] = req.get('rsc-action');
+ } else if (req.get('Content-type')) {
+ proxiedHeaders['Content-type'] = req.get('Content-type');
+ }
+ const promiseForData = request(
+ {
+ host: '127.0.0.1',
+ port: 3001,
+ method: req.method,
+ path: '/',
+ headers: proxiedHeaders,
+ },
+ req
+ );
+ if (req.accepts('text/html')) {
+ try {
+ const rscResponse = await promiseForData;
+ const moduleBaseURL = '/src';
+ // For HTML, we're a "client" emulator that runs the client code,
+ // so we start by consuming the RSC payload. This needs the local file path
+ // to load the source files from as well as the URL path for preloads.
+ const root = await createFromNodeStream(
+ rscResponse,
+ new Proxy(
+ {},
+ {
+ get(t, p) {
+ console.log(t, p);
+ },
+ }
+ ),
+ moduleBaseURL
+ );
+ // Render it into HTML by resolving the client components
+ res.set('Content-type', 'text/html');
+ const {pipe} = renderToPipeableStream(root, {
+ bootstrapModules: [getClientAsset('src/index.js')],
+ });
+ pipe(res);
+ } catch (e) {
+ console.error(`Failed to SSR: ${e.stack}`);
+ res.statusCode = 500;
+ res.end();
+ }
+ } else {
+ try {
+ const rscResponse = await promiseForData;
+ // For other request, we pass-through the RSC payload.
+ res.set('Content-type', 'text/x-component');
+ rscResponse.on('data', data => {
+ res.write(data);
+ res.flush();
+ });
+ rscResponse.on('end', data => {
+ res.end();
+ });
+ } catch (e) {
+ console.error(`Failed to proxy request: ${e.stack}`);
+ res.statusCode = 500;
+ res.end();
+ }
+ }
+ });
+
+ app.on('error', function (error) {
+ if (error.syscall !== 'listen') {
+ throw error;
+ }
+
+ switch (error.code) {
+ case 'EACCES':
+ console.error('port 3000 requires elevated privileges');
+ process.exit(1);
+ break;
+ case 'EADDRINUSE':
+ console.error('Port 3000 is already in use');
+ process.exit(1);
+ break;
+ default:
+ throw error;
+ }
+ });
+
+ app.listen(3000, () => {
+ console.log('Global Fizz/Webpack Server listening on port 3000...');
+ });
+}
+
+createApp();
diff --git a/fixtures/flight-vite/server/manifest.js b/fixtures/flight-vite/server/manifest.js
new file mode 100644
index 0000000000000..029e926c96f01
--- /dev/null
+++ b/fixtures/flight-vite/server/manifest.js
@@ -0,0 +1,52 @@
+'use strict';
+
+/**
+ * Traverses the module graph and collects assets for a given chunk
+ *
+ * @param manifest Client manifest
+ * @param id Chunk id
+ * @param assetMap Cache of assets
+ * @returns Array of asset URLs
+ */
+const findAssetsInManifest = (manifest, id, assetMap = new Map()) => {
+ function traverse(id) {
+ const cached = assetMap.get(id);
+ if (cached) {
+ return cached;
+ }
+ const chunk = manifest[id];
+ if (!chunk) {
+ return [];
+ }
+ const assets = [
+ ...(chunk.assets || []),
+ ...(chunk.css || []),
+ ...(chunk.imports?.flatMap(traverse) || []),
+ ];
+ const imports = chunk.imports?.flatMap(traverse) || [];
+ const all = [...assets, ...imports].filter(Boolean);
+ all.push(chunk.file);
+ assetMap.set(id, all);
+ return Array.from(new Set(all));
+ }
+ return traverse(id);
+};
+
+const findAssetsInModuleNode = moduleNode => {
+ const seen = new Set();
+ function traverse(node) {
+ if (seen.has(node.url)) {
+ return [];
+ }
+ seen.add(node.url);
+
+ const imports = [...node.importedModules].flatMap(traverse) || [];
+ imports.push(node.url);
+ return Array.from(new Set(imports));
+ }
+ return traverse(moduleNode);
+};
+
+module.exports = {
+ findAssetsInManifest,
+};
diff --git a/fixtures/flight-vite/server/package.json b/fixtures/flight-vite/server/package.json
new file mode 100644
index 0000000000000..5bbefffbabee3
--- /dev/null
+++ b/fixtures/flight-vite/server/package.json
@@ -0,0 +1,3 @@
+{
+ "type": "commonjs"
+}
diff --git a/fixtures/flight-vite/server/region.js b/fixtures/flight-vite/server/region.js
new file mode 100644
index 0000000000000..b0efc3861026e
--- /dev/null
+++ b/fixtures/flight-vite/server/region.js
@@ -0,0 +1,269 @@
+'use strict';
+
+// This is a server to host data-local resources like databases and RSC
+
+const path = require('path');
+const url = require('url');
+
+if (typeof fetch === 'undefined') {
+ // Patch fetch for earlier Node versions.
+ global.fetch = require('undici').fetch;
+}
+
+const express = require('express');
+const bodyParser = require('body-parser');
+const busboy = require('busboy');
+const compress = require('compression');
+const {Readable} = require('node:stream');
+const {readFile} = require('fs').promises;
+const React = require('react');
+
+async function createApp() {
+ // Application
+ const app = express();
+ app.use(compress());
+
+ const moduleBasePath = new URL('../src', url.pathToFileURL(__filename)).href;
+
+ let loadModule;
+ if (process.env.NODE_ENV === 'development') {
+ const vite = await import('vite');
+ const {default: reactRefresh} = await import('@vitejs/plugin-react');
+ const {default: reactServer} = await import('react-server-dom-vite/plugin');
+ const viteServer = await vite.createServer({
+ appType: 'custom',
+ server: {middlewareMode: true, hmr: {port: 9898}},
+ resolve: {
+ conditions: ['node', 'import', 'react-server', process.env.NODE_ENV],
+ },
+ plugins: [
+ reactServer(),
+ reactRefresh(),
+ {
+ name: 'react-server-dom-vite:react-refresh',
+ handleHotUpdate({file}) {
+ // clear vite module cache so when its imported again, we will
+ fetch(`http://localhost:3000/__refresh`, {
+ method: 'POST',
+ headers: {'Content-Type': 'application/json'},
+ body: JSON.stringify({file}),
+ })
+ .then(() => {})
+ .catch(err => console.error(err));
+ },
+ },
+ ],
+ ssr: {
+ noExternal: true,
+ external: ['react', 'react-dom', 'react-server-dom-vite'],
+ },
+ });
+
+ globalThis.__vite_module_cache__ = new Map();
+ globalThis.__vite_preload__ = metadata => {
+ const existingPromise = __vite_module_cache__.get(metadata.specifier);
+ if (existingPromise) {
+ if (existingPromise.status === 'fulfilled') {
+ return null;
+ }
+ return existingPromise;
+ } else {
+ const modulePromise = viteServer.ssrLoadModule(metadata.specifier);
+ modulePromise.then(
+ value => {
+ const fulfilledThenable = modulePromise;
+ fulfilledThenable.status = 'fulfilled';
+ fulfilledThenable.value = value;
+ },
+ reason => {
+ const rejectedThenable = modulePromise;
+ rejectedThenable.status = 'rejected';
+ rejectedThenable.reason = reason;
+ }
+ );
+ __vite_module_cache__.set(metadata.specifier, modulePromise);
+ return modulePromise;
+ }
+ };
+
+ globalThis.__vite_require__ = metadata => {
+ let moduleExports;
+ // We assume that preloadModule has been called before, which
+ // should have added something to the module cache.
+ const promise = __vite_module_cache__.get(metadata.specifier);
+ if (promise) {
+ if (promise.status === 'fulfilled') {
+ moduleExports = promise.value;
+ } else {
+ throw promise.reason;
+ }
+ return moduleExports[metadata.name];
+ } else {
+ throw new Error('Module not found in cache: ' + id);
+ }
+ };
+
+ const {collectStyles} = require('./styles.js');
+ globalThis.__vite_find_assets__ = async entries => {
+ return Object.keys(await collectStyles(viteServer, entries));
+ };
+ } else {
+ const reactServerManifest = JSON.parse(
+ await readFile('build/react-server/manifest.json', 'utf8')
+ );
+
+ globalThis.__vite_module_cache__ = new Map();
+ globalThis.__vite_preload__ = metadata => {
+ return null;
+ };
+
+ globalThis.__vite_require__ = metadata => {
+ const module = require(path.join(
+ process.cwd(),
+ 'build',
+ 'server',
+ metadata.specifier + '.cjs'
+ ));
+
+ if (metadata.name === 'default') {
+ return module;
+ }
+ return module[metadata.name];
+ };
+
+ const {findAssetsInManifest} = require('./manifest.js');
+
+ globalThis.__vite_find_assets__ = async entries => {
+ return findAssetsInManifest(reactServerManifest, entries[0]).filter(
+ asset => asset.endsWith('.css')
+ );
+ };
+ }
+
+ loadModule = async metadata => {
+ await __vite_preload__(metadata);
+ return __vite_require__(metadata);
+ };
+
+ async function renderApp(res, returnValue) {
+ const {renderToPipeableStream} = await import(
+ 'react-server-dom-vite/server'
+ );
+
+ const App = await loadModule({
+ specifier:
+ process.env.NODE_ENV === 'development'
+ ? path.join(process.cwd(), 'src/App.jsx')
+ : 'App',
+ name: 'default',
+ });
+ const root = React.createElement(App);
+
+ // For client-invoked server actions we refresh the tree and return a return value.
+ const payload = returnValue ? {returnValue, root} : root;
+ const {pipe} = renderToPipeableStream(payload, moduleBasePath);
+ pipe(res);
+ }
+
+ app.get('/', async function (req, res) {
+ await renderApp(res, null);
+ });
+
+ app.post('/', bodyParser.text(), async function (req, res) {
+ const {
+ renderToPipeableStream,
+ decodeReply,
+ decodeReplyFromBusboy,
+ decodeAction,
+ } = await import('react-server-dom-vite/server');
+ const serverReference = req.get('rsc-action');
+ if (serverReference) {
+ // This is the client-side case
+ const [filepath, name] = serverReference.split('#');
+ const action = await loadModule({specifier: filepath, name});
+ // Validate that this is actually a function we intended to expose and
+ // not the client trying to invoke arbitrary functions. In a real app,
+ // you'd have a manifest verifying this before even importing it.
+ if (action.$$typeof !== Symbol.for('react.server.reference')) {
+ throw new Error('Invalid action');
+ }
+
+ let args;
+ if (req.is('multipart/form-data')) {
+ // Use busboy to streamingly parse the reply from form-data.
+ const bb = busboy({headers: req.headers});
+ const reply = decodeReplyFromBusboy(bb, moduleBasePath);
+ req.pipe(bb);
+ args = await reply;
+ } else {
+ args = await decodeReply(req.body, moduleBasePath);
+ }
+ const result = action.apply(null, args);
+ try {
+ // Wait for any mutations
+ await result;
+ } catch (x) {
+ // We handle the error on the client
+ }
+ // Refresh the client and return the value
+ renderApp(res, result);
+ } else {
+ // This is the progressive enhancement case
+ const UndiciRequest = require('undici').Request;
+ const fakeRequest = new UndiciRequest('http://localhost', {
+ method: 'POST',
+ headers: {'Content-Type': req.headers['content-type']},
+ body: Readable.toWeb(req),
+ duplex: 'half',
+ });
+ const formData = await fakeRequest.formData();
+ const action = await decodeAction(formData, moduleBasePath);
+ try {
+ // Wait for any mutations
+ await action();
+ } catch (x) {
+ const {setServerState} = await import('../src/ServerState.js');
+ setServerState('Error: ' + x.message);
+ }
+ renderApp(res, null);
+ }
+ });
+
+ app.get('/todos', function (req, res) {
+ res.json([
+ {
+ id: 1,
+ text: 'Shave yaks',
+ },
+ {
+ id: 2,
+ text: 'Eat kale',
+ },
+ ]);
+ });
+
+ app.listen(3001, () => {
+ console.log('Regional Flight Server listening on port 3001...');
+ });
+
+ app.on('error', function (error) {
+ if (error.syscall !== 'listen') {
+ throw error;
+ }
+
+ switch (error.code) {
+ case 'EACCES':
+ console.error('port 3001 requires elevated privileges');
+ process.exit(1);
+ break;
+ case 'EADDRINUSE':
+ console.error('Port 3001 is already in use');
+ process.exit(1);
+ break;
+ default:
+ throw error;
+ }
+ });
+}
+
+createApp();
diff --git a/fixtures/flight-vite/server/styles.js b/fixtures/flight-vite/server/styles.js
new file mode 100644
index 0000000000000..72976228ec8fe
--- /dev/null
+++ b/fixtures/flight-vite/server/styles.js
@@ -0,0 +1,103 @@
+'use strict';
+
+const path = require('node:path');
+
+async function findDeps(vite, node, deps) {
+ // since `ssrTransformResult.deps` contains URLs instead of `ModuleNode`s, this process is asynchronous.
+ // instead of using `await`, we resolve all branches in parallel.
+ const branches = [];
+
+ async function add(node) {
+ if (!deps.has(node)) {
+ deps.add(node);
+ await findDeps(vite, node, deps);
+ }
+ }
+
+ async function add_by_url(url) {
+ const node = await vite.moduleGraph.getModuleByUrl(url);
+
+ if (node) {
+ await add(node);
+ }
+ }
+
+ if (node.ssrTransformResult) {
+ if (node.ssrTransformResult.deps) {
+ node.ssrTransformResult.deps.forEach(url =>
+ branches.push(add_by_url(url))
+ );
+ }
+
+ // if (node.ssrTransformResult.dynamicDeps) {
+ // node.ssrTransformResult.dynamicDeps.forEach(url => branches.push(add_by_url(url)));
+ // }
+ } else {
+ node.importedModules.forEach(node => branches.push(add(node)));
+ }
+
+ await Promise.all(branches);
+}
+
+// Vite doesn't expose this so we just copy the list for now
+// https://github.com/vitejs/vite/blob/3edd1af56e980aef56641a5a51cf2932bb580d41/packages/vite/src/node/plugins/css.ts#L96
+const STYLE_ASSET_REGEX = /\.(css|less|sass|scss|styl|stylus|pcss|postcss)$/;
+const MODULE_STYLE_ASSET_REGEX =
+ /\.module\.(css|less|sass|scss|styl|stylus|pcss|postcss)$/;
+
+async function collectStyles(devServer, match) {
+ const styles = {};
+ const deps = new Set();
+ try {
+ for (const file of match) {
+ const resolvedId = await devServer.pluginContainer.resolveId(file);
+
+ if (!resolvedId) {
+ console.log('not found');
+ continue;
+ }
+
+ const id = resolvedId.id;
+
+ const normalizedPath = path.resolve(id).replace(/\\/g, '/');
+ let node = devServer.moduleGraph.getModuleById(normalizedPath);
+ if (!node) {
+ const absolutePath = path.resolve(file);
+ await devServer.ssrLoadModule(absolutePath);
+ node = await devServer.moduleGraph.getModuleByUrl(absolutePath);
+
+ if (!node) {
+ console.log('not found');
+ return;
+ }
+ }
+
+ await findDeps(devServer, node, deps);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+
+ for (const dep of deps) {
+ const parsed = new URL(dep.url, 'http://localhost/');
+ const query = parsed.searchParams;
+
+ if (STYLE_ASSET_REGEX.test(dep.file ?? '')) {
+ try {
+ const mod = await devServer.ssrLoadModule(dep.url);
+ // if (module_STYLE_ASSET_REGEX.test(dep.file)) {
+ // styles[dep.url] = env.cssModules?.[dep.file];
+ // } else {
+ styles[dep.url] = mod.default;
+ // }
+ } catch {
+ // this can happen with dynamically imported modules, I think
+ // because the Vite module graph doesn't distinguish between
+ // static and dynamic imports? TODO investigate, submit fix
+ }
+ }
+ }
+ return styles;
+}
+
+module.exports = {collectStyles};
diff --git a/fixtures/flight-vite/src/App.jsx b/fixtures/flight-vite/src/App.jsx
new file mode 100644
index 0000000000000..a4aad822ee3eb
--- /dev/null
+++ b/fixtures/flight-vite/src/App.jsx
@@ -0,0 +1,74 @@
+import * as React from 'react';
+import Button from './Button.jsx';
+import Form from './Form.jsx';
+import {like, greet} from './actions.js';
+import {getServerState} from './ServerState.js';
+import {Counter} from './Counter2.jsx';
+import './style.css';
+import {cache, useState} from 'react';
+
+const REACT_REFRESH_PREAMBLE = `
+ import RefreshRuntime from "/@react-refresh"
+ RefreshRuntime.injectIntoGlobalHook(window)
+ window.$RefreshReg$ = () => {}
+ window.$RefreshSig$ = () => (type) => type
+ window.__vite_plugin_react_preamble_installed__ = true
+`;
+
+async function Assets() {
+ const styles = await __vite_find_assets__(['src/App.jsx']);
+ return (
+ <>
+ {styles.map(key => (
+
+ ))}
+ >
+ );
+}
+
+const data = cache(async () => {
+ return {foo: 'bar'};
+});
+
+export default async function App() {
+ const res = await fetch('http://localhost:3001/todos');
+ const todos = await res.json();
+ const cachedData = await data();
+ return (
+
+
+
+
+ Flight
+ {import.meta.env.DEV ? (
+ <>
+
+
+ >
+ ) : null}
+
+
+
+
+
{getServerState()}
+
+ {todos.map(todo => (
+ - {todo.text}
+ ))}
+
+
+
+
+
+
+
{JSON.stringify(cachedData)}
+
+
+
+ );
+}
diff --git a/fixtures/flight-vite/src/Button.jsx b/fixtures/flight-vite/src/Button.jsx
new file mode 100644
index 0000000000000..5c1da18c59891
--- /dev/null
+++ b/fixtures/flight-vite/src/Button.jsx
@@ -0,0 +1,26 @@
+'use client';
+
+import * as React from 'react';
+import {experimental_useFormStatus as useFormStatus} from 'react-dom';
+import ErrorBoundary from './ErrorBoundary.jsx';
+
+function ButtonDisabledWhilePending({action, children}) {
+ const {pending} = useFormStatus();
+ return (
+
+ );
+}
+
+export default function Button({action, children}) {
+ return (
+
+
+
+ );
+}
diff --git a/fixtures/flight-vite/src/Counter.jsx b/fixtures/flight-vite/src/Counter.jsx
new file mode 100644
index 0000000000000..1ef1e93d89d8e
--- /dev/null
+++ b/fixtures/flight-vite/src/Counter.jsx
@@ -0,0 +1,12 @@
+'use client';
+
+import * as React from 'react';
+
+export function Counter() {
+ const [count, setCount] = React.useState(0);
+ return (
+ <>
+
+ >
+ );
+}
diff --git a/fixtures/flight-vite/src/Counter2.jsx b/fixtures/flight-vite/src/Counter2.jsx
new file mode 100644
index 0000000000000..005cb87dc9ca2
--- /dev/null
+++ b/fixtures/flight-vite/src/Counter2.jsx
@@ -0,0 +1,3 @@
+'use client';
+
+export * from './Counter.jsx';
diff --git a/fixtures/flight-vite/src/ErrorBoundary.jsx b/fixtures/flight-vite/src/ErrorBoundary.jsx
new file mode 100644
index 0000000000000..44dc0965142e2
--- /dev/null
+++ b/fixtures/flight-vite/src/ErrorBoundary.jsx
@@ -0,0 +1,16 @@
+'use client';
+
+import * as React from 'react';
+
+export default class ErrorBoundary extends React.Component {
+ state = {error: null};
+ static getDerivedStateFromError(error) {
+ return {error};
+ }
+ render() {
+ if (this.state.error) {
+ return Caught an error: {this.state.error.message}
;
+ }
+ return this.props.children;
+ }
+}
diff --git a/fixtures/flight-vite/src/Form.jsx b/fixtures/flight-vite/src/Form.jsx
new file mode 100644
index 0000000000000..4ed663c6aab36
--- /dev/null
+++ b/fixtures/flight-vite/src/Form.jsx
@@ -0,0 +1,28 @@
+'use client';
+
+import * as React from 'react';
+import {experimental_useFormStatus as useFormStatus} from 'react-dom';
+import ErrorBoundary from './ErrorBoundary.jsx';
+
+function Status() {
+ const {pending} = useFormStatus();
+ return pending ? 'Saving...' : null;
+}
+
+export default function Form({action, children}) {
+ const [isPending, setIsPending] = React.useState(false);
+ return (
+
+
+
+ );
+}
diff --git a/fixtures/flight-vite/src/ServerState.js b/fixtures/flight-vite/src/ServerState.js
new file mode 100644
index 0000000000000..3d4c7162262dc
--- /dev/null
+++ b/fixtures/flight-vite/src/ServerState.js
@@ -0,0 +1,9 @@
+let serverState = 'Hello World';
+
+export function setServerState(message) {
+ serverState = message;
+}
+
+export function getServerState() {
+ return serverState;
+}
diff --git a/fixtures/flight-vite/src/actions.js b/fixtures/flight-vite/src/actions.js
new file mode 100644
index 0000000000000..3d26189979c2f
--- /dev/null
+++ b/fixtures/flight-vite/src/actions.js
@@ -0,0 +1,20 @@
+'use server';
+
+import {setServerState} from './ServerState.js';
+
+export async function like() {
+ setServerState('Liked!');
+ return new Promise((resolve, reject) => resolve('Liked'));
+}
+
+export async function greet(formData) {
+ const name = formData.get('name') || 'you';
+ setServerState('Hi ' + name);
+ const file = formData.get('file');
+ if (file) {
+ return `Ok, ${name}, here is ${file.name}:
+ ${(await file.text()).toUpperCase()}
+ `;
+ }
+ return 'Hi ' + name + '!';
+}
diff --git a/fixtures/flight-vite/src/index.js b/fixtures/flight-vite/src/index.js
new file mode 100644
index 0000000000000..1a9d7a32856dd
--- /dev/null
+++ b/fixtures/flight-vite/src/index.js
@@ -0,0 +1,119 @@
+import * as React from 'react';
+import {use, useState, startTransition} from 'react';
+import ReactDOM from 'react-dom/client';
+import {createFromFetch, encodeReply} from 'react-server-dom-vite/client';
+
+const moduleBaseURL = '/src/';
+let updateRoot;
+
+if (typeof window !== 'undefined') {
+ globalThis.__vite_module_cache__ = new Map();
+ globalThis.__vite_preload__ = metadata => {
+ const existingPromise = __vite_module_cache__.get(metadata.specifier);
+ if (existingPromise) {
+ if (existingPromise.status === 'fulfilled') {
+ return null;
+ }
+ return existingPromise;
+ } else {
+ let moduleId;
+ if (process.env.NODE_ENV === 'development') {
+ moduleId = `/@fs${metadata.specifier}`;
+ } else {
+ moduleId = `/${metadata.specifier}.js`;
+ }
+
+ const modulePromise = import(/* @vite-ignore */ moduleId);
+ modulePromise.then(
+ value => {
+ const fulfilledThenable = modulePromise;
+ fulfilledThenable.status = 'fulfilled';
+ fulfilledThenable.value = value;
+ },
+ reason => {
+ const rejectedThenable = modulePromise;
+ rejectedThenable.status = 'rejected';
+ rejectedThenable.reason = reason;
+ }
+ );
+ __vite_module_cache__.set(metadata.specifier, modulePromise);
+ return modulePromise;
+ }
+ };
+
+ globalThis.__vite_require__ = metadata => {
+ let moduleExports;
+ // We assume that preloadModule has been called before, which
+ // should have added something to the module cache.
+ const promise = __vite_module_cache__.get(metadata.specifier);
+ if (promise) {
+ if (promise.status === 'fulfilled') {
+ moduleExports = promise.value;
+ } else {
+ throw promise.reason;
+ }
+ return moduleExports[metadata.name];
+ } else {
+ throw new Error('Module not found in cache: ' + id);
+ }
+ };
+}
+
+async function callServer(id, args) {
+ const response = fetch('/', {
+ method: 'POST',
+ headers: {
+ Accept: 'text/x-component',
+ 'rsc-action': id,
+ },
+ body: await encodeReply(args),
+ });
+ const {returnValue, root} = await createFromFetch(response, {
+ callServer,
+ moduleBaseURL,
+ });
+ // Refresh the tree with the new RSC payload.
+ startTransition(() => {
+ updateRoot(root);
+ });
+ return returnValue;
+}
+
+let data = createFromFetch(
+ fetch('/', {
+ headers: {
+ Accept: 'text/x-component',
+ },
+ }),
+ {
+ callServer,
+ moduleBaseURL,
+ }
+);
+
+if (import.meta.hot) {
+ import.meta.hot.on('reload-rsc', async () => {
+ updateRoot(
+ await createFromFetch(
+ fetch('/', {
+ headers: {
+ Accept: 'text/x-component',
+ },
+ }),
+ {
+ callServer,
+ moduleBaseURL,
+ }
+ )
+ );
+ });
+}
+
+function Shell({data}) {
+ const [root, setRoot] = useState(use(data));
+ updateRoot = setRoot;
+
+ return root;
+}
+
+ReactDOM.hydrateRoot(document, React.createElement(Shell, {data}));
diff --git a/fixtures/flight-vite/src/style.css b/fixtures/flight-vite/src/style.css
new file mode 100644
index 0000000000000..349c1d52214b6
--- /dev/null
+++ b/fixtures/flight-vite/src/style.css
@@ -0,0 +1,3 @@
+body {
+ font-family: sans-serif;
+}
\ No newline at end of file
diff --git a/fixtures/flight-vite/yarn.lock b/fixtures/flight-vite/yarn.lock
new file mode 100644
index 0000000000000..c56f332e2b330
--- /dev/null
+++ b/fixtures/flight-vite/yarn.lock
@@ -0,0 +1,1972 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
+ integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
+ dependencies:
+ "@babel/highlight" "^7.22.5"
+
+"@babel/compat-data@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255"
+ integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==
+
+"@babel/core@^7.21.4":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89"
+ integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.22.5"
+ "@babel/generator" "^7.22.5"
+ "@babel/helper-compilation-targets" "^7.22.5"
+ "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helpers" "^7.22.5"
+ "@babel/parser" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.2"
+ semver "^6.3.0"
+
+"@babel/generator@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7"
+ integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==
+ dependencies:
+ "@babel/types" "^7.22.5"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
+"@babel/helper-compilation-targets@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02"
+ integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==
+ dependencies:
+ "@babel/compat-data" "^7.22.5"
+ "@babel/helper-validator-option" "^7.22.5"
+ browserslist "^4.21.3"
+ lru-cache "^5.1.1"
+ semver "^6.3.0"
+
+"@babel/helper-environment-visitor@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
+ integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
+
+"@babel/helper-function-name@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be"
+ integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
+ dependencies:
+ "@babel/template" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-imports@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c"
+ integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-transforms@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef"
+ integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-module-imports" "^7.22.5"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
+ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08"
+ integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
+ integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+
+"@babel/helper-validator-identifier@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
+ integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
+
+"@babel/helper-validator-option@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
+ integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
+
+"@babel/helpers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820"
+ integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==
+ dependencies:
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/highlight@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031"
+ integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.5"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea"
+ integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==
+
+"@babel/plugin-transform-react-jsx-self@^7.21.0":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e"
+ integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-react-jsx-source@^7.19.6":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c"
+ integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/runtime@^7.21.0":
+ version "7.22.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb"
+ integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
+"@babel/template@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
+ integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
+ dependencies:
+ "@babel/code-frame" "^7.22.5"
+ "@babel/parser" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/traverse@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1"
+ integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==
+ dependencies:
+ "@babel/code-frame" "^7.22.5"
+ "@babel/generator" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.5"
+ "@babel/parser" "^7.22.5"
+ "@babel/types" "^7.22.5"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
+ integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
+ to-fast-properties "^2.0.0"
+
+"@esbuild/android-arm64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd"
+ integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==
+
+"@esbuild/android-arm@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d"
+ integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==
+
+"@esbuild/android-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1"
+ integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==
+
+"@esbuild/darwin-arm64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276"
+ integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==
+
+"@esbuild/darwin-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb"
+ integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==
+
+"@esbuild/freebsd-arm64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2"
+ integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==
+
+"@esbuild/freebsd-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4"
+ integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==
+
+"@esbuild/linux-arm64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb"
+ integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==
+
+"@esbuild/linux-arm@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a"
+ integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==
+
+"@esbuild/linux-ia32@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a"
+ integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==
+
+"@esbuild/linux-loong64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72"
+ integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==
+
+"@esbuild/linux-mips64el@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289"
+ integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==
+
+"@esbuild/linux-ppc64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7"
+ integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==
+
+"@esbuild/linux-riscv64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09"
+ integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==
+
+"@esbuild/linux-s390x@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829"
+ integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==
+
+"@esbuild/linux-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4"
+ integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==
+
+"@esbuild/netbsd-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462"
+ integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==
+
+"@esbuild/openbsd-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691"
+ integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==
+
+"@esbuild/sunos-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273"
+ integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==
+
+"@esbuild/win32-arm64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f"
+ integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==
+
+"@esbuild/win32-ia32@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03"
+ integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==
+
+"@esbuild/win32-x64@0.17.19":
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061"
+ integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@1.4.14":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.18"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
+ integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
+ dependencies:
+ "@jridgewell/resolve-uri" "3.1.0"
+ "@jridgewell/sourcemap-codec" "1.4.14"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5":
+ version "7.0.12"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
+ integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@vitejs/plugin-react@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28"
+ integrity sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==
+ dependencies:
+ "@babel/core" "^7.21.4"
+ "@babel/plugin-transform-react-jsx-self" "^7.21.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.19.6"
+ react-refresh "^0.14.0"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.5:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+address@^1.0.1, address@^1.1.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e"
+ integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==
+
+ajv-keywords@^3.4.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.12.2:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+body-parser@^1.20.1:
+ version "1.20.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
+ integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.11.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.18.1, browserslist@^4.21.3:
+ version "4.21.7"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551"
+ integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==
+ dependencies:
+ caniuse-lite "^1.0.30001489"
+ electron-to-chromium "^1.4.411"
+ node-releases "^2.0.12"
+ update-browserslist-db "^1.0.11"
+
+busboy@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
+ integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
+ dependencies:
+ streamsearch "^1.1.0"
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001489:
+ version "1.0.30001492"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b"
+ integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.1.0, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chokidar@^3.4.2, chokidar@^3.5.2:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+compressible@~2.0.16:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+ integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+ dependencies:
+ mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+ integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.16"
+ debug "2.6.9"
+ on-headers "~1.0.2"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concurrently@^7.3.0:
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a"
+ integrity sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==
+ dependencies:
+ chalk "^4.1.0"
+ date-fns "^2.29.1"
+ lodash "^4.17.21"
+ rxjs "^7.0.0"
+ shell-quote "^1.7.3"
+ spawn-command "^0.0.2-1"
+ supports-color "^8.1.0"
+ tree-kill "^1.2.2"
+ yargs "^17.3.1"
+
+content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+convert-source-map@^1.7.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.7.2"
+
+cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+date-fns@^2.29.1:
+ version "2.30.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+debug@2.6.9, debug@^2.6.0:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+deepmerge@^4.2.2:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+define-lazy-prop@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+ integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-port-alt@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275"
+ integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==
+ dependencies:
+ address "^1.0.1"
+ debug "^2.6.0"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+duplexer@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.4.411:
+ version "1.4.417"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz#a0c7eb992e68287fa50c8da5a5238b01f20b9a82"
+ integrity sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+esbuild@^0.17.5:
+ version "0.17.19"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955"
+ integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.17.19"
+ "@esbuild/android-arm64" "0.17.19"
+ "@esbuild/android-x64" "0.17.19"
+ "@esbuild/darwin-arm64" "0.17.19"
+ "@esbuild/darwin-x64" "0.17.19"
+ "@esbuild/freebsd-arm64" "0.17.19"
+ "@esbuild/freebsd-x64" "0.17.19"
+ "@esbuild/linux-arm" "0.17.19"
+ "@esbuild/linux-arm64" "0.17.19"
+ "@esbuild/linux-ia32" "0.17.19"
+ "@esbuild/linux-loong64" "0.17.19"
+ "@esbuild/linux-mips64el" "0.17.19"
+ "@esbuild/linux-ppc64" "0.17.19"
+ "@esbuild/linux-riscv64" "0.17.19"
+ "@esbuild/linux-s390x" "0.17.19"
+ "@esbuild/linux-x64" "0.17.19"
+ "@esbuild/netbsd-x64" "0.17.19"
+ "@esbuild/openbsd-x64" "0.17.19"
+ "@esbuild/sunos-x64" "0.17.19"
+ "@esbuild/win32-arm64" "0.17.19"
+ "@esbuild/win32-ia32" "0.17.19"
+ "@esbuild/win32-x64" "0.17.19"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.9:
+ version "3.2.12"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
+ integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fastq@^1.6.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
+ integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
+ dependencies:
+ reusify "^1.0.4"
+
+filesize@^8.0.6:
+ version "8.0.7"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8"
+ integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+fork-ts-checker-webpack-plugin@^6.5.0:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3"
+ integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==
+ dependencies:
+ "@babel/code-frame" "^7.8.3"
+ "@types/json-schema" "^7.0.5"
+ chalk "^4.1.0"
+ chokidar "^3.4.2"
+ cosmiconfig "^6.0.0"
+ deepmerge "^4.2.2"
+ fs-extra "^9.0.0"
+ glob "^7.1.6"
+ memfs "^3.1.2"
+ minimatch "^3.0.4"
+ schema-utils "2.7.0"
+ semver "^7.3.2"
+ tapable "^1.0.0"
+
+fs-extra@^9.0.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-monkey@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747"
+ integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob@^7.1.6:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global-modules@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+ integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+ dependencies:
+ global-prefix "^3.0.0"
+
+global-prefix@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+ integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+ dependencies:
+ ini "^1.3.5"
+ kind-of "^6.0.2"
+ which "^1.3.1"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globby@^11.0.4:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+gzip-size@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
+ integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==
+ dependencies:
+ duplexer "^0.1.2"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ignore-by-default@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+ integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==
+
+ignore@^5.2.0:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+
+immer@^9.0.7:
+ version "9.0.21"
+ resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
+ integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
+import-fresh@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.5:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-root@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
+ integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json5@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+loader-utils@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576"
+ integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memfs@^3.1.2:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.3.tgz#d9b40fe4f8d5788c5f895bda804cd0d9eeee9f3b"
+ integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==
+ dependencies:
+ fs-monkey "^1.0.4"
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.6:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
+ integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+node-releases@^2.0.12:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
+ integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
+
+nodemon@^2.0.19:
+ version "2.0.22"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258"
+ integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==
+ dependencies:
+ chokidar "^3.5.2"
+ debug "^3.2.7"
+ ignore-by-default "^1.0.1"
+ minimatch "^3.1.2"
+ pstree.remy "^1.1.8"
+ semver "^5.7.1"
+ simple-update-notifier "^1.0.7"
+ supports-color "^5.5.0"
+ touch "^3.1.0"
+ undefsafe "^2.0.5"
+
+nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==
+ dependencies:
+ abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+open@^8.4.0:
+ version "8.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
+ integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
+ dependencies:
+ define-lazy-prop "^2.0.0"
+ is-docker "^2.1.1"
+ is-wsl "^2.2.0"
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pkg-up@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
+postcss@^8.4.23:
+ version "8.4.24"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df"
+ integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==
+ dependencies:
+ nanoid "^3.3.6"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+prompts@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+pstree.remy@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+ integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
+punycode@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
+ integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+
+qs@6.11.0:
+ version "6.11.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+ integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+ dependencies:
+ side-channel "^1.0.4"
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+react-dev-utils@^12.0.1:
+ version "12.0.1"
+ resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73"
+ integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==
+ dependencies:
+ "@babel/code-frame" "^7.16.0"
+ address "^1.1.2"
+ browserslist "^4.18.1"
+ chalk "^4.1.2"
+ cross-spawn "^7.0.3"
+ detect-port-alt "^1.1.6"
+ escape-string-regexp "^4.0.0"
+ filesize "^8.0.6"
+ find-up "^5.0.0"
+ fork-ts-checker-webpack-plugin "^6.5.0"
+ global-modules "^2.0.0"
+ globby "^11.0.4"
+ gzip-size "^6.0.0"
+ immer "^9.0.7"
+ is-root "^2.1.0"
+ loader-utils "^3.2.0"
+ open "^8.4.0"
+ pkg-up "^3.1.0"
+ prompts "^2.4.2"
+ react-error-overlay "^6.0.11"
+ recursive-readdir "^2.2.2"
+ shell-quote "^1.7.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+react-dom@experimental:
+ version "0.0.0-experimental-018c58c9c-20230601"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.0.0-experimental-018c58c9c-20230601.tgz#2cc0ac824b83bab2ac1c6187f241dbd5dcd5201b"
+ integrity sha512-hwRsyoG1R3Tub0nUa72YvNcqPvU+pTcr9dadOnUCKKfSiYVbBCy7LxmkqLauCD8OjNJMlwtMgG4UAgtidclYGQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "0.0.0-experimental-018c58c9c-20230601"
+
+react-error-overlay@^6.0.11:
+ version "6.0.11"
+ resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
+ integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
+
+react-refresh@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e"
+ integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==
+
+react@experimental:
+ version "0.0.0-experimental-018c58c9c-20230601"
+ resolved "https://registry.yarnpkg.com/react/-/react-0.0.0-experimental-018c58c9c-20230601.tgz#ab04d1243c8f83b0166ed342056fa6b38ab2cd23"
+ integrity sha512-nSQIBsZ26Ii899pZ9cRt/6uQLbIUEAcDIivvAQyaHp4pWm289aB+7AK7VCWojAJIf4OStCuWs2berZsk4mzLVg==
+ dependencies:
+ loose-envify "^1.1.0"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+recursive-readdir@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372"
+ integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==
+ dependencies:
+ minimatch "^3.0.5"
+
+regenerator-runtime@^0.13.11:
+ version "0.13.11"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+ integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rollup@^3.21.0:
+ version "3.23.0"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.23.0.tgz#b8d6146dac4bf058ee817f92820988e9b358b564"
+ integrity sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+rxjs@^7.0.0:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
+ integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
+ dependencies:
+ tslib "^2.1.0"
+
+safe-buffer@5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scheduler@0.0.0-experimental-018c58c9c-20230601:
+ version "0.0.0-experimental-018c58c9c-20230601"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.0.0-experimental-018c58c9c-20230601.tgz#4f083614f8e857bab63dd90b4b37b03783dafe6b"
+ integrity sha512-otUM7AAAnCoJ5/0jTQwUQ7NhxjgcPEdrfzW7NfkpocrDoTUbql1kIGIhj9L9POMVFDI/wcZzRNK/oIEWsB4DPw==
+ dependencies:
+ loose-envify "^1.1.0"
+
+schema-utils@2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+ integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+ dependencies:
+ "@types/json-schema" "^7.0.4"
+ ajv "^6.12.2"
+ ajv-keywords "^3.4.1"
+
+semver@^5.7.1:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.2:
+ version "7.5.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
+ integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@~7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.7.3:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
+ integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+simple-update-notifier@^1.0.7:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82"
+ integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==
+ dependencies:
+ semver "~7.0.0"
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+spawn-command@^0.0.2-1:
+ version "0.0.2-1"
+ resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
+ integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+streamsearch@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
+ integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+supports-color@^5.3.0, supports-color@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+tapable@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+ integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+touch@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+ integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+ dependencies:
+ nopt "~1.0.10"
+
+tree-kill@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+ integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
+tslib@^2.1.0:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338"
+ integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+undefsafe@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
+ integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
+
+undici@^5.20.0:
+ version "5.22.1"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b"
+ integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==
+ dependencies:
+ busboy "^1.6.0"
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+update-browserslist-db@^1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
+ integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+vite@^4.3.9:
+ version "4.3.9"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d"
+ integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==
+ dependencies:
+ esbuild "^0.17.5"
+ postcss "^8.4.23"
+ rollup "^3.21.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+which@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.7.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.3.1:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/packages/react-client/src/forks/ReactFlightClientConfig.dom-node-vite.js b/packages/react-client/src/forks/ReactFlightClientConfig.dom-node-vite.js
new file mode 100644
index 0000000000000..8f101cac297e5
--- /dev/null
+++ b/packages/react-client/src/forks/ReactFlightClientConfig.dom-node-vite.js
@@ -0,0 +1,13 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+// This should really have a Node and a Browser fork but to avoid too many configs we limit this to build the same for both
+export * from 'react-client/src/ReactFlightClientConfigBrowser';
+export * from 'react-server-dom-vite/src/ReactFlightClientConfigViteBundler';
+export * from 'react-dom-bindings/src/shared/ReactFlightClientConfigDOM';
diff --git a/packages/react-reconciler/src/forks/ReactFiberConfig.dom-node-vite.js b/packages/react-reconciler/src/forks/ReactFiberConfig.dom-node-vite.js
new file mode 100644
index 0000000000000..4932b1a787bb9
--- /dev/null
+++ b/packages/react-reconciler/src/forks/ReactFiberConfig.dom-node-vite.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from 'react-dom-bindings/src/client/ReactFiberConfigDOM';
diff --git a/packages/react-server-dom-vite/README.md b/packages/react-server-dom-vite/README.md
new file mode 100644
index 0000000000000..fd0206556ae85
--- /dev/null
+++ b/packages/react-server-dom-vite/README.md
@@ -0,0 +1,5 @@
+# react-server-dom-vite
+
+Experimental React Flight bindings for DOM using ESM.
+
+**Use it at your own risk.**
diff --git a/packages/react-server-dom-vite/client.browser.js b/packages/react-server-dom-vite/client.browser.js
new file mode 100644
index 0000000000000..7d26c2771e50a
--- /dev/null
+++ b/packages/react-server-dom-vite/client.browser.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from './src/ReactFlightDOMClientBrowser';
diff --git a/packages/react-server-dom-vite/client.js b/packages/react-server-dom-vite/client.js
new file mode 100644
index 0000000000000..2dad5bb513872
--- /dev/null
+++ b/packages/react-server-dom-vite/client.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from './client.browser';
diff --git a/packages/react-server-dom-vite/client.node.js b/packages/react-server-dom-vite/client.node.js
new file mode 100644
index 0000000000000..4f435353a20f0
--- /dev/null
+++ b/packages/react-server-dom-vite/client.node.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from './src/ReactFlightDOMClientNode';
diff --git a/packages/react-server-dom-vite/esm/package.json b/packages/react-server-dom-vite/esm/package.json
new file mode 100644
index 0000000000000..3dbc1ca591c05
--- /dev/null
+++ b/packages/react-server-dom-vite/esm/package.json
@@ -0,0 +1,3 @@
+{
+ "type": "module"
+}
diff --git a/packages/react-server-dom-vite/index.js b/packages/react-server-dom-vite/index.js
new file mode 100644
index 0000000000000..05085b0ed0232
--- /dev/null
+++ b/packages/react-server-dom-vite/index.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+throw new Error('Use react-server-dom-esm/client instead.');
diff --git a/packages/react-server-dom-vite/npm/client.browser.js b/packages/react-server-dom-vite/npm/client.browser.js
new file mode 100644
index 0000000000000..319f9798f1354
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/client.browser.js
@@ -0,0 +1,7 @@
+'use strict';
+
+if (process.env.NODE_ENV === 'production') {
+ module.exports = require('./cjs/react-server-dom-vite-client.browser.production.min.js');
+} else {
+ module.exports = require('./cjs/react-server-dom-vite-client.browser.development.js');
+}
diff --git a/packages/react-server-dom-vite/npm/client.js b/packages/react-server-dom-vite/npm/client.js
new file mode 100644
index 0000000000000..89d93a7a7920f
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/client.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./client.browser');
diff --git a/packages/react-server-dom-vite/npm/client.node.js b/packages/react-server-dom-vite/npm/client.node.js
new file mode 100644
index 0000000000000..d244b3d62dae0
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/client.node.js
@@ -0,0 +1,7 @@
+'use strict';
+
+if (process.env.NODE_ENV === 'production') {
+ module.exports = require('./cjs/react-server-dom-vite-client.node.production.min.js');
+} else {
+ module.exports = require('./cjs/react-server-dom-vite-client.node.development.js');
+}
diff --git a/packages/react-server-dom-vite/npm/esm/package.json b/packages/react-server-dom-vite/npm/esm/package.json
new file mode 100644
index 0000000000000..3dbc1ca591c05
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/esm/package.json
@@ -0,0 +1,3 @@
+{
+ "type": "module"
+}
diff --git a/packages/react-server-dom-vite/npm/index.js b/packages/react-server-dom-vite/npm/index.js
new file mode 100644
index 0000000000000..fff7222d5fb74
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/index.js
@@ -0,0 +1,12 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+'use strict';
+
+throw new Error('Use react-server-dom-vite/client instead.');
diff --git a/packages/react-server-dom-vite/npm/plugin.js b/packages/react-server-dom-vite/npm/plugin.js
new file mode 100644
index 0000000000000..ffb0bbe2988e8
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/plugin.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./cjs/react-server-dom-vite-plugin.js');
diff --git a/packages/react-server-dom-vite/npm/runtime.js b/packages/react-server-dom-vite/npm/runtime.js
new file mode 100644
index 0000000000000..8a3c3968db97c
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/runtime.js
@@ -0,0 +1,7 @@
+'use strict';
+
+if (process.env.NODE_ENV === 'production') {
+ module.exports = require('./cjs/react-server-dom-vite-runtime.production.min.js');
+} else {
+ module.exports = require('./cjs/react-server-dom-vite-runtime.development.js');
+}
diff --git a/packages/react-server-dom-vite/npm/server.js b/packages/react-server-dom-vite/npm/server.js
new file mode 100644
index 0000000000000..13a632e641179
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/server.js
@@ -0,0 +1,6 @@
+'use strict';
+
+throw new Error(
+ 'The React Server Writer cannot be used outside a react-server environment. ' +
+ 'You must configure Node.js using the `--conditions react-server` flag.'
+);
diff --git a/packages/react-server-dom-vite/npm/server.node.js b/packages/react-server-dom-vite/npm/server.node.js
new file mode 100644
index 0000000000000..08d8703c52340
--- /dev/null
+++ b/packages/react-server-dom-vite/npm/server.node.js
@@ -0,0 +1,7 @@
+'use strict';
+
+if (process.env.NODE_ENV === 'production') {
+ module.exports = require('./cjs/react-server-dom-vite-server.node.production.min.js');
+} else {
+ module.exports = require('./cjs/react-server-dom-vite-server.node.development.js');
+}
diff --git a/packages/react-server-dom-vite/package.json b/packages/react-server-dom-vite/package.json
new file mode 100644
index 0000000000000..88e3a5fc8db33
--- /dev/null
+++ b/packages/react-server-dom-vite/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "react-server-dom-vite",
+ "description": "React Server Components bindings for DOM using Vite. This is intended to be integrated into meta-frameworks. It is not intended to be imported directly.",
+ "version": "18.2.0",
+ "keywords": [
+ "react"
+ ],
+ "homepage": "https://reactjs.org/",
+ "bugs": "https://github.com/facebook/react/issues",
+ "license": "MIT",
+ "files": [
+ "LICENSE",
+ "README.md",
+ "index.js",
+ "client.js",
+ "client.browser.js",
+ "client.node.js",
+ "server.js",
+ "server.node.js",
+ "plugin.js",
+ "runtime.js",
+ "cjs/",
+ "esm/"
+ ],
+ "exports": {
+ ".": "./index.js",
+ "./client": {
+ "node": "./client.node.js",
+ "default": "./client.browser.js"
+ },
+ "./client.browser": "./client.browser.js",
+ "./client.node": "./client.node.js",
+ "./server": {
+ "react-server": "./server.node.js",
+ "default": "./server.js"
+ },
+ "./server.node": "./server.node.js",
+ "./plugin": "./plugin.js",
+ "./runtime": "./runtime.js",
+ "./src/*": "./src/*.js",
+ "./package.json": "./package.json"
+ },
+ "main": "index.js",
+ "repository": {
+ "type" : "git",
+ "url" : "https://github.com/facebook/react.git",
+ "directory": "packages/react-server-dom-vite"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "vite": "^4.3.0"
+ },
+ "dependencies": {
+ "acorn-loose": "^8.3.0"
+ }
+}
diff --git a/packages/react-server-dom-vite/plugin.js b/packages/react-server-dom-vite/plugin.js
new file mode 100644
index 0000000000000..19fb76c09126f
--- /dev/null
+++ b/packages/react-server-dom-vite/plugin.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export {default} from './src/ReactFlightVitePlugin';
diff --git a/packages/react-server-dom-vite/runtime.js b/packages/react-server-dom-vite/runtime.js
new file mode 100644
index 0000000000000..b8b41baac1f3e
--- /dev/null
+++ b/packages/react-server-dom-vite/runtime.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from './src/ReactFlightViteRuntime';
diff --git a/packages/react-server-dom-vite/server.js b/packages/react-server-dom-vite/server.js
new file mode 100644
index 0000000000000..83d8b8a017ff2
--- /dev/null
+++ b/packages/react-server-dom-vite/server.js
@@ -0,0 +1,13 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+throw new Error(
+ 'The React Server cannot be used outside a react-server environment. ' +
+ 'You must configure Node.js using the `--conditions react-server` flag.',
+);
diff --git a/packages/react-server-dom-vite/server.node.js b/packages/react-server-dom-vite/server.node.js
new file mode 100644
index 0000000000000..7726b9bb929d4
--- /dev/null
+++ b/packages/react-server-dom-vite/server.node.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from './src/ReactFlightDOMServerNode';
diff --git a/packages/react-server-dom-vite/src/ReactFlightClientConfigViteBundler.js b/packages/react-server-dom-vite/src/ReactFlightClientConfigViteBundler.js
new file mode 100644
index 0000000000000..f1f095bb3d727
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightClientConfigViteBundler.js
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+import type {Thenable} from 'shared/ReactTypes';
+
+export type SSRManifest = string; // Module root path
+
+export type ServerManifest = string; // Module root path
+
+export type ServerReferenceId = string;
+
+export opaque type ClientReferenceMetadata = string;
+
+// eslint-disable-next-line no-unused-vars
+export opaque type ClientReference = {
+ specifier: string,
+ name: string,
+};
+
+export function resolveClientReference(
+ bundlerConfig: SSRManifest,
+ metadata: ClientReferenceMetadata,
+): ClientReference {
+ const [specifier, name] = metadata.split('#');
+ return {
+ specifier,
+ name,
+ };
+}
+
+export function resolveServerReference(
+ config: ServerManifest,
+ id: ServerReferenceId,
+): ClientReference {
+ const [specifier, name] = id.split('#');
+ return {
+ specifier,
+ name,
+ };
+}
+
+export function preloadModule(
+ metadata: ClientReference,
+): null | Thenable {
+ return __vite_preload__(metadata);
+}
+
+export function requireModule(metadata: ClientReference): T {
+ return __vite_require__(metadata);
+}
diff --git a/packages/react-server-dom-vite/src/ReactFlightDOMClientBrowser.js b/packages/react-server-dom-vite/src/ReactFlightDOMClientBrowser.js
new file mode 100644
index 0000000000000..e3ebaf3fb1aae
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightDOMClientBrowser.js
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+import type {Thenable} from 'shared/ReactTypes.js';
+
+import type {Response as FlightResponse} from 'react-client/src/ReactFlightClient';
+
+import type {ReactServerValue} from 'react-client/src/ReactFlightReplyClient';
+
+import {
+ createResponse,
+ getRoot,
+ reportGlobalError,
+ processBinaryChunk,
+ close,
+} from 'react-client/src/ReactFlightClient';
+
+import {
+ processReply,
+ createServerReference,
+} from 'react-client/src/ReactFlightReplyClient';
+
+type CallServerCallback = (string, args: A) => Promise;
+
+export type Options = {
+ moduleBaseURL?: string,
+ callServer?: CallServerCallback,
+};
+
+function createResponseFromOptions(options: void | Options) {
+ return createResponse(
+ options && options.moduleBaseURL ? options.moduleBaseURL : '',
+ options && options.callServer ? options.callServer : undefined,
+ );
+}
+
+function startReadingFromStream(
+ response: FlightResponse,
+ stream: ReadableStream,
+): void {
+ const reader = stream.getReader();
+ function progress({
+ done,
+ value,
+ }: {
+ done: boolean,
+ value: ?any,
+ ...
+ }): void | Promise {
+ if (done) {
+ close(response);
+ return;
+ }
+ const buffer: Uint8Array = (value: any);
+ processBinaryChunk(response, buffer);
+ return reader.read().then(progress).catch(error);
+ }
+ function error(e: any) {
+ reportGlobalError(response, e);
+ }
+ reader.read().then(progress).catch(error);
+}
+
+function createFromReadableStream(
+ stream: ReadableStream,
+ options?: Options,
+): Thenable {
+ const response: FlightResponse = createResponseFromOptions(options);
+ startReadingFromStream(response, stream);
+ return getRoot(response);
+}
+
+function createFromFetch(
+ promiseForResponse: Promise,
+ options?: Options,
+): Thenable {
+ const response: FlightResponse = createResponseFromOptions(options);
+ promiseForResponse.then(
+ function (r) {
+ startReadingFromStream(response, (r.body: any));
+ },
+ function (e) {
+ reportGlobalError(response, e);
+ },
+ );
+ return getRoot(response);
+}
+
+function encodeReply(
+ value: ReactServerValue,
+): Promise<
+ string | URLSearchParams | FormData,
+> /* We don't use URLSearchParams yet but maybe */ {
+ return new Promise((resolve, reject) => {
+ processReply(value, '', resolve, reject);
+ });
+}
+
+export {
+ createFromFetch,
+ createFromReadableStream,
+ encodeReply,
+ createServerReference,
+};
diff --git a/packages/react-server-dom-vite/src/ReactFlightDOMClientNode.js b/packages/react-server-dom-vite/src/ReactFlightDOMClientNode.js
new file mode 100644
index 0000000000000..43cf86d5b88cc
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightDOMClientNode.js
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+import type {Thenable} from 'shared/ReactTypes.js';
+
+import type {Response} from 'react-client/src/ReactFlightClient';
+
+import type {Readable} from 'stream';
+
+import {
+ createResponse,
+ getRoot,
+ reportGlobalError,
+ processBinaryChunk,
+ close,
+} from 'react-client/src/ReactFlightClient';
+
+function noServerCall() {
+ throw new Error(
+ 'Server Functions cannot be called during initial render. ' +
+ 'This would create a fetch waterfall. Try to use a Server Component ' +
+ 'to pass data to Client Components instead.',
+ );
+}
+
+export function createServerReference, T>(
+ id: any,
+ callServer: any,
+): (...A) => Promise {
+ return noServerCall;
+}
+
+function createFromNodeStream(
+ stream: Readable,
+ moduleMap: string,
+ moduleBaseURL: string, // TODO: Used for preloading hints
+): Thenable {
+ const response: Response = createResponse(moduleMap, noServerCall);
+ stream.on('data', chunk => {
+ processBinaryChunk(response, chunk);
+ });
+ stream.on('error', error => {
+ reportGlobalError(response, error);
+ });
+ stream.on('end', () => close(response));
+ return getRoot(response);
+}
+
+export {createFromNodeStream};
diff --git a/packages/react-server-dom-vite/src/ReactFlightDOMServerNode.js b/packages/react-server-dom-vite/src/ReactFlightDOMServerNode.js
new file mode 100644
index 0000000000000..9848fb1b82537
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightDOMServerNode.js
@@ -0,0 +1,158 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+import type {
+ Request,
+ ReactClientValue,
+} from 'react-server/src/ReactFlightServer';
+import type {Destination} from 'react-server/src/ReactServerStreamConfigNode';
+import type {ClientManifest} from './ReactFlightServerConfigViteBundler';
+import type {ServerManifest} from 'react-client/src/ReactFlightClientConfig';
+import type {Busboy} from 'busboy';
+import type {Writable} from 'stream';
+import type {ServerContextJSONValue, Thenable} from 'shared/ReactTypes';
+
+import {
+ createRequest,
+ startWork,
+ startFlowing,
+ abort,
+} from 'react-server/src/ReactFlightServer';
+
+import {
+ createResponse,
+ reportGlobalError,
+ close,
+ resolveField,
+ resolveFileInfo,
+ resolveFileChunk,
+ resolveFileComplete,
+ getRoot,
+} from 'react-server/src/ReactFlightReplyServer';
+
+import {decodeAction} from 'react-server/src/ReactFlightActionServer';
+
+function createDrainHandler(destination: Destination, request: Request) {
+ return () => startFlowing(request, destination);
+}
+
+type Options = {
+ onError?: (error: mixed) => void,
+ context?: Array<[string, ServerContextJSONValue]>,
+ identifierPrefix?: string,
+};
+
+type PipeableStream = {
+ abort(reason: mixed): void,
+ pipe(destination: T): T,
+};
+
+function renderToPipeableStream(
+ model: ReactClientValue,
+ webpackMap: ClientManifest,
+ options?: Options,
+): PipeableStream {
+ const request = createRequest(
+ model,
+ webpackMap,
+ options ? options.onError : undefined,
+ options ? options.context : undefined,
+ options ? options.identifierPrefix : undefined,
+ );
+ let hasStartedFlowing = false;
+ startWork(request);
+ return {
+ pipe(destination: T): T {
+ if (hasStartedFlowing) {
+ throw new Error(
+ 'React currently only supports piping to one writable stream.',
+ );
+ }
+ hasStartedFlowing = true;
+ startFlowing(request, destination);
+ destination.on('drain', createDrainHandler(destination, request));
+ return destination;
+ },
+ abort(reason: mixed) {
+ abort(request, reason);
+ },
+ };
+}
+
+function decodeReplyFromBusboy(
+ busboyStream: Busboy,
+ webpackMap: ServerManifest,
+): Thenable {
+ const response = createResponse(webpackMap, '');
+ let pendingFiles = 0;
+ const queuedFields: Array = [];
+ busboyStream.on('field', (name, value) => {
+ if (pendingFiles > 0) {
+ // Because the 'end' event fires two microtasks after the next 'field'
+ // we would resolve files and fields out of order. To handle this properly
+ // we queue any fields we receive until the previous file is done.
+ queuedFields.push(name, value);
+ } else {
+ resolveField(response, name, value);
+ }
+ });
+ busboyStream.on('file', (name, value, {filename, encoding, mimeType}) => {
+ if (encoding.toLowerCase() === 'base64') {
+ throw new Error(
+ "React doesn't accept base64 encoded file uploads because we don't expect " +
+ "form data passed from a browser to ever encode data that way. If that's " +
+ 'the wrong assumption, we can easily fix it.',
+ );
+ }
+ pendingFiles++;
+ const file = resolveFileInfo(response, name, filename, mimeType);
+ value.on('data', chunk => {
+ resolveFileChunk(response, file, chunk);
+ });
+ value.on('end', () => {
+ resolveFileComplete(response, name, file);
+ pendingFiles--;
+ if (pendingFiles === 0) {
+ // Release any queued fields
+ for (let i = 0; i < queuedFields.length; i += 2) {
+ resolveField(response, queuedFields[i], queuedFields[i + 1]);
+ }
+ queuedFields.length = 0;
+ }
+ });
+ });
+ busboyStream.on('finish', () => {
+ close(response);
+ });
+ busboyStream.on('error', err => {
+ reportGlobalError(response, err);
+ });
+ return getRoot(response);
+}
+
+function decodeReply(
+ body: string | FormData,
+ webpackMap: ServerManifest,
+): Thenable {
+ if (typeof body === 'string') {
+ const form = new FormData();
+ form.append('0', body);
+ body = form;
+ }
+ const response = createResponse(webpackMap, '', body);
+ close(response);
+ return getRoot(response);
+}
+
+export {
+ renderToPipeableStream,
+ decodeReplyFromBusboy,
+ decodeReply,
+ decodeAction,
+};
diff --git a/packages/react-server-dom-vite/src/ReactFlightServerConfigViteBundler.js b/packages/react-server-dom-vite/src/ReactFlightServerConfigViteBundler.js
new file mode 100644
index 0000000000000..e6752373382cb
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightServerConfigViteBundler.js
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+import type {ReactClientValue} from 'react-server/src/ReactFlightServer';
+
+export type ClientManifest = {
+ [id: string]: ClientReferenceMetadata,
+};
+
+export type ServerReference = T & {
+ $$typeof: symbol,
+ $$id: string,
+ $$bound: null | Array,
+};
+
+export type ServerReferenceId = string;
+
+// eslint-disable-next-line no-unused-vars
+export type ClientReference = {
+ $$typeof: symbol,
+ $$id: ClientReferenceMetadata,
+};
+
+export type ClientReferenceMetadata = [
+ string, // module path
+ string, // export name
+];
+
+export type ClientReferenceKey = [
+ string, // module path
+ string, // export name
+];
+
+const CLIENT_REFERENCE_TAG = Symbol.for('react.client.reference');
+const SERVER_REFERENCE_TAG = Symbol.for('react.server.reference');
+
+export function getClientReferenceKey(
+ reference: ClientReference,
+): ClientReferenceKey {
+ return reference.$$id;
+}
+
+export function isClientReference(reference: Object): boolean {
+ return reference.$$typeof === CLIENT_REFERENCE_TAG;
+}
+
+export function isServerReference(reference: Object): boolean {
+ return reference.$$typeof === SERVER_REFERENCE_TAG;
+}
+
+export function resolveClientReferenceMetadata(
+ config: ClientManifest,
+ clientReference: ClientReference,
+): ClientReferenceMetadata {
+ return clientReference.$$id;
+}
+
+export function getServerReferenceId(
+ config: ClientManifest,
+ serverReference: ServerReference,
+): ServerReferenceId {
+ return serverReference.$$id;
+}
+
+export function getServerReferenceBoundArguments(
+ config: ClientManifest,
+ serverReference: ServerReference,
+): null | Array {
+ return serverReference.$$bound;
+}
diff --git a/packages/react-server-dom-vite/src/ReactFlightVitePlugin.js b/packages/react-server-dom-vite/src/ReactFlightVitePlugin.js
new file mode 100644
index 0000000000000..39f4f30782492
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightVitePlugin.js
@@ -0,0 +1,308 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+import {parse} from 'acorn-loose';
+import {readFileSync} from 'fs';
+
+export default function reactServer({
+ hash = str => str,
+ onClientReference = () => {},
+ onServerReference = () => {},
+}: {
+ hash?: string => string,
+ onClientReference?: (id: string) => void,
+ onServerReference?: (id: string) => void,
+} = {}): any {
+ let isBuild;
+ return {
+ name: 'react-server',
+
+ enforce: 'pre',
+
+ configResolved(config) {
+ isBuild = config.command === 'build';
+ },
+
+ transform(code, id, options) {
+ if (!options?.ssr) return;
+
+ async function transformModuleIfNeeded(
+ moduleCode: string,
+ moduleId: string,
+ ) {
+ // Do a quick check for the exact string. If it doesn't exist, don't
+ // bother parsing.
+ if (
+ moduleCode.indexOf('use client') === -1 &&
+ moduleCode.indexOf('use server') === -1
+ ) {
+ return moduleCode;
+ }
+
+ const body = parse(moduleCode, {
+ ecmaVersion: '2024',
+ sourceType: 'module',
+ }).body;
+
+ let useClient = false;
+ let useServer = false;
+ for (let i = 0; i < body.length; i++) {
+ const node = body[i];
+ if (node.type !== 'ExpressionStatement' || !node.directive) {
+ break;
+ }
+ if (node.directive === 'use client') {
+ useClient = true;
+ }
+ if (node.directive === 'use server') {
+ useServer = true;
+ }
+ }
+
+ if (!useClient && !useServer) {
+ return moduleCode;
+ }
+
+ if (useClient && useServer) {
+ throw new Error(
+ 'Cannot have both "use client" and "use server" directives in the same file.',
+ );
+ }
+
+ if (useClient) {
+ return transformClientModule(body, moduleId);
+ }
+
+ return transformServerModule(moduleCode, body, moduleId);
+ }
+
+ async function transformClientModule(moduleAst: any, moduleId: string) {
+ const names: string[] = [];
+ onClientReference(moduleId);
+ await parseExportNamesInto(moduleAst, names, moduleId);
+
+ let newSrc = `import { createClientReference } from 'react-server-dom-vite/runtime';\n`;
+ for (let i = 0; i < names.length; i++) {
+ const name = names[i];
+ if (name === 'default') {
+ newSrc += 'export default createClientReference(';
+ } else {
+ newSrc += 'export const ' + name + ' = createClientReference(';
+ }
+ newSrc += `"${isBuild ? hash(moduleId) : moduleId}", "${name}");\n`;
+ }
+ return newSrc;
+ }
+
+ function transformServerModule(
+ moduleCode: string,
+ moduleAst: any,
+ moduleId: string,
+ ) {
+ onServerReference(moduleId);
+
+ // If the same local name is exported more than once, we only need one of the names.
+ const localNames = new Map();
+ const localTypes = new Map();
+
+ for (let i = 0; i < moduleAst.length; i++) {
+ const node = moduleAst[i];
+ switch (node.type) {
+ case 'ExportAllDeclaration':
+ // If export * is used, the other file needs to explicitly opt into "use server" too.
+ break;
+ case 'ExportDefaultDeclaration':
+ if (node.declaration.type === 'Identifier') {
+ localNames.set(node.declaration.name, 'default');
+ } else if (node.declaration.type === 'FunctionDeclaration') {
+ if (node.declaration.id) {
+ localNames.set(node.declaration.id.name, 'default');
+ localTypes.set(node.declaration.id.name, 'function');
+ } else {
+ // TODO: This needs to be rewritten inline because it doesn't have a local name.
+ }
+ }
+ continue;
+ case 'ExportNamedDeclaration':
+ if (node.declaration) {
+ if (node.declaration.type === 'VariableDeclaration') {
+ const declarations = node.declaration.declarations;
+ for (let j = 0; j < declarations.length; j++) {
+ addLocalExportedNames(localNames, declarations[j].id);
+ }
+ } else {
+ const name = node.declaration.id.name;
+ localNames.set(name, name);
+ if (node.declaration.type === 'FunctionDeclaration') {
+ localTypes.set(name, 'function');
+ }
+ }
+ }
+ if (node.specifiers) {
+ const specifiers = node.specifiers;
+ for (let j = 0; j < specifiers.length; j++) {
+ const specifier = specifiers[j];
+ localNames.set(specifier.local.name, specifier.exported.name);
+ }
+ }
+ continue;
+ }
+ }
+
+ let newSrc =
+ `import { createServerReference } from 'react-server-dom-vite/runtime';\n` +
+ moduleCode +
+ '\n\n;';
+ localNames.forEach(function (exported, local) {
+ if (localTypes.get(local) !== 'function') {
+ // We first check if the export is a function and if so annotate it.
+ newSrc += 'if (typeof ' + local + ' === "function") ';
+ }
+ newSrc += 'createServerReference(' + local + ',';
+ newSrc += `"${
+ isBuild ? hash(moduleId) : moduleId
+ }", "${exported}");\n`;
+ });
+ return newSrc;
+ }
+
+ async function parseExportNamesInto(
+ ast: any,
+ names: string[],
+ parentURL: string,
+ ) {
+ for (let i = 0; i < ast.length; i++) {
+ const node = ast[i];
+ switch (node.type) {
+ case 'ExportAllDeclaration':
+ if (node.exported) {
+ addExportNames(names, node.exported);
+ continue;
+ } else {
+ const {url} = await resolveClientImport(
+ node.source.value,
+ parentURL,
+ );
+
+ const clientImportCode = readFileSync(url, 'utf8');
+
+ const childBody = parse(clientImportCode ?? '', {
+ ecmaVersion: '2024',
+ sourceType: 'module',
+ }).body;
+
+ await parseExportNamesInto(childBody, names, url);
+ continue;
+ }
+ case 'ExportDefaultDeclaration':
+ names.push('default');
+ continue;
+ case 'ExportNamedDeclaration':
+ if (node.declaration) {
+ if (node.declaration.type === 'VariableDeclaration') {
+ const declarations = node.declaration.declarations;
+ for (let j = 0; j < declarations.length; j++) {
+ addExportNames(names, declarations[j].id);
+ }
+ } else {
+ addExportNames(names, node.declaration.id);
+ }
+ }
+ if (node.specifiers) {
+ const specifiers = node.specifiers;
+ for (let j = 0; j < specifiers.length; j++) {
+ addExportNames(names, specifiers[j].exported);
+ }
+ }
+ continue;
+ }
+ }
+ }
+
+ function addLocalExportedNames(names: Map, node: any) {
+ switch (node.type) {
+ case 'Identifier':
+ names.set(node.name, node.name);
+ return;
+ case 'ObjectPattern':
+ for (let i = 0; i < node.properties.length; i++)
+ addLocalExportedNames(names, node.properties[i]);
+ return;
+ case 'ArrayPattern':
+ for (let i = 0; i < node.elements.length; i++) {
+ const element = node.elements[i];
+ if (element) addLocalExportedNames(names, element);
+ }
+ return;
+ case 'Property':
+ addLocalExportedNames(names, node.value);
+ return;
+ case 'AssignmentPattern':
+ addLocalExportedNames(names, node.left);
+ return;
+ case 'RestElement':
+ addLocalExportedNames(names, node.argument);
+ return;
+ case 'ParenthesizedExpression':
+ addLocalExportedNames(names, node.expression);
+ return;
+ }
+ }
+
+ function addExportNames(names: string[], node: any) {
+ switch (node.type) {
+ case 'Identifier':
+ names.push(node.name);
+ return;
+ case 'ObjectPattern':
+ for (let i = 0; i < node.properties.length; i++)
+ addExportNames(names, node.properties[i]);
+ return;
+ case 'ArrayPattern':
+ for (let i = 0; i < node.elements.length; i++) {
+ const element = node.elements[i];
+ if (element) addExportNames(names, element);
+ }
+ return;
+ case 'Property':
+ addExportNames(names, node.value);
+ return;
+ case 'AssignmentPattern':
+ addExportNames(names, node.left);
+ return;
+ case 'RestElement':
+ addExportNames(names, node.argument);
+ return;
+ case 'ParenthesizedExpression':
+ addExportNames(names, node.expression);
+ return;
+ }
+ }
+
+ async function resolveClientImport(specifier: string, parentURL: string) {
+ const resolved = await self.resolve(specifier, parentURL, {
+ skipSelf: true,
+ });
+
+ if (!resolved) {
+ throw new Error(
+ 'Could not resolve ' + specifier + ' from ' + parentURL,
+ );
+ }
+
+ return {url: resolved.id};
+ }
+
+ // $FlowFixMe[object-this-reference]
+ const self = this;
+
+ return transformModuleIfNeeded(code, id);
+ },
+ };
+}
diff --git a/packages/react-server-dom-vite/src/ReactFlightViteRuntime.js b/packages/react-server-dom-vite/src/ReactFlightViteRuntime.js
new file mode 100644
index 0000000000000..bd78f55a80d2a
--- /dev/null
+++ b/packages/react-server-dom-vite/src/ReactFlightViteRuntime.js
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+const CLIENT_REFERENCE = Symbol.for('react.client.reference');
+const SERVER_REFERENCE = Symbol.for('react.server.reference');
+const PROMISE_PROTOTYPE = Promise.prototype;
+
+const deepProxyHandlers = {
+ get: function (
+ target: any,
+ name: string,
+ _receiver: Proxy | Proxy,
+ ) {
+ switch (name) {
+ // These names are read by the Flight runtime if you end up using the exports object.
+ case '$$typeof':
+ // These names are a little too common. We should probably have a way to
+ // have the Flight runtime extract the inner target instead.
+ return target.$$typeof;
+ case '$$id':
+ return target.$$id;
+ case '$$async':
+ return target.$$async;
+ case 'name':
+ return target.name;
+ case 'displayName':
+ return undefined;
+ // We need to special case this because createElement reads it if we pass this
+ // reference.
+ case 'defaultProps':
+ return undefined;
+ // Avoid this attempting to be serialized.
+ case 'toJSON':
+ return undefined;
+ case Symbol.toPrimitive.toString():
+ // $FlowFixMe[prop-missing]
+ return Object.prototype[Symbol.toPrimitive];
+ case 'Provider':
+ throw new Error(
+ `Cannot render a Client Context Provider on the Server. ` +
+ `Instead, you can export a Client Component wrapper ` +
+ `that itself renders a Client Context Provider.`,
+ );
+ default:
+ break;
+ }
+ // eslint-disable-next-line react-internal/safe-string-coercion
+ const expression = String(target.name) + '.' + String(name);
+ throw new Error(
+ `Cannot access ${expression} on the server. ` +
+ 'You cannot dot into a client module from a server component. ' +
+ 'You can only pass the imported name through.',
+ );
+ },
+ set: function () {
+ throw new Error('Cannot assign to a client module from a server module.');
+ },
+};
+
+const proxyHandlers: any = {
+ get: function (
+ target: Function,
+ name: string,
+ _receiver: Proxy,
+ ): $FlowFixMe {
+ switch (name) {
+ // These names are read by the Flight runtime if you end up using the exports object.
+ case '$$typeof':
+ return target.$$typeof;
+ case '$$id':
+ return target.$$id;
+ case '$$async':
+ return target.$$async;
+ case 'name':
+ return target.name;
+ // We need to special case this because createElement reads it if we pass this
+ // reference.
+ case 'defaultProps':
+ return undefined;
+ // Avoid this attempting to be serialized.
+ case 'toJSON':
+ return undefined;
+ case Symbol.toPrimitive.toString():
+ // $FlowFixMe[prop-missing]
+ return Object.prototype[Symbol.toPrimitive];
+ case '__esModule':
+ // Something is conditionally checking which export to use. We'll pretend to be
+ // an ESM compat module but then we'll check again on the client.
+ const moduleId = target.$$id;
+ target.default = Object.defineProperties(
+ (function () {
+ throw new Error(
+ `Attempted to call the default export of ${moduleId} from the server ` +
+ `but it's on the client. It's not possible to invoke a client function from ` +
+ `the server, it can only be rendered as a Component or passed to props of a ` +
+ `Client Component.`,
+ );
+ }: any),
+ {
+ $$typeof: {value: CLIENT_REFERENCE},
+ // This a placeholder value that tells the client to conditionally use the
+ // whole object or just the default export.
+ $$id: {value: target.$$id + '#'},
+ $$async: {value: target.$$async},
+ },
+ );
+ return true;
+ case 'then':
+ if (target.then) {
+ // Use a cached value
+ return target.then;
+ }
+ if (!target.$$async) {
+ // If this module is expected to return a Promise (such as an AsyncModule) then
+ // we should resolve that with a client reference that unwraps the Promise on
+ // the client.
+
+ const clientReference = Object.defineProperties(({}: any), {
+ $$typeof: {value: CLIENT_REFERENCE},
+ $$id: {value: target.$$id},
+ $$async: {value: true},
+ });
+ const proxy = new Proxy(clientReference, proxyHandlers);
+
+ // Treat this as a resolved Promise for React's use()
+ target.status = 'fulfilled';
+ target.value = proxy;
+
+ const then = (target.then = Object.defineProperties(
+ (function then(resolve, _reject) {
+ // Expose to React.
+ return Promise.resolve(
+ // $FlowFixMe[incompatible-call] found when upgrading Flow
+ resolve(proxy),
+ );
+ }: any),
+ // If this is not used as a Promise but is treated as a reference to a `.then`
+ // export then we should treat it as a reference to that name.
+ {
+ $$typeof: {value: CLIENT_REFERENCE},
+ $$id: {value: target.$$id},
+ $$async: {value: false},
+ },
+ ));
+ return then;
+ } else {
+ // Since typeof .then === 'function' is a feature test we'd continue recursing
+ // indefinitely if we return a function. Instead, we return an object reference
+ // if we check further.
+ return undefined;
+ }
+ default:
+ break;
+ }
+ let cachedReference = target[name];
+ if (!cachedReference) {
+ const reference = Object.defineProperties(
+ (function () {
+ throw new Error(
+ // eslint-disable-next-line react-internal/safe-string-coercion
+ `Attempted to call ${String(name)}() from the server but ${String(
+ name,
+ )} is on the client. ` +
+ `It's not possible to invoke a client function from the server, it can ` +
+ `only be rendered as a Component or passed to props of a Client Component.`,
+ );
+ }: any),
+ {
+ $$typeof: {value: CLIENT_REFERENCE},
+ $$id: {value: target.$$id + '#' + name},
+ $$async: {value: target.$$async},
+ },
+ );
+ cachedReference = target[name] = new Proxy(reference, deepProxyHandlers);
+ }
+ return cachedReference;
+ },
+ getPrototypeOf(_target: Function): Object {
+ // Pretend to be a Promise in case anyone asks.
+ return PROMISE_PROTOTYPE;
+ },
+ set: function () {
+ throw new Error('Cannot assign to a client module from a server module.');
+ },
+};
+
+export function createClientReference(
+ moduleId: string,
+ name: string,
+): Proxy {
+ const clientReference = Object.defineProperties(({}: any), {
+ $$typeof: {value: CLIENT_REFERENCE},
+ // Represents the whole Module object instead of a particular import.
+ $$id: {value: `${moduleId}#${name}`},
+ $$async: {value: false},
+ });
+ return new Proxy(clientReference, proxyHandlers);
+}
+
+export function createServerReference(
+ fn: Function,
+ moduleId: string,
+ name: string,
+): Function {
+ const serverReference = Object.defineProperties(fn, {
+ $$typeof: {value: SERVER_REFERENCE},
+ // Represents the whole Module object instead of a particular import.
+ $$id: {value: `${moduleId}#${name}`},
+ $$bound: {value: null},
+ });
+ return serverReference;
+}
diff --git a/packages/react-server/src/forks/ReactFizzConfig.dom-node-vite.js b/packages/react-server/src/forks/ReactFizzConfig.dom-node-vite.js
new file mode 100644
index 0000000000000..71c6ab5a5586c
--- /dev/null
+++ b/packages/react-server/src/forks/ReactFizzConfig.dom-node-vite.js
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+import {AsyncLocalStorage} from 'async_hooks';
+
+import type {Request} from 'react-server/src/ReactFizzServer';
+
+export * from 'react-dom-bindings/src/server/ReactFizzConfigDOM';
+
+export const supportsRequestStorage = true;
+export const requestStorage: AsyncLocalStorage =
+ new AsyncLocalStorage();
diff --git a/packages/react-server/src/forks/ReactFlightServerConfig.dom-node-vite.js b/packages/react-server/src/forks/ReactFlightServerConfig.dom-node-vite.js
new file mode 100644
index 0000000000000..d9d1ae38cbbf6
--- /dev/null
+++ b/packages/react-server/src/forks/ReactFlightServerConfig.dom-node-vite.js
@@ -0,0 +1,18 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+import {AsyncLocalStorage} from 'async_hooks';
+
+import type {Request} from 'react-server/src/ReactFlightServer';
+
+export * from 'react-server-dom-vite/src/ReactFlightServerConfigViteBundler';
+export * from 'react-dom-bindings/src/server/ReactFlightServerConfigDOM';
+
+export const supportsRequestStorage = true;
+export const requestStorage: AsyncLocalStorage =
+ new AsyncLocalStorage();
diff --git a/packages/react-server/src/forks/ReactServerStreamConfig.dom-node-vite.js b/packages/react-server/src/forks/ReactServerStreamConfig.dom-node-vite.js
new file mode 100644
index 0000000000000..1a3871aef2e8b
--- /dev/null
+++ b/packages/react-server/src/forks/ReactServerStreamConfig.dom-node-vite.js
@@ -0,0 +1,10 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @flow
+ */
+
+export * from '../ReactServerStreamConfigNode';
diff --git a/scripts/flow/environment.js b/scripts/flow/environment.js
index 18ba25264138e..f98d916cde0cf 100644
--- a/scripts/flow/environment.js
+++ b/scripts/flow/environment.js
@@ -75,6 +75,14 @@ declare module 'EventListener' {
declare function __webpack_chunk_load__(id: string): Promise;
declare function __webpack_require__(id: string): any;
+declare function __vite_preload__(metadata: {
+ specifier: string,
+ name: string,
+}): any;
+declare function __vite_require__(metadata: {
+ specifier: string,
+ name: string,
+}): any;
declare module 'fs/promises' {
declare var access: (path: string, mode?: number) => Promise;
diff --git a/scripts/rollup/bundles.js b/scripts/rollup/bundles.js
index 58ae58d9bd44b..11e8676e8bde8 100644
--- a/scripts/rollup/bundles.js
+++ b/scripts/rollup/bundles.js
@@ -489,6 +489,56 @@ const bundles = [
externals: ['acorn'],
},
+ /******* React Server DOM Vite Server *******/
+ {
+ bundleTypes: [NODE_DEV, NODE_PROD],
+ moduleType: RENDERER,
+ entry: 'react-server-dom-vite/server.node',
+ minifyWithProdErrorCodes: false,
+ wrapWithModuleBoundaries: false,
+ externals: ['react', 'util', 'async_hooks', 'react-dom'],
+ },
+
+ /******* React Server DOM Vite Client *******/
+ {
+ bundleTypes: [NODE_DEV, NODE_PROD, ESM_DEV, ESM_PROD],
+ moduleType: RENDERER,
+ entry: 'react-server-dom-vite/client.browser',
+ minifyWithProdErrorCodes: false,
+ wrapWithModuleBoundaries: false,
+ externals: ['react', 'react-dom'],
+ },
+ {
+ bundleTypes: [NODE_DEV, NODE_PROD],
+ moduleType: RENDERER,
+ entry: 'react-server-dom-vite/client.node',
+ minifyWithProdErrorCodes: false,
+ wrapWithModuleBoundaries: false,
+ externals: ['react', 'react-dom', 'util'],
+ },
+
+ /******* React Server DOM Vite Plugin *******/
+ {
+ bundleTypes: [NODE_ES2015],
+ moduleType: RENDERER_UTILS,
+ entry: 'react-server-dom-vite/plugin',
+ global: 'ReactServerVitePlugin',
+ minifyWithProdErrorCodes: false,
+ wrapWithModuleBoundaries: false,
+ externals: ['fs', 'path', 'url', 'vite'],
+ },
+
+ /******* React Server DOM Vite Runtime *******/
+ {
+ bundleTypes: [NODE_DEV, NODE_PROD],
+ moduleType: RENDERER_UTILS,
+ entry: 'react-server-dom-vite/runtime',
+ global: 'ReactServerViteRuntime',
+ minifyWithProdErrorCodes: false,
+ wrapWithModuleBoundaries: false,
+ externals: [],
+ },
+
/******* React Suspense Test Utils *******/
{
bundleTypes: [NODE_ES2015],
diff --git a/scripts/rollup/validate/eslintrc.cjs.js b/scripts/rollup/validate/eslintrc.cjs.js
index e8c2943b93349..36c82d99d0771 100644
--- a/scripts/rollup/validate/eslintrc.cjs.js
+++ b/scripts/rollup/validate/eslintrc.cjs.js
@@ -46,6 +46,10 @@ module.exports = {
__webpack_chunk_load__: 'readonly',
__webpack_require__: 'readonly',
+ // Flight Vite
+ __vite_preload__: 'readonly',
+ __vite_require__: 'readonly',
+
// jest
expect: 'readonly',
jest: 'readonly',
diff --git a/scripts/rollup/validate/eslintrc.cjs2015.js b/scripts/rollup/validate/eslintrc.cjs2015.js
index e5b79f84c3e09..fe4b5c942fbe6 100644
--- a/scripts/rollup/validate/eslintrc.cjs2015.js
+++ b/scripts/rollup/validate/eslintrc.cjs2015.js
@@ -46,6 +46,10 @@ module.exports = {
__webpack_chunk_load__: 'readonly',
__webpack_require__: 'readonly',
+ // Flight Vite
+ __vite_preload__: 'readonly',
+ __vite_require__: 'readonly',
+
// jest
expect: 'readonly',
jest: 'readonly',
diff --git a/scripts/rollup/validate/eslintrc.esm.js b/scripts/rollup/validate/eslintrc.esm.js
index a9bf9ab5a0bcc..d1efe6c12aab0 100644
--- a/scripts/rollup/validate/eslintrc.esm.js
+++ b/scripts/rollup/validate/eslintrc.esm.js
@@ -46,6 +46,10 @@ module.exports = {
__webpack_chunk_load__: 'readonly',
__webpack_require__: 'readonly',
+ // Flight Vite
+ __vite_preload__: 'readonly',
+ __vite_require__: 'readonly',
+
// jest
expect: 'readonly',
jest: 'readonly',
diff --git a/scripts/rollup/validate/eslintrc.umd.js b/scripts/rollup/validate/eslintrc.umd.js
index 17eae00040551..5cdf826adf88b 100644
--- a/scripts/rollup/validate/eslintrc.umd.js
+++ b/scripts/rollup/validate/eslintrc.umd.js
@@ -51,6 +51,10 @@ module.exports = {
__webpack_chunk_load__: 'readonly',
__webpack_require__: 'readonly',
+ // Flight Vite
+ __vite_preload__: 'readonly',
+ __vite_require__: 'readonly',
+
// jest
jest: 'readonly',
diff --git a/scripts/shared/inlinedHostConfigs.js b/scripts/shared/inlinedHostConfigs.js
index 2cb934d862e79..bd4ebd2040630 100644
--- a/scripts/shared/inlinedHostConfigs.js
+++ b/scripts/shared/inlinedHostConfigs.js
@@ -188,6 +188,39 @@ module.exports = [
isFlowTyped: true,
isServerSupported: true,
},
+ {
+ shortName: 'dom-node-vite',
+ entryPoints: [
+ 'react-server-dom-vite/client.browser',
+ 'react-server-dom-vite/server.node',
+ 'react-server-dom-vite/client.node',
+ ],
+ paths: [
+ 'react-dom',
+ 'react-dom-bindings',
+ 'react-dom/client',
+ 'react-dom/server',
+ 'react-dom/server.node',
+ 'react-dom/static',
+ 'react-dom/static.node',
+ 'react-dom/src/server/ReactDOMFizzServerNode.js', // react-dom/server.node
+ 'react-dom/src/server/ReactDOMFizzStaticNode.js',
+ 'react-server-dom-vite',
+ 'react-server-dom-vite/client.browser',
+ 'react-server-dom-vite/client.node',
+ 'react-server-dom-vite/server',
+ 'react-server-dom-vite/server.node',
+ 'react-server-dom-vite/src/ReactFlightDOMServerNode.js', // react-server-dom-webpack/server.node
+ 'react-devtools',
+ 'react-devtools-core',
+ 'react-devtools-shell',
+ 'react-devtools-shared',
+ 'react-interactions',
+ 'shared/ReactDOMSharedInternals',
+ ],
+ isFlowTyped: true,
+ isServerSupported: true,
+ },
{
shortName: 'dom-legacy',
entryPoints: [