diff --git a/.changeset/chilled-jars-pump.md b/.changeset/chilled-jars-pump.md new file mode 100644 index 0000000000..379c54982c --- /dev/null +++ b/.changeset/chilled-jars-pump.md @@ -0,0 +1,10 @@ +--- +'@ice/webpack-config': minor +'@ice/shared-config': minor +'@ice/runtime': minor +'@ice/app': minor +'@ice/bundles': patch +'@ice/route-manifest': patch +--- + +feat: support react server component diff --git a/examples/with-rsc/ice.config.mts b/examples/with-rsc/ice.config.mts new file mode 100644 index 0000000000..845f8921f4 --- /dev/null +++ b/examples/with-rsc/ice.config.mts @@ -0,0 +1,11 @@ +import { defineConfig } from '@ice/app'; + +export default defineConfig({ + ssr: true, + // TODO: support esm format and resolve runtime dependencies to compiled dependencies. + server: { + bundle: true, + format: 'cjs', + }, + rsc: true, +}); diff --git a/examples/with-rsc/package.json b/examples/with-rsc/package.json new file mode 100644 index 0000000000..1f1edeef31 --- /dev/null +++ b/examples/with-rsc/package.json @@ -0,0 +1,22 @@ +{ + "name": "@examples/with-server-component", + "private": true, + "version": "1.0.0", + "scripts": { + "start": "ice start", + "build": "ice build" + }, + "description": "ICE example with server-component", + "author": "ICE Team", + "license": "MIT", + "dependencies": { + "@ice/app": "workspace:*", + "@ice/runtime": "workspace:*", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.17", + "@types/react-dom": "^18.0.6" + } +} diff --git a/examples/with-rsc/src/app.tsx b/examples/with-rsc/src/app.tsx new file mode 100644 index 0000000000..1ceb78f306 --- /dev/null +++ b/examples/with-rsc/src/app.tsx @@ -0,0 +1,7 @@ +import { defineAppConfig } from 'ice'; + +export default defineAppConfig({ + app: { + rootId: 'app', + }, +}); diff --git a/examples/with-rsc/src/components/Comments.tsx b/examples/with-rsc/src/components/Comments.tsx new file mode 100644 index 0000000000..616b32df3f --- /dev/null +++ b/examples/with-rsc/src/components/Comments.tsx @@ -0,0 +1,33 @@ +async function Comments() { + const comments = await getData(); + + console.log('Render: Comments'); + + return ( +
+ {comments.map((comment, i) => ( +

+ {comment} +

+ ))} +
+ ); +} + +export default Comments; + +const fakeData = [ + "Wait, it doesn't wait for React to load?", + 'How does this even work?', + 'I like marshmallows', +]; + +async function getData() { + console.log('load comments'); + + await new Promise((resolve) => { + setTimeout(() => resolve(null), 3000); + }); + + return fakeData; +} diff --git a/examples/with-rsc/src/components/Counter.client.tsx b/examples/with-rsc/src/components/Counter.client.tsx new file mode 100644 index 0000000000..a9ed6568d3 --- /dev/null +++ b/examples/with-rsc/src/components/Counter.client.tsx @@ -0,0 +1,21 @@ +'use client'; +import { useState } from 'react'; +import { useAppContext } from 'ice'; +import styles from './counter.module.css'; + +export default function Counter() { + const [count, setCount] = useState(0); + + function updateCount() { + setCount(count + 1); + } + + const appContext = useAppContext(); + console.log(appContext); + + return ( + + ); +} \ No newline at end of file diff --git a/examples/with-rsc/src/components/EditButton.client.tsx b/examples/with-rsc/src/components/EditButton.client.tsx new file mode 100644 index 0000000000..4a9fd16add --- /dev/null +++ b/examples/with-rsc/src/components/EditButton.client.tsx @@ -0,0 +1,24 @@ +'use client'; +import { useTransition } from 'react'; + +export default function EditButton({ noteId, children }) { + const [isPending, startTransition] = useTransition(); + const isDraft = noteId == null; + return ( + + ); +} diff --git a/examples/with-rsc/src/components/Footer.tsx b/examples/with-rsc/src/components/Footer.tsx new file mode 100644 index 0000000000..27ceace7ba --- /dev/null +++ b/examples/with-rsc/src/components/Footer.tsx @@ -0,0 +1,29 @@ +import { useSuspenseData, withSuspense } from 'ice'; + +function Footer() { + const data = useSuspenseData(getData); + + console.log('Render: Footer'); + + return ( +
+

{data.title}

+
+ ); +} + +export default withSuspense(Footer); + +const fakeData = { + title: 'Thanks for reading!', +}; + +async function getData() { + console.log('load footer'); + + await new Promise((resolve) => { + setTimeout(() => resolve(null), 2000); + }); + + return fakeData; +} \ No newline at end of file diff --git a/examples/with-rsc/src/components/counter.module.css b/examples/with-rsc/src/components/counter.module.css new file mode 100644 index 0000000000..75eea836a4 --- /dev/null +++ b/examples/with-rsc/src/components/counter.module.css @@ -0,0 +1,14 @@ +.link { + font-size: 1.2rem; + color: var(--primary); +} + +.button { + outline: none; + border: none; + border-radius: 8px; + padding: 10px 35px; + background: var(--primary); + box-shadow: 0 5px 10px 0 #ddd; + font-size: calc(10px + 2vmin); +} diff --git a/examples/with-rsc/src/document.tsx b/examples/with-rsc/src/document.tsx new file mode 100644 index 0000000000..195d21a7f1 --- /dev/null +++ b/examples/with-rsc/src/document.tsx @@ -0,0 +1,22 @@ +import { Meta, Title, Links, Main, Scripts } from 'ice'; + +function Document() { + return ( + + + + + + + + <Links /> + </head> + <body> + <Main /> + <Scripts async /> + </body> + </html> + ); +} + +export default Document; diff --git a/examples/with-rsc/src/pages/about.module.css b/examples/with-rsc/src/pages/about.module.css new file mode 100644 index 0000000000..18968098e0 --- /dev/null +++ b/examples/with-rsc/src/pages/about.module.css @@ -0,0 +1,30 @@ +.about { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; +} + +.about > header { + display: flex; + flex-direction: column; + align-items: center; +} + +.about > header > img { + width: 120px; +} + +.about > header > p { + margin: 20px 0; + text-align: center; + font-size: 2.6rem; +} + +.about > main { + display: flex; + flex-direction: column; + margin: 20px 0 10px; + font-size: 0.9rem; +} \ No newline at end of file diff --git a/examples/with-rsc/src/pages/about.tsx b/examples/with-rsc/src/pages/about.tsx new file mode 100644 index 0000000000..76f33efa99 --- /dev/null +++ b/examples/with-rsc/src/pages/about.tsx @@ -0,0 +1,22 @@ +import { useAppContext } from 'ice'; +import styles from './about.module.css'; +import Counter from '@/components/Counter.client'; + +if (!global.requestCount) { + global.requestCount = 0; +} + +export default function Home() { + console.log('Render: Index'); + + const appContext = useAppContext(); + console.log(appContext); + + return ( + <div className={styles.about}> + <h2>About Page</h2> + <div>server request count: { global.requestCount++ }</div> + <Counter /> + </div> + ); +} diff --git a/examples/with-rsc/src/pages/index.module.css b/examples/with-rsc/src/pages/index.module.css new file mode 100644 index 0000000000..67e8c355ea --- /dev/null +++ b/examples/with-rsc/src/pages/index.module.css @@ -0,0 +1,30 @@ +.app { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; +} + +.app > header { + display: flex; + flex-direction: column; + align-items: center; +} + +.app > header > img { + width: 120px; +} + +.app > header > p { + margin: 20px 0; + text-align: center; + font-size: 2.6rem; +} + +.app > main { + display: flex; + flex-direction: column; + margin: 20px 0 10px; + font-size: 0.9rem; +} \ No newline at end of file diff --git a/examples/with-rsc/src/pages/index.tsx b/examples/with-rsc/src/pages/index.tsx new file mode 100644 index 0000000000..2f951e4ba0 --- /dev/null +++ b/examples/with-rsc/src/pages/index.tsx @@ -0,0 +1,27 @@ +import { Suspense } from 'react'; +import { useAppContext } from 'ice'; +import styles from './index.module.css'; +import EditButton from '@/components/EditButton.client'; +import Counter from '@/components/Counter.client'; +import Comments from '@/components/Comments'; + +export default function Home() { + console.log('Render: Index'); + + const appContext = useAppContext(); + console.log(appContext); + + return ( + <div className={styles.app}> + <h2>Home Page</h2> + <Counter /> + <Suspense fallback={<>loading</>}> + {/* @ts-ignore */} + <Comments /> + </Suspense> + <EditButton noteId="editButton"> + hello world + </EditButton> + </div> + ); +} diff --git a/examples/with-rsc/src/pages/layout.tsx b/examples/with-rsc/src/pages/layout.tsx new file mode 100644 index 0000000000..71a8cec4e2 --- /dev/null +++ b/examples/with-rsc/src/pages/layout.tsx @@ -0,0 +1,10 @@ +export default function Layout(props) { + console.log('Render: Layout'); + + return ( + <div> + <h1>Suspense App</h1> + {props.children} + </div> + ); +} \ No newline at end of file diff --git a/examples/with-rsc/src/typings.d.ts b/examples/with-rsc/src/typings.d.ts new file mode 100644 index 0000000000..1a48695046 --- /dev/null +++ b/examples/with-rsc/src/typings.d.ts @@ -0,0 +1 @@ +/// <reference types="@ice/app/types" /> \ No newline at end of file diff --git a/examples/with-rsc/tsconfig.json b/examples/with-rsc/tsconfig.json new file mode 100644 index 0000000000..e41a1f451f --- /dev/null +++ b/examples/with-rsc/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compileOnSave": false, + "buildOnSave": false, + "compilerOptions": { + "baseUrl": ".", + "outDir": "build", + "module": "esnext", + "target": "esnext", + "jsx": "react-jsx", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "lib": ["es6", "dom"], + "sourceMap": true, + "allowJs": true, + "rootDir": "./", + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": false, + "importHelpers": true, + "strictNullChecks": true, + "suppressImplicitAnyIndexErrors": true, + "noUnusedLocals": true, + "skipLibCheck": true, + "paths": { + "@/*": ["./src/*"], + "ice": [".ice"] + } + }, + "include": ["src", ".ice", "ice.config.*"], + "exclude": ["build", "public"] +} \ No newline at end of file diff --git a/packages/bundles/package.json b/packages/bundles/package.json index 014a665484..793bded5fa 100644 --- a/packages/bundles/package.json +++ b/packages/bundles/package.json @@ -15,10 +15,11 @@ "main": "./esm/index.js", "type": "module", "dependencies": { - "@swc/core": "1.3.80", + "@swc/core": "1.3.85", "@ice/swc-plugin-remove-export": "0.2.0", "@ice/swc-plugin-keep-export": "0.2.0", "@ice/swc-plugin-node-transform": "0.2.0", + "@ice/swc-plugin-react-server-component": "0.1.1", "ansi-html-community": "^0.0.8", "html-entities": "^2.3.2", "core-js": "3.32.0", @@ -33,6 +34,7 @@ "react-refresh": "0.14.0", "core-js-pure": "^3.8.1", "error-stack-parser": "^2.0.6", + "acorn-loose": "^8.3.0", "@ice/css-modules-hash": "0.0.6", "browserslist": "^4.21.3", "compare-versions": "6.0.0-rc.1", @@ -111,7 +113,11 @@ "loader-utils": "^2.0.0", "source-map": "0.8.0-beta.0", "find-up": "5.0.0", - "common-path-prefix": "3.0.0" + "common-path-prefix": "3.0.0", + "react-builtin": "npm:react@18.3.0-canary-dd480ef92-20230822", + "react-dom-builtin": "npm:react-dom@18.3.0-canary-dd480ef92-20230822", + "react-server-dom-webpack": "18.3.0-canary-dd480ef92-20230822", + "scheduler-builtin": "npm:scheduler@0.24.0-canary-dd480ef92-20230822" }, "publishConfig": { "access": "public", diff --git a/packages/bundles/scripts/tasks.ts b/packages/bundles/scripts/tasks.ts index 5555d665db..bb4b567ddb 100644 --- a/packages/bundles/scripts/tasks.ts +++ b/packages/bundles/scripts/tasks.ts @@ -22,6 +22,53 @@ export const taskExternals = { esbuild: 'esbuild', }; +// Override the `react`, `react-dom` and `scheduler`'s package names to avoid +// "The name `react` was looked up in the Haste module map" warnings. +function overridePackageName(source: string, channel: string) { + const json = JSON.parse(source); + json.name = `${json.name}-${channel}`; + return JSON.stringify( + { + name: json.name, + main: json.main, + exports: json.exports, + dependencies: json.dependencies, + peerDependencies: json.peerDependencies, + browser: json.browser, + }, + null, + 2, + ); +} + +interface CopyModulesOptions { + loaders?: { test: RegExp; handler: (code: string, id: string) => string }[]; + channel?: string; + ignore?: string[]; +} + +function copyModules(rules: string[], packageName: string, option?: CopyModulesOptions) { + const { channel, ignore, loaders } = option || {}; + const pkgDir = path.join(__dirname, `../node_modules/${packageName}${channel ? `-${channel}` : ''}`); + const targetDir = path.join(__dirname, `../compiled/${packageName}`); + const filePaths = globbySync(rules, { cwd: pkgDir, ignore: ignore ?? ['node_modules'] }); + filePaths.forEach((filePath) => { + fs.ensureDirSync(path.join(targetDir, path.dirname(filePath))); + const sourcePath = path.join(pkgDir, filePath); + const targetPath = path.join(targetDir, filePath); + // Only deal with js files. + if (loaders) { + const loader = loaders.find(({ test }) => test.test(filePath)); + if (loader) { + const fileContent = fs.readFileSync(sourcePath, 'utf8'); + fs.writeFileSync(targetPath, loader.handler(fileContent, filePath)); + return; + } + } + fs.copyFileSync(sourcePath, targetPath); + }); +} + const commonDeps = ['terser', 'tapable', 'cssnano', 'terser-webpack-plugin', 'webpack', 'schema-utils', 'lodash', 'postcss-preset-env', 'loader-utils', 'find-up', 'common-path-prefix', 'magic-string']; @@ -220,6 +267,95 @@ const tasks = [ fs.copySync(path.join(__dirname, '../webpack/packages'), targetPath); }, }, + { + pkgName: 'react', + skipCompile: true, + declaration: false, + patch: () => { + copyModules( + ['*.{json,js}', 'cjs/**/*.js', 'LICENSE'], + 'react', + { + channel: 'builtin', + loaders: [ + { test: /package.json$/, handler: (source) => overridePackageName(source, 'builtin') }, + { test: /\.js$/, handler: (source) => replaceDeps(source, ['scheduler']) }, + ], + }, + ); + }, + }, + { + pkgName: 'react-dom', + skipCompile: true, + declaration: false, + patch: () => { + copyModules( + ['*.{json,js}', 'cjs/**/*.js', 'LICENSE'], + 'react-dom', + { + channel: 'builtin', + loaders: [ + { test: /package.json$/, handler: (source) => overridePackageName(source, 'builtin') }, + { test: /\.js$/, handler: (source) => replaceDeps(source, ['scheduler', 'react']) }, + ], + // Ignore unused files. + ignore: [ + 'node_modules', + 'static.js', + 'static.node.js', + 'static.browser.js', + 'unstable_testing.js', + 'test-utils.js', + 'server.bun.js', + 'cjs/react-dom-server.bun.development.js', + 'cjs/react-dom-server.bun.production.min.js', + 'cjs/react-dom-test-utils.development.js', + 'cjs/react-dom-test-utils.production.min.js', + 'unstable_server-external-runtime.js', + ], + }, + ); + }, + }, + { + pkgName: 'react-server-dom-webpack', + skipCompile: true, + patch: () => { + copyModules( + ['*.{json,js}', 'cjs/**/*.js', 'LICENSE'], + 'react-server-dom-webpack', + { + loaders: [ + { test: /package.json$/, +handler: (source) => { + const json = JSON.parse(source); + // Compatible with both esm and cjs. + json.exports['./plugin.js'] = './plugin.js'; + return JSON.stringify(json, null, 2); + } }, + ], + }, + ); + }, + }, + { + pkgName: 'scheduler', + skipCompile: true, + declaration: false, + patch: () => { + copyModules( + ['*.{json,js}', 'cjs/**/*.js', 'LICENSE'], + 'scheduler', + { + channel: 'builtin', + loaders: [ + { test: /package.json$/, handler: (source) => overridePackageName(source, 'builtin') }, + ], + }, + ); + }, + }, { pkgName: '@rspack/core', skipCompile: true, diff --git a/packages/bundles/src/index.ts b/packages/bundles/src/index.ts index 4cc767dd61..d6ac73e769 100644 --- a/packages/bundles/src/index.ts +++ b/packages/bundles/src/index.ts @@ -7,11 +7,14 @@ import swc from '@swc/core'; import esbuild from 'esbuild'; import * as caniuseLite from 'caniuse-lite'; import { getCssModulesLocalIdent } from '@ice/css-modules-hash'; +import asyncLib from 'neo-async'; +import * as acorn from 'acorn-loose'; const require = createRequire(import.meta.url); const swcPluginRemoveExport = require.resolve('@ice/swc-plugin-remove-export'); const swcPluginKeepExport = require.resolve('@ice/swc-plugin-keep-export'); const swcPluginNodeTransform = require.resolve('@ice/swc-plugin-node-transform'); +const swcPluginReactServerComponent = require.resolve('@ice/swc-plugin-react-server-component'); const coreJsPath = dirname(require.resolve('core-js/package.json')); export { postcss, @@ -22,12 +25,15 @@ export { swcPluginRemoveExport, swcPluginKeepExport, swcPluginNodeTransform, + swcPluginReactServerComponent, coreJsPath, esbuild, caniuseLite, getCssModulesLocalIdent, + asyncLib, + acorn, }; export type { ProcessOptions } from 'postcss'; diff --git a/packages/bundles/webpack/bundle.js b/packages/bundles/webpack/bundle.js index 4b9bfbb841..b65e9f5542 100644 --- a/packages/bundles/webpack/bundle.js +++ b/packages/bundles/webpack/bundle.js @@ -13,6 +13,8 @@ module.exports = { StringXor: require('webpack/lib/util/StringXor'), NormalModule: require('webpack/lib/NormalModule'), EntryDependency: require('webpack/lib/dependencies/EntryDependency'), + ModuleDependency: require('webpack/lib/dependencies/ModuleDependency'), + NullDependency: require('webpack/lib/dependencies/NullDependency'), sources: require('webpack').sources, webpack: require('webpack'), package: { diff --git a/packages/bundles/webpack/packages/ModuleDependency.js b/packages/bundles/webpack/packages/ModuleDependency.js new file mode 100644 index 0000000000..8b970cbad1 --- /dev/null +++ b/packages/bundles/webpack/packages/ModuleDependency.js @@ -0,0 +1 @@ +module.exports = require('./bundle').ModuleDependency; diff --git a/packages/bundles/webpack/packages/NullDependency.js b/packages/bundles/webpack/packages/NullDependency.js new file mode 100644 index 0000000000..910cb4ea23 --- /dev/null +++ b/packages/bundles/webpack/packages/NullDependency.js @@ -0,0 +1 @@ +module.exports = require('./bundle').NullDependency; diff --git a/packages/ice/src/bundler/webpack/getWebpackConfig.ts b/packages/ice/src/bundler/webpack/getWebpackConfig.ts index d45402f19d..b256536fe4 100644 --- a/packages/ice/src/bundler/webpack/getWebpackConfig.ts +++ b/packages/ice/src/bundler/webpack/getWebpackConfig.ts @@ -1,7 +1,11 @@ +import * as path from 'path'; +import { fileURLToPath } from 'url'; import webpack from '@ice/bundles/compiled/webpack/index.js'; import lodash from '@ice/bundles/compiled/lodash/index.js'; import { getWebpackConfig as getDefaultWebpackConfig } from '@ice/webpack-config'; import type { Configuration } from 'webpack'; +import { FlightManifestPlugin } from '../../webpack/FlightManifestPlugin.js'; +import { FlightClientEntryPlugin } from '../../webpack/FlightClientEntryPlugin.js'; import { getExpandedEnvs } from '../../utils/runtimeEnv.js'; import { getRouteExportConfig } from '../../service/config.js'; import { getFileHash } from '../../utils/hash.js'; @@ -13,6 +17,8 @@ import type ServerRunnerPlugin from '../../webpack/ServerRunnerPlugin.js'; import type ServerCompilerPlugin from '../../webpack/ServerCompilerPlugin.js'; import type { BundlerOptions, Context } from '../types.js'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + const { debounce } = lodash; type GetWebpackConfig = ( @@ -116,6 +122,19 @@ const getWebpackConfig: GetWebpackConfig = async (context, options) => { } // Add spinner for webpack task. webpackConfig.plugins.push(getSpinnerPlugin(spinner)); + if (userConfig.rsc) { + webpackConfig.resolveLoader = { + alias: { + 'flight-client-entry-loader': path.join(__dirname, '../../webpack/FlightClientEntryLoader.js'), + }, + }; + + webpackConfig.plugins.push(new FlightClientEntryPlugin({ + rootDir, + getRoutesFile, + })); + webpackConfig.plugins.push(new FlightManifestPlugin()); + } return webpackConfig; }); diff --git a/packages/ice/src/config.ts b/packages/ice/src/config.ts index ee9ec028e5..6a1d6ff467 100644 --- a/packages/ice/src/config.ts +++ b/packages/ice/src/config.ts @@ -126,6 +126,11 @@ const userConfig = [ validation: 'boolean', defaultValue: true, }, + { + name: 'rsc', + validation: 'boolean', + defaultValue: false, + }, { name: 'ssr', validation: 'boolean', diff --git a/packages/ice/src/createService.ts b/packages/ice/src/createService.ts index 932e0f3276..50f727f839 100644 --- a/packages/ice/src/createService.ts +++ b/packages/ice/src/createService.ts @@ -281,6 +281,7 @@ async function createService({ rootDir, command, commandArgs }: CreateServiceOpt dataLoader: userConfig.dataLoader, routeImports, routeDefinition, + rsc: userConfig.rsc, }); dataCache.set('routes', JSON.stringify(routesInfo)); dataCache.set('hasExportAppData', hasExportAppData ? 'true' : ''); diff --git a/packages/ice/src/esbuild/assets.ts b/packages/ice/src/esbuild/assets.ts index ea594ffd4e..1846c83464 100644 --- a/packages/ice/src/esbuild/assets.ts +++ b/packages/ice/src/esbuild/assets.ts @@ -40,6 +40,7 @@ const ASSETS_RE = new RegExp(`\\.(${ASSET_TYPES.join('|')})(\\?.*)?$`); interface CompilationInfo { assetsManifest?: AssetsManifest; + rscManifest?: any; } const createAssetsPlugin = (compilationInfo: CompilationInfo | (() => CompilationInfo), rootDir: string) => ({ @@ -60,6 +61,21 @@ const createAssetsPlugin = (compilationInfo: CompilationInfo | (() => Compilatio loader: 'json', }; }); + build.onResolve({ filter: /react-client-manifest.json$/ }, (args) => { + if (args.path === 'virtual:react-client-manifest.json') { + return { + path: args.path, + namespace: 'react-client-manifest', + }; + } + }); + build.onLoad({ filter: /.*/, namespace: 'react-client-manifest' }, () => { + const manifest = typeof compilationInfo === 'function' ? compilationInfo() : compilationInfo; + return { + contents: JSON.stringify(manifest?.rscManifest || ''), + loader: 'json', + }; + }); build.onLoad({ filter: ASSETS_RE }, async (args) => { const manifest = typeof compilationInfo === 'function' ? compilationInfo() : compilationInfo; if (args.suffix == '?raw') { diff --git a/packages/ice/src/plugins/task.ts b/packages/ice/src/plugins/task.ts index 721ffee2b8..e89004168f 100644 --- a/packages/ice/src/plugins/task.ts +++ b/packages/ice/src/plugins/task.ts @@ -26,12 +26,12 @@ const getDefaultTaskConfig = ({ rootDir, command }): Config => { 'universal-env': envReplacement, '@uni/env': envReplacement, }, - assetsManifest: true, fastRefresh: command === 'start', logging: process.env.WEBPACK_LOGGING || defaultLogging, minify: command === 'build', useDevServer: true, + useDataLoader: true, }; }; diff --git a/packages/ice/src/plugins/web/config.ts b/packages/ice/src/plugins/web/config.ts new file mode 100644 index 0000000000..9b44cbfe53 --- /dev/null +++ b/packages/ice/src/plugins/web/config.ts @@ -0,0 +1,17 @@ +export function createRSCAliases() { + const alias: Record<string, string> = { + react$: '@ice/bundles/compiled/react', + 'react-dom$': '@ice/bundles/compiled/react-dom', + 'react/jsx-runtime$': '@ice/bundles/compiled/react/jsx-runtime', + 'react/jsx-dev-runtime$': '@ice/bundles/compiled/react/jsx-dev-runtime', + 'react-dom/client$': '@ice/bundles/compiled/react-dom/client', + 'react-dom/server$': '@ice/bundles/compiled/react-dom/server', + 'react-dom/server.edge$': '@ice/bundles/compiled/react-dom/server.edge', + 'react-dom/server.browser$': '@ice/bundles/compiled/react-dom/server.browser', + 'react-server-dom-webpack/client$': '@ice/bundles/compiled/react-server-dom-webpack/client', + 'react-server-dom-webpack/client.edge$': '@ice/bundles/compiled/react-server-dom-webpack/client.edge', + 'react-server-dom-webpack/server.edge$': '@ice/bundles/compiled/react-server-dom-webpack/server.edge', + 'react-server-dom-webpack/server.node$': '@ice/bundles/compiled/react-server-dom-webpack/server.node', + }; + return alias; +} diff --git a/packages/ice/src/plugins/web/index.ts b/packages/ice/src/plugins/web/index.ts index 4f2c090a1e..2d54af4f52 100644 --- a/packages/ice/src/plugins/web/index.ts +++ b/packages/ice/src/plugins/web/index.ts @@ -1,13 +1,15 @@ +import * as path from 'path'; import chalk from 'chalk'; import type { Plugin } from '../../types/plugin.js'; -import { WEB } from '../../constant.js'; +import { WEB, RUNTIME_TMP_DIR } from '../../constant.js'; import openBrowser from '../../utils/openBrowser.js'; import { logger } from '../../utils/logger.js'; +import { createRSCAliases } from './config.js'; const plugin: Plugin = () => ({ name: 'plugin-web', setup: ({ registerTask, onHook, context, generator }) => { - const { commandArgs, command, userConfig } = context; + const { commandArgs, command, userConfig, rootDir } = context; generator.addTargetExport({ specifier: [ @@ -45,6 +47,14 @@ const plugin: Plugin = () => ({ swcOptions: { removeExportExprs, }, + serverComponent: userConfig.rsc, + ...(userConfig.rsc ? { + alias: createRSCAliases(), + // TODO: temporary solution for rsc. + entry: { + main: [path.join(rootDir, RUNTIME_TMP_DIR, 'rsc.client.tsx')], + route: [path.join(rootDir, RUNTIME_TMP_DIR, 'routes.tsx')], + } } : {}), }); onHook('after.start.compile', async ({ isSuccessful, isFirstCompile, urls, devUrlInfo }) => { diff --git a/packages/ice/src/routes.ts b/packages/ice/src/routes.ts index e7f26469f5..930d8dfe6c 100644 --- a/packages/ice/src/routes.ts +++ b/packages/ice/src/routes.ts @@ -73,11 +73,12 @@ export function getRoutesDefinition(nestRouteManifest: NestedRouteManifest[], la routeImports.push(`import * as ${routeSpecifier} from '${formatPath(componentPath)}';`); loadStatement = routeSpecifier; } - const component = `Component: () => WrapRouteComponent({ - routeId: '${id}', - isLayout: ${layout}, - routeExports: ${lazy ? 'componentModule' : loadStatement}, - })`; + const component = `Component: (props) => WrapRouteComponent({ + routeId: '${id}', + isLayout: ${layout}, + routeExports: ${lazy ? 'componentModule' : loadStatement}, + children: props?.children + })`; const loader = `loader: createRouteLoader({ routeId: '${id}', requestContext, diff --git a/packages/ice/src/service/serverCompiler.ts b/packages/ice/src/service/serverCompiler.ts index fe6c667176..237dc62b31 100644 --- a/packages/ice/src/service/serverCompiler.ts +++ b/packages/ice/src/service/serverCompiler.ts @@ -95,6 +95,23 @@ export const getRuntimeDefination = ( return define; }; +function formatAlias(alias: Record<string, string | boolean>) { + const aliasMap: Record<string, string> = {}; + for (const key in alias) { + const value = alias[key]; + // Esbuild only receive string type of alias. + if (typeof value === 'string') { + if (key.endsWith('$')) { + // Esbuild do not support alias ends with $. + aliasMap[key.replace(/\$$/, '')] = value; + } else { + aliasMap[key] = value; + } + } + } + return aliasMap; +} + export function createServerCompiler(options: Options) { const { task, rootDir, command, speedup, server, syntaxFeatures, getRoutesFile } = options; const externals = task.config?.externals || {}; @@ -170,7 +187,7 @@ export function createServerCompiler(options: Options) { bundle: true, format, target: 'node12.20.0', - alias, + alias: formatAlias(alias), // enable JSX syntax in .js files by default for compatible with migrate project // while it is not recommended loader: { '.js': 'jsx' }, diff --git a/packages/ice/src/types/userConfig.ts b/packages/ice/src/types/userConfig.ts index a1f96f8a49..a157b57407 100644 --- a/packages/ice/src/types/userConfig.ts +++ b/packages/ice/src/types/userConfig.ts @@ -190,6 +190,10 @@ export interface UserConfig { * @see https://v3.ice.work/docs/guide/basic/config#ssg */ ssg?: boolean; + /** + * A switch for RSC (React Server Component) support. + */ + rsc?: boolean; /** * config for server bundle * @see https://v3.ice.work/docs/guide/basic/config#server diff --git a/packages/ice/src/webpack/FlightClientEntryLoader.ts b/packages/ice/src/webpack/FlightClientEntryLoader.ts new file mode 100644 index 0000000000..748c947526 --- /dev/null +++ b/packages/ice/src/webpack/FlightClientEntryLoader.ts @@ -0,0 +1,24 @@ +export type ClientComponentImports = string[]; +export type CssImports = Record<string, string[]>; + +export type FlightClientEntryLoaderOptions = { + modules: ClientComponentImports; +}; + +export default function transformSource() { + let { modules }: FlightClientEntryLoaderOptions = this.getOptions(); + + if (!Array.isArray(modules)) { + modules = modules ? [modules] : []; + } + + const requests = modules as string[]; + const code = requests + .map( + (request) => + `import(/* webpackMode: "eager" */ ${JSON.stringify(request)})`, + ) + .join(';\n'); + + return code; +} diff --git a/packages/ice/src/webpack/FlightClientEntryPlugin.ts b/packages/ice/src/webpack/FlightClientEntryPlugin.ts new file mode 100644 index 0000000000..32900200e3 --- /dev/null +++ b/packages/ice/src/webpack/FlightClientEntryPlugin.ts @@ -0,0 +1,343 @@ +import { join, relative } from 'path'; +import { stringify } from 'querystring'; +import { asyncLib, acorn } from '@ice/bundles'; +import webpack from '@ice/bundles/compiled/webpack/index.js'; +import NullDependency from '@ice/bundles/compiled/webpack/NullDependency.js'; +import ModuleDependency from '@ice/bundles/compiled/webpack/ModuleDependency.js'; +import type { Compiler, Compilation } from 'webpack'; +import { createComponentName } from '@ice/route-manifest'; +import formatPath from '../utils/formatPath.js'; + +const PLUGIN_NAME = 'FlightClientEntryPlugin'; + +interface ClientReferenceSearchPath { + directory: string; + recursive?: boolean; + include: RegExp; + exclude?: RegExp; +} + +interface Options { + rootDir: string; + clientReferences?: ClientReferenceSearchPath[]; + getRoutesFile: () => string[]; +} + +class ClientReferenceDependency extends ModuleDependency { + userRequest: string; + request: string; + + constructor(request: string) { + super(request); + this.request = request; + } + get type(): string { + return 'client-reference'; + } +} + +export class FlightClientEntryPlugin { + clientReferences: ClientReferenceSearchPath[]; + clientFiles = new Set(); + pageDir: string; + rootDir: string; + getRoutesFile: () => string[]; + + constructor(options: Options) { + this.rootDir = options.rootDir; + this.pageDir = join(options.rootDir, 'src', 'pages'); + + this.getRoutesFile = options.getRoutesFile; + + if (options.clientReferences) { + this.clientReferences = options.clientReferences; + } else { + this.clientReferences = [ + { + directory: '.', + recursive: true, + include: /\.(js|ts|jsx|tsx)$/, + exclude: /types.ts|.d.ts|node_modules/, + }, + ]; + } + } + + apply(compiler: Compiler) { + const _this = this; + + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation, { normalModuleFactory }) => { + // @ts-expect-error TODO: add types for ModuleDependency. + compilation.dependencyFactories.set(ClientReferenceDependency, normalModuleFactory); + // @ts-expect-error TODO: add types for ModuleDependency. + compilation.dependencyTemplates.set(ClientReferenceDependency, new NullDependency.Template()); + }); + + compiler.hooks.beforeCompile.tapAsync(PLUGIN_NAME, ({ contextModuleFactory }, callback) => { + const contextResolver = compiler.resolverFactory.get('context', {}); + const normalResolver = compiler.resolverFactory.get('normal'); + + _this.resolveClientFiles( + compiler.context, + contextResolver, + normalResolver, + compiler.inputFileSystem, + contextModuleFactory, + (err, resolvedClientRefs) => { + if (err) { + callback(err); + return; + } + resolvedClientRefs.forEach(dep => { + _this.clientFiles.add(dep.request); + }); + + callback(); + }, + ); + }); + + compiler.hooks.finishMake.tapPromise(PLUGIN_NAME, (compilation) => + _this.createClientEntries(compiler, compilation), + ); + + compiler.hooks.make.tap(PLUGIN_NAME, (compilation) => { + compilation.hooks.processAssets.tap({ + name: PLUGIN_NAME, + stage: webpack.Compilation.PROCESS_ASSETS_STAGE_PRE_PROCESS, + }, () => { + compilation.chunks.forEach((chunk) => { + if (chunk.name === 'route' || chunk.runtime === 'route') { + chunk.files.forEach((file) => { + delete compilation.assets[file]; + }); + } + }); + }); + }); + } + + async createClientEntries(compiler: Compiler, compilation: Compilation) { + const routes = this.getRoutesFile().map(file => join(this.rootDir, file)); + const addClientEntryList = []; + + for (const [name, entry] of compilation.entries.entries()) { + if (name === 'main') { + continue; + } + + const entryDependency = entry.dependencies?.[0]; + if (!entryDependency) { + continue; + } + + const entryModule = compilation.moduleGraph.getResolvedModule(entryDependency); + for (const connection of compilation.moduleGraph.getOutgoingConnections(entryModule)) { + // @ts-ignore + const entryRequest = connection.resolvedModule?.resource; + + if (routes.indexOf(entryRequest) === -1) continue; + + const { clientComponentImports, CSSImports } = this.collectComponentInfoFromDependency({ + compilation, + resolvedModule: connection.resolvedModule, + }); + + if (clientComponentImports.length || CSSImports.length) { + const injected = this.injectClientEntry({ + compiler, + compilation, + bundlePath: entryRequest, + clientImports: [ + ...clientComponentImports, + ...CSSImports, + ], + }); + + addClientEntryList.push(injected); + } + } + } + + await Promise.all(addClientEntryList); + } + + injectClientEntry({ compiler, compilation, bundlePath, clientImports }) { + const clientLoader = `flight-client-entry-loader?${stringify({ + modules: clientImports, + })}!`; + + const componentName = createComponentName(formatPath(relative(this.pageDir, bundlePath))); + const name = `rsc_${componentName}`; + const clientComponentEntryDep = webpack.EntryPlugin.createDependency(clientLoader, { + name, + }); + + return new Promise<void>((resolve, reject) => { + compilation.addEntry(compiler.context, clientComponentEntryDep, { name, dependOn: ['main'] }, (err) => { + if (err) { + reject(err); + } + + resolve(); + }); + }); + } + + collectComponentInfoFromDependency({ compilation, resolvedModule }) { + // Keep track of checked modules to avoid infinite loops with recursive imports. + const visited = new Set(); + // Info to collect. + const clientComponentImports = []; + const CSSImports = []; + + const filterClientComponents = (mod) => { + if (!mod) return; + + const modRequest: string | undefined = mod.resourceResolveData?.path + mod.resourceResolveData?.query; + + if (!modRequest || visited.has(modRequest)) return; + visited.add(modRequest); + + const isCSS = isCSSMod(mod); + + if (isCSS) { + CSSImports.push(modRequest); + } + + if (this.isClientComponentEntryModule(mod)) { + clientComponentImports.push(modRequest); + return; + } + + compilation.moduleGraph.getOutgoingConnections(mod).forEach((connection) => { + filterClientComponents(connection.resolvedModule); + }); + }; + + // Traverse the module graph to find all client components. + filterClientComponents(resolvedModule); + + return { + clientComponentImports, + CSSImports, + }; + } + + isClientComponentEntryModule(mod) { + if (this.clientFiles.has(mod.resource)) { + return true; + } + + return false; + } + + resolveClientFiles( + context: string, + contenxtResolver: ReturnType<Compiler['resolverFactory']['get']>, + normalResolver: ReturnType<Compiler['resolverFactory']['get']>, + fs: Compilation['inputFileSystem'], + contextModuleFactory: Compilation['params']['contextModuleFactory'], + callback: (err: Error | null, files?: ClientReferenceDependency[]) => void, + ) { + function hasUseClientDirective(source: string): boolean { + if (source.indexOf('use client') === -1) { + return false; + } + let body; + try { + // TODO: check client directive by comment injected by swc plugin. + body = acorn.parse(source, { + ecmaVersion: '2024', + sourceType: 'module', + }).body; + } catch (x) { + return 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') { + return true; + } + } + return false; + } + asyncLib.map(this.clientReferences, ( + clientReference: ClientReferenceSearchPath, + cb: (err: null | Error, result?: ClientReferenceDependency[]) => void, + ) => { + contenxtResolver.resolve({}, context, clientReference.directory, {}, (err, resolvedDirectory) => { + if (err) return cb(err); + const options = { + resource: resolvedDirectory, + resourceQuery: '', + recursive: + clientReference.recursive === undefined + ? true + : clientReference.recursive, + regExp: clientReference.include, + include: undefined, + exclude: clientReference.exclude, + }; + // @ts-expect-error TODO: add types for resolveDependencies options. + contextModuleFactory.resolveDependencies(fs, options, (err, dependencies) => { + if (err) return cb(err); + const clientRefDeps = dependencies.map(dep => { + // Use userRequest instead of request. request always end with undefined which is wrong. + const request = join(resolvedDirectory as string, dep.userRequest); + const clientRefDep = new ClientReferenceDependency(request); + clientRefDep.userRequest = dep.userRequest; + return clientRefDep; + }); + asyncLib.filter( + clientRefDeps, + (dep: ClientReferenceDependency, filterCb: (err: null | Error, truthValue: boolean) => void, + ) => { + normalResolver.resolve( + {}, + context, + dep.request, + {}, + (err: null | Error, resolvedPath: any) => { + if (err || typeof resolvedPath !== 'string') { + return filterCb(null, false); + } + + fs.readFile( + resolvedPath, + 'utf-8', + // @ts-expect-error + (err: null | Error, content: string) => { + if (err || typeof content !== 'string') { + return filterCb(null, false); + } + const useClient = hasUseClientDirective(content); + filterCb(null, useClient); + }, + ); + }, + ); + }, cb); + }); + }); + }, ( + err: null | Error, + result: ClientReferenceDependency[], + ) => { + if (err) return callback(err); + const flat: ClientReferenceDependency[] = []; + for (let i = 0; i < result.length; i++) { + flat.push.apply(flat, result[i]); + } + callback(null, flat); + }); + } +} + +const regexCSS = /\.(css|scss|sass)(\?.*)?$/; +function isCSSMod(mod) { + return mod.resource && regexCSS.test(mod.resource); +} \ No newline at end of file diff --git a/packages/ice/src/webpack/FlightManifestPlugin.ts b/packages/ice/src/webpack/FlightManifestPlugin.ts new file mode 100644 index 0000000000..f8bda22836 --- /dev/null +++ b/packages/ice/src/webpack/FlightManifestPlugin.ts @@ -0,0 +1,152 @@ +// Fork form https://github.com/facebook/react/blob/main/packages/react-server-dom-webpack/src/ReactFlightWebpackPlugin.js +// Add special handling for ice.js when enable RSC. +import webpack from '@ice/bundles/compiled/webpack/index.js'; +import type { Compiler } from 'webpack'; + +const PLUGIN_NAME = 'FlightManifestPlugin'; + +interface Options { + clientManifestFilename?: string; + ssrManifestFilename?: string; +} + +interface SSRExports { + [chunkName: string]: { specifier: string; name: string }; +} + +interface ClientManifest { + [key: string]: { + chunks: (string | number)[]; + id: string | number; + name: string; +}; +} + +interface SsrManifest { + [key: string]: SSRExports; +} + +export class FlightManifestPlugin { + clientManifestFilename?: string; + ssrManifestFilename?: string; + + constructor(options: Options = {}) { + this.clientManifestFilename = + options.clientManifestFilename || 'react-client-manifest.json'; + this.ssrManifestFilename = + options.ssrManifestFilename || 'react-ssr-manifest.json'; + } + + apply(compiler: Compiler) { + const _this = this; + + compiler.hooks.make.tap(PLUGIN_NAME, (compilation) => { + compilation.hooks.processAssets.tap({ + name: PLUGIN_NAME, + stage: webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT, + }, () => { + const clientManifestMapping: { + [key: string]: ClientManifest; + } = {}; + const ssrManifestSetMapping: { + [key: string]: SsrManifest; + } = {}; + + compilation.chunkGroups.forEach((chunkGroup) => { + const chunkGroupName = chunkGroup.name; + + const clientManifest: ClientManifest = {}; + + const ssrManifest: SsrManifest = {}; + + let hasRecord = false; + + const recordModule = (id: string | number, module: any) => { + // const modId = path.relative(compiler.context, module.resource); + const modId = module.resource; + if (modId !== undefined) { + hasRecord = true; + + clientManifest[modId] = { + id, + chunks: chunkIds, + name: '*', + }; + // TODO: If this module ends up split into multiple modules, then + // we should encode each the chunks needed for the specific export. + // When the module isn't split, it doesn't matter and we can just + // encode the id of the whole module. This code doesn't currently + // deal with module splitting so is likely broken from ESM anyway. + ssrManifest[id] = { + '*': { + specifier: modId, + name: '*', + }, + }; + } + }; + + const chunkIds = chunkGroup.chunks.map((chunk) => chunk.id); + chunkGroup.chunks.forEach((chunk) => { + const chunkModules = compilation.chunkGraph.getChunkModulesIterable(chunk); + [...chunkModules].forEach((module) => { + const { request } = module as any; + + if ( + !request || + !request.includes('FlightClientEntryLoader.js') + ) { + return; + } + + const connections = compilation.moduleGraph.getOutgoingConnections(module); + + for (const connection of connections) { + const { dependency } = connection; + if (!dependency) continue; + + const clientEntryMod = compilation.moduleGraph.getResolvedModule( + dependency, + ) as any; + const modId = compilation.chunkGraph.getModuleId(clientEntryMod) as + | string + | number + | null; + + if (modId) { + recordModule(modId, clientEntryMod); + } else { + // If this is a concatenation, register each child to the parent ID. + if (connection.module?.constructor.name === 'ConcatenatedModule') { + const concatenatedMod = connection.module; + const concatenatedModId = + compilation.chunkGraph.getModuleId(concatenatedMod); + recordModule(concatenatedModId, clientEntryMod); + } + } + } + }); + + // One client component may bundle into serveral chunks, so we need to create manifest for each page. + if (hasRecord) { + clientManifestMapping[chunkGroupName] = clientManifest; + ssrManifestSetMapping[chunkGroupName] = ssrManifest; + } + }); + }); + + const clientOutput = JSON.stringify(clientManifestMapping, null, 2); + compilation.emitAsset( + _this.clientManifestFilename, + new webpack.sources.RawSource(clientOutput, false), + ); + + const ssrOutput = JSON.stringify(ssrManifestSetMapping, null, 2); + compilation.emitAsset( + _this.ssrManifestFilename, + new webpack.sources.RawSource(ssrOutput, false), + ); + }); + }); + } +} diff --git a/packages/ice/src/webpack/ServerCompilerPlugin.ts b/packages/ice/src/webpack/ServerCompilerPlugin.ts index a4b62f7ce9..6375baa211 100644 --- a/packages/ice/src/webpack/ServerCompilerPlugin.ts +++ b/packages/ice/src/webpack/ServerCompilerPlugin.ts @@ -41,6 +41,12 @@ export default class ServerCompilerPlugin { // Option of compilationInfo need to be object, while it may changed during multi-time compilation. this.compilerOptions.compilationInfo.assetsManifest = JSON.parse(compilation.getAsset('assets-manifest.json').source.source().toString()); + + if (compilation.getAsset('react-client-manifest.json')) { + // @ts-ignore + this.compilerOptions.compilationInfo.rscManifest = + JSON.parse(compilation.getAsset('react-client-manifest.json').source.source().toString()); + } } // For first time, we create a new task. // The next time, we use incremental build so do not create task again. diff --git a/packages/ice/templates/core/entry.server.ts.ejs b/packages/ice/templates/core/entry.server.ts.ejs index 00d0322ebf..8cc74f3393 100644 --- a/packages/ice/templates/core/entry.server.ts.ejs +++ b/packages/ice/templates/core/entry.server.ts.ejs @@ -13,6 +13,9 @@ import type { RenderMode, DistType } from '@ice/runtime'; import type { RenderToPipeableStreamOptions } from 'react-dom/server'; // @ts-ignore import assetsManifest from 'virtual:assets-manifest.json'; +<% if(rsc) {-%> +import clientManifest from 'virtual:react-client-manifest.json'; +<% }-%> <% if (hydrate) {-%> import createRoutes from './routes'; <% } else { -%> @@ -68,6 +71,11 @@ export async function renderToResponse(requestContext, options: RenderOptions = setRuntimeEnv(renderMode); const mergedOptions = mergeOptions(options); + + <% if(rsc) {-%> + return runtime.runRSCServerApp(requestContext, mergedOptions); + <% }-%> + return runtime.renderToResponse(requestContext, mergedOptions); } @@ -99,6 +107,9 @@ function mergeOptions(options) { basename: basename || getRouterBasename(), renderMode, routesConfig, + <% if(rsc) {-%> + clientManifest, + <% }-%> <% if (hydrate) {-%> runtimeOptions: { <% if (runtimeOptions.exports) { -%> diff --git a/packages/ice/templates/core/rsc.client.tsx.ejs b/packages/ice/templates/core/rsc.client.tsx.ejs new file mode 100644 index 0000000000..0ded0e7f79 --- /dev/null +++ b/packages/ice/templates/core/rsc.client.tsx.ejs @@ -0,0 +1,10 @@ +<% if (importCoreJs) { -%>import 'core-js';<% } %> +import { runRSCClientApp, getAppConfig } from '<%- iceRuntimePath %>'; +import * as app from '@/app'; + +const render = (customOptions = {}) => { + const appConfig = getAppConfig(app); + return runRSCClientApp(appConfig); +}; + +<%- entryCode %> diff --git a/packages/route-manifest/src/index.ts b/packages/route-manifest/src/index.ts index af00031e2c..8175fbe6a1 100644 --- a/packages/route-manifest/src/index.ts +++ b/packages/route-manifest/src/index.ts @@ -46,11 +46,14 @@ const routeModuleExts = [ // '.mdx', ]; +export { + createComponentName, +}; + export function isRouteModuleFile(filename: string): boolean { return routeModuleExts.includes(path.extname(filename)); } - export function generateRouteManifest( rootDir: string, ignoreFiles: string[] = [], diff --git a/packages/runtime/package.json b/packages/runtime/package.json index f777e59f08..2a822f8062 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -42,8 +42,9 @@ "devDependencies": { "@types/react": "^18.0.8", "@types/react-dom": "^18.0.3", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-server-dom-webpack": "18.3.0-canary-dd480ef92-20230822", "regenerator-runtime": "^0.13.9", "@remix-run/web-fetch": "^4.3.3" }, @@ -65,8 +66,8 @@ "source-map": "^0.7.4" }, "peerDependencies": { - "react": "^18.1.0", - "react-dom": "^18.1.0" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "publishConfig": { "access": "public" diff --git a/packages/runtime/src/AppContext.tsx b/packages/runtime/src/AppContext.tsx index ff05e7fdbf..5998beb8af 100644 --- a/packages/runtime/src/AppContext.tsx +++ b/packages/runtime/src/AppContext.tsx @@ -1,17 +1,22 @@ import * as React from 'react'; import type { AppContext } from './types.js'; -const Context = React.createContext<AppContext | undefined>(undefined); +// @ts-ignore +const Context = React.createServerContext + // @ts-ignore + ? React.createServerContext<AppContext | undefined>(undefined) + : React.createContext<AppContext | undefined>(undefined); Context.displayName = 'AppContext'; function useAppContext() { - const value = React.useContext(Context); + const value: AppContext = React.useContext(Context); return value; } function useAppData() { const value = React.useContext(Context); + // @ts-ignore return value.appData; } diff --git a/packages/runtime/src/index.server.ts b/packages/runtime/src/index.server.ts index e1390daf38..83dd937a2a 100644 --- a/packages/runtime/src/index.server.ts +++ b/packages/runtime/src/index.server.ts @@ -1,2 +1,4 @@ export { renderToResponse, renderToHTML, renderToEntry } from './runServerApp.js'; +export { runRSCServerApp } from './runRSCServerApp.js'; + export * from './index.js'; diff --git a/packages/runtime/src/index.ts b/packages/runtime/src/index.ts index ad0b5c0029..4329b4caef 100644 --- a/packages/runtime/src/index.ts +++ b/packages/runtime/src/index.ts @@ -26,6 +26,7 @@ import type { RunClientAppOptions, CreateRoutes } from './runClientApp.js'; import { useAppContext as useInternalAppContext, useAppData, AppContextProvider } from './AppContext.js'; import { getAppData } from './appData.js'; import { useData, useConfig } from './RouteContext.js'; +import { runRSCClientApp } from './runRSCClientApp.js'; import { Meta, Title, @@ -144,6 +145,8 @@ export { createRouteLoader, WrapRouteComponent, RouteErrorComponent, + + runRSCClientApp, }; export type { diff --git a/packages/runtime/src/routes.tsx b/packages/runtime/src/routes.tsx index 77e887c9bf..1e98c473a1 100644 --- a/packages/runtime/src/routes.tsx +++ b/packages/runtime/src/routes.tsx @@ -57,12 +57,16 @@ export function WrapRouteComponent(options: { routeId: string; isLayout?: boolean; routeExports: ComponentModule; + children?: Array<ComponentModule>; }) { - const { routeId, isLayout, routeExports } = options; - const { RouteWrappers } = useAppContext(); + const { routeId, isLayout, routeExports, children } = options; + + const { RouteWrappers } = useAppContext() || {}; return ( <RouteWrapper routeExports={routeExports} id={routeId} isLayout={isLayout} wrappers={RouteWrappers}> - <routeExports.default /> + <routeExports.default> + { children } + </routeExports.default> </RouteWrapper> ); } diff --git a/packages/runtime/src/routesConfig.ts b/packages/runtime/src/routesConfig.ts index ceba4f3aba..ea3fce7cf3 100644 --- a/packages/runtime/src/routesConfig.ts +++ b/packages/runtime/src/routesConfig.ts @@ -32,7 +32,7 @@ function getMergedValue(key: string, matches: RouteMatch[], loadersData: Loaders let result; for (let match of matches) { const routeId = match.route.id; - const data = loadersData[routeId]?.pageConfig; + const data = loadersData?.[routeId]?.pageConfig; const value = data?.[key]; if (Array.isArray(value)) { diff --git a/packages/runtime/src/runRSCClientApp.tsx b/packages/runtime/src/runRSCClientApp.tsx new file mode 100644 index 0000000000..37db3a5fac --- /dev/null +++ b/packages/runtime/src/runRSCClientApp.tsx @@ -0,0 +1,96 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom/client'; +import pkg from 'react-server-dom-webpack/client'; +import type { AppConfig } from './types.js'; + +// @ts-ignore +const { Suspense, use } = React; +const { createFromReadableStream } = pkg; + +export async function runRSCClientApp(appConfig: AppConfig) { + // It's possible that the DOM is already loaded. + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); + } else { + DOMContentLoaded(); + } + + const rscData = (self as any).__rsc_data = (self as any).__rsc_data || []; + rscData.forEach(serverDataCallback); + rscData.push = serverDataCallback; + + const rootId = appConfig.app.rootId || 'app'; + const container = document.getElementById(rootId); + const root = ReactDOM.createRoot(container); + root.render(<Root />); +} + +function Root() { + const response = useInitialServerResponse(window.location.href); + + return ( + <Suspense> + {use(response)} + </Suspense> + ); +} + +const rscCache = new Map(); + +function useInitialServerResponse(cacheKey: string): Promise<JSX.Element> { + const response = rscCache.get(cacheKey); + if (response) return response; + + const readable = new ReadableStream({ + start(controller) { + nextServerDataRegisterWriter(controller); + }, + }); + + const newResponse = createFromReadableStream(readable); + + rscCache.set(cacheKey, newResponse); + return newResponse; +} + +let initialServerDataBuffer: string[] | undefined; +let initialServerDataWriter: ReadableStreamDefaultController | undefined; +let initialServerDataLoaded = false; +let initialServerDataFlushed = false; +const encoder = new TextEncoder(); + +function nextServerDataRegisterWriter(ctr: ReadableStreamDefaultController) { + if (initialServerDataBuffer) { + initialServerDataBuffer.forEach((val) => { + ctr.enqueue(encoder.encode(val)); + }); + if (initialServerDataLoaded && !initialServerDataFlushed) { + ctr.close(); + initialServerDataFlushed = true; + initialServerDataBuffer = undefined; + } + } + + initialServerDataWriter = ctr; +} + +// When `DOMContentLoaded`, we can close all pending writers to finish hydration. +const DOMContentLoaded = function () { + if (initialServerDataWriter && !initialServerDataFlushed) { + initialServerDataWriter.close(); + initialServerDataFlushed = true; + initialServerDataBuffer = undefined; + } + initialServerDataLoaded = true; +}; + +function serverDataCallback(seg) { + if (initialServerDataWriter) { + initialServerDataWriter.enqueue(encoder.encode(seg)); + } else { + if (!initialServerDataBuffer) { + initialServerDataBuffer = []; + } + initialServerDataBuffer.push(seg); + } +} \ No newline at end of file diff --git a/packages/runtime/src/runRSCServerApp.tsx b/packages/runtime/src/runRSCServerApp.tsx new file mode 100644 index 0000000000..0327f05b6b --- /dev/null +++ b/packages/runtime/src/runRSCServerApp.tsx @@ -0,0 +1,150 @@ +import { TextDecoder, TextEncoder } from 'util'; +import * as React from 'react'; +import * as ReactDOMServer from 'react-dom/server'; +import { renderToPipeableStream } from 'react-server-dom-webpack/server.node'; +import { AppContextProvider } from './AppContext.js'; +import { DocumentContextProvider } from './Document.js'; +import { loadRouteModules } from './routes.js'; +import getAppConfig from './appConfig.js'; +import getRequestContext from './requestContext.js'; +import getLocation from './utils/getLocation.js'; +import addLeadingSlash from './utils/addLeadingSlash.js'; +import matchRoutes from './matchRoutes.js'; +import type { + AppContext, + ServerContext, + RouteMatch, + RouteModules, + ServerRenderOptions as RenderOptions, +} from './types.js'; + +// This utility is based on https://github.com/zertosh/htmlescape +// License: https://github.com/zertosh/htmlescape/blob/0527ca7156a524d256101bb310a9f970f63078ad/LICENSE +const ESCAPE_LOOKUP: { [match: string]: string } = { + '&': '\\u0026', + '>': '\\u003e', + '<': '\\u003c', + '\u2028': '\\u2028', + '\u2029': '\\u2029', +}; + +const ESCAPE_REGEX = /[&><\u2028\u2029]/g; + +function htmlEscapeJsonString(str: string): string { + return str.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); +} + +export async function runRSCServerApp(serverContext: ServerContext, renderOptions: RenderOptions) { + const { req, res } = serverContext; + + const { + app, + createRoutes, + renderMode, + basename, + serverOnlyBasename, + clientManifest: clientManifestMapping, + assetsManifest, + } = renderOptions; + + const location = getLocation(req.url); + const requestContext = getRequestContext(location, serverContext); + const routes = createRoutes({ + requestContext, + renderMode, + }); + const finalBasename = addLeadingSlash(serverOnlyBasename || basename); + const matches = matchRoutes(routes, location, finalBasename); + + const appConfig = getAppConfig(app); + const appContext: AppContext = { + appConfig, + appData: null, + renderMode, + assetsManifest, + basename: finalBasename, + matches: [], + }; + + renderDocument(serverContext, renderOptions, appContext, matches); + + const routeModules = await loadRouteModules(matches.map(({ route: { id, lazy } }) => ({ id, lazy }))); + + const element = ( + <AppContextProvider value={appContext}> + {renderMatches(matches, routeModules)} + </AppContextProvider> + ); + + // Merge client manifest for match route. + const clientManifest = {}; + matches.forEach(match => { + const { componentName } = match.route; + const manifest = clientManifestMapping[`rsc_${componentName}`]; + if (manifest) { + Object.assign(clientManifest, manifest); + } + }); + + const decoder = new TextDecoder(); + const encoder = new TextEncoder(); + + res.write('<script>self.__rsc_data=self.__rsc_data||[];</script>'); + + function decorateWrite(write) { + return function (data) { + const chunk = decoder.decode(data, { stream: true }); + const modifiedData = `<script>self.__rsc_data.push(${htmlEscapeJsonString(JSON.stringify([chunk]))})</script>`; + + return write.call(this, encoder.encode(modifiedData)); + }; + } + + res.write = decorateWrite(res.write); + + const { pipe } = renderToPipeableStream( + element, + clientManifest, + ); + + pipe(res); +} + +function renderMatches(matches: RouteMatch[], routeModules: RouteModules) { + return matches.reduceRight((children, match) => { + if (match.route) { + const Component = routeModules[match.route.id].default; + + return React.createElement(Component, { + children, + }); + } + + return children; + }, React.createElement(null)); +} + +function renderDocument(requestContext, renderOptions, appContext, matches) { + const { res } = requestContext; + + const { + Document, + routePath, + } = renderOptions; + + const documentContext = { + main: null, + }; + + const htmlStr = ReactDOMServer.renderToString( + <AppContextProvider value={{ ...appContext, matches }}> + <DocumentContextProvider value={documentContext}> + <Document pagePath={routePath} /> + </DocumentContextProvider> + </AppContextProvider>, + ); + + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + res.write(`<!DOCTYPE html>${htmlStr}`); +} + diff --git a/packages/runtime/src/runServerApp.tsx b/packages/runtime/src/runServerApp.tsx index 28e4a8c26c..2f402b1090 100644 --- a/packages/runtime/src/runServerApp.tsx +++ b/packages/runtime/src/runServerApp.tsx @@ -2,21 +2,14 @@ import type { ServerResponse, IncomingMessage } from 'http'; import * as React from 'react'; import * as ReactDOMServer from 'react-dom/server'; import type { Location } from 'history'; -import { parsePath } from 'history'; import { isFunction } from '@ice/shared'; -import type { RenderToPipeableStreamOptions, OnAllReadyParams, NodeWritablePiper } from './server/streamRender.js'; +import type { OnAllReadyParams, NodeWritablePiper } from './server/streamRender.js'; import type { AppContext, RouteItem, ServerContext, - AppExport, - AssetsManifest, RouteMatch, - PageConfig, - RenderMode, - DocumentComponent, - RuntimeModules, AppData, ServerAppRouterProps, - DocumentDataLoaderConfig, + ServerRenderOptions as RenderOptions, } from './types.js'; import Runtime from './runtime.js'; import { AppContextProvider } from './AppContext.js'; @@ -24,7 +17,6 @@ import { getAppData } from './appData.js'; import getAppConfig from './appConfig.js'; import { DocumentContextProvider } from './Document.js'; import { loadRouteModules } from './routes.js'; -import type { RouteLoaderOptions } from './routes.js'; import { pipeToString, renderToNodeStream } from './server/streamRender.js'; import getRequestContext from './requestContext.js'; import matchRoutes from './matchRoutes.js'; @@ -32,38 +24,13 @@ import getCurrentRoutePath from './utils/getCurrentRoutePath.js'; import ServerRouter from './ServerRouter.js'; import { renderHTMLToJS } from './renderHTMLToJS.js'; import addLeadingSlash from './utils/addLeadingSlash.js'; - - -export interface RenderOptions { - app: AppExport; - assetsManifest: AssetsManifest; - createRoutes: (options: Pick<RouteLoaderOptions, 'requestContext' | 'renderMode'>) => RouteItem[]; - runtimeModules: RuntimeModules; - documentDataLoader?: DocumentDataLoaderConfig; - Document?: DocumentComponent; - documentOnly?: boolean; - preRender?: boolean; - renderMode?: RenderMode; - // basename is used both for server and client, once set, it will be sync to client. - basename?: string; - // serverOnlyBasename is used when just want to change basename for server. - serverOnlyBasename?: string; - routePath?: string; - disableFallback?: boolean; - routesConfig: { - [key: string]: PageConfig; - }; - runtimeOptions?: Record<string, any>; - distType?: Array<'html' | 'javascript'>; - prependCode?: string; - serverData?: any; - streamOptions?: RenderToPipeableStreamOptions; -} +import getLocation from './utils/getLocation.js'; interface Piper { pipe: NodeWritablePiper; - fallback: Function; + fallback?: Function; } + interface Response { statusCode?: number; statusText?: string; @@ -381,16 +348,16 @@ interface RenderServerEntry { async function renderServerEntry( { runtime, - matches, location, renderOptions, }: RenderServerEntry, ): Promise<Response> { const { Document } = renderOptions; const appContext = runtime.getAppContext(); - const { routes, routePath, loaderData, basename } = appContext; + const { routes, matches, routePath, loaderData, basename } = appContext; const AppRuntimeProvider = runtime.composeAppProvider() || React.Fragment; const AppRouter = runtime.getAppRouter<ServerAppRouterProps>(); + const routerContext: ServerAppRouterProps['routerContext'] = { // @ts-expect-error matches type should be use `AgnosticDataRouteMatch[]` matches, @@ -405,7 +372,7 @@ async function renderServerEntry( ), }; - const element = ( + const element: JSX.Element = ( <AppContextProvider value={appContext}> <AppRuntimeProvider> <DocumentContextProvider value={documentContext}> @@ -417,10 +384,6 @@ async function renderServerEntry( </AppContextProvider> ); - const pipe = renderToNodeStream(element, { - renderOptions, - routerContext, - }); const fallback = () => { return renderDocument({ @@ -433,6 +396,11 @@ async function renderServerEntry( }); }; + const pipe: NodeWritablePiper = renderToNodeStream(element, { + renderOptions, + routerContext, + }); + return { value: { pipe, @@ -524,21 +492,3 @@ function renderDocument(options: RenderDocumentOptions): Response { }; } -/** - * ref: https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/server.tsx - */ -const REGEXP_WITH_HOSTNAME = /^https?:\/\/[^/]+/i; -function getLocation(url: string) { - // In case of invalid URL, provide a default base url. - const locationPath = url.replace(REGEXP_WITH_HOSTNAME, '') || '/'; - const locationProps = parsePath(locationPath); - const location: Location = { - pathname: locationProps.pathname || '/', - search: locationProps.search || '', - hash: locationProps.hash || '', - state: null, - key: 'default', - }; - - return location; -} diff --git a/packages/runtime/src/server/streamRender.tsx b/packages/runtime/src/server/streamRender.tsx index 34ce4813a6..e55293908f 100644 --- a/packages/runtime/src/server/streamRender.tsx +++ b/packages/runtime/src/server/streamRender.tsx @@ -2,8 +2,7 @@ import * as Stream from 'stream'; import type * as StreamType from 'stream'; import * as ReactDOMServer from 'react-dom/server'; import { getAllAssets } from '../Document.js'; -import type { RenderOptions } from '../runServerApp.js'; -import type { ServerAppRouterProps } from '../types.js'; +import type { ServerAppRouterProps, ServerRenderOptions as RenderOptions } from '../types.js'; const { Writable } = Stream; @@ -117,4 +116,4 @@ export function pipeToString(input): Promise<string> { }, }); }); -} \ No newline at end of file +} diff --git a/packages/runtime/src/types.ts b/packages/runtime/src/types.ts index fdf1ce211b..09ac67ce7a 100644 --- a/packages/runtime/src/types.ts +++ b/packages/runtime/src/types.ts @@ -3,6 +3,8 @@ import type { InitialEntry, AgnosticRouteObject, Location, History, RouterInit, import type { ComponentType, PropsWithChildren } from 'react'; import type { HydrationOptions, Root } from 'react-dom/client'; import type { Params, RouteObject } from 'react-router-dom'; +import type { RenderToPipeableStreamOptions } from './server/streamRender.js'; +import type { RouteLoaderOptions } from './routes.js'; type UseConfig = () => RouteConfig<Record<string, any>>; type UseData = () => RouteData; @@ -313,3 +315,30 @@ declare global { env: Record<string, string>; } } + +export interface ServerRenderOptions { + app: AppExport; + assetsManifest: AssetsManifest; + createRoutes: (options: Pick<RouteLoaderOptions, 'requestContext' | 'renderMode'>) => RouteItem[]; + runtimeModules: RuntimeModules; + documentDataLoader?: DocumentDataLoaderConfig; + preRender?: boolean; + Document?: DocumentComponent; + documentOnly?: boolean; + renderMode?: RenderMode; + // basename is used both for server and client, once set, it will be sync to client. + basename?: string; + // serverOnlyBasename is used when just want to change basename for server. + serverOnlyBasename?: string; + routePath?: string; + disableFallback?: boolean; + routesConfig: { + [key: string]: PageConfig; + }; + runtimeOptions?: Record<string, any>; + distType?: Array<'html' | 'javascript'>; + prependCode?: string; + serverData?: any; + streamOptions?: RenderToPipeableStreamOptions; + clientManifest?: any; +} diff --git a/packages/runtime/src/utils/getLocation.ts b/packages/runtime/src/utils/getLocation.ts new file mode 100644 index 0000000000..fc3d6c9e72 --- /dev/null +++ b/packages/runtime/src/utils/getLocation.ts @@ -0,0 +1,22 @@ +/** + * ref: https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/server.tsx + */ +import { parsePath } from 'history'; +import type { Location } from 'history'; + +const REGEXP_WITH_HOSTNAME = /^https?:\/\/[^/]+/i; + +export default function getLocation(url: string) { + // In case of invalid URL, provide a default base url. + const locationPath = url.replace(REGEXP_WITH_HOSTNAME, '') || '/'; + const locationProps = parsePath(locationPath); + const location: Location = { + pathname: locationProps.pathname || '/', + search: locationProps.search || '', + hash: locationProps.hash || '', + state: null, + key: 'default', + }; + + return location; +} diff --git a/packages/shared-config/src/getCompilerPlugins.ts b/packages/shared-config/src/getCompilerPlugins.ts index 3e4706321b..b4d1782d35 100644 --- a/packages/shared-config/src/getCompilerPlugins.ts +++ b/packages/shared-config/src/getCompilerPlugins.ts @@ -50,6 +50,7 @@ function getCompilerPlugins(rootDir: string, config: Config, compiler: Compiler, polyfill, enableEnv, getRoutesFile, + serverComponent, } = config; const compilerPlugins = []; @@ -74,6 +75,8 @@ function getCompilerPlugins(rootDir: string, config: Config, compiler: Compiler, polyfill, enableEnv, getRoutesFile, + serverComponent, + isServer: true, })); } diff --git a/packages/shared-config/src/types.ts b/packages/shared-config/src/types.ts index 0d0b90e8e2..68ea8e56c5 100644 --- a/packages/shared-config/src/types.ts +++ b/packages/shared-config/src/types.ts @@ -153,7 +153,7 @@ export interface Config { redirectImports?: ImportDeclaration[]; entry?: { - [key: string]: string; + [key: string]: string | string[]; }; splitChunks?: boolean | 'vendors' | 'chunks' | 'page-vendors' | webpack.Configuration['optimization']['splitChunks']; @@ -205,4 +205,6 @@ export interface Config { useDevServer?: boolean; useDataLoader?: boolean; + + serverComponent?: boolean; } diff --git a/packages/shared-config/src/unPlugins/compilation.ts b/packages/shared-config/src/unPlugins/compilation.ts index f45b2f4f0a..ea319ece78 100644 --- a/packages/shared-config/src/unPlugins/compilation.ts +++ b/packages/shared-config/src/unPlugins/compilation.ts @@ -1,5 +1,5 @@ import path from 'path'; -import { swc, swcPluginRemoveExport, swcPluginKeepExport, swcPluginNodeTransform, coreJsPath, caniuseLite } from '@ice/bundles'; +import { swc, swcPluginRemoveExport, swcPluginKeepExport, swcPluginNodeTransform, swcPluginReactServerComponent, coreJsPath, caniuseLite } from '@ice/bundles'; import browserslist from 'browserslist'; import consola from 'consola'; import type { SwcConfig, ReactConfig } from '@ice/bundles'; @@ -24,6 +24,8 @@ interface Options { polyfill?: Config['polyfill']; enableEnv?: boolean; getRoutesFile?: () => string[]; + serverComponent?: boolean; + isServer?: boolean; } const formatId = (id: string) => id.split(path.sep).join('/'); @@ -44,6 +46,8 @@ const compilationPlugin = (options: Options): UnpluginOptions => { polyfill, enableEnv, getRoutesFile, + serverComponent, + isServer, } = options; const { removeExportExprs, compilationConfig, keepExports, nodeTransform } = swcOptions; @@ -105,6 +109,16 @@ const compilationPlugin = (options: Options): UnpluginOptions => { const swcPlugins = []; + if (serverComponent) { + swcPlugins.push([ + swcPluginReactServerComponent, + { + isServer, + assertImports: false, + }, + ]); + } + // handle app.tsx and page entries only if (removeExportExprs) { if (isRouteEntry(id) || isAppEntry(id)) { @@ -216,7 +230,6 @@ export function getJsxTransformOptions({ }, module: { type: 'es6', - noInterop: false, }, }; if (enableEnv) { diff --git a/packages/webpack-config/src/index.ts b/packages/webpack-config/src/index.ts index b6ee1e705d..fa72b2b3e6 100644 --- a/packages/webpack-config/src/index.ts +++ b/packages/webpack-config/src/index.ts @@ -108,6 +108,7 @@ export function getWebpackConfig(options: GetWebpackConfigOptions): Configuratio enableCopyPlugin, polyfill, enableRpx2Vw = true, + serverComponent, } = config; const absoluteOutputDir = path.isAbsolute(outputDir) ? outputDir : path.join(rootDir, outputDir); const dev = mode !== 'production'; @@ -163,6 +164,8 @@ export function getWebpackConfig(options: GetWebpackConfigOptions): Configuratio polyfill, enableEnv: true, getRoutesFile, + serverComponent, + isServer: false, }); const webpackConfig = { mode, diff --git a/packages/webpack-config/src/webpackPlugins/AssetsManifestPlugin.ts b/packages/webpack-config/src/webpackPlugins/AssetsManifestPlugin.ts index fe494cd1a9..e3e8ad98d2 100644 --- a/packages/webpack-config/src/webpackPlugins/AssetsManifestPlugin.ts +++ b/packages/webpack-config/src/webpackPlugins/AssetsManifestPlugin.ts @@ -9,13 +9,15 @@ interface Assets { getFiles: () => string[]; } -function filterAssets(assets: Assets): string[] { +function filterAssets(compilation: Compilation, assets: Assets): string[] { return ( assets ?.getFiles() .filter((file: string) => { + const exists = compilation.assets[file]; // We don't want to include `.hot-update.js` files into the initial page - return /(?<!\.hot-update)\.(js|css)($|\?)/.test(file); + const notHotUpdate = exists && /(?<!\.hot-update)\.(js|css)($|\?)/.test(file); + return exists && notHotUpdate; }) .map((file: string) => file.replace(/\\/g, '/')) ?? [] ); @@ -43,19 +45,38 @@ export default class AssetsManifestPlugin { assets[asset.sourceFilename] = asset.contenthash; } } + const entryFiles = []; for (const entrypoint of entrypoints) { const entryName = entrypoint.name; - const mainFiles = filterAssets(entrypoint); + + const entryChunk = entrypoint.getEntrypointChunk(); + + // Keep only main chunk as entry files. + if (entryChunk.runtime !== entryChunk.name) { + continue; + } + + const entryFile = [...entryChunk.files].filter((file) => file.endsWith('.js'))?.[0]; + // Temp files may have been deleted. + if (!compilation.assets[entryFile]) { + continue; + } + + const mainFiles = filterAssets(compilation, entrypoint); + if (!mainFiles.length) { + continue; + } + + entryFiles.push(entryFile); entries[entryName] = mainFiles; - const jsMainFiles = mainFiles.filter((file) => file.endsWith('.js')); - entryFiles.push(jsMainFiles[0]); - const chunks = entrypoint?.getChildren(); - chunks.forEach((chunk) => { + + const childChunks = entrypoint?.getChildren(); + childChunks.forEach((chunk) => { // Dynamic import missing chunk name, but not output solid assets. const chunkName = chunk.name; if (chunkName) { - pages[chunkName.replace(/^p_/, '')] = filterAssets(chunk); + pages[chunkName.replace(/^p_/, '').replace(/^rsc_/, '')] = filterAssets(compilation, chunk); } }); } @@ -76,6 +97,7 @@ export default class AssetsManifestPlugin { const output = JSON.stringify(manifest, null, 2); // Emit asset manifest for server compile. compilation.emitAsset(this.fileName, new webpack.sources.RawSource(output)); + // Inject assets manifest to entry file. entryFiles.forEach((entryFile) => { compilation.assets[entryFile] = new webpack.sources.ConcatSource( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d477baff7d..39ce40dd0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -843,7 +843,7 @@ importers: dependencies: '@alifd/next': specifier: ^1.25.49 - version: 1.26.2(@alifd/meet-react@2.9.7)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) + version: 1.26.2(@alifd/meet-react@2.9.8)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0) '@ice/runtime': specifier: workspace:* version: link:../../packages/runtime @@ -960,7 +960,7 @@ importers: version: 29.5.0 ts-jest: specifier: ^28.0.8 - version: 28.0.8(@babel/core@7.23.3)(jest@28.1.3)(typescript@4.9.5) + version: 28.0.8(@babel/core@7.21.0)(jest@28.1.3)(typescript@4.9.5) typescript: specifier: ^4.8.2 version: 4.9.5 @@ -1077,6 +1077,28 @@ importers: specifier: ^18.0.6 version: 18.0.11 + examples/with-rsc: + dependencies: + '@ice/app': + specifier: workspace:* + version: link:../../packages/ice + '@ice/runtime': + specifier: workspace:* + version: link:../../packages/runtime + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/react': + specifier: ^18.0.17 + version: 18.0.34 + '@types/react-dom': + specifier: ^18.0.6 + version: 18.0.11 + examples/with-ssg: dependencies: '@ice/app': @@ -1281,21 +1303,27 @@ importers: '@ice/swc-plugin-node-transform': specifier: 0.2.0 version: 0.2.0 + '@ice/swc-plugin-react-server-component': + specifier: 0.1.1 + version: 0.1.1 '@ice/swc-plugin-remove-export': specifier: 0.2.0 version: 0.2.0 '@swc/core': - specifier: 1.3.80 - version: 1.3.80 + specifier: 1.3.85 + version: 1.3.85 + acorn-loose: + specifier: ^8.3.0 + version: 8.3.0 ansi-html-community: specifier: ^0.0.8 version: 0.0.8 browserslist: specifier: ^4.21.3 - version: 4.21.5 + version: 4.22.2 caniuse-lite: specifier: ^1.0.30001561 - version: 1.0.30001564 + version: 1.0.30001571 chokidar: specifier: 3.5.3 version: 3.5.3 @@ -1331,7 +1359,7 @@ importers: version: 27.5.1 json-parse-even-better-errors: specifier: ^3.0.0 - version: 3.0.0 + version: 3.0.1 less: specifier: 4.1.2 version: 4.1.2 @@ -1361,10 +1389,10 @@ importers: version: 3.2.3 zod: specifier: ^3.22.3 - version: 3.22.3 + version: 3.22.4 zod-validation-error: specifier: 1.2.0 - version: 1.2.0(zod@3.22.3) + version: 1.2.0(zod@3.22.4) devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: 0.5.10 @@ -1374,7 +1402,7 @@ importers: version: 0.4.3 '@rspack/dev-server': specifier: 0.4.3 - version: 0.4.3(@rspack/core@0.4.3)(@swc/core@1.3.80)(esbuild@0.17.16)(react-refresh@0.14.0) + version: 0.4.3(@rspack/core@0.4.3)(@swc/core@1.3.85)(esbuild@0.17.16)(react-refresh@0.14.0) '@rspack/plugin-react-refresh': specifier: 0.4.3 version: 0.4.3(react-refresh@0.14.0) @@ -1386,7 +1414,7 @@ importers: version: 4.14.191 '@types/webpack-bundle-analyzer': specifier: ^4.4.1 - version: 4.6.0(@swc/core@1.3.80)(esbuild@0.17.16) + version: 4.6.0(@swc/core@1.3.85)(esbuild@0.17.16) bonjour-service: specifier: ^1.0.13 version: 1.1.0 @@ -1498,12 +1526,24 @@ importers: postcss-preset-env: specifier: 7.4.3 version: 7.4.3(postcss@8.4.31) + react-builtin: + specifier: npm:react@18.3.0-canary-dd480ef92-20230822 + version: /react@18.3.0-canary-dd480ef92-20230822 + react-dom-builtin: + specifier: npm:react-dom@18.3.0-canary-dd480ef92-20230822 + version: /react-dom@18.3.0-canary-dd480ef92-20230822(react@18.3.0-canary-dd480ef92-20230822) + react-server-dom-webpack: + specifier: 18.3.0-canary-dd480ef92-20230822 + version: 18.3.0-canary-dd480ef92-20230822(react-dom@18.3.0-canary-dd480ef92-20230822)(react@18.3.0-canary-dd480ef92-20230822)(webpack@5.88.2) rimraf: specifier: ^3.0.2 version: 3.0.2 sass-loader: specifier: 12.6.0 version: 12.6.0(sass@1.50.0)(webpack@5.88.2) + scheduler-builtin: + specifier: npm:scheduler@0.24.0-canary-dd480ef92-20230822 + version: /scheduler@0.24.0-canary-dd480ef92-20230822 schema-utils: specifier: ^4.0.0 version: 4.0.0 @@ -1530,7 +1570,7 @@ importers: version: 5.14.2 terser-webpack-plugin: specifier: 5.3.5 - version: 5.3.5(@swc/core@1.3.80)(esbuild@0.17.16)(webpack@5.88.2) + version: 5.3.5(@swc/core@1.3.85)(esbuild@0.17.16)(webpack@5.88.2) trusted-cert: specifier: 1.1.3 version: 1.1.3 @@ -1542,7 +1582,7 @@ importers: version: 1.5.1(patch_hash=eanypstkeladyqkfllfbryx6lu) webpack: specifier: 5.88.2 - version: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + version: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) webpack-bundle-analyzer: specifier: 4.5.0 version: 4.5.0 @@ -2224,26 +2264,26 @@ importers: dependencies: '@unocss/config': specifier: ^0.57.6 - version: 0.57.6 + version: 0.57.7 '@unocss/core': specifier: ^0.57.6 - version: 0.57.6 + version: 0.57.7 '@unocss/reset': specifier: ^0.57.6 - version: 0.57.6 + version: 0.57.7 '@unocss/webpack': specifier: ^0.57.6 - version: 0.57.6(webpack@5.88.2) + version: 0.57.7(webpack@5.88.2) unocss: specifier: ^0.57.6 - version: 0.57.6(@unocss/webpack@0.57.6)(postcss@8.4.31)(vite@3.2.5) + version: 0.57.7(@unocss/webpack@0.57.7)(postcss@8.4.31)(vite@3.2.5) devDependencies: '@ice/app': specifier: workspace:^ version: link:../ice '@nuxt/schema': specifier: ^3.8.1 - version: 3.8.2 + version: 3.9.0 packages/rax-compat: dependencies: @@ -2347,11 +2387,14 @@ importers: specifier: ^18.0.3 version: 18.0.11 react: - specifier: ^18.0.0 + specifier: ^18.2.0 version: 18.2.0 react-dom: - specifier: ^18.0.0 + specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-server-dom-webpack: + specifier: 18.3.0-canary-dd480ef92-20230822 + version: 18.3.0-canary-dd480ef92-20230822(react-dom@18.2.0)(react@18.2.0)(webpack@5.88.2) regenerator-runtime: specifier: ^0.13.9 version: 0.13.11 @@ -2372,7 +2415,7 @@ importers: version: 4.2.1 browserslist: specifier: ^4.22.1 - version: 4.22.1 + version: 4.22.2 consola: specifier: ^2.15.3 version: 2.15.3 @@ -2656,8 +2699,8 @@ packages: universal-transition: 1.1.1 dev: false - /@alifd/meet-react@2.9.7(rax@1.2.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OiIvw7XFwKNEUU2nOuwB/yoddrk118Dpagii7Hn9+vHxucrUuwfY00uY6pW/Z7MbwPwjQBJYiuCdFWHX/9ZFbQ==} + /@alifd/meet-react@2.9.8(rax@1.2.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rGzn1rXbMRhEEcs9Le6ZCYK6PPWtdmbMfIFx2M4P2JwH8erIfV95i7x24djHrMD4FxI45SO8aCxcVUrZoN/1SQ==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -2685,7 +2728,7 @@ packages: - rax dev: false - /@alifd/next@1.26.2(@alifd/meet-react@2.9.7)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0): + /@alifd/next@1.26.2(@alifd/meet-react@2.9.8)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qz7mJ50lMg3h4yWhV0uIJKzYV4O0zJGN/dZa6xU9+26Yu2VUKMECCcoxBRyiCXVdSNb3XPsLKE8/37R0fw8CGg==} peerDependencies: '@alifd/meet-react': ^2.0.0 @@ -2694,7 +2737,7 @@ packages: react-dom: '>=16.0.0' dependencies: '@alifd/field': 1.5.8 - '@alifd/meet-react': 2.9.7(rax@1.2.3)(react-dom@18.2.0)(react@18.2.0) + '@alifd/meet-react': 2.9.8(rax@1.2.3)(react-dom@18.2.0)(react@18.2.0) '@alifd/overlay': 0.2.12 '@alifd/validate': 1.2.3 babel-runtime: 6.26.0 @@ -2836,8 +2879,8 @@ packages: find-up: 5.0.0 dev: false - /@antfu/utils@0.7.6: - resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} + /@antfu/utils@0.7.7: + resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} dev: false /@applint/commitlint-config@1.0.2: @@ -2941,8 +2984,8 @@ packages: dependencies: '@babel/highlight': 7.18.6 - /@babel/code-frame@7.23.4: - resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.23.4 @@ -2952,8 +2995,8 @@ packages: resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} - /@babel/compat-data@7.23.3: - resolution: {integrity: sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} /@babel/core@7.12.9: @@ -2967,7 +3010,7 @@ packages: '@babel/parser': 7.18.10 '@babel/template': 7.20.7 '@babel/traverse': 7.18.10 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -3001,20 +3044,20 @@ packages: transitivePeerDependencies: - supports-color - /@babel/core@7.23.3: - resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} + /@babel/core@7.23.6: + resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) - '@babel/helpers': 7.23.4 - '@babel/parser': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helpers': 7.23.6 + '@babel/parser': 7.23.6 '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -3041,7 +3084,7 @@ packages: resolution: {integrity: sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 @@ -3054,11 +3097,11 @@ packages: '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 - /@babel/generator@7.23.4: - resolution: {integrity: sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==} + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 @@ -3073,7 +3116,7 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 dev: false /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: @@ -3081,7 +3124,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.0): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} @@ -3092,17 +3135,17 @@ packages: '@babel/compat-data': 7.21.0 '@babel/core': 7.21.0 '@babel/helper-validator-option': 7.21.0 - browserslist: 4.22.1 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.0 - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.3 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -3124,19 +3167,19 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.3): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + /@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.3) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 @@ -3179,7 +3222,7 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} @@ -3193,7 +3236,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} @@ -3205,19 +3248,19 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 /@babel/helper-member-expression-to-functions@7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 dev: false /@babel/helper-module-imports@7.18.6: @@ -3230,7 +3273,7 @@ packages: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} @@ -3247,13 +3290,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -3264,13 +3307,13 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 dev: false /@babel/helper-plugin-utils@7.10.4: @@ -3295,7 +3338,7 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color @@ -3308,17 +3351,17 @@ packages: '@babel/helper-optimise-call-expression': 7.18.6 '@babel/template': 7.20.7 '@babel/traverse': 7.21.2 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.3): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.6): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -3334,19 +3377,19 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 dev: false /@babel/helper-split-export-declaration@7.18.6: @@ -3359,7 +3402,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -3381,8 +3424,8 @@ packages: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} /@babel/helper-wrap-function@7.20.5: @@ -3392,7 +3435,7 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/template': 7.20.7 '@babel/traverse': 7.21.2 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 transitivePeerDependencies: - supports-color @@ -3406,13 +3449,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helpers@7.23.4: - resolution: {integrity: sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==} + /@babel/helpers@7.23.6: + resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/traverse': 7.23.4 - '@babel/types': 7.23.4 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color @@ -3446,12 +3489,12 @@ packages: dependencies: '@babel/types': 7.21.2 - /@babel/parser@7.23.4: - resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.23.6 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.0): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} @@ -3766,13 +3809,13 @@ packages: '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -3859,13 +3902,13 @@ packages: '@babel/core': 7.21.0 '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.3): + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 dev: false @@ -4039,14 +4082,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.3): + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) + '@babel/core': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: false @@ -4299,17 +4342,17 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-typescript@7.23.4(@babel/core@7.23.3): - resolution: {integrity: sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==} + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.3) + '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.3) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) dev: false /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.0): @@ -4455,18 +4498,18 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-typescript@7.23.3(@babel/core@7.23.3): + /@babel/preset-typescript@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-typescript': 7.23.4(@babel/core@7.23.3) + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) dev: false /@babel/regjsgen@0.8.0: @@ -4485,8 +4528,8 @@ packages: dependencies: regenerator-runtime: 0.13.11 - /@babel/standalone@7.23.4: - resolution: {integrity: sha512-cXT2Xi9YVJEi7kLjqoeZBXjrNt1PASOh4Zi3jp5yXT06Gt4ZeRETfYH9y5x3RQhFTpNxaA1300lzK1obiy6tcQ==} + /@babel/standalone@7.23.6: + resolution: {integrity: sha512-+AzS6BZwZdSosrgS/TiGDYLxtlefARKClWgJ4ql//XfmV9KbPWbkEekvbvDRJ8a6qog8E9j3CziHLz5dbIEMyw==} engines: {node: '>=6.9.0'} dev: true @@ -4502,9 +4545,9 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 /@babel/traverse@7.18.10: resolution: {integrity: sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==} @@ -4540,18 +4583,18 @@ packages: transitivePeerDependencies: - supports-color - /@babel/traverse@7.23.4: - resolution: {integrity: sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==} + /@babel/traverse@7.23.6: + resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.4 - '@babel/generator': 7.23.4 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.4 - '@babel/types': 7.23.4 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -4565,8 +4608,8 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@babel/types@7.23.4: - resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 @@ -6748,7 +6791,7 @@ packages: '@rollup/pluginutils': 4.2.1 '@swc/core': 1.3.32 acorn: 8.8.2 - autoprefixer: 10.4.13(postcss@8.4.31) + autoprefixer: 10.4.13(postcss@8.4.25) build-scripts: 2.1.0 cac: 6.7.14 chokidar: 3.5.3 @@ -6762,7 +6805,7 @@ packages: lodash.merge: 4.6.2 magic-string: 0.25.9 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.25 rollup: 2.79.1 rollup-plugin-styles: 4.0.0(rollup@2.79.1) rollup-plugin-visualizer: 5.9.0(rollup@2.79.1) @@ -6817,6 +6860,10 @@ packages: resolution: {integrity: sha512-06NtOUGVAUKP1eQXGMkaIZpNl9d5RK6SB6xQJsMY/DIso8WnwymyN7hmoFXPzX0eFkhmQEc7jzJ7NDBXaXRqWQ==} dev: false + /@ice/swc-plugin-react-server-component@0.1.1: + resolution: {integrity: sha512-3FdXOZ7HTBHY+DKQXDpzqV10ngfl0ifffc7HFV0P4YPLfvEJjT0RxIZJW1QwRZ3QeB2ph4zvXfdBG1lYTzT58Q==} + dev: false + /@ice/swc-plugin-remove-export@0.2.0: resolution: {integrity: sha512-kmyrCMtuEsS7J3rpENT5qUhhbuu3eldsN1WpJjtXX4rgogJ1+QmnAPjnhB0SWzr0/b5ArGfz83O6M+5NNGRd+A==} dev: false @@ -6840,11 +6887,11 @@ packages: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: false - /@iconify/utils@2.1.11: - resolution: {integrity: sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==} + /@iconify/utils@2.1.13: + resolution: {integrity: sha512-6uWvJIo715xYRy1KmCCyZYW0YYkLjaojEExoEkxpOHKhi9cyHW8hVKo+m8zrxzNVSqjUx9OuVRa2BWXeXfkp5A==} dependencies: '@antfu/install-pkg': 0.1.1 - '@antfu/utils': 0.7.6 + '@antfu/utils': 0.7.7 '@iconify/types': 2.0.0 debug: 4.3.4 kolorist: 1.8.0 @@ -7568,8 +7615,8 @@ packages: semver: 7.4.0 dev: true - /@nuxt/schema@3.8.2: - resolution: {integrity: sha512-AMpysQ/wHK2sOujLShqYdC4OSj/S3fFJGjhYXqA2g6dgmz+FNQWJRG/ie5sI9r2EX9Ela1wt0GN1jZR3wYNE8Q==} + /@nuxt/schema@3.9.0: + resolution: {integrity: sha512-NaRiq+g6XE4YOZLy7be2e6AmZCW0gfQWDM88TSfNr3Lypo+6PuY2VqzZLpSvOCNlW3CFj/kWtMdhool2BP0yIg==} engines: {node: ^14.18.0 || >=16.10.0} dependencies: '@nuxt/ui-templates': 1.3.1 @@ -7578,10 +7625,10 @@ packages: hookable: 5.5.3 pathe: 1.1.1 pkg-types: 1.0.3 - scule: 1.1.0 - std-env: 3.5.0 + scule: 1.1.1 + std-env: 3.7.0 ufo: 1.3.2 - unimport: 3.5.0 + unimport: 3.7.0 untyped: 1.4.0 transitivePeerDependencies: - rollup @@ -7628,13 +7675,17 @@ packages: react-refresh: 0.14.0 schema-utils: 3.1.1 source-map: 0.7.4 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) webpack-dev-server: 4.15.0(webpack@5.88.2) dev: true /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + /@polka/url@1.0.0-next.24: + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + dev: false + /@rc-component/context@1.3.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==} peerDependencies: @@ -8017,23 +8068,23 @@ packages: dependencies: '@rspack/binding': 0.4.3 '@swc/helpers': 0.5.1 - browserslist: 4.22.1 + browserslist: 4.22.2 compare-versions: 6.0.0-rc.1 enhanced-resolve: 5.12.0 fast-querystring: 1.1.2 graceful-fs: 4.2.10 - json-parse-even-better-errors: 3.0.0 + json-parse-even-better-errors: 3.0.1 neo-async: 2.6.2 react-refresh: 0.14.0 tapable: 2.2.1 terminal-link: 2.1.1 watchpack: 2.4.0 webpack-sources: 3.2.3 - zod: 3.22.3 - zod-validation-error: 1.3.1(zod@3.22.3) + zod: 3.22.4 + zod-validation-error: 1.3.1(zod@3.22.4) dev: true - /@rspack/dev-server@0.4.3(@rspack/core@0.4.3)(@swc/core@1.3.80)(esbuild@0.17.16)(react-refresh@0.14.0): + /@rspack/dev-server@0.4.3(@rspack/core@0.4.3)(@swc/core@1.3.85)(esbuild@0.17.16)(react-refresh@0.14.0): resolution: {integrity: sha512-qbggWEySoWdCrbWxqV+HX7nXgyT6qE3DqGtdYKzX9RLPp+RilXtnPlXtwY1AXNh8e0gYe1dMpvTcHYxeSglZSg==} peerDependencies: '@rspack/core': '*' @@ -8045,7 +8096,7 @@ packages: express: 4.18.1 http-proxy-middleware: 2.0.6(@types/express@4.17.17) mime-types: 2.1.35 - webpack: 5.76.0(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.76.0(@swc/core@1.3.85)(esbuild@0.17.16) webpack-dev-middleware: 6.0.2(webpack@5.76.0) webpack-dev-server: 4.13.1(webpack@5.76.0) ws: 8.8.1 @@ -8324,7 +8375,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 entities: 4.4.0 /@svgr/plugin-jsx@5.5.0: @@ -8413,8 +8464,8 @@ packages: dev: true optional: true - /@swc/core-darwin-arm64@1.3.80: - resolution: {integrity: sha512-rhoFTcQMUGfO7IkfOnopPSF6O0/aVJ58B7KueIKbvrMe6YvSfFj9QfObELFjYCcrJZTvUWBhig0QrsfPIiUphA==} + /@swc/core-darwin-arm64@1.3.85: + resolution: {integrity: sha512-jTikp+i4nO4Ofe6qGm4I3sFeebD1OvueBCHITux5tQKD6umN1c2z4CRGv6K49NIz/qEpUcdr6Qny6K+3yibVFQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -8430,8 +8481,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.80: - resolution: {integrity: sha512-0dOLedFpVXe+ugkKHXsqSxMKqvQYfFtibWbrZ7j8wOaErzSGPr0VpyWvepNVb9s046725kPXSw+fsGhqZR8wrw==} + /@swc/core-darwin-x64@1.3.85: + resolution: {integrity: sha512-3uHYkjVU+2F+YbVYtq5rH0uCJIztFTALaS3mQEfQUZKXZ5/8jD5titTCRqFKtSlQg0CzaFZgsYsuqwYBmgN0mA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -8447,8 +8498,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm-gnueabihf@1.3.80: - resolution: {integrity: sha512-QIjwP3PtDeHBDkwF6+ZZqdUsqAhORbMpxrw2jq3mHe4lQrxBttSFTq018vlMRo2mFEorOvXdadzaD9m+NymPrw==} + /@swc/core-linux-arm-gnueabihf@1.3.85: + resolution: {integrity: sha512-ouHzAHsFaEOkRuoTAOI/8n2m8BQAAnb4vr/xbMhhDOmix0lp5eNsW5Iac/EcJ2uG6B3n7P2K8oycj9SWkj+pfw==} engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -8464,8 +8515,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.80: - resolution: {integrity: sha512-cg8WriIueab58ZwkzXmIACnjSzFLzOBwxlC9k65gPXMNgCjab2YbqEYvAbjBqneuqaao02gW6tad2uhjgYaExw==} + /@swc/core-linux-arm64-gnu@1.3.85: + resolution: {integrity: sha512-/Z1CZOWiO+NqJEh1J20PIxQFHMH43upQJ1l7FJ5Z7+MyuYF8WkeJ7OSovau729pBR+38vvvccEJrMZIztfv7hQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -8481,8 +8532,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.80: - resolution: {integrity: sha512-AhdCQ7QKx5mWrtpaOA1mFRiWWvuiiUtspvo0QSpspDetRKTND1rlf/3UB5+gp0kCeCNUTsVmJWU7fIA9ICZtXA==} + /@swc/core-linux-arm64-musl@1.3.85: + resolution: {integrity: sha512-gfh7CfKavi076dbMBTzfdawSGcYfZ4+1Q+8aRkSesqepKHcIWIJti8Cf3zB4a6CHNhJe+VN0Gb7DEfumydAm1w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -8498,8 +8549,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.80: - resolution: {integrity: sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg==} + /@swc/core-linux-x64-gnu@1.3.85: + resolution: {integrity: sha512-lWVqjHKzofb9q1qrBM4dLqO7CIisp08/xMS5Hz9DWex1gTc5F2b6yJO6Ceqwa256GMweJcdP6A5EvEFQAiZ5dg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -8515,8 +8566,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.80: - resolution: {integrity: sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA==} + /@swc/core-linux-x64-musl@1.3.85: + resolution: {integrity: sha512-EPJmlfqC05TUetnlErxNRyIp7Nc3B2w9abET6oQ/EgldeAeQnZ3M6svMViET/c2QSomgrU3rdP+Qcozkt62/4A==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -8532,8 +8583,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.80: - resolution: {integrity: sha512-RKhatwiAGlffnF6z2Mm3Ddid0v3KB+uf5m/Gc7N9zO/EUAV0PnHRuYuZSGyqodHmGFC+mK8YrCooFCEmHL9n+w==} + /@swc/core-win32-arm64-msvc@1.3.85: + resolution: {integrity: sha512-ibckJDZw8kNosciMexwk0z75ZyUhwtiFMV9rSBpup0opa7NNCUCoERCJ1e9LRyMdhsVUoLpZg/KZiHCdTw96hQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -8549,8 +8600,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.80: - resolution: {integrity: sha512-3jiiZzU/kaw7k4zUp1yMq1QiUe4wJVtCEXIhf+fKuBsIwm7rdvyK/+PIx5KHnZy4TGQnYczKBRhJA5nuBcrUCQ==} + /@swc/core-win32-ia32-msvc@1.3.85: + resolution: {integrity: sha512-hY4MpHGUVQHL1T2kgRXOigDho4DTIpVPYzJ4uyy8VQRbS7GzN5XtvdGP/fA4zp8+2BQjcig+6J7Y92SY15ouNQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -8566,8 +8617,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.80: - resolution: {integrity: sha512-2eZtIoIWQBWqykfms92Zd37lveYOBWQTZjdooBGlsLHtcoQLkNpf1NXmR6TKY0yy8q6Yl3OhPvY+izjmO08MSg==} + /@swc/core-win32-x64-msvc@1.3.85: + resolution: {integrity: sha512-ktxWOMFJ0iqKn6WUHtXqi4CS7xkyHmrRtjllGRuGqxmLmDX/HSOfuQ55Tm1KXKk5oHLacJkUbOSF2kBrpZ8dpg==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -8591,8 +8642,8 @@ packages: '@swc/core-win32-x64-msvc': 1.3.32 dev: true - /@swc/core@1.3.80: - resolution: {integrity: sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw==} + /@swc/core@1.3.85: + resolution: {integrity: sha512-qnoxp+2O0GtvRdYnXgR1v8J7iymGGYpx6f6yCK9KxipOZOjrlKILFANYlghQxZyPUfXwK++TFxfSlX4r9wK+kg==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -8603,16 +8654,16 @@ packages: dependencies: '@swc/types': 0.1.4 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.80 - '@swc/core-darwin-x64': 1.3.80 - '@swc/core-linux-arm-gnueabihf': 1.3.80 - '@swc/core-linux-arm64-gnu': 1.3.80 - '@swc/core-linux-arm64-musl': 1.3.80 - '@swc/core-linux-x64-gnu': 1.3.80 - '@swc/core-linux-x64-musl': 1.3.80 - '@swc/core-win32-arm64-msvc': 1.3.80 - '@swc/core-win32-ia32-msvc': 1.3.80 - '@swc/core-win32-x64-msvc': 1.3.80 + '@swc/core-darwin-arm64': 1.3.85 + '@swc/core-darwin-x64': 1.3.85 + '@swc/core-linux-arm-gnueabihf': 1.3.85 + '@swc/core-linux-arm64-gnu': 1.3.85 + '@swc/core-linux-arm64-musl': 1.3.85 + '@swc/core-linux-x64-gnu': 1.3.85 + '@swc/core-linux-x64-musl': 1.3.85 + '@swc/core-win32-arm64-msvc': 1.3.85 + '@swc/core-win32-ia32-msvc': 1.3.85 + '@swc/core-win32-x64-msvc': 1.3.85 /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} @@ -8708,7 +8759,7 @@ packages: resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: '@babel/parser': 7.21.2 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.3 @@ -8724,7 +8775,7 @@ packages: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.21.2 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 dev: true /@types/babel__traverse@7.18.3: @@ -9180,12 +9231,12 @@ packages: /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - /@types/webpack-bundle-analyzer@4.6.0(@swc/core@1.3.80)(esbuild@0.17.16): + /@types/webpack-bundle-analyzer@4.6.0(@swc/core@1.3.85)(esbuild@0.17.16): resolution: {integrity: sha512-XeQmQCCXdZdap+A/60UKmxW5Mz31Vp9uieGlHB3T4z/o2OLVLtTI3bvTuS6A2OWd/rbAAQiGGWIEFQACu16szA==} dependencies: '@types/node': 18.14.6 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) transitivePeerDependencies: - '@swc/core' - esbuild @@ -9400,32 +9451,32 @@ packages: '@uni/action-sheet': 1.0.8 dev: false - /@unocss/astro@0.57.6(vite@3.2.5): - resolution: {integrity: sha512-7NIGMg9ZHlWWeZoOFzruKQh6sz+wKtRN8ioiAOxIYVtULCoazfjhfzhiWcmyiHWVgrZ0TyUep/nz5cRumNBrQw==} + /@unocss/astro@0.57.7(vite@3.2.5): + resolution: {integrity: sha512-X4KSBdrAADdtS4x7xz02b016xpRDt9mD/d/oq23HyZAZ+sZc4oZs8el9MLSUJgu2okdWzAE62lRRV/oc4HWI1A==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 peerDependenciesMeta: vite: optional: true dependencies: - '@unocss/core': 0.57.6 - '@unocss/reset': 0.57.6 - '@unocss/vite': 0.57.6(vite@3.2.5) + '@unocss/core': 0.57.7 + '@unocss/reset': 0.57.7 + '@unocss/vite': 0.57.7(vite@3.2.5) vite: 3.2.5(@types/node@17.0.45) transitivePeerDependencies: - rollup dev: false - /@unocss/cli@0.57.6: - resolution: {integrity: sha512-s6/TghesVk+0bKPBJ86gk9FI6EO8Jc9GyJ1/qNOxR5Q3O+EttYsptHuicY4pZXGFWsU7AnD6ZziixQiPHJGamw==} + /@unocss/cli@0.57.7: + resolution: {integrity: sha512-FZHTTBYyibySpBEPbA/ilDzI4v4Uy/bROItEYogZkpXNoCLzlclX+UcuFBXXLt6VFJk4WjLNFLRSQlVcCUUOLA==} engines: {node: '>=14'} hasBin: true dependencies: '@ampproject/remapping': 2.2.1 '@rollup/pluginutils': 5.1.0 - '@unocss/config': 0.57.6 - '@unocss/core': 0.57.6 - '@unocss/preset-uno': 0.57.6 + '@unocss/config': 0.57.7 + '@unocss/core': 0.57.7 + '@unocss/preset-uno': 0.57.7 cac: 6.7.14 chokidar: 3.5.3 colorette: 2.0.20 @@ -9438,174 +9489,174 @@ packages: - rollup dev: false - /@unocss/config@0.57.6: - resolution: {integrity: sha512-ZPWS2ju430xhtS1ZFNcuNhosuBwk9iSQEnhej9n7Qem6sr5odTxx7FqExb2eG4rjMyOIlwSInv+krg39xAAibg==} + /@unocss/config@0.57.7: + resolution: {integrity: sha512-UG8G9orWEdk/vyDvGUToXYn/RZy/Qjpx66pLsaf5wQK37hkYsBoReAU5v8Ia/6PL1ueJlkcNXLaNpN6/yVoJvg==} engines: {node: '>=14'} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 unconfig: 0.3.11 dev: false - /@unocss/core@0.57.6: - resolution: {integrity: sha512-rkqMX5Lyyl2u2PF2EMcH/QeFUAoiFeq5vnaGGYV2LVfTlDrEVx8CrNHlBmWr5fXrhyzXi366pK/ErJ2pepGiqg==} + /@unocss/core@0.57.7: + resolution: {integrity: sha512-1d36M0CV3yC80J0pqOa5rH1BX6g2iZdtKmIb3oSBN4AWnMCSrrJEPBrUikyMq2TEQTrYWJIVDzv5A9hBUat3TA==} dev: false - /@unocss/extractor-arbitrary-variants@0.57.6: - resolution: {integrity: sha512-I4/JpdF/2x4BnG+O6RQFRmfsI0UAJ6ik8Usw4zx2CQIdfTYxRJ4eU52jo5l8cm+YdDrXuiARRAEj6G96qHU3RQ==} + /@unocss/extractor-arbitrary-variants@0.57.7: + resolution: {integrity: sha512-JdyhPlsgS0x4zoF8WYXDcusPcpU4ysE6Rkkit4a9+xUZEvg7vy7InH6PQ8dL8B9oY7pbxF7G6eFguUDpv9xx4Q==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 dev: false - /@unocss/inspector@0.57.6: - resolution: {integrity: sha512-rNc4zX08PLeGHBtg+qxCSfPxtKuu4M0skaI6JLnHAR74KaVtmL0cE3+9K2PZbzHEy0iSbPzZQij+YlQ71Ic7yA==} + /@unocss/inspector@0.57.7: + resolution: {integrity: sha512-b9ckqn5aRsmhTdXJ5cPMKDKuNRe+825M+s9NbYcTjENnP6ellUFZo91sYF5S+LeATmU12TcwJZ83NChF4HpBSA==} dependencies: - '@unocss/core': 0.57.6 - '@unocss/rule-utils': 0.57.6 + '@unocss/core': 0.57.7 + '@unocss/rule-utils': 0.57.7 gzip-size: 6.0.0 - sirv: 2.0.3 + sirv: 2.0.4 dev: false - /@unocss/postcss@0.57.6(postcss@8.4.31): - resolution: {integrity: sha512-xpyr9OHZ59iYr/e0vGgqc4kDGJLbVAvysChfe2xCmfXf2hrqVWwcEYoeE3zW/6xnEDNxk6IQBml2xLjdS34haA==} + /@unocss/postcss@0.57.7(postcss@8.4.31): + resolution: {integrity: sha512-13c9p5ecTvYa6inDky++8dlVuxQ0JuKaKW5A0NW3XuJ3Uz1t8Pguji+NAUddfTYEFF6GHu47L3Aac7vpI8pMcQ==} engines: {node: '>=14'} peerDependencies: postcss: ^8.4.21 dependencies: - '@unocss/config': 0.57.6 - '@unocss/core': 0.57.6 - '@unocss/rule-utils': 0.57.6 + '@unocss/config': 0.57.7 + '@unocss/core': 0.57.7 + '@unocss/rule-utils': 0.57.7 css-tree: 2.3.1 fast-glob: 3.3.2 magic-string: 0.30.5 postcss: 8.4.31 dev: false - /@unocss/preset-attributify@0.57.6: - resolution: {integrity: sha512-3SK7Gn98WkhfvXFALEGvhGLH3jEKXluOQ8LBMR1eewULtXzIAv/YDpqaGV0aOb8gjw16RHDBsScVM1s9mHy7Dw==} + /@unocss/preset-attributify@0.57.7: + resolution: {integrity: sha512-vUqfwUokNHt1FJXIuVyj2Xze9LfJdLAy62h79lNyyEISZmiDF4a4hWTKLBe0d6Kyfr33DyXMmkLp57t5YW0V3A==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 dev: false - /@unocss/preset-icons@0.57.6: - resolution: {integrity: sha512-VC08C0QQ9MEEpMAXa6ffyZi6p7IoJ3UrphUQKjkTz0fvWBZ8NnlTGrw65R75nv4Cxos+2erOvJAOyMG9z7/z3g==} + /@unocss/preset-icons@0.57.7: + resolution: {integrity: sha512-s3AelKCS9CL1ArP1GanYv0XxxPrcFi+XOuQoQCwCRHDo2CiBEq3fLLMIhaUCFEWGtIy7o7wLeL5BRjMvJ2QnMg==} dependencies: - '@iconify/utils': 2.1.11 - '@unocss/core': 0.57.6 + '@iconify/utils': 2.1.13 + '@unocss/core': 0.57.7 ofetch: 1.3.3 transitivePeerDependencies: - supports-color dev: false - /@unocss/preset-mini@0.57.6: - resolution: {integrity: sha512-oOrtP9Wbm5cjokx9o2j/LhwRFB39whVVU1DDXllHyC0TGCXUd6gpmKwg8mePWkWWv0iM7v8EufCU4xCfNmazxQ==} + /@unocss/preset-mini@0.57.7: + resolution: {integrity: sha512-YPmmh+ZIg4J7/nPMfvzD1tOfUFD+8KEFXX9ISRteooflYeosn2YytGW66d/sq97AZos9N630FJ//DvPD2wfGwA==} dependencies: - '@unocss/core': 0.57.6 - '@unocss/extractor-arbitrary-variants': 0.57.6 - '@unocss/rule-utils': 0.57.6 + '@unocss/core': 0.57.7 + '@unocss/extractor-arbitrary-variants': 0.57.7 + '@unocss/rule-utils': 0.57.7 dev: false - /@unocss/preset-tagify@0.57.6: - resolution: {integrity: sha512-o0nSjCshTTn0QhrJsJpPM5PWshpRMJH0vGSRSiSlkJ/hveRFQLwcf2fWNPI2wNTgX0P7pVCUtrda2XbCLnwVrg==} + /@unocss/preset-tagify@0.57.7: + resolution: {integrity: sha512-va25pTJ5OtbqCHFBIj8myVk0PwuSucUqTx840r/YSHka0P9th6UGRS1LU30OUgjgr7FhLaWXtJMN4gkCUtQSoA==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 dev: false - /@unocss/preset-typography@0.57.6: - resolution: {integrity: sha512-ETMmtxjJbc7VHfKprQD2wj92daQQQ5/oQFBtT7afbelcKTuTa/WfLeJkWdp7Fgf4qZGqAHYoZWYcyKTquxwojw==} + /@unocss/preset-typography@0.57.7: + resolution: {integrity: sha512-1QuoLhqHVRs+baaVvfH54JxmJhVuBp5jdVw3HCN/vXs1CSnq2Rm/C/+PahcnQg/KLtoW6MgK5S+/hU9TCxGRVQ==} dependencies: - '@unocss/core': 0.57.6 - '@unocss/preset-mini': 0.57.6 + '@unocss/core': 0.57.7 + '@unocss/preset-mini': 0.57.7 dev: false - /@unocss/preset-uno@0.57.6: - resolution: {integrity: sha512-9OQiXA5+B876u7nv4bsJpDHNIvXyw+lKAYowCcKXB6YuVFHz10BFhv0EIgRkwoIiZ60oj0ng/MFrvj4LXH74ag==} + /@unocss/preset-uno@0.57.7: + resolution: {integrity: sha512-yRKvRBaPLmDSUZet5WnV1WNb3BV4EFwvB1Zbvlc3lyVp6uCksP/SYlxuUwht7JefOrfiY2sGugoBxZTyGmj/kQ==} dependencies: - '@unocss/core': 0.57.6 - '@unocss/preset-mini': 0.57.6 - '@unocss/preset-wind': 0.57.6 - '@unocss/rule-utils': 0.57.6 + '@unocss/core': 0.57.7 + '@unocss/preset-mini': 0.57.7 + '@unocss/preset-wind': 0.57.7 + '@unocss/rule-utils': 0.57.7 dev: false - /@unocss/preset-web-fonts@0.57.6: - resolution: {integrity: sha512-IXCXQOm/RVbpuo6uHxlW+nYEgU4H4NRIl7lL7QDawEh3u5oY6s/JwOQZE0DQqulG9sfdXhH9e8gokcqfZdQy+g==} + /@unocss/preset-web-fonts@0.57.7: + resolution: {integrity: sha512-wBPej5GeYb0D/xjMdMmpH6k/3Oe1ujx9DJys2/gtvl/rsBZpSkoWcnl+8Z3bAhooDnwL2gkJCIlpuDiRNtKvGA==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 ofetch: 1.3.3 dev: false - /@unocss/preset-wind@0.57.6: - resolution: {integrity: sha512-RE5Qlm7PVlzDjqk6AxuJDZYWArpH1VGf6ikfcN5/DRqEXDpAx1F0WYprhs2l9GYa66jBaenSITJQS4xoR5+yHw==} + /@unocss/preset-wind@0.57.7: + resolution: {integrity: sha512-olQ6+w0fQ84eEC1t7SF4vJyKcyawkDWSRF5YufOqeQZL3zjqBzMQi+3PUlKCstrDO1DNZ3qdcwg1vPHRmuX9VA==} dependencies: - '@unocss/core': 0.57.6 - '@unocss/preset-mini': 0.57.6 - '@unocss/rule-utils': 0.57.6 + '@unocss/core': 0.57.7 + '@unocss/preset-mini': 0.57.7 + '@unocss/rule-utils': 0.57.7 dev: false - /@unocss/reset@0.57.6: - resolution: {integrity: sha512-AUk/XSegAX91qhNpS82t3Cd1MuyOy8xgLzkU7iEDbU4EPh94/mOY/Ebj7AFGMGtOAe47AE6vTyAMRL3YglVuyQ==} + /@unocss/reset@0.57.7: + resolution: {integrity: sha512-oN9024WVrMewGbornnAPIpzHeKPIfVmZ5IsZGilWR761TnI5jTjHUkswsVoFx7tZdpCN2/bqS3JK/Ah0aot3NQ==} dev: false - /@unocss/rule-utils@0.57.6: - resolution: {integrity: sha512-EHsSitEVdADh0SOs3MCioYXojgshlhMwo+zMthmXCQMBispOR70rVYUr8QqqyWBKLt948rbqCxVl3DIXrwYnxA==} + /@unocss/rule-utils@0.57.7: + resolution: {integrity: sha512-gLqbKTIetvRynLkhonu1znr+bmWnw+Cl3dFVNgZPGjiqGHd78PGS0gXQKvzuyN0iO2ADub1A7GlCWs826iEHjA==} engines: {node: '>=14'} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 magic-string: 0.30.5 dev: false - /@unocss/scope@0.57.6: - resolution: {integrity: sha512-0Zk0GZIwhu7yPBRFjaFjI2zBBFs9crQLe69xLeHfaTSbIYtbM7PI3gAmnGetljrI8njb/zMKf+gby8SaXAlf/w==} + /@unocss/scope@0.57.7: + resolution: {integrity: sha512-pqWbKXcrTJ2ovVRTYFLnUX5ryEhdSXp7YfyBQT3zLtQb4nQ2XZcLTvGdWo7F+9jZ09yP7NdHscBLkeWgx+mVgw==} dev: false - /@unocss/transformer-attributify-jsx-babel@0.57.6: - resolution: {integrity: sha512-Ki0R/vCH/xONd12PIo4+iC4u1pN4cs7HcdyX8P3yxJ92SV7u7awtTRAOgAvK8W59Wgh02WX8dHI8bNBmDouSAQ==} + /@unocss/transformer-attributify-jsx-babel@0.57.7: + resolution: {integrity: sha512-CqxTiT5ikOC6R/HNyBcCIVYUfeazqRbsw7X4hYKmGHO7QsnaKQFWZTpj+sSDRh3oHq+IDtcD6KB2anTEffEQNA==} dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.3) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.3) - '@unocss/core': 0.57.6 + '@babel/core': 7.23.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.6) + '@unocss/core': 0.57.7 transitivePeerDependencies: - supports-color dev: false - /@unocss/transformer-attributify-jsx@0.57.6: - resolution: {integrity: sha512-SwyCKMTPvsXsR3B0l8FoRT1gUhrmG3SCxoskUb/s64l6fdBlfM8h+H4kPiepRbp99E04xGG5tIxxaBTTMeA+Gg==} + /@unocss/transformer-attributify-jsx@0.57.7: + resolution: {integrity: sha512-FpCJM+jDN4Kyp7mMMN41tTWEq6pHKAXAyJoW1GwhYw6lLu9cwyXnne6t7rQ11EPU95Z2cIEMpIJo8reDkDaiPg==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 dev: false - /@unocss/transformer-compile-class@0.57.6: - resolution: {integrity: sha512-IEpfuL4Kp+xJunr3GJ+qa5Xr4EOq3RTfmw1CDWsVrSb6pF7JgYSMahxc2knQ5SzgBQKTnW8vc2E0dHGOF+FIVQ==} + /@unocss/transformer-compile-class@0.57.7: + resolution: {integrity: sha512-D+PyD7IOXUm/lzzoCt/yon0Gh1fIK9iKeSBvB6/BREF/ejscNzQ/ia0Pq0pid2cVvOULCSo0z2sO9zljsQtv9A==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 dev: false - /@unocss/transformer-directives@0.57.6: - resolution: {integrity: sha512-V0mdQuq08fvOrRHxKtwFTia3WtXqRqPiSxoZ0wBoOM05ChKUEc7/CdPv4FZNOtC0PvDi+BT5L3IQs35r6FZAiQ==} + /@unocss/transformer-directives@0.57.7: + resolution: {integrity: sha512-m0n7WqU3o+1Vyh1uaeU7H4u5gJqakkRqZqTq3MR3xLCSVfORJ/5XO8r+t6VUkJtaLxcIrtYE2geAbwmGV3zSKA==} dependencies: - '@unocss/core': 0.57.6 - '@unocss/rule-utils': 0.57.6 + '@unocss/core': 0.57.7 + '@unocss/rule-utils': 0.57.7 css-tree: 2.3.1 dev: false - /@unocss/transformer-variant-group@0.57.6: - resolution: {integrity: sha512-6W/fitUZdwluyndV2wU4gnU9ykY8P82W3IYt7koufPI8AtO4wJnYFQoxK6aAO+74aYoFbJ2Pr00rhWKwGmyOwQ==} + /@unocss/transformer-variant-group@0.57.7: + resolution: {integrity: sha512-O5L5Za0IZtOWd2R66vy0k07pLlB9rCIybmUommUqKWpvd1n/pg8czQ5EkmNDprINvinKObVlGVuY4Uq/JsLM0A==} dependencies: - '@unocss/core': 0.57.6 + '@unocss/core': 0.57.7 dev: false - /@unocss/vite@0.57.6(vite@3.2.5): - resolution: {integrity: sha512-sVVKhFCYDFCR+In8HXJ5ddnD+OnFw/3BcLoV3aRvIloojkDCG8rUywxS67TNu40LBZ8E+emFMcreDCFpwqphDA==} + /@unocss/vite@0.57.7(vite@3.2.5): + resolution: {integrity: sha512-SbJrRgfc35MmgMBlHaEK4YpJVD2B0bmxH9PVgHRuDae/hOEOG0VqNP0f2ijJtX9HG3jOpQVlbEoGnUo8jsZtsw==} peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 dependencies: '@ampproject/remapping': 2.2.1 '@rollup/pluginutils': 5.1.0 - '@unocss/config': 0.57.6 - '@unocss/core': 0.57.6 - '@unocss/inspector': 0.57.6 - '@unocss/scope': 0.57.6 - '@unocss/transformer-directives': 0.57.6 + '@unocss/config': 0.57.7 + '@unocss/core': 0.57.7 + '@unocss/inspector': 0.57.7 + '@unocss/scope': 0.57.7 + '@unocss/transformer-directives': 0.57.7 chokidar: 3.5.3 fast-glob: 3.3.2 magic-string: 0.30.5 @@ -9614,15 +9665,15 @@ packages: - rollup dev: false - /@unocss/webpack@0.57.6(webpack@5.88.2): - resolution: {integrity: sha512-1qOSQmEWf4qgOoTMtZ7Ldn4bX+mkHxeXdizTPZ9j6p3jNh1OvXj5Egxc/Rbn96AgdfAmFoNYduXFNSg2BtGOPg==} + /@unocss/webpack@0.57.7(webpack@5.88.2): + resolution: {integrity: sha512-EyMDKx6ZW7huNSoIWUFMY7l2iuke4x9dlG90W9IGUR3+KIO+ZHjByUIrtBWsWiFT5ysywSBTauLYKRDfU4+6eg==} peerDependencies: webpack: ^4 || ^5 dependencies: '@ampproject/remapping': 2.2.1 '@rollup/pluginutils': 5.1.0 - '@unocss/config': 0.57.6 - '@unocss/core': 0.57.6 + '@unocss/config': 0.57.7 + '@unocss/core': 0.57.7 chokidar: 3.5.3 fast-glob: 3.3.2 magic-string: 0.30.5 @@ -9940,20 +9991,12 @@ packages: acorn-walk: 8.2.0 dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.2): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.2 - /acorn-import-assertions@1.9.0(acorn@8.8.2): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: acorn: 8.8.2 - dev: true /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -9962,6 +10005,12 @@ packages: dependencies: acorn: 8.8.2 + /acorn-loose@8.3.0: + resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.8.2 + /acorn-node@1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: @@ -10499,6 +10548,22 @@ packages: hasBin: true dev: false + /autoprefixer@10.4.13(postcss@8.4.25): + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001571 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.25 + postcss-value-parser: 4.2.0 + dev: true + /autoprefixer@10.4.13(postcss@8.4.31): resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} @@ -10506,8 +10571,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001564 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001571 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -10647,7 +10712,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@babel/template': 7.20.7 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: true @@ -10657,7 +10722,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.20.7 - '@babel/types': 7.23.4 + '@babel/types': 7.21.2 '@types/babel__core': 7.20.0 '@types/babel__traverse': 7.18.3 dev: true @@ -10963,15 +11028,15 @@ packages: node-releases: 2.0.10 update-browserslist-db: 1.0.10(browserslist@4.21.5) - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001564 - electron-to-chromium: 1.4.593 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001571 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -11170,16 +11235,16 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001564 + browserslist: 4.22.2 + caniuse-lite: 1.0.30001571 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 /caniuse-lite@1.0.30001462: resolution: {integrity: sha512-PDd20WuOBPiasZ7KbFnmQRyuLE7cFXW2PVd7dmALzbkUXEP46upAuCDm9eY9vho8fgNMGmbAX92QBZHzcnWIqw==} - /caniuse-lite@1.0.30001564: - resolution: {integrity: sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==} + /caniuse-lite@1.0.30001571: + resolution: {integrity: sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==} /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -11523,6 +11588,7 @@ packages: /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false /combine-promises@1.1.0: resolution: {integrity: sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==} @@ -11731,7 +11797,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.1 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /copy-webpack-plugin@11.0.0(webpack@5.88.2): @@ -11751,7 +11817,7 @@ packages: /core-js-compat@3.29.0: resolution: {integrity: sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==} dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 /core-js-pure@3.29.0: resolution: {integrity: sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==} @@ -11919,7 +11985,7 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.31) postcss-value-parser: 4.2.0 semver: 7.3.8 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /css-loader@6.7.3(webpack@5.88.2): @@ -11964,7 +12030,7 @@ packages: schema-utils: 4.0.0 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.88.2): @@ -12763,8 +12829,8 @@ packages: /electron-to-chromium@1.4.322: resolution: {integrity: sha512-KovjizNC9XB7dno/2GjxX8VS0SlfPpCjtyoKft+bCO+UfD8bFy16hY4Sh9s0h9BDxbRH2U0zX5VBjpM1LTcNlg==} - /electron-to-chromium@1.4.593: - resolution: {integrity: sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==} + /electron-to-chromium@1.4.616: + resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==} /emittery@0.10.2: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} @@ -13660,7 +13726,7 @@ packages: micromatch: 4.0.5 normalize-path: 3.0.0 schema-utils: 3.1.1 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /eslint@8.35.0: @@ -13751,6 +13817,12 @@ packages: /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.0 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -14293,7 +14365,7 @@ packages: semver: 7.3.8 tapable: 2.2.1 typescript: 4.9.5 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /form-data@2.3.3: @@ -14924,7 +14996,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.14.2 + terser: 5.16.5 /html-minifier@4.0.0: resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} @@ -16724,8 +16796,8 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - /json-parse-even-better-errors@3.0.0: - resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + /json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} /json-schema-traverse@0.4.1: @@ -16875,7 +16947,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.2 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /less@4.1.2: @@ -17427,7 +17499,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /mini-css-extract-plugin@2.7.2(webpack@5.88.2): @@ -17609,6 +17681,11 @@ packages: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} + /mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + dev: false + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -17688,8 +17765,8 @@ packages: dependencies: lodash: 4.17.21 - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} + /node-fetch-native@1.6.1: + resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} dev: false /node-fetch@2.6.7: @@ -17719,8 +17796,8 @@ packages: /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -17892,7 +17969,7 @@ packages: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} dependencies: destr: 2.0.2 - node-fetch-native: 1.4.1 + node-fetch-native: 1.6.1 ufo: 1.3.2 dev: false @@ -18369,7 +18446,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.31 @@ -18381,7 +18458,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.31 postcss-value-parser: 4.2.0 @@ -18612,7 +18689,7 @@ packages: klona: 2.0.6 postcss: 8.4.31 semver: 7.3.8 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /postcss-loader@7.0.2(postcss@8.4.31)(webpack@5.88.2): @@ -18676,7 +18753,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.31) postcss: 8.4.31 @@ -18708,7 +18785,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 cssnano-utils: 3.1.0(postcss@8.4.31) postcss: 8.4.31 postcss-value-parser: 4.2.0 @@ -18865,7 +18942,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.31 postcss-value-parser: 4.2.0 @@ -18958,7 +19035,7 @@ packages: '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.31) '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.31) autoprefixer: 10.4.13(postcss@8.4.31) - browserslist: 4.21.5 + browserslist: 4.22.2 css-blank-pseudo: 3.0.3(postcss@8.4.31) css-has-pseudo: 3.0.4(postcss@8.4.31) css-prefers-color-scheme: 6.0.3(postcss@8.4.31) @@ -19020,7 +19097,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 caniuse-api: 3.0.0 postcss: 8.4.31 @@ -19134,6 +19211,15 @@ packages: source-map: 0.6.1 dev: false + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} @@ -20431,7 +20517,7 @@ packages: dependencies: '@babel/code-frame': 7.18.6 address: 1.2.2 - browserslist: 4.22.1 + browserslist: 4.22.2 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 @@ -20479,6 +20565,16 @@ packages: react: 18.2.0 scheduler: 0.23.0 + /react-dom@18.3.0-canary-dd480ef92-20230822(react@18.3.0-canary-dd480ef92-20230822): + resolution: {integrity: sha512-xAUst7w1A+Cupsv8x9pT/hZ8VmkA4UwZixUVMiay2keN9oRY8f0xvQTcwXgFgOH6wqgsoT2KPpmm6Yf8QMik5g==} + peerDependencies: + react: 18.3.0-canary-dd480ef92-20230822 + dependencies: + loose-envify: 1.4.0 + react: 18.3.0-canary-dd480ef92-20230822 + scheduler: 0.24.0-canary-dd480ef92-20230822 + dev: true + /react-error-overlay@6.0.11: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} @@ -20668,6 +20764,38 @@ packages: '@remix-run/router': 1.7.2 react: 18.2.0 + /react-server-dom-webpack@18.3.0-canary-dd480ef92-20230822(react-dom@18.2.0)(react@18.2.0)(webpack@5.88.2): + resolution: {integrity: sha512-vBIBAkrOMrqZZGKgjSY9ly82YgZrmQgK4OOMBfMD5ZpAl58eifQFF18ZtVYNX9sLdPPi4MrizYfGjMaS9fP2VQ==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: 18.3.0-canary-dd480ef92-20230822 + react-dom: 18.3.0-canary-dd480ef92-20230822 + webpack: ^5.59.0 + dependencies: + acorn-loose: 8.3.0 + loose-envify: 1.4.0 + neo-async: 2.6.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + webpack: 5.88.2 + dev: true + + /react-server-dom-webpack@18.3.0-canary-dd480ef92-20230822(react-dom@18.3.0-canary-dd480ef92-20230822)(react@18.3.0-canary-dd480ef92-20230822)(webpack@5.88.2): + resolution: {integrity: sha512-vBIBAkrOMrqZZGKgjSY9ly82YgZrmQgK4OOMBfMD5ZpAl58eifQFF18ZtVYNX9sLdPPi4MrizYfGjMaS9fP2VQ==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: 18.3.0-canary-dd480ef92-20230822 + react-dom: 18.3.0-canary-dd480ef92-20230822 + webpack: ^5.59.0 + dependencies: + acorn-loose: 8.3.0 + loose-envify: 1.4.0 + neo-async: 2.6.2 + react: 18.3.0-canary-dd480ef92-20230822 + react-dom: 18.3.0-canary-dd480ef92-20230822(react@18.3.0-canary-dd480ef92-20230822) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) + dev: true + /react-textarea-autosize@8.4.0(@types/react@17.0.53)(react@17.0.2): resolution: {integrity: sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==} engines: {node: '>=10'} @@ -20709,6 +20837,13 @@ packages: dependencies: loose-envify: 1.4.0 + /react@18.3.0-canary-dd480ef92-20230822: + resolution: {integrity: sha512-12tBLcvl+cSvREyeKgGfv7k9R22nxNIjIaExcPTYtPCEoefaagzuW8v3jFFSgZNw/XGg57bivIQVkj8ImVvnvg==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: true + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: @@ -21303,7 +21438,7 @@ packages: klona: 2.0.6 neo-async: 2.6.2 sass: 1.50.0 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /sass@1.50.0: @@ -21342,6 +21477,12 @@ packages: dependencies: loose-envify: 1.4.0 + /scheduler@0.24.0-canary-dd480ef92-20230822: + resolution: {integrity: sha512-6hp1jChwe5RNdfVyA8rXw28CdPh7/hVGALqjwNwpaVrTM0SdPHy0Hes6Rqon1c9qKfUrQFhds+C+0fNMgy9hRw==} + dependencies: + loose-envify: 1.4.0 + dev: true + /schema-utils@2.7.0: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} @@ -21409,8 +21550,8 @@ packages: compute-scroll-into-view: 3.0.3 dev: false - /scule@1.1.0: - resolution: {integrity: sha512-vRUjqhyM/YWYzT+jsMk6tnl3NkY4A4soJ8uyh3O6Um+JXEQL9ozUCe7pqrxn3CSKokw0hw3nFStfskzpgYwR0g==} + /scule@1.1.1: + resolution: {integrity: sha512-sHtm/SsIK9BUBI3EFT/Gnp9VoKfY6QLvlkvAE6YK7454IF8FSgJEAnJpVdSC7K5/pjI5NfxhzBLW2JAfYA/shQ==} dev: true /section-matter@1.0.0: @@ -21622,12 +21763,12 @@ packages: mrmime: 1.0.1 totalist: 1.1.0 - /sirv@2.0.3: - resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + /sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.21 - mrmime: 1.0.1 + '@polka/url': 1.0.0-next.24 + mrmime: 2.0.0 totalist: 3.0.1 dev: false @@ -21907,8 +22048,8 @@ packages: /std-env@3.3.2: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - /std-env@3.5.0: - resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true /stealthy-require@1.1.1: @@ -22090,7 +22231,7 @@ packages: /strip-literal@0.4.2: resolution: {integrity: sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==} dependencies: - acorn: 8.11.2 + acorn: 8.8.2 dev: true /strip-literal@1.3.0: @@ -22131,7 +22272,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 postcss: 8.4.31 postcss-selector-parser: 6.0.11 @@ -22410,7 +22551,7 @@ packages: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - /terser-webpack-plugin@5.3.5(@swc/core@1.3.80)(esbuild@0.17.16)(webpack@5.76.0): + /terser-webpack-plugin@5.3.5(@swc/core@1.3.85)(esbuild@0.17.16)(webpack@5.76.0): resolution: {integrity: sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -22427,16 +22568,16 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.17 - '@swc/core': 1.3.80 + '@swc/core': 1.3.85 esbuild: 0.17.16 jest-worker: 27.5.1 schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.14.2 - webpack: 5.76.0(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.76.0(@swc/core@1.3.85)(esbuild@0.17.16) dev: true - /terser-webpack-plugin@5.3.5(@swc/core@1.3.80)(esbuild@0.17.16)(webpack@5.88.2): + /terser-webpack-plugin@5.3.5(@swc/core@1.3.85)(esbuild@0.17.16)(webpack@5.88.2): resolution: {integrity: sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -22453,13 +22594,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.17 - '@swc/core': 1.3.80 + '@swc/core': 1.3.85 esbuild: 0.17.16 jest-worker: 27.5.1 schema-utils: 3.1.1 serialize-javascript: 6.0.1 terser: 5.14.2 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /terser-webpack-plugin@5.3.5(esbuild@0.17.16)(webpack@5.76.0): @@ -22507,10 +22648,10 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 - terser: 5.14.2 + terser: 5.16.5 webpack: 5.88.2 - /terser-webpack-plugin@5.3.7(@swc/core@1.3.80)(esbuild@0.17.16)(webpack@5.88.2): + /terser-webpack-plugin@5.3.7(@swc/core@1.3.85)(esbuild@0.17.16)(webpack@5.88.2): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -22527,13 +22668,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.17 - '@swc/core': 1.3.80 + '@swc/core': 1.3.85 esbuild: 0.17.16 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.16.5 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) /terser-webpack-plugin@5.3.7(esbuild@0.17.16)(webpack@5.86.0): resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} @@ -22617,6 +22758,7 @@ packages: acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 + dev: true /terser@5.16.5: resolution: {integrity: sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==} @@ -22624,7 +22766,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.11.2 + acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 @@ -22806,7 +22948,7 @@ packages: - supports-color dev: true - /ts-jest@28.0.8(@babel/core@7.23.3)(jest@28.1.3)(typescript@4.9.5): + /ts-jest@28.0.8(@babel/core@7.21.0)(jest@28.1.3)(typescript@4.9.5): resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -22827,7 +22969,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.3 + '@babel/core': 7.21.0 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 28.1.3(@types/node@17.0.45) @@ -22860,7 +23002,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 17.0.45 - acorn: 8.11.2 + acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -23068,7 +23210,7 @@ packages: /unconfig@0.3.11: resolution: {integrity: sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==} dependencies: - '@antfu/utils': 0.7.6 + '@antfu/utils': 0.7.7 defu: 6.1.3 jiti: 1.21.0 mlly: 1.4.2 @@ -23121,18 +23263,20 @@ packages: trough: 1.0.5 vfile: 4.2.1 - /unimport@3.5.0: - resolution: {integrity: sha512-0Ei1iTeSYxs7oxxUf79/KaBc2dPjZxe7qdVpw7yIz5YcdTZjmBYO6ToLDW+fX9QOHiueZ3xtwb5Z/wqaSfXx6A==} + /unimport@3.7.0: + resolution: {integrity: sha512-vesCVjU3CYk41UZNY10kwii7l77vcP4IxPbBMgpve+vean7g7zJWrcCqSoG7u0eB9LZ5bM5BP+3vr3W2uYk0Yg==} dependencies: '@rollup/pluginutils': 5.1.0 + acorn: 8.11.2 escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.5 mlly: 1.4.2 pathe: 1.1.1 pkg-types: 1.0.3 - scule: 1.1.0 + scule: 1.1.1 strip-literal: 1.3.0 unplugin: 1.5.1(patch_hash=eanypstkeladyqkfllfbryx6lu) transitivePeerDependencies: @@ -23293,11 +23437,11 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - /unocss@0.57.6(@unocss/webpack@0.57.6)(postcss@8.4.31)(vite@3.2.5): - resolution: {integrity: sha512-z3a4Z8lGRVawr2A/1U0FuP1M9tuT6bs2RcIJ6kLBz5FC/XlLTGtUek6sadrKA0IMq7RWkgDRhdt8xQV0lh6TaA==} + /unocss@0.57.7(@unocss/webpack@0.57.7)(postcss@8.4.31)(vite@3.2.5): + resolution: {integrity: sha512-Z99ZZPkbkjIUXEM7L+K/7Y5V5yqUS0VigG7ZIFzLf/npieKmXHKlrPyvQWFQaf3OqooMFuKBQivh75TwvSOkcQ==} engines: {node: '>=14'} peerDependencies: - '@unocss/webpack': 0.57.6 + '@unocss/webpack': 0.57.7 vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 peerDependenciesMeta: '@unocss/webpack': @@ -23305,27 +23449,27 @@ packages: vite: optional: true dependencies: - '@unocss/astro': 0.57.6(vite@3.2.5) - '@unocss/cli': 0.57.6 - '@unocss/core': 0.57.6 - '@unocss/extractor-arbitrary-variants': 0.57.6 - '@unocss/postcss': 0.57.6(postcss@8.4.31) - '@unocss/preset-attributify': 0.57.6 - '@unocss/preset-icons': 0.57.6 - '@unocss/preset-mini': 0.57.6 - '@unocss/preset-tagify': 0.57.6 - '@unocss/preset-typography': 0.57.6 - '@unocss/preset-uno': 0.57.6 - '@unocss/preset-web-fonts': 0.57.6 - '@unocss/preset-wind': 0.57.6 - '@unocss/reset': 0.57.6 - '@unocss/transformer-attributify-jsx': 0.57.6 - '@unocss/transformer-attributify-jsx-babel': 0.57.6 - '@unocss/transformer-compile-class': 0.57.6 - '@unocss/transformer-directives': 0.57.6 - '@unocss/transformer-variant-group': 0.57.6 - '@unocss/vite': 0.57.6(vite@3.2.5) - '@unocss/webpack': 0.57.6(webpack@5.88.2) + '@unocss/astro': 0.57.7(vite@3.2.5) + '@unocss/cli': 0.57.7 + '@unocss/core': 0.57.7 + '@unocss/extractor-arbitrary-variants': 0.57.7 + '@unocss/postcss': 0.57.7(postcss@8.4.31) + '@unocss/preset-attributify': 0.57.7 + '@unocss/preset-icons': 0.57.7 + '@unocss/preset-mini': 0.57.7 + '@unocss/preset-tagify': 0.57.7 + '@unocss/preset-typography': 0.57.7 + '@unocss/preset-uno': 0.57.7 + '@unocss/preset-web-fonts': 0.57.7 + '@unocss/preset-wind': 0.57.7 + '@unocss/reset': 0.57.7 + '@unocss/transformer-attributify-jsx': 0.57.7 + '@unocss/transformer-attributify-jsx-babel': 0.57.7 + '@unocss/transformer-compile-class': 0.57.7 + '@unocss/transformer-directives': 0.57.7 + '@unocss/transformer-variant-group': 0.57.7 + '@unocss/vite': 0.57.7(vite@3.2.5) + '@unocss/webpack': 0.57.7(webpack@5.88.2) vite: 3.2.5(@types/node@17.0.45) transitivePeerDependencies: - postcss @@ -23343,7 +23487,7 @@ packages: acorn: 8.11.2 chokidar: 3.5.3 webpack-sources: 3.2.3 - webpack-virtual-modules: 0.6.0 + webpack-virtual-modules: 0.6.1 patched: true /unquote@1.1.1: @@ -23354,13 +23498,13 @@ packages: resolution: {integrity: sha512-Egkr/s4zcMTEuulcIb7dgURS6QpN7DyqQYdf+jBtiaJvQ+eRsrtWUoX84SbvQWuLkXsOjM+8sJC9u6KoMK/U7Q==} hasBin: true dependencies: - '@babel/core': 7.23.3 - '@babel/standalone': 7.23.4 - '@babel/types': 7.23.4 + '@babel/core': 7.23.6 + '@babel/standalone': 7.23.6 + '@babel/types': 7.23.6 defu: 6.1.3 jiti: 1.21.0 mri: 1.2.0 - scule: 1.1.0 + scule: 1.1.1 transitivePeerDependencies: - supports-color dev: true @@ -23375,13 +23519,13 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /update-browserslist-db@1.0.13(browserslist@4.22.1): + /update-browserslist-db@1.0.13(browserslist@4.22.2): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.1 + browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 @@ -23851,7 +23995,7 @@ packages: hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.11.2 + acorn: 8.8.2 acorn-walk: 8.2.0 chalk: 4.1.2 commander: 7.2.0 @@ -23875,7 +24019,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.76.0(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.76.0(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /webpack-dev-middleware@5.3.3(webpack@5.86.0): @@ -23903,7 +24047,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) /webpack-dev-middleware@6.0.2(webpack@5.76.0): resolution: {integrity: sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ==} @@ -23914,12 +24058,12 @@ packages: webpack: optional: true dependencies: - colorette: 2.0.20 + colorette: 2.0.19 memfs: 3.4.13 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.76.0(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.76.0(@swc/core@1.3.85)(esbuild@0.17.16) dev: true /webpack-dev-server@4.13.1(webpack@5.76.0): @@ -23945,7 +24089,7 @@ packages: ansi-html-community: 0.0.8 bonjour-service: 1.1.0 chokidar: 3.5.3 - colorette: 2.0.20 + colorette: 2.0.19 compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 @@ -23963,7 +24107,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.76.0(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.76.0(@swc/core@1.3.85)(esbuild@0.17.16) webpack-dev-middleware: 5.3.3(webpack@5.76.0) ws: 8.13.0 transitivePeerDependencies: @@ -24116,7 +24260,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.17.16) + webpack: 5.88.2(@swc/core@1.3.85)(esbuild@0.17.16) webpack-dev-middleware: 5.3.3(webpack@5.88.2) ws: 8.13.0 transitivePeerDependencies: @@ -24144,10 +24288,10 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack-virtual-modules@0.6.0: - resolution: {integrity: sha512-KnaMTE6EItz/f2q4Gwg5/rmeKVi79OR58NoYnwDJqCk9ywMtTGbBnBcfoBtN4QbYu0lWXvyMoH2Owxuhe4qI6Q==} + /webpack-virtual-modules@0.6.1: + resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} - /webpack@5.76.0(@swc/core@1.3.80)(esbuild@0.17.16): + /webpack@5.76.0(@swc/core@1.3.85)(esbuild@0.17.16): resolution: {integrity: sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==} engines: {node: '>=10.13.0'} hasBin: true @@ -24162,9 +24306,9 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.1 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 es-module-lexer: 0.9.3 @@ -24178,7 +24322,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.5(@swc/core@1.3.80)(esbuild@0.17.16)(webpack@5.76.0) + terser-webpack-plugin: 5.3.5(@swc/core@1.3.85)(esbuild@0.17.16)(webpack@5.76.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -24202,9 +24346,9 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.1 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 es-module-lexer: 0.9.3 @@ -24244,7 +24388,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.5 acorn: 8.8.2 acorn-import-assertions: 1.9.0(acorn@8.8.2) - browserslist: 4.22.1 + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.2.1 @@ -24282,8 +24426,8 @@ packages: '@webassemblyjs/ast': 1.11.5 '@webassemblyjs/wasm-edit': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 @@ -24306,7 +24450,7 @@ packages: - esbuild - uglify-js - /webpack@5.88.2(@swc/core@1.3.80)(esbuild@0.17.16): + /webpack@5.88.2(@swc/core@1.3.85)(esbuild@0.17.16): resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -24321,9 +24465,9 @@ packages: '@webassemblyjs/ast': 1.11.5 '@webassemblyjs/wasm-edit': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.21.5 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.2.1 @@ -24337,7 +24481,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.7(@swc/core@1.3.80)(esbuild@0.17.16)(webpack@5.88.2) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.85)(esbuild@0.17.16)(webpack@5.88.2) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -24360,9 +24504,9 @@ packages: '@webassemblyjs/ast': 1.11.5 '@webassemblyjs/wasm-edit': 1.11.5 '@webassemblyjs/wasm-parser': 1.11.5 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.21.5 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.2.1 @@ -24772,26 +24916,26 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zod-validation-error@1.2.0(zod@3.22.3): + /zod-validation-error@1.2.0(zod@3.22.4): resolution: {integrity: sha512-laJkD/ugwEh8CpuH+xXv5L9Z+RLz3lH8alNxolfaHZJck611OJj97R4Rb+ZqA7WNly2kNtTo4QwjdjXw9scpiw==} engines: {node: ^14.17 || >=16.0.0} peerDependencies: zod: ^3.18.0 dependencies: - zod: 3.22.3 + zod: 3.22.4 dev: false - /zod-validation-error@1.3.1(zod@3.22.3): + /zod-validation-error@1.3.1(zod@3.22.4): resolution: {integrity: sha512-cNEXpla+tREtNdAnNKY4xKY1SGOn2yzyuZMu4O0RQylX9apRpUjNcPkEc3uHIAr5Ct7LenjZt6RzjEH6+JsqVQ==} engines: {node: '>=16.0.0'} peerDependencies: zod: ^3.18.0 dependencies: - zod: 3.22.3 + zod: 3.22.4 dev: true - /zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} /zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}