From a01db9e051e662e82e8c765f54c370a2ea7ebf44 Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sun, 2 Jul 2023 16:17:06 +0800 Subject: [PATCH 1/8] add test for markdown, oulineInfo and hmr --- .../use-theme-doc/__tests__/hmr.spec.ts | 51 +++++++++++++++++++ .../use-theme-doc/pages/Counter.tsx | 15 ++++++ .../use-theme-doc/pages/md-test1$.md | 6 +++ test-setup/utils/fsUtils.ts | 11 +++- 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 packages/playground/use-theme-doc/pages/Counter.tsx diff --git a/packages/playground/use-theme-doc/__tests__/hmr.spec.ts b/packages/playground/use-theme-doc/__tests__/hmr.spec.ts index 3f994ebc..caa6e8bf 100644 --- a/packages/playground/use-theme-doc/__tests__/hmr.spec.ts +++ b/packages/playground/use-theme-doc/__tests__/hmr.spec.ts @@ -77,6 +77,57 @@ test('hmr: edit file (md static data notation)', async ({ ).toHaveCount(0) }) +test('hmr: edit md file content', async ({ page, fsUtils, testPlayground }) => { + // prepare locators first + const headingBeforeEdit = page + .locator('.markdown-body') + .getByRole('heading', { name: 'Heading one', exact: true }) + const headingAfterEdit = page + .locator('.markdown-body') + .getByRole('heading', { name: 'Heading edited', exact: true }) + // Also check the table-of-content + const outlineLinkBeforeEdit = page + .locator('.vp-local-outline') + .getByRole('link', { name: 'Heading one', exact: true }) + const outlineLinkAfterEdit = page + .locator('.vp-local-outline') + .getByRole('link', { name: 'Heading edited', exact: true }) + const counter = page.locator('.markdown-body').getByTestId('counter') + const counterStateText = counter.locator('span') + const counterButton = counter.getByRole('button', { name: 'add count' }) + + page.locator('.vp-local-sider >> text="Markdown Test Page1"').click() + await page.waitForURL('/md-test1') + + // initial state + await expect(headingBeforeEdit).toHaveCount(1) + await expect(headingAfterEdit).toHaveCount(0) + await expect(outlineLinkBeforeEdit).toHaveCount(1) + await expect(outlineLinkAfterEdit).toHaveCount(0) + // update component state + await expect(counterStateText).toHaveText('Counter component: 0.') + await counterButton.click() + await expect(counterStateText).toHaveText('Counter component: 1.') + + fsUtils.editFile('pages/md-test1$.md', (str) => { + return str.replace('# Heading one', '# Heading edited') + }) + + await expect(headingBeforeEdit).toHaveCount(0) + await expect(headingAfterEdit).toHaveCount(1) + await expect(outlineLinkBeforeEdit).toHaveCount(0) + await expect(outlineLinkAfterEdit).toHaveCount(1) + await expect(counterStateText).toHaveText('Counter component: 1.') + + await testPlayground.restore() + + await expect(headingBeforeEdit).toHaveCount(1) + await expect(headingAfterEdit).toHaveCount(0) + await expect(outlineLinkBeforeEdit).toHaveCount(1) + await expect(outlineLinkAfterEdit).toHaveCount(0) + await expect(counterStateText).toHaveText('Counter component: 1.') +}) + test('hmr: delete file, add file', async ({ page, fsUtils }) => { const page2FileContent = fsUtils.readFile('pages/page2$.md') await expect( diff --git a/packages/playground/use-theme-doc/pages/Counter.tsx b/packages/playground/use-theme-doc/pages/Counter.tsx new file mode 100644 index 00000000..97e12598 --- /dev/null +++ b/packages/playground/use-theme-doc/pages/Counter.tsx @@ -0,0 +1,15 @@ +import React, { useState } from 'react' + +interface Props {} + +const Counter: React.FC = (props) => { + const [count, setCount] = useState(0) + return ( +
+ Counter component: {count}. + +
+ ) +} + +export default Counter diff --git a/packages/playground/use-theme-doc/pages/md-test1$.md b/packages/playground/use-theme-doc/pages/md-test1$.md index 52e8da20..4a6ee5f6 100644 --- a/packages/playground/use-theme-doc/pages/md-test1$.md +++ b/packages/playground/use-theme-doc/pages/md-test1$.md @@ -2,6 +2,12 @@ > markdown render test data from: https://github.com/fullpipe/markdown-test-page/blob/master/test-page.md +# Counter + +import Counter from './Counter'; + + + # Heading one Sint sit cillum pariatur eiusmod nulla pariatur ipsum. Sit laborum anim qui mollit tempor pariatur nisi minim dolor. Aliquip et adipisicing sit sit fugiat commodo id sunt. Nostrud enim ad commodo incididunt cupidatat in ullamco ullamco Lorem cupidatat velit enim et Lorem. Ut laborum cillum laboris fugiat culpa sint irure do reprehenderit culpa occaecat. Exercitation esse mollit tempor magna aliqua in occaecat aliquip veniam reprehenderit nisi dolor in laboris dolore velit. diff --git a/test-setup/utils/fsUtils.ts b/test-setup/utils/fsUtils.ts index a8ab06b1..88663d5a 100644 --- a/test-setup/utils/fsUtils.ts +++ b/test-setup/utils/fsUtils.ts @@ -38,9 +38,16 @@ export async function setupActualTestPlayground( path.resolve(copyTo, subPath), { dereference: false, - filter(file) { + async filter(file, dest) { file = file.replace(/\\/g, '/') - return !file.includes('__tests__') + if (file.includes('__tests__')) return false + if ((await fs.stat(file)).isFile()) { + // don't overwrite when file content is same + const contentBuff1 = await fs.readFile(file) + const contentBuff2 = await fs.readFile(dest) + if (contentBuff1.equals(contentBuff2)) return false + } + return true }, } ) From 155a571ad7bbcc25d7bd0d6c4f737753e7ee8e50 Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sat, 1 Jul 2023 17:15:48 +0800 Subject: [PATCH 2/8] mdx output should be transformed by vite-plugin-react TODO: wait for https://github.com/vitejs/vite-plugin-react/pull/188 to be published and bump the dep version --- packages/react-pages/package.json | 1 + packages/react-pages/src/node/index.ts | 78 ++++++++---------------- pnpm-lock.yaml | 83 +------------------------- 3 files changed, 30 insertions(+), 132 deletions(-) diff --git a/packages/react-pages/package.json b/packages/react-pages/package.json index f764b9f6..ba7d3a84 100644 --- a/packages/react-pages/package.json +++ b/packages/react-pages/package.json @@ -67,6 +67,7 @@ }, "dependencies": { "@mdx-js/rollup": "^2.3.0", + "@vitejs/plugin-react": "4.0.1", "chalk": "^4.1.2", "chokidar": "^3.5.1", "dequal": "^2.0.3", diff --git a/packages/react-pages/src/node/index.ts b/packages/react-pages/src/node/index.ts index a11fff88..d570848f 100644 --- a/packages/react-pages/src/node/index.ts +++ b/packages/react-pages/src/node/index.ts @@ -1,6 +1,6 @@ import * as path from 'path' import type { PluggableList } from 'unified' -import type { Plugin, IndexHtmlTransformContext } from 'vite' +import type { Plugin, IndexHtmlTransformContext, PluginOption } from 'vite' import type { OutputPlugin } from 'rollup' import type { staticSiteGenerationConfig } from './types' @@ -269,21 +269,36 @@ function moveScriptTagToBodyEnd( export default async function setupPlugins( vpConfig: PluginConfig = {} -): Promise { +): Promise { // use dynamic import so that it supports node commonjs const mdx = await import('@mdx-js/rollup') + const mdxPlugin = mdx.default({ + remarkPlugins: await getRemarkPlugins(), + rehypePlugins: await getRehypePlugins(), + // treat .md as mdx + mdExtensions: [], + mdxExtensions: ['.md', '.mdx'], + providerImportSource: '@mdx-js/react', + }) + const { default: pluginReactForMdx } = await import('@vitejs/plugin-react') return [ - mdx.default({ - remarkPlugins: await getRemarkPlugins(), - rehypePlugins: await getRehypePlugins(), - // treat .md as mdx - mdExtensions: [], - mdxExtensions: ['.md', '.mdx'], - providerImportSource: '@mdx-js/react', + { + ...mdxPlugin, + enforce: 'pre', + }, + // add hmr ability to .md and .mdx files + // https://github.com/vitejs/vite-plugin-react/issues/38 + // https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md#400-2023-04-20 + // this react plugin is only used to handle mdx output + // users can aplly another @vitejs/plugin-react or @vitejs/plugin-react-swc on their side (to transform normal .jsx files) + pluginReactForMdx({ + include: /\.mdx?$/, + // TODO: after https://github.com/vitejs/vite-plugin-react/pull/188 is published + // the next line will not be needed + jsxRuntime: 'classic', }), - createMdxTransformPlugin(), pluginFactory(vpConfig), - ] as Plugin[] + ] } function getRemarkPlugins(): Promise { @@ -307,47 +322,6 @@ function getRehypePlugins(): Promise { ]) } -/** - * use @vitejs/plugin-react to handle the output of @mdx-js/rollup - * workaround this issue: https://github.com/vitejs/vite-plugin-react/issues/38 - */ -function createMdxTransformPlugin(): Plugin { - let vitePluginReactTrasnform: Plugin['transform'] | undefined - return { - name: 'vite-pages:mdx-transform', - configResolved: ({ plugins }) => { - // find this plugin to call it's transform function: - // https://github.com/vitejs/vite-plugin-react/blob/b647e74c38565696bd6fb931b8bd9ac7f3bebe88/packages/plugin-react/src/index.ts#L206 - vitePluginReactTrasnform = plugins.find( - (p) => - p.name === 'vite:react-babel' && typeof p.transform === 'function' - )?.transform - if (!vitePluginReactTrasnform) { - throw new Error( - `Can't find an instance of @vitejs/plugin-react. You should apply this plugin to make mdx work.` - ) - } - }, - transform: (code, id, options) => { - const [filepath, querystring = ''] = id.split('?') - if ( - filepath.match(/\.mdx?$/) && - !id.startsWith(OUTLINE_INFO_MODULE_ID_PREFIX) - ) { - // make @vitejs/plugin-react treat the "output of @mdx-js/rollup transform" like a jsx file - // https://github.com/vitejs/vite-plugin-react/blob/b647e74c38565696bd6fb931b8bd9ac7f3bebe88/packages/plugin-react/src/index.ts#L215 - let newId - if (querystring) { - newId = id + '&ext=.jsx' - } else { - newId = id + '?ext=.jsx' - } - return (vitePluginReactTrasnform as any)(code, newId, options) - } - }, - } -} - /** * Some chunk filenames may start with `_`, which will be treated as special resource by github pages. So we need to disable jekyll of github pages. * https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fcd3f9e5..e1fa9419 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -499,6 +499,9 @@ importers: '@mdx-js/rollup': specifier: ^2.3.0 version: 2.3.0(rollup@3.25.1) + '@vitejs/plugin-react': + specifier: ^4.0.1 + version: 4.0.1(vite@4.3.9) chalk: specifier: ^4.1.2 version: 4.1.2 @@ -719,7 +722,6 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 - dev: true /@ant-design/colors@7.0.0: resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==} @@ -790,12 +792,10 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.5 - dev: true /@babel/compat-data@7.22.5: resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} engines: {node: '>=6.9.0'} - dev: true /@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} @@ -818,7 +818,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /@babel/generator@7.22.5: resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} @@ -828,7 +827,6 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 - dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} @@ -859,7 +857,6 @@ packages: browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.0 - dev: true /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} @@ -921,7 +918,6 @@ packages: /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} @@ -929,14 +925,12 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.5 - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - dev: true /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} @@ -957,7 +951,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - dev: true /@babel/helper-module-transforms@7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} @@ -973,7 +966,6 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} @@ -985,7 +977,6 @@ packages: /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==} @@ -1024,7 +1015,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} @@ -1038,7 +1028,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - dev: true /@babel/helper-string-parser@7.18.10: resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} @@ -1048,7 +1037,6 @@ packages: /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} @@ -1058,12 +1046,10 @@ packages: /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-wrap-function@7.22.5: resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} @@ -1086,7 +1072,6 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color - dev: true /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} @@ -1095,7 +1080,6 @@ packages: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true /@babel/parser@7.22.5: resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} @@ -1103,7 +1087,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.5 - dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} @@ -1997,7 +1980,6 @@ packages: dependencies: '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} @@ -2010,7 +1992,6 @@ packages: dependencies: '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} @@ -2381,7 +2362,6 @@ packages: '@babel/code-frame': 7.22.5 '@babel/parser': 7.22.5 '@babel/types': 7.22.5 - dev: true /@babel/traverse@7.22.5: resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} @@ -2399,7 +2379,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.19.0: resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} @@ -2417,7 +2396,6 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - dev: true /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -2445,7 +2423,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.17.19: @@ -2454,7 +2431,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.17.19: @@ -2463,7 +2439,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.17.19: @@ -2472,7 +2447,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.17.19: @@ -2481,7 +2455,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.17.19: @@ -2490,7 +2463,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.17.19: @@ -2499,7 +2471,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.17.19: @@ -2508,7 +2479,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.17.19: @@ -2517,7 +2487,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.17.19: @@ -2526,7 +2495,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.17.19: @@ -2535,7 +2503,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.17.19: @@ -2544,7 +2511,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.17.19: @@ -2553,7 +2519,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.17.19: @@ -2562,7 +2527,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.17.19: @@ -2571,7 +2535,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.17.19: @@ -2580,7 +2543,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.17.19: @@ -2589,7 +2551,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.17.19: @@ -2598,7 +2559,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.17.19: @@ -2607,7 +2567,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.17.19: @@ -2616,7 +2575,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.17.19: @@ -2625,7 +2583,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.17.19: @@ -2634,7 +2591,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@gwhitney/detect-indent@7.0.1: @@ -3272,7 +3228,6 @@ packages: /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -3322,7 +3277,6 @@ packages: vite: 4.3.9(@types/node@18.15.11)(sass@1.63.6) transitivePeerDependencies: - supports-color - dev: true /@zeit/schemas@2.29.0: resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==} @@ -3420,7 +3374,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -3704,7 +3657,6 @@ packages: electron-to-chromium: 1.4.439 node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.9) - dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -3747,7 +3699,6 @@ packages: /caniuse-lite@1.0.30001507: resolution: {integrity: sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==} - dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3766,7 +3717,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -3891,7 +3841,6 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3901,7 +3850,6 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -3992,7 +3940,6 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true /copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} @@ -4272,7 +4219,6 @@ packages: /electron-to-chromium@1.4.439: resolution: {integrity: sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg==} - dev: true /email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -4346,17 +4292,14 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} @@ -4602,7 +4545,6 @@ packages: /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - dev: true /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -4681,7 +4623,6 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - dev: true /globby@13.2.0: resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} @@ -4721,7 +4662,6 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -4847,7 +4787,6 @@ packages: /immutable@4.3.0: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} - dev: true /import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} @@ -5130,7 +5069,6 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -5154,7 +5092,6 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -5337,7 +5274,6 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -6235,7 +6171,6 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: true /ndjson@2.0.0: resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} @@ -6277,7 +6212,6 @@ packages: /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} - dev: true /node-releases@2.0.5: resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} @@ -6529,7 +6463,6 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -6965,7 +6898,6 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: true /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} @@ -7693,7 +7625,6 @@ packages: /react-refresh@0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} - dev: true /react-router-dom@6.13.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-6Nqoqd7fgwxxVGdbiMHTpDHCYPq62d7Wk1Of7B82vH7ZPwwsRaIa22zRZKPPg413R5REVNiyuQPKDG1bubcOFA==} @@ -8081,7 +8012,6 @@ packages: chokidar: 3.5.3 immutable: 4.3.0 source-map-js: 1.0.2 - dev: true /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -8117,7 +8047,6 @@ packages: /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - dev: true /semver@7.5.3: resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} @@ -8239,7 +8168,6 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - dev: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -8421,7 +8349,6 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -8502,7 +8429,6 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -8710,7 +8636,6 @@ packages: browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -8807,7 +8732,6 @@ packages: sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 - dev: true /wait-on@6.0.1: resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} @@ -8892,7 +8816,6 @@ packages: /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} From f4bb04d0deb446da78d6b0aed1bc64f0bd10da7d Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sun, 2 Jul 2023 14:50:14 +0800 Subject: [PATCH 3/8] fix hmr update of outlineInfo outlineInfo module is now self-accepting; fix ProxyModulesManager update cb triggered when first loaded. --- packages/react-pages/client.rollup.config.js | 92 +++++++++++-------- packages/react-pages/src/client/state.ts | 20 ++-- .../virtual-module/ProxyModulesManager.ts | 29 ++++-- .../outline-info-module/index.tsx | 22 ++++- packages/theme-doc/src/Layout/Outline.tsx | 23 ++++- 5 files changed, 124 insertions(+), 62 deletions(-) diff --git a/packages/react-pages/client.rollup.config.js b/packages/react-pages/client.rollup.config.js index 23907d08..1656514f 100644 --- a/packages/react-pages/client.rollup.config.js +++ b/packages/react-pages/client.rollup.config.js @@ -9,46 +9,60 @@ bundle client modules to reduce browser request during dev also prevent conflict npm packages with users (like jotai) */ -export default { - input: [ - 'src/client/entries/csr.tsx', - 'src/client/entries/ssg-client.tsx', - 'src/client/entries/ssg-server.tsx', - ], - output: { - dir: 'dist/client-bundles/entries', - entryFileNames: `[name].mjs`, - format: 'esm', - sourcemap: true, +export default [ + { + input: [ + 'src/client/entries/ssg-client.tsx', + 'src/client/entries/ssg-server.tsx', + ], + ...config(), }, - external: [], - plugins: [ - { - name: 'client-external', - resolveId(source, importer) { - if (source.startsWith('/@react-pages/')) { - return { - id: source, - external: 'absolute', + // 1. stand alone bundle for dev, without code spliting. To reduce request waterfall + // 2. `hoistTransitiveImports` will add import (like `import '/@react-pages/pages'`) to the entry, which will mess up the hmr handling, so turn it off + { + input: ['src/client/entries/csr.tsx'], + ...config({ hoistTransitiveImports: false }), + }, +] + +function config({ hoistTransitiveImports } = {}) { + return { + output: { + dir: 'dist/client-bundles/entries', + entryFileNames: `[name].mjs`, + format: 'esm', + sourcemap: true, + hoistTransitiveImports, + }, + external: [], + plugins: [ + { + name: 'client-external', + resolveId(source, importer) { + if (source.startsWith('/@react-pages/')) { + return { + id: source, + external: 'absolute', + } } - } + }, }, - }, - resolve({ - // prevent bundling unexpected deps - resolveOnly: ['jotai'], - extensions, - }), - commonjs(), - babel({ - babelHelpers: 'bundled', - extensions, - presets: [ - '@babel/preset-typescript', - ['@babel/preset-react', { runtime: 'automatic' }], - ], - plugins: [], - configFile: false, - }), - ], + resolve({ + // prevent bundling unexpected deps + resolveOnly: ['jotai'], + extensions, + }), + commonjs(), + babel({ + babelHelpers: 'bundled', + extensions, + presets: [ + '@babel/preset-typescript', + ['@babel/preset-react', { runtime: 'automatic' }], + ], + plugins: [], + configFile: false, + }), + ], + } } diff --git a/packages/react-pages/src/client/state.ts b/packages/react-pages/src/client/state.ts index 2ee98a5c..85acdc61 100644 --- a/packages/react-pages/src/client/state.ts +++ b/packages/react-pages/src/client/state.ts @@ -60,15 +60,15 @@ if (import.meta.hot) { setPages?.(module.default) }) - let setAllPagesOutlines: SetAtom | undefined - import.meta.hot!.accept('/@react-pages/allPagesOutlines', (module) => { - // console.log('@@hot update /@react-pages/allPagesOutlines', module) - if (!module) { - console.error('unexpected hot module', module) - return - } - setAllPagesOutlines?.(module) - }) + // let setAllPagesOutlines: SetAtom | undefined + // import.meta.hot!.accept('/@react-pages/allPagesOutlines', (module) => { + // // console.log('@@hot update /@react-pages/allPagesOutlines', module) + // if (!module) { + // console.error('unexpected hot module', module) + // return + // } + // setAllPagesOutlines?.(module) + // }) const pagesAtom = atom(initialPages) const pagePathsAtom = atom(initialPagePaths.sort()) @@ -164,7 +164,7 @@ if (import.meta.hot) { useAllPagesOutlines = (timeout: number) => { const [data, set] = useAtom(allPagesOutlinesAtom) - setAllPagesOutlines = set + // setAllPagesOutlines = set useEffect(() => { setTimeout(() => { import('/@react-pages/allPagesOutlines').then((mod) => { diff --git a/packages/react-pages/src/node/utils/virtual-module/ProxyModulesManager.ts b/packages/react-pages/src/node/utils/virtual-module/ProxyModulesManager.ts index 0714bfb8..99ad0a1c 100644 --- a/packages/react-pages/src/node/utils/virtual-module/ProxyModulesManager.ts +++ b/packages/react-pages/src/node/utils/virtual-module/ProxyModulesManager.ts @@ -7,7 +7,8 @@ import { File, VirtualModulesManager } from '.' */ export class ProxyModulesManager { private vmm = new VirtualModulesManager() - private register: { [proxyModuleId: string]: boolean } = {} + private register: Map = + new Map() constructor(public readonly proxyModulePrefix: string) { if (!proxyModulePrefix) @@ -28,12 +29,12 @@ export class ProxyModulesManager { key?: string ) { const proxyModuleId = this.getProxyModuleId(sourceFilePath, key) - if (this.register[proxyModuleId]) return proxyModuleId + if (this.register.has(proxyModuleId)) return proxyModuleId this.vmm.addFSWatcher('', [sourceFilePath], async (file, api) => { const proxyModuleData = await getProxyModuleData(file) api.addModuleData(proxyModuleId, proxyModuleData) }) - this.register[proxyModuleId] = true + this.register.set(proxyModuleId, { loaded: false, sourceFilePath }) return proxyModuleId } @@ -54,17 +55,29 @@ export class ProxyModulesManager { ) ) res(moduleData[0]) + // set loaded flag after a timeout to avoid some race condition + // (onProxyModuleUpdate cb is triggered before this load event) + setTimeout(() => { + const registerItem = this.register.get(proxyModuleId) + if (registerItem && !registerItem.loaded) { + this.register.set(proxyModuleId, { ...registerItem, loaded: true }) + } + }, 50) }) }) } /** - * emit event when a proxyModule has been updated + * emit event when a proxyModule is updated since loaded */ onProxyModuleUpdate( cb: (proxyModuleId: string, data: any[], prevData: any[]) => void ) { this.vmm.addModuleListener((proxyModuleId, data, prevData) => { + const registerItem = this.register.get(proxyModuleId) + const notLoaded = registerItem && !registerItem.loaded + // bail out if this is the first-load event + if (notLoaded && prevData.length === 0) return cb(proxyModuleId, data, prevData) }) } @@ -73,13 +86,17 @@ export class ProxyModulesManager { this.vmm.close() } - getProxyModuleId(sourceFilePath: string, key?: string) { + private getProxyModuleId(sourceFilePath: string, key?: string) { let prefix = this.proxyModulePrefix if (key) prefix += `--${key}--` return prefix + sourceFilePath } isProxyModuleId(id: string) { - return id.startsWith(this.proxyModulePrefix) && this.register[id] + return id.startsWith(this.proxyModulePrefix) && this.register.has(id) + } + + getSourceFilePath(id: string) { + return this.register.get(id)?.sourceFilePath } } diff --git a/packages/react-pages/src/node/virtual-module-plugins/outline-info-module/index.tsx b/packages/react-pages/src/node/virtual-module-plugins/outline-info-module/index.tsx index 79e87334..40724c60 100644 --- a/packages/react-pages/src/node/virtual-module-plugins/outline-info-module/index.tsx +++ b/packages/react-pages/src/node/virtual-module-plugins/outline-info-module/index.tsx @@ -24,9 +24,7 @@ export class OutlineInfoModuleManager { }) } - isProxyModuleId(id: string) { - return this.pmm.isProxyModuleId(id) - } + isProxyModuleId = this.pmm.isProxyModuleId.bind(this.pmm) async loadProxyModule(proxyModuleId: string) { const data = await this.pmm.getProxyModuleData(proxyModuleId) @@ -34,7 +32,23 @@ export class OutlineInfoModuleManager { if (!outline) throw new Error(`assertion fail: invalid outline data: ${proxyModuleId}`) - return `export const outline = ${JSON.stringify(outline)};` + return `export const outline = ${JSON.stringify(outline)}; +export let onUpdate; +if (import.meta.hot) { + const d = import.meta.hot.data; + if (!d.listeners) d.listeners = []; + onUpdate = (cb) => { + d.listeners.push(cb); + return () => { + d.listeners = d.listeners.filter(l => l !== cb); + } + }; + import.meta.hot.accept((_newMod) => { + const newMod = {..._newMod, onUpdate: undefined}; + d.listeners.forEach((cb) => cb(newMod)); + }) +} +` } onUpdate(cb: (reloadPath: string) => void) { diff --git a/packages/theme-doc/src/Layout/Outline.tsx b/packages/theme-doc/src/Layout/Outline.tsx index 188c7919..d13317ec 100644 --- a/packages/theme-doc/src/Layout/Outline.tsx +++ b/packages/theme-doc/src/Layout/Outline.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useContext } from 'react' +import React, { useMemo, useContext, useEffect, useState } from 'react' import { Anchor } from 'antd' import type { AnchorProps } from 'antd' @@ -12,13 +12,30 @@ interface Props {} const OutLine: React.FC = (props) => { const { loadedData, loadState } = useThemeCtx() const pageData = loadedData[loadState.routePath] + const [outline, setOutline] = useState( + () => pageData?.outlineInfo?.outline + ) + + if (import.meta.hot) { + // subscribe to outline info hmr update + useEffect(() => { + const cur = pageData?.outlineInfo?.outline + setOutline(cur) + const unsub = pageData?.outlineInfo?.onUpdate?.((newMod: any) => { + const cur = newMod?.outline + setOutline(cur) + }) + return () => { + unsub?.() + } + }, [pageData]) + } const data = useMemo(() => { - const outline: OutlineItem[] | undefined = pageData?.outlineInfo?.outline // should not render OutLine if there is only one heading if (!Array.isArray(outline) || outline.length < 2) return null return buildTree(outline) - }, [pageData]) + }, [outline]) const layoutCtxVal = useContext(LayoutContext) const isSmallScreen = !layoutCtxVal.screenWidth?.md From 1c6df285cbda702b2c58e570eed4c327bcb85848 Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sun, 2 Jul 2023 16:25:30 +0800 Subject: [PATCH 4/8] chore: update lock --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1fa9419..f1020e37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -500,7 +500,7 @@ importers: specifier: ^2.3.0 version: 2.3.0(rollup@3.25.1) '@vitejs/plugin-react': - specifier: ^4.0.1 + specifier: 4.0.1 version: 4.0.1(vite@4.3.9) chalk: specifier: ^4.1.2 From b3b7f70f1f8edb47a3be4596656e04cc7ebc626e Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Tue, 4 Jul 2023 15:31:21 +0800 Subject: [PATCH 5/8] fix playwright report not showing stdout/stderr --- test-setup/utils/startServer.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/test-setup/utils/startServer.ts b/test-setup/utils/startServer.ts index b93716be..eb6afbf3 100644 --- a/test-setup/utils/startServer.ts +++ b/test-setup/utils/startServer.ts @@ -69,8 +69,15 @@ export async function startServer( // in killProcess() detached: !isWindows, }) - subprocess.stdout?.pipe(process.stdout) - subprocess.stderr?.pipe(process.stderr) + if (!subprocess.stdout || !subprocess.stderr) { + throw new Error('assertion fail: !subprocess.stdout || !subprocess.stderr') + } + // playwright can only collect string-form stdio into the test report + // https://github.com/microsoft/playwright/issues/23993 + subprocess.stdout.setEncoding('utf-8') + subprocess.stderr.setEncoding('utf-8') + subprocess.stdout.pipe(process.stdout) + subprocess.stderr.pipe(process.stderr) // return values early so caller can handler error returnValues.subprocess = subprocess // wait for the server to be available From f1ec97ecddb527befb4aa7a5cf6eb672be5c6214 Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sun, 23 Jul 2023 21:26:26 +0800 Subject: [PATCH 6/8] improve mdx transform and support @vitejs/plugin-react-swc --- .../playground/use-theme-doc/package.json | 1 + .../playground/use-theme-doc/vite.config.ts | 4 +- packages/react-pages/src/node/index.ts | 56 ++++++-- pnpm-lock.yaml | 126 ++++++++++++++++++ 4 files changed, 174 insertions(+), 13 deletions(-) diff --git a/packages/playground/use-theme-doc/package.json b/packages/playground/use-theme-doc/package.json index dac6a8b2..a525ba71 100644 --- a/packages/playground/use-theme-doc/package.json +++ b/packages/playground/use-theme-doc/package.json @@ -23,6 +23,7 @@ "devDependencies": { "@types/react": "^18.2.13", "@vitejs/plugin-react": "^4.0.1", + "@vitejs/plugin-react-swc": "^3.3.2", "rimraf": "^4.4.1", "serve": "^14.2.0", "vite": "^4.3.9", diff --git a/packages/playground/use-theme-doc/vite.config.ts b/packages/playground/use-theme-doc/vite.config.ts index c54753f3..d55ce235 100644 --- a/packages/playground/use-theme-doc/vite.config.ts +++ b/packages/playground/use-theme-doc/vite.config.ts @@ -1,6 +1,8 @@ import { defineConfig } from 'vite' import * as path from 'path' -import react from '@vitejs/plugin-react' +// import react from '@vitejs/plugin-react' +import react from "@vitejs/plugin-react-swc"; + import pages from 'vite-plugin-react-pages' export default defineConfig({ diff --git a/packages/react-pages/src/node/index.ts b/packages/react-pages/src/node/index.ts index d570848f..e8c59b4a 100644 --- a/packages/react-pages/src/node/index.ts +++ b/packages/react-pages/src/node/index.ts @@ -280,23 +280,12 @@ export default async function setupPlugins( mdxExtensions: ['.md', '.mdx'], providerImportSource: '@mdx-js/react', }) - const { default: pluginReactForMdx } = await import('@vitejs/plugin-react') return [ { ...mdxPlugin, enforce: 'pre', }, - // add hmr ability to .md and .mdx files - // https://github.com/vitejs/vite-plugin-react/issues/38 - // https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md#400-2023-04-20 - // this react plugin is only used to handle mdx output - // users can aplly another @vitejs/plugin-react or @vitejs/plugin-react-swc on their side (to transform normal .jsx files) - pluginReactForMdx({ - include: /\.mdx?$/, - // TODO: after https://github.com/vitejs/vite-plugin-react/pull/188 is published - // the next line will not be needed - jsxRuntime: 'classic', - }), + createMdxTransformPlugin(), pluginFactory(vpConfig), ] } @@ -322,6 +311,49 @@ function getRehypePlugins(): Promise { ]) } +/** + * use @vitejs/plugin-react to handle the output of @mdx-js/rollup + * workaround this issue: https://github.com/vitejs/vite-plugin-react/issues/38 + */ +function createMdxTransformPlugin(): Plugin { + let vitePluginReactTrasnform: Plugin['transform'] | undefined + return { + name: 'vite-pages:mdx-fast-refresh', + apply: 'serve', + configResolved: ({ plugins }) => { + // find this plugin to call it's transform function: + // https://github.com/vitejs/vite-plugin-react/blob/b647e74c38565696bd6fb931b8bd9ac7f3bebe88/packages/plugin-react/src/index.ts#L206 + // or https://github.com/vitejs/vite-plugin-react-swc/blob/95e991914322e7b011d1c8d18d501b9eee21adaa/src/index.ts#L111 + vitePluginReactTrasnform = plugins.find( + (p) => + (p.name === 'vite:react-babel' && + typeof p.transform === 'function') || + (p.name === 'vite:react-swc' && typeof p.transform === 'function') + )?.transform + if (!vitePluginReactTrasnform) { + throw new Error( + `Can't find an instance of @vitejs/plugin-react or @vitejs/plugin-react-swc. You should apply either of these plugins to make mdx work.` + ) + } + }, + transform: (code, id, options) => { + const [filepath, ...qs] = id.split('?') + if ( + filepath.match(/\.mdx?$/) && + !id.startsWith(OUTLINE_INFO_MODULE_ID_PREFIX) + ) { + // turn file path like `/path/to/md-file$.md` into `/path/to/md-file$.jsx` + // make vite-plugin-react transform "the output of @mdx-js/rollup" like a jsx file + // https://github.com/vitejs/vite-plugin-react/blob/caa9b5330092c70288fcb94ceb96ca42438df2a2/packages/plugin-react/src/index.ts#L170 + const newFilePath = filepath.replace(/\.mdx?$/, '.jsx') + const newId = [newFilePath, ...qs].join('?') + + return (vitePluginReactTrasnform as any)(code, newId, options) + } + }, + } +} + /** * Some chunk filenames may start with `_`, which will be treated as special resource by github pages. So we need to disable jekyll of github pages. * https://github.blog/2009-12-29-bypassing-jekyll-on-github-pages/ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1020e37..b0b35737 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -476,6 +476,9 @@ importers: '@vitejs/plugin-react': specifier: ^4.0.1 version: 4.0.1(vite@4.3.9) + '@vitejs/plugin-react-swc': + specifier: ^3.3.2 + version: 3.3.2(vite@4.3.9) rimraf: specifier: ^4.4.1 version: 4.4.1 @@ -3126,6 +3129,118 @@ packages: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} dev: true + /@swc/core-darwin-arm64@1.3.70: + resolution: {integrity: sha512-31+mcl0dgdRHvZRjhLOK9V6B+qJ7nxDZYINr9pBlqGWxknz37Vld5KK19Kpr79r0dXUZvaaelLjCnJk9dA2PcQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.70: + resolution: {integrity: sha512-GMFJ65E18zQC80t0os+TZvI+8lbRuitncWVge/RXmXbVLPRcdykP4EJ87cqzcG5Ah0z18/E0T+ixD6jHRisrYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.70: + resolution: {integrity: sha512-wjhCwS8LCiAq2VedF1b4Bryyw68xZnfMED4pLRazAl8BaUlDFANfRBORNunxlfHQj4V3x39IaiLgCZRHMdzXBg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.70: + resolution: {integrity: sha512-9D/Rx67cAOnMiexvCqARxvhj7coRajTp5HlJHuf+rfwMqI2hLhpO9/pBMQxBUAWxODO/ksQ/OF+GJRjmtWw/2A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.70: + resolution: {integrity: sha512-gkjxBio7XD+1GlQVVyPP/qeFkLu83VhRHXaUrkNYpr5UZG9zZurBERT9nkS6Y+ouYh+Q9xmw57aIyd2KvD2zqQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.70: + resolution: {integrity: sha512-/nCly+V4xfMVwfEUoLLAukxUSot/RcSzsf6GdsGTjFcrp5sZIntAjokYRytm3VT1c2TK321AfBorsi9R5w8Y7Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.70: + resolution: {integrity: sha512-HoOsPJbt361KGKaivAK0qIiYARkhzlxeAfvF5NlnKxkIMOZpQ46Lwj3tR0VWohKbrhS+cYKFlVuDi5XnDkx0XA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.70: + resolution: {integrity: sha512-hm4IBK/IaRil+aj1cWU6f0GyAdHpw/Jr5nyFYLM2c/tt7w2t5hgb8NjzM2iM84lOClrig1fG6edj2vCF1dFzNQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.70: + resolution: {integrity: sha512-5cgKUKIT/9Fp5fCA+zIjYCQ4dSvjFYOeWGZR3QiTXGkC4bGa1Ji9SEPyeIAX0iruUnKjYaZB9RvHK2tNn7RLrQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.70: + resolution: {integrity: sha512-LE8lW46+TQBzVkn2mHBlk8DIElPIZ2dO5P8AbJiARNBAnlqQWu67l9gWM89UiZ2l33J2cI37pHzON3tKnT8f9g==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.70: + resolution: {integrity: sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.70 + '@swc/core-darwin-x64': 1.3.70 + '@swc/core-linux-arm-gnueabihf': 1.3.70 + '@swc/core-linux-arm64-gnu': 1.3.70 + '@swc/core-linux-arm64-musl': 1.3.70 + '@swc/core-linux-x64-gnu': 1.3.70 + '@swc/core-linux-x64-musl': 1.3.70 + '@swc/core-win32-arm64-msvc': 1.3.70 + '@swc/core-win32-ia32-msvc': 1.3.70 + '@swc/core-win32-x64-msvc': 1.3.70 + dev: true + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3264,6 +3379,17 @@ packages: '@types/node': 18.15.11 dev: true + /@vitejs/plugin-react-swc@3.3.2(vite@4.3.9): + resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==} + peerDependencies: + vite: ^4 + dependencies: + '@swc/core': 1.3.70 + vite: 4.3.9(@types/node@18.15.11)(sass@1.63.6) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + /@vitejs/plugin-react@4.0.1(vite@4.3.9): resolution: {integrity: sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==} engines: {node: ^14.18.0 || >=16.0.0} From a7acbcc3dbabb7fe59b4263e4bd60e557aaec65a Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sun, 23 Jul 2023 21:26:44 +0800 Subject: [PATCH 7/8] improve error logging --- packages/theme-doc/src/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/theme-doc/src/index.tsx b/packages/theme-doc/src/index.tsx index c9730cf5..28f3522d 100644 --- a/packages/theme-doc/src/index.tsx +++ b/packages/theme-doc/src/index.tsx @@ -48,6 +48,7 @@ export function createTheme( if (loadState.type === 'load-error') { const errMsg = loadState.error?.message + console.error(loadState.error) return (

Load Error

From 88e0940c6998d0cc4c524bfce805cd8e361966a8 Mon Sep 17 00:00:00 2001 From: csr632 <632882184@qq.com> Date: Sun, 23 Jul 2023 21:37:01 +0800 Subject: [PATCH 8/8] cleanup deps --- packages/react-pages/package.json | 1 - pnpm-lock.yaml | 83 +++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/packages/react-pages/package.json b/packages/react-pages/package.json index ba7d3a84..f764b9f6 100644 --- a/packages/react-pages/package.json +++ b/packages/react-pages/package.json @@ -67,7 +67,6 @@ }, "dependencies": { "@mdx-js/rollup": "^2.3.0", - "@vitejs/plugin-react": "4.0.1", "chalk": "^4.1.2", "chokidar": "^3.5.1", "dequal": "^2.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b0b35737..03581d96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -502,9 +502,6 @@ importers: '@mdx-js/rollup': specifier: ^2.3.0 version: 2.3.0(rollup@3.25.1) - '@vitejs/plugin-react': - specifier: 4.0.1 - version: 4.0.1(vite@4.3.9) chalk: specifier: ^4.1.2 version: 4.1.2 @@ -725,6 +722,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 + dev: true /@ant-design/colors@7.0.0: resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==} @@ -795,10 +793,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.5 + dev: true /@babel/compat-data@7.22.5: resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} engines: {node: '>=6.9.0'} + dev: true /@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} @@ -821,6 +821,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true /@babel/generator@7.22.5: resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} @@ -830,6 +831,7 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 + dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} @@ -860,6 +862,7 @@ packages: browserslist: 4.21.9 lru-cache: 5.1.1 semver: 6.3.0 + dev: true /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} @@ -921,6 +924,7 @@ packages: /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} @@ -928,12 +932,14 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/types': 7.22.5 + dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} @@ -954,6 +960,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-module-transforms@7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} @@ -969,6 +976,7 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} @@ -980,6 +988,7 @@ packages: /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-remap-async-to-generator@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==} @@ -1018,6 +1027,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} @@ -1031,6 +1041,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 + dev: true /@babel/helper-string-parser@7.18.10: resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} @@ -1040,6 +1051,7 @@ packages: /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.18.6: resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} @@ -1049,10 +1061,12 @@ packages: /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-wrap-function@7.22.5: resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} @@ -1075,6 +1089,7 @@ packages: '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color + dev: true /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} @@ -1083,6 +1098,7 @@ packages: '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 + dev: true /@babel/parser@7.22.5: resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} @@ -1090,6 +1106,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.5 + dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} @@ -1983,6 +2000,7 @@ packages: dependencies: '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 + dev: true /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} @@ -1995,6 +2013,7 @@ packages: dependencies: '@babel/core': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 + dev: true /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} @@ -2365,6 +2384,7 @@ packages: '@babel/code-frame': 7.22.5 '@babel/parser': 7.22.5 '@babel/types': 7.22.5 + dev: true /@babel/traverse@7.22.5: resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} @@ -2382,6 +2402,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/types@7.19.0: resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} @@ -2399,6 +2420,7 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 + dev: true /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -2426,6 +2448,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-arm@0.17.19: @@ -2434,6 +2457,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-x64@0.17.19: @@ -2442,6 +2466,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/darwin-arm64@0.17.19: @@ -2450,6 +2475,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/darwin-x64@0.17.19: @@ -2458,6 +2484,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-arm64@0.17.19: @@ -2466,6 +2493,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-x64@0.17.19: @@ -2474,6 +2502,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm64@0.17.19: @@ -2482,6 +2511,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm@0.17.19: @@ -2490,6 +2520,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ia32@0.17.19: @@ -2498,6 +2529,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-loong64@0.17.19: @@ -2506,6 +2538,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-mips64el@0.17.19: @@ -2514,6 +2547,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ppc64@0.17.19: @@ -2522,6 +2556,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-riscv64@0.17.19: @@ -2530,6 +2565,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-s390x@0.17.19: @@ -2538,6 +2574,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-x64@0.17.19: @@ -2546,6 +2583,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/netbsd-x64@0.17.19: @@ -2554,6 +2592,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true /@esbuild/openbsd-x64@0.17.19: @@ -2562,6 +2601,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true /@esbuild/sunos-x64@0.17.19: @@ -2570,6 +2610,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true /@esbuild/win32-arm64@0.17.19: @@ -2578,6 +2619,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-ia32@0.17.19: @@ -2586,6 +2628,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-x64@0.17.19: @@ -2594,6 +2637,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true /@gwhitney/detect-indent@7.0.1: @@ -3343,6 +3387,7 @@ packages: /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -3403,6 +3448,7 @@ packages: vite: 4.3.9(@types/node@18.15.11)(sass@1.63.6) transitivePeerDependencies: - supports-color + dev: true /@zeit/schemas@2.29.0: resolution: {integrity: sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==} @@ -3500,6 +3546,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -3783,6 +3830,7 @@ packages: electron-to-chromium: 1.4.439 node-releases: 2.0.12 update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -3825,6 +3873,7 @@ packages: /caniuse-lite@1.0.30001507: resolution: {integrity: sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==} + dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3843,6 +3892,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -3967,6 +4017,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3976,6 +4027,7 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -4066,6 +4118,7 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true /copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} @@ -4345,6 +4398,7 @@ packages: /electron-to-chromium@1.4.439: resolution: {integrity: sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg==} + dev: true /email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -4418,14 +4472,17 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 + dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} @@ -4671,6 +4728,7 @@ packages: /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: true /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -4749,6 +4807,7 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true /globby@13.2.0: resolution: {integrity: sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==} @@ -4788,6 +4847,7 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -4913,6 +4973,7 @@ packages: /immutable@4.3.0: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + dev: true /import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} @@ -5195,6 +5256,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -5218,6 +5280,7 @@ packages: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -5400,6 +5463,7 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 + dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -6297,6 +6361,7 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /ndjson@2.0.0: resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} @@ -6338,6 +6403,7 @@ packages: /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + dev: true /node-releases@2.0.5: resolution: {integrity: sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==} @@ -6589,6 +6655,7 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -7024,6 +7091,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} @@ -7751,6 +7819,7 @@ packages: /react-refresh@0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} + dev: true /react-router-dom@6.13.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-6Nqoqd7fgwxxVGdbiMHTpDHCYPq62d7Wk1Of7B82vH7ZPwwsRaIa22zRZKPPg413R5REVNiyuQPKDG1bubcOFA==} @@ -8138,6 +8207,7 @@ packages: chokidar: 3.5.3 immutable: 4.3.0 source-map-js: 1.0.2 + dev: true /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -8173,6 +8243,7 @@ packages: /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true + dev: true /semver@7.5.3: resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} @@ -8294,6 +8365,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -8475,6 +8547,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -8555,6 +8628,7 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} + dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -8762,6 +8836,7 @@ packages: browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 + dev: true /update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -8858,6 +8933,7 @@ packages: sass: 1.63.6 optionalDependencies: fsevents: 2.3.2 + dev: true /wait-on@6.0.1: resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} @@ -8942,6 +9018,7 @@ packages: /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}