From 72376c282fd45415849fc3cee06a7592161a5612 Mon Sep 17 00:00:00 2001 From: erkelost <1256029807@qq.com> Date: Wed, 22 Jan 2025 18:05:34 +0800 Subject: [PATCH 1/4] feat: add svelte plugin --- js-plugins/svelte/package.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 js-plugins/svelte/package.json diff --git a/js-plugins/svelte/package.json b/js-plugins/svelte/package.json new file mode 100644 index 0000000..cbe5be4 --- /dev/null +++ b/js-plugins/svelte/package.json @@ -0,0 +1,12 @@ +{ + "name": "svelte", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} From 54a83123e0749b84ad1993d47893255004956a50 Mon Sep 17 00:00:00 2001 From: erkelost <1256029807@qq.com> Date: Tue, 28 Jan 2025 18:12:31 +0800 Subject: [PATCH 2/4] chore(js-plugins): add svelte --- js-plugins/svelte/CHANGELOG.md | 1237 +++++++++++++++++ js-plugins/svelte/README.md | 28 + js-plugins/svelte/__tests__/compile.spec.js | 81 ++ .../__tests__/fixtures/preprocess/foo.css | 3 + .../__tests__/fixtures/preprocess/foo.scss | 3 + .../svelte/__tests__/preprocess.spec.js | 80 ++ .../svelte/__tests__/sourcemaps.spec.js | 79 ++ js-plugins/svelte/package.json | 56 +- js-plugins/svelte/playground/.gitignore | 24 + js-plugins/svelte/playground/README.md | 47 + js-plugins/svelte/playground/index.html | 13 + js-plugins/svelte/playground/package.json | 20 + js-plugins/svelte/playground/public/vite.svg | 1 + js-plugins/svelte/playground/src/App.svelte | 47 + js-plugins/svelte/playground/src/app.css | 79 ++ .../svelte/playground/src/assets/svelte.svg | 1 + .../svelte/playground/src/lib/Counter.svelte | 10 + js-plugins/svelte/playground/src/main.ts | 9 + .../svelte/playground/src/vite-env.d.ts | 2 + js-plugins/svelte/playground/svelte.config.js | 7 + .../svelte/playground/tsconfig.app.json | 20 + js-plugins/svelte/playground/tsconfig.json | 7 + .../svelte/playground/tsconfig.node.json | 24 + js-plugins/svelte/playground/vite.config.ts | 7 + js-plugins/svelte/src/handle-hot-update.js | 145 ++ js-plugins/svelte/src/index.js | 236 ++++ js-plugins/svelte/src/preprocess.js | 124 ++ js-plugins/svelte/src/public.d.ts | 210 +++ js-plugins/svelte/src/types/compile.d.ts | 25 + js-plugins/svelte/src/types/id.d.ts | 46 + js-plugins/svelte/src/types/log.d.ts | 24 + js-plugins/svelte/src/types/options.d.ts | 21 + js-plugins/svelte/src/types/plugin-api.d.ts | 11 + .../src/types/vite-plugin-svelte-stats.d.ts | 30 + js-plugins/svelte/src/utils/compile.js | 191 +++ js-plugins/svelte/src/utils/constants.js | 26 + js-plugins/svelte/src/utils/dependencies.js | 89 ++ js-plugins/svelte/src/utils/error.js | 162 +++ js-plugins/svelte/src/utils/esbuild.js | 177 +++ js-plugins/svelte/src/utils/hash.js | 43 + js-plugins/svelte/src/utils/id.js | 252 ++++ js-plugins/svelte/src/utils/load-raw.js | 125 ++ .../svelte/src/utils/load-svelte-config.js | 122 ++ js-plugins/svelte/src/utils/log.js | 277 ++++ js-plugins/svelte/src/utils/optimizer.js | 53 + js-plugins/svelte/src/utils/options.js | 653 +++++++++ js-plugins/svelte/src/utils/preprocess.js | 173 +++ js-plugins/svelte/src/utils/sourcemaps.js | 82 ++ js-plugins/svelte/src/utils/svelte-version.js | 12 + .../src/utils/vite-plugin-svelte-cache.js | 212 +++ .../src/utils/vite-plugin-svelte-stats.js | 200 +++ js-plugins/svelte/src/utils/watch.js | 120 ++ js-plugins/svelte/tsconfig.json | 18 + js-plugins/svelte/types/index.d.ts | 216 +++ js-plugins/svelte/types/index.d.ts.map | 27 + 55 files changed, 5979 insertions(+), 8 deletions(-) create mode 100644 js-plugins/svelte/CHANGELOG.md create mode 100644 js-plugins/svelte/README.md create mode 100644 js-plugins/svelte/__tests__/compile.spec.js create mode 100644 js-plugins/svelte/__tests__/fixtures/preprocess/foo.css create mode 100644 js-plugins/svelte/__tests__/fixtures/preprocess/foo.scss create mode 100644 js-plugins/svelte/__tests__/preprocess.spec.js create mode 100644 js-plugins/svelte/__tests__/sourcemaps.spec.js create mode 100644 js-plugins/svelte/playground/.gitignore create mode 100644 js-plugins/svelte/playground/README.md create mode 100644 js-plugins/svelte/playground/index.html create mode 100644 js-plugins/svelte/playground/package.json create mode 100644 js-plugins/svelte/playground/public/vite.svg create mode 100644 js-plugins/svelte/playground/src/App.svelte create mode 100644 js-plugins/svelte/playground/src/app.css create mode 100644 js-plugins/svelte/playground/src/assets/svelte.svg create mode 100644 js-plugins/svelte/playground/src/lib/Counter.svelte create mode 100644 js-plugins/svelte/playground/src/main.ts create mode 100644 js-plugins/svelte/playground/src/vite-env.d.ts create mode 100644 js-plugins/svelte/playground/svelte.config.js create mode 100644 js-plugins/svelte/playground/tsconfig.app.json create mode 100644 js-plugins/svelte/playground/tsconfig.json create mode 100644 js-plugins/svelte/playground/tsconfig.node.json create mode 100644 js-plugins/svelte/playground/vite.config.ts create mode 100644 js-plugins/svelte/src/handle-hot-update.js create mode 100644 js-plugins/svelte/src/index.js create mode 100644 js-plugins/svelte/src/preprocess.js create mode 100644 js-plugins/svelte/src/public.d.ts create mode 100644 js-plugins/svelte/src/types/compile.d.ts create mode 100644 js-plugins/svelte/src/types/id.d.ts create mode 100644 js-plugins/svelte/src/types/log.d.ts create mode 100644 js-plugins/svelte/src/types/options.d.ts create mode 100644 js-plugins/svelte/src/types/plugin-api.d.ts create mode 100644 js-plugins/svelte/src/types/vite-plugin-svelte-stats.d.ts create mode 100644 js-plugins/svelte/src/utils/compile.js create mode 100644 js-plugins/svelte/src/utils/constants.js create mode 100644 js-plugins/svelte/src/utils/dependencies.js create mode 100644 js-plugins/svelte/src/utils/error.js create mode 100644 js-plugins/svelte/src/utils/esbuild.js create mode 100644 js-plugins/svelte/src/utils/hash.js create mode 100644 js-plugins/svelte/src/utils/id.js create mode 100644 js-plugins/svelte/src/utils/load-raw.js create mode 100644 js-plugins/svelte/src/utils/load-svelte-config.js create mode 100644 js-plugins/svelte/src/utils/log.js create mode 100644 js-plugins/svelte/src/utils/optimizer.js create mode 100644 js-plugins/svelte/src/utils/options.js create mode 100644 js-plugins/svelte/src/utils/preprocess.js create mode 100644 js-plugins/svelte/src/utils/sourcemaps.js create mode 100644 js-plugins/svelte/src/utils/svelte-version.js create mode 100644 js-plugins/svelte/src/utils/vite-plugin-svelte-cache.js create mode 100644 js-plugins/svelte/src/utils/vite-plugin-svelte-stats.js create mode 100644 js-plugins/svelte/src/utils/watch.js create mode 100644 js-plugins/svelte/tsconfig.json create mode 100644 js-plugins/svelte/types/index.d.ts create mode 100644 js-plugins/svelte/types/index.d.ts.map diff --git a/js-plugins/svelte/CHANGELOG.md b/js-plugins/svelte/CHANGELOG.md new file mode 100644 index 0000000..7e8f973 --- /dev/null +++ b/js-plugins/svelte/CHANGELOG.md @@ -0,0 +1,1237 @@ +# @sveltejs/vite-plugin-svelte + +## 5.0.3 +### Patch Changes + + +- fix errorhandling to work with errors that don't have a code property ([#1054](https://github.com/sveltejs/vite-plugin-svelte/pull/1054)) + +## 5.0.2 +### Patch Changes + + +- adapt internal handling of warning and error `code` property to changes in svelte5 ([#1044](https://github.com/sveltejs/vite-plugin-svelte/pull/1044)) + +## 5.0.1 +### Patch Changes + + +- Fix peer dependencies warning ([#1038](https://github.com/sveltejs/vite-plugin-svelte/pull/1038)) + +## 5.0.0 +### Major Changes + + +- Handle Vite 6 breaking change and remove Vite 5 handling ([#1020](https://github.com/sveltejs/vite-plugin-svelte/pull/1020)) + + +- Support Vite 6 ([#1026](https://github.com/sveltejs/vite-plugin-svelte/pull/1026)) + + +### Minor Changes + + +- Add `esm-env` to `ssr.noExternal` by default to resolve its conditions with Vite ([#1020](https://github.com/sveltejs/vite-plugin-svelte/pull/1020)) + + +- Support `?inline` query on Svelte style virtual modules ([#1024](https://github.com/sveltejs/vite-plugin-svelte/pull/1024)) + + +### Patch Changes + + +- remove vite6 beta from peer range ([#1035](https://github.com/sveltejs/vite-plugin-svelte/pull/1035)) + + +- Allow script tags to span multiple lines ([`0db95a9`](https://github.com/sveltejs/vite-plugin-svelte/commit/0db95a9cbcd281b99b8b817c8eda8d9ff8fa2db2)) + +- Updated dependencies [[`4fefbc2`](https://github.com/sveltejs/vite-plugin-svelte/commit/4fefbc24718953161ac7f86750df2dd539ca7978), [`e262266`](https://github.com/sveltejs/vite-plugin-svelte/commit/e2622664d9871558e03974524467968c7f906098)]: + - @sveltejs/vite-plugin-svelte-inspector@4.0.0 + +## 5.0.0-next.0 +### Major Changes + + +- Handle Vite 6 breaking change and remove Vite 5 handling ([#1020](https://github.com/sveltejs/vite-plugin-svelte/pull/1020)) + + +- Support Vite 6 ([#1026](https://github.com/sveltejs/vite-plugin-svelte/pull/1026)) + + +### Minor Changes + + +- Add `esm-env` to `ssr.noExternal` by default to resolve its conditions with Vite ([#1020](https://github.com/sveltejs/vite-plugin-svelte/pull/1020)) + + +- Support `?inline` query on Svelte style virtual modules ([#1024](https://github.com/sveltejs/vite-plugin-svelte/pull/1024)) + + +### Patch Changes + + +- Allow script tags to span multiple lines ([`0db95a9`](https://github.com/sveltejs/vite-plugin-svelte/commit/0db95a9cbcd281b99b8b817c8eda8d9ff8fa2db2)) + +- Updated dependencies [[`e262266`](https://github.com/sveltejs/vite-plugin-svelte/commit/e2622664d9871558e03974524467968c7f906098)]: + - @sveltejs/vite-plugin-svelte-inspector@4.0.0-next.0 + +## 4.0.1 +### Patch Changes + + +- removed references to compiler options no longer available in svelte5 ([#1010](https://github.com/sveltejs/vite-plugin-svelte/pull/1010)) + +## 4.0.0 +### Major Changes + + +- only prebundle files with default filenames (.svelte for components, .svelte.(js|ts) for modules) ([#901](https://github.com/sveltejs/vite-plugin-svelte/pull/901)) + + +- remove support for Svelte 4 ([#892](https://github.com/sveltejs/vite-plugin-svelte/pull/892)) + + +- breaking(types): some types that have been unintentionally public are now private ([#934](https://github.com/sveltejs/vite-plugin-svelte/pull/934)) + + +- disable script preprocessing in vitePreprocess() by default because Svelte 5 supports lang=ts out of the box ([#892](https://github.com/sveltejs/vite-plugin-svelte/pull/892)) + + +- replaced svelte-hmr with Svelte 5 compiler hmr integration ([#892](https://github.com/sveltejs/vite-plugin-svelte/pull/892)) + + +### Minor Changes + + +- allow infix notation for svelte modules ([#901](https://github.com/sveltejs/vite-plugin-svelte/pull/901)) + + Previously, only suffix notation `.svelte.js` was allowed, now you can also use `.svelte.test.js` or `.svelte.stories.js`. + This helps when writing testcases or other auxillary code where you may want to use runes too. + +- feat(config): dynamically extract list of svelte exports from peer dependency so that new exports work automatically" ([#941](https://github.com/sveltejs/vite-plugin-svelte/pull/941)) + + +- feat(warnings): change default loglevel of warnings originating from files in node_modules to debug. To see them call `DEBUG:vite-plugin-svelte:node-modules-onwarn pnpm build`. ([#989](https://github.com/sveltejs/vite-plugin-svelte/pull/989)) + + +### Patch Changes + + +- fix: make defaultHandler a required argument for onwarn in plugin options ([#895](https://github.com/sveltejs/vite-plugin-svelte/pull/895)) + + +- prebundle with dev: true by default ([#901](https://github.com/sveltejs/vite-plugin-svelte/pull/901)) + + +- fix(dev): compile with hmr: false for prebundled deps as hmr does not work with that ([#950](https://github.com/sveltejs/vite-plugin-svelte/pull/950)) + + +- fix: ensure svelte modules correctly run in DEV mode ([#906](https://github.com/sveltejs/vite-plugin-svelte/pull/906)) + + +- ensure consistent use of compileOptions.hmr also for prebundling ([#956](https://github.com/sveltejs/vite-plugin-svelte/pull/956)) + + +- fix(optimizeDeps): avoid to optimise server only entrypoints of svelte that are never used on the client ([#941](https://github.com/sveltejs/vite-plugin-svelte/pull/941)) + + +- update peer on workspace packages to avoid packages bumping each other ([#916](https://github.com/sveltejs/vite-plugin-svelte/pull/916)) + + +- export PluginOptions interface ([#976](https://github.com/sveltejs/vite-plugin-svelte/pull/976)) + + +- Remove log about experimental status of Svelte 5. Note that breaking changes can still occur while vite-plugin-svelte 4 is in prerelease mode ([#894](https://github.com/sveltejs/vite-plugin-svelte/pull/894)) + + +- fix: ensure vite config is only resolved once during lazy init of vitePreprocess ([#912](https://github.com/sveltejs/vite-plugin-svelte/pull/912)) + + +- fix(vitePreprocess): default to build config so that svelte-check does not trigger dev-only plugins ([#931](https://github.com/sveltejs/vite-plugin-svelte/pull/931)) + + +- fix: only apply infix filter to basename ([#920](https://github.com/sveltejs/vite-plugin-svelte/pull/920)) + + +- fix: disable hmr when vite config server.hmr is false ([#913](https://github.com/sveltejs/vite-plugin-svelte/pull/913)) + + +- fix(dev): make sure custom cssHash is applied consistently even for prebundled components to avoid hash mismatches during hydration ([#950](https://github.com/sveltejs/vite-plugin-svelte/pull/950)) + +- Updated dependencies [[`22baa25`](https://github.com/sveltejs/vite-plugin-svelte/commit/22baa25b5e98ddc92715bfc430dc9d0cfad99bb0), [`49324db`](https://github.com/sveltejs/vite-plugin-svelte/commit/49324dbf747a46ae75b405a29fc7feac2db966dd), [`e9f048c`](https://github.com/sveltejs/vite-plugin-svelte/commit/e9f048c362a0769b3d5afa87da6f8398f46fe1a9), [`213fedd`](https://github.com/sveltejs/vite-plugin-svelte/commit/213fedd68ec2c5fcb41752e05dcded4abfa8d0c0)]: + - @sveltejs/vite-plugin-svelte-inspector@3.0.0 + +## 4.0.0-next.8 +### Minor Changes + + +- feat(warnings): change default loglevel of warnings originating from files in node_modules to debug. To see them call `DEBUG:vite-plugin-svelte:node-modules-onwarn pnpm build`. ([#989](https://github.com/sveltejs/vite-plugin-svelte/pull/989)) + +## 4.0.0-next.7 +### Patch Changes + + +- export PluginOptions interface ([#976](https://github.com/sveltejs/vite-plugin-svelte/pull/976)) + +## 4.0.0-next.6 +### Patch Changes + + +- ensure consistent use of compileOptions.hmr also for prebundling ([#956](https://github.com/sveltejs/vite-plugin-svelte/pull/956)) + +## 4.0.0-next.5 +### Patch Changes + + +- fix(dev): compile with hmr: false for prebundled deps as hmr does not work with that ([#950](https://github.com/sveltejs/vite-plugin-svelte/pull/950)) + + +- fix(dev): make sure custom cssHash is applied consistently even for prebundled components to avoid hash mismatches during hydration ([#950](https://github.com/sveltejs/vite-plugin-svelte/pull/950)) + +## 4.0.0-next.4 +### Major Changes + + +- breaking(types): some types that have been unintentionally public are now private ([#934](https://github.com/sveltejs/vite-plugin-svelte/pull/934)) + + +### Minor Changes + + +- feat(config): dynamically extract list of svelte exports from peer dependency so that new exports work automatically" ([#941](https://github.com/sveltejs/vite-plugin-svelte/pull/941)) + + +### Patch Changes + + +- fix(optimizeDeps): avoid to optimise server only entrypoints of svelte that are never used on the client ([#941](https://github.com/sveltejs/vite-plugin-svelte/pull/941)) + + +- fix(vitePreprocess): default to build config so that svelte-check does not trigger dev-only plugins ([#931](https://github.com/sveltejs/vite-plugin-svelte/pull/931)) + +- Updated dependencies [[`e9f048c362a0769b3d5afa87da6f8398f46fe1a9`](https://github.com/sveltejs/vite-plugin-svelte/commit/e9f048c362a0769b3d5afa87da6f8398f46fe1a9)]: + - @sveltejs/vite-plugin-svelte-inspector@3.0.0-next.3 + +## 4.0.0-next.3 +### Patch Changes + + +- fix: only apply infix filter to basename ([#920](https://github.com/sveltejs/vite-plugin-svelte/pull/920)) + +## 4.0.0-next.2 +### Patch Changes + + +- update peer on workspace packages to avoid packages bumping each other ([#916](https://github.com/sveltejs/vite-plugin-svelte/pull/916)) + + +- fix: ensure vite config is only resolved once during lazy init of vitePreprocess ([#912](https://github.com/sveltejs/vite-plugin-svelte/pull/912)) + + +- fix: disable hmr when vite config server.hmr is false ([#913](https://github.com/sveltejs/vite-plugin-svelte/pull/913)) + +## 4.0.0-next.1 + +### Major Changes + +- only prebundle files with default filenames (.svelte for components, .svelte.(js|ts) for modules) ([#901](https://github.com/sveltejs/vite-plugin-svelte/pull/901)) + +### Minor Changes + +- allow infix notation for svelte modules ([#901](https://github.com/sveltejs/vite-plugin-svelte/pull/901)) + + Previously, only suffix notation `.svelte.js` was allowed, now you can also use `.svelte.test.js` or `.svelte.stories.js`. + This helps when writing testcases or other auxillary code where you may want to use runes too. + +### Patch Changes + +- prebundle with dev: true by default ([#901](https://github.com/sveltejs/vite-plugin-svelte/pull/901)) + +- fix: ensure svelte modules correctly run in DEV mode ([#906](https://github.com/sveltejs/vite-plugin-svelte/pull/906)) + +- Updated dependencies []: + - @sveltejs/vite-plugin-svelte-inspector@3.0.0-next.1 + +## 4.0.0-next.0 + +### Major Changes + +- remove support for Svelte 4 ([#892](https://github.com/sveltejs/vite-plugin-svelte/pull/892)) + +- disable script preprocessing in vitePreprocess() by default because Svelte 5 supports lang=ts out of the box ([#892](https://github.com/sveltejs/vite-plugin-svelte/pull/892)) + +- replaced svelte-hmr with Svelte 5 compiler hmr integration ([#892](https://github.com/sveltejs/vite-plugin-svelte/pull/892)) + +### Patch Changes + +- fix: make defaultHandler a required argument for onwarn in plugin options ([#895](https://github.com/sveltejs/vite-plugin-svelte/pull/895)) + +- Remove log about experimental status of Svelte 5. Note that breaking changes can still occur while vite-plugin-svelte 4 is in prerelease mode ([#894](https://github.com/sveltejs/vite-plugin-svelte/pull/894)) + +- Updated dependencies [[`49324dbf747a46ae75b405a29fc7feac2db966dd`](https://github.com/sveltejs/vite-plugin-svelte/commit/49324dbf747a46ae75b405a29fc7feac2db966dd)]: + - @sveltejs/vite-plugin-svelte-inspector@3.0.0-next.0 + +## 3.1.0 + +### Minor Changes + +- feat(svelte5): enable hmr option in dev ([#836](https://github.com/sveltejs/vite-plugin-svelte/pull/836)) + +### Patch Changes + +- Remove unnecessary `enableSourcemap` option usage and prevent passing it in Svelte 5 ([#862](https://github.com/sveltejs/vite-plugin-svelte/pull/862)) + +- Updated dependencies [[`8ae3dc8cf415355f406f23d6104cb6153d75dfc8`](https://github.com/sveltejs/vite-plugin-svelte/commit/8ae3dc8cf415355f406f23d6104cb6153d75dfc8)]: + - @sveltejs/vite-plugin-svelte-inspector@2.1.0 + +## 3.0.2 + +### Patch Changes + +- fix(compile): correctly determine script lang in files where a comment precedes the script tag ([#844](https://github.com/sveltejs/vite-plugin-svelte/pull/844)) + +## 3.0.1 + +### Patch Changes + +- fix: improve checking of script and style in .svelte code to work with new generic= attribute ([#799](https://github.com/sveltejs/vite-plugin-svelte/pull/799)) + +- Fix optional parameter types ([#797](https://github.com/sveltejs/vite-plugin-svelte/pull/797)) + +- Update log level for HMR updates where the output is functionally equivalent to the previous version to "debug" ([#806](https://github.com/sveltejs/vite-plugin-svelte/pull/806)) + +## 3.0.0 + +### Major Changes + +- breaking: update minimum supported node version to node18 ([#744](https://github.com/sveltejs/vite-plugin-svelte/pull/744)) + +- breaking: update supported vite version to vite 5 ([#743](https://github.com/sveltejs/vite-plugin-svelte/pull/743)) + +- breaking: remove support for svelte 3 ([#746](https://github.com/sveltejs/vite-plugin-svelte/pull/746)) + +- Preprocess style tags by default with vitePreprocess ([#756](https://github.com/sveltejs/vite-plugin-svelte/pull/756)) + +- breaking: remove package.json export ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- breaking(types): emit types with dts-buddy to include type map ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- breaking(debug): remove 'vite:' and add suffixes to debug namespace ([#749](https://github.com/sveltejs/vite-plugin-svelte/pull/749)) + +- breaking(types): rename SvelteOptions to SvelteConfig ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- breaking: prefer svelte exports condition over package.json svelte field ([#747](https://github.com/sveltejs/vite-plugin-svelte/pull/747)) + +### Minor Changes + +- feat(preprocess): add warnings in case preprocess dependencies contain anomalies ([#767](https://github.com/sveltejs/vite-plugin-svelte/pull/767)) + +- Add experimental support for svelte5 ([#787](https://github.com/sveltejs/vite-plugin-svelte/pull/787)) + +### Patch Changes + +- fix(types): use correct type Options for svelte function arg ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- Improve compile error messages ([#757](https://github.com/sveltejs/vite-plugin-svelte/pull/757)) + +- feat(compile): promote experimental.dynamicCompileOptions to stable ([#765](https://github.com/sveltejs/vite-plugin-svelte/pull/765)) + +- update peer dependencies to use final releases ([#794](https://github.com/sveltejs/vite-plugin-svelte/pull/794)) + +- Updated dependencies [[`d5b952f`](https://github.com/sveltejs/vite-plugin-svelte/commit/d5b952f88253e39458a1fbc0a0231b939bba338d), [`bd5d43e`](https://github.com/sveltejs/vite-plugin-svelte/commit/bd5d43e765d35b52b613ddcfd00b8d75491a7d98), [`10ec2a4`](https://github.com/sveltejs/vite-plugin-svelte/commit/10ec2a4429623382cc1a700fe91c129616bca3ef), [`62afd80`](https://github.com/sveltejs/vite-plugin-svelte/commit/62afd80c3a7bd6430be3c552acdb8baa75aac995), [`1be1c08`](https://github.com/sveltejs/vite-plugin-svelte/commit/1be1c085ed75eb8d84cedc5b45077400edd720ef)]: + - @sveltejs/vite-plugin-svelte-inspector@2.0.0 + +## 3.0.0-next.3 + +### Minor Changes + +- Add experimental support for svelte5 ([#787](https://github.com/sveltejs/vite-plugin-svelte/pull/787)) + +## 3.0.0-next.2 + +### Major Changes + +- breaking: remove package.json export ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- breaking(types): emit types with dts-buddy to include type map ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- breaking(types): rename SvelteOptions to SvelteConfig ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +### Patch Changes + +- fix(types): use correct type Options for svelte function arg ([#751](https://github.com/sveltejs/vite-plugin-svelte/pull/751)) + +- Updated dependencies [[`62afd80`](https://github.com/sveltejs/vite-plugin-svelte/commit/62afd80c3a7bd6430be3c552acdb8baa75aac995)]: + - @sveltejs/vite-plugin-svelte-inspector@2.0.0-next.1 + +## 3.0.0-next.1 + +### Major Changes + +- Preprocess style tags by default with vitePreprocess ([#756](https://github.com/sveltejs/vite-plugin-svelte/pull/756)) + +### Minor Changes + +- feat(preprocess): add warnings in case preprocess dependencies contain anomalies ([#767](https://github.com/sveltejs/vite-plugin-svelte/pull/767)) + +### Patch Changes + +- Improve compile error messages ([#757](https://github.com/sveltejs/vite-plugin-svelte/pull/757)) + +- feat(compile): promote experimental.dynamicCompileOptions to stable ([#765](https://github.com/sveltejs/vite-plugin-svelte/pull/765)) + +## 3.0.0-next.0 + +### Major Changes + +- breaking: update minimum supported node version to node18 ([#744](https://github.com/sveltejs/vite-plugin-svelte/pull/744)) + +- breaking: update supported vite version to vite 5 ([#743](https://github.com/sveltejs/vite-plugin-svelte/pull/743)) + +- breaking: remove support for svelte 3 ([#746](https://github.com/sveltejs/vite-plugin-svelte/pull/746)) + +- breaking(debug): remove 'vite:' and add suffixes to debug namespace ([#749](https://github.com/sveltejs/vite-plugin-svelte/pull/749)) + +- breaking: prefer svelte exports condition over package.json svelte field ([#747](https://github.com/sveltejs/vite-plugin-svelte/pull/747)) + +### Patch Changes + +- Updated dependencies [[`d5b952f`](https://github.com/sveltejs/vite-plugin-svelte/commit/d5b952f88253e39458a1fbc0a0231b939bba338d), [`bd5d43e`](https://github.com/sveltejs/vite-plugin-svelte/commit/bd5d43e765d35b52b613ddcfd00b8d75491a7d98), [`10ec2a4`](https://github.com/sveltejs/vite-plugin-svelte/commit/10ec2a4429623382cc1a700fe91c129616bca3ef)]: + - @sveltejs/vite-plugin-svelte-inspector@2.0.0-next.0 + +## 2.4.6 + +### Patch Changes + +- fix(prebundleSvelteLibraries): don't try to append missing sourcemap ([#737](https://github.com/sveltejs/vite-plugin-svelte/pull/737)) + +## 2.4.5 + +### Patch Changes + +- fix(config): ignore @sveltejs/package and svelte2tsx for optimizeDeps.include and ssr.noExternal generated config ([#711](https://github.com/sveltejs/vite-plugin-svelte/pull/711)) + +## 2.4.4 + +### Patch Changes + +- fix links in error handling (console and vite overlay) ([#700](https://github.com/sveltejs/vite-plugin-svelte/pull/700)) + +## 2.4.3 + +### Patch Changes + +- add svelte/internal/disclose-version to vite config optimizeDeps.include by default ([#692](https://github.com/sveltejs/vite-plugin-svelte/pull/692)) + +## 2.4.2 + +### Patch Changes + +- fix: remove pure comments only for Svelte 3 ([#673](https://github.com/sveltejs/vite-plugin-svelte/pull/673)) + +- Bump supported Svelte 4 version to `^4.0.0` ([#675](https://github.com/sveltejs/vite-plugin-svelte/pull/675)) + +- Updated dependencies [[`ffbe8d3`](https://github.com/sveltejs/vite-plugin-svelte/commit/ffbe8d3ebf8b726a31b7614a38ce4b3a0fad7776)]: + - @sveltejs/vite-plugin-svelte-inspector@1.0.3 + +## 2.4.1 + +### Patch Changes + +- Ensure compatibility with Svelte 4 prereleases ([#661](https://github.com/sveltejs/vite-plugin-svelte/pull/661)) + + Note: We are going to remove `-next` from the Svelte peerDependency range in a minor release once Svelte `4.0.0` final has been released. + +- Updated dependencies [[`f5d9bd2`](https://github.com/sveltejs/vite-plugin-svelte/commit/f5d9bd239e23a73417f684c79ba893df42440915)]: + - @sveltejs/vite-plugin-svelte-inspector@1.0.2 + +## 2.4.0 + +### Minor Changes + +- refactor: release vite-plugin-svelte as unbundled javascript with jsdoc types ([#657](https://github.com/sveltejs/vite-plugin-svelte/pull/657)) + +## 2.3.0 + +### Minor Changes + +- Refactor Svelte inspector as a separate package ([#646](https://github.com/sveltejs/vite-plugin-svelte/pull/646)) + +### Patch Changes + +- remove unused invalid property Code.dependencies on compiler ouput type ([#652](https://github.com/sveltejs/vite-plugin-svelte/pull/652)) + +- fix(build): watch preprocessor dependencies during build --watch ([#653](https://github.com/sveltejs/vite-plugin-svelte/pull/653)) + +- Updated dependencies [[`1dd6933`](https://github.com/sveltejs/vite-plugin-svelte/commit/1dd69334240cea76e7db57b5ef1d70ed7f02c8f4)]: + - @sveltejs/vite-plugin-svelte-inspector@1.0.1 + +## 2.2.0 + +### Minor Changes + +- feat(inspector): Promote experimental.inspector to regular option ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +- feat(inspector): allow configuration via environment SVELTE_INSPECTOR_OPTIONS or SVELTE_INSPECTOR_TOGGLE ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +- feat(inspector): enable holdMode by default ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +- Remove internal SvelteKit specific handling ([#638](https://github.com/sveltejs/vite-plugin-svelte/pull/638)) + +### Patch Changes + +- fix(inspector): prepend vite base when calling \_\_openInEditor ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +- fix(inspector): after a file has been opened, automatically disable inspector on leaving browser ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +- fix(inspector): use control-shift as default keycombo on linux to avoid problems in firefox ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +- fix(svelte-inspector): mount outside body to avoid hydration claiming body removing it ([#631](https://github.com/sveltejs/vite-plugin-svelte/pull/631)) + +## 2.1.1 + +### Patch Changes + +- fix(resolve): normalize path resolved from "svelte" field to ensure consistency across operating systems ([#635](https://github.com/sveltejs/vite-plugin-svelte/pull/635)) + +## 2.1.0 + +### Minor Changes + +- log warnings for packages that use the `svelte` field to resolve Svelte files differently than standard Vite resolve ([#510](https://github.com/sveltejs/vite-plugin-svelte/pull/510)) + +### Patch Changes + +- fix(vitePreprocess): add dependencies to style preprocessor output ([#625](https://github.com/sveltejs/vite-plugin-svelte/pull/625)) + +- Skip Vite resolve workaround on Vite 4.1+ or Svelte 4+ ([#622](https://github.com/sveltejs/vite-plugin-svelte/pull/622)) + +- fix(vitePreprocess): use relative paths without lang suffix in sourcemaps to avoid missing source file errors. ([#625](https://github.com/sveltejs/vite-plugin-svelte/pull/625)) + +- Log stats in debug mode and remove `experimental.disableCompileStats` option. Use `DEBUG="vite:vite-plugin-svelte:stats"` when starting the dev server or build to log the compile stats. ([#614](https://github.com/sveltejs/vite-plugin-svelte/pull/614)) + +## 2.0.4 + +### Patch Changes + +- fix(vitePreprocess): remove problematic pure annotations that could lead to wrong build output in some cases ([#609](https://github.com/sveltejs/vite-plugin-svelte/pull/609)) + +## 2.0.3 + +### Patch Changes + +- fix(vitePreprocess): use relative paths in sourcemap sources ([#570](https://github.com/sveltejs/vite-plugin-svelte/pull/570)) + +- show correct error overlay for compiler errors during hot update ([#592](https://github.com/sveltejs/vite-plugin-svelte/pull/592)) + +- respect custom resolve.mainFields config when adding svelte ([#582](https://github.com/sveltejs/vite-plugin-svelte/pull/582)) + +## 2.0.2 + +### Patch Changes + +- improve detection of sveltekit in inspector plugin to be compatible to latest changes ([`47c54c9`](https://github.com/sveltejs/vite-plugin-svelte/commit/47c54c92b886ea9d9bdd1fc7549079b39215ccd1)) + +## 2.0.1 + +### Patch Changes + +- update minimum version of vitefu dependency to avoid peer mismatch ([#543](https://github.com/sveltejs/vite-plugin-svelte/pull/543)) + +## 2.0.0 + +### Major Changes + +- update svelte peerDependency to ^3.54.0 ([#529](https://github.com/sveltejs/vite-plugin-svelte/pull/529)) + +- remove commonjs variant of vite-plugin-svelte ([#522](https://github.com/sveltejs/vite-plugin-svelte/pull/522)) + + Make sure your package.json contains `"type": "module"`and see [FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md#how-can-i-use-vite-plugin-svelte-from-commonjs) for more information + +- update vite peerDependency to vite-4 ([#521](https://github.com/sveltejs/vite-plugin-svelte/pull/521)) + +### Patch Changes + +- Remove `experimental.useVitePreprocess` option in favour of `vitePreprocess` ([#538](https://github.com/sveltejs/vite-plugin-svelte/pull/538)) + +- Remove pre Vite 3.2 support for `vitePreprocess` ([#536](https://github.com/sveltejs/vite-plugin-svelte/pull/536)) + +## 2.0.0-beta.3 + +### Patch Changes + +- Remove `experimental.useVitePreprocess` option in favour of `vitePreprocess` ([#538](https://github.com/sveltejs/vite-plugin-svelte/pull/538)) + +- Remove pre Vite 3.2 support for `vitePreprocess` ([#536](https://github.com/sveltejs/vite-plugin-svelte/pull/536)) + +## 2.0.0-beta.2 + +### Major Changes + +- reintroduce custom svelte/ssr resolve ([#532](https://github.com/sveltejs/vite-plugin-svelte/pull/532)) + +## 2.0.0-beta.1 + +### Major Changes + +- remove custom svelte/ssr resolve that is no longer needed in vite 4 ([#527](https://github.com/sveltejs/vite-plugin-svelte/pull/527)) + +- update svelte peerDependency to ^3.54.0 ([#529](https://github.com/sveltejs/vite-plugin-svelte/pull/529)) + +## 2.0.0-beta.0 + +### Major Changes + +- remove cjs build ([#522](https://github.com/sveltejs/vite-plugin-svelte/pull/522)) + +- update vite peerDependency to vite-4 ([#521](https://github.com/sveltejs/vite-plugin-svelte/pull/521)) + +## 1.4.0 + +### Minor Changes + +- support `&direct` and `&raw` query parameters for svelte requests ([#513](https://github.com/sveltejs/vite-plugin-svelte/pull/513)) + +- Export `vitePreprocess()` Svelte preprocessor ([#509](https://github.com/sveltejs/vite-plugin-svelte/pull/509)) + +### Patch Changes + +- ensure sources paths in sourcemaps are not absolute file paths ([#513](https://github.com/sveltejs/vite-plugin-svelte/pull/513)) + +- remove experimental.generateMissingPreprocessorSourcemaps ([#514](https://github.com/sveltejs/vite-plugin-svelte/pull/514)) + +## 1.3.1 + +### Patch Changes + +- improve robustness of compile stats taking ([#507](https://github.com/sveltejs/vite-plugin-svelte/pull/507)) + +## 1.3.0 + +### Minor Changes + +- enable `prebundleSvelteLibraries` during dev by default to improve page loading for the dev server. ([#494](https://github.com/sveltejs/vite-plugin-svelte/pull/494)) + + see the [FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md#what-is-going-on-with-vite-and-pre-bundling-dependencies) for more information about `prebundleSvelteLibraries` and how to tune it. + +- Enable resolving via "svelte" exports condition ([#502](https://github.com/sveltejs/vite-plugin-svelte/pull/502)) + +- add compile time stats logging ([#503](https://github.com/sveltejs/vite-plugin-svelte/pull/503)) + +## 1.2.0 + +### Minor Changes + +- support string values of compilerOptions.css added in svelte 3.53.0 ([#490](https://github.com/sveltejs/vite-plugin-svelte/pull/490)) + +### Patch Changes + +- simplify init of compilerOptions.hydratable for kit (kit.browser.hydrate is no longer in use) ([#496](https://github.com/sveltejs/vite-plugin-svelte/pull/496)) + +- when prebundleSvelteLibraries is true and a dependency is manually excluded, generate reincludes for it's cjs deps ([#493](https://github.com/sveltejs/vite-plugin-svelte/pull/493)) + +- Refactor Svelte libraries config handling ([#478](https://github.com/sveltejs/vite-plugin-svelte/pull/478)) + +- fix(prebundleSvelteLibraries): avoid resolving via svelte field after a library has been prebundled ([#482](https://github.com/sveltejs/vite-plugin-svelte/pull/482)) + +## 1.1.1 + +### Patch Changes + +- Use `preprocessCSS` API from Vite 3.2 for `useVitePreprocess` option ([#479](https://github.com/sveltejs/vite-plugin-svelte/pull/479)) + +- add types to exports map in package.json ([#488](https://github.com/sveltejs/vite-plugin-svelte/pull/488)) + +## 1.1.0 + +### Minor Changes + +- Bring `prebundleSvelteLibraries` out of experimental, it is now a top-level option ([#476](https://github.com/sveltejs/vite-plugin-svelte/pull/476)) + +### Patch Changes + +- Remove `@rollup/pluginutils` dependency ([#469](https://github.com/sveltejs/vite-plugin-svelte/pull/469)) + +## 1.0.9 + +### Patch Changes + +- Use esnext for useVitePreprocess ([#452](https://github.com/sveltejs/vite-plugin-svelte/pull/452)) + +## 1.0.8 + +### Patch Changes + +- svelte-inspector: select hovered element instead of parent on mousemouse ([#449](https://github.com/sveltejs/vite-plugin-svelte/pull/449)) + +- svelte-inspector: ignore navigation keys while not enabled ([#449](https://github.com/sveltejs/vite-plugin-svelte/pull/449)) + +## 1.0.7 + +### Patch Changes + +- svelte-inspector: prevent info-bubble select ([#445](https://github.com/sveltejs/vite-plugin-svelte/pull/445)) + +## 1.0.6 + +### Patch Changes + +- update svelte-hmr and enable partial hmr accept by default (fixes [#134](https://github.com/sveltejs/vite-plugin-svelte/issues/134)) ([#440](https://github.com/sveltejs/vite-plugin-svelte/pull/440)) + +- svelte-inspector: add keyboard navigation, select element on activation, improve a11y and info bubble position/content ([#438](https://github.com/sveltejs/vite-plugin-svelte/pull/438)) + +## 1.0.5 + +### Patch Changes + +- removed peerDependency for vite 3.1.0-beta as vite 3.1.0 final has been released ([#431](https://github.com/sveltejs/vite-plugin-svelte/pull/431)) + +## 1.0.4 + +### Patch Changes + +- temporarily add vite 3.1 beta to peer dependencies rule to avoid warning on kit projects using it ([#427](https://github.com/sveltejs/vite-plugin-svelte/pull/427)) + + **warning:** this is going to be changed back to `^3.0.0` in a future patch + +## 1.0.3 + +### Patch Changes + +- ignore keyup events without key in inspector ([#417](https://github.com/sveltejs/vite-plugin-svelte/pull/417)) + +* fix svelte-inspector import for vite 3.1 ([#423](https://github.com/sveltejs/vite-plugin-svelte/pull/423)) + +## 1.0.2 + +### Patch Changes + +- update svelte-inspector inject code to be compatible with @sveltejs/kit > 1.0.0-next.405 ([#411](https://github.com/sveltejs/vite-plugin-svelte/pull/411)) + +## 1.0.1 + +### Major Changes + +- update to vite3 ([#359](https://github.com/sveltejs/vite-plugin-svelte/pull/359)) + +* bump minimum required node version to 14.18.0 to align with vite 3 ([#359](https://github.com/sveltejs/vite-plugin-svelte/pull/359)) + +- move plugin options in svelte.config.js into "vitePlugin" ([#389](https://github.com/sveltejs/vite-plugin-svelte/pull/389)) + + update your svelte.config.js and wrap [plugin options](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/config.md#plugin-options) with `vitePlugin` + + ```diff + // svelte.config.js + + compilerOptions: {...}, + preprocess: {...}, + extensions: [...], + onwarn: () => {...}, + kit: {}, + + vitePlugin: { + // include, exclude, emitCss, hot, ignorePluginPreprocessors, disableDependencyReinclusion, experimental + + } + ``` + +### Patch Changes + +- Always add dependencies using svelte to ssr.noExternal in vite config ([#359](https://github.com/sveltejs/vite-plugin-svelte/pull/359)) + +## 1.0.0-next.49 + +### Minor Changes + +- New experimental option sendWarningsToBrowser ([#372](https://github.com/sveltejs/vite-plugin-svelte/pull/372)) + +### Patch Changes + +- fix hmr not updating a component when returning to the last working state from an error state ([#371](https://github.com/sveltejs/vite-plugin-svelte/pull/371)) + +## 1.0.0-next.48 + +### Minor Changes + +- Automate setting of compilerOptions.hydratable from kit.browser.hydrate option ([#368](https://github.com/sveltejs/vite-plugin-svelte/pull/368)) + +### Patch Changes + +- Do not try to resolve svelte field in \_\_vite-browser-external, see (#362)" ([#363](https://github.com/sveltejs/vite-plugin-svelte/pull/363)) + +## 1.0.0-next.47 + +### Patch Changes + +- Use last modified time as cache busting parameter ([#356](https://github.com/sveltejs/vite-plugin-svelte/pull/356)) + +* Export loadSvelteConfig ([#356](https://github.com/sveltejs/vite-plugin-svelte/pull/356)) + +## 1.0.0-next.46 + +### Patch Changes + +- Bump svelte-hmr version ([#349](https://github.com/sveltejs/vite-plugin-svelte/pull/349)) + +## 1.0.0-next.45 + +### Patch Changes + +- Handle inspector autocomplete keydown event ([#338](https://github.com/sveltejs/vite-plugin-svelte/pull/338)) + +* Remove user-specified values for essential compilerOptions generate, format, cssHash and filename and log a warning ([#346](https://github.com/sveltejs/vite-plugin-svelte/pull/346)) + +- fix inspector not initializing correctly for sveltekit on windows (see [#342](https://github.com/sveltejs/vite-plugin-svelte/issues/342)) ([#344](https://github.com/sveltejs/vite-plugin-svelte/pull/344)) + +## 1.0.0-next.44 + +### Patch Changes + +- correctly resolve the experimental svelte inspector (see [#332](https://github.com/sveltejs/vite-plugin-svelte/issues/332)) (fixes [#330](https://github.com/sveltejs/vite-plugin-svelte/issues/330)) ([#333](https://github.com/sveltejs/vite-plugin-svelte/pull/333)) + +## 1.0.0-next.43 + +### Minor Changes + +- Add experimental Svelte Inspector to quickly jump to code from your browser. ([#322](https://github.com/sveltejs/vite-plugin-svelte/pull/322)) + +### Patch Changes + +- use deepmerge utility to merge inline config and svelte.config.js ([#322](https://github.com/sveltejs/vite-plugin-svelte/pull/322)) + +* do not warn if kit options are passed as inline config ([#319](https://github.com/sveltejs/vite-plugin-svelte/pull/319)) + +- Support import typescript files with .js extension ([#324](https://github.com/sveltejs/vite-plugin-svelte/pull/324)) + +* do not restart vite devserver on changes of svelte config when `configFile: false` is set ([#319](https://github.com/sveltejs/vite-plugin-svelte/pull/319)) + +## 1.0.0-next.42 + +### Minor Changes + +- skip reading default svelte config file with inline option `configFile: false` ([#317](https://github.com/sveltejs/vite-plugin-svelte/pull/317)) + +## 1.0.0-next.41 + +### Major Changes + +- Update vite peerDependency to ^2.9.0 and handle edge cases for `experimental.prebundleSvelteLibraries` ([#294](https://github.com/sveltejs/vite-plugin-svelte/pull/294)) + +### Patch Changes + +- Improved CSS Source Maps when using vite's `css: { devSourcemap: true }` ([#305](https://github.com/sveltejs/vite-plugin-svelte/pull/305)) + +## 1.0.0-next.40 + +### Patch Changes + +- improve handling of transitive cjs dependencies of svelte libraries during dev ssr ([#289](https://github.com/sveltejs/vite-plugin-svelte/pull/289)) + +## 1.0.0-next.39 + +### Patch Changes + +- prevent errors in resolveViaPackageJsonSvelte breaking vite resolve (fixes [#283](https://github.com/sveltejs/vite-plugin-svelte/issues/283)) ([#286](https://github.com/sveltejs/vite-plugin-svelte/pull/286)) + +## 1.0.0-next.38 + +### Patch Changes + +- don't warn if dependency doesn't export package.json ([#272](https://github.com/sveltejs/vite-plugin-svelte/pull/272)) + +* Optimize nested index-only dependencies ([#282](https://github.com/sveltejs/vite-plugin-svelte/pull/282)) + +- Remove transforming svelte css ([#280](https://github.com/sveltejs/vite-plugin-svelte/pull/280)) + +## 1.0.0-next.37 + +### Patch Changes + +- don't try to resolve node internal modules via package.json svelte field ([#266](https://github.com/sveltejs/vite-plugin-svelte/pull/266)) + +## 1.0.0-next.36 + +### Patch Changes + +- include stack and filename in error reporting for svelte preprocess errors ([#260](https://github.com/sveltejs/vite-plugin-svelte/pull/260)) + +## 1.0.0-next.35 + +### Patch Changes + +- do not use require-relative to resolve svelte field of libraries and cache resolved values (fixes [#244](https://github.com/sveltejs/vite-plugin-svelte/issues/244)) ([#254](https://github.com/sveltejs/vite-plugin-svelte/pull/254)) + +## 1.0.0-next.34 + +### Minor Changes + +- Automatically re-prebundle when Svelte config changed for `experimental.prebundleSvelteLibraries` ([#245](https://github.com/sveltejs/vite-plugin-svelte/pull/245)) + +### Patch Changes + +- use the resolved vite root to support backend integrations ([#247](https://github.com/sveltejs/vite-plugin-svelte/pull/247)) + +* fix `experimental.useVitePreprocess` option for Vite 2.8 ([#240](https://github.com/sveltejs/vite-plugin-svelte/pull/240)) + +## 1.0.0-next.33 + +### Minor Changes + +- auto-restart SvelteKit when Svelte config changed ([#237](https://github.com/sveltejs/vite-plugin-svelte/pull/237)) + +* handle preprocess for prebundleSvelteLibraries ([#229](https://github.com/sveltejs/vite-plugin-svelte/pull/229)) + +### Patch Changes + +- Skip prebundle non-js nested dependencies ([#234](https://github.com/sveltejs/vite-plugin-svelte/pull/234)) + +* handle production builds for non "production" mode ([#229](https://github.com/sveltejs/vite-plugin-svelte/pull/229)) + +## 1.0.0-next.32 + +### Major Changes + +- update vite peerDependency to ^2.7.0 and refactor server restart on change of svelte.config.js ([#223](https://github.com/sveltejs/vite-plugin-svelte/pull/223)) + +### Patch Changes + +- Ignore import protocols like `node:` when resolving the `svelte` field in package.json ([#225](https://github.com/sveltejs/vite-plugin-svelte/pull/225)) + +## 1.0.0-next.31 + +### Minor Changes + +- Improved error reporting for svelte compiler errors ([#220](https://github.com/sveltejs/vite-plugin-svelte/pull/220)) + +## 1.0.0-next.30 + +### Major Changes + +- Bump svelte peer dependency to ^3.44.0 ([#202](https://github.com/sveltejs/vite-plugin-svelte/pull/202)) + +## 1.0.0-next.29 + +### Major Changes + +- drop support for node12 ([#198](https://github.com/sveltejs/vite-plugin-svelte/pull/198)) + +### Minor Changes + +- Add `experimental.prebundleSvelteLibraries` option ([#200](https://github.com/sveltejs/vite-plugin-svelte/pull/200)) + +### Patch Changes + +- Disable CSS sourcemap in SSR ([#201](https://github.com/sveltejs/vite-plugin-svelte/pull/201)) + +## 1.0.0-next.28 + +### Patch Changes + +- Fix emitCss behaviour in a svelte config ([#194](https://github.com/sveltejs/vite-plugin-svelte/pull/194)) + +## 1.0.0-next.27 + +### Minor Changes + +- Run Vite preprocessors first in markup phase ([#189](https://github.com/sveltejs/vite-plugin-svelte/pull/189)) + +### Patch Changes + +- Handle flexible ssr signature for hooks with ssr argument ([#187](https://github.com/sveltejs/vite-plugin-svelte/pull/187)) + +## 1.0.0-next.26 + +### Major Changes + +- minimum required version of vite is 2.6.0 ([#182](https://github.com/sveltejs/vite-plugin-svelte/pull/182)) + +## 1.0.0-next.25 + +### Minor Changes + +- Use transformWithEsbuild for vite script preprocessor ([#173](https://github.com/sveltejs/vite-plugin-svelte/pull/173)) + +## 1.0.0-next.24 + +### Patch Changes + +- Only add all Svelte dependencies to ssr.noExternal in SSR build ([#169](https://github.com/sveltejs/vite-plugin-svelte/pull/169)) + +## 1.0.0-next.23 + +### Patch Changes + +- Svelte libraries without any Svelte components are also added to ssr.noExternal ([#166](https://github.com/sveltejs/vite-plugin-svelte/pull/166)) + +## 1.0.0-next.22 + +### Patch Changes + +- Only optimize nested cjs dependencies ([#163](https://github.com/sveltejs/vite-plugin-svelte/pull/163)) + +## 1.0.0-next.21 + +### Minor Changes + +- Add option disableDependencyReinclusion to offer users a way out of automatic optimization for hybrid packages ([#161](https://github.com/sveltejs/vite-plugin-svelte/pull/161)) + +### Patch Changes + +- Improve automatic dependency pre-bundling by not reincluding dependencies that are already present in optimizeDeps.exclude ([#159](https://github.com/sveltejs/vite-plugin-svelte/pull/159)) + +## 1.0.0-next.20 + +### Major Changes + +- Enable optimization for nested dependencies of excluded svelte dependencies ([#157](https://github.com/sveltejs/vite-plugin-svelte/pull/157)) + + Vite 2.5.3 and above is needed to support this feature. + +### Minor Changes + +- Improve dev warning message for components including only unscoped styles (fixes [#153](https://github.com/sveltejs/vite-plugin-svelte/issues/153)) ([#154](https://github.com/sveltejs/vite-plugin-svelte/pull/154)) + +## 1.0.0-next.19 + +### Patch Changes + +- add automatically excluded svelte dependencies to ssr.noExternal ([#147](https://github.com/sveltejs/vite-plugin-svelte/pull/147)) + +## 1.0.0-next.18 + +### Minor Changes + +- automatically exclude svelte dependencies in vite.optimizeDeps ([#145](https://github.com/sveltejs/vite-plugin-svelte/pull/145)) + +### Patch Changes + +- use createRequire to load svelte.config.cjs in esm projects (fixes [#141](https://github.com/sveltejs/vite-plugin-svelte/issues/141)) ([#142](https://github.com/sveltejs/vite-plugin-svelte/pull/142)) + +## 1.0.0-next.17 + +### Patch Changes + +- don't add svelte/ssr to vite.optimizeDeps.include (fixes [#138](https://github.com/sveltejs/vite-plugin-svelte/issues/138)) ([#139](https://github.com/sveltejs/vite-plugin-svelte/pull/139)) + +## 1.0.0-next.16 + +### Major Changes + +- automatically include svelte in vite config optimizeDeps.include ([#137](https://github.com/sveltejs/vite-plugin-svelte/pull/137)) + + Previously, svelte was automatically excluded. We include it now by default to improve deduplication. + + As a result, svelte is pre-bundled by vite during dev, which it logs when starting the devserver + + ```shell + Pre-bundling dependencies: + svelte/animate + svelte/easing + svelte/internal + svelte/motion + svelte/store + (...and 2 more) + (this will be run only when your dependencies or config have changed) + ``` + + And it's also visible in the browsers network tab, where requests for svelte imports now start with `node_modules/.vite/` during dev. + + Check out the [vite pre-bundling documentation](https://vitejs.dev/guide/dep-pre-bundling.html) for more information. + + To get the old behavior back, add the following to your vite config + + ```js + optimizeDeps: { + exclude: ["svelte"]; + } + ``` + +### Patch Changes + +- prepare for a change in vite 2.5.0 that would lead to errors in preprocessor dependency handling (fixes [#130](https://github.com/sveltejs/vite-plugin-svelte/issues/130)) ([#131](https://github.com/sveltejs/vite-plugin-svelte/pull/131)) + +## 1.0.0-next.15 + +### Major Changes + +- change default value of compilerOptions.hydratable to false ([#122](https://github.com/sveltejs/vite-plugin-svelte/pull/122)) + + This is done to align with svelte compiler defaults and improve output in non-ssr scenarios. + + Add `{compilerOptions: {hydratable: true}}` to vite-plugin-svelte config if you need hydration (eg. for ssr) + +### Minor Changes + +- add config option `experimental.dynamicCompileOptions` for finegrained control over compileOptions ([#122](https://github.com/sveltejs/vite-plugin-svelte/pull/122)) + +### Patch Changes + +- resolve vite.root option correctly (fixes [#113](https://github.com/sveltejs/vite-plugin-svelte/issues/113)) ([#115](https://github.com/sveltejs/vite-plugin-svelte/pull/115)) + +## 1.0.0-next.14 + +### Patch Changes + +- replace querystring with URLSearchParams ([#107](https://github.com/sveltejs/vite-plugin-svelte/pull/107)) + +* import svelte types instead of duplicating them ([#105](https://github.com/sveltejs/vite-plugin-svelte/pull/105)) + +- update svelte-hmr to 0.14.7 to fix issue with svelte 3.40 ([#112](https://github.com/sveltejs/vite-plugin-svelte/pull/112)) + +* turn diff-match-patch into an optional peer dependency to reduce footprint ([#110](https://github.com/sveltejs/vite-plugin-svelte/pull/110)) + +## 1.0.0-next.13 + +### Minor Changes + +- Add `experimental` section to options and move `useVitePreprocess` there ([#99](https://github.com/sveltejs/vite-plugin-svelte/pull/99)) + + Experimental options are not ready for production use and breaking changes to them can occur in any release + + If you already had `useVitePreprocess` enabled, update you config: + + ```diff + - svelte({useVitePreprocess: true}) + + svelte({experimental: {useVitePreprocess: true}}) + ``` + +* Add option to ignore svelte preprocessors of other vite plugins ([#98](https://github.com/sveltejs/vite-plugin-svelte/pull/98)) + + - ignore them all: `ignorePluginPreprocessors: true` + - ignore by name: `ignorePluginPreprocessors: ['',...]` + +- Move plugin preprocessor definition to api namespace ([#98](https://github.com/sveltejs/vite-plugin-svelte/pull/98)) + + Plugins that provide `myplugin.sveltePreprocess`, should move it to `myplugin.api.sveltePreprocess`, as suggested by [rollup](https://rollupjs.org/guide/en/#direct-plugin-communication) + +* Experimental: Generate sourcemaps for preprocessors that lack them ([#101](https://github.com/sveltejs/vite-plugin-svelte/pull/101)) + + enable option `experimental.generateMissingPreprocessorSourcemaps` to use it + +### Patch Changes + +- removed redundant `disableCssHmr` option ([#99](https://github.com/sveltejs/vite-plugin-svelte/pull/99)) + + You can use `emitCss: false` or `emitCss: !!isProduction` instead + +* further improvements to changelog (see [#93](https://github.com/sveltejs/vite-plugin-svelte/issues/93)) ([#94](https://github.com/sveltejs/vite-plugin-svelte/pull/94)) + +- reduce log output with log.once function to filter repetetive messages ([#101](https://github.com/sveltejs/vite-plugin-svelte/pull/101)) + +* remove transitive peer dependency on rollup (fixes [#57](https://github.com/sveltejs/vite-plugin-svelte/issues/57)) ([#103](https://github.com/sveltejs/vite-plugin-svelte/pull/103)) + +## 1.0.0-next.12 + +### Minor Changes + +- Resolve svelte to svelte/ssr when building for ssr (fixes [#74](https://github.com/sveltejs/vite-plugin-svelte/issues/74)) ([#75](https://github.com/sveltejs/vite-plugin-svelte/pull/75)) ([`f6f56fe`](https://github.com/sveltejs/vite-plugin-svelte/commit/f6f56fee7d3567196052a23440cb1818187fa232)) + +- Support svg extension ([#78](https://github.com/sveltejs/vite-plugin-svelte/pull/78)) ([`2eb09cf`](https://github.com/sveltejs/vite-plugin-svelte/commit/2eb09cf180c7ebf0fb4ccfccee663e5264b3814c)) + +- Restart dev server when svelte config file changes ([#72](https://github.com/sveltejs/vite-plugin-svelte/pull/72)) ([`5100376`](https://github.com/sveltejs/vite-plugin-svelte/commit/5100376ef91d5e39ec00222f1043e4fda047678b)) + +- Allow svelte imports to be added to optimizeDeps.include and don't exclude svelte from optimizeDeps then ([#68](https://github.com/sveltejs/vite-plugin-svelte/pull/68)) ([`9583900`](https://github.com/sveltejs/vite-plugin-svelte/commit/9583900a2b3600133cee3a46b6dbb7df137977b6)) + +- Vite config can be updated based on values in svelte config (see [#60](https://github.com/sveltejs/vite-plugin-svelte/issues/60)) ([#64](https://github.com/sveltejs/vite-plugin-svelte/pull/64)) ([`c3f65fd`](https://github.com/sveltejs/vite-plugin-svelte/commit/c3f65fdf414b22810ad60817b3e1e62790ba816f)) + +### Patch Changes + +- customize changelog format ([#90](https://github.com/sveltejs/vite-plugin-svelte/pull/90)) ([`b5a58cd`](https://github.com/sveltejs/vite-plugin-svelte/commit/b5a58cd814bbc71a5e59060d436770f7a0102262)) + +- relax svelte peer dependency to 3.34.0 ([#70](https://github.com/sveltejs/vite-plugin-svelte/pull/70)) ([`377d464`](https://github.com/sveltejs/vite-plugin-svelte/commit/377d464eba30c56f012deba3d306cb5a7195b787)) + +- do not transform imports tagged with ?url or ?raw (fixes #87) ([#88](https://github.com/sveltejs/vite-plugin-svelte/pull/88)) ([`d1d2638`](https://github.com/sveltejs/vite-plugin-svelte/commit/d1d2638b247830852faa89e7b9bc9a430b81ba51)) + +- update svelte-hmr to ^0.14.5 to fix hmr reordering issue introduced by a change in svelte 3.38.3 ([#92](https://github.com/sveltejs/vite-plugin-svelte/pull/92)) ([`cdfd821`](https://github.com/sveltejs/vite-plugin-svelte/commit/cdfd8210770150c6e40f68b6b48cd2e455414299)) + +- fix kit-node tests ([#55](https://github.com/sveltejs/vite-plugin-svelte/pull/55)) ([`09b63d3`](https://github.com/sveltejs/vite-plugin-svelte/commit/09b63d32e8816acc554a66d4d01062be197dfbb7)) + +- output sourcemap in hmr helper preprocessor ([#71](https://github.com/sveltejs/vite-plugin-svelte/pull/71)) ([`97ee68c`](https://github.com/sveltejs/vite-plugin-svelte/commit/97ee68c5106e58b2e7c4eb97e8cf7dd1c52bbfd3)) + +- reduced debug output ([#83](https://github.com/sveltejs/vite-plugin-svelte/pull/83)) ([`eb048ff`](https://github.com/sveltejs/vite-plugin-svelte/commit/eb048ff9419488f75869ffb880a78a2a3aa5a6bb)) + +- Refactored e2e-tests to use package.json scripts + +- Updated dependencies + +## 1.0.0-next.11 + +### Major Changes + +- convert to es module with cjs fallback, use named export instead of default ([#54](https://github.com/sveltejs/vite-plugin-svelte/pull/54)) ([`0f7e256`](https://github.com/sveltejs/vite-plugin-svelte/commit/0f7e256a9ebb0ee9ac6075146d27bf4f11ecdab3)) + + If you are using vite-plugin-svelte with require, you should switch to esm and import the named export "svelte". + An example can be found in the usage section of the [readme](README.md) + + For existing esm configs update your import to use the new named export. + + ```diff + - import svelte from '@sveltejs/vite-plugin-svelte'; + + import { svelte } from '@sveltejs/vite-plugin-svelte'; + ``` + + continuing with cjs/require is discouraged but if you must use it, update your require statement to use the named export + + ```diff + - const svelte = require('@sveltejs/vite-plugin-svelte'); + + const { svelte } = require('@sveltejs/vite-plugin-svelte'); + ``` + +### Minor Changes + +- Log svelte compiler warnings to console. use options.onwarn to customize logging ([#45](https://github.com/sveltejs/vite-plugin-svelte/pull/45)) ([`673cf61`](https://github.com/sveltejs/vite-plugin-svelte/commit/673cf61b3800e7a64be2b73a7273909da95729d2)) + +### Patch Changes + +- Update to esbuild 0.12 and vite 2.3.7 ([#44](https://github.com/sveltejs/vite-plugin-svelte/pull/44)) ([`24ae093`](https://github.com/sveltejs/vite-plugin-svelte/commit/24ae0934301cb50506bf39cdccc07ad3eac546fd)) + +- Update engines.node to "^12.20 || ^14.13.1 || >= 16" ([#44](https://github.com/sveltejs/vite-plugin-svelte/pull/44)) ([`24ae093`](https://github.com/sveltejs/vite-plugin-svelte/commit/24ae0934301cb50506bf39cdccc07ad3eac546fd)) + +- Enable logging for compiler warnings ([#45](https://github.com/sveltejs/vite-plugin-svelte/pull/45)) ([`673cf61`](https://github.com/sveltejs/vite-plugin-svelte/commit/673cf61b3800e7a64be2b73a7273909da95729d2)) + +## 1.0.0-next.10 + +### Minor Changes + +- Allow `emitCss: false` for production builds and customizable compilerOptions.css and hydratable (fixes [#9](https://github.com/sveltejs/vite-plugin-svelte/issues/9)) ([#41](https://github.com/sveltejs/vite-plugin-svelte/pull/41)) ([`cb7f03d`](https://github.com/sveltejs/vite-plugin-svelte/commit/cb7f03d61c19f0b98c6412c11bbaa4af978da9ed)) + +## 1.0.0-next.9 + +### Patch Changes + +- Ensure esm config loading works on windows ([#38](https://github.com/sveltejs/vite-plugin-svelte/pull/38)) ([`5aef91c`](https://github.com/sveltejs/vite-plugin-svelte/commit/5aef91c8752c8de94a1f1fcb28618606b7c44670)) + +## 1.0.0-next.8 + +### Minor Changes + +- Support esm in svelte.config.js and svelte.config.mjs ([#35](https://github.com/sveltejs/vite-plugin-svelte/pull/35)) ([`4018ce6`](https://github.com/sveltejs/vite-plugin-svelte/commit/4018ce621b4df75877e0e18057c332f27158d42b)) + +- Add configFile option ([#35](https://github.com/sveltejs/vite-plugin-svelte/pull/35)) ([`4018ce6`](https://github.com/sveltejs/vite-plugin-svelte/commit/4018ce621b4df75877e0e18057c332f27158d42b)) + +### Patch Changes + +- Watch preprocessor dependencies and trigger hmr on change ([#34](https://github.com/sveltejs/vite-plugin-svelte/pull/34)) ([`e5d4749`](https://github.com/sveltejs/vite-plugin-svelte/commit/e5d4749c0850260a295daab9cb15866fe58ee709)) + +## 1.0.0-next.7 + +### Minor Changes + +- Reduced cache usage, share css cache between SSR and client ([#32](https://github.com/sveltejs/vite-plugin-svelte/pull/32)) ([`113bb7d`](https://github.com/sveltejs/vite-plugin-svelte/commit/113bb7dc330a7517085d12d1d0758a376a12253f)) + +## 1.0.0-next.6 + +### Minor Changes + +- 1be46f1: improved css hmr +- a0f5a65: Allow other vite plugins to define preprocessors + +### Patch Changes + +- 8d9ef96: fix: do not preserve types unless useVitePreprocess option is true +- 6f4a253: disable svelte-hmr overlay by default +- 18647aa: improve virtual css module path (fixes #14) + +## 1.0.0-next.5 + +### Patch Changes + +- 61439ae: initial release diff --git a/js-plugins/svelte/README.md b/js-plugins/svelte/README.md new file mode 100644 index 0000000..48798bc --- /dev/null +++ b/js-plugins/svelte/README.md @@ -0,0 +1,28 @@ +# @sveltejs/vite-plugin-svelte + +The official [Svelte](https://svelte.dev) plugin for [Vite](https://vitejs.dev). + +## Usage + +```js +// vite.config.js +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; + +export default defineConfig({ + plugins: [ + svelte({ + /* plugin options */ + }) + ] +}); +``` + +## Documentation + +- [Plugin options](../../docs/config.md) +- [FAQ](../../docs/faq.md) + +## License + +[MIT](./LICENSE) diff --git a/js-plugins/svelte/__tests__/compile.spec.js b/js-plugins/svelte/__tests__/compile.spec.js new file mode 100644 index 0000000..ca6d193 --- /dev/null +++ b/js-plugins/svelte/__tests__/compile.spec.js @@ -0,0 +1,81 @@ +import process from 'node:process'; +import { describe, it, expect } from 'vitest'; +import { createCompileSvelte } from '../src/utils/compile.js'; +/** @type {import('../../types/options.d.ts').ResolvedOptions} */ +const options = { + compilerOptions: { + dev: false, + format: 'esm', + css: 'external' + }, + isBuild: false, + isDebug: false, + isProduction: false, + isServe: false, + root: process.cwd() +}; + +describe('createCompileSvelte', () => { + it('returns function', () => { + const compileSvelte = createCompileSvelte(options); + expect(typeof compileSvelte).toBe('function'); + }); + + describe('compileSvelte', async () => { + it('removes dangling pure annotations', async () => { + const code = ` +
{x}
`; + const compileSvelte = createCompileSvelte(options); + const output = await compileSvelte( + { + cssId: 'svelte-xxxxx', + query: {}, + raw: false, + ssr: false, + timestamp: Date.now(), + id: 'id', + filename: '/some/File.svelte', + normalizedFilename: 'some/File.svelte' + }, + code, + {} + ); + expect(output.compiled.js.code).not.toContain('/* @__PURE__ */\n'); + }); + + it('detects script lang', async () => { + const code = ` + + +
{x}
`; + + const compileSvelte = createCompileSvelte(options); + const output = await compileSvelte( + { + cssId: 'svelte-xxxxx', + query: {}, + raw: false, + ssr: false, + timestamp: Date.now(), + id: 'id', + filename: '/some/File.svelte', + normalizedFilename: 'some/File.svelte' + }, + code, + {} + ); + + expect(output.lang).toBe('ts'); + }); + }); +}); diff --git a/js-plugins/svelte/__tests__/fixtures/preprocess/foo.css b/js-plugins/svelte/__tests__/fixtures/preprocess/foo.css new file mode 100644 index 0000000..79d0608 --- /dev/null +++ b/js-plugins/svelte/__tests__/fixtures/preprocess/foo.css @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/js-plugins/svelte/__tests__/fixtures/preprocess/foo.scss b/js-plugins/svelte/__tests__/fixtures/preprocess/foo.scss new file mode 100644 index 0000000..79d0608 --- /dev/null +++ b/js-plugins/svelte/__tests__/fixtures/preprocess/foo.scss @@ -0,0 +1,3 @@ +.foo { + color: green; +} diff --git a/js-plugins/svelte/__tests__/preprocess.spec.js b/js-plugins/svelte/__tests__/preprocess.spec.js new file mode 100644 index 0000000..919b34e --- /dev/null +++ b/js-plugins/svelte/__tests__/preprocess.spec.js @@ -0,0 +1,80 @@ +import { describe, it, expect } from 'vitest'; +import { vitePreprocess } from '../src/preprocess.js'; +import path from 'node:path'; +import { normalizePath } from 'vite'; +import { fileURLToPath } from 'node:url'; + +const fixtureDir = normalizePath( + path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'preprocess') +); + +/** @type {import('vite').InlineConfig} */ +const inlineConfig = { + configFile: false, + root: fixtureDir +}; + +describe('vitePreprocess', () => { + it('returns function', () => { + const preprocessorGroup = vitePreprocess({ script: true, style: inlineConfig }); + expect(typeof preprocessorGroup).toBe('object'); + expect(typeof preprocessorGroup.script).toBe('function'); + expect(typeof preprocessorGroup.style).toBe('function'); + }); + + describe('style', async () => { + it('preprocess with postcss if no lang', async () => { + const preprocessorGroup = vitePreprocess({ style: inlineConfig }); + const style = /**@type {import('svelte/types/compiler/preprocess').Preprocessor} */ ( + preprocessorGroup.style + ); + expect(style).toBeDefined(); + + const pcss = "@import './foo';"; + const processed = await style({ + content: pcss, + attributes: {}, + markup: '', // not read by vitePreprocess + filename: `${fixtureDir}/File.svelte` + }); + + expect(processed).toBeDefined(); + expect(processed.code).not.toContain('@import'); + }); + + it('produces sourcemap with relative filename', async () => { + const preprocessorGroup = vitePreprocess({ + style: { ...inlineConfig, css: { devSourcemap: true } } + }); + const style = /**@type {import('svelte/types/compiler/preprocess').Preprocessor} */ ( + preprocessorGroup.style + ); + expect(style).toBeDefined(); + const scss = ` + @use './foo'; + .foo { + &.bar { + color: red; + } + }`.replace(/\t/g, ''); + + const processed = await style({ + content: scss, + attributes: { + lang: 'scss' + }, + markup: '', // not read by vitePreprocess + filename: `${fixtureDir}/File.svelte` + }); + expect(processed).toBeDefined(); + const { code, map, dependencies } = processed; + expect(code).toBe('.foo {\n color: green;\n}\n\n.foo.bar {\n color: red;\n}'); + expect(map.sources.length).toBe(2); + expect(map.sources[0]).toBe('foo.scss'); + expect(map.sources[1]).toBe('File.svelte'); + expect(dependencies).toBeDefined(); + expect(dependencies[0]).toBe(path.resolve(fixtureDir, 'foo.scss')); + expect(dependencies.length).toBe(1); + }); + }); +}); diff --git a/js-plugins/svelte/__tests__/sourcemaps.spec.js b/js-plugins/svelte/__tests__/sourcemaps.spec.js new file mode 100644 index 0000000..afe319f --- /dev/null +++ b/js-plugins/svelte/__tests__/sourcemaps.spec.js @@ -0,0 +1,79 @@ +import { describe, it, expect } from 'vitest'; +import { removeLangSuffix, mapToRelative } from '../src/utils/sourcemaps.js'; +import { lang_sep } from '../src/preprocess.js'; +import { normalizePath } from 'vite'; +import path from 'node:path'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const fixtureDir = normalizePath( + path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'preprocess') +); +const filename = 'File.svelte'; + +describe('removeLangSuffix', () => { + it('removes suffix', () => { + const suffix = `${lang_sep}.scss`; + const map = { + file: `${fixtureDir}/${filename}${suffix}`, + sources: ['foo.scss', `${fixtureDir}/${filename}${suffix}`], + sourceRoot: fixtureDir + }; + removeLangSuffix(map, suffix); + expect(map.file).toBe(`${fixtureDir}/${filename}`); + expect(map.sourceRoot).toBe(fixtureDir); + expect(map.sources[0]).toBe('foo.scss'); + expect(map.sources[1]).toBe(`${fixtureDir}/${filename}`); + }); +}); + +describe('mapToRelative', () => { + it('converts absolute to relative', () => { + const file = `${fixtureDir}/File.svelte`; + const map = { + file, + sources: [`${fixtureDir}/foo.scss`, file] + }; + mapToRelative(map, file); + expect(map.file).toBe('File.svelte'); + expect(map.sources[0]).toBe('foo.scss'); + expect(map.sources[1]).toBe('File.svelte'); + }); + + it('accounts for sourceRoot', () => { + const file = `${fixtureDir}/File.svelte`; + const sourceRoot = normalizePath(path.resolve(fixtureDir, '..')); + const rootedBase = fixtureDir.replace(sourceRoot, ''); + const map = { + file, + sourceRoot, + sources: [ + `${rootedBase}/foo.scss`, + `${rootedBase}/File.svelte`, + `${pathToFileURL(`${fixtureDir}/bar.scss`)}` + ] + }; + mapToRelative(map, file); + expect(map.file).toBe('File.svelte'); + expect(map.sources[0]).toBe('foo.scss'); + expect(map.sources[1]).toBe('File.svelte'); + expect(map.sources[2]).toBe('bar.scss'); + expect(map.sources.length).toBe(3); + expect(map.sourceRoot).not.toBeDefined(); + }); + + it('accounts for relative sourceRoot', () => { + const file = `${fixtureDir}/File.svelte`; + const map = { + file, + sourceRoot: './some-path/..', + sources: ['foo.scss', 'File.svelte', `${pathToFileURL(`${fixtureDir}/bar.scss`)}`] + }; + mapToRelative(map, file); + expect(map.file).toBe('File.svelte'); + expect(map.sources[0]).toBe('./some-path/../foo.scss'); + expect(map.sources[1]).toBe('./some-path/../File.svelte'); + expect(map.sources[2]).toBe('bar.scss'); + expect(map.sources.length).toBe(3); + expect(map.sourceRoot).not.toBeDefined(); + }); +}); diff --git a/js-plugins/svelte/package.json b/js-plugins/svelte/package.json index cbe5be4..6445028 100644 --- a/js-plugins/svelte/package.json +++ b/js-plugins/svelte/package.json @@ -1,12 +1,52 @@ { - "name": "svelte", - "version": "1.0.0", - "description": "", - "main": "index.js", + "name": "@farmfe/js-plugins-svelte", + "version": "5.0.3", + "license": "MIT", + "author": "dominikg", + "files": [ + "src", + "types" + ], + "type": "module", + "types": "types/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./types/index.d.ts", + "default": "./src/index.js" + } + } + }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "check:publint": "publint --strict", + "check:types": "tsc --noEmit", + "generate:types": "dts-buddy -m \"@sveltejs/vite-plugin-svelte:src/public.d.ts\"" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "keywords": [ + "farm-plugin", + "plugin", + "farmfe", + "svelte" + ], + "dependencies": { + "debug": "^4.4.0", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.5" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" }, - "keywords": [], - "author": "", - "license": "ISC" + "devDependencies": { + "@types/debug": "^4.1.12", + "esbuild": "^0.24.2", + "sass": "^1.83.4", + "svelte": "^5.19.0", + "vite": "^6.0.9" + } } diff --git a/js-plugins/svelte/playground/.gitignore b/js-plugins/svelte/playground/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/js-plugins/svelte/playground/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/js-plugins/svelte/playground/README.md b/js-plugins/svelte/playground/README.md new file mode 100644 index 0000000..e6cd94f --- /dev/null +++ b/js-plugins/svelte/playground/README.md @@ -0,0 +1,47 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/js-plugins/svelte/playground/index.html b/js-plugins/svelte/playground/index.html new file mode 100644 index 0000000..b6c5f0a --- /dev/null +++ b/js-plugins/svelte/playground/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Svelte + TS + + +
+ + + diff --git a/js-plugins/svelte/playground/package.json b/js-plugins/svelte/playground/package.json new file mode 100644 index 0000000..3d99a3f --- /dev/null +++ b/js-plugins/svelte/playground/package.json @@ -0,0 +1,20 @@ +{ + "name": "svelte", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tsconfig/svelte": "^5.0.4", + "svelte": "^5.15.0", + "svelte-check": "^4.1.1", + "typescript": "~5.6.2", + "vite": "^6.0.5" + } +} diff --git a/js-plugins/svelte/playground/public/vite.svg b/js-plugins/svelte/playground/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/js-plugins/svelte/playground/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js-plugins/svelte/playground/src/App.svelte b/js-plugins/svelte/playground/src/App.svelte new file mode 100644 index 0000000..f75b68a --- /dev/null +++ b/js-plugins/svelte/playground/src/App.svelte @@ -0,0 +1,47 @@ + + +
+
+ + + + + + +
+

Vite + Svelte

+ +
+ +
+ +

+ Check out SvelteKit, the official Svelte app framework powered by Vite! +

+ +

+ Click on the Vite and Svelte logos to learn more +

+
+ + diff --git a/js-plugins/svelte/playground/src/app.css b/js-plugins/svelte/playground/src/app.css new file mode 100644 index 0000000..617f5e9 --- /dev/null +++ b/js-plugins/svelte/playground/src/app.css @@ -0,0 +1,79 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/js-plugins/svelte/playground/src/assets/svelte.svg b/js-plugins/svelte/playground/src/assets/svelte.svg new file mode 100644 index 0000000..c5e0848 --- /dev/null +++ b/js-plugins/svelte/playground/src/assets/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/js-plugins/svelte/playground/src/lib/Counter.svelte b/js-plugins/svelte/playground/src/lib/Counter.svelte new file mode 100644 index 0000000..37d75ce --- /dev/null +++ b/js-plugins/svelte/playground/src/lib/Counter.svelte @@ -0,0 +1,10 @@ + + + diff --git a/js-plugins/svelte/playground/src/main.ts b/js-plugins/svelte/playground/src/main.ts new file mode 100644 index 0000000..664a057 --- /dev/null +++ b/js-plugins/svelte/playground/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from 'svelte' +import './app.css' +import App from './App.svelte' + +const app = mount(App, { + target: document.getElementById('app')!, +}) + +export default app diff --git a/js-plugins/svelte/playground/src/vite-env.d.ts b/js-plugins/svelte/playground/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/js-plugins/svelte/playground/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/js-plugins/svelte/playground/svelte.config.js b/js-plugins/svelte/playground/svelte.config.js new file mode 100644 index 0000000..b0683fd --- /dev/null +++ b/js-plugins/svelte/playground/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/js-plugins/svelte/playground/tsconfig.app.json b/js-plugins/svelte/playground/tsconfig.app.json new file mode 100644 index 0000000..55a2f9b --- /dev/null +++ b/js-plugins/svelte/playground/tsconfig.app.json @@ -0,0 +1,20 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true, + "moduleDetection": "force" + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/js-plugins/svelte/playground/tsconfig.json b/js-plugins/svelte/playground/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/js-plugins/svelte/playground/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/js-plugins/svelte/playground/tsconfig.node.json b/js-plugins/svelte/playground/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/js-plugins/svelte/playground/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/js-plugins/svelte/playground/vite.config.ts b/js-plugins/svelte/playground/vite.config.ts new file mode 100644 index 0000000..d32eba1 --- /dev/null +++ b/js-plugins/svelte/playground/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], +}) diff --git a/js-plugins/svelte/src/handle-hot-update.js b/js-plugins/svelte/src/handle-hot-update.js new file mode 100644 index 0000000..82758e5 --- /dev/null +++ b/js-plugins/svelte/src/handle-hot-update.js @@ -0,0 +1,145 @@ +import { log, logCompilerWarnings } from './utils/log.js'; +import { toRollupError } from './utils/error.js'; + +/** + * Vite-specific HMR handling + * + * @param {Function} compileSvelte + * @param {import('vite').HmrContext} ctx + * @param {import('./types/id.d.ts').SvelteRequest} svelteRequest + * @param {import('./utils/vite-plugin-svelte-cache.js').VitePluginSvelteCache} cache + * @param {import('./types/options.d.ts').ResolvedOptions} options + * @returns {Promise} + */ +export async function handleHotUpdate(compileSvelte, ctx, svelteRequest, cache, options) { + if (!cache.has(svelteRequest)) { + // file hasn't been requested yet (e.g. async component) + log.debug( + `handleHotUpdate called before initial transform for ${svelteRequest.id}`, + undefined, + 'hmr' + ); + return; + } + const { read, server, modules } = ctx; + + const cachedJS = cache.getJS(svelteRequest); + const cachedCss = cache.getCSS(svelteRequest); + + const content = await read(); + /** @type {import('./types/compile.d.ts').CompileData} */ + let compileData; + try { + compileData = await compileSvelte(svelteRequest, content, options); + cache.update(compileData); + } catch (e) { + cache.setError(svelteRequest, e); + throw toRollupError(e, options); + } + + const affectedModules = [...modules]; + + const cssIdx = modules.findIndex((m) => m.id === svelteRequest.cssId); + if (cssIdx > -1) { + const cssUpdated = cssChanged(cachedCss, compileData.compiled.css); + if (!cssUpdated) { + log.debug(`skipping unchanged css for ${svelteRequest.cssId}`, undefined, 'hmr'); + affectedModules.splice(cssIdx, 1); + } + } + const jsIdx = modules.findIndex((m) => m.id === svelteRequest.id); + if (jsIdx > -1) { + const jsUpdated = jsChanged(cachedJS, compileData.compiled.js, svelteRequest.filename); + if (!jsUpdated) { + log.debug(`skipping unchanged js for ${svelteRequest.id}`, undefined, 'hmr'); + affectedModules.splice(jsIdx, 1); + // transform won't be called, log warnings here + logCompilerWarnings(svelteRequest, compileData.compiled.warnings, options); + } + } + + // TODO is this enough? see also: https://github.com/vitejs/vite/issues/2274 + const ssrModulesToInvalidate = affectedModules.filter((m) => !!m.ssrTransformResult); + if (ssrModulesToInvalidate.length > 0) { + log.debug( + `invalidating modules ${ssrModulesToInvalidate.map((m) => m.id).join(', ')}`, + undefined, + 'hmr' + ); + ssrModulesToInvalidate.forEach((moduleNode) => server.moduleGraph.invalidateModule(moduleNode)); + } + if (affectedModules.length > 0) { + log.debug( + `handleHotUpdate for ${svelteRequest.id} result: ${affectedModules + .map((m) => m.id) + .join(', ')}`, + undefined, + 'hmr' + ); + } + return affectedModules; +} + +/** + * @param {import('./types/compile.d.ts').Code | null} [prev] + * @param {import('./types/compile.d.ts').Code | null} [next] + * @returns {boolean} + */ +function cssChanged(prev, next) { + return !isCodeEqual(prev?.code, next?.code); +} + +/** + * @param {import('./types/compile.d.ts').Code | null} [prev] + * @param {import('./types/compile.d.ts').Code | null} [next] + * @param {string} [filename] + * @returns {boolean} + */ +function jsChanged(prev, next, filename) { + const prevJs = prev?.code; + const nextJs = next?.code; + const isStrictEqual = isCodeEqual(prevJs, nextJs); + if (isStrictEqual) { + return false; + } + const isLooseEqual = isCodeEqual(normalizeJsCode(prevJs), normalizeJsCode(nextJs)); + if (!isStrictEqual && isLooseEqual) { + log.debug( + `ignoring compiler output js change for ${filename} as it is equal to previous output after normalization`, + undefined, + 'hmr' + ); + } + return !isLooseEqual; +} + +/** + * @param {string} [prev] + * @param {string} [next] + * @returns {boolean} + */ +function isCodeEqual(prev, next) { + if (!prev && !next) { + return true; + } + if ((!prev && next) || (prev && !next)) { + return false; + } + return prev === next; +} + +/** + * remove code that only changes metadata and does not require a js update for the component to keep working + * + * 1) add_location() calls. These add location metadata to elements, only used by some dev tools + * 2) ... maybe more (or less) in the future + * + * @param {string} [code] + * @returns {string | undefined} + */ +function normalizeJsCode(code) { + if (!code) { + return code; + } + return code.replace(/\s*\badd_location\s*\([^)]*\)\s*;?/g, ''); +} diff --git a/js-plugins/svelte/src/index.js b/js-plugins/svelte/src/index.js new file mode 100644 index 0000000..9ec43e9 --- /dev/null +++ b/js-plugins/svelte/src/index.js @@ -0,0 +1,236 @@ +import fs from 'node:fs'; +import process from 'node:process'; +import { svelteInspector } from '@sveltejs/vite-plugin-svelte-inspector'; +import { handleHotUpdate } from './handle-hot-update.js'; +import { log, logCompilerWarnings } from './utils/log.js'; +import { createCompileSvelte } from './utils/compile.js'; +import { buildIdParser, buildModuleIdParser } from './utils/id.js'; +import { + buildExtraViteConfig, + validateInlineOptions, + resolveOptions, + patchResolvedViteConfig, + preResolveOptions, + ensureConfigEnvironmentMainFields, + ensureConfigEnvironmentConditions +} from './utils/options.js'; +import { ensureWatchedFile, setupWatchers } from './utils/watch.js'; +import { toRollupError } from './utils/error.js'; +import { saveSvelteMetadata } from './utils/optimizer.js'; +import { VitePluginSvelteCache } from './utils/vite-plugin-svelte-cache.js'; +import { loadRaw } from './utils/load-raw.js'; +import * as svelteCompiler from 'svelte/compiler'; + +/** + * @param {Partial} [inlineOptions] + * @returns {import('vite').Plugin[]} + */ +export function svelte(inlineOptions) { + if (process.env.DEBUG != null) { + log.setLevel('debug'); + } + validateInlineOptions(inlineOptions); + const cache = new VitePluginSvelteCache(); + // updated in configResolved hook + /** @type {import('./types/id.d.ts').IdParser} */ + let requestParser; + /** @type {import('./types/id.d.ts').ModuleIdParser} */ + let moduleRequestParser; + /** @type {import('./types/options.d.ts').ResolvedOptions} */ + let options; + /** @type {import('vite').ResolvedConfig} */ + let viteConfig; + /** @type {import('./types/compile.d.ts').CompileSvelte} */ + let compileSvelte; + /** @type {import('./types/plugin-api.d.ts').PluginAPI} */ + const api = {}; + /** @type {import('vite').Plugin[]} */ + const plugins = [ + { + name: 'vite-plugin-svelte', + // make sure our resolver runs before vite internal resolver to resolve svelte field correctly + enforce: 'pre', + api, + async config(config, configEnv) { + // setup logger + if (process.env.DEBUG) { + log.setLevel('debug'); + } else if (config.logLevel) { + log.setLevel(config.logLevel); + } + // @ts-expect-error temporarily lend the options variable until fixed in configResolved + options = await preResolveOptions(inlineOptions, config, configEnv); + // extra vite config + const extraViteConfig = await buildExtraViteConfig(options, config); + log.debug('additional vite config', extraViteConfig, 'config'); + return extraViteConfig; + }, + + configEnvironment(name, config, opts) { + ensureConfigEnvironmentMainFields(name, config, opts); + // @ts-expect-error the function above should make `resolve.mainFields` non-nullable + config.resolve.mainFields.unshift('svelte'); + + ensureConfigEnvironmentConditions(name, config, opts); + // @ts-expect-error the function above should make `resolve.conditions` non-nullable + config.resolve.conditions.push('svelte'); + }, + + async configResolved(config) { + options = resolveOptions(options, config, cache); + patchResolvedViteConfig(config, options); + requestParser = buildIdParser(options); + compileSvelte = createCompileSvelte(); + viteConfig = config; + // TODO deep clone to avoid mutability from outside? + api.options = options; + log.debug('resolved options', options, 'config'); + }, + + async buildStart() { + if (!options.prebundleSvelteLibraries) return; + const isSvelteMetadataChanged = await saveSvelteMetadata(viteConfig.cacheDir, options); + if (isSvelteMetadataChanged) { + // Force Vite to optimize again. Although we mutate the config here, it works because + // Vite's optimizer runs after `buildStart()`. + viteConfig.optimizeDeps.force = true; + } + }, + + configureServer(server) { + options.server = server; + setupWatchers(options, cache, requestParser); + }, + + async load(id, opts) { + const ssr = !!opts?.ssr; + const svelteRequest = requestParser(id, !!ssr); + if (svelteRequest) { + const { filename, query, raw } = svelteRequest; + if (raw) { + const code = await loadRaw(svelteRequest, compileSvelte, options); + // prevent vite from injecting sourcemaps in the results. + return { + code, + map: { + mappings: '' + } + }; + } else { + if (query.svelte && query.type === 'style') { + const css = cache.getCSS(svelteRequest); + if (css) { + return css; + } + } + // prevent vite asset plugin from loading files as url that should be compiled in transform + if (viteConfig.assetsInclude(filename)) { + log.debug(`load returns raw content for ${filename}`, undefined, 'load'); + return fs.readFileSync(filename, 'utf-8'); + } + } + } + }, + + async resolveId(importee, importer, opts) { + const ssr = !!opts?.ssr; + const svelteRequest = requestParser(importee, ssr); + if (svelteRequest?.query.svelte) { + if ( + svelteRequest.query.type === 'style' && + !svelteRequest.raw && + !svelteRequest.query.inline + ) { + // return cssId with root prefix so postcss pipeline of vite finds the directory correctly + // see https://github.com/sveltejs/vite-plugin-svelte/issues/14 + log.debug( + `resolveId resolved virtual css module ${svelteRequest.cssId}`, + undefined, + 'resolve' + ); + return svelteRequest.cssId; + } + } + }, + + async transform(code, id, opts) { + const ssr = !!opts?.ssr; + const svelteRequest = requestParser(id, ssr); + if (!svelteRequest || svelteRequest.query.type === 'style' || svelteRequest.raw) { + return; + } + let compileData; + try { + compileData = await compileSvelte(svelteRequest, code, options); + } catch (e) { + cache.setError(svelteRequest, e); + throw toRollupError(e, options); + } + logCompilerWarnings(svelteRequest, compileData.compiled.warnings, options); + cache.update(compileData); + if (compileData.dependencies?.length) { + if (options.server) { + for (const dep of compileData.dependencies) { + ensureWatchedFile(options.server.watcher, dep, options.root); + } + } else if (options.isBuild && viteConfig.build.watch) { + for (const dep of compileData.dependencies) { + this.addWatchFile(dep); + } + } + } + return { + ...compileData.compiled.js, + meta: { + vite: { + lang: compileData.lang + } + } + }; + }, + + handleHotUpdate(ctx) { + if (!options.compilerOptions.hmr || !options.emitCss) { + return; + } + const svelteRequest = requestParser(ctx.file, false, ctx.timestamp); + if (svelteRequest) { + return handleHotUpdate(compileSvelte, ctx, svelteRequest, cache, options); + } + }, + async buildEnd() { + await options.stats?.finishAll(); + } + }, + { + name: 'vite-plugin-svelte-module', + enforce: 'post', + async configResolved() { + moduleRequestParser = buildModuleIdParser(options); + }, + async transform(code, id, opts) { + const ssr = !!opts?.ssr; + const moduleRequest = moduleRequestParser(id, ssr); + if (!moduleRequest) { + return; + } + try { + const compileResult = svelteCompiler.compileModule(code, { + dev: !viteConfig.isProduction, + generate: ssr ? 'server' : 'client', + filename: moduleRequest.filename + }); + logCompilerWarnings(moduleRequest, compileResult.warnings, options); + return compileResult.js; + } catch (e) { + throw toRollupError(e, options); + } + } + }, + svelteInspector() + ]; + return plugins; +} + +export { vitePreprocess } from './preprocess.js'; +export { loadSvelteConfig } from './utils/load-svelte-config.js'; diff --git a/js-plugins/svelte/src/preprocess.js b/js-plugins/svelte/src/preprocess.js new file mode 100644 index 0000000..d63ea23 --- /dev/null +++ b/js-plugins/svelte/src/preprocess.js @@ -0,0 +1,124 @@ +import process from 'node:process'; +import { isCSSRequest, preprocessCSS, resolveConfig, transformWithEsbuild } from 'vite'; +import { mapToRelative, removeLangSuffix } from './utils/sourcemaps.js'; + +/** + * @typedef {(code: string, filename: string) => Promise<{ code: string; map?: any; deps?: Set }>} CssTransform + */ + +const supportedScriptLangs = ['ts']; + +export const lang_sep = '.vite-preprocess'; + +/** + * @param {import('./public.d.ts').VitePreprocessOptions} [opts] + * @returns {import('svelte/compiler').PreprocessorGroup} + */ +export function vitePreprocess(opts) { + /** @type {import('svelte/compiler').PreprocessorGroup} */ + const preprocessor = { name: 'vite-preprocess' }; + if (opts?.script === true) { + preprocessor.script = viteScript().script; + } + if (opts?.style !== false) { + const styleOpts = typeof opts?.style == 'object' ? opts?.style : undefined; + preprocessor.style = viteStyle(styleOpts).style; + } + return preprocessor; +} + +/** + * @returns {{ script: import('svelte/compiler').Preprocessor }} + */ +function viteScript() { + return { + async script({ attributes, content, filename = '' }) { + const lang = /** @type {string} */ (attributes.lang); + if (!supportedScriptLangs.includes(lang)) return; + const { code, map } = await transformWithEsbuild(content, filename, { + loader: /** @type {import('vite').ESBuildOptions['loader']} */ (lang), + target: 'esnext', + tsconfigRaw: { + compilerOptions: { + // svelte typescript needs this flag to work with type imports + importsNotUsedAsValues: 'preserve', + preserveValueImports: true + } + } + }); + + mapToRelative(map, filename); + + return { + code, + map + }; + } + }; +} + +/** + * @param {import('vite').ResolvedConfig | import('vite').InlineConfig} config + * @returns {{ style: import('svelte/compiler').Preprocessor }} + */ +function viteStyle(config = {}) { + /** @type {Promise | CssTransform} */ + let cssTransform; + /** @type {import('svelte/compiler').Preprocessor} */ + const style = async ({ attributes, content, filename = '' }) => { + const ext = attributes.lang ? `.${attributes.lang}` : '.css'; + if (attributes.lang && !isCSSRequest(ext)) return; + if (!cssTransform) { + cssTransform = createCssTransform(style, config).then((t) => (cssTransform = t)); + } + const transform = await cssTransform; + const suffix = `${lang_sep}${ext}`; + const moduleId = `${filename}${suffix}`; + const { code, map, deps } = await transform(content, moduleId); + removeLangSuffix(map, suffix); + mapToRelative(map, filename); + const dependencies = deps ? Array.from(deps).filter((d) => !d.endsWith(suffix)) : undefined; + return { + code, + map: map ?? undefined, + dependencies + }; + }; + // @ts-expect-error tag so can be found by v-p-s + style.__resolvedConfig = null; + return { style }; +} + +/** + * @param {import('svelte/compiler').Preprocessor} style + * @param {import('vite').ResolvedConfig | import('vite').InlineConfig} config + * @returns {Promise} + */ +async function createCssTransform(style, config) { + /** @type {import('vite').ResolvedConfig} */ + let resolvedConfig; + // @ts-expect-error special prop added if running in v-p-s + if (style.__resolvedConfig) { + // @ts-expect-error not typed + resolvedConfig = style.__resolvedConfig; + } else if (isResolvedConfig(config)) { + resolvedConfig = config; + } else { + // default to "build" if no NODE_ENV is set to avoid running in dev mode for svelte-check etc. + const useBuild = !process.env.NODE_ENV || process.env.NODE_ENV === 'production'; + const command = useBuild ? 'build' : 'serve'; + const defaultMode = useBuild ? 'production' : 'development'; + resolvedConfig = await resolveConfig(config, command, defaultMode, defaultMode, false); + } + return async (code, filename) => { + return preprocessCSS(code, filename, resolvedConfig); + }; +} + +/** + * @param {any} config + * @returns {config is import('vite').ResolvedConfig} + */ +function isResolvedConfig(config) { + return !!config.inlineConfig; +} diff --git a/js-plugins/svelte/src/public.d.ts b/js-plugins/svelte/src/public.d.ts new file mode 100644 index 0000000..6335e1a --- /dev/null +++ b/js-plugins/svelte/src/public.d.ts @@ -0,0 +1,210 @@ +import type { InlineConfig, ResolvedConfig } from 'vite'; +import type { CompileOptions, Warning, PreprocessorGroup } from 'svelte/compiler'; +import type { Options as InspectorOptions } from '@sveltejs/vite-plugin-svelte-inspector'; + +export type Options = Omit & PluginOptionsInline; + +interface PluginOptionsInline extends PluginOptions { + /** + * Path to a svelte config file, either absolute or relative to Vite root + * + * set to `false` to ignore the svelte config file + * + * @see https://vitejs.dev/config/#root + */ + configFile?: string | false; +} + +export interface PluginOptions { + /** + * A `picomatch` pattern, or array of patterns, which specifies the files the plugin should + * operate on. By default, all svelte files are included. + * + * @see https://github.com/micromatch/picomatch + */ + include?: Arrayable; + /** + * A `picomatch` pattern, or array of patterns, which specifies the files to be ignored by the + * plugin. By default, no files are ignored. + * + * @see https://github.com/micromatch/picomatch + */ + exclude?: Arrayable; + /** + * Emit Svelte styles as virtual CSS files for Vite and other plugins to process + * + * @default true + */ + emitCss?: boolean; + /** + * Enable or disable Hot Module Replacement. + * Deprecated, use compilerOptions.hmr instead! + * + * @deprecated + * @default true for development, always false for production + */ + hot?: boolean; + + /** + * Some Vite plugins can contribute additional preprocessors by defining `api.sveltePreprocess`. + * If you don't want to use them, set this to true to ignore them all or use an array of strings + * with plugin names to specify which. + * + * @default false + */ + ignorePluginPreprocessors?: boolean | string[]; + /** + * vite-plugin-svelte automatically handles excluding svelte libraries and reinclusion of their dependencies + * in vite.optimizeDeps. + * + * `disableDependencyReinclusion: true` disables all reinclusions + * `disableDependencyReinclusion: ['foo','bar']` disables reinclusions for dependencies of foo and bar + * + * This should be used for hybrid packages that contain both node and browser dependencies, eg Routify + * + * @default false + */ + disableDependencyReinclusion?: boolean | string[]; + /** + * Enable support for Vite's dependency optimization to prebundle Svelte libraries. + * + * To disable prebundling for a specific library, add it to `optimizeDeps.exclude`. + * + * @default true for dev, false for build + */ + prebundleSvelteLibraries?: boolean; + /** + * toggle/configure Svelte Inspector + * + * @default unset for dev, always false for build + */ + inspector?: InspectorOptions | boolean; + + /** + * A function to update `compilerOptions` before compilation + * + * `data.filename` - The file to be compiled + * `data.code` - The preprocessed Svelte code + * `data.compileOptions` - The current compiler options + * + * To change part of the compiler options, return an object with the changes you need. + * + * @example + * ``` + * ({ filename, compileOptions }) => { + * // Dynamically set runes mode per Svelte file + * if (forceRunesMode(filename) && !compileOptions.runes) { + * return { runes: true }; + * } + * } + * ``` + */ + dynamicCompileOptions?: (data: { + filename: string; + code: string; + compileOptions: Partial; + }) => Promise | void> | Partial | void; + + /** + * These options are considered experimental and breaking changes to them can occur in any release + */ + experimental?: ExperimentalOptions; +} + +export interface SvelteConfig { + /** + * A list of file extensions to be compiled by Svelte + * + * @default ['.svelte'] + */ + extensions?: string[]; + /** + * An array of preprocessors to transform the Svelte source code before compilation + * + * @see https://svelte.dev/docs#svelte_preprocess + */ + preprocess?: Arrayable; + /** + * The options to be passed to the Svelte compiler. A few options are set by default, + * including `dev` and `css`. However, some options are non-configurable, like + * `filename`, `format`, `generate`, and `cssHash` (in dev). + * + * @see https://svelte.dev/docs#svelte_compile + */ + compilerOptions?: Omit; + + /** + * Handles warning emitted from the Svelte compiler + * + * warnings emitted for files in node_modules are logged at the debug level, to see them run + * `DEBUG=vite-plugin-svelte:node-modules-onwarn pnpm build` + * + * @example + * ``` + * (warning, defaultHandler) => { + * // ignore some warnings + * if (!['foo','bar'].includes(warning.code)) { + * defaultHandler(warning); + * } + * } + * ``` + * + */ + onwarn?: (warning: Warning, defaultHandler: (warning: Warning) => void) => void; + /** + * Options for vite-plugin-svelte + */ + vitePlugin?: PluginOptions; +} + +/** + * These options are considered experimental and breaking changes to them can occur in any release + */ +interface ExperimentalOptions { + /** + * send a websocket message with svelte compiler warnings during dev + * + */ + sendWarningsToBrowser?: boolean; + /** + * disable svelte field resolve warnings + * + * @default false + */ + disableSvelteResolveWarnings?: boolean; + + compileModule?: CompileModuleOptions; +} + +interface CompileModuleOptions { + /** + * infix that must be present in filename + * @default ['.svelte.'] + */ + infixes?: string[]; + /** + * module extensions + * @default ['.ts','.js'] + */ + extensions?: string[]; + include?: Arrayable; + exclude?: Arrayable; +} + +type Arrayable = T | T[]; + +export interface VitePreprocessOptions { + /** + * preprocess script block with vite pipeline. + * Since svelte5 this is not needed for typescript anymore + * + * @default false + */ + script?: boolean; + /** + * preprocess style blocks with vite pipeline + */ + style?: boolean | InlineConfig | ResolvedConfig; +} +// eslint-disable-next-line n/no-missing-import +export * from './index.js'; diff --git a/js-plugins/svelte/src/types/compile.d.ts b/js-plugins/svelte/src/types/compile.d.ts new file mode 100644 index 0000000..d6ba48e --- /dev/null +++ b/js-plugins/svelte/src/types/compile.d.ts @@ -0,0 +1,25 @@ +import type { Processed, CompileResult } from 'svelte/compiler'; +import type { SvelteRequest } from './id.d.ts'; +import type { ResolvedOptions } from './options.d.ts'; + +export type CompileSvelte = ( + svelteRequest: SvelteRequest, + code: string, + options: Partial +) => Promise; + +export interface Code { + code: string; + map?: any; + dependencies?: any[]; +} + +export interface CompileData { + filename: string; + normalizedFilename: string; + lang: string; + compiled: CompileResult; + ssr: boolean | undefined; + dependencies: string[]; + preprocessed: Processed; +} diff --git a/js-plugins/svelte/src/types/id.d.ts b/js-plugins/svelte/src/types/id.d.ts new file mode 100644 index 0000000..bbd4dd4 --- /dev/null +++ b/js-plugins/svelte/src/types/id.d.ts @@ -0,0 +1,46 @@ +import type { CompileOptions } from 'svelte/compiler'; + +export type SvelteQueryTypes = 'style' | 'script' | 'preprocessed' | 'all'; + +export interface RequestQuery { + // our own + svelte?: boolean; + type?: SvelteQueryTypes; + sourcemap?: boolean; + compilerOptions?: Pick< + CompileOptions, + 'generate' | 'dev' | 'css' | 'customElement' | 'immutable' + >; + // vite specific + url?: boolean; + raw?: boolean; + direct?: boolean; + inline?: boolean; +} + +export interface SvelteRequest { + id: string; + cssId: string; + filename: string; + normalizedFilename: string; + query: RequestQuery; + timestamp: number; + ssr: boolean; + raw: boolean; +} + +export interface SvelteModuleRequest { + id: string; + filename: string; + normalizedFilename: string; + query: RequestQuery; + timestamp: number; + ssr: boolean; +} + +export type IdParser = (id: string, ssr: boolean, timestamp?: number) => SvelteRequest | undefined; +export type ModuleIdParser = ( + id: string, + ssr: boolean, + timestamp?: number +) => SvelteModuleRequest | undefined; diff --git a/js-plugins/svelte/src/types/log.d.ts b/js-plugins/svelte/src/types/log.d.ts new file mode 100644 index 0000000..fd4f13e --- /dev/null +++ b/js-plugins/svelte/src/types/log.d.ts @@ -0,0 +1,24 @@ +import type { Warning } from 'svelte/compiler'; + +export interface LogFn extends SimpleLogFn { + (message: string, payload?: unknown, namespace?: string): void; + + enabled: boolean; + once: SimpleLogFn; +} + +export interface SimpleLogFn { + (message: string, payload?: unknown, namespace?: string): void; +} + +export type SvelteWarningsMessage = { + id: string; + filename: string; + normalizedFilename: string; + timestamp: number; + warnings: Warning[]; // allWarnings filtered by warnings where onwarn did not call the default handler + allWarnings: Warning[]; // includes warnings filtered by onwarn and our extra vite plugin svelte warnings + rawWarnings: Warning[]; // raw compiler output +}; + +export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent'; diff --git a/js-plugins/svelte/src/types/options.d.ts b/js-plugins/svelte/src/types/options.d.ts new file mode 100644 index 0000000..5b4ca42 --- /dev/null +++ b/js-plugins/svelte/src/types/options.d.ts @@ -0,0 +1,21 @@ +import type { CompileOptions } from 'svelte/compiler'; +import type { ViteDevServer } from 'vite'; +// eslint-disable-next-line n/no-missing-import +import { VitePluginSvelteStats } from '../utils/vite-plugin-svelte-stats.js'; +import type { Options } from '../public.d.ts'; + +export interface PreResolvedOptions extends Options { + // these options are non-nullable after resolve + compilerOptions: CompileOptions; + // extra options + root: string; + isBuild: boolean; + isServe: boolean; + isDebug: boolean; +} + +export interface ResolvedOptions extends PreResolvedOptions { + isProduction: boolean; + server?: ViteDevServer; + stats?: VitePluginSvelteStats; +} diff --git a/js-plugins/svelte/src/types/plugin-api.d.ts b/js-plugins/svelte/src/types/plugin-api.d.ts new file mode 100644 index 0000000..36c42b6 --- /dev/null +++ b/js-plugins/svelte/src/types/plugin-api.d.ts @@ -0,0 +1,11 @@ +import type { ResolvedOptions } from './options.d.ts'; + +export interface PluginAPI { + /** + * must not be modified, should not be used outside of vite-plugin-svelte repo + * @internal + * @experimental + */ + options?: ResolvedOptions; + // TODO expose compile cache here so other utility plugins can use it +} diff --git a/js-plugins/svelte/src/types/vite-plugin-svelte-stats.d.ts b/js-plugins/svelte/src/types/vite-plugin-svelte-stats.d.ts new file mode 100644 index 0000000..1b69ebd --- /dev/null +++ b/js-plugins/svelte/src/types/vite-plugin-svelte-stats.d.ts @@ -0,0 +1,30 @@ +export interface Stat { + file: string; + pkg?: string; + start: number; + end: number; +} + +export interface StatCollection { + name: string; + options: CollectionOptions; + + start: (file: string) => () => void; + stats: Stat[]; + packageStats?: PackageStats[]; + collectionStart: number; + duration?: number; + finish: () => Promise | void; + finished: boolean; +} + +export interface PackageStats { + pkg: string; + files: number; + duration: number; +} + +export interface CollectionOptions { + logInProgress: (collection: StatCollection, now: number) => boolean; + logResult: (collection: StatCollection) => boolean; +} diff --git a/js-plugins/svelte/src/utils/compile.js b/js-plugins/svelte/src/utils/compile.js new file mode 100644 index 0000000..4c0e524 --- /dev/null +++ b/js-plugins/svelte/src/utils/compile.js @@ -0,0 +1,191 @@ +import * as svelte from 'svelte/compiler'; + +import { safeBase64Hash } from './hash.js'; +import { log } from './log.js'; + +import { + checkPreprocessDependencies, + createInjectScopeEverythingRulePreprocessorGroup +} from './preprocess.js'; +import { mapToRelative } from './sourcemaps.js'; +import { enhanceCompileError } from './error.js'; + +// TODO this is a patched version of https://github.com/sveltejs/vite-plugin-svelte/pull/796/files#diff-3bce0b33034aad4b35ca094893671f7e7ddf4d27254ae7b9b0f912027a001b15R10 +// which is closer to the other regexes in at least not falling into commented script +// but ideally would be shared exactly with svelte and other tools that use it +const scriptLangRE = + /|]*|(?:[^=>'"/]+=(?:"[^"]*"|'[^']*'|[^>\s]+)\s+)*)lang=(["'])?([^"' >]+)\1[^>]*>/g; + +/** + * @returns {import('../types/compile.d.ts').CompileSvelte} + */ +export function createCompileSvelte() { + /** @type {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection | undefined} */ + let stats; + const devStylePreprocessor = createInjectScopeEverythingRulePreprocessorGroup(); + /** @type {import('../types/compile.d.ts').CompileSvelte} */ + return async function compileSvelte(svelteRequest, code, options) { + const { filename, normalizedFilename, cssId, ssr, raw } = svelteRequest; + const { emitCss = true } = options; + /** @type {string[]} */ + const dependencies = []; + /** @type {import('svelte/compiler').Warning[]} */ + const warnings = []; + + if (options.stats) { + if (options.isBuild) { + if (!stats) { + // build is either completely ssr or csr, create stats collector on first compile + // it is then finished in the buildEnd hook. + stats = options.stats.startCollection(`${ssr ? 'ssr' : 'dom'} compile`, { + logInProgress: () => false + }); + } + } else { + // dev time ssr, it's a ssr request and there are no stats, assume new page load and start collecting + if (ssr && !stats) { + stats = options.stats.startCollection('ssr compile'); + } + // stats are being collected but this isn't an ssr request, assume page loaded and stop collecting + if (!ssr && stats) { + stats.finish(); + stats = undefined; + } + // TODO find a way to trace dom compile during dev + // problem: we need to call finish at some point but have no way to tell if page load finished + // also they for hmr updates too + } + } + /** @type {import('svelte/compiler').CompileOptions} */ + const compileOptions = { + ...options.compilerOptions, + filename, + generate: ssr ? 'server' : 'client' + }; + + if (compileOptions.hmr && options.emitCss) { + const hash = `s-${safeBase64Hash(normalizedFilename)}`; + compileOptions.cssHash = () => hash; + } + + let preprocessed; + let preprocessors = options.preprocess; + if (!options.isBuild && options.emitCss && compileOptions.hmr) { + // inject preprocessor that ensures css hmr works better + if (!Array.isArray(preprocessors)) { + preprocessors = preprocessors + ? [preprocessors, devStylePreprocessor] + : [devStylePreprocessor]; + } else { + preprocessors = preprocessors.concat(devStylePreprocessor); + } + } + if (preprocessors) { + try { + preprocessed = await svelte.preprocess(code, preprocessors, { filename }); // full filename here so postcss works + } catch (e) { + e.message = `Error while preprocessing ${filename}${e.message ? ` - ${e.message}` : ''}`; + throw e; + } + + if (preprocessed.dependencies?.length) { + const checked = checkPreprocessDependencies(filename, preprocessed.dependencies); + if (checked.warnings.length) { + warnings.push(...checked.warnings); + } + if (checked.dependencies.length) { + dependencies.push(...checked.dependencies); + } + } + + if (preprocessed.map) compileOptions.sourcemap = preprocessed.map; + } + if (typeof preprocessed?.map === 'object') { + mapToRelative(preprocessed?.map, filename); + } + if (raw && svelteRequest.query.type === 'preprocessed') { + // @ts-expect-error shortcut + return /** @type {import('../types/compile.d.ts').CompileData} */ { + preprocessed: preprocessed ?? { code } + }; + } + const finalCode = preprocessed ? preprocessed.code : code; + const dynamicCompileOptions = await options?.dynamicCompileOptions?.({ + filename, + code: finalCode, + compileOptions + }); + if (dynamicCompileOptions && log.debug.enabled) { + log.debug( + `dynamic compile options for ${filename}: ${JSON.stringify(dynamicCompileOptions)}`, + undefined, + 'compile' + ); + } + const finalCompileOptions = dynamicCompileOptions + ? { + ...compileOptions, + ...dynamicCompileOptions + } + : compileOptions; + const endStat = stats?.start(filename); + /** @type {import('svelte/compiler').CompileResult} */ + let compiled; + try { + compiled = svelte.compile(finalCode, { ...finalCompileOptions, filename }); + // patch output with partial accept until svelte does it + // TODO remove later + if ( + options.server?.config.experimental.hmrPartialAccept && + compiled.js.code.includes('import.meta.hot.accept(') + ) { + compiled.js.code = compiled.js.code.replaceAll( + 'import.meta.hot.accept(', + 'import.meta.hot.acceptExports(["default"],' + ); + } + } catch (e) { + enhanceCompileError(e, code, preprocessors); + throw e; + } + + if (endStat) { + endStat(); + } + mapToRelative(compiled.js?.map, filename); + mapToRelative(compiled.css?.map, filename); + if (warnings.length) { + if (!compiled.warnings) { + compiled.warnings = []; + } + compiled.warnings.push(...warnings); + } + if (!raw) { + // wire css import and code for hmr + const hasCss = compiled.css?.code?.trim()?.length ?? 0 > 0; + // compiler might not emit css with mode none or it may be empty + if (emitCss && hasCss) { + // TODO properly update sourcemap? + compiled.js.code += `\nimport ${JSON.stringify(cssId)};\n`; + } + } + + let lang = 'js'; + for (const match of code.matchAll(scriptLangRE)) { + if (match[2]) { + lang = match[2]; + break; + } + } + + return { + filename, + normalizedFilename, + lang, + compiled, + ssr, + dependencies, + preprocessed: preprocessed ?? { code } + }; + }; +} diff --git a/js-plugins/svelte/src/utils/constants.js b/js-plugins/svelte/src/utils/constants.js new file mode 100644 index 0000000..3cc59d4 --- /dev/null +++ b/js-plugins/svelte/src/utils/constants.js @@ -0,0 +1,26 @@ +import { createRequire } from 'node:module'; + +export const SVELTE_IMPORTS = Object.entries( + createRequire(import.meta.url)('svelte/package.json').exports +) + .map(([name, config]) => { + // ignore type only + if (typeof config === 'object' && Object.keys(config).length === 1 && config.types) { + return ''; + } + // ignore names + if (name === './package.json' || name === './compiler') { + return ''; + } + return name.replace(/^\./, 'svelte'); + }) + .filter((s) => s.length > 0); + +export const SVELTE_EXPORT_CONDITIONS = ['svelte']; + +export const FAQ_LINK_MISSING_EXPORTS_CONDITION = + 'https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md#missing-exports-condition'; + +export const DEFAULT_SVELTE_EXT = ['.svelte']; +export const DEFAULT_SVELTE_MODULE_INFIX = ['.svelte.']; +export const DEFAULT_SVELTE_MODULE_EXT = ['.js', '.ts']; diff --git a/js-plugins/svelte/src/utils/dependencies.js b/js-plugins/svelte/src/utils/dependencies.js new file mode 100644 index 0000000..30caf59 --- /dev/null +++ b/js-plugins/svelte/src/utils/dependencies.js @@ -0,0 +1,89 @@ +import path from 'node:path'; +import fs from 'node:fs/promises'; +import { findDepPkgJsonPath } from 'vitefu'; + +/** + * @typedef {{ + * dir: string; + * pkg: Record; + * }} DependencyData + */ + +/** + * @param {string} dep + * @param {string} parent + * @returns {Promise} + */ +export async function resolveDependencyData(dep, parent) { + const depDataPath = await findDepPkgJsonPath(dep, parent); + if (!depDataPath) return undefined; + try { + return { + dir: path.dirname(depDataPath), + pkg: JSON.parse(await fs.readFile(depDataPath, 'utf-8')) + }; + } catch { + return undefined; + } +} + +const COMMON_DEPENDENCIES_WITHOUT_SVELTE_FIELD = [ + '@lukeed/uuid', + '@playwright/test', + '@sveltejs/kit', + '@sveltejs/package', + '@sveltejs/vite-plugin-svelte', + 'autoprefixer', + 'cookie', + 'dotenv', + 'esbuild', + 'eslint', + 'jest', + 'mdsvex', + 'playwright', + 'postcss', + 'prettier', + 'svelte', + 'svelte2tsx', + 'svelte-check', + 'svelte-preprocess', + 'tslib', + 'typescript', + 'vite', + 'vitest', + '__vite-browser-external' // see https://github.com/sveltejs/vite-plugin-svelte/issues/362 +]; +const COMMON_PREFIXES_WITHOUT_SVELTE_FIELD = [ + '@fontsource/', + '@postcss-plugins/', + '@rollup/', + '@sveltejs/adapter-', + '@types/', + '@typescript-eslint/', + 'eslint-', + 'jest-', + 'postcss-plugin-', + 'prettier-plugin-', + 'rollup-plugin-', + 'vite-plugin-' +]; + +/** + * Test for common dependency names that tell us it is not a package including a svelte field, eg. eslint + plugins. + * + * This speeds up the find process as we don't have to try and require the package.json for all of them + * + * @param {string} dependency + * @returns {boolean} true if it is a dependency without a svelte field + */ +export function isCommonDepWithoutSvelteField(dependency) { + return ( + COMMON_DEPENDENCIES_WITHOUT_SVELTE_FIELD.includes(dependency) || + COMMON_PREFIXES_WITHOUT_SVELTE_FIELD.some( + (prefix) => + prefix.startsWith('@') + ? dependency.startsWith(prefix) + : dependency.substring(dependency.lastIndexOf('/') + 1).startsWith(prefix) // check prefix omitting @scope/ + ) + ); +} diff --git a/js-plugins/svelte/src/utils/error.js b/js-plugins/svelte/src/utils/error.js new file mode 100644 index 0000000..31e3c5a --- /dev/null +++ b/js-plugins/svelte/src/utils/error.js @@ -0,0 +1,162 @@ +import { buildExtendedLogMessage } from './log.js'; + +/** + * convert an error thrown by svelte.compile to a RollupError so that vite displays it in a user friendly way + * @param {import('svelte/compiler').Warning & Error & {frame?: string}} error a svelte compiler error, which is a mix of Warning and an error + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {import('vite').Rollup.RollupError} the converted error + */ +export function toRollupError(error, options) { + const { filename, frame, start, code, name, stack } = error; + /** @type {import('vite').Rollup.RollupError} */ + const rollupError = { + name, // needed otherwise sveltekit coalesce_to_error turns it into a string + id: filename, + message: buildExtendedLogMessage(error), // include filename:line:column so that it's clickable + frame: formatFrameForVite(frame), + code, + stack: options.isBuild || options.isDebug || !frame ? stack : '' + }; + if (start) { + rollupError.loc = { + line: start.line, + column: start.column, + file: filename + }; + } + return rollupError; +} + +/** + * convert an error thrown by svelte.compile to an esbuild PartialMessage + * @param {import('svelte/compiler').Warning & Error & {frame?: string}} error a svelte compiler error, which is a mix of Warning and an error + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {import('esbuild').PartialMessage} the converted error + */ +export function toESBuildError(error, options) { + const { filename, frame, start, stack } = error; + /** @type {import('esbuild').PartialMessage} */ + const partialMessage = { + text: buildExtendedLogMessage(error) + }; + if (start) { + partialMessage.location = { + line: start.line, + column: start.column, + file: filename, + lineText: lineFromFrame(start.line, frame) // needed to get a meaningful error message on cli + }; + } + if (options.isBuild || options.isDebug || !frame) { + partialMessage.detail = stack; + } + return partialMessage; +} + +/** + * extract line with number from codeframe + * + * @param {number} lineNo + * @param {string} [frame] + * @returns {string} + */ +function lineFromFrame(lineNo, frame) { + if (!frame) { + return ''; + } + const lines = frame.split('\n'); + const errorLine = lines.find((line) => line.trimStart().startsWith(`${lineNo}: `)); + return errorLine ? errorLine.substring(errorLine.indexOf(': ') + 3) : ''; +} + +/** + * vite error overlay expects a specific format to show frames + * this reformats svelte frame (colon separated, less whitespace) + * to one that vite displays on overlay ( pipe separated, more whitespace) + * e.g. + * ``` + * 1: foo + * 2: bar; + * ^ + * 3: baz + * ``` + * to + * ``` + * 1 | foo + * 2 | bar; + * ^ + * 3 | baz + * ``` + * @see https://github.com/vitejs/vite/blob/96591bf9989529de839ba89958755eafe4c445ae/packages/vite/src/client/overlay.ts#L116 + * @param {string} [frame] + * @returns {string} + */ +function formatFrameForVite(frame) { + if (!frame) { + return ''; + } + return frame + .split('\n') + .map((line) => (line.match(/^\s+\^/) ? ' ' + line : ' ' + line.replace(':', ' | '))) + .join('\n'); +} + +/** + * + * @param {string} code the svelte error code + * @see https://github.com/sveltejs/svelte/blob/main/packages/svelte/src/compiler/errors.js + * @returns {boolean} + */ +function couldBeFixedByCssPreprocessor(code) { + return code === 'expected_token' || code === 'unexpected_eof' || code?.startsWith('css_'); +} + +/** + * @param {import('svelte/compiler').Warning & Error} err a svelte compiler error, which is a mix of Warning and an error + * @param {string} originalCode + * @param {import('../public.d.ts').Options['preprocess']} [preprocessors] + */ +export function enhanceCompileError(err, originalCode, preprocessors) { + preprocessors = arraify(preprocessors ?? []); + + /** @type {string[]} */ + const additionalMessages = []; + + // Handle incorrect CSS preprocessor usage + if (couldBeFixedByCssPreprocessor(err.code)) { + // Reference from Svelte: https://github.com/sveltejs/svelte/blob/9926347ad9dbdd0f3324d5538e25dcb7f5e442f8/packages/svelte/src/compiler/preprocess/index.js#L257 + const styleRe = + /|'"/]+=(?:"[^"]*"|'[^']*'|[^>\s]+)|\s+[^=>'"/]+)*\s*)(?:\/>|>([\S\s]*?)<\/style>)/g; + + let m; + while ((m = styleRe.exec(originalCode))) { + // Warn missing lang attribute + if (!m[1]?.includes('lang=')) { + additionalMessages.push('Did you forget to add a lang attribute to your style tag?'); + } + // Warn missing style preprocessor + if ( + preprocessors.every((p) => p.style == null || p.name === 'inject-scope-everything-rule') + ) { + const preprocessorType = m[1]?.match(/lang="(.+?)"/)?.[1] ?? 'style'; + additionalMessages.push( + `Did you forget to add a ${preprocessorType} preprocessor? See https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/preprocess.md for more information.` + ); + } + } + } + + if (additionalMessages.length) { + err.message += '\n\n- ' + additionalMessages.join('\n- '); + } + + return err; +} + +/** + * @param {T | T[]} value + * @template T + */ +function arraify(value) { + return Array.isArray(value) ? value : [value]; +} diff --git a/js-plugins/svelte/src/utils/esbuild.js b/js-plugins/svelte/src/utils/esbuild.js new file mode 100644 index 0000000..5a1ca89 --- /dev/null +++ b/js-plugins/svelte/src/utils/esbuild.js @@ -0,0 +1,177 @@ +import { readFileSync } from 'node:fs'; +import * as svelte from 'svelte/compiler'; +import { log } from './log.js'; +import { toESBuildError } from './error.js'; +import { safeBase64Hash } from './hash.js'; +import { normalize } from './id.js'; + +/** + * @typedef {NonNullable} EsbuildOptions + * @typedef {NonNullable[number]} EsbuildPlugin + */ + +export const facadeEsbuildSveltePluginName = 'vite-plugin-svelte:facade'; +export const facadeEsbuildSvelteModulePluginName = 'vite-plugin-svelte-module:facade'; + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {EsbuildPlugin} + */ +export function esbuildSveltePlugin(options) { + return { + name: 'vite-plugin-svelte:optimize-svelte', + setup(build) { + // Skip in scanning phase as Vite already handles scanning Svelte files. + // Otherwise this would heavily slow down the scanning phase. + if (build.initialOptions.plugins?.some((v) => v.name === 'vite:dep-scan')) return; + + const filter = /\.svelte(?:\?.*)?$/; + /** @type {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection | undefined} */ + let statsCollection; + build.onStart(() => { + statsCollection = options.stats?.startCollection('prebundle library components', { + logResult: (c) => c.stats.length > 1 + }); + }); + build.onLoad({ filter }, async ({ path: filename }) => { + const code = readFileSync(filename, 'utf8'); + try { + const contents = await compileSvelte(options, { filename, code }, statsCollection); + return { contents }; + } catch (e) { + return { errors: [toESBuildError(e, options)] }; + } + }); + build.onEnd(() => { + statsCollection?.finish(); + }); + } + }; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @param {{ filename: string, code: string }} input + * @param {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection} [statsCollection] + * @returns {Promise} + */ +async function compileSvelte(options, { filename, code }, statsCollection) { + let css = options.compilerOptions.css; + if (css !== 'injected') { + // TODO ideally we'd be able to externalize prebundled styles too, but for now always put them in the js + css = 'injected'; + } + /** @type {import('svelte/compiler').CompileOptions} */ + const compileOptions = { + dev: true, // default to dev: true because prebundling is only used in dev + ...options.compilerOptions, + css, + filename, + generate: 'client' + }; + + if (compileOptions.hmr && options.emitCss) { + const hash = `s-${safeBase64Hash(normalize(filename, options.root))}`; + compileOptions.cssHash = () => hash; + } + + let preprocessed; + + if (options.preprocess) { + try { + preprocessed = await svelte.preprocess(code, options.preprocess, { filename }); + } catch (e) { + e.message = `Error while preprocessing ${filename}${e.message ? ` - ${e.message}` : ''}`; + throw e; + } + if (preprocessed.map) compileOptions.sourcemap = preprocessed.map; + } + + const finalCode = preprocessed ? preprocessed.code : code; + + const dynamicCompileOptions = await options?.dynamicCompileOptions?.({ + filename, + code: finalCode, + compileOptions + }); + + if (dynamicCompileOptions && log.debug.enabled) { + log.debug( + `dynamic compile options for ${filename}: ${JSON.stringify(dynamicCompileOptions)}`, + undefined, + 'compile' + ); + } + + const finalCompileOptions = dynamicCompileOptions + ? { + ...compileOptions, + ...dynamicCompileOptions + } + : compileOptions; + const endStat = statsCollection?.start(filename); + const compiled = svelte.compile(finalCode, finalCompileOptions); + if (endStat) { + endStat(); + } + return compiled.js.map + ? compiled.js.code + '//# sourceMappingURL=' + compiled.js.map.toUrl() + : compiled.js.code; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {EsbuildPlugin} + */ +export function esbuildSvelteModulePlugin(options) { + return { + name: 'vite-plugin-svelte-module:optimize-svelte', + setup(build) { + // Skip in scanning phase as Vite already handles scanning Svelte files. + // Otherwise this would heavily slow down the scanning phase. + if (build.initialOptions.plugins?.some((v) => v.name === 'vite:dep-scan')) return; + + const filter = /\.svelte\.[jt]s(?:\?.*)?$/; + /** @type {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection | undefined} */ + let statsCollection; + build.onStart(() => { + statsCollection = options.stats?.startCollection('prebundle library modules', { + logResult: (c) => c.stats.length > 1 + }); + }); + build.onLoad({ filter }, async ({ path: filename }) => { + const code = readFileSync(filename, 'utf8'); + try { + const contents = await compileSvelteModule(options, { filename, code }, statsCollection); + return { contents }; + } catch (e) { + return { errors: [toESBuildError(e, options)] }; + } + }); + build.onEnd(() => { + statsCollection?.finish(); + }); + } + }; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @param {{ filename: string; code: string }} input + * @param {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection} [statsCollection] + * @returns {Promise} + */ +async function compileSvelteModule(options, { filename, code }, statsCollection) { + const endStat = statsCollection?.start(filename); + const compiled = svelte.compileModule(code, { + dev: options.compilerOptions?.dev ?? true, // default to dev: true because prebundling is only used in dev + filename, + generate: 'client' + }); + if (endStat) { + endStat(); + } + return compiled.js.map + ? compiled.js.code + '//# sourceMappingURL=' + compiled.js.map.toUrl() + : compiled.js.code; +} diff --git a/js-plugins/svelte/src/utils/hash.js b/js-plugins/svelte/src/utils/hash.js new file mode 100644 index 0000000..6d0dad2 --- /dev/null +++ b/js-plugins/svelte/src/utils/hash.js @@ -0,0 +1,43 @@ +import crypto from 'node:crypto'; + +const hashes = Object.create(null); + +//TODO shorter? +const hash_length = 12; + +/** + * replaces +/= in base64 output so they don't interfere + * + * @param {string} input + * @returns {string} base64 hash safe to use in any context + */ +export function safeBase64Hash(input) { + if (hashes[input]) { + return hashes[input]; + } + //TODO if performance really matters, use a faster one like xx-hash etc. + // should be evenly distributed because short input length and similarities in paths could cause collisions otherwise + // OR DON'T USE A HASH AT ALL, what about a simple counter? + const md5 = crypto.createHash('md5'); + md5.update(input); + const hash = toSafe(md5.digest('base64')).slice(0, hash_length); + hashes[input] = hash; + return hash; +} + +/** @type {Record} */ +const replacements = { + '+': '-', + '/': '_', + '=': '' +}; + +const replaceRE = new RegExp(`[${Object.keys(replacements).join('')}]`, 'g'); + +/** + * @param {string} base64 + * @returns {string} + */ +function toSafe(base64) { + return base64.replace(replaceRE, (x) => replacements[x]); +} diff --git a/js-plugins/svelte/src/utils/id.js b/js-plugins/svelte/src/utils/id.js new file mode 100644 index 0000000..cb420dd --- /dev/null +++ b/js-plugins/svelte/src/utils/id.js @@ -0,0 +1,252 @@ +import { createFilter, normalizePath } from 'vite'; +import fs from 'node:fs'; +import path from 'node:path'; +import process from 'node:process'; +import { log } from './log.js'; +import { DEFAULT_SVELTE_MODULE_EXT, DEFAULT_SVELTE_MODULE_INFIX } from './constants.js'; + +const VITE_FS_PREFIX = '/@fs/'; +const IS_WINDOWS = process.platform === 'win32'; + +const SUPPORTED_COMPILER_OPTIONS = ['generate', 'dev', 'css', 'customElement', 'immutable']; +const TYPES_WITH_COMPILER_OPTIONS = ['style', 'script', 'all']; + +/** + * @param {string} id + * @returns {{ filename: string, rawQuery: string }} + */ +function splitId(id) { + const parts = id.split('?', 2); + const filename = parts[0]; + const rawQuery = parts[1]; + return { filename, rawQuery }; +} + +/** + * @param {string} id + * @param {string} filename + * @param {string} rawQuery + * @param {string} root + * @param {number} timestamp + * @param {boolean} ssr + * @returns {import('../types/id.d.ts').SvelteRequest | undefined} + */ +function parseToSvelteRequest(id, filename, rawQuery, root, timestamp, ssr) { + const query = parseRequestQuery(rawQuery); + const rawOrDirect = !!(query.raw || query.direct); + if (query.url || (!query.svelte && rawOrDirect)) { + // skip requests with special vite tags + return; + } + const raw = rawOrDirect; + const normalizedFilename = normalize(filename, root); + const cssId = createVirtualImportId(filename, root, 'style'); + + return { + id, + filename, + normalizedFilename, + cssId, + query, + timestamp, + ssr, + raw + }; +} + +/** + * @param {string} filename + * @param {string} root + * @param {import('../types/id.d.ts').SvelteQueryTypes} type + * @returns {string} + */ +function createVirtualImportId(filename, root, type) { + const parts = ['svelte', `type=${type}`]; + if (type === 'style') { + parts.push('lang.css'); + } + if (existsInRoot(filename, root)) { + filename = root + filename; + } else if (filename.startsWith(VITE_FS_PREFIX)) { + filename = IS_WINDOWS + ? filename.slice(VITE_FS_PREFIX.length) // remove /@fs/ from /@fs/C:/... + : filename.slice(VITE_FS_PREFIX.length - 1); // remove /@fs from /@fs/home/user + } + // return same virtual id format as vite-plugin-vue eg ...App.svelte?svelte&type=style&lang.css + return `${filename}?${parts.join('&')}`; +} + +/** + * @param {string} rawQuery + * @returns {import('../types/id.d.ts').RequestQuery} + */ +function parseRequestQuery(rawQuery) { + const query = Object.fromEntries(new URLSearchParams(rawQuery)); + for (const key in query) { + if (query[key] === '') { + // @ts-expect-error not boolean + query[key] = true; + } + } + const compilerOptions = query.compilerOptions; + if (compilerOptions) { + if (!((query.raw || query.direct) && TYPES_WITH_COMPILER_OPTIONS.includes(query.type))) { + throw new Error( + `Invalid compilerOptions in query ${rawQuery}. CompilerOptions are only supported for raw or direct queries with type in "${TYPES_WITH_COMPILER_OPTIONS.join( + ', ' + )}" e.g. '?svelte&raw&type=script&compilerOptions={"generate":"server","dev":false}` + ); + } + try { + const parsed = JSON.parse(compilerOptions); + const invalid = Object.keys(parsed).filter( + (key) => !SUPPORTED_COMPILER_OPTIONS.includes(key) + ); + if (invalid.length) { + throw new Error( + `Invalid compilerOptions in query ${rawQuery}: ${invalid.join( + ', ' + )}. Supported: ${SUPPORTED_COMPILER_OPTIONS.join(', ')}` + ); + } + query.compilerOptions = parsed; + } catch (e) { + log.error('failed to parse request query compilerOptions', e); + throw e; + } + } + + return /** @type {import('../types/id.d.ts').RequestQuery}*/ query; +} + +/** + * posixify and remove root at start + * + * @param {string} filename + * @param {string} normalizedRoot + * @returns {string} + */ +export function normalize(filename, normalizedRoot) { + return stripRoot(normalizePath(filename), normalizedRoot); +} + +/** + * @param {string} filename + * @param {string} root + * @returns {boolean} + */ +function existsInRoot(filename, root) { + if (filename.startsWith(VITE_FS_PREFIX)) { + return false; // vite already tagged it as out of root + } + return fs.existsSync(root + filename); +} + +/** + * @param {string} normalizedFilename + * @param {string} normalizedRoot + * @returns {string} + */ +function stripRoot(normalizedFilename, normalizedRoot) { + return normalizedFilename.startsWith(normalizedRoot + '/') + ? normalizedFilename.slice(normalizedRoot.length) + : normalizedFilename; +} + +/** + * @param {import('../public.d.ts').Options['include'] | undefined} include + * @param {import('../public.d.ts').Options['exclude'] | undefined} exclude + * @param {string[]} extensions + * @returns {(filename: string) => boolean} + */ +function buildFilter(include, exclude, extensions) { + const rollupFilter = createFilter(include, exclude); + return (filename) => rollupFilter(filename) && extensions.some((ext) => filename.endsWith(ext)); +} + +/** + * @param {import('../public.d.ts').Options['include'] | undefined} include + * @param {import('../public.d.ts').Options['exclude'] | undefined} exclude + * @param {string[]} infixes + * @param {string[]} extensions + * @returns {(filename: string) => boolean} + */ +function buildModuleFilter(include, exclude, infixes, extensions) { + const rollupFilter = createFilter(include, exclude); + return (filename) => { + const basename = path.basename(filename); + + return ( + rollupFilter(filename) && + infixes.some((infix) => basename.includes(infix)) && + extensions.some((ext) => basename.endsWith(ext)) + ); + }; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {import('../types/id.d.ts').IdParser} + */ +export function buildIdParser(options) { + const { include, exclude, extensions, root } = options; + const normalizedRoot = normalizePath(root); + const filter = buildFilter(include, exclude, extensions ?? []); + return (id, ssr, timestamp = Date.now()) => { + const { filename, rawQuery } = splitId(id); + if (filter(filename)) { + return parseToSvelteRequest(id, filename, rawQuery, normalizedRoot, timestamp, ssr); + } + }; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {import('../types/id.d.ts').ModuleIdParser} + */ +export function buildModuleIdParser(options) { + const { + include, + exclude, + infixes = DEFAULT_SVELTE_MODULE_INFIX, + extensions = DEFAULT_SVELTE_MODULE_EXT + } = options?.experimental?.compileModule ?? {}; + const root = options.root; + const normalizedRoot = normalizePath(root); + const filter = buildModuleFilter(include, exclude, infixes, extensions); + return (id, ssr, timestamp = Date.now()) => { + const { filename, rawQuery } = splitId(id); + if (filter(filename)) { + return parseToSvelteModuleRequest(id, filename, rawQuery, normalizedRoot, timestamp, ssr); + } + }; +} + +/** + * @param {string} id + * @param {string} filename + * @param {string} rawQuery + * @param {string} root + * @param {number} timestamp + * @param {boolean} ssr + * @returns {import('../types/id.d.ts').SvelteModuleRequest | undefined} + */ +function parseToSvelteModuleRequest(id, filename, rawQuery, root, timestamp, ssr) { + const query = parseRequestQuery(rawQuery); + + if (query.url || query.raw || query.direct) { + // skip requests with special vite tags + return; + } + + const normalizedFilename = normalize(filename, root); + + return { + id, + filename, + normalizedFilename, + query, + timestamp, + ssr + }; +} diff --git a/js-plugins/svelte/src/utils/load-raw.js b/js-plugins/svelte/src/utils/load-raw.js new file mode 100644 index 0000000..f800f1b --- /dev/null +++ b/js-plugins/svelte/src/utils/load-raw.js @@ -0,0 +1,125 @@ +import fs from 'node:fs'; +import { toRollupError } from './error.js'; +import { log } from './log.js'; + +/** + * utility function to compile ?raw and ?direct requests in load hook + * + * @param {import('../types/id.d.ts').SvelteRequest} svelteRequest + * @param {import('../types/compile.d.ts').CompileSvelte} compileSvelte + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {Promise} + */ +export async function loadRaw(svelteRequest, compileSvelte, options) { + const { id, filename, query } = svelteRequest; + + // raw svelte subrequest, compile on the fly and return requested subpart + let compileData; + const source = fs.readFileSync(filename, 'utf-8'); + try { + //avoid compileSvelte doing extra ssr stuff unless requested + svelteRequest.ssr = query.compilerOptions?.generate === 'server'; + compileData = await compileSvelte(svelteRequest, source, { + ...options, + // don't use dynamic vite-plugin-svelte defaults here to ensure stable result between ssr,dev and build + compilerOptions: { + dev: false, + css: 'external', + hmr: false, + ...svelteRequest.query.compilerOptions + }, + emitCss: true + }); + } catch (e) { + throw toRollupError(e, options); + } + let result; + if (query.type === 'style') { + result = compileData.compiled.css ?? { code: '', map: null }; + } else if (query.type === 'script') { + result = compileData.compiled.js; + } else if (query.type === 'preprocessed') { + result = compileData.preprocessed; + } else if (query.type === 'all' && query.raw) { + return allToRawExports(compileData, source); + } else { + throw new Error( + `invalid "type=${query.type}" in ${id}. supported are script, style, preprocessed, all` + ); + } + if (query.direct) { + const supportedDirectTypes = ['script', 'style']; + if (!supportedDirectTypes.includes(query.type)) { + throw new Error( + `invalid "type=${ + query.type + }" combined with direct in ${id}. supported are: ${supportedDirectTypes.join(', ')}` + ); + } + log.debug(`load returns direct result for ${id}`, undefined, 'load'); + let directOutput = result.code; + // @ts-expect-error might not be SourceMap but toUrl check should suffice + if (query.sourcemap && result.map?.toUrl) { + // @ts-expect-error toUrl might not exist + const map = `sourceMappingURL=${result.map.toUrl()}`; + if (query.type === 'style') { + directOutput += `\n\n/*# ${map} */\n`; + } else if (query.type === 'script') { + directOutput += `\n\n//# ${map}\n`; + } + } + return directOutput; + } else if (query.raw) { + log.debug(`load returns raw result for ${id}`, undefined, 'load'); + return toRawExports(result); + } else { + throw new Error(`invalid raw mode in ${id}, supported are raw, direct`); + } +} + +/** + * turn compileData and source into a flat list of raw exports + * + * @param {import('../types/compile.d.ts').CompileData} compileData + * @param {string} source + */ +function allToRawExports(compileData, source) { + // flatten CompileData + /** @type {Partial} */ + const exports = { + ...compileData, + ...compileData.compiled, + source + }; + delete exports.compiled; + delete exports.filename; // absolute path, remove to avoid it in output + return toRawExports(exports); +} + +/** + * turn object into raw exports. + * + * every prop is returned as a const export, and if prop 'code' exists it is additionally added as default export + * + * eg {'foo':'bar','code':'baz'} results in + * + * ```js + * export const code='baz' + * export const foo='bar' + * export default code + * ``` + * @param {object} object + * @returns {string} + */ +function toRawExports(object) { + let exports = + Object.entries(object) + .filter(([_key, value]) => typeof value !== 'function') // preprocess output has a toString function that's enumerable + .sort(([a], [b]) => (a < b ? -1 : a === b ? 0 : 1)) + .map(([key, value]) => `export const ${key}=${JSON.stringify(value)}`) + .join('\n') + '\n'; + if (Object.prototype.hasOwnProperty.call(object, 'code')) { + exports += 'export default code\n'; + } + return exports; +} diff --git a/js-plugins/svelte/src/utils/load-svelte-config.js b/js-plugins/svelte/src/utils/load-svelte-config.js new file mode 100644 index 0000000..1b32ba4 --- /dev/null +++ b/js-plugins/svelte/src/utils/load-svelte-config.js @@ -0,0 +1,122 @@ +import { createRequire } from 'node:module'; +import path from 'node:path'; +import process from 'node:process'; +import fs from 'node:fs'; +import { pathToFileURL } from 'node:url'; +import { log } from './log.js'; + +// used to require cjs config in esm. +// NOTE dynamic import() cjs technically works, but timestamp query cache bust +// have no effect, likely because it has another internal cache? +/** @type {NodeRequire}*/ +let esmRequire; + +export const knownSvelteConfigNames = [ + 'svelte.config.js', + 'svelte.config.cjs', + 'svelte.config.mjs' +]; + +/** + * @param {string} filePath + * @param {number} timestamp + */ +async function dynamicImportDefault(filePath, timestamp) { + return await import(filePath + '?t=' + timestamp).then((m) => m.default); +} + +/** + * @param {import('vite').UserConfig} [viteConfig] + * @param {Partial} [inlineOptions] + * @returns {Promise | undefined>} + */ +export async function loadSvelteConfig(viteConfig, inlineOptions) { + if (inlineOptions?.configFile === false) { + return; + } + const configFile = findConfigToLoad(viteConfig, inlineOptions); + if (configFile) { + let err; + // try to use dynamic import for svelte.config.js first + if (configFile.endsWith('.js') || configFile.endsWith('.mjs')) { + try { + const result = await dynamicImportDefault( + pathToFileURL(configFile).href, + fs.statSync(configFile).mtimeMs + ); + if (result != null) { + return { + ...result, + configFile + }; + } else { + throw new Error(`invalid export in ${configFile}`); + } + } catch (e) { + log.error(`failed to import config ${configFile}`, e); + err = e; + } + } + // cjs or error with dynamic import + if (!configFile.endsWith('.mjs')) { + try { + // identify which require function to use (esm and cjs mode) + const _require = import.meta.url + ? (esmRequire ?? (esmRequire = createRequire(import.meta.url))) + : // eslint-disable-next-line no-undef + require; + + // avoid loading cached version on reload + delete _require.cache[_require.resolve(configFile)]; + const result = _require(configFile); + if (result != null) { + return { + ...result, + configFile + }; + } else { + throw new Error(`invalid export in ${configFile}`); + } + } catch (e) { + log.error(`failed to require config ${configFile}`, e); + if (!err) { + err = e; + } + } + } + // failed to load existing config file + throw err; + } +} + +/** + * @param {import('vite').UserConfig | undefined} viteConfig + * @param {Partial | undefined} inlineOptions + * @returns {string | undefined} + */ +function findConfigToLoad(viteConfig, inlineOptions) { + const root = viteConfig?.root || process.cwd(); + if (inlineOptions?.configFile) { + const abolutePath = path.isAbsolute(inlineOptions.configFile) + ? inlineOptions.configFile + : path.resolve(root, inlineOptions.configFile); + if (!fs.existsSync(abolutePath)) { + throw new Error(`failed to find svelte config file ${abolutePath}.`); + } + return abolutePath; + } else { + const existingKnownConfigFiles = knownSvelteConfigNames + .map((candidate) => path.resolve(root, candidate)) + .filter((file) => fs.existsSync(file)); + if (existingKnownConfigFiles.length === 0) { + log.debug(`no svelte config found at ${root}`, undefined, 'config'); + return; + } else if (existingKnownConfigFiles.length > 1) { + log.warn( + `found more than one svelte config file, using ${existingKnownConfigFiles[0]}. you should only have one!`, + existingKnownConfigFiles + ); + } + return existingKnownConfigFiles[0]; + } +} diff --git a/js-plugins/svelte/src/utils/log.js b/js-plugins/svelte/src/utils/log.js new file mode 100644 index 0000000..0b43cff --- /dev/null +++ b/js-plugins/svelte/src/utils/log.js @@ -0,0 +1,277 @@ +/* eslint-disable no-console */ +import { cyan, red, yellow } from 'kleur/colors'; +import debug from 'debug'; + +/** @type {import('../types/log.d.ts').LogLevel[]} */ +const levels = ['debug', 'info', 'warn', 'error', 'silent']; +const prefix = 'vite-plugin-svelte'; +/** @type {Record} */ +const loggers = { + debug: { + log: debug(`${prefix}`), + enabled: false, + isDebug: true + }, + info: { + color: cyan, + log: console.log, + enabled: true + }, + warn: { + color: yellow, + log: console.warn, + enabled: true + }, + error: { + color: red, + log: console.error, + enabled: true + }, + silent: { + enabled: false + } +}; + +/** @type {import('../types/log.d.ts').LogLevel} */ +let _level = 'info'; +/** + * @param {import('../types/log.d.ts').LogLevel} level + * @returns {void} + */ +function setLevel(level) { + if (level === _level) { + return; + } + const levelIndex = levels.indexOf(level); + if (levelIndex > -1) { + _level = level; + for (let i = 0; i < levels.length; i++) { + loggers[levels[i]].enabled = i >= levelIndex; + } + } else { + _log(loggers.error, `invalid log level: ${level} `); + } +} + +/** + * @param {any} logger + * @param {string} message + * @param {any} [payload] + * @param {string} [namespace] + * @returns + */ +function _log(logger, message, payload, namespace) { + if (!logger.enabled) { + return; + } + if (logger.isDebug) { + let log = logger.log; + if (namespace) { + if (!isDebugNamespaceEnabled(namespace)) { + return; + } + log = logger.log.extend(namespace); + } + if (payload !== undefined) { + log(message, payload); + } else { + log(message); + } + } else { + logger.log( + logger.color( + `${new Date().toLocaleTimeString()} [${prefix}${ + namespace ? `:${namespace}` : '' + }] ${message}` + ) + ); + if (payload) { + logger.log(payload); + } + } +} + +/** + * @param {import('../types/log.d.ts').LogLevel} level + * @returns {import('../types/log.d.ts').LogFn} + */ +function createLogger(level) { + const logger = loggers[level]; + const logFn = /** @type {import('../types/log.d.ts').LogFn} */ (_log.bind(null, logger)); + /** @type {Set} */ + const logged = new Set(); + /** @type {import('../types/log.d.ts').SimpleLogFn} */ + const once = function (message, payload, namespace) { + if (!logger.enabled || logged.has(message)) { + return; + } + logged.add(message); + logFn.apply(null, [message, payload, namespace]); + }; + Object.defineProperty(logFn, 'enabled', { + get() { + return logger.enabled; + } + }); + Object.defineProperty(logFn, 'once', { + get() { + return once; + } + }); + return logFn; +} + +export const log = { + debug: createLogger('debug'), + info: createLogger('info'), + warn: createLogger('warn'), + error: createLogger('error'), + setLevel +}; + +/** + * @param {import('../types/id.d.ts').SvelteRequest | import('../types/id.d.ts').SvelteModuleRequest} svelteRequest + * @param {import('svelte/compiler').Warning[]} warnings + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +export function logCompilerWarnings(svelteRequest, warnings, options) { + const { emitCss, onwarn, isBuild } = options; + const sendViaWS = !isBuild && options.experimental?.sendWarningsToBrowser; + let warn = isBuild ? warnBuild : warnDev; + /** @type {import('svelte/compiler').Warning[]} */ + const handledByDefaultWarn = []; + const notIgnored = warnings?.filter((w) => !ignoreCompilerWarning(w, isBuild, emitCss)); + const extra = buildExtraWarnings(warnings, isBuild); + const allWarnings = [...notIgnored, ...extra]; + if (sendViaWS) { + const _warn = warn; + /** @type {(w: import('svelte/compiler').Warning) => void} */ + warn = (w) => { + handledByDefaultWarn.push(w); + _warn(w); + }; + } + allWarnings.forEach((warning) => { + if (onwarn) { + onwarn(warning, warn); + } else { + warn(warning); + } + }); + if (sendViaWS) { + /** @type {import('../types/log.d.ts').SvelteWarningsMessage} */ + const message = { + id: svelteRequest.id, + filename: svelteRequest.filename, + normalizedFilename: svelteRequest.normalizedFilename, + timestamp: svelteRequest.timestamp, + warnings: handledByDefaultWarn, // allWarnings filtered by warnings where onwarn did not call the default handler + allWarnings, // includes warnings filtered by onwarn and our extra vite plugin svelte warnings + rawWarnings: warnings // raw compiler output + }; + log.debug(`sending svelte:warnings message for ${svelteRequest.normalizedFilename}`); + options.server?.ws?.send('svelte:warnings', message); + } +} + +/** + * @param {import('svelte/compiler').Warning} warning + * @param {boolean} isBuild + * @param {boolean} [emitCss] + * @returns {boolean} + */ +function ignoreCompilerWarning(warning, isBuild, emitCss) { + return ( + (!emitCss && warning.code === 'css_unused_selector') || // same as rollup-plugin-svelte + (!isBuild && isNoScopableElementWarning(warning)) + ); +} + +/** + * + * @param {import('svelte/compiler').Warning} warning + * @returns {boolean} + */ +function isNoScopableElementWarning(warning) { + // see https://github.com/sveltejs/vite-plugin-svelte/issues/153 + return warning.code === 'css_unused_selector' && warning.message.includes('"*"'); +} + +/** + * + * @param {import('svelte/compiler').Warning[]} warnings + * @param {boolean} isBuild + * @returns {import('svelte/compiler').Warning[]} + */ +function buildExtraWarnings(warnings, isBuild) { + const extraWarnings = []; + if (!isBuild) { + const noScopableElementWarnings = warnings.filter((w) => isNoScopableElementWarning(w)); + if (noScopableElementWarnings.length > 0) { + // in case there are multiple, use last one as that is the one caused by our *{} rule + const noScopableElementWarning = + noScopableElementWarnings[noScopableElementWarnings.length - 1]; + extraWarnings.push({ + ...noScopableElementWarning, + code: 'vite-plugin-svelte-css-no-scopable-elements', + message: + "No scopable elements found in template. If you're using global styles in the style tag, you should move it into an external stylesheet file and import it in JS. See https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md#where-should-i-put-my-global-styles." + }); + } + } + return extraWarnings; +} + +/** + * @param {import('svelte/compiler').Warning} w + */ +function warnDev(w) { + if (w.filename?.includes('node_modules')) { + if (isDebugNamespaceEnabled('node-modules-onwarn')) { + log.debug(buildExtendedLogMessage(w), undefined, 'node-modules-onwarn'); + } + } else if (log.info.enabled) { + log.info(buildExtendedLogMessage(w)); + } +} + +/** + * @param {import('svelte/compiler').Warning & {frame?: string}} w + */ +function warnBuild(w) { + if (w.filename?.includes('node_modules')) { + if (isDebugNamespaceEnabled('node-modules-onwarn')) { + log.debug(buildExtendedLogMessage(w), w.frame, 'node-modules-onwarn'); + } + } else if (log.warn.enabled) { + log.warn(buildExtendedLogMessage(w), w.frame); + } +} + +/** + * @param {import('svelte/compiler').Warning} w + */ +export function buildExtendedLogMessage(w) { + const parts = []; + if (w.filename) { + parts.push(w.filename); + } + if (w.start) { + parts.push(':', w.start.line, ':', w.start.column); + } + if (w.message) { + if (parts.length > 0) { + parts.push(' '); + } + parts.push(w.message); + } + return parts.join(''); +} + +/** + * @param {string} namespace + * @returns {boolean} + */ +export function isDebugNamespaceEnabled(namespace) { + return debug.enabled(`${prefix}:${namespace}`); +} diff --git a/js-plugins/svelte/src/utils/optimizer.js b/js-plugins/svelte/src/utils/optimizer.js new file mode 100644 index 0000000..71aa571 --- /dev/null +++ b/js-plugins/svelte/src/utils/optimizer.js @@ -0,0 +1,53 @@ +import { promises as fs } from 'node:fs'; +import path from 'node:path'; + +// List of options that changes the prebundling result +/** @type {(keyof import('../types/options.d.ts').ResolvedOptions)[]} */ +const PREBUNDLE_SENSITIVE_OPTIONS = [ + 'compilerOptions', + 'configFile', + 'experimental', + 'extensions', + 'ignorePluginPreprocessors', + 'preprocess' +]; + +/** + * @param {string} cacheDir + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {Promise} Whether the Svelte metadata has changed + */ +export async function saveSvelteMetadata(cacheDir, options) { + const svelteMetadata = generateSvelteMetadata(options); + const svelteMetadataPath = path.resolve(cacheDir, '_svelte_metadata.json'); + + const currentSvelteMetadata = JSON.stringify(svelteMetadata, (_, value) => { + // Handle preprocessors + return typeof value === 'function' ? value.toString() : value; + }); + + /** @type {string | undefined} */ + let existingSvelteMetadata; + try { + existingSvelteMetadata = await fs.readFile(svelteMetadataPath, 'utf8'); + } catch { + // ignore + } + + await fs.mkdir(cacheDir, { recursive: true }); + await fs.writeFile(svelteMetadataPath, currentSvelteMetadata); + return currentSvelteMetadata !== existingSvelteMetadata; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @returns {Partial} + */ +function generateSvelteMetadata(options) { + /** @type {Record} */ + const metadata = {}; + for (const key of PREBUNDLE_SENSITIVE_OPTIONS) { + metadata[key] = options[key]; + } + return metadata; +} diff --git a/js-plugins/svelte/src/utils/options.js b/js-plugins/svelte/src/utils/options.js new file mode 100644 index 0000000..6582e6e --- /dev/null +++ b/js-plugins/svelte/src/utils/options.js @@ -0,0 +1,653 @@ +import process from 'node:process'; +import { + defaultClientMainFields, + defaultServerMainFields, + defaultClientConditions, + defaultServerConditions, + normalizePath +} from 'vite'; +import { isDebugNamespaceEnabled, log } from './log.js'; +import { loadSvelteConfig } from './load-svelte-config.js'; +import { + DEFAULT_SVELTE_EXT, + FAQ_LINK_MISSING_EXPORTS_CONDITION, + SVELTE_EXPORT_CONDITIONS, + SVELTE_IMPORTS +} from './constants.js'; + +import path from 'node:path'; +import { + esbuildSvelteModulePlugin, + esbuildSveltePlugin, + facadeEsbuildSvelteModulePluginName, + facadeEsbuildSveltePluginName +} from './esbuild.js'; +import { addExtraPreprocessors } from './preprocess.js'; +import deepmerge from 'deepmerge'; +import { + crawlFrameworkPkgs, + isDepExcluded, + isDepExternaled, + isDepIncluded, + isDepNoExternaled +} from 'vitefu'; + +import { isCommonDepWithoutSvelteField } from './dependencies.js'; +import { VitePluginSvelteStats } from './vite-plugin-svelte-stats.js'; + +const allowedPluginOptions = new Set([ + 'include', + 'exclude', + 'emitCss', + 'hot', + 'ignorePluginPreprocessors', + 'disableDependencyReinclusion', + 'prebundleSvelteLibraries', + 'inspector', + 'dynamicCompileOptions', + 'experimental' +]); + +const knownRootOptions = new Set(['extensions', 'compilerOptions', 'preprocess', 'onwarn']); + +const allowedInlineOptions = new Set(['configFile', ...allowedPluginOptions, ...knownRootOptions]); + +/** + * @param {Partial} [inlineOptions] + */ +export function validateInlineOptions(inlineOptions) { + const invalidKeys = Object.keys(inlineOptions || {}).filter( + (key) => !allowedInlineOptions.has(key) + ); + if (invalidKeys.length) { + log.warn(`invalid plugin options "${invalidKeys.join(', ')}" in inline config`, inlineOptions); + } +} + +/** + * @param {Partial} [config] + * @returns {Partial | undefined} + */ +function convertPluginOptions(config) { + if (!config) { + return; + } + const invalidRootOptions = Object.keys(config).filter((key) => allowedPluginOptions.has(key)); + if (invalidRootOptions.length > 0) { + throw new Error( + `Invalid options in svelte config. Move the following options into 'vitePlugin:{...}': ${invalidRootOptions.join( + ', ' + )}` + ); + } + if (!config.vitePlugin) { + return config; + } + const pluginOptions = config.vitePlugin; + const pluginOptionKeys = Object.keys(pluginOptions); + + const rootOptionsInPluginOptions = pluginOptionKeys.filter((key) => knownRootOptions.has(key)); + if (rootOptionsInPluginOptions.length > 0) { + throw new Error( + `Invalid options in svelte config under vitePlugin:{...}', move them to the config root : ${rootOptionsInPluginOptions.join( + ', ' + )}` + ); + } + const duplicateOptions = pluginOptionKeys.filter((key) => + Object.prototype.hasOwnProperty.call(config, key) + ); + if (duplicateOptions.length > 0) { + throw new Error( + `Invalid duplicate options in svelte config under vitePlugin:{...}', they are defined in root too and must only exist once: ${duplicateOptions.join( + ', ' + )}` + ); + } + const unknownPluginOptions = pluginOptionKeys.filter((key) => !allowedPluginOptions.has(key)); + if (unknownPluginOptions.length > 0) { + log.warn( + `ignoring unknown plugin options in svelte config under vitePlugin:{...}: ${unknownPluginOptions.join( + ', ' + )}` + ); + unknownPluginOptions.forEach((unkownOption) => { + // @ts-expect-error not typed + delete pluginOptions[unkownOption]; + }); + } + /** @type {import('../public.d.ts').Options} */ + const result = { + ...config, + ...pluginOptions + }; + // @ts-expect-error it exists + delete result.vitePlugin; + + return result; +} + +/** + * used in config phase, merges the default options, svelte config, and inline options + * @param {Partial | undefined} inlineOptions + * @param {import('vite').UserConfig} viteUserConfig + * @param {import('vite').ConfigEnv} viteEnv + * @returns {Promise} + */ +export async function preResolveOptions(inlineOptions, viteUserConfig, viteEnv) { + if (!inlineOptions) { + inlineOptions = {}; + } + /** @type {import('vite').UserConfig} */ + const viteConfigWithResolvedRoot = { + ...viteUserConfig, + root: resolveViteRoot(viteUserConfig) + }; + const isBuild = viteEnv.command === 'build'; + /** @type {Partial} */ + const defaultOptions = { + extensions: DEFAULT_SVELTE_EXT, + emitCss: true, + prebundleSvelteLibraries: !isBuild + }; + const svelteConfig = convertPluginOptions( + await loadSvelteConfig(viteConfigWithResolvedRoot, inlineOptions) + ); + /** @type {Partial} */ + const extraOptions = { + root: viteConfigWithResolvedRoot.root, + isBuild, + isServe: viteEnv.command === 'serve', + isDebug: process.env.DEBUG != null + }; + + const merged = /** @type {import('../types/options.d.ts').PreResolvedOptions} */ ( + mergeConfigs(defaultOptions, svelteConfig, inlineOptions, extraOptions) + ); + // configFile of svelteConfig contains the absolute path it was loaded from, + // prefer it over the possibly relative inline path + if (svelteConfig?.configFile) { + merged.configFile = svelteConfig.configFile; + } + return merged; +} + +/** + * @template T + * @param {(Partial | undefined)[]} configs + * @returns T + */ +function mergeConfigs(...configs) { + /** @type {Partial} */ + let result = {}; + for (const config of configs.filter((x) => x != null)) { + result = deepmerge(result, /** @type {Partial} */ (config), { + // replace arrays + arrayMerge: (target, source) => source ?? target + }); + } + return /** @type {T} */ result; +} + +/** + * used in configResolved phase, merges a contextual default config, pre-resolved options, and some preprocessors. also validates the final config. + * + * @param {import('../types/options.d.ts').PreResolvedOptions} preResolveOptions + * @param {import('vite').ResolvedConfig} viteConfig + * @param {import('./vite-plugin-svelte-cache.js').VitePluginSvelteCache} cache + * @returns {import('../types/options.d.ts').ResolvedOptions} + */ +export function resolveOptions(preResolveOptions, viteConfig, cache) { + const css = preResolveOptions.emitCss ? 'external' : 'injected'; + /** @type {Partial} */ + const defaultOptions = { + compilerOptions: { + css, + dev: !viteConfig.isProduction, + hmr: + !viteConfig.isProduction && + !preResolveOptions.isBuild && + viteConfig.server && + viteConfig.server.hmr !== false + } + }; + + /** @type {Partial} */ + const extraOptions = { + root: viteConfig.root, + isProduction: viteConfig.isProduction + }; + const merged = /** @type {import('../types/options.d.ts').ResolvedOptions}*/ ( + mergeConfigs(defaultOptions, preResolveOptions, extraOptions) + ); + + removeIgnoredOptions(merged); + handleDeprecatedOptions(merged); + addExtraPreprocessors(merged, viteConfig); + enforceOptionsForHmr(merged, viteConfig); + enforceOptionsForProduction(merged); + // mergeConfigs would mangle functions on the stats class, so do this afterwards + if (log.debug.enabled && isDebugNamespaceEnabled('stats')) { + merged.stats = new VitePluginSvelteStats(cache); + } + return merged; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @param {import('vite').ResolvedConfig} viteConfig + */ +function enforceOptionsForHmr(options, viteConfig) { + if (options.hot) { + log.warn( + 'svelte 5 has hmr integrated in core. Please remove the vitePlugin.hot option and use compilerOptions.hmr instead' + ); + delete options.hot; + options.compilerOptions.hmr = true; + } + if (options.compilerOptions.hmr && viteConfig.server?.hmr === false) { + log.warn( + 'vite config server.hmr is false but compilerOptions.hmr is true. Forcing compilerOptions.hmr to false as it would not work.' + ); + options.compilerOptions.hmr = false; + } +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +function enforceOptionsForProduction(options) { + if (options.isProduction) { + if (options.compilerOptions.hmr) { + log.warn( + 'you are building for production but compilerOptions.hmr is true, forcing it to false' + ); + options.compilerOptions.hmr = false; + } + if (options.compilerOptions.dev) { + log.warn( + 'you are building for production but compilerOptions.dev is true, forcing it to false' + ); + options.compilerOptions.dev = false; + } + } +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +function removeIgnoredOptions(options) { + const ignoredCompilerOptions = ['generate', 'format', 'filename']; + if (options.compilerOptions.hmr && options.emitCss) { + ignoredCompilerOptions.push('cssHash'); + } + const passedCompilerOptions = Object.keys(options.compilerOptions || {}); + const passedIgnored = passedCompilerOptions.filter((o) => ignoredCompilerOptions.includes(o)); + if (passedIgnored.length) { + log.warn( + `The following Svelte compilerOptions are controlled by vite-plugin-svelte and essential to its functionality. User-specified values are ignored. Please remove them from your configuration: ${passedIgnored.join( + ', ' + )}` + ); + passedIgnored.forEach((ignored) => { + // @ts-expect-error string access + delete options.compilerOptions[ignored]; + }); + } +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +function handleDeprecatedOptions(options) { + const experimental = /** @type {Record} */ (options.experimental); + if (experimental) { + for (const promoted of ['prebundleSvelteLibraries', 'inspector', 'dynamicCompileOptions']) { + if (experimental[promoted]) { + //@ts-expect-error untyped assign + options[promoted] = experimental[promoted]; + delete experimental[promoted]; + log.warn( + `Option "experimental.${promoted}" is no longer experimental and has moved to "${promoted}". Please update your Svelte or Vite config.` + ); + } + } + if (experimental.generateMissingPreprocessorSourcemaps) { + log.warn('experimental.generateMissingPreprocessorSourcemaps has been removed.'); + } + } +} + +/** + * vite passes unresolved `root`option to config hook but we need the resolved value, so do it here + * + * @see https://github.com/sveltejs/vite-plugin-svelte/issues/113 + * @see https://github.com/vitejs/vite/blob/43c957de8a99bb326afd732c962f42127b0a4d1e/packages/vite/src/node/config.ts#L293 + * + * @param {import('vite').UserConfig} viteConfig + * @returns {string | undefined} + */ +function resolveViteRoot(viteConfig) { + return normalizePath(viteConfig.root ? path.resolve(viteConfig.root) : process.cwd()); +} + +/** + * @param {import('../types/options.d.ts').PreResolvedOptions} options + * @param {import('vite').UserConfig} config + * @returns {Promise>} + */ +export async function buildExtraViteConfig(options, config) { + /** @type {Partial} */ + const extraViteConfig = { + resolve: { + dedupe: [...SVELTE_IMPORTS] + } + // this option is still awaiting a PR in vite to be supported + // see https://github.com/sveltejs/vite-plugin-svelte/issues/60 + // knownJsSrcExtensions: options.extensions + }; + + const extraSvelteConfig = buildExtraConfigForSvelte(config); + const extraDepsConfig = await buildExtraConfigForDependencies(options, config); + // merge extra svelte and deps config, but make sure dep values are not contradicting svelte + extraViteConfig.optimizeDeps = { + include: [ + ...extraSvelteConfig.optimizeDeps.include, + ...extraDepsConfig.optimizeDeps.include.filter( + (dep) => !isDepExcluded(dep, extraSvelteConfig.optimizeDeps.exclude) + ) + ], + exclude: [ + ...extraSvelteConfig.optimizeDeps.exclude, + ...extraDepsConfig.optimizeDeps.exclude.filter( + (dep) => !isDepIncluded(dep, extraSvelteConfig.optimizeDeps.include) + ) + ] + }; + + extraViteConfig.ssr = { + external: [ + ...extraSvelteConfig.ssr.external, + ...extraDepsConfig.ssr.external.filter( + (dep) => !isDepNoExternaled(dep, extraSvelteConfig.ssr.noExternal) + ) + ], + noExternal: [ + ...extraSvelteConfig.ssr.noExternal, + ...extraDepsConfig.ssr.noExternal.filter( + (dep) => !isDepExternaled(dep, extraSvelteConfig.ssr.external) + ) + ] + }; + + // handle prebundling for svelte files + if (options.prebundleSvelteLibraries) { + extraViteConfig.optimizeDeps = { + ...extraViteConfig.optimizeDeps, + // Experimental Vite API to allow these extensions to be scanned and prebundled + extensions: options.extensions ?? ['.svelte'], + // Add esbuild plugin to prebundle Svelte files. + // Currently a placeholder as more information is needed after Vite config is resolved, + // the real Svelte plugin is added in `patchResolvedViteConfig()` + esbuildOptions: { + plugins: [ + { name: facadeEsbuildSveltePluginName, setup: () => {} }, + { name: facadeEsbuildSvelteModulePluginName, setup: () => {} } + ] + } + }; + } + + // enable hmrPartialAccept if not explicitly disabled + if (config.experimental?.hmrPartialAccept !== false) { + log.debug('enabling "experimental.hmrPartialAccept" in vite config', undefined, 'config'); + extraViteConfig.experimental = { hmrPartialAccept: true }; + } + validateViteConfig(extraViteConfig, config, options); + return extraViteConfig; +} + +/** + * @param {Partial} extraViteConfig + * @param {import('vite').UserConfig} config + * @param {import('../types/options.d.ts').PreResolvedOptions} options + */ +function validateViteConfig(extraViteConfig, config, options) { + const { prebundleSvelteLibraries, isBuild } = options; + if (prebundleSvelteLibraries) { + /** @type {(option: 'dev' | 'build' | boolean)=> boolean} */ + const isEnabled = (option) => option !== true && option !== (isBuild ? 'build' : 'dev'); + /** @type {(name: string, value: 'dev' | 'build' | boolean, recommendation: string)=> void} */ + const logWarning = (name, value, recommendation) => + log.warn.once( + `Incompatible options: \`prebundleSvelteLibraries: true\` and vite \`${name}: ${JSON.stringify( + value + )}\` ${isBuild ? 'during build.' : '.'} ${recommendation}` + ); + const viteOptimizeDepsDisabled = config.optimizeDeps?.disabled ?? 'build'; // fall back to vite default + const isOptimizeDepsEnabled = isEnabled(viteOptimizeDepsDisabled); + if (!isBuild && !isOptimizeDepsEnabled) { + logWarning( + 'optimizeDeps.disabled', + viteOptimizeDepsDisabled, + 'Forcing `optimizeDeps.disabled: "build"`. Disable prebundleSvelteLibraries or update your vite config to enable optimizeDeps during dev.' + ); + if (!extraViteConfig.optimizeDeps) { + extraViteConfig.optimizeDeps = {}; + } + extraViteConfig.optimizeDeps.disabled = 'build'; + } else if (isBuild && isOptimizeDepsEnabled) { + logWarning( + 'optimizeDeps.disabled', + viteOptimizeDepsDisabled, + 'Disable optimizeDeps or prebundleSvelteLibraries for build if you experience errors.' + ); + } + } +} + +/** + * @param {import('../types/options.d.ts').PreResolvedOptions} options + * @param {import('vite').UserConfig} config + * @returns {Promise} + */ +async function buildExtraConfigForDependencies(options, config) { + // extra handling for svelte dependencies in the project + const packagesWithoutSvelteExportsCondition = new Set(); + const depsConfig = await crawlFrameworkPkgs({ + root: options.root, + isBuild: options.isBuild, + viteUserConfig: config, + isFrameworkPkgByJson(pkgJson) { + let hasSvelteCondition = false; + if (typeof pkgJson.exports === 'object') { + // use replacer as a simple way to iterate over nested keys + JSON.stringify(pkgJson.exports, (key, value) => { + if (SVELTE_EXPORT_CONDITIONS.includes(key)) { + hasSvelteCondition = true; + } + return value; + }); + } + const hasSvelteField = !!pkgJson.svelte; + if (hasSvelteField && !hasSvelteCondition) { + packagesWithoutSvelteExportsCondition.add(`${pkgJson.name}@${pkgJson.version}`); + } + return hasSvelteCondition || hasSvelteField; + }, + isSemiFrameworkPkgByJson(pkgJson) { + return !!pkgJson.dependencies?.svelte || !!pkgJson.peerDependencies?.svelte; + }, + isFrameworkPkgByName(pkgName) { + const isNotSveltePackage = isCommonDepWithoutSvelteField(pkgName); + if (isNotSveltePackage) { + return false; + } else { + return undefined; + } + } + }); + if ( + !options.experimental?.disableSvelteResolveWarnings && + packagesWithoutSvelteExportsCondition?.size > 0 + ) { + log.warn( + `WARNING: The following packages have a svelte field in their package.json but no exports condition for svelte.\n\n${[ + ...packagesWithoutSvelteExportsCondition + ].join('\n')}\n\nPlease see ${FAQ_LINK_MISSING_EXPORTS_CONDITION} for details.` + ); + } + log.debug('extra config for dependencies generated by vitefu', depsConfig, 'config'); + + if (options.prebundleSvelteLibraries) { + // prebundling enabled, so we don't need extra dependency excludes + depsConfig.optimizeDeps.exclude = []; + // but keep dependency reinclusions of explicit user excludes + const userExclude = config.optimizeDeps?.exclude; + depsConfig.optimizeDeps.include = !userExclude + ? [] + : depsConfig.optimizeDeps.include.filter((dep) => { + // reincludes look like this: foo > bar > baz + // in case foo or bar are excluded, we have to retain the reinclude even with prebundling + return ( + dep.includes('>') && + dep + .split('>') + .slice(0, -1) + .some((d) => isDepExcluded(d.trim(), userExclude)) + ); + }); + } + if (options.disableDependencyReinclusion === true) { + depsConfig.optimizeDeps.include = depsConfig.optimizeDeps.include.filter( + (dep) => !dep.includes('>') + ); + } else if (Array.isArray(options.disableDependencyReinclusion)) { + const disabledDeps = options.disableDependencyReinclusion; + depsConfig.optimizeDeps.include = depsConfig.optimizeDeps.include.filter((dep) => { + if (!dep.includes('>')) return true; + const trimDep = dep.replace(/\s+/g, ''); + return disabledDeps.some((disabled) => trimDep.includes(`${disabled}>`)); + }); + } + + log.debug('post-processed extra config for dependencies', depsConfig, 'config'); + + return depsConfig; +} + +/** + * @param {import('vite').UserConfig} config + * @returns {import('vite').UserConfig & { optimizeDeps: { include: string[], exclude:string[] }, ssr: { noExternal:(string|RegExp)[], external: string[] } } } + */ +function buildExtraConfigForSvelte(config) { + // include svelte imports for optimization unless explicitly excluded + /** @type {string[]} */ + const include = []; + /** @type {string[]} */ + const exclude = []; + if (!isDepExcluded('svelte', config.optimizeDeps?.exclude ?? [])) { + const svelteImportsToInclude = SVELTE_IMPORTS.filter( + (si) => !(si.endsWith('/server') || si.includes('/server/')) + ); + log.debug( + `adding bare svelte packages to optimizeDeps.include: ${svelteImportsToInclude.join(', ')} `, + undefined, + 'config' + ); + include.push(...svelteImportsToInclude); + } else { + log.debug( + '"svelte" is excluded in optimizeDeps.exclude, skipped adding it to include.', + undefined, + 'config' + ); + } + /** @type {(string | RegExp)[]} */ + const noExternal = []; + /** @type {string[]} */ + const external = []; + // add svelte to ssr.noExternal unless it is present in ssr.external + // so it is correctly resolving according to the conditions in sveltes exports map + if (!isDepExternaled('svelte', config.ssr?.external ?? [])) { + noExternal.push('svelte', /^svelte\//); + } + // esm-env needs to be bundled by default for the development/production condition + // be properly used by svelte + if (!isDepExternaled('esm-env', config.ssr?.external ?? [])) { + noExternal.push('esm-env'); + } + return { optimizeDeps: { include, exclude }, ssr: { noExternal, external } }; +} + +/** + * @param {import('vite').ResolvedConfig} viteConfig + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +export function patchResolvedViteConfig(viteConfig, options) { + if (options.preprocess) { + for (const preprocessor of arraify(options.preprocess)) { + if (preprocessor.style && '__resolvedConfig' in preprocessor.style) { + preprocessor.style.__resolvedConfig = viteConfig; + } + } + } + + // replace facade esbuild plugin with a real one + const facadeEsbuildSveltePlugin = viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( + (plugin) => plugin.name === facadeEsbuildSveltePluginName + ); + if (facadeEsbuildSveltePlugin) { + Object.assign(facadeEsbuildSveltePlugin, esbuildSveltePlugin(options)); + } + const facadeEsbuildSvelteModulePlugin = viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( + (plugin) => plugin.name === facadeEsbuildSvelteModulePluginName + ); + if (facadeEsbuildSvelteModulePlugin) { + Object.assign(facadeEsbuildSvelteModulePlugin, esbuildSvelteModulePlugin(options)); + } +} + +/** + * Mutates `config` to ensure `resolve.mainFields` is set. If unset, it emulates Vite's default fallback. + * @param {string} name + * @param {import('vite').EnvironmentOptions} config + * @param {{ isSsrTargetWebworker?: boolean }} opts + */ +export function ensureConfigEnvironmentMainFields(name, config, opts) { + config.resolve ??= {}; + if (config.resolve.mainFields == null) { + if (config.consumer === 'client' || name === 'client' || opts.isSsrTargetWebworker) { + config.resolve.mainFields = [...defaultClientMainFields]; + } else { + config.resolve.mainFields = [...defaultServerMainFields]; + } + } + return true; +} + +/** + * Mutates `config` to ensure `resolve.conditions` is set. If unset, it emulates Vite's default fallback. + * @param {string} name + * @param {import('vite').EnvironmentOptions} config + * @param {{ isSsrTargetWebworker?: boolean }} opts + */ +export function ensureConfigEnvironmentConditions(name, config, opts) { + config.resolve ??= {}; + if (config.resolve.conditions == null) { + if (config.consumer === 'client' || name === 'client' || opts.isSsrTargetWebworker) { + config.resolve.conditions = [...defaultClientConditions]; + } else { + config.resolve.conditions = [...defaultServerConditions]; + } + } +} + +/** + * @template T + * @param {T | T[]} value + * @returns {T[]} + */ +function arraify(value) { + return Array.isArray(value) ? value : [value]; +} diff --git a/js-plugins/svelte/src/utils/preprocess.js b/js-plugins/svelte/src/utils/preprocess.js new file mode 100644 index 0000000..602c649 --- /dev/null +++ b/js-plugins/svelte/src/utils/preprocess.js @@ -0,0 +1,173 @@ +import MagicString from 'magic-string'; +import { log } from './log.js'; +import path from 'node:path'; +import { normalizePath } from 'vite'; + +/** + * this appends a *{} rule to component styles to force the svelte compiler to add style classes to all nodes + * That means adding/removing class rules from diff --git a/js-plugins/svelte/playground/src/app.css b/js-plugins/svelte/playground/src/app.css deleted file mode 100644 index 617f5e9..0000000 --- a/js-plugins/svelte/playground/src/app.css +++ /dev/null @@ -1,79 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -.card { - padding: 2em; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/js-plugins/svelte/playground/src/assets/svelte.svg b/js-plugins/svelte/playground/src/assets/svelte.svg deleted file mode 100644 index c5e0848..0000000 --- a/js-plugins/svelte/playground/src/assets/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/js-plugins/svelte/playground/src/lib/Counter.svelte b/js-plugins/svelte/playground/src/lib/Counter.svelte deleted file mode 100644 index 37d75ce..0000000 --- a/js-plugins/svelte/playground/src/lib/Counter.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/js-plugins/svelte/playground/src/main.ts b/js-plugins/svelte/playground/src/main.ts deleted file mode 100644 index 664a057..0000000 --- a/js-plugins/svelte/playground/src/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mount } from 'svelte' -import './app.css' -import App from './App.svelte' - -const app = mount(App, { - target: document.getElementById('app')!, -}) - -export default app diff --git a/js-plugins/svelte/playground/src/vite-env.d.ts b/js-plugins/svelte/playground/src/vite-env.d.ts deleted file mode 100644 index 4078e74..0000000 --- a/js-plugins/svelte/playground/src/vite-env.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -/// -/// diff --git a/js-plugins/svelte/playground/svelte.config.js b/js-plugins/svelte/playground/svelte.config.js deleted file mode 100644 index b0683fd..0000000 --- a/js-plugins/svelte/playground/svelte.config.js +++ /dev/null @@ -1,7 +0,0 @@ -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' - -export default { - // Consult https://svelte.dev/docs#compile-time-svelte-preprocess - // for more information about preprocessors - preprocess: vitePreprocess(), -} diff --git a/js-plugins/svelte/playground/tsconfig.app.json b/js-plugins/svelte/playground/tsconfig.app.json deleted file mode 100644 index 55a2f9b..0000000 --- a/js-plugins/svelte/playground/tsconfig.app.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "@tsconfig/svelte/tsconfig.json", - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "resolveJsonModule": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ - "allowJs": true, - "checkJs": true, - "isolatedModules": true, - "moduleDetection": "force" - }, - "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] -} diff --git a/js-plugins/svelte/playground/tsconfig.json b/js-plugins/svelte/playground/tsconfig.json deleted file mode 100644 index 1ffef60..0000000 --- a/js-plugins/svelte/playground/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] -} diff --git a/js-plugins/svelte/playground/tsconfig.node.json b/js-plugins/svelte/playground/tsconfig.node.json deleted file mode 100644 index db0becc..0000000 --- a/js-plugins/svelte/playground/tsconfig.node.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/js-plugins/svelte/playground/vite.config.ts b/js-plugins/svelte/playground/vite.config.ts deleted file mode 100644 index d32eba1..0000000 --- a/js-plugins/svelte/playground/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import { svelte } from '@sveltejs/vite-plugin-svelte' - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [svelte()], -}) diff --git a/js-plugins/svelte/src/index.js b/js-plugins/svelte/src/index.js index 9ec43e9..02ed482 100644 --- a/js-plugins/svelte/src/index.js +++ b/js-plugins/svelte/src/index.js @@ -1,236 +1,297 @@ -import fs from 'node:fs'; -import process from 'node:process'; -import { svelteInspector } from '@sveltejs/vite-plugin-svelte-inspector'; -import { handleHotUpdate } from './handle-hot-update.js'; -import { log, logCompilerWarnings } from './utils/log.js'; -import { createCompileSvelte } from './utils/compile.js'; -import { buildIdParser, buildModuleIdParser } from './utils/id.js'; +import fs from "node:fs"; +import process from "node:process"; +// import { svelteInspector } from '@sveltejs/vite-plugin-svelte-inspector'; +import { handleHotUpdate } from "./handle-hot-update.js"; +import { log, logCompilerWarnings } from "./utils/log.js"; +import { createCompileSvelte } from "./utils/compile.js"; +import { buildIdParser, buildModuleIdParser } from "./utils/id.js"; import { - buildExtraViteConfig, - validateInlineOptions, - resolveOptions, - patchResolvedViteConfig, - preResolveOptions, - ensureConfigEnvironmentMainFields, - ensureConfigEnvironmentConditions -} from './utils/options.js'; -import { ensureWatchedFile, setupWatchers } from './utils/watch.js'; -import { toRollupError } from './utils/error.js'; -import { saveSvelteMetadata } from './utils/optimizer.js'; -import { VitePluginSvelteCache } from './utils/vite-plugin-svelte-cache.js'; -import { loadRaw } from './utils/load-raw.js'; -import * as svelteCompiler from 'svelte/compiler'; + validateInlineOptions, + resolveOptions, + patchResolvedViteConfig, + preResolveOptions, + ensureConfigEnvironmentMainFields, + ensureConfigEnvironmentConditions, + buildExtraFarmConfig, +} from "./utils/options.js"; +import { ensureWatchedFile, setupWatchers } from "./utils/watch.js"; +import { toRollupError } from "./utils/error.js"; +import { saveSvelteMetadata } from "./utils/optimizer.js"; +import { VitePluginSvelteCache } from "./utils/vite-plugin-svelte-cache.js"; +import { loadRaw } from "./utils/load-raw.js"; +import * as svelteCompiler from "svelte/compiler"; /** * @param {Partial} [inlineOptions] * @returns {import('vite').Plugin[]} */ export function svelte(inlineOptions) { - if (process.env.DEBUG != null) { - log.setLevel('debug'); - } - validateInlineOptions(inlineOptions); - const cache = new VitePluginSvelteCache(); - // updated in configResolved hook - /** @type {import('./types/id.d.ts').IdParser} */ - let requestParser; - /** @type {import('./types/id.d.ts').ModuleIdParser} */ - let moduleRequestParser; - /** @type {import('./types/options.d.ts').ResolvedOptions} */ - let options; - /** @type {import('vite').ResolvedConfig} */ - let viteConfig; - /** @type {import('./types/compile.d.ts').CompileSvelte} */ - let compileSvelte; - /** @type {import('./types/plugin-api.d.ts').PluginAPI} */ - const api = {}; - /** @type {import('vite').Plugin[]} */ - const plugins = [ - { - name: 'vite-plugin-svelte', - // make sure our resolver runs before vite internal resolver to resolve svelte field correctly - enforce: 'pre', - api, - async config(config, configEnv) { - // setup logger - if (process.env.DEBUG) { - log.setLevel('debug'); - } else if (config.logLevel) { - log.setLevel(config.logLevel); - } - // @ts-expect-error temporarily lend the options variable until fixed in configResolved - options = await preResolveOptions(inlineOptions, config, configEnv); - // extra vite config - const extraViteConfig = await buildExtraViteConfig(options, config); - log.debug('additional vite config', extraViteConfig, 'config'); - return extraViteConfig; - }, - - configEnvironment(name, config, opts) { - ensureConfigEnvironmentMainFields(name, config, opts); - // @ts-expect-error the function above should make `resolve.mainFields` non-nullable - config.resolve.mainFields.unshift('svelte'); - - ensureConfigEnvironmentConditions(name, config, opts); - // @ts-expect-error the function above should make `resolve.conditions` non-nullable - config.resolve.conditions.push('svelte'); - }, - - async configResolved(config) { - options = resolveOptions(options, config, cache); - patchResolvedViteConfig(config, options); - requestParser = buildIdParser(options); - compileSvelte = createCompileSvelte(); - viteConfig = config; - // TODO deep clone to avoid mutability from outside? - api.options = options; - log.debug('resolved options', options, 'config'); - }, - - async buildStart() { - if (!options.prebundleSvelteLibraries) return; - const isSvelteMetadataChanged = await saveSvelteMetadata(viteConfig.cacheDir, options); - if (isSvelteMetadataChanged) { - // Force Vite to optimize again. Although we mutate the config here, it works because - // Vite's optimizer runs after `buildStart()`. - viteConfig.optimizeDeps.force = true; - } - }, - - configureServer(server) { - options.server = server; - setupWatchers(options, cache, requestParser); - }, - - async load(id, opts) { - const ssr = !!opts?.ssr; - const svelteRequest = requestParser(id, !!ssr); - if (svelteRequest) { - const { filename, query, raw } = svelteRequest; - if (raw) { - const code = await loadRaw(svelteRequest, compileSvelte, options); - // prevent vite from injecting sourcemaps in the results. - return { - code, - map: { - mappings: '' - } - }; - } else { - if (query.svelte && query.type === 'style') { - const css = cache.getCSS(svelteRequest); - if (css) { - return css; - } - } - // prevent vite asset plugin from loading files as url that should be compiled in transform - if (viteConfig.assetsInclude(filename)) { - log.debug(`load returns raw content for ${filename}`, undefined, 'load'); - return fs.readFileSync(filename, 'utf-8'); - } - } - } - }, - - async resolveId(importee, importer, opts) { - const ssr = !!opts?.ssr; - const svelteRequest = requestParser(importee, ssr); - if (svelteRequest?.query.svelte) { - if ( - svelteRequest.query.type === 'style' && - !svelteRequest.raw && - !svelteRequest.query.inline - ) { - // return cssId with root prefix so postcss pipeline of vite finds the directory correctly - // see https://github.com/sveltejs/vite-plugin-svelte/issues/14 - log.debug( - `resolveId resolved virtual css module ${svelteRequest.cssId}`, - undefined, - 'resolve' - ); - return svelteRequest.cssId; - } - } - }, - - async transform(code, id, opts) { - const ssr = !!opts?.ssr; - const svelteRequest = requestParser(id, ssr); - if (!svelteRequest || svelteRequest.query.type === 'style' || svelteRequest.raw) { - return; - } - let compileData; - try { - compileData = await compileSvelte(svelteRequest, code, options); - } catch (e) { - cache.setError(svelteRequest, e); - throw toRollupError(e, options); - } - logCompilerWarnings(svelteRequest, compileData.compiled.warnings, options); - cache.update(compileData); - if (compileData.dependencies?.length) { - if (options.server) { - for (const dep of compileData.dependencies) { - ensureWatchedFile(options.server.watcher, dep, options.root); - } - } else if (options.isBuild && viteConfig.build.watch) { - for (const dep of compileData.dependencies) { - this.addWatchFile(dep); - } - } - } - return { - ...compileData.compiled.js, - meta: { - vite: { - lang: compileData.lang - } - } - }; - }, - - handleHotUpdate(ctx) { - if (!options.compilerOptions.hmr || !options.emitCss) { - return; - } - const svelteRequest = requestParser(ctx.file, false, ctx.timestamp); - if (svelteRequest) { - return handleHotUpdate(compileSvelte, ctx, svelteRequest, cache, options); - } - }, - async buildEnd() { - await options.stats?.finishAll(); - } - }, - { - name: 'vite-plugin-svelte-module', - enforce: 'post', - async configResolved() { - moduleRequestParser = buildModuleIdParser(options); - }, - async transform(code, id, opts) { - const ssr = !!opts?.ssr; - const moduleRequest = moduleRequestParser(id, ssr); - if (!moduleRequest) { - return; - } - try { - const compileResult = svelteCompiler.compileModule(code, { - dev: !viteConfig.isProduction, - generate: ssr ? 'server' : 'client', - filename: moduleRequest.filename - }); - logCompilerWarnings(moduleRequest, compileResult.warnings, options); - return compileResult.js; - } catch (e) { - throw toRollupError(e, options); - } - } - }, - svelteInspector() - ]; - return plugins; + if (process.env.DEBUG != null) { + log.setLevel("debug"); + } + validateInlineOptions(inlineOptions); + const cache = new VitePluginSvelteCache(); + // updated in configResolved hook + /** @type {import('./types/id.d.ts').IdParser} */ + let requestParser; + /** @type {import('./types/id.d.ts').ModuleIdParser} */ + let moduleRequestParser; + /** @type {import('./types/options.d.ts').ResolvedOptions} */ + let options; + /** @type {import('vite').ResolvedConfig} */ + let viteConfig; + /** @type {import('./types/compile.d.ts').CompileSvelte} */ + let compileSvelte; + const plugins = [ + { + name: "svelte", + // make sure our resolver runs before vite internal resolver to resolve svelte field correctly + priority: 105, + async config(config, configEnv) { + options = await preResolveOptions(inlineOptions, config, configEnv); + + const extraFarmConfig = await buildExtraFarmConfig(); + + return extraFarmConfig; + }, + + async configResolved(config) { + options = resolveOptions(options, config, cache); + + requestParser = buildIdParser(options); + + compileSvelte = createCompileSvelte(); + viteConfig = config; + }, + configureServer(server) { + options.server = server; + setupWatchers(options, cache, requestParser); + }, + + load: { + filters: { + resolvedPaths: [".*"], + }, + async executor(param) { + const isSsr = options.ssr ?? false; + const svelteRequest = requestParser( + param.resolvedPath, + !!options.ssr + ); + if (svelteRequest) { + const { filename, query, raw } = svelteRequest; + if (raw) { + console.log(filename); + + const code = await loadRaw(svelteRequest, compileSvelte, options); + // prevent vite from injecting sourcemaps in the results. + console.log(code); + return { + content: code, + moduleType: "svelte", + }; + } else { + if (query.svelte && query.type === "style") { + const css = cache.getCSS(svelteRequest); + + if (css) { + return { + content: css, + moduleType: "css", + }; + } + } + } + } + }, + }, + + // async load(id, opts) { + // const ssr = !!opts?.ssr; + // const svelteRequest = requestParser(id, !!ssr); + // if (svelteRequest) { + // const { filename, query, raw } = svelteRequest; + // if (raw) { + // const code = await loadRaw(svelteRequest, compileSvelte, options); + // // prevent vite from injecting sourcemaps in the results. + // return { + // code, + // map: { + // mappings: "", + // }, + // }; + // } else { + // if (query.svelte && query.type === "style") { + // const css = cache.getCSS(svelteRequest); + // if (css) { + // return css; + // } + // } + // // prevent vite asset plugin from loading files as url that should be compiled in transform + // if (viteConfig.assetsInclude(filename)) { + // log.debug( + // `load returns raw content for ${filename}`, + // undefined, + // "load" + // ); + // return fs.readFileSync(filename, "utf-8"); + // } + // } + // } + // }, + + resolve: { + filters: { + sources: [".*"], + importers: [".*"], + }, + executor: async (param, context, hookContext) => { + const isSsr = options.ssr ?? false; + const svelteRequest = requestParser(param.source, !!options.ssr); + if (svelteRequest?.query.svelte) { + if ( + svelteRequest.query.type === "style" && + !svelteRequest.raw && + !svelteRequest.query.inline + ) { + return svelteRequest.cssId; + } + } + }, + }, + + // async resolveId(importee, importer, opts) { + // const ssr = !!opts?.ssr; + // const svelteRequest = requestParser(importee, ssr); + // if (svelteRequest?.query.svelte) { + // if ( + // svelteRequest.query.type === "style" && + // !svelteRequest.raw && + // !svelteRequest.query.inline + // ) { + // // return cssId with root prefix so postcss pipeline of vite finds the directory correctly + // // see https://github.com/sveltejs/vite-plugin-svelte/issues/14 + // log.debug( + // `resolveId resolved virtual css module ${svelteRequest.cssId}`, + // undefined, + // "resolve" + // ); + // return svelteRequest.cssId; + // } + // } + // }, + + transform: { + filters: { + moduleTypes: ["*"], + resolvedPaths: [".*"], + }, + async executor(param, ctx) { + console.log(param); + // const { css: compiledCss, map } = compileSass(param.content); + // return { + // content: compiledCss, + // moduleType: 'css' // transformed sass to css, + // sourceMap: JSON.stringify(map) + // ignorePreviousSourceMap: false, + // } + }, + }, + + // async transform(code, id, opts) { + // const ssr = !!opts?.ssr; + // const svelteRequest = requestParser(id, ssr); + // if ( + // !svelteRequest || + // svelteRequest.query.type === "style" || + // svelteRequest.raw + // ) { + // return; + // } + // let compileData; + // try { + // compileData = await compileSvelte(svelteRequest, code, options); + // } catch (e) { + // cache.setError(svelteRequest, e); + // throw toRollupError(e, options); + // } + // logCompilerWarnings( + // svelteRequest, + // compileData.compiled.warnings, + // options + // ); + // cache.update(compileData); + // if (compileData.dependencies?.length) { + // if (options.server) { + // for (const dep of compileData.dependencies) { + // ensureWatchedFile(options.server.watcher, dep, options.root); + // } + // } else if (options.isBuild && viteConfig.build.watch) { + // for (const dep of compileData.dependencies) { + // this.addWatchFile(dep); + // } + // } + // } + // return { + // ...compileData.compiled.js, + // meta: { + // vite: { + // lang: compileData.lang, + // }, + // }, + // }; + // }, + + // handleHotUpdate(ctx) { + // if (!options.compilerOptions.hmr || !options.emitCss) { + // return; + // } + // const svelteRequest = requestParser(ctx.file, false, ctx.timestamp); + // if (svelteRequest) { + // return handleHotUpdate( + // compileSvelte, + // ctx, + // svelteRequest, + // cache, + // options + // ); + // } + // }, + + finish: { + async executor() { + await options.stats?.finishAll(); + }, + }, + }, + { + name: "vite-plugin-svelte-module", + priority: 99, + // async configResolved() { + // moduleRequestParser = buildModuleIdParser(options); + // }, + // async transform(code, id, opts) { + // const ssr = !!opts?.ssr; + // const moduleRequest = moduleRequestParser(id, ssr); + // if (!moduleRequest) { + // return; + // } + // try { + // const compileResult = svelteCompiler.compileModule(code, { + // dev: !viteConfig.isProduction, + // generate: ssr ? "server" : "client", + // filename: moduleRequest.filename, + // }); + // logCompilerWarnings(moduleRequest, compileResult.warnings, options); + // return compileResult.js; + // } catch (e) { + // throw toRollupError(e, options); + // } + // }, + }, + ]; + return plugins; } -export { vitePreprocess } from './preprocess.js'; -export { loadSvelteConfig } from './utils/load-svelte-config.js'; +export { vitePreprocess } from "./preprocess.js"; +export { loadSvelteConfig } from "./utils/load-svelte-config.js"; diff --git a/js-plugins/svelte/src/utils/options.js b/js-plugins/svelte/src/utils/options.js index 6582e6e..3206f50 100644 --- a/js-plugins/svelte/src/utils/options.js +++ b/js-plugins/svelte/src/utils/options.js @@ -1,67 +1,79 @@ -import process from 'node:process'; +import process from "node:process"; import { - defaultClientMainFields, - defaultServerMainFields, - defaultClientConditions, - defaultServerConditions, - normalizePath -} from 'vite'; -import { isDebugNamespaceEnabled, log } from './log.js'; -import { loadSvelteConfig } from './load-svelte-config.js'; + defaultClientMainFields, + defaultServerMainFields, + defaultClientConditions, + defaultServerConditions, + normalizePath, +} from "vite"; +import { isDebugNamespaceEnabled, log } from "./log.js"; +import { loadSvelteConfig } from "./load-svelte-config.js"; import { - DEFAULT_SVELTE_EXT, - FAQ_LINK_MISSING_EXPORTS_CONDITION, - SVELTE_EXPORT_CONDITIONS, - SVELTE_IMPORTS -} from './constants.js'; + DEFAULT_SVELTE_EXT, + FAQ_LINK_MISSING_EXPORTS_CONDITION, + SVELTE_EXPORT_CONDITIONS, + SVELTE_IMPORTS, +} from "./constants.js"; -import path from 'node:path'; +import path from "node:path"; import { - esbuildSvelteModulePlugin, - esbuildSveltePlugin, - facadeEsbuildSvelteModulePluginName, - facadeEsbuildSveltePluginName -} from './esbuild.js'; -import { addExtraPreprocessors } from './preprocess.js'; -import deepmerge from 'deepmerge'; + esbuildSvelteModulePlugin, + esbuildSveltePlugin, + facadeEsbuildSvelteModulePluginName, + facadeEsbuildSveltePluginName, +} from "./esbuild.js"; +import { addExtraPreprocessors } from "./preprocess.js"; +import deepmerge from "deepmerge"; import { - crawlFrameworkPkgs, - isDepExcluded, - isDepExternaled, - isDepIncluded, - isDepNoExternaled -} from 'vitefu'; + crawlFrameworkPkgs, + isDepExcluded, + isDepExternaled, + isDepIncluded, + isDepNoExternaled, +} from "vitefu"; -import { isCommonDepWithoutSvelteField } from './dependencies.js'; -import { VitePluginSvelteStats } from './vite-plugin-svelte-stats.js'; +import { isCommonDepWithoutSvelteField } from "./dependencies.js"; +import { VitePluginSvelteStats } from "./vite-plugin-svelte-stats.js"; const allowedPluginOptions = new Set([ - 'include', - 'exclude', - 'emitCss', - 'hot', - 'ignorePluginPreprocessors', - 'disableDependencyReinclusion', - 'prebundleSvelteLibraries', - 'inspector', - 'dynamicCompileOptions', - 'experimental' + "include", + "exclude", + "emitCss", + "hot", + "ignorePluginPreprocessors", + "disableDependencyReinclusion", + "prebundleSvelteLibraries", + "inspector", + "dynamicCompileOptions", + "experimental", ]); -const knownRootOptions = new Set(['extensions', 'compilerOptions', 'preprocess', 'onwarn']); +const knownRootOptions = new Set([ + "extensions", + "compilerOptions", + "preprocess", + "onwarn", +]); -const allowedInlineOptions = new Set(['configFile', ...allowedPluginOptions, ...knownRootOptions]); +const allowedInlineOptions = new Set([ + "configFile", + ...allowedPluginOptions, + ...knownRootOptions, +]); /** * @param {Partial} [inlineOptions] */ export function validateInlineOptions(inlineOptions) { - const invalidKeys = Object.keys(inlineOptions || {}).filter( - (key) => !allowedInlineOptions.has(key) - ); - if (invalidKeys.length) { - log.warn(`invalid plugin options "${invalidKeys.join(', ')}" in inline config`, inlineOptions); - } + const invalidKeys = Object.keys(inlineOptions || {}).filter( + (key) => !allowedInlineOptions.has(key) + ); + if (invalidKeys.length) { + log.warn( + `invalid plugin options "${invalidKeys.join(", ")}" in inline config`, + inlineOptions + ); + } } /** @@ -69,62 +81,68 @@ export function validateInlineOptions(inlineOptions) { * @returns {Partial | undefined} */ function convertPluginOptions(config) { - if (!config) { - return; - } - const invalidRootOptions = Object.keys(config).filter((key) => allowedPluginOptions.has(key)); - if (invalidRootOptions.length > 0) { - throw new Error( - `Invalid options in svelte config. Move the following options into 'vitePlugin:{...}': ${invalidRootOptions.join( - ', ' - )}` - ); - } - if (!config.vitePlugin) { - return config; - } - const pluginOptions = config.vitePlugin; - const pluginOptionKeys = Object.keys(pluginOptions); - - const rootOptionsInPluginOptions = pluginOptionKeys.filter((key) => knownRootOptions.has(key)); - if (rootOptionsInPluginOptions.length > 0) { - throw new Error( - `Invalid options in svelte config under vitePlugin:{...}', move them to the config root : ${rootOptionsInPluginOptions.join( - ', ' - )}` - ); - } - const duplicateOptions = pluginOptionKeys.filter((key) => - Object.prototype.hasOwnProperty.call(config, key) - ); - if (duplicateOptions.length > 0) { - throw new Error( - `Invalid duplicate options in svelte config under vitePlugin:{...}', they are defined in root too and must only exist once: ${duplicateOptions.join( - ', ' - )}` - ); - } - const unknownPluginOptions = pluginOptionKeys.filter((key) => !allowedPluginOptions.has(key)); - if (unknownPluginOptions.length > 0) { - log.warn( - `ignoring unknown plugin options in svelte config under vitePlugin:{...}: ${unknownPluginOptions.join( - ', ' - )}` - ); - unknownPluginOptions.forEach((unkownOption) => { - // @ts-expect-error not typed - delete pluginOptions[unkownOption]; - }); - } - /** @type {import('../public.d.ts').Options} */ - const result = { - ...config, - ...pluginOptions - }; - // @ts-expect-error it exists - delete result.vitePlugin; - - return result; + if (!config) { + return; + } + const invalidRootOptions = Object.keys(config).filter((key) => + allowedPluginOptions.has(key) + ); + if (invalidRootOptions.length > 0) { + throw new Error( + `Invalid options in svelte config. Move the following options into 'vitePlugin:{...}': ${invalidRootOptions.join( + ", " + )}` + ); + } + if (!config.vitePlugin) { + return config; + } + const pluginOptions = config.vitePlugin; + const pluginOptionKeys = Object.keys(pluginOptions); + + const rootOptionsInPluginOptions = pluginOptionKeys.filter((key) => + knownRootOptions.has(key) + ); + if (rootOptionsInPluginOptions.length > 0) { + throw new Error( + `Invalid options in svelte config under vitePlugin:{...}', move them to the config root : ${rootOptionsInPluginOptions.join( + ", " + )}` + ); + } + const duplicateOptions = pluginOptionKeys.filter((key) => + Object.prototype.hasOwnProperty.call(config, key) + ); + if (duplicateOptions.length > 0) { + throw new Error( + `Invalid duplicate options in svelte config under vitePlugin:{...}', they are defined in root too and must only exist once: ${duplicateOptions.join( + ", " + )}` + ); + } + const unknownPluginOptions = pluginOptionKeys.filter( + (key) => !allowedPluginOptions.has(key) + ); + if (unknownPluginOptions.length > 0) { + log.warn( + `ignoring unknown plugin options in svelte config under vitePlugin:{...}: ${unknownPluginOptions.join( + ", " + )}` + ); + unknownPluginOptions.forEach((unkownOption) => { + // @ts-expect-error not typed + delete pluginOptions[unkownOption]; + }); + } + /** @type {import('../public.d.ts').Options} */ + const result = { + ...config, + ...pluginOptions, + }; + // @ts-expect-error it exists + delete result.vitePlugin; + + return result; } /** @@ -134,42 +152,47 @@ function convertPluginOptions(config) { * @param {import('vite').ConfigEnv} viteEnv * @returns {Promise} */ -export async function preResolveOptions(inlineOptions, viteUserConfig, viteEnv) { - if (!inlineOptions) { - inlineOptions = {}; - } - /** @type {import('vite').UserConfig} */ - const viteConfigWithResolvedRoot = { - ...viteUserConfig, - root: resolveViteRoot(viteUserConfig) - }; - const isBuild = viteEnv.command === 'build'; - /** @type {Partial} */ - const defaultOptions = { - extensions: DEFAULT_SVELTE_EXT, - emitCss: true, - prebundleSvelteLibraries: !isBuild - }; - const svelteConfig = convertPluginOptions( - await loadSvelteConfig(viteConfigWithResolvedRoot, inlineOptions) - ); - /** @type {Partial} */ - const extraOptions = { - root: viteConfigWithResolvedRoot.root, - isBuild, - isServe: viteEnv.command === 'serve', - isDebug: process.env.DEBUG != null - }; - - const merged = /** @type {import('../types/options.d.ts').PreResolvedOptions} */ ( - mergeConfigs(defaultOptions, svelteConfig, inlineOptions, extraOptions) - ); - // configFile of svelteConfig contains the absolute path it was loaded from, - // prefer it over the possibly relative inline path - if (svelteConfig?.configFile) { - merged.configFile = svelteConfig.configFile; - } - return merged; +export async function preResolveOptions( + inlineOptions, + viteUserConfig, + viteEnv +) { + if (!inlineOptions) { + inlineOptions = {}; + } + /** @type {import('vite').UserConfig} */ + const viteConfigWithResolvedRoot = { + ...viteUserConfig, + root: resolveViteRoot(viteUserConfig), + }; + const isBuild = viteEnv.command === "build"; + /** @type {Partial} */ + const defaultOptions = { + extensions: DEFAULT_SVELTE_EXT, + emitCss: true, + prebundleSvelteLibraries: !isBuild, + }; + const svelteConfig = convertPluginOptions( + await loadSvelteConfig(viteConfigWithResolvedRoot, inlineOptions) + ); + /** @type {Partial} */ + const extraOptions = { + root: viteConfigWithResolvedRoot.root, + isBuild, + isServe: viteEnv.command === "serve", + isDebug: process.env.DEBUG != null, + }; + + const merged = + /** @type {import('../types/options.d.ts').PreResolvedOptions} */ ( + mergeConfigs(defaultOptions, svelteConfig, inlineOptions, extraOptions) + ); + // configFile of svelteConfig contains the absolute path it was loaded from, + // prefer it over the possibly relative inline path + if (svelteConfig?.configFile) { + merged.configFile = svelteConfig.configFile; + } + return merged; } /** @@ -178,15 +201,15 @@ export async function preResolveOptions(inlineOptions, viteUserConfig, viteEnv) * @returns T */ function mergeConfigs(...configs) { - /** @type {Partial} */ - let result = {}; - for (const config of configs.filter((x) => x != null)) { - result = deepmerge(result, /** @type {Partial} */ (config), { - // replace arrays - arrayMerge: (target, source) => source ?? target - }); - } - return /** @type {T} */ result; + /** @type {Partial} */ + let result = {}; + for (const config of configs.filter((x) => x != null)) { + result = deepmerge(result, /** @type {Partial} */ (config), { + // replace arrays + arrayMerge: (target, source) => source ?? target, + }); + } + return /** @type {T} */ result; } /** @@ -198,39 +221,39 @@ function mergeConfigs(...configs) { * @returns {import('../types/options.d.ts').ResolvedOptions} */ export function resolveOptions(preResolveOptions, viteConfig, cache) { - const css = preResolveOptions.emitCss ? 'external' : 'injected'; - /** @type {Partial} */ - const defaultOptions = { - compilerOptions: { - css, - dev: !viteConfig.isProduction, - hmr: - !viteConfig.isProduction && - !preResolveOptions.isBuild && - viteConfig.server && - viteConfig.server.hmr !== false - } - }; - - /** @type {Partial} */ - const extraOptions = { - root: viteConfig.root, - isProduction: viteConfig.isProduction - }; - const merged = /** @type {import('../types/options.d.ts').ResolvedOptions}*/ ( - mergeConfigs(defaultOptions, preResolveOptions, extraOptions) - ); - - removeIgnoredOptions(merged); - handleDeprecatedOptions(merged); - addExtraPreprocessors(merged, viteConfig); - enforceOptionsForHmr(merged, viteConfig); - enforceOptionsForProduction(merged); - // mergeConfigs would mangle functions on the stats class, so do this afterwards - if (log.debug.enabled && isDebugNamespaceEnabled('stats')) { - merged.stats = new VitePluginSvelteStats(cache); - } - return merged; + const css = preResolveOptions.emitCss ? "external" : "injected"; + /** @type {Partial} */ + const defaultOptions = { + compilerOptions: { + css, + dev: !viteConfig.isProduction, + hmr: + !viteConfig.isProduction && + !preResolveOptions.isBuild && + viteConfig.server && + viteConfig.server.hmr !== false, + }, + }; + + /** @type {Partial} */ + const extraOptions = { + root: viteConfig.root, + isProduction: viteConfig.isProduction, + }; + const merged = /** @type {import('../types/options.d.ts').ResolvedOptions}*/ ( + mergeConfigs(defaultOptions, preResolveOptions, extraOptions) + ); + + removeIgnoredOptions(merged); + handleDeprecatedOptions(merged); + addExtraPreprocessors(merged, viteConfig); + enforceOptionsForHmr(merged, viteConfig); + enforceOptionsForProduction(merged); + // mergeConfigs would mangle functions on the stats class, so do this afterwards + if (log.debug.enabled && isDebugNamespaceEnabled("stats")) { + merged.stats = new VitePluginSvelteStats(cache); + } + return merged; } /** @@ -238,84 +261,94 @@ export function resolveOptions(preResolveOptions, viteConfig, cache) { * @param {import('vite').ResolvedConfig} viteConfig */ function enforceOptionsForHmr(options, viteConfig) { - if (options.hot) { - log.warn( - 'svelte 5 has hmr integrated in core. Please remove the vitePlugin.hot option and use compilerOptions.hmr instead' - ); - delete options.hot; - options.compilerOptions.hmr = true; - } - if (options.compilerOptions.hmr && viteConfig.server?.hmr === false) { - log.warn( - 'vite config server.hmr is false but compilerOptions.hmr is true. Forcing compilerOptions.hmr to false as it would not work.' - ); - options.compilerOptions.hmr = false; - } + if (options.hot) { + log.warn( + "svelte 5 has hmr integrated in core. Please remove the vitePlugin.hot option and use compilerOptions.hmr instead" + ); + delete options.hot; + options.compilerOptions.hmr = true; + } + if (options.compilerOptions.hmr && viteConfig.server?.hmr === false) { + log.warn( + "vite config server.hmr is false but compilerOptions.hmr is true. Forcing compilerOptions.hmr to false as it would not work." + ); + options.compilerOptions.hmr = false; + } } /** * @param {import('../types/options.d.ts').ResolvedOptions} options */ function enforceOptionsForProduction(options) { - if (options.isProduction) { - if (options.compilerOptions.hmr) { - log.warn( - 'you are building for production but compilerOptions.hmr is true, forcing it to false' - ); - options.compilerOptions.hmr = false; - } - if (options.compilerOptions.dev) { - log.warn( - 'you are building for production but compilerOptions.dev is true, forcing it to false' - ); - options.compilerOptions.dev = false; - } - } + if (options.isProduction) { + if (options.compilerOptions.hmr) { + log.warn( + "you are building for production but compilerOptions.hmr is true, forcing it to false" + ); + options.compilerOptions.hmr = false; + } + if (options.compilerOptions.dev) { + log.warn( + "you are building for production but compilerOptions.dev is true, forcing it to false" + ); + options.compilerOptions.dev = false; + } + } } /** * @param {import('../types/options.d.ts').ResolvedOptions} options */ function removeIgnoredOptions(options) { - const ignoredCompilerOptions = ['generate', 'format', 'filename']; - if (options.compilerOptions.hmr && options.emitCss) { - ignoredCompilerOptions.push('cssHash'); - } - const passedCompilerOptions = Object.keys(options.compilerOptions || {}); - const passedIgnored = passedCompilerOptions.filter((o) => ignoredCompilerOptions.includes(o)); - if (passedIgnored.length) { - log.warn( - `The following Svelte compilerOptions are controlled by vite-plugin-svelte and essential to its functionality. User-specified values are ignored. Please remove them from your configuration: ${passedIgnored.join( - ', ' - )}` - ); - passedIgnored.forEach((ignored) => { - // @ts-expect-error string access - delete options.compilerOptions[ignored]; - }); - } + const ignoredCompilerOptions = ["generate", "format", "filename"]; + if (options.compilerOptions.hmr && options.emitCss) { + ignoredCompilerOptions.push("cssHash"); + } + const passedCompilerOptions = Object.keys(options.compilerOptions || {}); + const passedIgnored = passedCompilerOptions.filter((o) => + ignoredCompilerOptions.includes(o) + ); + if (passedIgnored.length) { + log.warn( + `The following Svelte compilerOptions are controlled by vite-plugin-svelte and essential to its functionality. User-specified values are ignored. Please remove them from your configuration: ${passedIgnored.join( + ", " + )}` + ); + passedIgnored.forEach((ignored) => { + // @ts-expect-error string access + delete options.compilerOptions[ignored]; + }); + } } /** * @param {import('../types/options.d.ts').ResolvedOptions} options */ function handleDeprecatedOptions(options) { - const experimental = /** @type {Record} */ (options.experimental); - if (experimental) { - for (const promoted of ['prebundleSvelteLibraries', 'inspector', 'dynamicCompileOptions']) { - if (experimental[promoted]) { - //@ts-expect-error untyped assign - options[promoted] = experimental[promoted]; - delete experimental[promoted]; - log.warn( - `Option "experimental.${promoted}" is no longer experimental and has moved to "${promoted}". Please update your Svelte or Vite config.` - ); - } - } - if (experimental.generateMissingPreprocessorSourcemaps) { - log.warn('experimental.generateMissingPreprocessorSourcemaps has been removed.'); - } - } + const experimental = /** @type {Record} */ ( + options.experimental + ); + if (experimental) { + for (const promoted of [ + "prebundleSvelteLibraries", + "inspector", + "dynamicCompileOptions", + ]) { + if (experimental[promoted]) { + //@ts-expect-error untyped assign + options[promoted] = experimental[promoted]; + delete experimental[promoted]; + log.warn( + `Option "experimental.${promoted}" is no longer experimental and has moved to "${promoted}". Please update your Svelte or Vite config.` + ); + } + } + if (experimental.generateMissingPreprocessorSourcemaps) { + log.warn( + "experimental.generateMissingPreprocessorSourcemaps has been removed." + ); + } + } } /** @@ -328,256 +361,24 @@ function handleDeprecatedOptions(options) { * @returns {string | undefined} */ function resolveViteRoot(viteConfig) { - return normalizePath(viteConfig.root ? path.resolve(viteConfig.root) : process.cwd()); + return normalizePath( + viteConfig.root ? path.resolve(viteConfig.root) : process.cwd() + ); } -/** - * @param {import('../types/options.d.ts').PreResolvedOptions} options - * @param {import('vite').UserConfig} config - * @returns {Promise>} - */ -export async function buildExtraViteConfig(options, config) { - /** @type {Partial} */ - const extraViteConfig = { - resolve: { - dedupe: [...SVELTE_IMPORTS] - } - // this option is still awaiting a PR in vite to be supported - // see https://github.com/sveltejs/vite-plugin-svelte/issues/60 - // knownJsSrcExtensions: options.extensions - }; - - const extraSvelteConfig = buildExtraConfigForSvelte(config); - const extraDepsConfig = await buildExtraConfigForDependencies(options, config); - // merge extra svelte and deps config, but make sure dep values are not contradicting svelte - extraViteConfig.optimizeDeps = { - include: [ - ...extraSvelteConfig.optimizeDeps.include, - ...extraDepsConfig.optimizeDeps.include.filter( - (dep) => !isDepExcluded(dep, extraSvelteConfig.optimizeDeps.exclude) - ) - ], - exclude: [ - ...extraSvelteConfig.optimizeDeps.exclude, - ...extraDepsConfig.optimizeDeps.exclude.filter( - (dep) => !isDepIncluded(dep, extraSvelteConfig.optimizeDeps.include) - ) - ] - }; - - extraViteConfig.ssr = { - external: [ - ...extraSvelteConfig.ssr.external, - ...extraDepsConfig.ssr.external.filter( - (dep) => !isDepNoExternaled(dep, extraSvelteConfig.ssr.noExternal) - ) - ], - noExternal: [ - ...extraSvelteConfig.ssr.noExternal, - ...extraDepsConfig.ssr.noExternal.filter( - (dep) => !isDepExternaled(dep, extraSvelteConfig.ssr.external) - ) - ] - }; - - // handle prebundling for svelte files - if (options.prebundleSvelteLibraries) { - extraViteConfig.optimizeDeps = { - ...extraViteConfig.optimizeDeps, - // Experimental Vite API to allow these extensions to be scanned and prebundled - extensions: options.extensions ?? ['.svelte'], - // Add esbuild plugin to prebundle Svelte files. - // Currently a placeholder as more information is needed after Vite config is resolved, - // the real Svelte plugin is added in `patchResolvedViteConfig()` - esbuildOptions: { - plugins: [ - { name: facadeEsbuildSveltePluginName, setup: () => {} }, - { name: facadeEsbuildSvelteModulePluginName, setup: () => {} } - ] - } - }; - } - - // enable hmrPartialAccept if not explicitly disabled - if (config.experimental?.hmrPartialAccept !== false) { - log.debug('enabling "experimental.hmrPartialAccept" in vite config', undefined, 'config'); - extraViteConfig.experimental = { hmrPartialAccept: true }; - } - validateViteConfig(extraViteConfig, config, options); - return extraViteConfig; -} - -/** - * @param {Partial} extraViteConfig - * @param {import('vite').UserConfig} config - * @param {import('../types/options.d.ts').PreResolvedOptions} options - */ -function validateViteConfig(extraViteConfig, config, options) { - const { prebundleSvelteLibraries, isBuild } = options; - if (prebundleSvelteLibraries) { - /** @type {(option: 'dev' | 'build' | boolean)=> boolean} */ - const isEnabled = (option) => option !== true && option !== (isBuild ? 'build' : 'dev'); - /** @type {(name: string, value: 'dev' | 'build' | boolean, recommendation: string)=> void} */ - const logWarning = (name, value, recommendation) => - log.warn.once( - `Incompatible options: \`prebundleSvelteLibraries: true\` and vite \`${name}: ${JSON.stringify( - value - )}\` ${isBuild ? 'during build.' : '.'} ${recommendation}` - ); - const viteOptimizeDepsDisabled = config.optimizeDeps?.disabled ?? 'build'; // fall back to vite default - const isOptimizeDepsEnabled = isEnabled(viteOptimizeDepsDisabled); - if (!isBuild && !isOptimizeDepsEnabled) { - logWarning( - 'optimizeDeps.disabled', - viteOptimizeDepsDisabled, - 'Forcing `optimizeDeps.disabled: "build"`. Disable prebundleSvelteLibraries or update your vite config to enable optimizeDeps during dev.' - ); - if (!extraViteConfig.optimizeDeps) { - extraViteConfig.optimizeDeps = {}; - } - extraViteConfig.optimizeDeps.disabled = 'build'; - } else if (isBuild && isOptimizeDepsEnabled) { - logWarning( - 'optimizeDeps.disabled', - viteOptimizeDepsDisabled, - 'Disable optimizeDeps or prebundleSvelteLibraries for build if you experience errors.' - ); - } - } -} - -/** - * @param {import('../types/options.d.ts').PreResolvedOptions} options - * @param {import('vite').UserConfig} config - * @returns {Promise} - */ -async function buildExtraConfigForDependencies(options, config) { - // extra handling for svelte dependencies in the project - const packagesWithoutSvelteExportsCondition = new Set(); - const depsConfig = await crawlFrameworkPkgs({ - root: options.root, - isBuild: options.isBuild, - viteUserConfig: config, - isFrameworkPkgByJson(pkgJson) { - let hasSvelteCondition = false; - if (typeof pkgJson.exports === 'object') { - // use replacer as a simple way to iterate over nested keys - JSON.stringify(pkgJson.exports, (key, value) => { - if (SVELTE_EXPORT_CONDITIONS.includes(key)) { - hasSvelteCondition = true; - } - return value; - }); - } - const hasSvelteField = !!pkgJson.svelte; - if (hasSvelteField && !hasSvelteCondition) { - packagesWithoutSvelteExportsCondition.add(`${pkgJson.name}@${pkgJson.version}`); - } - return hasSvelteCondition || hasSvelteField; - }, - isSemiFrameworkPkgByJson(pkgJson) { - return !!pkgJson.dependencies?.svelte || !!pkgJson.peerDependencies?.svelte; - }, - isFrameworkPkgByName(pkgName) { - const isNotSveltePackage = isCommonDepWithoutSvelteField(pkgName); - if (isNotSveltePackage) { - return false; - } else { - return undefined; - } - } - }); - if ( - !options.experimental?.disableSvelteResolveWarnings && - packagesWithoutSvelteExportsCondition?.size > 0 - ) { - log.warn( - `WARNING: The following packages have a svelte field in their package.json but no exports condition for svelte.\n\n${[ - ...packagesWithoutSvelteExportsCondition - ].join('\n')}\n\nPlease see ${FAQ_LINK_MISSING_EXPORTS_CONDITION} for details.` - ); - } - log.debug('extra config for dependencies generated by vitefu', depsConfig, 'config'); - - if (options.prebundleSvelteLibraries) { - // prebundling enabled, so we don't need extra dependency excludes - depsConfig.optimizeDeps.exclude = []; - // but keep dependency reinclusions of explicit user excludes - const userExclude = config.optimizeDeps?.exclude; - depsConfig.optimizeDeps.include = !userExclude - ? [] - : depsConfig.optimizeDeps.include.filter((dep) => { - // reincludes look like this: foo > bar > baz - // in case foo or bar are excluded, we have to retain the reinclude even with prebundling - return ( - dep.includes('>') && - dep - .split('>') - .slice(0, -1) - .some((d) => isDepExcluded(d.trim(), userExclude)) - ); - }); - } - if (options.disableDependencyReinclusion === true) { - depsConfig.optimizeDeps.include = depsConfig.optimizeDeps.include.filter( - (dep) => !dep.includes('>') - ); - } else if (Array.isArray(options.disableDependencyReinclusion)) { - const disabledDeps = options.disableDependencyReinclusion; - depsConfig.optimizeDeps.include = depsConfig.optimizeDeps.include.filter((dep) => { - if (!dep.includes('>')) return true; - const trimDep = dep.replace(/\s+/g, ''); - return disabledDeps.some((disabled) => trimDep.includes(`${disabled}>`)); - }); - } - - log.debug('post-processed extra config for dependencies', depsConfig, 'config'); - - return depsConfig; -} - -/** - * @param {import('vite').UserConfig} config - * @returns {import('vite').UserConfig & { optimizeDeps: { include: string[], exclude:string[] }, ssr: { noExternal:(string|RegExp)[], external: string[] } } } - */ -function buildExtraConfigForSvelte(config) { - // include svelte imports for optimization unless explicitly excluded - /** @type {string[]} */ - const include = []; - /** @type {string[]} */ - const exclude = []; - if (!isDepExcluded('svelte', config.optimizeDeps?.exclude ?? [])) { - const svelteImportsToInclude = SVELTE_IMPORTS.filter( - (si) => !(si.endsWith('/server') || si.includes('/server/')) - ); - log.debug( - `adding bare svelte packages to optimizeDeps.include: ${svelteImportsToInclude.join(', ')} `, - undefined, - 'config' - ); - include.push(...svelteImportsToInclude); - } else { - log.debug( - '"svelte" is excluded in optimizeDeps.exclude, skipped adding it to include.', - undefined, - 'config' - ); - } - /** @type {(string | RegExp)[]} */ - const noExternal = []; - /** @type {string[]} */ - const external = []; - // add svelte to ssr.noExternal unless it is present in ssr.external - // so it is correctly resolving according to the conditions in sveltes exports map - if (!isDepExternaled('svelte', config.ssr?.external ?? [])) { - noExternal.push('svelte', /^svelte\//); - } - // esm-env needs to be bundled by default for the development/production condition - // be properly used by svelte - if (!isDepExternaled('esm-env', config.ssr?.external ?? [])) { - noExternal.push('esm-env'); - } - return { optimizeDeps: { include, exclude }, ssr: { noExternal, external } }; +export async function buildExtraFarmConfig() { + const extraFarmConfig = { + resolve: { + dedupe: [...SVELTE_IMPORTS], + mainFields: ["svelte"], + conditions: ["svelte"], + }, + }; + return { + compilation: { + ...extraFarmConfig, + }, + }; } /** @@ -585,27 +386,32 @@ function buildExtraConfigForSvelte(config) { * @param {import('../types/options.d.ts').ResolvedOptions} options */ export function patchResolvedViteConfig(viteConfig, options) { - if (options.preprocess) { - for (const preprocessor of arraify(options.preprocess)) { - if (preprocessor.style && '__resolvedConfig' in preprocessor.style) { - preprocessor.style.__resolvedConfig = viteConfig; - } - } - } - - // replace facade esbuild plugin with a real one - const facadeEsbuildSveltePlugin = viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( - (plugin) => plugin.name === facadeEsbuildSveltePluginName - ); - if (facadeEsbuildSveltePlugin) { - Object.assign(facadeEsbuildSveltePlugin, esbuildSveltePlugin(options)); - } - const facadeEsbuildSvelteModulePlugin = viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( - (plugin) => plugin.name === facadeEsbuildSvelteModulePluginName - ); - if (facadeEsbuildSvelteModulePlugin) { - Object.assign(facadeEsbuildSvelteModulePlugin, esbuildSvelteModulePlugin(options)); - } + if (options.preprocess) { + for (const preprocessor of arraify(options.preprocess)) { + if (preprocessor.style && "__resolvedConfig" in preprocessor.style) { + preprocessor.style.__resolvedConfig = viteConfig; + } + } + } + + // replace facade esbuild plugin with a real one + const facadeEsbuildSveltePlugin = + viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( + (plugin) => plugin.name === facadeEsbuildSveltePluginName + ); + if (facadeEsbuildSveltePlugin) { + Object.assign(facadeEsbuildSveltePlugin, esbuildSveltePlugin(options)); + } + const facadeEsbuildSvelteModulePlugin = + viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( + (plugin) => plugin.name === facadeEsbuildSvelteModulePluginName + ); + if (facadeEsbuildSvelteModulePlugin) { + Object.assign( + facadeEsbuildSvelteModulePlugin, + esbuildSvelteModulePlugin(options) + ); + } } /** @@ -615,15 +421,19 @@ export function patchResolvedViteConfig(viteConfig, options) { * @param {{ isSsrTargetWebworker?: boolean }} opts */ export function ensureConfigEnvironmentMainFields(name, config, opts) { - config.resolve ??= {}; - if (config.resolve.mainFields == null) { - if (config.consumer === 'client' || name === 'client' || opts.isSsrTargetWebworker) { - config.resolve.mainFields = [...defaultClientMainFields]; - } else { - config.resolve.mainFields = [...defaultServerMainFields]; - } - } - return true; + config.resolve ??= {}; + if (config.resolve.mainFields == null) { + if ( + config.consumer === "client" || + name === "client" || + opts.isSsrTargetWebworker + ) { + config.resolve.mainFields = [...defaultClientMainFields]; + } else { + config.resolve.mainFields = [...defaultServerMainFields]; + } + } + return true; } /** @@ -633,14 +443,18 @@ export function ensureConfigEnvironmentMainFields(name, config, opts) { * @param {{ isSsrTargetWebworker?: boolean }} opts */ export function ensureConfigEnvironmentConditions(name, config, opts) { - config.resolve ??= {}; - if (config.resolve.conditions == null) { - if (config.consumer === 'client' || name === 'client' || opts.isSsrTargetWebworker) { - config.resolve.conditions = [...defaultClientConditions]; - } else { - config.resolve.conditions = [...defaultServerConditions]; - } - } + config.resolve ??= {}; + if (config.resolve.conditions == null) { + if ( + config.consumer === "client" || + name === "client" || + opts.isSsrTargetWebworker + ) { + config.resolve.conditions = [...defaultClientConditions]; + } else { + config.resolve.conditions = [...defaultServerConditions]; + } + } } /** @@ -649,5 +463,5 @@ export function ensureConfigEnvironmentConditions(name, config, opts) { * @returns {T[]} */ function arraify(value) { - return Array.isArray(value) ? value : [value]; + return Array.isArray(value) ? value : [value]; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 265cf72..3a13476 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -34,7 +34,7 @@ importers: version: 1.0.4 '@farmfe/core': specifier: ^1.5.0 - version: 1.6.1 + version: 1.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@farmfe/js-plugin-babel': specifier: workspace:* version: link:../../js-plugins/babel @@ -81,7 +81,7 @@ importers: version: 1.0.4 '@farmfe/core': specifier: ^1.3.0 - version: 1.6.1 + version: 1.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@farmfe/plugin-mdx': specifier: workspace:* version: link:../../rust-plugins/mdx @@ -101,6 +101,36 @@ importers: specifier: ^0.14.0 version: 0.14.2 + examples/svelte: + devDependencies: + '@farmfe/cli': + specifier: /Users/adny/rust/farm/packages/cli + version: link:../../../farm/packages/cli + '@farmfe/core': + specifier: /Users/adny/rust/farm/packages/core + version: link:../../../farm/packages/core + '@farmfe/js-plugin-svelte': + specifier: workspace:* + version: link:../../js-plugins/svelte + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.3 + version: 5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)) + '@tsconfig/svelte': + specifier: ^5.0.4 + version: 5.0.4 + svelte: + specifier: ^5.15.0 + version: 5.19.6 + svelte-check: + specifier: ^4.1.1 + version: 4.1.4(svelte@5.19.6)(typescript@5.6.3) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + vite: + specifier: ^6.0.5 + version: 6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4) + js-plugins/babel: dependencies: '@babel/core': @@ -112,7 +142,7 @@ importers: version: 1.0.4 '@farmfe/core': specifier: ^1.6.0 - version: 1.6.1 + version: 1.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@farmfe/js-plugin-dts': specifier: ^0.6.4 version: 0.6.4 @@ -146,7 +176,7 @@ importers: version: 1.0.4 '@farmfe/core': specifier: ^1.3.23 - version: 1.6.1 + version: 1.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@farmfe/js-plugin-dts': specifier: ^0.6.4 version: 0.6.4 @@ -174,7 +204,7 @@ importers: version: 1.0.4 '@farmfe/core': specifier: ^1.6.0 - version: 1.6.1 + version: 1.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@farmfe/js-plugin-babel': specifier: workspace:* version: link:../babel @@ -191,11 +221,51 @@ importers: specifier: ^7.0.3 version: 7.0.3 + js-plugins/svelte: + dependencies: + debug: + specifier: ^4.4.0 + version: 4.4.0 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 + kleur: + specifier: ^4.1.5 + version: 4.1.5 + magic-string: + specifier: ^0.30.17 + version: 0.30.17 + vitefu: + specifier: ^1.0.5 + version: 1.0.5(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)) + devDependencies: + '@farmfe/cli': + specifier: /Users/adny/rust/farm/packages/cli + version: link:../../../farm/packages/cli + '@farmfe/core': + specifier: /Users/adny/rust/farm/packages/core + version: link:../../../farm/packages/core + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 + esbuild: + specifier: ^0.24.2 + version: 0.24.2 + sass: + specifier: ^1.83.4 + version: 1.83.4 + svelte: + specifier: ^5.19.0 + version: 5.19.6 + vite: + specifier: ^6.0.9 + version: 6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4) + rust-plugins/auto-import: devDependencies: '@farmfe/js-plugin-visualizer': specifier: latest - version: 1.1.4(monaco-editor@0.52.2)(vue@3.5.13) + version: 1.1.4(monaco-editor@0.52.2)(vue@3.5.13(typescript@5.7.2)) '@farmfe/plugin-tools': specifier: latest version: 0.1.1 @@ -260,603 +330,3080 @@ importers: packages: - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - dev: false - /@ant-design/colors@6.0.0: + '@ant-design/colors@6.0.0': resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} - dependencies: - '@ctrl/tinycolor': 3.6.1 - dev: true - /@ant-design/icons-svg@4.4.2: + '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} - dev: true - /@ant-design/icons-vue@7.0.1(vue@3.5.13): + '@ant-design/icons-vue@7.0.1': resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} peerDependencies: vue: '>=3.0.3' - dependencies: - '@ant-design/colors': 6.0.0 - '@ant-design/icons-svg': 4.4.2 - vue: 3.5.13(typescript@5.7.2) - dev: true - /@babel/code-frame@7.26.2: + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - /@babel/compat-data@7.26.3: + '@babel/compat-data@7.26.3': resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} - dev: false - /@babel/core@7.26.0: + '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/generator@7.26.3: + '@babel/generator@7.26.3': resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - dev: false - /@babel/helper-compilation-targets@7.25.9: + '@babel/helper-compilation-targets@7.25.9': resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.26.3 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.3 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false - /@babel/helper-module-imports@7.25.9: + '@babel/helper-module-imports@7.25.9': resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0): + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.4 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-plugin-utils@7.25.9: + '@babel/helper-plugin-utils@7.25.9': resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-string-parser@7.25.9: + '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.25.9: + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.25.9: + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helpers@7.26.0: + '@babel/helpers@7.26.0': resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 - dev: false - /@babel/parser@7.26.3: + '@babel/parser@7.26.3': resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.26.3 - /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0): + '@babel/plugin-syntax-jsx@7.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - dev: false - /@babel/runtime@7.26.0: + '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - /@babel/template@7.25.9: + '@babel/template@7.25.9': resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 - dev: false - /@babel/traverse@7.26.4: + '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/types@7.26.3: + '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - /@changesets/apply-release-plan@7.0.7: + '@changesets/apply-release-plan@7.0.7': resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} - dependencies: - '@changesets/config': 3.0.5 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.6.3 - /@changesets/assemble-release-plan@6.0.5: + '@changesets/assemble-release-plan@6.0.5': resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.6.3 - /@changesets/changelog-git@0.2.0: + '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - dependencies: - '@changesets/types': 6.0.0 - /@changesets/cli@2.27.11: + '@changesets/cli@2.27.11': resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} hasBin: true - dependencies: - '@changesets/apply-release-plan': 7.0.7 - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.5 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.6 - '@changesets/git': 3.0.2 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.8 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.6.3 - spawndamnit: 3.0.1 - term-size: 2.2.1 - /@changesets/config@3.0.5: + '@changesets/config@3.0.5': resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 - /@changesets/errors@0.2.0: + '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - dependencies: - extendable-error: 0.1.7 - /@changesets/get-dependents-graph@2.1.2: + '@changesets/get-dependents-graph@2.1.2': resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.6.3 - /@changesets/get-release-plan@4.0.6: + '@changesets/get-release-plan@4.0.6': resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} - dependencies: - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/config': 3.0.5 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - /@changesets/get-version-range-type@0.4.0: + '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - /@changesets/git@3.0.2: + '@changesets/git@3.0.2': resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} - dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 - /@changesets/logger@0.1.1: + '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - dependencies: - picocolors: 1.1.1 - /@changesets/parse@0.4.0: + '@changesets/parse@0.4.0': resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 - /@changesets/pre@2.0.1: + '@changesets/pre@2.0.1': resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - /@changesets/read@0.6.2: + '@changesets/read@0.6.2': resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} - dependencies: - '@changesets/git': 3.0.2 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 - /@changesets/should-skip-package@0.1.1: + '@changesets/should-skip-package@0.1.1': resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - /@changesets/types@4.1.0: + '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - /@changesets/types@6.0.0: + '@changesets/types@6.0.0': resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - /@changesets/write@0.3.2: + '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} - dependencies: - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - /@commitlint/cli@19.6.1(@types/node@22.10.2)(typescript@5.7.2): + '@commitlint/cli@19.6.1': resolution: {integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==} engines: {node: '>=v18'} hasBin: true - dependencies: - '@commitlint/format': 19.5.0 - '@commitlint/lint': 19.6.0 - '@commitlint/load': 19.6.1(@types/node@22.10.2)(typescript@5.7.2) - '@commitlint/read': 19.5.0 - '@commitlint/types': 19.5.0 - tinyexec: 0.3.1 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true - /@commitlint/config-validator@19.5.0: + '@commitlint/config-validator@19.5.0': resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.5.0 - ajv: 8.17.1 - dev: true - /@commitlint/ensure@19.5.0: + '@commitlint/ensure@19.5.0': resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.5.0 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - dev: true - /@commitlint/execute-rule@19.5.0: + '@commitlint/execute-rule@19.5.0': resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} engines: {node: '>=v18'} - dev: true - /@commitlint/format@19.5.0: + '@commitlint/format@19.5.0': resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.5.0 - chalk: 5.4.1 - dev: true - /@commitlint/is-ignored@19.6.0: + '@commitlint/is-ignored@19.6.0': resolution: {integrity: sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.5.0 - semver: 7.6.3 - dev: true - /@commitlint/lint@19.6.0: + '@commitlint/lint@19.6.0': resolution: {integrity: sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg==} engines: {node: '>=v18'} - dependencies: - '@commitlint/is-ignored': 19.6.0 - '@commitlint/parse': 19.5.0 - '@commitlint/rules': 19.6.0 - '@commitlint/types': 19.5.0 - dev: true - /@commitlint/load@19.6.1(@types/node@22.10.2)(typescript@5.7.2): + '@commitlint/load@19.6.1': resolution: {integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==} engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 19.5.0 - '@commitlint/execute-rule': 19.5.0 - '@commitlint/resolve-extends': 19.5.0 - '@commitlint/types': 19.5.0 - chalk: 5.4.1 - cosmiconfig: 9.0.0(typescript@5.7.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@22.10.2)(cosmiconfig@9.0.0)(typescript@5.7.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - dev: true - /@commitlint/message@19.5.0: + '@commitlint/message@19.5.0': resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} engines: {node: '>=v18'} - dev: true - /@commitlint/parse@19.5.0: + '@commitlint/parse@19.5.0': resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 19.5.0 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 - dev: true - /@commitlint/read@19.5.0: + '@commitlint/read@19.5.0': resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} engines: {node: '>=v18'} - dependencies: - '@commitlint/top-level': 19.5.0 - '@commitlint/types': 19.5.0 - git-raw-commits: 4.0.0 - minimist: 1.2.8 - tinyexec: 0.3.1 - dev: true - /@commitlint/resolve-extends@19.5.0: + '@commitlint/resolve-extends@19.5.0': resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} engines: {node: '>=v18'} - dependencies: + + '@commitlint/rules@19.6.0': + resolution: {integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} + + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@farmfe/cli@1.0.4': + resolution: {integrity: sha512-bau/2P7DylHUDksUvbvJod/Ew4dl5ZICYVgTNn0EfrJM/ZuwLaV8LjmPo0pM4y1QOZmg/N3B9DwkXO89DrutYQ==} + engines: {node: '>= 16'} + hasBin: true + + '@farmfe/core-darwin-arm64@1.6.1': + resolution: {integrity: sha512-Ig65wjNc2b5YCaZdnk82TRdpmEH6BxkZfg0DqUqwQtrXVe0iAvMpzmiUSHTHyyFBZcXukrRJ3SBsYLqGxPxn8g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@farmfe/core-darwin-x64@1.6.1': + resolution: {integrity: sha512-I+WlwA/o6szoH+JcKrsrQ+a+BxHD3UYAs5AuYMhI2J4bVj8MyF+RAPAMtWZ7eSw3Wl+YDIAFSrWE6FWllGkkuA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@farmfe/core-linux-arm64-gnu@1.6.1': + resolution: {integrity: sha512-Rwo+EFxgZXJFLZ9eo9HiZK6cdFTPfDAjppXGSTA48W/ZpBnWyDgvH8UZ5TrkM+n/gcSPkURJLeCK/ZZXZvgiSg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@farmfe/core-linux-arm64-musl@1.6.1': + resolution: {integrity: sha512-tIALIHbkeapZ8CuWEMQKTspOWX7Cg6LyUC1Hx2QTMl8dX6JbztROilaBgKoNTrjiHPse3viXP6y7s2VNTndPNw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@farmfe/core-linux-x64-gnu@1.6.1': + resolution: {integrity: sha512-ulK7KAsmc0W3dHfJLR9WGqipqQsN3HET86OdlTsBjZeZGn/5Mv5iT6Z0jV6dCO22T9d7DCB/0im+GQpBwAQCog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@farmfe/core-linux-x64-musl@1.6.1': + resolution: {integrity: sha512-AjgNsHhDTn4nlejV0jyPGVbo2RSnK631SNxBhvRt9vCc6sd4xkSUXNlZpzxEAj+DY/0t3cLN8lIv4988n2FLEg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@farmfe/core-win32-arm64-msvc@1.6.1': + resolution: {integrity: sha512-EYOe/adT64byExfupKVXF8OK7jzMTvGixVGVkrlnqFajNLupwLp6l8GjG+MSG/tHyb3oX3K9LUEC07TmXPYy3g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@farmfe/core-win32-ia32-msvc@1.6.1': + resolution: {integrity: sha512-RYvoHDu8i38d5NOATvHgPUFd0mQUqj165bozumV0sVwWQRZOMiAJLjCCZFvv6XS7s2nL/V8hAJ+2eqDuUO/jqA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@farmfe/core-win32-x64-msvc@1.6.1': + resolution: {integrity: sha512-FreMGOZ2LFCX75uZESGfCkPiecVAplFKaV5vYR3sW+k+/FPGWwO5hwRCpFfVWbzqoeO1PLp1jL3jYo/OvYhxpw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@farmfe/core@1.6.1': + resolution: {integrity: sha512-X4F5AvfWcb/hKcgG6MQO7hXyLuhOhrxh5yGHDCxBu1s/1U102+23gnPilbY3TNOz45gjCOezjdRukSIfEIxR9Q==} + engines: {node: '>=16.15.1'} + + '@farmfe/js-plugin-dts@0.6.4': + resolution: {integrity: sha512-5xhjtbY1gEs6IdjBrgNcsYaJPFHxu9F9Ab5PKllaCqlg6e0gf/Jy0AshNBasOT3Uzmma6/5cX56i35vwL3U8sw==} + + '@farmfe/js-plugin-visualizer@1.1.4': + resolution: {integrity: sha512-OgVILggB2haeKLpnxaL8jowDLedmO7KPjrFYIAqgqTozV2Pf5FPy/+ywc4Pew85+wFTBxU+e+wFkCv9jKszHRA==} + + '@farmfe/plugin-react-darwin-arm64@1.2.6': + resolution: {integrity: sha512-LcIZs2dIZWXEp05wnBmCxYMeXAu66tJSyWamdSDengbyzgvIrD0Ap1+QIDlluEnz7XOFxSH3jJZuuZP8h8qNfA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@farmfe/plugin-react-darwin-x64@1.2.6': + resolution: {integrity: sha512-E2HarfTjYIgZO454YGqnu84kOefddRyKqLtEMkG6j7Sij+uP1uEgi5mjWIwsJY9TWv5DYbx1FPmiLigC5IKP9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@farmfe/plugin-react-linux-arm64-gnu@1.2.6': + resolution: {integrity: sha512-VK+4AtqUcAKQvAmUgWnQK3M2bXQaptMyGN/28xo/wuUjz88wso27ay5bfPxEfDHeorRwcSq5l4Gf4rQFRGc+Wg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@farmfe/plugin-react-linux-arm64-musl@1.2.6': + resolution: {integrity: sha512-e1OFg8d1VnEGcg08ewTxJVbv6ie1e8U8fUSABbEUePKzeom8cfC9P4jadACw08M2Ls4YnOlLPFLTSlVCg9Xhew==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@farmfe/plugin-react-linux-x64-gnu@1.2.6': + resolution: {integrity: sha512-0WFKSkPv/NK7A/czyluS0V+h/qxIb6jILUh82RyOfVjCit0WGPDVN/IH/ZIp2qMGdjtP9er8u4yt4zNGKrHZNQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@farmfe/plugin-react-linux-x64-musl@1.2.6': + resolution: {integrity: sha512-X386lU5+4ELeaIS3c2xgB4cUjry12HUF3/lJWje2hV0SvGHwErkM07HhjbQd/XsJyg6dP8YnAn3RkuYFiwoTog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@farmfe/plugin-react-win32-arm64-msvc@1.2.6': + resolution: {integrity: sha512-Ufr59JWTYv5Yq/FBBnCWtX136sVilqYDX4CfpBDEUxSEqFgaXGyslme1qDmh1248bscqbbvYI4zbn7ECV209ow==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@farmfe/plugin-react-win32-ia32-msvc@1.2.6': + resolution: {integrity: sha512-qzbeV639ywoGBGUAboi31+9vzpmS+llvRcxdpkKVTVrDQ7Wb0SO1Dmd7g2gItip6jAj8md+5sL9WudYJ/EOA5g==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@farmfe/plugin-react-win32-x64-msvc@1.2.6': + resolution: {integrity: sha512-Og2yvMOpR2VSLgUEthhJ1W0kM4FQjupHN+gPMr97KyoM+dh6xYwnbZ0Cs9JnNIqQFPlYiPuq9EzLPVffxX8xHg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@farmfe/plugin-react@1.2.6': + resolution: {integrity: sha512-AVXMnqwekp+Cke6a16/xWnviUnQiFeY1FhxkTGJVamHQFgGmm+uAhPXJ85sQDQLAwtkAMd8rimEhNFVeHIKkaw==} + + '@farmfe/plugin-tools@0.1.1': + resolution: {integrity: sha512-7ox1VgCI5AWFrIUQVLEYGdqCSGNBJYRC0Yhu5sK0a/sR/OSaZa97MdiKA80LkM6UgK+dDFy49rPre10U/M7yww==} + hasBin: true + + '@farmfe/runtime-plugin-hmr@3.5.10': + resolution: {integrity: sha512-ZFwAGDJ1sNuwX77ADdPSO+PoMImrGl0k+nvW/TnzOy72k8JxC8OwaeOiuPgNkYxDGldp55l9mPE9NvcoxR8uzQ==} + + '@farmfe/runtime-plugin-import-meta@0.2.3': + resolution: {integrity: sha512-BEHPjfXj/DXpwKxyM4rMqT9NFRfivTGS+b02uchjV9MSTi8mZqm3QhtJ+znlpgHUBABBtZYKdayQEDhyK4izYw==} + + '@farmfe/runtime@0.12.10': + resolution: {integrity: sha512-2/jebNFaVC+yctEeFZrmbfjaKJOg2Ib9iJ8ypjcUnnETfR4zbZnYuErfIO1Af44anvpONwWDhQ8RVcmy+WyY5w==} + + '@farmfe/utils@0.0.1': + resolution: {integrity: sha512-QLbgNrojcvxfumXA/H329XAXhoCahmeSH3JmaiwwJEGS2QAmWfgAJMegjwlt6OmArGVO4gSbJ7Xbmm1idZZs+g==} + + '@farmfe/utils@0.1.0': + resolution: {integrity: sha512-neNJQGqV7XL4XifG1uHOBFSFLy2yx1/DVZNRA7nfeEAXEksVZTwWA+fZrYEaI0w7Sw6K/9NYn9Jgpn+NAT0mcg==} + + '@guolao/vue-monaco-editor@1.5.4': + resolution: {integrity: sha512-eyBAqxJeDpV4mZYZSpNvh3xUgKCld5eEe0dBtjJhsy2+L0MB6PYFZ/FbPHNwskgp2RoIpfn1DLrIhXXE3lVbwQ==} + peerDependencies: + '@vue/composition-api': ^1.7.1 + monaco-editor: '>=0.43.0' + vue: ^2.6.14 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@koa/cors@5.0.0': + resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} + engines: {node: '>= 14.0.0'} + + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@mdn/browser-compat-data@5.6.26': + resolution: {integrity: sha512-7NdgdOR7lkzrN70zGSULmrcvKyi/aJjpTJRCbuy8IZuHiLkPTvsr10jW0MJgWzK2l2wTmhdQvegTw6yNU5AVNQ==} + + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' + + '@napi-rs/cli@2.18.4': + resolution: {integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==} + engines: {node: '>= 10'} + hasBin: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@rollup/rollup-android-arm-eabi@4.32.1': + resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.32.1': + resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.32.1': + resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.32.1': + resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.32.1': + resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.32.1': + resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.32.1': + resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.32.1': + resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.32.1': + resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.32.1': + resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.32.1': + resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.32.1': + resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.32.1': + resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.32.1': + resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.32.1': + resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} + cpu: [x64] + os: [win32] + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@ts-morph/common@0.24.0': + resolution: {integrity: sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==} + + '@tsconfig/svelte@5.0.4': + resolution: {integrity: sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@22.10.2': + resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + + '@types/object-path@0.11.4': + resolution: {integrity: sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==} + + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react-dom@19.0.2': + resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@18.3.18': + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + + '@types/react@19.0.1': + resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/ua-parser-js@0.7.39': + resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} + + '@types/ws@8.5.13': + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: + resolution: {integrity: sha512-nnkrHpeDKM8A5laq9tmFvvGbbDQ7laGfQLp50cvCkCXmWrPcZdCtaQpNh8UJS/yLREJnv2R4JDL5ADfxyAn+yQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commitlint@19.6.1: + resolution: {integrity: sha512-tU4or+Y2fDXepCZ44o8guEB9uwrRp4if4VupGH1CR+bsVS2zX6Gia4dndA7UPx8cWWw1tvRRJu5keA7RqfXf3w==} + engines: {node: '>=v18'} + hasBin: true + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + core-js@3.39.0: + resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} + + cosmiconfig-typescript-loader@6.1.0: + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrap@1.4.3: + resolution: {integrity: sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + farm-browserslist-generator@1.0.5: + resolution: {integrity: sha512-igffWSQATGV2ZJEvDBIB9Q2QfVOr+vv/JTZaaNoYfW/nrCGZ58zyJ0kSkFQEvptGUWf6idECqj82ykli4Ueplw==} + engines: {node: '>=16.15.1', npm: '>=7.0.0', pnpm: '>=3.2.0', yarn: '>=1.13'} + + farm-plugin-replace-dirname-darwin-arm64@0.2.1: + resolution: {integrity: sha512-9FThv/qoFuj3cJjv9P6YnXbBwPQ5TwGjnr50ejXdZn13Ehz0+7w7EscbRsZHNvT7p24p6i0Y9NUSallcWc2syw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + farm-plugin-replace-dirname-darwin-x64@0.2.1: + resolution: {integrity: sha512-Msqrh8mAPBbEpANpa0z9uQBr1/MO+PaHgBxym/aNs1vpxB4KAs6JQWYKtO+Ob7JzFyV6d9lIRhpnpxzxTqSIfA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + farm-plugin-replace-dirname-linux-arm64-gnu@0.2.1: + resolution: {integrity: sha512-ZKuxGu9G01CW521uTQHh+IP8pcT/NolGQfcQuEmBpD8epJ8per8Ps52fS05u5TGniaOg+ySZpt7HxbX+++k1YQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + farm-plugin-replace-dirname-linux-arm64-musl@0.2.1: + resolution: {integrity: sha512-m3gH8ggczbRYTHZSNp3LjIQIcqhvDO4O78bxXc8O1ozKD8M47/YfQLyQV06M7H4rZ8s6XV3Bb1kAcRAASp3M5A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + farm-plugin-replace-dirname-linux-x64-gnu@0.2.1: + resolution: {integrity: sha512-MehKkoM2RFw3sCnEu9nCbXKjxtC3hfTad0h/dC+Z8iEBcLEReVLoNzHWWUa6BxkxqDtB82/BWO/ObSUj/VUnwQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + farm-plugin-replace-dirname-linux-x64-musl@0.2.1: + resolution: {integrity: sha512-o1qPZi16N/sHOteZYJVv6UmZFK3QKpVQrywk/4spJI0mPH9A9Y+G6iBE2Tqjb3d+1Hb6phr++EBJHZ2x1ajtGQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + farm-plugin-replace-dirname-win32-arm64-msvc@0.2.1: + resolution: {integrity: sha512-Xn/wYFkgb7SsTlSaefFtvxNbXEVdvZB854b/rBZu47+MRQpSnBIPwnTGcqo8eNTMjtnY4beGGtcd78iqMVAHFQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + farm-plugin-replace-dirname-win32-ia32-msvc@0.2.1: + resolution: {integrity: sha512-YtIu5CS/BSgbQZb1qjaBg0cEKvB4vCIbBxNn64H468zwliPbE93SAIyiwu6cL3la59cjBP4sEbz4ZAWyY9GoMQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + farm-plugin-replace-dirname-win32-x64-msvc@0.2.1: + resolution: {integrity: sha512-KUAf4rcv3Nz+CpGs4zr+ZRu4hWRp7SHQBgpX+mb0hhMjRvn+LoWm2qCL2q9Gp3jsTDVmzjPbyZxp/9UJKx13lQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + farm-plugin-replace-dirname@0.2.1: + resolution: {integrity: sha512-aJ4euQzxoq0sVu4AwXrNQflHJrSZdrdApGEyVRtN6KiCop3CHXnTg9ydlyCNXN2unQB283aNjojvCd5E/32KgA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + git-cz@4.9.0: + resolution: {integrity: sha512-cSRL8IIOXU7UFLdbziCYqg8f8InwLwqHezkiRHNSph7oZqGv0togId1kMTfKil6gzK0VaSXeVBb4oDl0fQCHiw==} + hasBin: true + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + http-proxy-middleware@3.0.3: + resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@5.0.3: + resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isbot@3.8.0: + resolution: {integrity: sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==} + engines: {node: '>=12'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-compress@5.1.1: + resolution: {integrity: sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg==} + engines: {node: '>= 12'} + + koa-connect@2.1.0: + resolution: {integrity: sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa-is-json@1.0.0: + resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==} + + koa-send@5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + + koa-static@5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + + koa@2.15.3: + resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-path@0.11.8: + resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} + engines: {node: '>= 10.12.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.8: + resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + peerDependencies: + react: ^19.0.0 + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.32.1: + resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.83.4: + resolution: {integrity: sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==} + engines: {node: '>=14.0.0'} + hasBin: true + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svelte-check@4.1.4: + resolution: {integrity: sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte@5.19.6: + resolution: {integrity: sha512-6ydekB3qyqUal+UhfMjmVOjRGtxysR8vuiMhi2nwuBtPJWnctVlsGspjVFB05qmR+TXI1emuqtZt81c0XiFleA==} + engines: {node: '>=18'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + ts-morph@23.0.0: + resolution: {integrity: sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + hasBin: true + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + utf-8-validate@6.0.5: + resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@6.0.11: + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.0.5: + resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + walkdir@0.4.1: + resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==} + engines: {node: '>=6.0.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod-validation-error@1.5.0: + resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} + engines: {node: '>=16.0.0'} + peerDependencies: + zod: ^3.18.0 + + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@ant-design/colors@6.0.0': + dependencies: + '@ctrl/tinycolor': 3.6.1 + + '@ant-design/icons-svg@4.4.2': {} + + '@ant-design/icons-vue@7.0.1(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.4.2 + vue: 3.5.13(typescript@5.7.2) + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.3': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@changesets/apply-release-plan@7.0.7': + dependencies: + '@changesets/config': 3.0.5 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.3 + + '@changesets/assemble-release-plan@6.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.3 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.11': + dependencies: + '@changesets/apply-release-plan': 7.0.7 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.5 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.8 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.6.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.6.3 + + '@changesets/get-release-plan@4.0.6': + dependencies: + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.2': + dependencies: + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@commitlint/cli@19.6.1(@types/node@22.10.2)(typescript@5.7.2)': + dependencies: + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.6.0 + '@commitlint/load': 19.6.1(@types/node@22.10.2)(typescript@5.7.2) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-validator@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + ajv: 8.17.1 + + '@commitlint/ensure@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.5.0': {} + + '@commitlint/format@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + + '@commitlint/is-ignored@19.6.0': + dependencies: + '@commitlint/types': 19.5.0 + semver: 7.6.3 + + '@commitlint/lint@19.6.0': + dependencies: + '@commitlint/is-ignored': 19.6.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.6.0 + '@commitlint/types': 19.5.0 + + '@commitlint/load@19.6.1(@types/node@22.10.2)(typescript@5.7.2)': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + cosmiconfig: 9.0.0(typescript@5.7.2) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.10.2)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.5.0': {} + + '@commitlint/parse@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.5.0': + dependencies: + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.1 + + '@commitlint/resolve-extends@19.5.0': + dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/types': 19.5.0 global-directory: 4.0.1 import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - dev: true - /@commitlint/rules@19.6.0: - resolution: {integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==} - engines: {node: '>=v18'} + '@commitlint/rules@19.6.0': dependencies: '@commitlint/ensure': 19.5.0 '@commitlint/message': 19.5.0 '@commitlint/to-lines': 19.5.0 '@commitlint/types': 19.5.0 - dev: true - /@commitlint/to-lines@19.5.0: - resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} - engines: {node: '>=v18'} - dev: true + '@commitlint/to-lines@19.5.0': {} - /@commitlint/top-level@19.5.0: - resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} - engines: {node: '>=v18'} + '@commitlint/top-level@19.5.0': dependencies: find-up: 7.0.0 - dev: true - /@commitlint/types@19.5.0: - resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} - engines: {node: '>=v18'} + '@commitlint/types@19.5.0': dependencies: '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 - dev: true - /@ctrl/tinycolor@3.6.1: - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} - dev: true + '@ctrl/tinycolor@3.6.1': {} - /@farmfe/cli@1.0.4: - resolution: {integrity: sha512-bau/2P7DylHUDksUvbvJod/Ew4dl5ZICYVgTNn0EfrJM/ZuwLaV8LjmPo0pM4y1QOZmg/N3B9DwkXO89DrutYQ==} - engines: {node: '>= 16'} - hasBin: true + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@farmfe/cli@1.0.4': dependencies: cac: 6.7.14 cross-spawn: 7.0.6 inquirer: 9.2.12 walkdir: 0.4.1 - /@farmfe/core-darwin-arm64@1.6.1: - resolution: {integrity: sha512-Ig65wjNc2b5YCaZdnk82TRdpmEH6BxkZfg0DqUqwQtrXVe0iAvMpzmiUSHTHyyFBZcXukrRJ3SBsYLqGxPxn8g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + '@farmfe/core-darwin-arm64@1.6.1': optional: true - /@farmfe/core-darwin-x64@1.6.1: - resolution: {integrity: sha512-I+WlwA/o6szoH+JcKrsrQ+a+BxHD3UYAs5AuYMhI2J4bVj8MyF+RAPAMtWZ7eSw3Wl+YDIAFSrWE6FWllGkkuA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true + '@farmfe/core-darwin-x64@1.6.1': optional: true - /@farmfe/core-linux-arm64-gnu@1.6.1: - resolution: {integrity: sha512-Rwo+EFxgZXJFLZ9eo9HiZK6cdFTPfDAjppXGSTA48W/ZpBnWyDgvH8UZ5TrkM+n/gcSPkURJLeCK/ZZXZvgiSg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@farmfe/core-linux-arm64-gnu@1.6.1': optional: true - /@farmfe/core-linux-arm64-musl@1.6.1: - resolution: {integrity: sha512-tIALIHbkeapZ8CuWEMQKTspOWX7Cg6LyUC1Hx2QTMl8dX6JbztROilaBgKoNTrjiHPse3viXP6y7s2VNTndPNw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true + '@farmfe/core-linux-arm64-musl@1.6.1': optional: true - /@farmfe/core-linux-x64-gnu@1.6.1: - resolution: {integrity: sha512-ulK7KAsmc0W3dHfJLR9WGqipqQsN3HET86OdlTsBjZeZGn/5Mv5iT6Z0jV6dCO22T9d7DCB/0im+GQpBwAQCog==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - requiresBuild: true + '@farmfe/core-linux-x64-gnu@1.6.1': optional: true - /@farmfe/core-linux-x64-musl@1.6.1: - resolution: {integrity: sha512-AjgNsHhDTn4nlejV0jyPGVbo2RSnK631SNxBhvRt9vCc6sd4xkSUXNlZpzxEAj+DY/0t3cLN8lIv4988n2FLEg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [musl] - requiresBuild: true + '@farmfe/core-linux-x64-musl@1.6.1': optional: true - /@farmfe/core-win32-arm64-msvc@1.6.1: - resolution: {integrity: sha512-EYOe/adT64byExfupKVXF8OK7jzMTvGixVGVkrlnqFajNLupwLp6l8GjG+MSG/tHyb3oX3K9LUEC07TmXPYy3g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true + '@farmfe/core-win32-arm64-msvc@1.6.1': optional: true - /@farmfe/core-win32-ia32-msvc@1.6.1: - resolution: {integrity: sha512-RYvoHDu8i38d5NOATvHgPUFd0mQUqj165bozumV0sVwWQRZOMiAJLjCCZFvv6XS7s2nL/V8hAJ+2eqDuUO/jqA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true + '@farmfe/core-win32-ia32-msvc@1.6.1': optional: true - /@farmfe/core-win32-x64-msvc@1.6.1: - resolution: {integrity: sha512-FreMGOZ2LFCX75uZESGfCkPiecVAplFKaV5vYR3sW+k+/FPGWwO5hwRCpFfVWbzqoeO1PLp1jL3jYo/OvYhxpw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true + '@farmfe/core-win32-x64-msvc@1.6.1': optional: true - /@farmfe/core@1.6.1: - resolution: {integrity: sha512-X4F5AvfWcb/hKcgG6MQO7hXyLuhOhrxh5yGHDCxBu1s/1U102+23gnPilbY3TNOz45gjCOezjdRukSIfEIxR9Q==} - engines: {node: '>=16.15.1'} + '@farmfe/core@1.6.1(bufferutil@4.0.8)(utf-8-validate@6.0.5)': dependencies: '@farmfe/runtime': 0.12.10 '@farmfe/runtime-plugin-hmr': 3.5.10 @@ -900,21 +3447,18 @@ packages: - supports-color - utf-8-validate - /@farmfe/js-plugin-dts@0.6.4: - resolution: {integrity: sha512-5xhjtbY1gEs6IdjBrgNcsYaJPFHxu9F9Ab5PKllaCqlg6e0gf/Jy0AshNBasOT3Uzmma6/5cX56i35vwL3U8sw==} + '@farmfe/js-plugin-dts@0.6.4': dependencies: chalk: 5.4.1 fast-glob: 3.3.2 fs-extra: 11.2.0 ts-morph: 23.0.0 - typescript: 5.7.2 - dev: true + typescript: 5.6.3 - /@farmfe/js-plugin-visualizer@1.1.4(monaco-editor@0.52.2)(vue@3.5.13): - resolution: {integrity: sha512-OgVILggB2haeKLpnxaL8jowDLedmO7KPjrFYIAqgqTozV2Pf5FPy/+ywc4Pew85+wFTBxU+e+wFkCv9jKszHRA==} + '@farmfe/js-plugin-visualizer@1.1.4(monaco-editor@0.52.2)(vue@3.5.13(typescript@5.7.2))': dependencies: - '@ant-design/icons-vue': 7.0.1(vue@3.5.13) - '@guolao/vue-monaco-editor': 1.5.4(monaco-editor@0.52.2)(vue@3.5.13) + '@ant-design/icons-vue': 7.0.1(vue@3.5.13(typescript@5.7.2)) + '@guolao/vue-monaco-editor': 1.5.4(monaco-editor@0.52.2)(vue@3.5.13(typescript@5.7.2)) '@types/ws': 8.5.13 axios: 1.7.9 bufferutil: 4.0.8 @@ -928,94 +3472,35 @@ packages: - debug - monaco-editor - vue - dev: true - /@farmfe/plugin-react-darwin-arm64@1.2.6: - resolution: {integrity: sha512-LcIZs2dIZWXEp05wnBmCxYMeXAu66tJSyWamdSDengbyzgvIrD0Ap1+QIDlluEnz7XOFxSH3jJZuuZP8h8qNfA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@farmfe/plugin-react-darwin-arm64@1.2.6': optional: true - /@farmfe/plugin-react-darwin-x64@1.2.6: - resolution: {integrity: sha512-E2HarfTjYIgZO454YGqnu84kOefddRyKqLtEMkG6j7Sij+uP1uEgi5mjWIwsJY9TWv5DYbx1FPmiLigC5IKP9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@farmfe/plugin-react-darwin-x64@1.2.6': optional: true - /@farmfe/plugin-react-linux-arm64-gnu@1.2.6: - resolution: {integrity: sha512-VK+4AtqUcAKQvAmUgWnQK3M2bXQaptMyGN/28xo/wuUjz88wso27ay5bfPxEfDHeorRwcSq5l4Gf4rQFRGc+Wg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true + '@farmfe/plugin-react-linux-arm64-gnu@1.2.6': optional: true - /@farmfe/plugin-react-linux-arm64-musl@1.2.6: - resolution: {integrity: sha512-e1OFg8d1VnEGcg08ewTxJVbv6ie1e8U8fUSABbEUePKzeom8cfC9P4jadACw08M2Ls4YnOlLPFLTSlVCg9Xhew==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true + '@farmfe/plugin-react-linux-arm64-musl@1.2.6': optional: true - /@farmfe/plugin-react-linux-x64-gnu@1.2.6: - resolution: {integrity: sha512-0WFKSkPv/NK7A/czyluS0V+h/qxIb6jILUh82RyOfVjCit0WGPDVN/IH/ZIp2qMGdjtP9er8u4yt4zNGKrHZNQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - requiresBuild: true - dev: true + '@farmfe/plugin-react-linux-x64-gnu@1.2.6': optional: true - /@farmfe/plugin-react-linux-x64-musl@1.2.6: - resolution: {integrity: sha512-X386lU5+4ELeaIS3c2xgB4cUjry12HUF3/lJWje2hV0SvGHwErkM07HhjbQd/XsJyg6dP8YnAn3RkuYFiwoTog==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@farmfe/plugin-react-linux-x64-musl@1.2.6': optional: true - /@farmfe/plugin-react-win32-arm64-msvc@1.2.6: - resolution: {integrity: sha512-Ufr59JWTYv5Yq/FBBnCWtX136sVilqYDX4CfpBDEUxSEqFgaXGyslme1qDmh1248bscqbbvYI4zbn7ECV209ow==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@farmfe/plugin-react-win32-arm64-msvc@1.2.6': optional: true - /@farmfe/plugin-react-win32-ia32-msvc@1.2.6: - resolution: {integrity: sha512-qzbeV639ywoGBGUAboi31+9vzpmS+llvRcxdpkKVTVrDQ7Wb0SO1Dmd7g2gItip6jAj8md+5sL9WudYJ/EOA5g==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@farmfe/plugin-react-win32-ia32-msvc@1.2.6': optional: true - /@farmfe/plugin-react-win32-x64-msvc@1.2.6: - resolution: {integrity: sha512-Og2yvMOpR2VSLgUEthhJ1W0kM4FQjupHN+gPMr97KyoM+dh6xYwnbZ0Cs9JnNIqQFPlYiPuq9EzLPVffxX8xHg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@farmfe/plugin-react-win32-x64-msvc@1.2.6': optional: true - /@farmfe/plugin-react@1.2.6: - resolution: {integrity: sha512-AVXMnqwekp+Cke6a16/xWnviUnQiFeY1FhxkTGJVamHQFgGmm+uAhPXJ85sQDQLAwtkAMd8rimEhNFVeHIKkaw==} + '@farmfe/plugin-react@1.2.6': optionalDependencies: '@farmfe/plugin-react-darwin-arm64': 1.2.6 '@farmfe/plugin-react-darwin-x64': 1.2.6 @@ -1026,105 +3511,69 @@ packages: '@farmfe/plugin-react-win32-arm64-msvc': 1.2.6 '@farmfe/plugin-react-win32-ia32-msvc': 1.2.6 '@farmfe/plugin-react-win32-x64-msvc': 1.2.6 - dev: true - /@farmfe/plugin-tools@0.1.1: - resolution: {integrity: sha512-7ox1VgCI5AWFrIUQVLEYGdqCSGNBJYRC0Yhu5sK0a/sR/OSaZa97MdiKA80LkM6UgK+dDFy49rPre10U/M7yww==} - hasBin: true + '@farmfe/plugin-tools@0.1.1': dependencies: '@farmfe/utils': 0.1.0 '@napi-rs/cli': 2.18.4 cac: 6.7.14 - dev: true - /@farmfe/runtime-plugin-hmr@3.5.10: - resolution: {integrity: sha512-ZFwAGDJ1sNuwX77ADdPSO+PoMImrGl0k+nvW/TnzOy72k8JxC8OwaeOiuPgNkYxDGldp55l9mPE9NvcoxR8uzQ==} + '@farmfe/runtime-plugin-hmr@3.5.10': dependencies: core-js: 3.39.0 - /@farmfe/runtime-plugin-import-meta@0.2.3: - resolution: {integrity: sha512-BEHPjfXj/DXpwKxyM4rMqT9NFRfivTGS+b02uchjV9MSTi8mZqm3QhtJ+znlpgHUBABBtZYKdayQEDhyK4izYw==} + '@farmfe/runtime-plugin-import-meta@0.2.3': dependencies: core-js: 3.39.0 - /@farmfe/runtime@0.12.10: - resolution: {integrity: sha512-2/jebNFaVC+yctEeFZrmbfjaKJOg2Ib9iJ8ypjcUnnETfR4zbZnYuErfIO1Af44anvpONwWDhQ8RVcmy+WyY5w==} + '@farmfe/runtime@0.12.10': dependencies: core-js: 3.39.0 - /@farmfe/utils@0.0.1: - resolution: {integrity: sha512-QLbgNrojcvxfumXA/H329XAXhoCahmeSH3JmaiwwJEGS2QAmWfgAJMegjwlt6OmArGVO4gSbJ7Xbmm1idZZs+g==} + '@farmfe/utils@0.0.1': {} - /@farmfe/utils@0.1.0: - resolution: {integrity: sha512-neNJQGqV7XL4XifG1uHOBFSFLy2yx1/DVZNRA7nfeEAXEksVZTwWA+fZrYEaI0w7Sw6K/9NYn9Jgpn+NAT0mcg==} + '@farmfe/utils@0.1.0': {} - /@guolao/vue-monaco-editor@1.5.4(monaco-editor@0.52.2)(vue@3.5.13): - resolution: {integrity: sha512-eyBAqxJeDpV4mZYZSpNvh3xUgKCld5eEe0dBtjJhsy2+L0MB6PYFZ/FbPHNwskgp2RoIpfn1DLrIhXXE3lVbwQ==} - peerDependencies: - '@vue/composition-api': ^1.7.1 - monaco-editor: '>=0.43.0' - vue: ^2.6.14 || >=3.0.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + '@guolao/vue-monaco-editor@1.5.4(monaco-editor@0.52.2)(vue@3.5.13(typescript@5.7.2))': dependencies: '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) monaco-editor: 0.52.2 vue: 3.5.13(typescript@5.7.2) - vue-demi: 0.14.10(vue@3.5.13) - dev: true + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) - /@jridgewell/gen-mapping@0.3.8: - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - dev: false - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - dev: false + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: false + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/sourcemap-codec@1.5.0: - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.0': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - dev: false - /@koa/cors@5.0.0: - resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} - engines: {node: '>= 14.0.0'} + '@koa/cors@5.0.0': dependencies: vary: 1.1.2 - /@ljharb/through@2.3.13: - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} + '@ljharb/through@2.3.13': dependencies: call-bind: 1.0.8 - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.26.0 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/get-packages@1.1.3': dependencies: '@babel/runtime': 7.26.0 '@changesets/types': 4.1.0 @@ -1133,193 +3582,279 @@ packages: globby: 11.1.0 read-yaml-file: 1.1.0 - /@mdn/browser-compat-data@5.6.26: - resolution: {integrity: sha512-7NdgdOR7lkzrN70zGSULmrcvKyi/aJjpTJRCbuy8IZuHiLkPTvsr10jW0MJgWzK2l2wTmhdQvegTw6yNU5AVNQ==} + '@mdn/browser-compat-data@5.6.26': {} - /@monaco-editor/loader@1.4.0(monaco-editor@0.52.2): - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' + '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': dependencies: monaco-editor: 0.52.2 state-local: 1.0.7 - dev: true - /@napi-rs/cli@2.18.4: - resolution: {integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==} - engines: {node: '>= 10'} - hasBin: true - dev: true + '@napi-rs/cli@2.18.4': {} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 - /@polka/url@1.0.0-next.28: - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} - dev: true + '@parcel/watcher-android-arm64@2.5.1': + optional: true - /@sindresorhus/merge-streams@2.3.0: - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - dev: false + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true - /@swc/helpers@0.5.15: - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@polka/url@1.0.0-next.28': {} + + '@rollup/rollup-android-arm-eabi@4.32.1': + optional: true + + '@rollup/rollup-android-arm64@4.32.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.32.1': + optional: true + + '@rollup/rollup-darwin-x64@4.32.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.32.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.32.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.32.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.32.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.32.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.32.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.32.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.32.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.32.1': + optional: true + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)) + debug: 4.4.0 + svelte: 5.19.6 + vite: 6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)) + debug: 4.4.0 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.19.6 + vite: 6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4) + vitefu: 1.0.5(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - /@ts-morph/common@0.24.0: - resolution: {integrity: sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==} + '@ts-morph/common@0.24.0': dependencies: fast-glob: 3.3.2 minimatch: 9.0.5 mkdirp: 3.0.1 path-browserify: 1.0.1 - dev: true - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@tsconfig/svelte@5.0.4': {} + + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.3 '@babel/types': 7.26.3 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 - dev: true - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.26.3 - dev: true - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.26.3 '@babel/types': 7.26.3 - dev: true - /@types/babel__traverse@7.20.6: - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.20.6': dependencies: '@babel/types': 7.26.3 - dev: true - /@types/conventional-commits-parser@5.0.1: - resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/conventional-commits-parser@5.0.1': dependencies: '@types/node': 22.10.2 - dev: true - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.6': {} + + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 '@types/node': 22.10.2 - dev: false - /@types/http-proxy@1.17.15: - resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + '@types/http-proxy@1.17.15': dependencies: '@types/node': 22.10.2 - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/jsonfile@6.1.4': dependencies: '@types/node': 22.10.2 - dev: false - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/ms@2.1.0': {} - /@types/node@22.10.2: - resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==} + '@types/node@12.20.55': {} + + '@types/node@22.10.2': dependencies: undici-types: 6.20.0 - /@types/object-path@0.11.4: - resolution: {integrity: sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==} + '@types/object-path@0.11.4': {} - /@types/prop-types@15.7.14: - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - dev: true + '@types/prop-types@15.7.14': {} - /@types/react-dom@18.3.5(@types/react@18.3.18): - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} - peerDependencies: - '@types/react': ^18.0.0 + '@types/react-dom@18.3.5(@types/react@18.3.18)': dependencies: '@types/react': 18.3.18 - dev: true - /@types/react-dom@19.0.2(@types/react@19.0.1): - resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} - peerDependencies: - '@types/react': ^19.0.0 + '@types/react-dom@19.0.2(@types/react@19.0.1)': dependencies: '@types/react': 19.0.1 - dev: true - /@types/react@18.3.18: - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/react@18.3.18': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 - dev: true - /@types/react@19.0.1: - resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/react@19.0.1': dependencies: csstype: 3.1.3 - dev: true - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.5.8': {} - /@types/ua-parser-js@0.7.39: - resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} + '@types/ua-parser-js@0.7.39': {} - /@types/ws@8.5.13: - resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} + '@types/ws@8.5.13': dependencies: '@types/node': 22.10.2 - dev: true - /@vue/compiler-core@3.5.13: - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.13': dependencies: '@babel/parser': 7.26.3 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - dev: true - /@vue/compiler-dom@3.5.13: - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.13': dependencies: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 - dev: true - /@vue/compiler-sfc@3.5.13: - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.26.3 '@vue/compiler-core': 3.5.13 @@ -1330,270 +3865,189 @@ packages: magic-string: 0.30.17 postcss: 8.4.49 source-map-js: 1.2.1 - dev: true - /@vue/compiler-ssr@3.5.13: - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.13': dependencies: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - dev: true - /@vue/reactivity@3.5.13: - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.13': dependencies: '@vue/shared': 3.5.13 - dev: true - /@vue/runtime-core@3.5.13: - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.13': dependencies: '@vue/reactivity': 3.5.13 '@vue/shared': 3.5.13 - dev: true - /@vue/runtime-dom@3.5.13: - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.13': dependencies: '@vue/reactivity': 3.5.13 '@vue/runtime-core': 3.5.13 '@vue/shared': 3.5.13 csstype: 3.1.3 - dev: true - /@vue/server-renderer@3.5.13(vue@3.5.13): - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} - peerDependencies: - vue: 3.5.13 + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': dependencies: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 vue: 3.5.13(typescript@5.7.2) - dev: true - /@vue/shared@3.5.13: - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - dev: true + '@vue/shared@3.5.13': {} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - /ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + acorn-typescript@1.4.13(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - dev: true - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + aria-query@5.3.2: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + array-ify@1.0.0: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + array-union@2.1.0: {} - /axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + asynckit@0.4.0: {} + + axios@1.7.9: dependencies: follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - /babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: - resolution: {integrity: sha512-nnkrHpeDKM8A5laq9tmFvvGbbDQ7laGfQLp50cvCkCXmWrPcZdCtaQpNh8UJS/yLREJnv2R4JDL5ADfxyAn+yQ==} + axobject-query@4.1.0: {} + + babel-plugin-react-compiler@19.0.0-beta-37ed2a7-20241206: dependencies: '@babel/types': 7.26.3 - dev: false - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} + big-integer@1.6.52: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + binary-extensions@2.3.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: true - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - /browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.24.3: dependencies: caniuse-lite: 1.0.30001690 electron-to-chromium: 1.5.76 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true + bufferutil@4.0.8: dependencies: node-gyp-build: 4.8.4 - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + bytes@3.1.2: {} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + cac@6.7.14: {} - /cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 ylru: 1.4.0 - /call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} - engines: {node: '>= 0.4'} + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - /call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} + call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 get-intrinsic: 1.2.6 set-function-length: 1.2.2 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true + callsites@3.1.0: {} - /caniuse-lite@1.0.30001690: - resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + caniuse-lite@1.0.30001690: {} - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.4.1: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@0.7.0: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.3 @@ -1605,386 +4059,268 @@ packages: optionalDependencies: fsevents: 2.3.3 - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + ci-info@3.9.0: {} + + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + cli-spinners@2.9.2: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + cli-width@4.1.0: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + clone@1.0.4: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + clsx@2.1.1: {} - /code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - dev: true + co@4.6.0: {} - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + code-block-writer@13.0.3: {} + + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - /commitlint@19.6.1(@types/node@22.10.2)(typescript@5.7.2): - resolution: {integrity: sha512-tU4or+Y2fDXepCZ44o8guEB9uwrRp4if4VupGH1CR+bsVS2zX6Gia4dndA7UPx8cWWw1tvRRJu5keA7RqfXf3w==} - engines: {node: '>=v18'} - hasBin: true + commitlint@19.6.1(@types/node@22.10.2)(typescript@5.7.2): dependencies: '@commitlint/cli': 19.6.1(@types/node@22.10.2)(typescript@5.7.2) '@commitlint/types': 19.5.0 transitivePeerDependencies: - '@types/node' - typescript - dev: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.53.0 - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + content-type@1.0.5: {} - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: false + convert-source-map@2.0.0: {} - /cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} + cookies@0.9.1: dependencies: depd: 2.0.0 keygrip: 1.1.0 - /core-js@3.39.0: - resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} - requiresBuild: true + core-js@3.39.0: {} - /cosmiconfig-typescript-loader@6.1.0(@types/node@22.10.2)(cosmiconfig@9.0.0)(typescript@5.7.2): - resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} - engines: {node: '>=v18'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=9' - typescript: '>=5' + cosmiconfig-typescript-loader@6.1.0(@types/node@22.10.2)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2): dependencies: '@types/node': 22.10.2 cosmiconfig: 9.0.0(typescript@5.7.2) jiti: 2.4.2 typescript: 5.7.2 - dev: true - /cosmiconfig@9.0.0(typescript@5.7.2): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.7.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: typescript: 5.7.2 - dev: true - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true + cross-env@7.0.3: dependencies: cross-spawn: 7.0.6 - dev: true - /cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true + csstype@3.1.3: {} - /dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - dev: true + dargs@8.1.0: {} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - /debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.4.0: dependencies: ms: 2.1.3 - /deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + deep-equal@1.0.1: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + deepmerge@4.3.1: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} + default-browser@4.0.0: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 execa: 7.2.0 titleize: 3.0.0 - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + define-lazy-prop@3.0.0: {} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + delegates@1.0.0: {} - /depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + depd@1.1.2: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + depd@2.0.0: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + destroy@1.2.0: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + detect-indent@6.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + detect-libc@1.0.3: + optional: true + + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} + dotenv-expand@11.0.7: dependencies: dotenv: 16.4.7 - /dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} + dotenv@16.4.7: {} - /dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ee-first@1.1.1: {} - /electron-to-chromium@1.5.76: - resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + electron-to-chromium@1.5.76: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + encodeurl@1.0.2: {} - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} - engines: {node: '>=4'} - hasBin: true - dev: true + envinfo@7.14.0: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: true - /es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + es-define-property@1.0.1: {} - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - /escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.2.2: {} + + esprima@4.0.1: {} + + esrap@1.4.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + estree-walker@2.0.2: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@4.0.7: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 get-stream: 6.0.1 @@ -1996,9 +4332,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.6 get-stream: 6.0.1 @@ -2010,20 +4344,15 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + extendable-error@0.1.7: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - /farm-browserslist-generator@1.0.5: - resolution: {integrity: sha512-igffWSQATGV2ZJEvDBIB9Q2QfVOr+vv/JTZaaNoYfW/nrCGZ58zyJ0kSkFQEvptGUWf6idECqj82ykli4Ueplw==} - engines: {node: '>=16.15.1', npm: '>=7.0.0', pnpm: '>=3.2.0', yarn: '>=1.13'} + farm-browserslist-generator@1.0.5: dependencies: '@mdn/browser-compat-data': 5.6.26 '@types/object-path': 0.11.4 @@ -2036,83 +4365,34 @@ packages: semver: 7.6.3 ua-parser-js: 1.0.40 - /farm-plugin-replace-dirname-darwin-arm64@0.2.1: - resolution: {integrity: sha512-9FThv/qoFuj3cJjv9P6YnXbBwPQ5TwGjnr50ejXdZn13Ehz0+7w7EscbRsZHNvT7p24p6i0Y9NUSallcWc2syw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true + farm-plugin-replace-dirname-darwin-arm64@0.2.1: optional: true - /farm-plugin-replace-dirname-darwin-x64@0.2.1: - resolution: {integrity: sha512-Msqrh8mAPBbEpANpa0z9uQBr1/MO+PaHgBxym/aNs1vpxB4KAs6JQWYKtO+Ob7JzFyV6d9lIRhpnpxzxTqSIfA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true + farm-plugin-replace-dirname-darwin-x64@0.2.1: optional: true - /farm-plugin-replace-dirname-linux-arm64-gnu@0.2.1: - resolution: {integrity: sha512-ZKuxGu9G01CW521uTQHh+IP8pcT/NolGQfcQuEmBpD8epJ8per8Ps52fS05u5TGniaOg+ySZpt7HxbX+++k1YQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - requiresBuild: true + farm-plugin-replace-dirname-linux-arm64-gnu@0.2.1: optional: true - /farm-plugin-replace-dirname-linux-arm64-musl@0.2.1: - resolution: {integrity: sha512-m3gH8ggczbRYTHZSNp3LjIQIcqhvDO4O78bxXc8O1ozKD8M47/YfQLyQV06M7H4rZ8s6XV3Bb1kAcRAASp3M5A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - libc: [glibc] - requiresBuild: true + farm-plugin-replace-dirname-linux-arm64-musl@0.2.1: optional: true - /farm-plugin-replace-dirname-linux-x64-gnu@0.2.1: - resolution: {integrity: sha512-MehKkoM2RFw3sCnEu9nCbXKjxtC3hfTad0h/dC+Z8iEBcLEReVLoNzHWWUa6BxkxqDtB82/BWO/ObSUj/VUnwQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - libc: [glibc] - requiresBuild: true + farm-plugin-replace-dirname-linux-x64-gnu@0.2.1: optional: true - /farm-plugin-replace-dirname-linux-x64-musl@0.2.1: - resolution: {integrity: sha512-o1qPZi16N/sHOteZYJVv6UmZFK3QKpVQrywk/4spJI0mPH9A9Y+G6iBE2Tqjb3d+1Hb6phr++EBJHZ2x1ajtGQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true + farm-plugin-replace-dirname-linux-x64-musl@0.2.1: optional: true - /farm-plugin-replace-dirname-win32-arm64-msvc@0.2.1: - resolution: {integrity: sha512-Xn/wYFkgb7SsTlSaefFtvxNbXEVdvZB854b/rBZu47+MRQpSnBIPwnTGcqo8eNTMjtnY4beGGtcd78iqMVAHFQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true + farm-plugin-replace-dirname-win32-arm64-msvc@0.2.1: optional: true - /farm-plugin-replace-dirname-win32-ia32-msvc@0.2.1: - resolution: {integrity: sha512-YtIu5CS/BSgbQZb1qjaBg0cEKvB4vCIbBxNn64H468zwliPbE93SAIyiwu6cL3la59cjBP4sEbz4ZAWyY9GoMQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true + farm-plugin-replace-dirname-win32-ia32-msvc@0.2.1: optional: true - /farm-plugin-replace-dirname-win32-x64-msvc@0.2.1: - resolution: {integrity: sha512-KUAf4rcv3Nz+CpGs4zr+ZRu4hWRp7SHQBgpX+mb0hhMjRvn+LoWm2qCL2q9Gp3jsTDVmzjPbyZxp/9UJKx13lQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true + farm-plugin-replace-dirname-win32-x64-msvc@0.2.1: optional: true - /farm-plugin-replace-dirname@0.2.1: - resolution: {integrity: sha512-aJ4euQzxoq0sVu4AwXrNQflHJrSZdrdApGEyVRtN6KiCop3CHXnTg9ydlyCNXN2unQB283aNjojvCd5E/32KgA==} + farm-plugin-replace-dirname@0.2.1: dependencies: '@changesets/cli': 2.27.11 '@farmfe/utils': 0.0.1 @@ -2128,13 +4408,9 @@ packages: farm-plugin-replace-dirname-win32-ia32-msvc: 0.2.1 farm-plugin-replace-dirname-win32-x64-msvc: 0.2.1 - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -2142,115 +4418,74 @@ packages: merge2: 1.4.1 micromatch: 4.0.8 - /fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} - dev: true + fast-uri@3.0.3: {} - /fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.18.0: dependencies: reusify: 1.0.4 - /figures@5.0.0: - resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} - engines: {node: '>=14'} + fdir@6.4.3: {} + + figures@5.0.0: dependencies: escape-string-regexp: 5.0.0 is-unicode-supported: 1.3.0 - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} + find-up@7.0.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 unicorn-magic: 0.1.0 - dev: true - /follow-redirects@1.15.9(debug@4.4.0): - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: + follow-redirects@1.15.9(debug@4.4.0): + optionalDependencies: debug: 4.4.0 - /form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@0.5.2: {} - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 dunder-proto: 1.0.1 @@ -2263,46 +4498,27 @@ packages: hasown: 2.0.2 math-intrinsics: 1.1.0 - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-stream@6.0.1: {} - /git-cz@4.9.0: - resolution: {integrity: sha512-cSRL8IIOXU7UFLdbziCYqg8f8InwLwqHezkiRHNSph7oZqGv0togId1kMTfKil6gzK0VaSXeVBb4oDl0fQCHiw==} - hasBin: true - dev: true + git-cz@4.9.0: {} - /git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true + git-raw-commits@4.0.0: dependencies: dargs: 8.1.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false + globals@11.12.0: {} - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -2311,9 +4527,7 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /globby@14.0.2: - resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} - engines: {node: '>=18'} + globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 @@ -2321,59 +4535,40 @@ packages: path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 - dev: false - /gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + gopd@1.2.0: {} - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 - /has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + has-symbols@1.1.0: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - /http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} + http-assert@1.5.0: dependencies: deep-equal: 1.0.1 http-errors: 1.8.1 - /http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + http-errors@1.6.3: dependencies: depd: 1.1.2 inherits: 2.0.3 setprototypeof: 1.1.0 statuses: 1.5.0 - /http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + http-errors@1.8.1: dependencies: depd: 1.1.2 inherits: 2.0.4 @@ -2381,9 +4576,7 @@ packages: statuses: 1.5.0 toidentifier: 1.0.1 - /http-proxy-middleware@3.0.3: - resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + http-proxy-middleware@3.0.3: dependencies: '@types/http-proxy': 1.17.15 debug: 4.4.0 @@ -2394,9 +4587,7 @@ packages: transitivePeerDependencies: - supports-color - /http-proxy@1.18.1(debug@4.4.0): - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1(debug@4.4.0): dependencies: eventemitter3: 4.0.7 follow-redirects: 1.15.9(debug@4.4.0) @@ -2404,62 +4595,38 @@ packages: transitivePeerDependencies: - debug - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@1.0.2: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + human-signals@4.3.1: {} - /husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.1.7: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + ignore@5.3.2: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + immutable@5.0.3: {} + + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - dev: true + import-meta-resolve@4.1.0: {} - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + inherits@2.0.3: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.1: {} - /inquirer@9.2.12: - resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} - engines: {node: '>=14.18.0'} + inquirer@9.2.12: dependencies: '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 @@ -2477,209 +4644,128 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + is-docker@2.2.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + is-docker@3.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + is-interactive@1.0.0: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@2.0.1: {} - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + is-stream@3.0.0: {} + + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} + is-unicode-supported@1.3.0: {} - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + is-windows@1.0.2: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - /isbot@3.8.0: - resolution: {integrity: sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==} - engines: {node: '>=12'} + isbot@3.8.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - dev: true + jiti@2.4.2: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - dev: false + jsesc@3.1.0: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false + json5@2.2.3: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} + keygrip@1.1.0: dependencies: tsscmp: 1.0.6 - /koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + kleur@4.1.5: {} - /koa-compress@5.1.1: - resolution: {integrity: sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg==} - engines: {node: '>= 12'} + koa-compose@4.1.0: {} + + koa-compress@5.1.1: dependencies: bytes: 3.1.2 compressible: 2.0.18 http-errors: 1.8.1 koa-is-json: 1.0.0 - /koa-connect@2.1.0: - resolution: {integrity: sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==} + koa-connect@2.1.0: {} - /koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} + koa-convert@2.0.0: dependencies: co: 4.6.0 koa-compose: 4.1.0 - /koa-is-json@1.0.0: - resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==} + koa-is-json@1.0.0: {} - /koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} + koa-send@5.0.1: dependencies: debug: 4.4.0 http-errors: 1.8.1 @@ -2687,18 +4773,14 @@ packages: transitivePeerDependencies: - supports-color - /koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} + koa-static@5.0.0: dependencies: debug: 3.2.7 koa-send: 5.0.1 transitivePeerDependencies: - supports-color - /koa@2.15.3: - resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + koa@2.15.3: dependencies: accepts: 1.3.8 cache-content-type: 1.0.1 @@ -2726,250 +4808,149 @@ packages: transitivePeerDependencies: - supports-color - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-character@3.0.0: {} + + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.debounce@4.0.8: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true + lodash.isplainobject@4.0.6: {} - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + lodash.kebabcase@4.1.1: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true + lodash.mergewith@4.6.2: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + lodash.snakecase@4.1.1: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.startcase@4.4.0: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true + lodash.uniq@4.5.0: {} - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} + loglevel@1.9.2: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: false - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: false - /magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - dev: true - /math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + math-intrinsics@1.1.0: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@0.3.0: {} - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + meow@12.1.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + merge2@1.4.1: {} - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} + mime-db@1.53.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + mimic-fn@4.0.0: {} - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@3.0.1: {} - /monaco-editor@0.52.2: - resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - dev: true + monaco-editor@0.52.2: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + mri@1.2.0: {} - /mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - dev: true + mrmime@2.0.0: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mute-stream@1.0.0: {} - /nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.8: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + negotiator@0.6.3: {} - /node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true + node-addon-api@7.1.1: + optional: true - /node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-gyp-build@4.8.4: {} - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + node-releases@2.0.19: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - /object-path@0.11.8: - resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} - engines: {node: '>= 10.12.0'} + object-path@0.11.8: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - /only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + only@0.0.2: {} - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -2981,294 +4962,211 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + os-tmpdir@1.0.2: {} - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + outdent@0.5.0: {} - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + p-filter@2.1.0: dependencies: p-map: 2.1.0 - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.1.1 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + p-map@2.1.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + package-manager-detector@0.2.8: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parseurl@1.3.3: {} - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + path-browserify@1.0.1: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + path-key@4.0.0: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@4.0.0: {} - /path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - dev: false + path-type@5.0.0: {} - /picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picocolors@1.1.1: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + pify@4.0.1: {} - /postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + prettier@2.8.8: {} - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - dev: false - /react-dom@19.0.0(react@19.0.0): - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 + react-dom@19.0.0(react@19.0.0): dependencies: react: 19.0.0 scheduler: 0.25.0 - dev: false - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.14.2: {} - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - dev: false - /react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} - dev: false + react@19.0.0: {} - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + readdirp@4.1.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true + regenerator-runtime@0.14.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + require-from-string@2.0.2: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + requires-port@1.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@4.0.0: {} - /resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} + resolve-from@5.0.0: {} + + resolve-path@1.4.0: dependencies: http-errors: 1.6.3 path-is-absolute: 1.0.1 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + rollup@4.32.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.32.1 + '@rollup/rollup-android-arm64': 4.32.1 + '@rollup/rollup-darwin-arm64': 4.32.1 + '@rollup/rollup-darwin-x64': 4.32.1 + '@rollup/rollup-freebsd-arm64': 4.32.1 + '@rollup/rollup-freebsd-x64': 4.32.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 + '@rollup/rollup-linux-arm-musleabihf': 4.32.1 + '@rollup/rollup-linux-arm64-gnu': 4.32.1 + '@rollup/rollup-linux-arm64-musl': 4.32.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 + '@rollup/rollup-linux-riscv64-gnu': 4.32.1 + '@rollup/rollup-linux-s390x-gnu': 4.32.1 + '@rollup/rollup-linux-x64-gnu': 4.32.1 + '@rollup/rollup-linux-x64-musl': 4.32.1 + '@rollup/rollup-win32-arm64-msvc': 4.32.1 + '@rollup/rollup-win32-ia32-msvc': 4.32.1 + '@rollup/rollup-win32-x64-msvc': 4.32.1 + fsevents: 2.3.3 + + run-applescript@5.0.0: dependencies: execa: 5.1.1 - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} + run-async@3.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.8.1 - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + sade@1.8.1: + dependencies: + mri: 1.2.0 - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safe-buffer@5.2.1: {} - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + safer-buffer@2.1.2: {} + + sass@1.83.4: + dependencies: + chokidar: 4.0.3 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - dev: false - /scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - dev: false + scheduler@0.25.0: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: false + semver@6.3.1: {} - /semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.3: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -3277,327 +5175,229 @@ packages: gopd: 1.2.0 has-property-descriptors: 1.0.2 - /setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + setprototypeof@1.1.0: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.28 mrmime: 2.0.0 totalist: 3.0.1 - dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: false + slash@5.1.0: {} - /source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.1: {} - /spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true + split2@4.2.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /state-local@1.0.7: - resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - dev: true + state-local@1.0.7: {} - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + statuses@1.5.0: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-final-newline@3.0.0: {} - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + svelte-check@4.1.4(svelte@5.19.6)(typescript@5.6.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 4.0.3 + fdir: 6.4.3 + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.19.6 + typescript: 5.6.3 + transitivePeerDependencies: + - picomatch - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true + svelte@5.19.6: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 1.4.3 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + term-size@2.2.1: {} - /tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} - dev: true + text-extensions@2.4.0: {} - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} + through@2.3.8: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tinyexec@0.3.1: {} + + titleize@3.0.0: {} + + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - dev: true + totalist@3.0.1: {} - /ts-morph@23.0.0: - resolution: {integrity: sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug==} + ts-morph@23.0.0: dependencies: '@ts-morph/common': 0.24.0 code-block-writer: 13.0.3 - dev: true - /tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tslib@2.8.1: {} - /tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} + tsscmp@1.0.6: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - /typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.6.3: {} - /ua-parser-js@1.0.40: - resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} - hasBin: true + typescript@5.7.2: {} - /undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + ua-parser-js@1.0.40: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + undici-types@6.20.0: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + unicorn-magic@0.1.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + universalify@0.1.2: {} - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + universalify@2.0.1: {} - /update-browserslist-db@1.1.1(browserslist@4.24.3): - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + untildify@4.0.0: {} + + update-browserslist-db@1.1.1(browserslist@4.24.3): dependencies: browserslist: 4.24.3 escalade: 3.2.0 picocolors: 1.1.1 - /utf-8-validate@6.0.5: - resolution: {integrity: sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==} - engines: {node: '>=6.14.2'} - requiresBuild: true + utf-8-validate@6.0.5: dependencies: node-gyp-build: 4.8.4 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + vary@1.1.2: {} - /vue-demi@0.14.10(vue@3.5.13): - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4): + dependencies: + esbuild: 0.24.2 + postcss: 8.4.49 + rollup: 4.32.1 + optionalDependencies: + '@types/node': 22.10.2 + fsevents: 2.3.3 + jiti: 2.4.2 + sass: 1.83.4 + + vitefu@1.0.5(vite@6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4)): + optionalDependencies: + vite: 6.0.11(@types/node@22.10.2)(jiti@2.4.2)(sass@1.83.4) + + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): dependencies: vue: 3.5.13(typescript@5.7.2) - dev: true - /vue@3.5.13(typescript@5.7.2): - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vue@3.5.13(typescript@5.7.2): dependencies: '@vue/compiler-dom': 3.5.13 '@vue/compiler-sfc': 3.5.13 '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13) + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) '@vue/shared': 3.5.13 + optionalDependencies: typescript: 5.7.2 - dev: true - /walkdir@0.4.1: - resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==} - engines: {node: '>=6.0.0'} + walkdir@0.4.1: {} - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5): - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: + ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.5): + optionalDependencies: bufferutil: 4.0.8 utf-8-validate: 6.0.5 - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false + yallist@3.1.1: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -3606,24 +5406,15 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} + ylru@1.4.0: {} - /yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.1.1: {} - /zod-validation-error@1.5.0(zod@3.24.1): - resolution: {integrity: sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==} - engines: {node: '>=16.0.0'} - peerDependencies: - zod: ^3.18.0 + zimmerframe@1.1.2: {} + + zod-validation-error@1.5.0(zod@3.24.1): dependencies: zod: 3.24.1 - /zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.24.1: {} From f827a2e1d134b5e3820c83492bb965e66ff5e36e Mon Sep 17 00:00:00 2001 From: erkelost <1256029807@qq.com> Date: Fri, 31 Jan 2025 15:17:48 +0800 Subject: [PATCH 4/4] chore(js-plugins): update code --- examples/svelte/.gitignore | 24 + examples/svelte/README.md | 47 ++ examples/svelte/farm.config.ts | 30 ++ examples/svelte/index.html | 13 + examples/svelte/package.json | 23 + examples/svelte/public/vite.svg | 1 + examples/svelte/src/App.svelte | 47 ++ examples/svelte/src/app.css | 79 +++ examples/svelte/src/assets/svelte.svg | 1 + examples/svelte/src/lib/Counter.svelte | 10 + examples/svelte/src/main.ts | 9 + examples/svelte/src/vite-env.d.ts | 2 + examples/svelte/svelte.config.js | 7 + examples/svelte/tsconfig.app.json | 20 + examples/svelte/tsconfig.json | 7 + examples/svelte/tsconfig.node.json | 24 + examples/svelte/vite.config.ts | 7 + js-plugins/svelte/src/index2.js | 236 +++++++++ js-plugins/svelte/src/utils/options2.js | 653 ++++++++++++++++++++++++ 19 files changed, 1240 insertions(+) create mode 100644 examples/svelte/.gitignore create mode 100644 examples/svelte/README.md create mode 100644 examples/svelte/farm.config.ts create mode 100644 examples/svelte/index.html create mode 100644 examples/svelte/package.json create mode 100644 examples/svelte/public/vite.svg create mode 100644 examples/svelte/src/App.svelte create mode 100644 examples/svelte/src/app.css create mode 100644 examples/svelte/src/assets/svelte.svg create mode 100644 examples/svelte/src/lib/Counter.svelte create mode 100644 examples/svelte/src/main.ts create mode 100644 examples/svelte/src/vite-env.d.ts create mode 100644 examples/svelte/svelte.config.js create mode 100644 examples/svelte/tsconfig.app.json create mode 100644 examples/svelte/tsconfig.json create mode 100644 examples/svelte/tsconfig.node.json create mode 100644 examples/svelte/vite.config.ts create mode 100644 js-plugins/svelte/src/index2.js create mode 100644 js-plugins/svelte/src/utils/options2.js diff --git a/examples/svelte/.gitignore b/examples/svelte/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/examples/svelte/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/svelte/README.md b/examples/svelte/README.md new file mode 100644 index 0000000..e6cd94f --- /dev/null +++ b/examples/svelte/README.md @@ -0,0 +1,47 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/examples/svelte/farm.config.ts b/examples/svelte/farm.config.ts new file mode 100644 index 0000000..2c6191c --- /dev/null +++ b/examples/svelte/farm.config.ts @@ -0,0 +1,30 @@ +import { defineConfig } from '@farmfe/core' +import { svelte } from '@farmfe/js-plugin-svelte' +import fs from 'fs' +export default defineConfig({ + plugins: [svelte(), base()], + compilation: { + persistentCache: false, + progress: false, + } +}) + +function base() { + return { + name: 'farm-load-vue-module-type', + priority: -100, + load: { + filters: { + resolvedPaths: ['.svelte'], + }, + executor: async (param) => { + const content = await fs.readFile(param.resolvedPath, 'utf-8') + + return { + content, + moduleType: 'js', + } + }, + }, + } +} diff --git a/examples/svelte/index.html b/examples/svelte/index.html new file mode 100644 index 0000000..b6c5f0a --- /dev/null +++ b/examples/svelte/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Svelte + TS + + +
+ + + diff --git a/examples/svelte/package.json b/examples/svelte/package.json new file mode 100644 index 0000000..b990ac1 --- /dev/null +++ b/examples/svelte/package.json @@ -0,0 +1,23 @@ +{ + "name": "svelte", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "farm dev", + "build": "farm build", + "preview": "farm preview", + "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" + }, + "devDependencies": { + "@farmfe/core": "/Users/adny/rust/farm/packages/core", + "@farmfe/cli": "/Users/adny/rust/farm/packages/cli", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@farmfe/js-plugin-svelte": "workspace:*", + "@tsconfig/svelte": "^5.0.4", + "svelte": "^5.15.0", + "svelte-check": "^4.1.1", + "typescript": "~5.6.2", + "vite": "^6.0.5" + } +} diff --git a/examples/svelte/public/vite.svg b/examples/svelte/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/examples/svelte/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/svelte/src/App.svelte b/examples/svelte/src/App.svelte new file mode 100644 index 0000000..f75b68a --- /dev/null +++ b/examples/svelte/src/App.svelte @@ -0,0 +1,47 @@ + + +
+ +

Vite + Svelte

+ +
+ +
+ +

+ Check out SvelteKit, the official Svelte app framework powered by Vite! +

+ +

+ Click on the Vite and Svelte logos to learn more +

+
+ + diff --git a/examples/svelte/src/app.css b/examples/svelte/src/app.css new file mode 100644 index 0000000..617f5e9 --- /dev/null +++ b/examples/svelte/src/app.css @@ -0,0 +1,79 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/svelte/src/assets/svelte.svg b/examples/svelte/src/assets/svelte.svg new file mode 100644 index 0000000..c5e0848 --- /dev/null +++ b/examples/svelte/src/assets/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/svelte/src/lib/Counter.svelte b/examples/svelte/src/lib/Counter.svelte new file mode 100644 index 0000000..37d75ce --- /dev/null +++ b/examples/svelte/src/lib/Counter.svelte @@ -0,0 +1,10 @@ + + + diff --git a/examples/svelte/src/main.ts b/examples/svelte/src/main.ts new file mode 100644 index 0000000..664a057 --- /dev/null +++ b/examples/svelte/src/main.ts @@ -0,0 +1,9 @@ +import { mount } from 'svelte' +import './app.css' +import App from './App.svelte' + +const app = mount(App, { + target: document.getElementById('app')!, +}) + +export default app diff --git a/examples/svelte/src/vite-env.d.ts b/examples/svelte/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/examples/svelte/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/examples/svelte/svelte.config.js b/examples/svelte/svelte.config.js new file mode 100644 index 0000000..b0683fd --- /dev/null +++ b/examples/svelte/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/examples/svelte/tsconfig.app.json b/examples/svelte/tsconfig.app.json new file mode 100644 index 0000000..55a2f9b --- /dev/null +++ b/examples/svelte/tsconfig.app.json @@ -0,0 +1,20 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true, + "moduleDetection": "force" + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/examples/svelte/tsconfig.json b/examples/svelte/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/examples/svelte/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/svelte/tsconfig.node.json b/examples/svelte/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/examples/svelte/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/svelte/vite.config.ts b/examples/svelte/vite.config.ts new file mode 100644 index 0000000..d32eba1 --- /dev/null +++ b/examples/svelte/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], +}) diff --git a/js-plugins/svelte/src/index2.js b/js-plugins/svelte/src/index2.js new file mode 100644 index 0000000..9ec43e9 --- /dev/null +++ b/js-plugins/svelte/src/index2.js @@ -0,0 +1,236 @@ +import fs from 'node:fs'; +import process from 'node:process'; +import { svelteInspector } from '@sveltejs/vite-plugin-svelte-inspector'; +import { handleHotUpdate } from './handle-hot-update.js'; +import { log, logCompilerWarnings } from './utils/log.js'; +import { createCompileSvelte } from './utils/compile.js'; +import { buildIdParser, buildModuleIdParser } from './utils/id.js'; +import { + buildExtraViteConfig, + validateInlineOptions, + resolveOptions, + patchResolvedViteConfig, + preResolveOptions, + ensureConfigEnvironmentMainFields, + ensureConfigEnvironmentConditions +} from './utils/options.js'; +import { ensureWatchedFile, setupWatchers } from './utils/watch.js'; +import { toRollupError } from './utils/error.js'; +import { saveSvelteMetadata } from './utils/optimizer.js'; +import { VitePluginSvelteCache } from './utils/vite-plugin-svelte-cache.js'; +import { loadRaw } from './utils/load-raw.js'; +import * as svelteCompiler from 'svelte/compiler'; + +/** + * @param {Partial} [inlineOptions] + * @returns {import('vite').Plugin[]} + */ +export function svelte(inlineOptions) { + if (process.env.DEBUG != null) { + log.setLevel('debug'); + } + validateInlineOptions(inlineOptions); + const cache = new VitePluginSvelteCache(); + // updated in configResolved hook + /** @type {import('./types/id.d.ts').IdParser} */ + let requestParser; + /** @type {import('./types/id.d.ts').ModuleIdParser} */ + let moduleRequestParser; + /** @type {import('./types/options.d.ts').ResolvedOptions} */ + let options; + /** @type {import('vite').ResolvedConfig} */ + let viteConfig; + /** @type {import('./types/compile.d.ts').CompileSvelte} */ + let compileSvelte; + /** @type {import('./types/plugin-api.d.ts').PluginAPI} */ + const api = {}; + /** @type {import('vite').Plugin[]} */ + const plugins = [ + { + name: 'vite-plugin-svelte', + // make sure our resolver runs before vite internal resolver to resolve svelte field correctly + enforce: 'pre', + api, + async config(config, configEnv) { + // setup logger + if (process.env.DEBUG) { + log.setLevel('debug'); + } else if (config.logLevel) { + log.setLevel(config.logLevel); + } + // @ts-expect-error temporarily lend the options variable until fixed in configResolved + options = await preResolveOptions(inlineOptions, config, configEnv); + // extra vite config + const extraViteConfig = await buildExtraViteConfig(options, config); + log.debug('additional vite config', extraViteConfig, 'config'); + return extraViteConfig; + }, + + configEnvironment(name, config, opts) { + ensureConfigEnvironmentMainFields(name, config, opts); + // @ts-expect-error the function above should make `resolve.mainFields` non-nullable + config.resolve.mainFields.unshift('svelte'); + + ensureConfigEnvironmentConditions(name, config, opts); + // @ts-expect-error the function above should make `resolve.conditions` non-nullable + config.resolve.conditions.push('svelte'); + }, + + async configResolved(config) { + options = resolveOptions(options, config, cache); + patchResolvedViteConfig(config, options); + requestParser = buildIdParser(options); + compileSvelte = createCompileSvelte(); + viteConfig = config; + // TODO deep clone to avoid mutability from outside? + api.options = options; + log.debug('resolved options', options, 'config'); + }, + + async buildStart() { + if (!options.prebundleSvelteLibraries) return; + const isSvelteMetadataChanged = await saveSvelteMetadata(viteConfig.cacheDir, options); + if (isSvelteMetadataChanged) { + // Force Vite to optimize again. Although we mutate the config here, it works because + // Vite's optimizer runs after `buildStart()`. + viteConfig.optimizeDeps.force = true; + } + }, + + configureServer(server) { + options.server = server; + setupWatchers(options, cache, requestParser); + }, + + async load(id, opts) { + const ssr = !!opts?.ssr; + const svelteRequest = requestParser(id, !!ssr); + if (svelteRequest) { + const { filename, query, raw } = svelteRequest; + if (raw) { + const code = await loadRaw(svelteRequest, compileSvelte, options); + // prevent vite from injecting sourcemaps in the results. + return { + code, + map: { + mappings: '' + } + }; + } else { + if (query.svelte && query.type === 'style') { + const css = cache.getCSS(svelteRequest); + if (css) { + return css; + } + } + // prevent vite asset plugin from loading files as url that should be compiled in transform + if (viteConfig.assetsInclude(filename)) { + log.debug(`load returns raw content for ${filename}`, undefined, 'load'); + return fs.readFileSync(filename, 'utf-8'); + } + } + } + }, + + async resolveId(importee, importer, opts) { + const ssr = !!opts?.ssr; + const svelteRequest = requestParser(importee, ssr); + if (svelteRequest?.query.svelte) { + if ( + svelteRequest.query.type === 'style' && + !svelteRequest.raw && + !svelteRequest.query.inline + ) { + // return cssId with root prefix so postcss pipeline of vite finds the directory correctly + // see https://github.com/sveltejs/vite-plugin-svelte/issues/14 + log.debug( + `resolveId resolved virtual css module ${svelteRequest.cssId}`, + undefined, + 'resolve' + ); + return svelteRequest.cssId; + } + } + }, + + async transform(code, id, opts) { + const ssr = !!opts?.ssr; + const svelteRequest = requestParser(id, ssr); + if (!svelteRequest || svelteRequest.query.type === 'style' || svelteRequest.raw) { + return; + } + let compileData; + try { + compileData = await compileSvelte(svelteRequest, code, options); + } catch (e) { + cache.setError(svelteRequest, e); + throw toRollupError(e, options); + } + logCompilerWarnings(svelteRequest, compileData.compiled.warnings, options); + cache.update(compileData); + if (compileData.dependencies?.length) { + if (options.server) { + for (const dep of compileData.dependencies) { + ensureWatchedFile(options.server.watcher, dep, options.root); + } + } else if (options.isBuild && viteConfig.build.watch) { + for (const dep of compileData.dependencies) { + this.addWatchFile(dep); + } + } + } + return { + ...compileData.compiled.js, + meta: { + vite: { + lang: compileData.lang + } + } + }; + }, + + handleHotUpdate(ctx) { + if (!options.compilerOptions.hmr || !options.emitCss) { + return; + } + const svelteRequest = requestParser(ctx.file, false, ctx.timestamp); + if (svelteRequest) { + return handleHotUpdate(compileSvelte, ctx, svelteRequest, cache, options); + } + }, + async buildEnd() { + await options.stats?.finishAll(); + } + }, + { + name: 'vite-plugin-svelte-module', + enforce: 'post', + async configResolved() { + moduleRequestParser = buildModuleIdParser(options); + }, + async transform(code, id, opts) { + const ssr = !!opts?.ssr; + const moduleRequest = moduleRequestParser(id, ssr); + if (!moduleRequest) { + return; + } + try { + const compileResult = svelteCompiler.compileModule(code, { + dev: !viteConfig.isProduction, + generate: ssr ? 'server' : 'client', + filename: moduleRequest.filename + }); + logCompilerWarnings(moduleRequest, compileResult.warnings, options); + return compileResult.js; + } catch (e) { + throw toRollupError(e, options); + } + } + }, + svelteInspector() + ]; + return plugins; +} + +export { vitePreprocess } from './preprocess.js'; +export { loadSvelteConfig } from './utils/load-svelte-config.js'; diff --git a/js-plugins/svelte/src/utils/options2.js b/js-plugins/svelte/src/utils/options2.js new file mode 100644 index 0000000..6582e6e --- /dev/null +++ b/js-plugins/svelte/src/utils/options2.js @@ -0,0 +1,653 @@ +import process from 'node:process'; +import { + defaultClientMainFields, + defaultServerMainFields, + defaultClientConditions, + defaultServerConditions, + normalizePath +} from 'vite'; +import { isDebugNamespaceEnabled, log } from './log.js'; +import { loadSvelteConfig } from './load-svelte-config.js'; +import { + DEFAULT_SVELTE_EXT, + FAQ_LINK_MISSING_EXPORTS_CONDITION, + SVELTE_EXPORT_CONDITIONS, + SVELTE_IMPORTS +} from './constants.js'; + +import path from 'node:path'; +import { + esbuildSvelteModulePlugin, + esbuildSveltePlugin, + facadeEsbuildSvelteModulePluginName, + facadeEsbuildSveltePluginName +} from './esbuild.js'; +import { addExtraPreprocessors } from './preprocess.js'; +import deepmerge from 'deepmerge'; +import { + crawlFrameworkPkgs, + isDepExcluded, + isDepExternaled, + isDepIncluded, + isDepNoExternaled +} from 'vitefu'; + +import { isCommonDepWithoutSvelteField } from './dependencies.js'; +import { VitePluginSvelteStats } from './vite-plugin-svelte-stats.js'; + +const allowedPluginOptions = new Set([ + 'include', + 'exclude', + 'emitCss', + 'hot', + 'ignorePluginPreprocessors', + 'disableDependencyReinclusion', + 'prebundleSvelteLibraries', + 'inspector', + 'dynamicCompileOptions', + 'experimental' +]); + +const knownRootOptions = new Set(['extensions', 'compilerOptions', 'preprocess', 'onwarn']); + +const allowedInlineOptions = new Set(['configFile', ...allowedPluginOptions, ...knownRootOptions]); + +/** + * @param {Partial} [inlineOptions] + */ +export function validateInlineOptions(inlineOptions) { + const invalidKeys = Object.keys(inlineOptions || {}).filter( + (key) => !allowedInlineOptions.has(key) + ); + if (invalidKeys.length) { + log.warn(`invalid plugin options "${invalidKeys.join(', ')}" in inline config`, inlineOptions); + } +} + +/** + * @param {Partial} [config] + * @returns {Partial | undefined} + */ +function convertPluginOptions(config) { + if (!config) { + return; + } + const invalidRootOptions = Object.keys(config).filter((key) => allowedPluginOptions.has(key)); + if (invalidRootOptions.length > 0) { + throw new Error( + `Invalid options in svelte config. Move the following options into 'vitePlugin:{...}': ${invalidRootOptions.join( + ', ' + )}` + ); + } + if (!config.vitePlugin) { + return config; + } + const pluginOptions = config.vitePlugin; + const pluginOptionKeys = Object.keys(pluginOptions); + + const rootOptionsInPluginOptions = pluginOptionKeys.filter((key) => knownRootOptions.has(key)); + if (rootOptionsInPluginOptions.length > 0) { + throw new Error( + `Invalid options in svelte config under vitePlugin:{...}', move them to the config root : ${rootOptionsInPluginOptions.join( + ', ' + )}` + ); + } + const duplicateOptions = pluginOptionKeys.filter((key) => + Object.prototype.hasOwnProperty.call(config, key) + ); + if (duplicateOptions.length > 0) { + throw new Error( + `Invalid duplicate options in svelte config under vitePlugin:{...}', they are defined in root too and must only exist once: ${duplicateOptions.join( + ', ' + )}` + ); + } + const unknownPluginOptions = pluginOptionKeys.filter((key) => !allowedPluginOptions.has(key)); + if (unknownPluginOptions.length > 0) { + log.warn( + `ignoring unknown plugin options in svelte config under vitePlugin:{...}: ${unknownPluginOptions.join( + ', ' + )}` + ); + unknownPluginOptions.forEach((unkownOption) => { + // @ts-expect-error not typed + delete pluginOptions[unkownOption]; + }); + } + /** @type {import('../public.d.ts').Options} */ + const result = { + ...config, + ...pluginOptions + }; + // @ts-expect-error it exists + delete result.vitePlugin; + + return result; +} + +/** + * used in config phase, merges the default options, svelte config, and inline options + * @param {Partial | undefined} inlineOptions + * @param {import('vite').UserConfig} viteUserConfig + * @param {import('vite').ConfigEnv} viteEnv + * @returns {Promise} + */ +export async function preResolveOptions(inlineOptions, viteUserConfig, viteEnv) { + if (!inlineOptions) { + inlineOptions = {}; + } + /** @type {import('vite').UserConfig} */ + const viteConfigWithResolvedRoot = { + ...viteUserConfig, + root: resolveViteRoot(viteUserConfig) + }; + const isBuild = viteEnv.command === 'build'; + /** @type {Partial} */ + const defaultOptions = { + extensions: DEFAULT_SVELTE_EXT, + emitCss: true, + prebundleSvelteLibraries: !isBuild + }; + const svelteConfig = convertPluginOptions( + await loadSvelteConfig(viteConfigWithResolvedRoot, inlineOptions) + ); + /** @type {Partial} */ + const extraOptions = { + root: viteConfigWithResolvedRoot.root, + isBuild, + isServe: viteEnv.command === 'serve', + isDebug: process.env.DEBUG != null + }; + + const merged = /** @type {import('../types/options.d.ts').PreResolvedOptions} */ ( + mergeConfigs(defaultOptions, svelteConfig, inlineOptions, extraOptions) + ); + // configFile of svelteConfig contains the absolute path it was loaded from, + // prefer it over the possibly relative inline path + if (svelteConfig?.configFile) { + merged.configFile = svelteConfig.configFile; + } + return merged; +} + +/** + * @template T + * @param {(Partial | undefined)[]} configs + * @returns T + */ +function mergeConfigs(...configs) { + /** @type {Partial} */ + let result = {}; + for (const config of configs.filter((x) => x != null)) { + result = deepmerge(result, /** @type {Partial} */ (config), { + // replace arrays + arrayMerge: (target, source) => source ?? target + }); + } + return /** @type {T} */ result; +} + +/** + * used in configResolved phase, merges a contextual default config, pre-resolved options, and some preprocessors. also validates the final config. + * + * @param {import('../types/options.d.ts').PreResolvedOptions} preResolveOptions + * @param {import('vite').ResolvedConfig} viteConfig + * @param {import('./vite-plugin-svelte-cache.js').VitePluginSvelteCache} cache + * @returns {import('../types/options.d.ts').ResolvedOptions} + */ +export function resolveOptions(preResolveOptions, viteConfig, cache) { + const css = preResolveOptions.emitCss ? 'external' : 'injected'; + /** @type {Partial} */ + const defaultOptions = { + compilerOptions: { + css, + dev: !viteConfig.isProduction, + hmr: + !viteConfig.isProduction && + !preResolveOptions.isBuild && + viteConfig.server && + viteConfig.server.hmr !== false + } + }; + + /** @type {Partial} */ + const extraOptions = { + root: viteConfig.root, + isProduction: viteConfig.isProduction + }; + const merged = /** @type {import('../types/options.d.ts').ResolvedOptions}*/ ( + mergeConfigs(defaultOptions, preResolveOptions, extraOptions) + ); + + removeIgnoredOptions(merged); + handleDeprecatedOptions(merged); + addExtraPreprocessors(merged, viteConfig); + enforceOptionsForHmr(merged, viteConfig); + enforceOptionsForProduction(merged); + // mergeConfigs would mangle functions on the stats class, so do this afterwards + if (log.debug.enabled && isDebugNamespaceEnabled('stats')) { + merged.stats = new VitePluginSvelteStats(cache); + } + return merged; +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + * @param {import('vite').ResolvedConfig} viteConfig + */ +function enforceOptionsForHmr(options, viteConfig) { + if (options.hot) { + log.warn( + 'svelte 5 has hmr integrated in core. Please remove the vitePlugin.hot option and use compilerOptions.hmr instead' + ); + delete options.hot; + options.compilerOptions.hmr = true; + } + if (options.compilerOptions.hmr && viteConfig.server?.hmr === false) { + log.warn( + 'vite config server.hmr is false but compilerOptions.hmr is true. Forcing compilerOptions.hmr to false as it would not work.' + ); + options.compilerOptions.hmr = false; + } +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +function enforceOptionsForProduction(options) { + if (options.isProduction) { + if (options.compilerOptions.hmr) { + log.warn( + 'you are building for production but compilerOptions.hmr is true, forcing it to false' + ); + options.compilerOptions.hmr = false; + } + if (options.compilerOptions.dev) { + log.warn( + 'you are building for production but compilerOptions.dev is true, forcing it to false' + ); + options.compilerOptions.dev = false; + } + } +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +function removeIgnoredOptions(options) { + const ignoredCompilerOptions = ['generate', 'format', 'filename']; + if (options.compilerOptions.hmr && options.emitCss) { + ignoredCompilerOptions.push('cssHash'); + } + const passedCompilerOptions = Object.keys(options.compilerOptions || {}); + const passedIgnored = passedCompilerOptions.filter((o) => ignoredCompilerOptions.includes(o)); + if (passedIgnored.length) { + log.warn( + `The following Svelte compilerOptions are controlled by vite-plugin-svelte and essential to its functionality. User-specified values are ignored. Please remove them from your configuration: ${passedIgnored.join( + ', ' + )}` + ); + passedIgnored.forEach((ignored) => { + // @ts-expect-error string access + delete options.compilerOptions[ignored]; + }); + } +} + +/** + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +function handleDeprecatedOptions(options) { + const experimental = /** @type {Record} */ (options.experimental); + if (experimental) { + for (const promoted of ['prebundleSvelteLibraries', 'inspector', 'dynamicCompileOptions']) { + if (experimental[promoted]) { + //@ts-expect-error untyped assign + options[promoted] = experimental[promoted]; + delete experimental[promoted]; + log.warn( + `Option "experimental.${promoted}" is no longer experimental and has moved to "${promoted}". Please update your Svelte or Vite config.` + ); + } + } + if (experimental.generateMissingPreprocessorSourcemaps) { + log.warn('experimental.generateMissingPreprocessorSourcemaps has been removed.'); + } + } +} + +/** + * vite passes unresolved `root`option to config hook but we need the resolved value, so do it here + * + * @see https://github.com/sveltejs/vite-plugin-svelte/issues/113 + * @see https://github.com/vitejs/vite/blob/43c957de8a99bb326afd732c962f42127b0a4d1e/packages/vite/src/node/config.ts#L293 + * + * @param {import('vite').UserConfig} viteConfig + * @returns {string | undefined} + */ +function resolveViteRoot(viteConfig) { + return normalizePath(viteConfig.root ? path.resolve(viteConfig.root) : process.cwd()); +} + +/** + * @param {import('../types/options.d.ts').PreResolvedOptions} options + * @param {import('vite').UserConfig} config + * @returns {Promise>} + */ +export async function buildExtraViteConfig(options, config) { + /** @type {Partial} */ + const extraViteConfig = { + resolve: { + dedupe: [...SVELTE_IMPORTS] + } + // this option is still awaiting a PR in vite to be supported + // see https://github.com/sveltejs/vite-plugin-svelte/issues/60 + // knownJsSrcExtensions: options.extensions + }; + + const extraSvelteConfig = buildExtraConfigForSvelte(config); + const extraDepsConfig = await buildExtraConfigForDependencies(options, config); + // merge extra svelte and deps config, but make sure dep values are not contradicting svelte + extraViteConfig.optimizeDeps = { + include: [ + ...extraSvelteConfig.optimizeDeps.include, + ...extraDepsConfig.optimizeDeps.include.filter( + (dep) => !isDepExcluded(dep, extraSvelteConfig.optimizeDeps.exclude) + ) + ], + exclude: [ + ...extraSvelteConfig.optimizeDeps.exclude, + ...extraDepsConfig.optimizeDeps.exclude.filter( + (dep) => !isDepIncluded(dep, extraSvelteConfig.optimizeDeps.include) + ) + ] + }; + + extraViteConfig.ssr = { + external: [ + ...extraSvelteConfig.ssr.external, + ...extraDepsConfig.ssr.external.filter( + (dep) => !isDepNoExternaled(dep, extraSvelteConfig.ssr.noExternal) + ) + ], + noExternal: [ + ...extraSvelteConfig.ssr.noExternal, + ...extraDepsConfig.ssr.noExternal.filter( + (dep) => !isDepExternaled(dep, extraSvelteConfig.ssr.external) + ) + ] + }; + + // handle prebundling for svelte files + if (options.prebundleSvelteLibraries) { + extraViteConfig.optimizeDeps = { + ...extraViteConfig.optimizeDeps, + // Experimental Vite API to allow these extensions to be scanned and prebundled + extensions: options.extensions ?? ['.svelte'], + // Add esbuild plugin to prebundle Svelte files. + // Currently a placeholder as more information is needed after Vite config is resolved, + // the real Svelte plugin is added in `patchResolvedViteConfig()` + esbuildOptions: { + plugins: [ + { name: facadeEsbuildSveltePluginName, setup: () => {} }, + { name: facadeEsbuildSvelteModulePluginName, setup: () => {} } + ] + } + }; + } + + // enable hmrPartialAccept if not explicitly disabled + if (config.experimental?.hmrPartialAccept !== false) { + log.debug('enabling "experimental.hmrPartialAccept" in vite config', undefined, 'config'); + extraViteConfig.experimental = { hmrPartialAccept: true }; + } + validateViteConfig(extraViteConfig, config, options); + return extraViteConfig; +} + +/** + * @param {Partial} extraViteConfig + * @param {import('vite').UserConfig} config + * @param {import('../types/options.d.ts').PreResolvedOptions} options + */ +function validateViteConfig(extraViteConfig, config, options) { + const { prebundleSvelteLibraries, isBuild } = options; + if (prebundleSvelteLibraries) { + /** @type {(option: 'dev' | 'build' | boolean)=> boolean} */ + const isEnabled = (option) => option !== true && option !== (isBuild ? 'build' : 'dev'); + /** @type {(name: string, value: 'dev' | 'build' | boolean, recommendation: string)=> void} */ + const logWarning = (name, value, recommendation) => + log.warn.once( + `Incompatible options: \`prebundleSvelteLibraries: true\` and vite \`${name}: ${JSON.stringify( + value + )}\` ${isBuild ? 'during build.' : '.'} ${recommendation}` + ); + const viteOptimizeDepsDisabled = config.optimizeDeps?.disabled ?? 'build'; // fall back to vite default + const isOptimizeDepsEnabled = isEnabled(viteOptimizeDepsDisabled); + if (!isBuild && !isOptimizeDepsEnabled) { + logWarning( + 'optimizeDeps.disabled', + viteOptimizeDepsDisabled, + 'Forcing `optimizeDeps.disabled: "build"`. Disable prebundleSvelteLibraries or update your vite config to enable optimizeDeps during dev.' + ); + if (!extraViteConfig.optimizeDeps) { + extraViteConfig.optimizeDeps = {}; + } + extraViteConfig.optimizeDeps.disabled = 'build'; + } else if (isBuild && isOptimizeDepsEnabled) { + logWarning( + 'optimizeDeps.disabled', + viteOptimizeDepsDisabled, + 'Disable optimizeDeps or prebundleSvelteLibraries for build if you experience errors.' + ); + } + } +} + +/** + * @param {import('../types/options.d.ts').PreResolvedOptions} options + * @param {import('vite').UserConfig} config + * @returns {Promise} + */ +async function buildExtraConfigForDependencies(options, config) { + // extra handling for svelte dependencies in the project + const packagesWithoutSvelteExportsCondition = new Set(); + const depsConfig = await crawlFrameworkPkgs({ + root: options.root, + isBuild: options.isBuild, + viteUserConfig: config, + isFrameworkPkgByJson(pkgJson) { + let hasSvelteCondition = false; + if (typeof pkgJson.exports === 'object') { + // use replacer as a simple way to iterate over nested keys + JSON.stringify(pkgJson.exports, (key, value) => { + if (SVELTE_EXPORT_CONDITIONS.includes(key)) { + hasSvelteCondition = true; + } + return value; + }); + } + const hasSvelteField = !!pkgJson.svelte; + if (hasSvelteField && !hasSvelteCondition) { + packagesWithoutSvelteExportsCondition.add(`${pkgJson.name}@${pkgJson.version}`); + } + return hasSvelteCondition || hasSvelteField; + }, + isSemiFrameworkPkgByJson(pkgJson) { + return !!pkgJson.dependencies?.svelte || !!pkgJson.peerDependencies?.svelte; + }, + isFrameworkPkgByName(pkgName) { + const isNotSveltePackage = isCommonDepWithoutSvelteField(pkgName); + if (isNotSveltePackage) { + return false; + } else { + return undefined; + } + } + }); + if ( + !options.experimental?.disableSvelteResolveWarnings && + packagesWithoutSvelteExportsCondition?.size > 0 + ) { + log.warn( + `WARNING: The following packages have a svelte field in their package.json but no exports condition for svelte.\n\n${[ + ...packagesWithoutSvelteExportsCondition + ].join('\n')}\n\nPlease see ${FAQ_LINK_MISSING_EXPORTS_CONDITION} for details.` + ); + } + log.debug('extra config for dependencies generated by vitefu', depsConfig, 'config'); + + if (options.prebundleSvelteLibraries) { + // prebundling enabled, so we don't need extra dependency excludes + depsConfig.optimizeDeps.exclude = []; + // but keep dependency reinclusions of explicit user excludes + const userExclude = config.optimizeDeps?.exclude; + depsConfig.optimizeDeps.include = !userExclude + ? [] + : depsConfig.optimizeDeps.include.filter((dep) => { + // reincludes look like this: foo > bar > baz + // in case foo or bar are excluded, we have to retain the reinclude even with prebundling + return ( + dep.includes('>') && + dep + .split('>') + .slice(0, -1) + .some((d) => isDepExcluded(d.trim(), userExclude)) + ); + }); + } + if (options.disableDependencyReinclusion === true) { + depsConfig.optimizeDeps.include = depsConfig.optimizeDeps.include.filter( + (dep) => !dep.includes('>') + ); + } else if (Array.isArray(options.disableDependencyReinclusion)) { + const disabledDeps = options.disableDependencyReinclusion; + depsConfig.optimizeDeps.include = depsConfig.optimizeDeps.include.filter((dep) => { + if (!dep.includes('>')) return true; + const trimDep = dep.replace(/\s+/g, ''); + return disabledDeps.some((disabled) => trimDep.includes(`${disabled}>`)); + }); + } + + log.debug('post-processed extra config for dependencies', depsConfig, 'config'); + + return depsConfig; +} + +/** + * @param {import('vite').UserConfig} config + * @returns {import('vite').UserConfig & { optimizeDeps: { include: string[], exclude:string[] }, ssr: { noExternal:(string|RegExp)[], external: string[] } } } + */ +function buildExtraConfigForSvelte(config) { + // include svelte imports for optimization unless explicitly excluded + /** @type {string[]} */ + const include = []; + /** @type {string[]} */ + const exclude = []; + if (!isDepExcluded('svelte', config.optimizeDeps?.exclude ?? [])) { + const svelteImportsToInclude = SVELTE_IMPORTS.filter( + (si) => !(si.endsWith('/server') || si.includes('/server/')) + ); + log.debug( + `adding bare svelte packages to optimizeDeps.include: ${svelteImportsToInclude.join(', ')} `, + undefined, + 'config' + ); + include.push(...svelteImportsToInclude); + } else { + log.debug( + '"svelte" is excluded in optimizeDeps.exclude, skipped adding it to include.', + undefined, + 'config' + ); + } + /** @type {(string | RegExp)[]} */ + const noExternal = []; + /** @type {string[]} */ + const external = []; + // add svelte to ssr.noExternal unless it is present in ssr.external + // so it is correctly resolving according to the conditions in sveltes exports map + if (!isDepExternaled('svelte', config.ssr?.external ?? [])) { + noExternal.push('svelte', /^svelte\//); + } + // esm-env needs to be bundled by default for the development/production condition + // be properly used by svelte + if (!isDepExternaled('esm-env', config.ssr?.external ?? [])) { + noExternal.push('esm-env'); + } + return { optimizeDeps: { include, exclude }, ssr: { noExternal, external } }; +} + +/** + * @param {import('vite').ResolvedConfig} viteConfig + * @param {import('../types/options.d.ts').ResolvedOptions} options + */ +export function patchResolvedViteConfig(viteConfig, options) { + if (options.preprocess) { + for (const preprocessor of arraify(options.preprocess)) { + if (preprocessor.style && '__resolvedConfig' in preprocessor.style) { + preprocessor.style.__resolvedConfig = viteConfig; + } + } + } + + // replace facade esbuild plugin with a real one + const facadeEsbuildSveltePlugin = viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( + (plugin) => plugin.name === facadeEsbuildSveltePluginName + ); + if (facadeEsbuildSveltePlugin) { + Object.assign(facadeEsbuildSveltePlugin, esbuildSveltePlugin(options)); + } + const facadeEsbuildSvelteModulePlugin = viteConfig.optimizeDeps.esbuildOptions?.plugins?.find( + (plugin) => plugin.name === facadeEsbuildSvelteModulePluginName + ); + if (facadeEsbuildSvelteModulePlugin) { + Object.assign(facadeEsbuildSvelteModulePlugin, esbuildSvelteModulePlugin(options)); + } +} + +/** + * Mutates `config` to ensure `resolve.mainFields` is set. If unset, it emulates Vite's default fallback. + * @param {string} name + * @param {import('vite').EnvironmentOptions} config + * @param {{ isSsrTargetWebworker?: boolean }} opts + */ +export function ensureConfigEnvironmentMainFields(name, config, opts) { + config.resolve ??= {}; + if (config.resolve.mainFields == null) { + if (config.consumer === 'client' || name === 'client' || opts.isSsrTargetWebworker) { + config.resolve.mainFields = [...defaultClientMainFields]; + } else { + config.resolve.mainFields = [...defaultServerMainFields]; + } + } + return true; +} + +/** + * Mutates `config` to ensure `resolve.conditions` is set. If unset, it emulates Vite's default fallback. + * @param {string} name + * @param {import('vite').EnvironmentOptions} config + * @param {{ isSsrTargetWebworker?: boolean }} opts + */ +export function ensureConfigEnvironmentConditions(name, config, opts) { + config.resolve ??= {}; + if (config.resolve.conditions == null) { + if (config.consumer === 'client' || name === 'client' || opts.isSsrTargetWebworker) { + config.resolve.conditions = [...defaultClientConditions]; + } else { + config.resolve.conditions = [...defaultServerConditions]; + } + } +} + +/** + * @template T + * @param {T | T[]} value + * @returns {T[]} + */ +function arraify(value) { + return Array.isArray(value) ? value : [value]; +}