From 722eff145f02f76413960066d9c82aeabef579ce Mon Sep 17 00:00:00 2001 From: Jarle Mathiesen Date: Fri, 20 Sep 2024 14:55:58 +0200 Subject: [PATCH 01/62] docs: Add "YouTube Summarized" to homepage (#986) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index 8694d27c..b31b9161 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -39,6 +39,7 @@ const chromeExtensionIds = [ 'lnhejcpclabmbgpiiomjbhalblnnbffg', // 1Proompt 'fonflmjnjbkigocpoommgmhljdpljain', // NiceTab - https://github.com/web-dahuyou/NiceTab 'fcffekbnfcfdemeekijbbmgmkognnmkd', // Draftly for LinkedIn + 'nkndldfehcidpejfkokbeghpnlbppdmo', // YouTube Summarized - Summarize any YouTube video ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From db60e79a995d822f51fe89f268f1c49e26f22348 Mon Sep 17 00:00:00 2001 From: renxinyan <43518143+renxinyan@users.noreply.github.com> Date: Sun, 22 Sep 2024 08:03:07 +0800 Subject: [PATCH 02/62] docs: Correct the type example of `allFrames` (#988) --- docs/guide/directory-structure/entrypoints/content-scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/directory-structure/entrypoints/content-scripts.md b/docs/guide/directory-structure/entrypoints/content-scripts.md index 41982076..5ad58331 100644 --- a/docs/guide/directory-structure/entrypoints/content-scripts.md +++ b/docs/guide/directory-structure/entrypoints/content-scripts.md @@ -24,7 +24,7 @@ export default defineContentScript({ excludeMatches: undefined | [], includeGlobs: undefined | [], excludeGlobs: undefined | [], - allFrames: undefined | [], + allFrames: undefined | true | false, runAt: undefined | 'document_start' | 'document_end' | 'document_idle', matchAboutBlank: undefined | true | false, matchOriginAsFallback: undefined | true | false, From a82c7cbf71c5bc7bcfe7970224077eadd36226ef Mon Sep 17 00:00:00 2001 From: Okinea Dev <81070564+okineadev@users.noreply.github.com> Date: Sun, 22 Sep 2024 16:45:30 +0300 Subject: [PATCH 03/62] docs: Improved docs and links (#970) Co-authored-by: Aaron --- CONTRIBUTING.md | 4 ++-- README.md | 32 +++++++++++++++++++++++++------- packages/wxt/README.md | 35 +++++++++++++++++++++++++++-------- scripts/generate-readmes.sh | 9 +++++++++ 4 files changed, 63 insertions(+), 17 deletions(-) create mode 100755 scripts/generate-readmes.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58eb4541..fbe6fdc3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -Everyone is welcome to contribute to WXT! +Everyone is welcome to contribute to **WXT**! If you are changing the docs or fixing a bug, feel free to fork and open a PR. @@ -139,7 +139,7 @@ Releases are done with GitHub actions: Use [`taze`](https://www.npmjs.com/package/taze) to upgrade dependencies throughout the entire monorepo. -```ts +```sh pnpm dlx taze -r ``` diff --git a/README.md b/README.md index 5daaef45..3808327c 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@

- WXT Logo + WXT Logo WXT

- npm + npm version - npm + downloads - NPM + license | MIT - Codecov + coverage

@@ -43,10 +43,21 @@ https://github.com/wxt-dev/wxt/assets/10101283/4d678939-1bdb-495c-9c36-3aa281d84 Bootstrap a new project: + + ```sh -pnpm dlx wxt@latest init +# npm +npx wxt@latest init + +# pnpm +pnpm dlx wxt@latest init + +# bun +bunx wxt@latest init ``` + + Or see the [installation guide](https://wxt.dev/guide/installation.html) to get started with WXT. ## Features @@ -66,6 +77,13 @@ Or see the [installation guide](https://wxt.dev/guide/installation.html) to get ## Contributors + + +Published under the [MIT](https://github.com/wxt-dev/wxt/blob/main/LICENSE) license. +Made by [@aklinker1](https://github.com/aklinker1) and [community](https://github.com/wxt-dev/wxt/graphs/contributors) 💛 +

- + + + diff --git a/packages/wxt/README.md b/packages/wxt/README.md index a34a8f8e..f629dbd0 100644 --- a/packages/wxt/README.md +++ b/packages/wxt/README.md @@ -1,16 +1,17 @@ +

- WXT Logo + WXT Logo WXT

- npm + npm version - npm + downloads - NPM + license | MIT - Codecov + coverage

@@ -18,7 +19,7 @@

- It's like Nuxt, but for Chrome Extensions + It's like Nuxt, but for Web Extensions

@@ -43,10 +44,21 @@ https://github.com/wxt-dev/wxt/assets/10101283/4d678939-1bdb-495c-9c36-3aa281d84 Bootstrap a new project: + + ```sh -pnpm dlx wxt@latest init +# npm +npx wxt@latest init + +# pnpm +pnpm dlx wxt@latest init + +# bun +bunx wxt@latest init ``` + + Or see the [installation guide](https://wxt.dev/guide/installation.html) to get started with WXT. ## Features @@ -66,6 +78,13 @@ Or see the [installation guide](https://wxt.dev/guide/installation.html) to get ## Contributors + + +Published under the [MIT](https://github.com/wxt-dev/wxt/blob/main/LICENSE) license. +Made by [@aklinker1](https://github.com/aklinker1) and [community](https://github.com/wxt-dev/wxt/graphs/contributors) 💛 +

- + + + diff --git a/scripts/generate-readmes.sh b/scripts/generate-readmes.sh new file mode 100755 index 00000000..fc8b4f1e --- /dev/null +++ b/scripts/generate-readmes.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# +# Generate code in README.md and sync it with wxt/packages/README.md for NPM +# + +pnpm dlx automd +echo "" > packages/wxt/README.md +cat README.md >> packages/wxt/README.md From efcb593718edf9c648c6dd4876f23a180097550e Mon Sep 17 00:00:00 2001 From: 1natsu <1natsu172@users.noreply.github.com> Date: Sun, 22 Sep 2024 23:12:29 +0900 Subject: [PATCH 04/62] perf: Reduce hypersensitive onChange of watcher (#978) Co-authored-by: Aaron --- packages/wxt/package.json | 4 +++- packages/wxt/src/core/create-server.ts | 8 +++++++- .../src/core/utils/__tests__/number.test.ts | 18 ++++++++++++++++++ .../src/core/utils/building/resolve-config.ts | 5 +++++ packages/wxt/src/core/utils/env.ts | 10 ++++++++++ packages/wxt/src/core/utils/number.ts | 4 ++++ packages/wxt/src/types.ts | 19 +++++++++++++++++++ pnpm-lock.yaml | 10 ++++++---- 8 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 packages/wxt/src/core/utils/__tests__/number.test.ts create mode 100644 packages/wxt/src/core/utils/env.ts create mode 100644 packages/wxt/src/core/utils/number.ts diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 9ff7f4d8..d2755dfa 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -81,8 +81,8 @@ "prepack": "pnpm build" }, "dependencies": { - "@types/chrome": "^0.0.269", "@aklinker1/rollup-plugin-visualizer": "5.12.0", + "@types/chrome": "^0.0.269", "@types/webextension-polyfill": "^0.10.7", "@webext-core/fake-browser": "^1.3.1", "@webext-core/isolated-element": "^1.1.2", @@ -95,6 +95,7 @@ "consola": "^3.2.3", "defu": "^6.1.4", "dequal": "^2.0.3", + "dotenv": "^16.4.5", "esbuild": "^0.23.0", "execa": "^9.3.1", "fast-glob": "^3.3.2", @@ -116,6 +117,7 @@ "ohash": "^1.1.3", "open": "^10.1.0", "ora": "^8.1.0", + "perfect-debounce": "^1.0.0", "picocolors": "^1.0.1", "prompts": "^2.4.2", "publish-browser-extension": "^2.1.3", diff --git a/packages/wxt/src/core/create-server.ts b/packages/wxt/src/core/create-server.ts index d680d82a..aa834ae0 100644 --- a/packages/wxt/src/core/create-server.ts +++ b/packages/wxt/src/core/create-server.ts @@ -1,3 +1,4 @@ +import { debounce } from 'perfect-debounce'; import { BuildStepOutput, EntrypointGroup, @@ -144,7 +145,7 @@ function createFileReloader(server: WxtDevServer) { const fileChangedMutex = new Mutex(); const changeQueue: Array<[string, string]> = []; - return async (event: string, path: string) => { + const cb = async (event: string, path: string) => { changeQueue.push([event, path]); await fileChangedMutex.runExclusive(async () => { @@ -216,6 +217,11 @@ function createFileReloader(server: WxtDevServer) { } }); }; + + return debounce(cb, wxt.config.dev.server!.watchDebounce, { + leading: true, + trailing: false, + }); } /** diff --git a/packages/wxt/src/core/utils/__tests__/number.test.ts b/packages/wxt/src/core/utils/__tests__/number.test.ts new file mode 100644 index 00000000..ae345096 --- /dev/null +++ b/packages/wxt/src/core/utils/__tests__/number.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from 'vitest'; +import { safeStringToNumber } from '../number'; + +describe('Number Utils', () => { + describe('safeStringToNumber', () => { + it.each([ + { arg: '1000', expected: 1000 }, + { arg: '', expected: 0 }, + { arg: '12abc', expected: null }, + { arg: undefined, expected: null }, + ])( + 'should be safely converted from string to number: safeStringToNumber($arg) -> $expected', + ({ arg, expected }) => { + expect(safeStringToNumber(arg)).toBe(expected); + }, + ); + }); +}); diff --git a/packages/wxt/src/core/utils/building/resolve-config.ts b/packages/wxt/src/core/utils/building/resolve-config.ts index aebfa516..591e7452 100644 --- a/packages/wxt/src/core/utils/building/resolve-config.ts +++ b/packages/wxt/src/core/utils/building/resolve-config.ts @@ -25,6 +25,8 @@ import { normalizePath } from '../paths'; import glob from 'fast-glob'; import { builtinModules } from '../../../builtin-modules'; import { getEslintVersion } from '../eslint'; +import { safeStringToNumber } from '../number'; +import { loadEnv } from '../env'; /** * Given an inline config, discover the config file if necessary, merge the results, resolve any @@ -72,6 +74,8 @@ export async function resolveConfig( const mode = mergedConfig.mode ?? COMMAND_MODES[command]; const env: ConfigEnv = { browser, command, manifestVersion, mode }; + loadEnv(mode); // Load any environment variables used below + const root = path.resolve( inlineConfig.root ?? userConfig.root ?? process.cwd(), ); @@ -124,6 +128,7 @@ export async function resolveConfig( devServerConfig = { port, hostname: mergedConfig.dev?.server?.hostname ?? 'localhost', + watchDebounce: safeStringToNumber(process.env.WXT_WATCH_DEBOUNCE) ?? 800, }; } diff --git a/packages/wxt/src/core/utils/env.ts b/packages/wxt/src/core/utils/env.ts new file mode 100644 index 00000000..27127c06 --- /dev/null +++ b/packages/wxt/src/core/utils/env.ts @@ -0,0 +1,10 @@ +import { config } from 'dotenv'; + +/** + * Load environment files based on the current mode. + */ +export function loadEnv(mode: string) { + return config({ + path: [`.env`, `.env.local`, `.env.${mode}`, `.env.${mode}.local`], + }); +} diff --git a/packages/wxt/src/core/utils/number.ts b/packages/wxt/src/core/utils/number.ts new file mode 100644 index 00000000..ef752a22 --- /dev/null +++ b/packages/wxt/src/core/utils/number.ts @@ -0,0 +1,4 @@ +export function safeStringToNumber(str: string | undefined): number | null { + const num = Number(str); + return isNaN(num) ? null : num; +} diff --git a/packages/wxt/src/types.ts b/packages/wxt/src/types.ts index a95c3fff..2986f9f9 100644 --- a/packages/wxt/src/types.ts +++ b/packages/wxt/src/types.ts @@ -1277,6 +1277,25 @@ export interface ResolvedConfig { server?: { port: number; hostname: string; + /** + * The milliseconds to debounce when a file is saved before reloading. + * The only way to set this option is to set the `WXT_WATCH_DEBOUNCE` + * environment variable, either globally (like in `.bashrc` file) or + * per-project (in `.env` file). + * + * For example: + * ``` + * # ~/.zshrc + * export WXT_WATCH_DEBOUNCE=1000 + * ``` + * or + * ``` + * # .env + * WXT_WATCH_DEBOUNCE=1000 + * ``` + * @default 800 + */ + watchDebounce: number; }; reloadCommand: string | false; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 602ac57c..49ce96fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -305,6 +305,9 @@ importers: dequal: specifier: ^2.0.3 version: 2.0.3 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 esbuild: specifier: ^0.23.0 version: 0.23.0 @@ -368,6 +371,9 @@ importers: ora: specifier: ^8.1.0 version: 8.1.0 + perfect-debounce: + specifier: ^1.0.0 + version: 1.0.0 picocolors: specifier: ^1.0.1 version: 1.0.1 @@ -2691,12 +2697,10 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} - deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2846,7 +2850,6 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4030,7 +4033,6 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: From 4a1bd41df9f26de337e1c9573e5794518be0a726 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sun, 22 Sep 2024 14:20:12 +0000 Subject: [PATCH 05/62] chore(release): wxt v0.19.10 --- packages/wxt/CHANGELOG.md | 28 ++++++++++++++++++++++++++++ packages/wxt/package.json | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/wxt/CHANGELOG.md b/packages/wxt/CHANGELOG.md index 586810b4..4acc1808 100644 --- a/packages/wxt/CHANGELOG.md +++ b/packages/wxt/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## v0.19.10 + +[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.9...wxt-v0.19.10) + +### 🔥 Performance + +- Reduce hypersensitive onChange of watcher ([#978](https://github.com/wxt-dev/wxt/pull/978)) + +### 🩹 Fixes + +- Fix config manifest type ([#973](https://github.com/wxt-dev/wxt/pull/973)) + +### 📖 Documentation + +- Examples reference outDir vs. outputDir ([#982](https://github.com/wxt-dev/wxt/pull/982)) +- Improved docs and links ([#970](https://github.com/wxt-dev/wxt/pull/970)) + +### 🌊 Types + +- Fix `ExtensionRunnerConfig.chromiumPref` type ([fda1e18](https://github.com/wxt-dev/wxt/commit/fda1e18)) + +### ❤️ Contributors + +- 1natsu ([@1natsu172](http://github.com/1natsu172)) +- Okinea Dev ([@okineadev](http://github.com/okineadev)) +- The-syndrome +- Hikiko4ern ([@hikiko4ern](http://github.com/hikiko4ern)) + ## v0.19.9 [compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.8...wxt-v0.19.9) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index d2755dfa..f423f48f 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -1,7 +1,7 @@ { "name": "wxt", "type": "module", - "version": "0.19.9", + "version": "0.19.10", "description": "Next gen framework for developing web extensions", "repository": { "type": "git", From 247cd66f74d686d46b081577b3ffe8fe467fdc97 Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Thu, 26 Sep 2024 03:08:54 +0200 Subject: [PATCH 06/62] feat(zip): hooks (#993) Co-authored-by: Timeraa Co-authored-by: Aaron --- docs/assets/init-demo.gif | Bin 140518 -> 139656 bytes packages/wxt/e2e/tests/hooks.test.ts | 57 +++++++++++++++++++++++++++ packages/wxt/src/core/zip.ts | 10 ++++- packages/wxt/src/types.ts | 38 ++++++++++++++++++ 4 files changed, 103 insertions(+), 2 deletions(-) diff --git a/docs/assets/init-demo.gif b/docs/assets/init-demo.gif index dda435d49c7fa7a076edb6c24d6feb9636c5417a..474db34c2e2bf5c7a3d456c330fddd6e33b41a1b 100644 GIT binary patch delta 128787 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℞ChY$yb&4CXx7`NY3WSYh}d4iwh^m~d- zT=iQS{;vh4vV+ZR!b&zT9^Bv0S#Om&%VXmr*RClJf1*E}oqxPv!MSY?L()Ohi5jk- zW(OQfIW=AGXJkgDP@30FliYiAUIs1qnrB+ubmV663-?8iy}z7SebKnE%y7O_s#R!K z@T%~&T1R(Te|ytUfdq5 zum7G}-^fomV8$x1w&zAc(h&nu`!t)Ig->Rx%4FR;vvc#|29RI;5q>cmMt&Lc@d8O> Iy^M_304q&13jhEB delta 129628 zcmeA;%<=3bN4mSGn}ua!1*-z{_y2~BK0ZwH@=WS#Ox@i~3l}oS#W9zbvY48(ZrH$X z#KNJ<#>vUadF&Y1wQD@Q+Z_LgIWvvf{#Gq9WpAB2oe((vo7L zVqy{^;@r04VycsSn5F6kC8hZ!Wtk<-c%-DHq@|^0_}pZ~#bv~0WJQ(afgvOUz*kWyMWxaH%jjgS1SGR+MgM*`$gQKIPlcTeJu_4D;xywIP=*5BVRV53K1U|_I+KybKKNU2?DXlR(_ny|3& zuz07)$jGRusHp1j==$jB7|*G(k#enEcziH!V{>4n>~i;9YhW4D%+mX_7} zlwHXyFE1~j>`}g|sG_o>s;a8$SV?urr|R0;>Xzo3nwr}9tF^WDwRLrMbqBi|44fJo z8XB6K8XFs%&ek+1ylHN3Zf|*8W2TYU%$YN1&z?OewP^0#xr-Ms zUV5@<)v8sicQ~)xTDWP`ruxl(i??jsykp0X9mgYgd8h8(yZ2B`$)WtshYlS&bfM@- zLiv%@nq$Y0pFDZ;)TvXaPM(_5wzkU-8Zr{0m=V|Pn z*Clts;Qsyl_g_zV9DnxlpWetXtp|CTprwm+No`TU+;3STZ5ygl=I%?+ltCaax=*A}mFw|@QkQpj{I z6E+cz1zVZ;LN09aa&w4;@}Z+AA>{|HUW#?pd0S?(e>Z%&gpV+WO7~d z|Kl;~E{#v+Qm!f=7}%V&dkU}oUi16Y;|cD1Kc7qq&-?jwM*6y+&*rGFna=FCV?Fa7=MRjIC7)xA?>&j$B|HLo{j}d z+#bj59z5jGRcV&_y5qRjs*hb-J_{NGlJDFQIdRCfcLB#MZ8;X@88&_*iA>^4PB7KC z6!I55Xp;Q?z|HjkfscLF8y-v8T$p-BqWyrF)yDvNkHb96J)FaqJY?h-xaCrI!#UsM zut?bgXQjH2y_Hj(g#`i{8I89cQr{IApcHUKMb6{+*j7>so3}bz37OVUXX|j&0-_&>Vw6d_s116yh+3jCfxa+taFcfq+ zzjDk9TInux9>ZE&~j=J?}+Kw|z^~x)a_QZUe&UfUo^pgb)LKQ`EF)8iJ zVjpz5RUS%w{=g<7TNg313IBaX^%R)j^Gvqpma4zl74>D2#Mu>Y=BF<9Ref2k zz`N4J-Rsh%SznfD_^$M_^ztiC5}JEd#nJh(<@u_6o8|7GXlDJvxx4lO*8*+cRRQf@ zR~AWqUE$%oDrowtE6c3Dt_0D^*f|VGe&gAoBHIVA{$n?cGj4#Nxr%=a<=Kdt-nP5wKbU3RXBV&Zxt|I`1IKJ z3Fo!O4$=9)Vv?>X{k(qa7$*zQlm*_C-5t4~1Z;dZL*3D20!z|^D}1SM)pc^yZeH7! z$s*R__^WGqB^#Qh!W@ur%w|_$8~>ZBkyA?77F`ahZ{&4Z(D-Jx zt`gTn8=f@_R+rt)HJY@bktu2c&yxyvvz7-QSLN3Bp7vco(<-u2LZnG}{*NOn&#XKB zJsycvc`$x4IOJN;z$|7K;K<|9z?yo7S@u+eLuK`>n6Fk6KH=34OiB~joIMVeOg3U6)F-f8?|9hu&glUiY{z~h?YL-I^HZPt z7h0xovt@R!Ru+$)ApV)>Tx;K#x$jm9xXTBensjch~}!)c3VnrUO@oMzg@a@Jx+(tBqUvw$0pR-pKi3*Y$k1tsAEI zDo@@kbZn`}@-54K-)2SszIEeV*>kNhqxke5$&K|_w(U6X`>tsA?>jI2%6DW5H+zRX zy8EGT`<{nuJ57BQ)}A@HeU8@yhSxuL-)H#0{Q&2R_f67&9&q^YI3#}VL!0%VhXVaO zj;Q;6?27*LNaFmCW9I)PR#p9ZtiZqXguCCTNwfbv(fIGb^Hlh`Pm3QdeQMCZ^Gv$m z=UKP^JhM2z^IZA9`p?rp|9S4fzw1J~-k0t|&W+RJclZa+B3t@#B%~m^_ZEiF(b2QpXv^ZI` zxJ0xBmp6ONXz|+7;&Y?L??+33L~D>mYe+HLfkgXNwidUD`u4Jl_KF$p8t&~?H`?odv^Pj}sIs=TM0B)i z$TrRB=-ScIbEAX%|Izk7iOxwDol|Z!Pl)K8F{5+Vj!xE!&N)9i7f5t1;;5Ks(Y36i zYsHK%-|((gH@epS=-P0jXpKbomWb|c72RH@-8*)4@43;vZ%1IeM9(3Mo+A-G$0~YG z%&6}1mF|6@k~uO0n=ZuI~A(a#_`fyr_LOXLK$$_X4Z zCvfeYz;kl~-_HpGk`sk2CyGQ)6sznhnlVvo=R}#C6YJ$XEwg`2RI;3;5;;k&a?($s zNg6vR>D-*8_j6Ltib)2RlT9Kgn^jJ}@xN@M)y~N_Hz(WuoXpxj*~xN>OXL){lh#I+ zQ@nOg@wqw0@1>!G9Wc?S5=_QfVyEyvGW=^l#IbB3zdfm_IcfzMNS~05ei~idIrrYrxep}g@%}HKGuceYvYu<# z0-jq7_+36JTL0IQ`TTywmumPT+XhwfS$Q?(>0>ekW(sbv#qE=`GAmR7YaW7e{)UCVNA zEzA40tUzjck=62&sO4o<%PVFruiCY|=GOAMU&|Y$Ry0|yX!+HYRJEc*YEJyD6+QoN zt$69t*C(}dlGU;aRx77ft^5+PV)BX~y7fC|t=_e3^`2X+_x)OZKx)k)t2IZW*6=m0 zJTYs{n;k1o-CA?5tMkmSHJ7Z`mPf9Csey#g(O7*7I`Y*rwu0^f?F>C$REb(8r*8k(`xcF;5ll2A;iS=yV z>sV%Q;5yyRSigG%-|r3Y%QpyluM>#gDE7L6w|b-0?v2IMH_H6psGwacC%s7}dXt;^ zMvd8SZ{HO-r`oh z#bfpsuiaaGZg27Xy(K_;tBlsXkm#*p)m#5xnj5iuYs~Gfq1sy$>ZP|OS#L{;-j-Iq zEo1h!tlirpUTw|$y{&+IUX=9qlIZPa-qY-)w^Z%kt~z~t&F}3E+MzktJ6fW5v{mou zn7yNG_l`vA9euxd*gW4p!FuPE)j^Y@cg~o-Q=xR{tlK;1We4_1?^?%c6^_X_Xb`+n~}AianG*zP0Id&HOS zJ~n&Lgzi13Zttl-z2}_tUI*`!y{0{g}P~*Y5p)Ztws1dq0EB0VbOR3Q7Cf zY7TJJ)KB^}`vA|K1AK2PU##9Iq_aWL=AhV|^(=D^O6@r)bLXJkpMwfAhm>p%sl*&o zt2v}G=aAN(Lppa3>DB0n%N(8?eb6Z8@MW*VW^)do>N;$7=kT;&haApKu(LVhc>1tQ z&5?GgBVK!s_}n?-_vc7}%+Vm5qaiUz!)lI}Hyw%c+2pq8XnmZ`(%3&olin=-Zgnip z=U{5hv8$k<6A!G zct_0a_WyHE^t_o>^ykC`nUj-jPELtAIj!d8j5#M~?KwH;&dGT;t-Ug*X6!n#DCShn z&yy?WoLaT#)S5e|*8MrvA9KQZlg;TZGJcIQr+3Uby=#x<_C2Tf{W*PLkI`P4Ge=_1 z9Mdt}Fz3vvJ!j6`IdksMnF}&!FWH=(yhuz%vMBA;yE7}6{5ki@rvFXM`ENDnf6O`m zYtQ*VlkbbkiU`PF6tcZ2A}jd0=3-RpIKuQ$lvXtKT05__Yq_D09t8(n*E^xVDC_xHvG*_)GWZ%&E5Ij#2Q zjJY>w`L1JRob2eYJo&J=Nd2ronlUFfBpx;r=JA@-abclrcaoCd9g7PGmv$?Nr#6fl}Oj_hKm)HH<7tSjSFDzuQ7YnTr(R7^b zJ@Zq^t-zO;mW6~m^hSMNc73YlVz1DjSF-WDq?nG(q0)QWik|!F&%SsHGbescyuRVIp)gb8p%&JNB}X@hXF747EmNN$ z`f=7=8$;f6NGFdgzVi(f#g635Io2P^F2B>#u);p+ zkX+6?PQkcXhtwnYYk$5CpI^_g&s-tZp zk_r3k1%EDb5IDl28YQzS`MkN)6bAv8x{|}^4a57wC-7yg3kcved~u+eH|yMvCo#E| znt^j?YDx-)g`C{^Jf`+lr_chwpOzV6{+zpn7qz*b%$Vow7k+Z|h2cMgPA`KK zgARip0|Uo@hENU}j|~eBvOWQ)5Jl%|fysteiYz-OiNBq!Amvcsuz`t%g}p#A!{OFs zodDj@l&Pnf72D=|%+q`8Y1Eh;yWT~Z3pS`(%=j>k z&!X(jf*oqnB2K4neq8c$L;V7wCZj8rNmKqybXTZ(Jw7G2L8eqMZmERw3GGsYMgQKE z9C>m5e*Mci*8cl*zX`hhzB~PX-S5yx@(qtU-9-!8W|>~#;yQNOvw<&(^ERb9E6{zm2TLN4u$OZQYI`hG03duI?F;kaqbbdH*O-D4q1 zHa8kRGCCTDO!l)$KXM?cZO+sPKlAe(8=ZKxZwPRg-21=~Gf{1-2cPlP3C=y*M-rIl zTK9K|&*@X0rOYGqZo_0htNeeTZkJqnThV7A+%U1n{LP%5?mTT5EdyF&Z!Ku%Gc&lA zu|RcR#Gz%g^jLbUgi5{JSozE9&OzukUUt!T2U zj2UD61g9O{c(Mp-U$xpNzwW4W(-?aCRm= z6l_{{S=B(^D`Vx8%n1`XwH7gn?ozn5KV|iXmz%%yoSmNW<4a@xP%-zP~#?_+kv= zYrpq~UgJ=H!+xwPdk4D$2XlQ=^8Jbxt}P3ic&uJ9w0!Z5PzYbSaQg!m-hbN@g=GCY zD@t{ZUTE(Sa%d8cQ{aU|7WsQ~m7#4RLE&K5>)In?I z<4(U{5DxJ^3AV}Ge-;S%W^JAylzo&O!G_cwQK znlY8v=7zvw4%H(In)&KiZD`_cKK9_w4Cb4mOpbkKS>Y*RO(vqD%Wuw@8aDIa4$Wm# z7kzmdJU7lVD`;s{)vJJ&U0K&6&6nzzhDL5UCiTkoxXy;gu-;n>JXH^{X}{TUuq@~p zi}c4;PMp_Ft*>uB=eGL*i}oL30dNs8+09>W@;o^au1(-9pLkeHYVvz?iOCK29DI&z zCdsXiNbuae%zK8K?qp|Iqk6xUGS$*MP^-8<{oto?AF ziBBLSp^-zbLV@Ey3(Mqd@^YN-z6>zBWGt7yZ_J>&)`&^WwOyXrSPLYbHM*Wb{;KHv7=5+9%YmYK8u9FW{{`p)K(-gtH~9RViUqHh~IBN+~U zV2OO*aQMI9sWK;}EBnPFJR+UgckC-^J|5FhqKVJf=^n;FX~RVU*=GbNjR+a zt09<^g+-`BG`(o8LTrM7V1_~ym(h&}%^!RvqWu(PW;|$ODU_JoAW{GHOJj%Rv=cMZ zQ><^5sgvrGY|1loHl8Jn!t`3Jr$Qft~jLnYs%v;X4P8)yc0#lSR3WP9a(&a zMU`WUs(9hkh?GF#j=)~qCo_y3d9>Fkw3xiFlzi&2D7Gou>ITPSFQX?7#!F_)3%T6X z+p%#nU&#|5CdD2NGm)_BIveMDzq}(Ej?-*DDXdZs_2w06=CvxxYId0ON}xGpdehXE zy{b!QE#+FpH|2%%aw(6ep)0eGW?fnBb+YQp^j%^t+Hu>MzG|25o%CyI+zGzf;+u3o z8q3-pe3jy;G(9Bg?baJ<*>6=leFEM%Xj>HA*wHc7``u2yH3E|J$|2NEW7? zoTOpBDn;_sqK?@X#joyE8mk?jX`;<_^T6he!1=t5Y;!HXsQN77a@UBxCA2uWH(;^f z(pR5e9bCh?)M-hU;A5_OcJ527e615%JvaP6GD&xJ5|dtP#pg#`jUVbp>?~I8D|yg6 zf8XI>A8uYQKiPPHO#}1q%`Y7yx1PSbq_J3Be-iUzr3cGov@2J1@W!88VYgUyrfuas z$L@Q(wq)Mr+@Y@1@%5JRNg)9-i-rS%%u(!8ZrIdR<3{4&OckYO*m=i=kT}PKb}rrD`vwV{i{U!%#p`_dh$~y zTwqBrN#?h#m=eI0>p0b1pnhNC*Yn~JHWd3wvP~0UHhyy>xry@ScR2fro}82HuVt3=;6g<)uj!$g8D6eSnKQRp9&!?QN%FIay`|hMVBOa_UqE5U z%CwTYMJFdPpQ(81XPLK#;n3uiNk^YMI@(PW;HaK**w5zFiwSeWdW%{gwPbt!>gPQ* zXL5btv?PlYFXzqY5?R^Gx%U5u4r{|{%KXMb8RBA7v{f0ImMlEzBx0kiSDC7Zo@xFQ+c%|Fg)KE@(yKUdKY8BWFBTotY+i=@4HF9aU9PG1s_u!%chmFVP8(L;M z3OuV{u1#p>wW>d&`+YalQG;^#g3k$uo6otWap*eovFZJA;9Grb;)9yaZ?A?YsQ&wM zKkneuip&Y|s+Q|bL*HF_TKjv&PwzR}`zjn4+VkCdX?t+#w|OoL^=7|1^}M8uslfl^bCu_b8B`6JvupAv(o6vkI%^g3sq{xwpN5_TwE$HswBHgWYxiC zHuIxcHA}NDby^I8j=K4hjk&sAEi(0@ZuvDLj56)jIs&oIvJi{7^6+4%*Q)%B)(N;f%Q3iEYdV^yIW zbR{4(*z{(U-kYVH#P8|N`n~$z-gR@e{@tCuxR1ZSIX$&D!ZPmJ(z)MT=S5W|yxO={ z{8(Rfb<(Y~xy2UG-~RoWFM3qeeOk;sqbFYt6i<9D&pX)mSzade*7^PW>;FyvVd&_- z-}1o$CU&)s2TfdR90$4nGqJEt{-!Qhp9ik95)XUu@pw%EciQ@u{O)LMcyzR%%ed&t z3&AI@9ZEr~Vopv{Z824|H!HfZDedfZL;Z6yJ2$5IwJB8w`TW?N7_gANQ!KVZyW(ZSxGb_>Nj>E8cb${%LIP7h{@#ANjg8l??r-(B0~>Fi z*nci@@}h^$d}$vasZLHxY?_ktqfFP~^9^|yQ8BHF*6mBp#53=o@YFU=WRl2ys`vKY z+UtB4wMiyE2OjrEnif>Q+x7qFx3m74uT1LA6J9Pm?|;kdd5q@f=O-9h>_4t*wEQ2j zrbFV!i{egR?mLUlE3Erq%*7&LbBN#A$s$22!noIWWaQz(Y^HEH8N0A9gLy2)WE__RQsFR{s9dDI6Bh zPE76*mWl{qHGVheu#IBDV_QXz zhx7;2LXtk8wRm2$ zS^el=<A8WJJk{GY2r#jiTYnc0K2<{NGuen+y zvE_sIJ^Rd1H3zYsg-RTXXWneAHf?;sV)5WfW3zK*$%&3xGBu%vZF8)P;vG`1e(agM z*Sr2_*i;{ZBVFDfFBx85$kepF_*?yqpBZaoRz8^~?PBx4Sp5A(cJ=#p(=#)zm)`oI zcX&cFJ73qPl8+`w8}t|Lb=#`Yqwt_Xx#Uov^~nvw=Z(!G3=}y2*=`YRY#M06W3U6d)oQY>GWfu)*|9F7M`sD^^J~7oL5(`5ejxxwvpPwPjZ|uoY z|NUw&Z>PltuJ}35@j_>oG@n=2NOM&Q*QtAYxZ-)tA|{CkJA(Vf4D zqU<|E_(V{j%_$4PWnCE?BMxyT9pShWZWwa-++?#irmBH5jT2a=ZMS5zul}Gxf>dc5(T{i zcx+xQaOP1CNNMJ?`D3~wB6ZpV4cB98)@vpPc}hi2jj;5V+HzLUJ2&{!y|T4|Hwh;(MKC(I^VQs_CzG}wFy7j=bXqveN!E6?saLY!@BMM_bhhsYInAgzhRdo22Uw=V zMj$3<>Z;Z^2vlrHIx56(oHk|K0v6Y91@^jt6&siA?+|ugbtGexihI9O(y2L~o1d{w z(v^3+^I`q6^YhJ%^I|qQKJ}X8B)QK-YEo)YhtSL>nV(x8Ug{Q8@X=trlo?td&fBzs zk&RzUQ9&o@Zf)O|I)hRR5ug~o@{;hVoJ@;(O z{EGQSI;)b7va@p=y|!4kK5E991+oqTogqc;jZzD2ib78bugm&$K=5dCvEoTf%nq?cXdUc zItVyD;Q7?79%NE|FX&DD4sm`}SC>d6 z=h-})T<0nKY=KC(sam2h_coK8913j~hnl6jG#;@o{irsvQ(@8ziEah8BVo~*vMG#h zJ(g(~IW)OM!yL`iRy=k!z7!ES!P0L*SU=CMRDnrS_d=iavp7mVoMb$!K7Fz9oW$n# zNiOF+mU`HnSmbZH!)JpNPtGw1fmXY+6hW5C9gqDiFL5}ZnRjT%!sv+_su>s9?T#ez zTfbD9#b^D*Ws=w&->Q(s5mqWnXDvUbX!%?9X>qKWEOs=ZnQzIoSI>%lsx+Q^scw0t zRWCa$Y{}9PcE?q(mTVCdS?#_0S(Mv^wVRq=tzMq=%}QrgB-iWL>!eJ7T;6QN7(J== zg45|7x4SwDFE*;W1f2veX3^U*>jvXNdwJQ{3~6ulF1*|QZWs4KE>OqrhQ17sBS#&i znsl}onEcU6VX}gOQa!`LgH6l%)M^wwgffHXGdt=O7-@)YOgR$sbK}DWEeBS4OpWR& z?7V4S{_Drf;_JOP=ZQ*%ED)^{ddeoh`@~D{<8P*~i9i3Ku6oO&7T?thslSd+^_#!R zF>2BafkQ_FO>6IeuxQx8UX;?P@M6N@<2|QaIHl||Dr{HG-j`w}=gh}h-zaHalxjC4 zc9+vMyPPtyDQ0sww(u8yY2xcUFHaI!@QC!d@Cg3G%1 zR=vGz+|&`mCoe9*bbX%Zl#Bo&iyJqDxogh2vNWlGwVWu6YqvCU~O}*$N!THQuDLWF|g$91;GhWbj#?pX^ zL+TOpQC4vk#a_EZ9EJxuxPK(_wQ_%`c*r5nV)=wMswS$=F8SX)6!T%v^Uftu;SR;(1$IT^QGNtqqb78Y-hy=g$d}k>utNcC1fm zH-9%HY2iYNX(t~TugP5K$SEA6#Bb5(GfQk{&8i0tI{sYDt-O5+hoeM&`+na{(p*~i zpxNl%6DfY{5>=yHfi;phJXh-e3h*+2v!R&JINfJ~_y(Jk(>-bnOw2BDX>lmF@@Xaf zUb9BELvfyZ*0U|)TkJ9q^jhCgnK<3!`8|>PNv!K;DD&%>?O8o}jn))_W|MbIK66J3 zM=WS$73L`y+wv)CDWk;Q6UlsLyDgg7Wy@|XRB-1xykrWO#jWP^mJe!@l`J|P3}W`k zC12I&@Z_1~Q(gG+u)n&F-Wh$zY}JLW5~*_(ON6e}axZsOt!em>yf( zt}}d3`X99yl&)A~d3XoU+~Rs>e!ra`o4Evpjra7rO*wkLp?c&VSpq{dLxa(4vI*=ZoFB*M|Nn%DR7YYIXu&@!{eF z7B8)IefIqNDtdG3@Bg#^<+uF&eEj@s^Y>QCF3(=OFX=xYXMO4W+5Yu;x%L|SMbFIr z7F)8Icl!N?KbqnfwRQ`Z+{v$JVSRqZO@PBgy7Bhk=2lkrsSlVf-%Qy&Klkm*D|5J1 zUnuZezqAoL+-)!^^pUeosf4rYyA6lW86WxL;bS!YhrwfKufUKd-cwIzoSWo*Y;ljU zvt6l@qnVA8ujR)SNq)OC4manA1q*=&8m43}<5hLpc{xCC>Vs#q3s#*BnCLAUGUeIy z^o^0~j^$nM&*y2J@|0Ro!(|mWL+z_&RBww`)PuxES1pNoEs|=POSlV^BsV#zeCEEUy~R~NYiEH*T(293IBui0Sr!5`WRQZg0g%=rQ8;W)RSne1R{R&O@v z&x}v$&eNQ2#Z0}57(13|h#J|x63IHc)MsLpt43+o<>k@bNv5ZQ)X#6$-(7VyQ%u)? zYj9!I6^4V2&8&P1J{pQ*dDm94Ir@BXd_Ga#e=1uoVEcXU^-+2H8$nr%&aBeS>F)$H zZfWIOulREIj=n6n+7;G7O*!jKsSpMENU>)v##5Ct|2J-EdcdM__erJjq-)yF+YHrj zT(w@f?~lrvH>HO+IUad@(ebbGp$6rK4~@JL9gWADGUga|n0zW(%*vtgCwz7=6Q75o z$aIg#^?i1KT2A!aecYj}*ea$bK9fr<;UG`vszhaFvpZ8B_n8all?SIN9C7HeediI( zDIOFO$SRU;lg!_z@M1?$itvR-Ub`DRHXdM)s54-!^L{o%seGbk0jK4!H%W)tSu+`2 z>wK&@MIy8;0!~@}IWW4{3HFRE@0HV7AxMZw!vjGpV_Gu*IzD5O`Wm4iOoqMILqqg z2H}2_N{!2@lk4nmPFi#8<^y))2RoeoOlJLfaHRV|Mqtxy{*6~M91U+QIK0g)VpkKd z%?p9U99NvSEQ+`syiEGmmW8ap(;{jsv!WxO2DPg1eHT{!F6`^R?dwDT*0HWn{*?4W zEb8a1*_RKdtKJDP;TEy_uykrj&c~w?@oPGz1^y%p?NPm>Y80o^pHox<8rz+G++41H zBD5|v2hH=ncrfvBx45F;9ghu4$NITVi=K1{sCabzcUcj0a#N}|d#_Jj471|W)3fyw zPaW|nR`Kk%mhJkYc`^AyyI`jnYn4e#P_w+6$K8xAD-SJX@m6VUcK7D#@>!cCyQ1-& zasJAhnux5cD}AR4|Cw-E-RDHxY^(a)zZU;2d&**S|HEIeB*uK7y|%1=1sfJ@oPA(Z zlF7U`4u`u|CCy)?nYwDq@{}h}JiAR#O?eqQaaG2FJ0VZF!hiiZdF;5}+`Tvc6imL& z-1s%{djE#P!)?5GEX$s>X@5V)ljOPAdE=XpkJ zUTfIc%;xvuegbb0$3h<=uaNsqQX5$B2D8+1By_O1ewXfKj(ou0p|s6(nuFe<8IKx_ zS0y}3&=A|Q(9<$2;kfxXiO;b;Gd;gFirqQ!xmQBI{)ocTDatE8%<0kLd%|G+ZpY_d zqa!Udd(;CO+LNa-Wqx2adv|5px!Io#gpVa@ooZj^py08w+x*>;$II<5p85IMvz%*- z6OWb3EDe6MBL;`2dKQHoS~A5?>%s#0rz=F3No0D7ESD60CA`9^(@JQihi2=NidFY4 zlHx5M8cz|gH$AGCwVH!F#z;ZNbZeB7*t`&>Hye(KS+7y|tohKto_TG;L8cy8?zdYm zdF^HZkBoC#$#LBSCmBWOTH(otRtjv6+b4;CbetS+Wl=BGbVNv4!6Je?(TQ`3?MbJr z292i|c+b;P{l#>M>G+Pg=}jL3J0&e^{=Au3ZN|mbu|0@UyVv4EQ(w%-FEdvkTO(yz z`)!hCrq)l*R8iF=l}*Rr-BdP@zh;y4j89%qT3%_gZdFy2SkAXqnUMwycQk8Vy|MAK z(ub^*Ym{^@Tny){zuwd&Y&CQ9a}BnRjg9IH{@)Q;JZWEkvy4c*eWLHqid8u|4EB{r zI0VeRUNS%T;+gfIA?(vVJ*yap`@sS?${YEXJqVVz7jOfWGdDhW^WEROWwu?~N(QFp zA9FtQnyE~SP%>YZ@ZyfUV(ozkb+ar2kM@{c(m2AkE7xOY_p&+W^&BknESgIuD42vx zg-&^R{bXJL9J2sU1)H=dc?yBkqLi*&eWa3Q_ThmuPw*>?3oNNSg#AtJ9Ml4MPRQdG(?i5t3_+p>Fn@mFJACBez&ON#`z;=oFt8#;&wecl*c& zoGs9*>)2!mQ`yPaY{VIpCcm@su4kC+5xg>JuH3?njESu`_NDw6oAcmE@Rp)qKR#YQ zzAj2fS3quc?Cg-E?6N!V6dn`PjWRv+af;uVYj9GwRqK7Mw}Ptq_?&-1YO`{~T0 zTWgzQ6@2FH2^9O}*TB%oXO@3TXNpJM=A6^4C%;Vne|qzQj|X_oUhpguWOv9^vx+&T-DZ*!d*UE@s=@i3<;NS%{dPZUggtpw6`n6D znj|O^!IRhH#AAFT;qzI`Z&Qj-vN-iUJ$bS-TYBHJGrozUAx*r~Ly|rol}N8CR8RN$z`s9yYQy!|$)@(2Tr0t)N20Ty7;Fxa zwQ=Pnxvi6X?G@`erMv>(tQ1LcX;z(d;NW7_wkypctBpi|F!pcBn_JQ#AQkq~bDFf! z)XVLskF(7(U#&I8v-q$=(YKVFM}G&cx1Y%!ozL7(mP7t zoZyXr*E>_7$4~pgsCFavk7U^m7G;$c4>-i1s7r8gYkAyvk5Q0NZ07sL@UT_5 zDrBJx&KbbM9CCheNxoTu;$>YA< zms>LVjUybkFLF~&Q0y^(cVzK$yE7pXs&46gTbg*yUL>sGv$>)0biO^SRRHINAUCd+ z4n1~HUieKlN_iAGQ>=8Q$K0sWDHD@wPhFm~_}Y#n-!-eIOs_ZIs(b4d(?*FOM_E>i znH&_K7xL)!`U7mgv(=^kO^9mPyf3BJ5A!DqIbs?^p6 zXXmMBX8BfrRkLP~K3rBibMvbM8&wz1a{V2c8@f&Iu3Kw$pkDAUwdwmxyF_y$)>at) z`fF{x;k;mnuy)*;8y}q6dz8J)e6Fr>IK}l=>gbv)DW6jJnVT{{)rnHi+*|B8*|j#j zH0s*y*zK*hQDrf=mgQbQs{3h6y68Sz_U$$`Yv1kJ-~E2>teM~ao_TRzx6zBJO02o? z)AD+TV&KyE4-R*Wve#=)Y`w27V-c}opY8AO?`~U12ntL-=_JPy3ifxR^W^tV=Jf(% z78f==df+#Y+ga+$gcOm@@iA%=uD6O8HG92$vh#Q9V`j%mA%8VhBMvbc*1h~<*u3cB z>%djX?9*mE=#a6mUgtHXK-z5OnVHfx2Rx^!pKO_yKXKlYpNUP(9AXi--e_N2-X+>6 zo^kI@f>YqWDN~~a7Hdvjd3jmTR3~N8lK7 zox8i!Z+C2a=r6}ES^EnwRSuWiSROxOb3Cizfb9yk+N+iO|NlE(bhs(xfvKf~&rTy> z!RMFPhg(+u>G=KQqrL&FT;)GO@q}_=m;X=2<4gau-iV7~k?ojMaXK<>Li06F7O@y1 zF&D)aiLCl9@)h$!Rvc>WO1+^_^-%NrLl^mF6?dD2jwvke;akI`#A1BRU{QlXD~prR zY8B@*6Apz4pSQg9$7qS+As!~ie%02N2__$xB&S-vNvTww_VmprhAHx%ovx-ojwC;u znQ=^+-+F%y=VJ%$8w(E4DY+K8oL41HePLY9x0lP~D)};!-2KFwUJ5q1y!(;1NM_oJ zjKx)Us}?PuB*yi)dPY}3e9O#z>5O7;w??jXP<^q$Q+36%Rj*d9EE96eUfjge=&u?<@J`$1oYT^OYKC4VG z6<24M#)!mcR}cEfo6FAIu<>$wzl^cHp^3u2-=&3nO0H_%{H^92Wm)~}z{5_)B(3zN z^DZa8cFPHnH0fV5_wsk1(=69h9p%CTosOp$ol0_;VUXA;k@NA*&zTdxnO@=7?5Le_1Y{{kQi+e8Z*>4)aSxV;iOwE;t%+-9eZ^V*$UsN?1_NZ_z7?Eec&f1UsdK zN*=W<2F!V%(m(sO;y-6~Rt@9VqfvK`~FoM4%ugamAbxuAKU8#YZ)04?G#NW zCk9>U4F3O>5}>7Q%>r-0GY*H_o``YScuY(>)Gi_KHYZ}^;{)B2&cANI*r?($QNp|n zwAk_VbUu+qM>zZ*ot|xxd~S*6#wEumTh~iYS`(3Uh>2ZT=M<0D7IjwvGd4r-HuaT` z3w+w;<}7H9u_?PWXUdLUQ(k&3XY+12aJYZ2b#c1G1k>A779Zq~+3@l3ai8Ninj)H4 z?b)f=Hp8WPpHD;Nw9K>h7U6yc42g!xySU|rV?G`{*mQn@=6Z)45e8AbesXJ#j?OAw z=_2J(pKN!!@X)OMKSiG}FXx|c!m-IPdoDv8Xk2+iZE<G~hbg9k2MT=k#9kg@3}YtWZce!ub$XF21q7&jM0?(m)S;pye_m6!kR7i3_QNT@sO zsG!jB;Ov%*jZDv`_Z9P~bxaClk37&?bFWrpZqp;llzPRsH#1!qwu{@%SjZ*RWs>A5 zzs`Jmz3kQ(F&&Ym5f@lg&;3ZMezaELaKB*T%Sg^%x!zQ06iI zxa4xLL7(N8k)+x$vX?egVZJ!pZcIC;f(8)g2GgiF}7Ax0_T4Wg-5#dnL zD39yX51S zt!Z!HO?uo?ZyNPMxwl^0Ea(2Yo!ZxVXXoeKUBsK^CBDi{AmGD~kIlsqtQr}x?+**F)}h%hCxx8u?X8VI#hzLIwsv39%j+>g+@OxH z@E`H(jXdwlgBp4ICM<|!aLZWGEOAqGN>duE>4KE_(jyNeceZL=X!%iJT5+L$`AmuX z9diGk_6O+)MYMJ$ob*t3>M&eteP5n`C~=(?=Ji@My0QknetE8PMd&{pL}h z^%DbS9>XIlpS#4Q5@t-C!WOB(YW!`(DLn_M^%$o^%;xRoh8F9U8~g-+N>_Hb6W(w*?3H?`^`r1 zd?eEH*I=YFBNV#)^&~VE$f@#p&8Y`Zwp)Q#NJA&vWnRK3+c%|pPUg$~lkK_rnfDBy z)V@0wkJS8H10ne+)+*A zH8(dJlxE%Sx|R~QHfHI*wNleHuWl{vz1MnM?8%+wl^drSNY`(Be|%F*uGrgE$%i|R zPf+%rm-Ay0pTK0}>~%eYN20cMKec))J?rKDC5?semY%-(FmvI`#C`W9Z@r*~ zr`|48?GtOgBj3rq-jp7)(!6+*YWBCBt+V5JqrToWUDvhK^!2f$tAo~u?^FJp#;Ox! z5PC@J=(?wz-?DBUO}<^^YrSX_XrYET-)@E@`_C+J&M)IRr000V%zK7hM^*CW`m1YY zrQ{+O9pMsKwRN8B?Au8^>WMi=cHEfp?sc<#NzbJ8^|NKUca=-ed$4Sdb=kWmmK}B1 z3|MS_UE0{*-R|r0a{ca^-^?r?^6Ys1ZeH&6Xq)$i%?e38ucq}$PUpYlyX~H%;fn>$ zyxIcO@8xW{8Wvhxdw08dOQYux@z&Nz3yC)S&ddsl_LXbP#5>mURy=GHTFE-oN9EMF z8(l_ApYvN3tYtf-JoU+n$9*=hR&dG*|4E({%V)8nVWNlJ%9KeSP8%jqP*dN0;E@jF z=7;_{jP=$GxeO8v`V0&l>lyy*LTa}E|9S(CZCH4?oo{Ao(S!^0k9JEKr>)t>aKye> z!O`yZ55py%-O9G}Y-VnH;x$nvzAZ;nc-g60l9`W=tSDALHN&p{9?z}I=@;j^7pkq@ z8IpE+x_`J^D(94p(8b((JC3X}U2$Qp$NDzeuBkaUEO`^A>N&i=dOu`xetK7E_O!gH zWyK$_U9G;J8MnWh@q6p9=>-p_U-Xz3eP+kT$HzXl=z3IaC`#qf{0aGdaC+BKE%Ur%)T z<| zdFs~-rcB@s$PjdsVB*^7)Tr=sN{d*0zzSC(!ybd%9V*jigybILSm@}=;+Vj0|LsUd zzfDNx9NUjc#UD|a z;Fo&f;j!s?Yc?L6ny`z}UD7UL#za5Ag!W^z^XJtwx(Q{yOJ^2O@6cQ(;cavzR5b5U zXWN`g(``+{uQ{zUB>hBE9xa~WrX|$nnQ`F)OOnUoGt17{Oy;w`d#7TWpN*M$5Ra3S zVF1sKwT-OJR;K?uqf=B>1k72Ov!ld6%XJpU$xN6s=YuW4f zPKi1dz-eYNv1Pw!%|X5u*UVhA`p-3r9G)GKv$A=b?+NC3GZneoVKN3d86PY zWzpz1Nn2@3B9CuVj`K;odV$}|R(Ub+{c+s7JbJEx`?1+ZFXAQEvhEcO%-M28_5Pn{ zQZ-R;f4^5=HDNuMmW_)Ihvx)drjOi)|NFUAEe<#qv1;{n$5;_D}{YV&;R zHadBLiH#*&Mft3qH}-daxHpbd?D4~`fM zioItF5SS#rp+ND3L<@U*M=;N`cERU@=Q3(GEp+^!#L#BG^B}tt%RHg!8Db9;eY2+) z#X0v)w`uY$RIt0^AUES9Z`lK8`Hu?q?Iu18n>k}X${YB&nO_oAE-O&xpUA*&-*R!E zV4f!1(nBp?&Tii}fsaCxRso9oCxlHc&xeiUQNy9fG1ebo`B% zBsfaFbeBs@sWbFok~zY#D1YMwN4-5gjE|3QeRuR!j7QB9=Q+!n6c02e-VuJ-SoDHT zy?&1SG#{R22BAic>Up}_f{ynN>~P%8$-^Z5?ZR=(B_Dh8Yc9&{wm9#Uw1B7l1hf2& z1UHi>7kLvCoaMJ~VEk^@?A{VsqGz)JGxnEz-+;(tk}%N_#s)EO43hOH)Q&o5ON%JlbRrd}uY!cqIKz;kdHG zgS9R`OJ({EuKk_Y$Xm1^crM>VFS+m!e!VJ*K6@A$CGI#}G8N!#%lqL}v1e(sa-*VE z21E00v7!r{^;%OFuDis*p?Bc=_XC-W#5Ow0vL-bLmzA*kCOvg7ZDO6=bR=xYmubQk zGdIn+^kvhGsU5xxe_UvPu_b47OoRHl#{LwCh5B`xjw;K9dg~WFXTIpsZsQZkbmhMu z1JBhCcDtg+(6YR(t0fpO%_zBG_^CyR*K1Y-si;i2pLT{w9LEfSaEp~T!~3UOCg1$` zD_nW@-C3pP!LAp~j%1&_z;4O*u;Jax1SY?ZHrqW9TT6we$-FaQ_jY~J5WT}$e#eWo z^Kadh`55KGY9=vR;9nxMW&KeFtM$7Y)`V#q4C1Kr((j_fs49zK56Yww3oAP zo5nWj08ed5@_$|*-AMvvjs5vQ9xeHS7thT)@z(l_BXD zwWGwvhRwvJ#*r&PLTb*P1G<7!e_r2jx7o!mTbJ8m;n_O*?+IRHne3wJuT0++*rq3 z$;Pi z$0dB9u1=}@Cfm(&_o;&7F6X_=!uRX_Rgt=0b9x)q0O8$TN62ebD)FF|gdo%O-%y zNkJuEpqR<9RyDDu-fU2A6~On#fv@9n`nm!>#vS_A?hR+Z8>AjkP^jNv-^(h;yC^8) z17lxtva?YkZ)2m%NBbEqtS=6#7BUHH9bul7EU2K7EyrS-AH;gaT_ClhO{lRpVpElV zMSIxiIuO78}Z&YV!%H=G7}$Ok`BazhrGaEmO77QF05Lw2F%yi&NxM=7*nTts2ZZ zHrC1F@Y(dmMuyb~_yfM-LArVq9r2nlE%u2SXDu76%M%t%2p?)hRUm|6&UFAE;LfvoUwcbv&v`7V%0{s z5;i}E$`8WU0+Er$9P!x#Mki-X3NH>edJ$=NfalCduDeh5{T{IVewIDszf$7!4P2fV zCVNg`zu>~RR3M$@A@ijJe4i%poocA(-v5C2$poI~PpYS{FlU+J?7BqddqrNt1=XvY z#5<>i9hnhm6*9p#Oi1d3kq>j#gH%1=iiF5Clgz2|lbnC0L zuWFHtT7MViJ$u9^#N1$?I%%2)~+;{|xnODIc*aZW!_^fD!pdtvCiBjvj$sk1Is7G!02 zN=RfiQT0oheWbZ+-Jww4z;LJQtr6zNPl^hzC~3tATDz6ZnEZ_8{UY_IMd}3$!dQc} zAOCmK-FDJ1kzsm}gy8LVr@ou>)R<;YvYfe_fv^67#4N)_{AVVx9O7i^Z{T&%;Quxu z@xB9(=Y=wsL`JIu&NBhL7bozP7%+A+G;Ez2dM_%u-9k$(;bx#s!Mr3RYq3JcP=&>w z4vVY4PspynFzwyWC7T>Ig$w$#Rxnlv%sR}-$FxjgHgQ5k!N>+ctzoAHfF~C9}@cw zI+R1%j(p&LcZ%nYL;ch{R_nh+t(RmJ4`LMiQ6Tzprih3nv+x6sy9%=^9Hz|MC>$>+ z_OUAC+pP_Jzc=)Eu-|#W_cCB(&JrGmm7-D?I1gReSQg0p`~cs#25y@NMOG6zek5!Z z)m|@fdz0SjCE6b{jHEYb7&4y!FR)3>+Thy+9!cv=W9`lQ(p#LYx40PAGhTea_i@6O zcMg1K3^)WmK&L+hWs7Jnk>0g&Rq*VsQMUiW+ZzF_k#;~m@#jMJW4Z*|>~^_W5ULQ})<9lYAft2c1(4A{Bz z19zXmoO*$e37N@m-wuiPf8d@rn|t>LF1c`1u?c2u-lhr$jM>QxG#Jgf8Fo+T78YNy ztNpZ?@B{XDEBOCB*!}MVPlUtny`Na;8E_R$*qu|zXeGe=@4@cU7t_SFTPG5;O*svTsV7r=FL^`5P_1y2ZbE;Hb$za6b)Cd&UHfcKID?~MTN zqc0=PKJa{0;J@l%rFC(afP#7U=Uqx4b$2xIevRgRpum4`0>`83RC$8~tTN`JYu2e6 zGM-e}bT5Ey-POi*R*WyWOGIl9?&M}nI>5^~i^psNqvk=;^ACJ)DCE7=77_ly{d_`5 z$%7p(g^Z1X^Y{{jzttb$sh*(jw`f+K66+rWgC7m-Ha$T`W*id>IA;YMohQI{WVWEy zAy)Mi_EQb~{4xh+4yJTo;0&!fma&GjQ=z?DSnQ7g=lk8_5$tSH3e!~z8Jz;SGGmTT zJ#Z{ibi<#7nGY7Q{-(5TaebEYklAx77i& zT17#>2HyBDymga>E*Nv1NeI1gn*ZMePVRyOsjnEc6}W#198)o5On<<8{xtu^*{A+6 z@YV4M{g(E9#=zeFN1);j=cNfesR1Ws4H*+3@b8j2`)dLJ$A%;GN*OB>_xF1J9WU?0wwx#TP1<39Rd!Af>U8v7jNu(^Tfk z1P%!uA@Ky}?FOd>Vot{#a6R~ucYYDy;e$N;{|JgVuxkH{^J6ksS`MwCvXI;W!*B{Mau93tM6&$hel-#SDP|piJ!InoB@ZY&`F{C!Bti-WT;F^CfpNg;bE*8eD!P1nCSjxpcJc*{^Fdt-v_qD?AS z3?Fcca3Al>b^r7xa(&e56<0&Ib-At9JtUaOct?Q$*#g#9?$rVdGF1f*tzf;vm3Woy z?e+O82WsB3EI7%VoxE(`ZRy%VNxMI{vo7sgbM{vK8*#n|%!d~6-(X5cKvw|K2_N}t9d2l{_lU7?4qPoJaaVS z7FDL^Wt8yk@?)EQY>6)=b6ub1C7k;9fp>9(imlzLdy5$D986fn4Kt0F88WoI%GI6j z@+{~7Io2m!OhJd9<@mAZ)xS`PYUbIgL5!U<12KIP4?OIZ8vx#uh+sW=tS1a{{l$v;f&B^%f#EoLrAVCM|CPpM;D z*QyXN#5PTAUU?Gxn}eGRn)%B1CtG`YTVkxu9N3RP;Jx_e>G1-#hj~vU);-lY_%x318UIFxs}K0! zH5eUY;G5#XcdCKi?Ei&G?{hr6c=ld?Q_mNa5WB61cjp>@&!34F|977%m~AM)wthp$ zF#!^h^AN1trC{9psO--nt1Ch%A>d==ZsaOMI3Cj$=825t}2 z@68LC>#rRli-tGZ}n|CKqMa_Yn9dI!}_`@6qg6?nBrd0|&nM|21z2T;$$x_sIj!BOh}7Ub?>dz{Rj}(GmNm|6UO@79=|H2~>@3UgW{gVP+jBOHpVHH!}#S3i(5 ze0{Tbj&+n}3FNch|CCOZn#nl>NAIvWt;v+2Ud)*4M$?xMuH*xB72)=16S8!Ft1*2Ue=D z-{xxUD_+Sn@6U!dY4?IVd!}w?kM<7Qf8N$oVq+8EzV&4x(>+qw%@Me|Gj-YpLH$@$ z`?&e@x|j1yOKld@b?{uaK1wxhk$qc_`XmWA1J7ptMH}0#k1d+~tmih@rqlfgbh5Q& z&urPipvGM@!By_jo`-BQWnDrW^mXUee>Biv_kij6#BPpX4jr*-N4n>7&ew96T;;Qg zp+E0~pjzjultUQ;{w9t_qUA>2jr!eU0&es3SFLQD;qu|a6UkyLsT8K}oC{6dx?403 z&#u^Ykh$C7@RKGRj%1G`a^)uyk4^OoOMGTj&6ZiTY)V*`rut{Lt>>3j6wJ!}uU@@l zVg0A+j-NDKXInKcJerLTY;2#C zkx=+VFp}Z2yOe>B?Mb~oUy3$4Xv(}~IqB80vEATs(xrq6A;!Hf5(SS6-6yAVGC8sb zOw?gDKHH?a!dP>q&9hV9Ti$30#!Y>+NT&SK#Aj3MqxvV7Zo4I?BC?G2)9W^`M7EoY zC#RpA$Sz}lP1U0#{}H46OpgZ*AyUO(Jk>gR{_oV1sw^vHV3F1;JR#$|FZ!uWW{rma z{Y{sm`DbS(6+Vf`xzy;})y=s}-#$k}_?ckz>X)x%bR&*lV;8yk&~1jd-cQ!q#UCn< zrFAD=c=Z27dcF3~G*6!DzYfCHH!5%PTgWJ;-75ZbAbh37yw3Kyd6P8D#1DMBv()Tk|H1%bnK?PLhF&WEu3l%4If3X9A4&M+j{W$oIIJrghKWf4>!58 zd4eUZCSMfieks3uaCyn4pOQ~+ac)_m78Wd#F4GirrZAeLATX%DQ+0aCx$Vnlvs@KF zTC`)K@@G!56-*lC9XqEjJ0=~kknNYqlvv0i^Fh%o=Rrinw`1xGzvMYuB)!C>55?CR zStfVxTeJJqt(;|VGUF3?YcE-<)lJ?aKA%}ZfV=#Jvt;OwnL!L3jr=+``l!A6M=7x$p@bQua`6nxW^=PvG>v)?h5sr;ZJu>?BLpUUiOTFoMT7hOm7XB zV$Xy&>qiUq<~(dqk`-<;I8(?|Ch*uy)x%A&bi;1Ph3>XbCb$W0+0I~+a9H-+iNm{! z()cSLCNe%2K4d&Cq+23_g=v{WyKRZ;fv1U#8p}H$vL9*RpOvB8$kNClv!R~RRJY|k zlR!pTxRU#VCZ7YsnMaOEeR$5Cw7^f&rs9I*vhR)FdtM82$HZ&^9Sd7}%Er&f{Yi+Zf%r&|U{Pp4g|0LX6!^F4pO@^9O0h8gQB=(lbr$Re!w2I6( z=_m@wVQraxYyB&84UP+m^{pqxIdlSyOy?b}SMO|Oex5n$+yiEh24=(fGjbvd_ z>2a6rV{YP)XpoRIdT3NSxrb$;TB?8mv-Ok4-h)SlbB^hBFtZ)xz4c>(mS!ib{fv4+ zW^RjzlDb9hCaZ#&GIuN%HfvaZ%Hbqmr=6$RTbWkg4_jT!IFcEiwHjYcQ|UDlV`0ka zc3(Q_5rfqPX8AJ>DR~MBu4OrARRk`$1nMzLPPuVF;-dz;)IW7Mou&ti6FS;zPTX8A zQSm5tszgAZS*3;lGqx!cZ_7^kpxE!eK{UNS^a1C8^DQ41h&nKeZ9Jf(*Os&@JV9*p zPKV~D4g$^IB1eS{V-Bi5DCS%sx4FFW(uxG$R*ks}G~`Me7)s9t@Yc8-o^3dj!F>Jq zvju&d=cqe!FncG2?|xQjc1EDd?5di-+P9FBd>VDlY>sbGaRM99XOW4y{XB-g;jiIV&1nc z6T(wHa(7OB;BK?d`Fr#x`bbW}6o$iKi=XnUsLT*h(FQk|F5 zlP2?+U0Kmux_6!ZC5^*{|J!@H?|x)9&E&i@0vl{L)Vue~~T ze9SmfZyjC#l0io?-ROqjv)3C!=gzS^bMStcqod@H7j63I_t2Z`-GWn9$SYW>fD$Nto?!krt#KOZ^3X7iwt z-$a(##^(DGwU45ISJh`veVumQMvTMx%{f8NT`GKg_^(V)Kj(Px^RD;OsUEXMO#bw= zMU@KN-LSr-al3x)l;%_4CNc$VU~KctRM*<-;k3;3Ewi+Yhy0lzO-mIXu>V|ekTL!M zd+5eMKAk^@IrA?vEpUwFHRzV$Kdsm%Y&F&R=YzypZ^h%`2mUbXzL_XlAGEkrxTGxO z{~ezNeW`mFv$ZIk%X*;5cKI74|D+Ebl`|F#donr-?OJ$DOC)TPu)wyd_f-{ijV~9( zs$H4x9+_h#%(6G#ulPjihqTRyo-o@Kv`&#}+#veortFRf#_t)vraNSNT#&^M$|66wQ&k*FVd=q)2 zMl>VIHkt2CrI+NlA8its+FE0`3-xRBnl0$`?MuF_a+Beo)8>x}3z^F9e*CmR?8au@ zBnyuX-gO(?jgk)V6hC<=pJCB%8PImWbh~tN*^FMpC%(e+NzHuUw;eQICCFDRumLw@f6JKe>X z_O?&d>S$B7Y-ch#P%N=*!|YuF%+oemTUQCO)t8;H(JHRaMSL&N|&OW^} ze}{4R3(FrXSb6@ie^<8pp)K-r_1cKSW~trwnH9Tca_Fr*%vIxCLEl`eo^sI)U9ti7h#r(LLc#+k0*&6_#in02na$ZZshjil zVT{kBdpcI?%1O9|d4rqUrAam==O>C7vqJ_YWW>cJ-4!B!wp-z*f-T(N>p zC8<5I!kJ&%T{Wh!*v0T?z;T~HO}D)jbe`Di%{l(ybbnUBlC@X7COaIixAEAw%V?7D z8Vj8>Qyb^-DX(a?S>JZWxkbnR`YL0`Cp$lMwA*Ie+u!zZczxo0h)5BK=WpqgUN${{ zPaj#ue1P*uYteyruZ*=$Ma;8(T|Uh99?Nog z_vzhR1e?Bh>30`2c&u2zJZ9MnlRYbQ%q%Ll-8|BJaTm+XOH4%v*yKAV2K{WG_lfzq z&B9B}%gQgaCr0euQL;CxWn$gxL%Um=bW|+7@0|V|W%2jM`FAP%vKUUBn8Co!v1-nq zP4zn7K7NNzeqL~R>TA2U7R!%|ecC@bw|6yqX>nhqD1C%)qbmUvK|JT2; zVPT;8G)BV&DaBe3b#)*2Up_}vCKzTeFm$=xBrVMR>&+p#-_Ft>dZu;AAB~hbw6VL5 zq1{f@s{BBkNX_KKG2Rb?&fE!T^bKv)*Jkv)8`2cOsFAocJFwA)rJ4J{yqU!uZkt`K zCJ3iRFbLE$gmMe0RXa3)vh3tmxG40O-H+GT&$cs=)zdMs(S>`vRzT=vhS14NxB_@X zyLU9GbO`O7!H^Nk=<-^jCP6pqZphJ(QX4i)yy_5;^STZL|f z?B(~kKI1{i?hfk!+4U;9qWm$};{P%vHSlj>QsIqghpsljg2c?N-WrwYJP{EV?EH?`H^L* zP-s>0-t#8PhF$H(Cpvvg8LU5OrCn&O-+J9qSGy&Uk$p$Y(O<2c8vLRjoXH7Oj80s0 z`s7k0!6N!0Oq8L1<(^sRSJ^sWs+#WY5MH~r%V%yUcZAGa#`Ref7H|El8mM}eQ@0~{ z>Y0$((2kO;hd->3_}HQ!6&-v)Hc!HK=7XyX4@W-OIiItDLF2-PyoC8j6R%w?VNP}p z%M1w1Y`y(-<2;psd9JL{O*b!W*ck25w46I3Zh5J~td`qTE;>B< zV^_cSwh+hp@`-HzADSH<=4Wh}-fFA(I>a&caCBg7BS(#*X4D+k2!ks(Eg#QiFg(Ck zRMA!x!D_;4R2IdNnk>)NJ(F5nB+^cwsJsZ^fPK-SH2LRc>?K?e1uF4B$`OuyE_uh6S@4ET){e zsKp%N(JF7o%9O-jP{11e<6&q=%SGwX6FME-JE9laI)@!?+q<@#e*?4S!pY(FD_FuW zSWWaguOu2Py`wcn>tbdtOSnht|DYSK#WRGJ|2_23kWXrLd9?G+nYCWJ0j=`?9tIVN z7aeE~`jHsEgM~}vjGQ5Ffd`wp-(%wf4LOC?c|Ta)C0e`}^khwFTQ3zpBjd25U0Y~D za<~VJVnAsB$L8=0$^H*ke0{-UYu4&guhGAB!=j1~Ue{}n!zEazwk8@HJdHZWqg3`d zbOlQw-}Ie_@A1W4>bM)CbmY)Sqb+a2%#;NV1$Bpxgmwufu$_O%mc${N zG^1W}MIlq?n&`!?SKeN2@IH`~dZEQVfOT#3r2k$Eu5SupG@QhhYQX9*(3WMuzUQ@2 z>Dp+;13bkmgl)@MZ6a>SlwFYB#wf_vJ>ytUamUMuBD>JoM?q7ssh_(YW}2~LYophr zjv0KNF`F92?}ZwwCA;~U6i>)pzan$hCJswAU#ofbE-Z(pNt|ddTJf@``PB@)_MaNd z`FMIO7QCFn*6uYUi?^V;clC~K8R}^k(`T=75H*;!&N_R8MLYASN!$@T_AtDj`7SGU zMTgLiXR0q>%?f+25)sy4*|I+1&3d-(q7`gw&N(F6ol0JJ+pm|=+@sB85_|rHRuvDH zX+bwKoVS6!nxiN2QhPcF^Ja$InWAi#583`323(a`&|IF#9?W6b zo0V?$f@^PIf0hPwzV4D5xhcsaXj5$99dR;C=O$?juCBS*$+UppBwBHW5Lrq!h1LoHM*ORSNU_X6NynX|F zl<}VQ2kgZMw%V$&GoHT?w~^6Ap)IeY-&wFtpTk|^W$2ID4aP6n>KF>HDzYDsX~=rO zUd?eqdJS8BhsRb=7D4&Ks}I@BDiQ*W&HWqR{x@s=)VWH31#3=2_Zfp$l?LX#5A7Kh z7rG0Y();=u*0-(Q$RJby>AhsQY-UBO{ER^D>+JOvZB6@T`>iO_6ED!)G2=h00vq#s z7QPauv=8k?1rsJSG>UpK>HcWaKfolfa8PLRxzDAa|8~urRl!y-;JqT6QB#67bHU7r z$~N~2O%F>nq&-;cAF$_ZtQ7KKl6)>)mL{1w&+U>z)V$qy){afz!GJ_euyepbaEtofM=GKj9Huw?Lz|&|TGP!ZtFZ}hM%g56X=fT=>i+28<^>;(qdA5Eqgn7--=$TyVdPCs^bL$_AL zkB;l#O0+v91ej;0|D3F@l6}0glfU`bMFvfQ@9E*vIx~Kh=y!Kn1uSoEaPi=7t*zf( z!&u(jucvBUmCrw|`9h->L$k3)v;Ksp;8Rsr@ysSam^cLI=6q-Tp}n`~F;nGrCiw_G zPX2NOjhMHa7&U%08EG&ZaQxo!cZtM?f&vHM87sO}9yHAsXV&px>bkW_qM&K7ee+TG znJf5jYju3jozC?2j>?Aa7DtH|7YF8e_s;sWrnNhAE2JmsnH5KQpII^`_}9^m45znq zn|QEX@MlRo(Ek5>@{yyqf45$p;QCgyMMM4m|G!&%(`t?WZtwof9NPQ);oUnK|F-tl zEmipUxIKDNV8|Q$0QJh~clCc)h5UUeUiUeok@ZE3WGw4}{&Y2wNU2HbEOdNu zm|xXGF6Bi*6YE43!D$SYL5EMYhK7I`wfp^9;4EP==dNCr zH%p_&l@&qDgVtt!)w;GySfSwQE{9W_E8fXip2+%^b5*F`>e15GV#;b!t5tVZT~&HJ zXP<|e(y_O*3!3H^|M~J!`^|gFY5zIv#Do7HP@c8_Q1j2Z)nBFm6FMGXuTbgV2 z7bkm%f(QTY9e-tp9b)uW#1=NGQ#Yh?XT?ma_ux@Bn9(x9 z%x%&MDKno5_xl6AELEq5dR@8C#Fz4tp(!BhW;o~nD60hu&GH>PpR(B1?NpncyX&Xg zoWgaLYI7rRMLuUqIki)Le(kTH>I=9+jWiavN=2+~wa%uKMJ75ck81ta*>dsPshpMEISRVlZf0?7Zk;}>>g~3NUDkQC z??(O7-T89W?seVI!n*W!e>`QqKIh%BDy_XgU+sP$`OWW@&VEL28w1aOa&7ttIkjyz z9Av21|6_3EwOLN?5z%O!cSjz??J+!l($6OQxMKI2SI3oS*L+%~x_FP#=|y*by)HOy zcv>d?nDOnJ;+^`zJ;vv4|F76|-jVyP!UbpPT9aZ|<-I1CXK3Cvxe}QCb<35|Xj_r1 z;n{n)Itj-gFujqe{ABBm)Z)2YZ)Pg@Zo8Gs9=rK=p}aTm_B*A&eYV}LeB87BUhVNS z+wM2!^Xz!g>g==QVW)7PHtX)e!fF9 z7t+e^Et$b{130bbdTm{Gb#=t%th=YSuD-rLA=*t=dfS?t(3Rb5Z*MOU@9UM?zV7bs ziqEg^p5DIx{_Ns~|73l3Y}_wvI};VataysXfWR1QG8c=U-y4`|9yKd2zj1bb1_NT=FANtmKOpF2ih1owYQZ| z=QV2U{r~?c!^C>47YYk1nVrP%h8n&|Xl@p;tEf-#;_{2Q&2`DLWnnAFvMq|K(rq1y zZL)QyNj|D`HnK?-s9c=ErCZU!z{`8)0s}J#55s|4p*L3qITGFk@mju_AbeIU=1(w_ zv-XZhel|Z&ENaeI)iQBZ+PEXgTS7P>^bl9)2jTNGQu=1{w5#|QbZSRAEo979wP0kI z3aB{{z*8T(V`G~@=rWaKQUymgsH7MkSh!reeO=%&anA*uL7ZkPimd`o*Fv3mJRL5+ z;K;94V3EyENPO;XIHi$IDo@4nQG=7m!xrA=vi~XpJuDY2n3;_)I511QBs^d2CaVw zRa&KsF5cBLZ)Nek919TkQdnKD&WO3v2`7}RR{dZVQ z|IE#D)=v8E7NzMG^|{+_msww(-uYrO-?=wEuUB{oBm}Rq%U&ZLwflY8oB*CriyZU! zs@|QQf1&f}g?!1-C9$kx@pE>yNeHxuF!3iU{_{b^6h^v zI;hAj`0pQzFEX$d34w3vkGDwPju?HTsju}^un#8 z*H7)!H75HQ9ajn6x`*! z&f3JwYv1!dN@%g;#z0x|d**H%PbSpym|jt6=G=PDpn-vLPTDLt=@$!pwtdrRKFVdd z;=@s6b8mLzie&=xj~*5^`_aIrQ*Xe?y@ykYN%J7P#Ek=-Ip-C%7!ES2UvS`UU{DkY zQDC*qU_5B)(j*eIfYW&qlSokklhlU?9&S4terIY6a#tv_n{HUu+OeTYK_Qy$zovu> zThxPQ)e8>H-p42K?)kv1J12qtWY|JBTP3-d9_)ry9S3>x1UmQ^K79A3kd6ICK|NDI zO@~Ng#G#L0pOyy{^gHd?rX=UkVy*guS5CXh-G=LlO6{A+&PpBI9m4t)b$ODUm?E3( zohD3FnBvXmI?ZE`s?j71!DyZ*Klq)rgqnLw9@~HEINADS<3#?0$pYU`2ya$huc&&V zQQ}Sjn`}XlqHaox)@P0;{uc}KB03JTSJf|e4|x>S&wKJIE9cA!G2b>$;j&C+;XQfC zt4@K9_jeOto2Spaf-@5?Opz|{()0>C^l6GO%bf3roX-lg8BRZ2vP?kR)2Fy;llk>2 zOfp9v{AbQ9GoB-;IiKg!^nGGJ2N*aim>Bs47#^KbQx^WwWOD2Zue}dLzgPpa-Mk~b z(mF@#8`ecIij^t$=7lhednzdCs3$P{8!$`XJJ4oirO2XYmBP%&5oEICB5$TZGQZ)5 zTTW&I%k49=Sl$~z8*`5$rMSX#kmzG`E)mczE0wK`cFZzT3C|0%$ddZ0CJZy;}K zhSE~riEJ^qqf~bMZ)%q9&pp8s_JJccBzg0xjuwG4uf#3xP0C)rDLFRzL5qIJLY`Cs zW^pOkJFPz$>bVmIoF#TVXnE0@!fdyqsrV=Zn@)}H%rmad5@3l?+thH*LmuHQIjJey+P+0b%|RB- zQcDgTtzVk!kZLl%0FOQAaTdV zr*+1jhzFCMCkeE%+uw+HGyBx!x{TRm3M2OhpC*Y53$%i_iSxdZY!uirA@&{D=5?-o z&Bq+}+<#dYS!MIXY0|_wPmDVb{^#Uh883QIn~mxCf&FrdS#|TJ@9LLK-?7w+S^S+% zh`dGrVdv0v(GIPIAFm$NFN<0*nRh`zx?+L`=li2h)lW7xX>Iv=Fsa}Q+pFvpv+a@> z#SKq%giNqw;7MfT_~GarUEtB<)4+G5quqAiLDkj>2JSNx+)SoCWYLTXf-@%#$C-lU`xgRTpc$%c2EXcJw6UdjU;2*w)yT|UiXXz z`O}M7#4ZO$b^0)HJuq|MJU5mvC*)E6X6*^LGGyy?YL_@Y;$(E>`NQxbd-7rF&Ira{ zVqk{9)%%eJ6Fj@5F`dp;hs}A8(fb@m$}9z4+3h|L-OT{5s<+4Aq6|$;Td4^wrw$bO3-K>}%y+4Q&FLxgjRu`>4g7f- z{O<(XpKi$Cs8kvu(Y~vV|676a8wS2+1#`m*>@H3^-vTA!*6 zL!&nTM|{5o3NMNX7GO!Xn+2I^Y#=0S#{oT3}JfZ#`RAWc%LlbzZs;Gx??nK22bG+l~#`SBcFJuF9_0RXib*rOp)mQ zvwip9Tzq8vFs92vfWP+$#cVEw(^_rP|h zTxahH23DqJ`T|z@9~HV9M%Oo2#9yd+(-B*A zoHZqwDQbaIowg!)nz%rH zZMpjLPYoPuEJ7JJLX#()TUzqNgP)lbbc(bH)Ca-Sz-Kq0Z%gnduN00NsdYONz8WytZqEu>I>jJWibE2 z&0c>`L16{%GX{$?ms+khU8M1fbHY-_td4n?CU6uyU_aKN^OAx6o=Ml-2;RB^HUTca z4GOHQC+I%kz|}0&z2Gt5^Gm!Z9eBLh=hdIQP_`^2#M)g?U?amUgZb|Q3MM|_*x0~( zvuTOzPNqW*i%tdb9TVa|+_vb<2cAv_#%3eNs0VY89pd4g#c`@(-jfgWlm(g3ifi4w zA(EKh7u(z?AHcd|QRan%_HR=)LjMQM{(m4wo5@zxsUlB-P3NVc!iGAIWCboImQv-W zsL$o~e?PHC1tNGS~#7BPt#l4b1kQ1|ME+*owpPc z5;UAPIOz&bl+`DJWe`Mrd&C2#^LqLMY z-cvJACT|qvU>BAsZFrnEdAY*dtxBgh3&==R)chAxU!laxd62n$reQ_!##akx^M2g$ zuaR}j5-m~d$)fd%0;&%f{a!Qp87TW3FkD?Ibv{$j(W2$Dr{Hn6c^d^%oEUNp|0!kZCLp-+9x2ap|pK3^E9Opve<;q14ZS%UhUV^r+5sqs2!)ad=xW{V8U< z>d$s<2OT#O*g2*bTeJ5Fd}Opa!1L$-0{(XsxEPqK+M`v> zmJ6(1%`Cb~x9$M*+Sx1u#r3wc81%SzwfvdPa)d$mlYy>$m*Bq&EvDc5-33=13@)?V zGV9GPch+Xss0S>pD-)B%JpNBe)IHQM!N~OJt3eOT8ZGT94a?)2F1at+&c?L3a>`2e zAOR0H%{6>4ZSoxSo3^Ye*l?&@gjt!J?M|b52E&?o1zCj&O)IO`Bu^HY7sOV-<5!(; zTdJ2()MxiZw>ffUiz{C(VZFVXso4C`swpgdITpqfYrbCbt~s?v?+5?EBCXH^9)=%S zbvUM7H1XU2q_N!XAkV_}5#Q?m?kc>#n6-*2b)o2?h=dJQ>KhtW^z$Yh`#a73#sB5D zC3^%E3iR_5+>OsD1tjd`U&!d@ow~Zkz5eY|R;%ny{42I-?%uSR#UlSOvyM$oo=%T! z#Uc3x^&w@&HC*iRksh^Q80(d`JfGs;a=B`ki`~XVCUyn})(aLK7mT7A7=$0lN-{E5 zEZFK6A!ygUWXWzuX$Hps#{w%H916O0-%TjwO*#Aj0>=p@UMB}tfe9RUA9P%5$h*eF z=vVK+QxL&-z}j6|TsP^0!$mfxxyM*z56HbUWQ=LhJ)+H)cgj2TK>PWGjZ%t16F+eD zKVUmN#a;LTo2V53B?h+c3c+hRXH8v9EK(R{b zUcZ5X?|%dP;p}t56Ikv&;Co)cvoDM@?G@kM3FoiXzhQ`Aa5yQ%xo3yzz8QSS8xAgR zW1lL(+5CV-EQCqyz>b?ie494tDeq-So)V$#dr5|!_4{MKdkgd`o@ic3YV!=(CBN~Q zw$kKdCPG&wk0}Ji$|T0H^BhgvGb??8RrF?sqQv9cF#t9Vg zR$g~9448RHQ+&B@lYEGPio|3)i!#}Y3Q=bZmWqV4MOuj;n&qagFnj1#a(!3*P5l=u zn3Q+N1-J<8-=*Xf7GC(D=YkMpozI!|Pq%ATDK~Aua&x^&Nd2RFwtlmapqN$DWCXkS zWC{v0YdxCjd~`F%;R{lYCySL>`hKlwu`Qc>Qc;>=mey|1|EZ^962jVcsjDP0%34&W ziq?jR$+ak_32tPZ<|}xtw@+G8T8@DsdID=?gSPo5W#t2BBp#l*u;(IgqQj8{??oD{ z=Na0c7;v~TGbSx4xv}74JvSq(M)(xI3!Do+?{PYy^H7lUSAxzdhDbvNp5upj$`m&6 zJz(J8z;Mu-v8ZLiPBs4X3mEwr7}NL|b?jv z5!lG+d7;Dg5OaFoGwuxqHgnI*JTLt8e*ymnhs)Ikm%Zn)yuNeUK6ly2go1khEsRNA zdT#=_y#KE7{d+}d;tJsfPYdlB`yTAjdM@zH$TWLG-rZ}gS3juS*ua!p_l)}iZ{Adv z6MtjP8jdJjc2X5&wwu5b8~)~K-hG9G*ORZC*8OGt{G3Hg;Zn+4#l7OE4NKmN2{2E5 zdtYWFBUi~=FOlP>9o}r36{Sayz3VlfS zH(tIzE@SE1E%Jf)tNvDM3HkV@FvlKPJ^hs6sacz~A3VMMu8e)1DW}}5qA3rGn^@CW z*Bp48E&49-L8-pyf`@X4A6EbSyzrgj9~L2&jZ$m|EV`dr{2f^A4Vd=E3UG?gb&)tL ze6eLCgW>u&XRXhjO~1gK(!raw-PAe#$+`(of`SZ%AJnt^zvDZj@U-$m*UJXpO9yyP zec)bfz~Q~lRG5MN{)8W$6Mpqg_|c(L)o)84*|?CdXX=JK48-nIXKz&fsn z3|l`uVP`4byJPRcANBlV1$!ob;8rUC9U7|h%z>wS$E!WckA(%;M769|?f;*bt;6u} z$zl5@R$e)m850sX71QsuY-DtL=+edF_~S>A+ZngM)I%y0BLbf|sTZ7ckjyY>6EVrC zkztv5BvDc~bdJi$#K-g7ggC-g3Y*n>#1^@3ttnig`p9FVs>zFnrla*QE*ckXIr1XX zpiS63eUieT53FaUWF!Ai-EffgoVcu__$`ZOx1QVeHZn;Evjo;gZBul7;qX|rh1Wdc zUt!@-eK$!9vorsGuXa^F-YYlvg094}R3SOLNgaj3$BsX4HC%AOkvUB(aAWq8BNB-p zk|Zo*{!g3c(X`9Ut66)=nn-20`tB*St&$pkILvxkw9K$+U8Arp-v{G}nl%+MN^D}2 zX&O>c_m2TANH}eBeHw=B(WLBxwZ`U&kfw6Z=ii2~1FW+a!`~!Yvr2=p`C8VIhN* zl*54rCO!d%7QrPfpHFgrJD?_4J>z0h)5I{3r!r-a8kZj8uShs1SAIg0g{eu+;;?l2 zql0b>?%hdgmz}^-#PEMw(Vc_pV$v1O3jDS8HwxP&InFG)e9rvrmUh{q9hGVmB}_Cp zn5+&Iw#ydp`nW7KoYPkQq`LSgf61IP6W!%wOLavq7+;wqx{&o%io3kK%#0Vz>Ki;w zWy53NE}P@@_UG66oEIjjU5^lJNZ_x1G*PXSbJB}rbBiaP^lJ7#QFwe_e9MDe#t60E z(Se=Z}0D}6VqoF`{^m#{33is1K@q?K{oL zn{$goPtl80a^EJn+x$!6FW_l%UFH;O_2?kK+_wqxyAQcX`fOv;^*Ah-rqyn;NU%3O z#5rnTQNoF~tD4DowG~eta$9)g;bFOVUGfD1m$zTy&*FfCvrAMtomYT*wDH#=4Ao9c;$&l=L~UoB{?|&`mW+gy zpooKWOpdg6E;!2hATg?BmyrD5(n(5le;+cQIN8%&#nJBDW53cbEB)_VZZ3VX@d;t{j5D#FiD&$u(~-j z$WS%t`F9hMeM);dcz0{c_vW|=$gEXWvMIX%x6MRQ`J%q#_tW=J|G3V?Y@^uVq>#WZ zAfd+HyV57!YjTdl0|s`71G)k=!E>C9mRp4e_+LAeU}IvjnNRMOyh6&9#R{q`&20~N zv21ksFZ5voM}0U)vm}dklGTTgJ^BpX?UHw#m1HJzT%1(4Ws%iVzLtxcWd_XrNes*q z`yR9xIc}UBtaEMSq^)a0rX~w4XI+;e|4=zQ(L4IiC$SwzT=j|i(k8KOyx?+n-Pyw@}@ymF*1;wlnQ(mdE z+dN>>b}`Q0;VHD>zkzVQ+>OsBsSBdom#z`uyxGn!e}Y$PK|-R{x&v%h97~0lG)PR2 z`MLkhMZW-^%>uG9!8|HQR!oRfO67lE=Wu{v{bw^7r*vad^Y_83` z1^*ZBQP}^qvMbJya|?5#YI38Y|I<%_yTfgGbWLYGu6}hs?TWHMc&NMTf%;edO3$eCDUz;W@{LC^mY2ep(|To(%z@UMRw zY@X85yGPQ6eS^^&=9q(eHCLS2_sl$?pccCFc%1{Ya6|)h&IA_k+Xsaux{oWoGi9`> zP?p;t=dkPLuJ^T@B^>pXL@Y0vF#fM^a!!aedg3N|pOK8hQ`FU=#~r?SJ?eDA@Pb0jB3Jvzl^Z)_=D<`lZ4ASkBG{Zc%8 z{q7~TTCD91TMop}7w%eo%x9Hhs=lqP=j@H1X6xp@RsYs`@KTA>BI7@YXN%cdHTBu7 zdXnIn5q{9;(g*dH4efJR@3*}F_)x*+p9`ccZ*6RR_%Pr+i>2+^l^3~ZUKD?B@I%3} zSKRvbhcz#3CvWkno5#N(*G5Qy$FzdEYvo+$X)oC7WB(T)+gQKFS@%DqKu(0(pR;P; zFP+R(G+1_VL0eY-8S`IrSG=G3=Jmu?55GUUCI9m3x8zG3o!brwvK;usc;f(LxvZ+; z!G%)aryZ00H!DuJhFRvxinhd$S_k)9-EO+Z)%?AfJ#WRdrVCB2iR=XlHcbr-z6|Wf zifn}&J0w=LcqZ1jr|g(=_aoy4$G+m(J2(Z{%rCZk&1jhSKsdgd%~-pmv$%mZVu#1& zrpd|dIT{C>HZbTVh~3__q|KY)Gc3C`DQhs8!_-T;x^IM%} zUF>NdOxziQ(h6*nI;`?*7T2C!H~CUGrw3b&hp2l*!WU%Cv)wHX!hO0F>h1v?T?HnGB+E~Shet!wfTl4ccu5t zljzas=vseZ`izx_l{h#2Dio}L?%iZiF>7;%0aLdC?};PJPa3=MXfRh#Iv>6HeIbWz z=fv+X_4jrj`K8%^HCRa6p|_){Q8hV1?q8fFzUh`wN{>0o!L>@lmH9Ii2w`-6SPYNpf| zB1H#UIU5+7v>78KB+5MwPH14Tf56tVxp~%X3!N9*MGdX{FCC9oU`w)KE1bB3KY}4# zz)@&Q2WNnn^~*NL0!RKoP2LLLHXV$j^#W=-6AtEoXym-mP+Z&)m>}+;+5EG5ChLZi zNjq6MZk*hArD5f+j`#`ep^~k$E;Dd9Flbb?cwcC7`OvsFitW35cf!4&q)4#v4DzPp=v3~hE+d}x_#_9ipA8M*>l z7`I&M`fy^gM1WEEslMYg_tpn69&%WIJfLyE2b21RM$r%F5*8jg;OKAgart3uP0KBJPrV|byFd%@fV z2bv@T8-+eFsuwT`%sj88xM=GMm4g8s(h7l!3Hy~UGKvIuXcPu&ZdkGG^_&bHj*SJ( z|GOqky0B>qgRr7P;BkwpdgrKR%s5+~1op$A(#0~qg3WYT=Fy#9fQk!^##MU#9-BY(%F zz9%QtE7g)De5wz$`7sDs7_{bBtS|n-y1V3LMT6&=IVU-LSn6vVR0=M%m@eq`Q)tiZ zWLdkDLAIhTxVFvl0*8%7Tb!bUb_PHj2!?9dsrF3U8J7K0fAsWYZ! zB`j(A!F0{4Jtom_9WM4j+Brlx4unG~?Ip;L5)^z`~0QLD3M4Ju^c zax^bs>|E8us5@h+3P<2%Ni~y-S^jHJ%_?f%Rm%M@W%p~A3z>^-yNZ}Z4MGGiG`ziW z_|FDL!xeo+T%B45Hx4AYb8QXi{$RaO(BtNXMxzJ%@)~#2H!&u*Fw1saY`$=A+KglG zKf9f<hk1S-cda-Us zF?){068p-@SwAi`-LOwnz8`&8SZ79<*F^T53bq`9vopA-G)FYJYp~DQ+^*8aR`6m< z$WPXq5T4qLN~s4}!z)^2Pbf97WNX!)s(<5Qy>%d4VgOs-izyW^*cv89|CbG5yVBF1 z-f>FdNt^niHl{ms3VyfMcCr_&XtTZd*n7jGKT2Z7iEK$8Y>ZRdi#IU)?TR>=h`@ttlG9PDv79W;J+4 zOfmn+R`0*A?f+&mjgGd-w|!C-o`_CkFZ#hGu=)674&eW6Zk7G(Y3W(#wtdpBc|)pD5eXxX|dvoF7JtKbm?CCTxw~_@CwI zL=DEB!u;|H&kELY9nj@Hk`S|1k)!BRPl?g9i8GFR&$$>~uXBD92VXXuan~cJ#J0{# zlezz&3U2vt@jTn_`IfaBxmOw&NOl{0XnEfXY?(1701Z z=_f_k~`gs}eXT`yJ(a$6kWerDX+>(P{djd2OB6Hn$nSf^|>xwKc&L9#{Z_THl}*sL?fv#zq2Yp^by{aD;(!a)VL zatWUsW|J!>w4S@hbSK91&NpSLPb?PEDQb5to>e{3__HI_qb=#;l(J5Hc^zIG2KI|r z@{9}H6Hc#>+VMp4RBmPg>*uU`XA#arA(1CP^tF3!SR@qDXuN{$q1gMo@7UZY#7=IM zKJjuz@-e?3b5-MGpI?!5wVwU_?<+pt2TXb^y4nr)a{OdJJbS6Z1EwV>5*)Uw@J4Kk z6k^t6=vQ9Z#MycLUyk*y?&lMKG{_vEuP>4PPE}ThyJzyZ#%U|=H;Q#O?K`q&^QwA@ zi|*U!@)J|rj+qU8Mj!el#ideRiYrv|RGzBj1$^mhCN3$$C_%(RfMH zMf~REeJ(2LpH<)MYxz&u@}c;uN8zyt`V)6gs9$rrP_@2zn?mnLOXfuaLJsxCyi=b! z=FZ=#H&fJr-=%+Tlj!;zlL}v~biK@}pLqOei@=)&2kvYZXv`F6

O9G+3=}!Ne)S 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�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 { 'entrypoints:resolved': true, 'vite:build:extendConfig': false, 'vite:devServer:extendConfig': false, + 'zip:start': false, + 'zip:extension:start': false, + 'zip:extension:done': false, + 'zip:sources:start': false, + 'zip:sources:done': false, + 'zip:done': false, }); }); @@ -74,6 +86,12 @@ describe('Hooks', () => { 'entrypoints:resolved': true, 'vite:build:extendConfig': 1, 'vite:devServer:extendConfig': false, + 'zip:start': false, + 'zip:extension:start': false, + 'zip:extension:done': false, + 'zip:sources:start': false, + 'zip:sources:done': false, + 'zip:done': false, }); }); @@ -95,6 +113,39 @@ describe('Hooks', () => { 'entrypoints:resolved': true, 'vite:build:extendConfig': 1, 'vite:devServer:extendConfig': false, + 'zip:start': true, + 'zip:extension:start': true, + 'zip:extension:done': true, + 'zip:sources:start': false, + 'zip:sources:done': false, + 'zip:done': true, + }); + }); + + it('zip -b firefox should call hooks', async () => { + const project = new TestProject(); + project.addFile('entrypoints/popup.html', ''); + + await project.zip({ hooks, browser: 'firefox' }); + + expectHooksToBeCalled({ + ready: true, + 'prepare:types': true, + 'prepare:publicPaths': true, + 'build:before': true, + 'build:done': true, + 'build:publicAssets': true, + 'build:manifestGenerated': true, + 'entrypoints:grouped': true, + 'entrypoints:resolved': true, + 'vite:build:extendConfig': 1, + 'vite:devServer:extendConfig': false, + 'zip:start': true, + 'zip:extension:start': true, + 'zip:extension:done': true, + 'zip:sources:start': true, + 'zip:sources:done': true, + 'zip:done': true, }); }); @@ -122,6 +173,12 @@ describe('Hooks', () => { 'entrypoints:resolved': true, 'vite:build:extendConfig': 2, 'vite:devServer:extendConfig': 1, + 'zip:start': false, + 'zip:extension:start': false, + 'zip:extension:done': false, + 'zip:sources:start': false, + 'zip:sources:done': false, + 'zip:done': false, }); }); }); diff --git a/packages/wxt/src/core/zip.ts b/packages/wxt/src/core/zip.ts index 9226a48f..bd9cdd20 100644 --- a/packages/wxt/src/core/zip.ts +++ b/packages/wxt/src/core/zip.ts @@ -20,6 +20,7 @@ import { normalizePath } from './utils/paths'; export async function zip(config?: InlineConfig): Promise { await registerWxt('build', config); const output = await internalBuild(); + await wxt.hooks.callHook('zip:start', wxt); const start = Date.now(); wxt.logger.info('Zipping extension...'); @@ -42,17 +43,18 @@ export async function zip(config?: InlineConfig): Promise { await fs.ensureDir(wxt.config.outBaseDir); // ZIP output directory - + await wxt.hooks.callHook('zip:extension:start', wxt); const outZipFilename = applyTemplate(wxt.config.zip.artifactTemplate); const outZipPath = path.resolve(wxt.config.outBaseDir, outZipFilename); await zipDir(wxt.config.outDir, outZipPath, { exclude: wxt.config.zip.exclude, }); zipFiles.push(outZipPath); + await wxt.hooks.callHook('zip:extension:done', wxt, outZipPath); // ZIP sources for Firefox - if (wxt.config.browser === 'firefox') { + await wxt.hooks.callHook('zip:sources:start', wxt); const { overrides, files: downloadedPackages } = await downloadPrivatePackages(); const sourcesZipFilename = applyTemplate(wxt.config.zip.sourcesTemplate); @@ -71,6 +73,7 @@ export async function zip(config?: InlineConfig): Promise { additionalFiles: downloadedPackages, }); zipFiles.push(sourcesZipPath); + await wxt.hooks.callHook('zip:sources:done', wxt, sourcesZipPath); } await printFileList( @@ -80,8 +83,11 @@ export async function zip(config?: InlineConfig): Promise { zipFiles, ); + await wxt.hooks.callHook('zip:done', wxt, zipFiles); + return zipFiles; } + async function zipDir( directory: string, outputPath: string, diff --git a/packages/wxt/src/types.ts b/packages/wxt/src/types.ts index 2986f9f9..d556143e 100644 --- a/packages/wxt/src/types.ts +++ b/packages/wxt/src/types.ts @@ -1164,6 +1164,44 @@ export interface WxtHooks { * @param entrypoints The list of files that will be copied into the output directory */ 'build:publicAssets': (wxt: Wxt, files: ResolvedPublicFile[]) => HookResult; + /** + * Called before the zip process starts. + * @param wxt The configured WXT object + */ + 'zip:start': (wxt: Wxt) => HookResult; + + /** + * Called before zipping the extension files. + * @param wxt The configured WXT object + */ + 'zip:extension:start': (wxt: Wxt) => HookResult; + + /** + * Called after zipping the extension files. + * @param wxt The configured WXT object + * @param zipPath The path to the created extension zip file + */ + 'zip:extension:done': (wxt: Wxt, zipPath: string) => HookResult; + + /** + * Called before zipping the source files (for Firefox). + * @param wxt The configured WXT object + */ + 'zip:sources:start': (wxt: Wxt) => HookResult; + + /** + * Called after zipping the source files (for Firefox). + * @param wxt The configured WXT object + * @param zipPath The path to the created sources zip file + */ + 'zip:sources:done': (wxt: Wxt, zipPath: string) => HookResult; + + /** + * Called after the entire zip process is complete. + * @param wxt The configured WXT object + * @param zipFiles An array of paths to all created zip files + */ + 'zip:done': (wxt: Wxt, zipFiles: string[]) => HookResult; } export interface Wxt { From 0248f58785e38238b22e643c011a83fdd7c0229c Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 25 Sep 2024 20:11:02 -0500 Subject: [PATCH 07/62] chore: Add Aaron back to changelog contributions --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index 35783e26..c11bfe5d 100644 --- a/package.json +++ b/package.json @@ -56,10 +56,5 @@ "search-insights" ] } - }, - "changelog": { - "excludeAuthors": [ - "aaronklinker1@gmail.com" - ] } } From c0aa12089e24c9f0cb01fb3f8546f17096b21341 Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 25 Sep 2024 20:54:40 -0500 Subject: [PATCH 08/62] chore: Move some files around (#996) --- .../{utils/building => }/generate-wxt-dir.ts | 21 +++++++------------ packages/wxt/src/core/prepare.ts | 5 +++-- .../{utils/building => }/resolve-config.ts | 16 +++++++------- packages/wxt/src/core/utils/building/index.ts | 2 -- .../wxt/src/core/utils/building/rebuild.ts | 4 ++-- packages/wxt/src/core/wxt.ts | 2 +- 6 files changed, 22 insertions(+), 28 deletions(-) rename packages/wxt/src/core/{utils/building => }/generate-wxt-dir.ts (93%) rename packages/wxt/src/core/{utils/building => }/resolve-config.ts (97%) diff --git a/packages/wxt/src/core/utils/building/generate-wxt-dir.ts b/packages/wxt/src/core/generate-wxt-dir.ts similarity index 93% rename from packages/wxt/src/core/utils/building/generate-wxt-dir.ts rename to packages/wxt/src/core/generate-wxt-dir.ts index 5d388f6d..ef39c8a8 100644 --- a/packages/wxt/src/core/utils/building/generate-wxt-dir.ts +++ b/packages/wxt/src/core/generate-wxt-dir.ts @@ -1,23 +1,18 @@ -import { Entrypoint, WxtDirEntry, WxtDirFileEntry } from '../../../types'; +import { Entrypoint, WxtDirEntry, WxtDirFileEntry } from '../types'; import fs from 'fs-extra'; import { dirname, relative, resolve } from 'node:path'; -import { - getEntrypointBundlePath, - isHtmlEntrypoint, -} from '../../utils/entrypoints'; -import { getEntrypointGlobals, getGlobals } from '../../utils/globals'; -import { normalizePath } from '../../utils/paths'; +import { getEntrypointBundlePath, isHtmlEntrypoint } from './utils/entrypoints'; +import { getEntrypointGlobals, getGlobals } from './utils/globals'; +import { normalizePath } from './utils/paths'; import path from 'node:path'; -import { Message, parseI18nMessages } from '../../utils/i18n'; -import { writeFileIfDifferent, getPublicFiles } from '../../utils/fs'; -import { wxt } from '../../wxt'; +import { Message, parseI18nMessages } from './utils/i18n'; +import { writeFileIfDifferent, getPublicFiles } from './utils/fs'; +import { wxt } from './wxt'; /** * Generate and write all the files inside the `InternalConfig.typesDir` directory. */ -export async function generateTypesDir( - entrypoints: Entrypoint[], -): Promise { +export async function generateWxtDir(entrypoints: Entrypoint[]): Promise { await fs.ensureDir(wxt.config.typesDir); const entries: WxtDirEntry[] = [ diff --git a/packages/wxt/src/core/prepare.ts b/packages/wxt/src/core/prepare.ts index 90e66c72..f5bcfa37 100644 --- a/packages/wxt/src/core/prepare.ts +++ b/packages/wxt/src/core/prepare.ts @@ -1,5 +1,6 @@ import { InlineConfig } from '../types'; -import { findEntrypoints, generateTypesDir } from './utils/building'; +import { findEntrypoints } from './utils/building'; +import { generateWxtDir } from './generate-wxt-dir'; import { registerWxt, wxt } from './wxt'; export async function prepare(config: InlineConfig) { @@ -7,5 +8,5 @@ export async function prepare(config: InlineConfig) { wxt.logger.info('Generating types...'); const entrypoints = await findEntrypoints(); - await generateTypesDir(entrypoints); + await generateWxtDir(entrypoints); } diff --git a/packages/wxt/src/core/utils/building/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts similarity index 97% rename from packages/wxt/src/core/utils/building/resolve-config.ts rename to packages/wxt/src/core/resolve-config.ts index 591e7452..b851ba25 100644 --- a/packages/wxt/src/core/utils/building/resolve-config.ts +++ b/packages/wxt/src/core/resolve-config.ts @@ -14,19 +14,19 @@ import { WxtModuleWithMetadata, ResolvedEslintrc, Eslintrc, -} from '../../../types'; +} from '../types'; import path from 'node:path'; -import { createFsCache } from '../../utils/cache'; +import { createFsCache } from './utils/cache'; import consola, { LogLevels } from 'consola'; import defu from 'defu'; -import { NullablyRequired } from '../types'; +import { NullablyRequired } from './utils/types'; import fs from 'fs-extra'; -import { normalizePath } from '../paths'; +import { normalizePath } from './utils/paths'; import glob from 'fast-glob'; -import { builtinModules } from '../../../builtin-modules'; -import { getEslintVersion } from '../eslint'; -import { safeStringToNumber } from '../number'; -import { loadEnv } from '../env'; +import { builtinModules } from '../builtin-modules'; +import { getEslintVersion } from './utils/eslint'; +import { safeStringToNumber } from './utils/number'; +import { loadEnv } from './utils/env'; /** * Given an inline config, discover the config file if necessary, merge the results, resolve any diff --git a/packages/wxt/src/core/utils/building/index.ts b/packages/wxt/src/core/utils/building/index.ts index 16bd6d03..72d74acd 100644 --- a/packages/wxt/src/core/utils/building/index.ts +++ b/packages/wxt/src/core/utils/building/index.ts @@ -1,8 +1,6 @@ export * from './build-entrypoints'; export * from './detect-dev-changes'; export * from './find-entrypoints'; -export * from './generate-wxt-dir'; -export * from './resolve-config'; export * from './group-entrypoints'; export * from './import-entrypoint'; export * from './internal-build'; diff --git a/packages/wxt/src/core/utils/building/rebuild.ts b/packages/wxt/src/core/utils/building/rebuild.ts index 711dd7d7..7a17e3ff 100644 --- a/packages/wxt/src/core/utils/building/rebuild.ts +++ b/packages/wxt/src/core/utils/building/rebuild.ts @@ -1,6 +1,6 @@ import type { Manifest } from 'wxt/browser'; import { BuildOutput, Entrypoint, EntrypointGroup } from '../../../types'; -import { generateTypesDir } from './generate-wxt-dir'; +import { generateWxtDir } from '../../generate-wxt-dir'; import { buildEntrypoints } from './build-entrypoints'; import { generateManifest, writeManifest } from '../../utils/manifest'; import { wxt } from '../../wxt'; @@ -37,7 +37,7 @@ export async function rebuild( const spinner = ora(`Preparing...`).start(); // Update types directory with new files and types - await generateTypesDir(allEntrypoints).catch((err) => { + await generateWxtDir(allEntrypoints).catch((err) => { wxt.logger.warn('Failed to update .wxt directory:', err); // Throw the error if doing a regular build, don't for dev mode. if (wxt.config.command === 'build') throw err; diff --git a/packages/wxt/src/core/wxt.ts b/packages/wxt/src/core/wxt.ts index 5674e772..41be019c 100644 --- a/packages/wxt/src/core/wxt.ts +++ b/packages/wxt/src/core/wxt.ts @@ -7,7 +7,7 @@ import { WxtHooks, WxtModule, } from '../types'; -import { resolveConfig } from './utils/building'; +import { resolveConfig } from './resolve-config'; import { createHooks } from 'hookable'; import { createWxtPackageManager } from './package-managers'; import { createViteBuilder } from './builders/vite'; From 09de72895e4eff7e17fc1d30b308e12d0ba37c01 Mon Sep 17 00:00:00 2001 From: Andy Zhou Date: Fri, 27 Sep 2024 21:02:23 +0800 Subject: [PATCH 09/62] docs: Add "social-media-copilot" to homepage (#1000) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index b31b9161..b1fb58cf 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -40,6 +40,7 @@ const chromeExtensionIds = [ 'fonflmjnjbkigocpoommgmhljdpljain', // NiceTab - https://github.com/web-dahuyou/NiceTab 'fcffekbnfcfdemeekijbbmgmkognnmkd', // Draftly for LinkedIn 'nkndldfehcidpejfkokbeghpnlbppdmo', // YouTube Summarized - Summarize any YouTube video + 'dbichmdlbjdeplpkhcejgkakobjbjalc', // 社媒助手 - https://github.com/iszhouhua/social-media-copilot ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From e3f00d279781c03dfd0903b41aada100ae5b1d55 Mon Sep 17 00:00:00 2001 From: Guilherme Oenning Date: Fri, 27 Sep 2024 14:03:06 +0100 Subject: [PATCH 10/62] docs: Add "Dofollow Links for SEO" to homepage (#1001) Co-authored-by: Aaron --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index b1fb58cf..26d9c433 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -41,6 +41,7 @@ const chromeExtensionIds = [ 'fcffekbnfcfdemeekijbbmgmkognnmkd', // Draftly for LinkedIn 'nkndldfehcidpejfkokbeghpnlbppdmo', // YouTube Summarized - Summarize any YouTube video 'dbichmdlbjdeplpkhcejgkakobjbjalc', // 社媒助手 - https://github.com/iszhouhua/social-media-copilot + 'opepfpjeogkbgeigkbepobceinnfmjdd', // Dofollow Links for SEO ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 0bf08329b025029bc1bf37a38b028f5f7b096702 Mon Sep 17 00:00:00 2001 From: Gourav Goyal <1gouravgg@gmail.com> Date: Sat, 28 Sep 2024 03:50:21 +0200 Subject: [PATCH 11/62] docs: Add "ChatGPT Writer" to homepage (#1006) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index 26d9c433..daa471dc 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -42,6 +42,7 @@ const chromeExtensionIds = [ 'nkndldfehcidpejfkokbeghpnlbppdmo', // YouTube Summarized - Summarize any YouTube video 'dbichmdlbjdeplpkhcejgkakobjbjalc', // 社媒助手 - https://github.com/iszhouhua/social-media-copilot 'opepfpjeogkbgeigkbepobceinnfmjdd', // Dofollow Links for SEO + 'pdnenlnelpdomajfejgapbdpmjkfpjkp', // ChatGPT Writer: Use AI on Any Site (GPT-4o, Claude, Gemini, and More) ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From a64ff229176ef601a15486888883442ed51ba88e Mon Sep 17 00:00:00 2001 From: deyu <40905802+Xdy1579883916@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:57:23 +0800 Subject: [PATCH 12/62] docs: Add "Discord Message Translator" extension to homepage (#1011) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index daa471dc..be5a5615 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -43,6 +43,7 @@ const chromeExtensionIds = [ 'dbichmdlbjdeplpkhcejgkakobjbjalc', // 社媒助手 - https://github.com/iszhouhua/social-media-copilot 'opepfpjeogkbgeigkbepobceinnfmjdd', // Dofollow Links for SEO 'pdnenlnelpdomajfejgapbdpmjkfpjkp', // ChatGPT Writer: Use AI on Any Site (GPT-4o, Claude, Gemini, and More) + 'jobnhifpphkgoelnhnopgkdhbdkiadmj', // discord message translator ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 177223c625f31d08e3e4b72bd57d59cd95697315 Mon Sep 17 00:00:00 2001 From: mezannic Date: Tue, 1 Oct 2024 23:00:52 +0200 Subject: [PATCH 13/62] fix: Reverse env files priority (#1016) Co-authored-by: Mathieu Ezannic --- packages/wxt/src/core/utils/env.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wxt/src/core/utils/env.ts b/packages/wxt/src/core/utils/env.ts index 27127c06..a6a65ae3 100644 --- a/packages/wxt/src/core/utils/env.ts +++ b/packages/wxt/src/core/utils/env.ts @@ -5,6 +5,6 @@ import { config } from 'dotenv'; */ export function loadEnv(mode: string) { return config({ - path: [`.env`, `.env.local`, `.env.${mode}`, `.env.${mode}.local`], + path: [`.env.${mode}.local`, `.env.${mode}`, `.env.local`, `.env`], }); } From 5faa5d7537610dc0b8a1432ae1d0239703531c2d Mon Sep 17 00:00:00 2001 From: Gurvir Singh <146362414+baraich@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:50:32 +0530 Subject: [PATCH 14/62] fix: #1005 fixed, by updating type-definations to getItem method. (#1007) Co-authored-by: Aaron --- packages/wxt/src/__tests__/storage.test.ts | 19 +++++++++++++++++++ packages/wxt/src/storage.ts | 11 ++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/wxt/src/__tests__/storage.test.ts b/packages/wxt/src/__tests__/storage.test.ts index 6d3e838d..d5fae852 100644 --- a/packages/wxt/src/__tests__/storage.test.ts +++ b/packages/wxt/src/__tests__/storage.test.ts @@ -903,5 +903,24 @@ describe('Storage Utils', () => { // @ts-expect-error await storage.getItem('loca:test').catch(() => {}); }); + + it('should return a nullable type when getItem is called without a fallback', async () => { + const res = await storage.getItem('local:test'); + expectTypeOf(res).toBeNullable(); + }); + + it('should return a non-null type when getItem is called with a fallback', async () => { + const res = await storage.getItem('local:test', { + fallback: 'test', + }); + expectTypeOf(res).not.toBeNullable(); + }); + + it('should return a non-null type when getItem is called with a fallback and the first type parameter is passed', async () => { + const res = await storage.getItem('local:test', { + fallback: 'test', + }); + expectTypeOf(res).not.toBeNullable(); + }); }); }); diff --git a/packages/wxt/src/storage.ts b/packages/wxt/src/storage.ts index 1450912e..55795d4a 100644 --- a/packages/wxt/src/storage.ts +++ b/packages/wxt/src/storage.ts @@ -461,7 +461,16 @@ export interface WxtStorage { * @example * await storage.getItem("local:installDate"); */ - getItem(key: StorageItemKey, opts?: GetItemOptions): Promise; + getItem( + key: StorageItemKey, + opts: GetItemOptions & { fallback: TValue }, + ): Promise; + + getItem( + key: StorageItemKey, + opts?: GetItemOptions, + ): Promise; + /** * Get multiple items from storage. The return order is guaranteed to be the same as the order * requested. From d75f64df79a0a3346baac9c1897a26aad7eb361b Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Wed, 2 Oct 2024 15:55:08 +0200 Subject: [PATCH 15/62] feat(zip): `wxt zip --sources` and auto sources for opera (#1014) Co-authored-by: Timeraa Co-authored-by: Aaron --- packages/wxt/e2e/tests/zip.test.ts | 69 +++++++++++++++++++ packages/wxt/src/cli/__tests__/index.test.ts | 44 +++++++++++- packages/wxt/src/cli/commands.ts | 4 ++ packages/wxt/src/core/resolve-config.ts | 5 +- .../src/core/utils/testing/fake-objects.ts | 1 + packages/wxt/src/core/zip.ts | 3 +- packages/wxt/src/types.ts | 14 ++++ 7 files changed, 136 insertions(+), 4 deletions(-) diff --git a/packages/wxt/e2e/tests/zip.test.ts b/packages/wxt/e2e/tests/zip.test.ts index 5645db60..713ad68a 100644 --- a/packages/wxt/e2e/tests/zip.test.ts +++ b/packages/wxt/e2e/tests/zip.test.ts @@ -178,4 +178,73 @@ describe('Zipping', () => { true, ); }); + + it.each(['firefox', 'opera'])( + 'should create sources zip for "%s" browser when sourcesZip is undefined', + async (browser) => { + const project = new TestProject({ + name: 'test', + version: '1.0.0', + }); + project.addFile( + 'entrypoints/background.ts', + 'export default defineBackground(() => {});', + ); + const sourcesZip = project.resolvePath('.output/test-1.0.0-sources.zip'); + + await project.zip({ + browser, + }); + + expect(await project.fileExists(sourcesZip)).toBe(true); + }, + ); + + it.each(['firefox', 'chrome'])( + 'should create sources zip for "%s" when sourcesZip is true', + async (browser) => { + const project = new TestProject({ + name: 'test', + version: '1.0.0', + }); + project.addFile( + 'entrypoints/background.ts', + 'export default defineBackground(() => {});', + ); + const sourcesZip = project.resolvePath('.output/test-1.0.0-sources.zip'); + + await project.zip({ + browser, + zip: { + zipSources: true, + }, + }); + + expect(await project.fileExists(sourcesZip)).toBe(true); + }, + ); + + it.each(['firefox', 'chrome'])( + 'should not create sources zip for "%s" when sourcesZip is false', + async (browser) => { + const project = new TestProject({ + name: 'test', + version: '1.0.0', + }); + project.addFile( + 'entrypoints/background.ts', + 'export default defineBackground(() => {});', + ); + const sourcesZip = project.resolvePath('.output/test-1.0.0-sources.zip'); + + await project.zip({ + browser, + zip: { + zipSources: false, + }, + }); + + expect(await project.fileExists(sourcesZip)).toBe(false); + }, + ); }); diff --git a/packages/wxt/src/cli/__tests__/index.test.ts b/packages/wxt/src/cli/__tests__/index.test.ts index 6419163b..07493433 100644 --- a/packages/wxt/src/cli/__tests__/index.test.ts +++ b/packages/wxt/src/cli/__tests__/index.test.ts @@ -237,7 +237,9 @@ describe('CLI', () => { mockArgv('zip'); await importCli(); - expect(zipMock).toBeCalledWith({}); + expect(zipMock).toBeCalledWith({ + zip: {}, + }); }); it('should respect passing a custom root', async () => { @@ -246,6 +248,7 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ root: 'path/to/root', + zip: {}, }); }); @@ -255,6 +258,7 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ configFile: './path/to/config.ts', + zip: {}, }); }); @@ -264,6 +268,7 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ mode: 'development', + zip: {}, }); }); @@ -273,6 +278,7 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ browser: 'firefox', + zip: {}, }); }); @@ -282,6 +288,7 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ manifestVersion: 2, + zip: {}, }); }); @@ -291,6 +298,7 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ manifestVersion: 3, + zip: {}, }); }); @@ -300,6 +308,40 @@ describe('CLI', () => { expect(zipMock).toBeCalledWith({ debug: true, + zip: {}, + }); + }); + + it('should pass undefined for zipSources when --sources is not passed', async () => { + mockArgv('zip'); + await importCli(); + + expect(zipMock).toBeCalledWith({ + zip: { + zipSources: undefined, + }, + }); + }); + + it('should pass true for zipSources when --sources is passed', async () => { + mockArgv('zip', '--sources'); + await importCli(); + + expect(zipMock).toBeCalledWith({ + zip: { + zipSources: true, + }, + }); + }); + + it('should pass false for zipSources when --sources=false is passed', async () => { + mockArgv('zip', '--sources=false'); + await importCli(); + + expect(zipMock).toBeCalledWith({ + zip: { + zipSources: false, + }, }); }); }); diff --git a/packages/wxt/src/cli/commands.ts b/packages/wxt/src/cli/commands.ts index 75b02947..a6159881 100644 --- a/packages/wxt/src/cli/commands.ts +++ b/packages/wxt/src/cli/commands.ts @@ -95,6 +95,7 @@ cli .option('-b, --browser ', 'specify a browser') .option('--mv3', 'target manifest v3') .option('--mv2', 'target manifest v2') + .option('--sources', 'always create sources zip') .action( wrapAction(async (root, flags) => { await zip({ @@ -104,6 +105,9 @@ cli manifestVersion: flags.mv3 ? 3 : flags.mv2 ? 2 : undefined, configFile: flags.config, debug: flags.debug, + zip: { + zipSources: flags.sources, + }, }); }), ); diff --git a/packages/wxt/src/core/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts index b851ba25..8269179c 100644 --- a/packages/wxt/src/core/resolve-config.ts +++ b/packages/wxt/src/core/resolve-config.ts @@ -179,7 +179,7 @@ export async function resolveConfig( srcDir, typesDir, wxtDir, - zip: resolveZipConfig(root, outBaseDir, mergedConfig), + zip: resolveZipConfig(root, browser, outBaseDir, mergedConfig), transformManifest: mergedConfig.transformManifest, analysis: resolveAnalysisConfig(root, mergedConfig), userConfigMetadata: userConfigMetadata ?? {}, @@ -258,6 +258,7 @@ async function mergeInlineConfig( function resolveZipConfig( root: string, + browser: string, outBaseDir: string, mergedConfig: InlineConfig, ): NullablyRequired { @@ -270,6 +271,8 @@ function resolveZipConfig( includeSources: [], compressionLevel: 9, ...mergedConfig.zip, + zipSources: + mergedConfig.zip?.zipSources ?? ['firefox', 'opera'].includes(browser), exclude: mergedConfig.zip?.exclude ?? [], excludeSources: [ '**/node_modules', diff --git a/packages/wxt/src/core/utils/testing/fake-objects.ts b/packages/wxt/src/core/utils/testing/fake-objects.ts index 08844529..c097aeab 100644 --- a/packages/wxt/src/core/utils/testing/fake-objects.ts +++ b/packages/wxt/src/core/utils/testing/fake-objects.ts @@ -293,6 +293,7 @@ export const fakeResolvedConfig = fakeObjectCreator(() => { downloadedPackagesDir: fakeDir(), downloadPackages: [], compressionLevel: 9, + zipSources: false, }, transformManifest: () => {}, userConfigMetadata: {}, diff --git a/packages/wxt/src/core/zip.ts b/packages/wxt/src/core/zip.ts index bd9cdd20..de7b17b6 100644 --- a/packages/wxt/src/core/zip.ts +++ b/packages/wxt/src/core/zip.ts @@ -52,8 +52,7 @@ export async function zip(config?: InlineConfig): Promise { zipFiles.push(outZipPath); await wxt.hooks.callHook('zip:extension:done', wxt, outZipPath); - // ZIP sources for Firefox - if (wxt.config.browser === 'firefox') { + if (wxt.config.zip.zipSources) { await wxt.hooks.callHook('zip:sources:start', wxt); const { overrides, files: downloadedPackages } = await downloadPrivatePackages(); diff --git a/packages/wxt/src/types.ts b/packages/wxt/src/types.ts index d556143e..445f0447 100644 --- a/packages/wxt/src/types.ts +++ b/packages/wxt/src/types.ts @@ -130,6 +130,16 @@ export interface InlineConfig { * @default "{{name}}-{{version}}-{{browser}}.zip" */ artifactTemplate?: string; + /** + * When zipping the extension, also zip sources. + * + * - `undefined`: zip sources if the target browser is "firefox" or "opera" + * - `true`: always zip sources + * - `false`: never zip sources + * + * @default undefined + */ + zipSources?: boolean; /** * Configure the filename output when zipping files. * @@ -1285,6 +1295,10 @@ export interface ResolvedConfig { downloadPackages: string[]; compressionLevel: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; exclude: string[]; + /** + * If true, when zipping the extension, also zip the sources. + */ + zipSources: boolean; }; /** * @deprecated Use `build:manifestGenerated` hook instead. From d2702506332c03f40bfda9b3b59e4c4928e3099b Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Wed, 2 Oct 2024 13:59:29 +0000 Subject: [PATCH 16/62] chore(release): wxt v0.19.11 --- packages/wxt/CHANGELOG.md | 25 +++++++++++++++++++++++++ packages/wxt/package.json | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/wxt/CHANGELOG.md b/packages/wxt/CHANGELOG.md index 4acc1808..0ff11555 100644 --- a/packages/wxt/CHANGELOG.md +++ b/packages/wxt/CHANGELOG.md @@ -1,5 +1,30 @@ # Changelog +## v0.19.11 + +[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.10...wxt-v0.19.11) + +### 🚀 Enhancements + +- **zip:** Hooks ([#993](https://github.com/wxt-dev/wxt/pull/993)) +- **zip:** `wxt zip --sources` and auto sources for opera ([#1014](https://github.com/wxt-dev/wxt/pull/1014)) + +### 🩹 Fixes + +- Reverse env files priority ([#1016](https://github.com/wxt-dev/wxt/pull/1016)) +- #1005 fixed, by updating type-definations to getItem method. ([#1007](https://github.com/wxt-dev/wxt/pull/1007), [#1005](https://github.com/wxt-dev/wxt/issues/1005)) + +### 🏡 Chore + +- Move some files around ([#996](https://github.com/wxt-dev/wxt/pull/996)) + +### ❤️ Contributors + +- Florian Metz ([@Timeraa](http://github.com/Timeraa)) +- Gurvir Singh ([@baraich](http://github.com/baraich)) +- Mezannic +- Aaron ([@aklinker1](http://github.com/aklinker1)) + ## v0.19.10 [compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.9...wxt-v0.19.10) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index f423f48f..5a3703a9 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -1,7 +1,7 @@ { "name": "wxt", "type": "module", - "version": "0.19.10", + "version": "0.19.11", "description": "Next gen framework for developing web extensions", "repository": { "type": "git", From ab26bdc7c1596c301b4750ccbdae0328c6ba153b Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 3 Oct 2024 12:26:36 -0500 Subject: [PATCH 17/62] fix: Use directory name when `zip.name` and `package.json#name` are not provided (#1028) --- packages/wxt/src/core/zip.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/wxt/src/core/zip.ts b/packages/wxt/src/core/zip.ts index de7b17b6..72e6a8a2 100644 --- a/packages/wxt/src/core/zip.ts +++ b/packages/wxt/src/core/zip.ts @@ -28,7 +28,9 @@ export async function zip(config?: InlineConfig): Promise { const projectName = wxt.config.zip.name ?? - safeFilename((await getPackageJson())?.name || path.dirname(process.cwd())); + safeFilename( + (await getPackageJson())?.name || path.basename(process.cwd()), + ); const applyTemplate = (template: string): string => template .replaceAll('{{name}}', projectName) From ca29419db6fd63595488f9f242c904f536501fad Mon Sep 17 00:00:00 2001 From: mezannic <2439519+mezannic@users.noreply.github.com> Date: Thu, 3 Oct 2024 20:04:33 +0200 Subject: [PATCH 18/62] chore: remove email from changelog (#1027) --- packages/wxt/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wxt/CHANGELOG.md b/packages/wxt/CHANGELOG.md index 0ff11555..04f1ab48 100644 --- a/packages/wxt/CHANGELOG.md +++ b/packages/wxt/CHANGELOG.md @@ -22,7 +22,7 @@ - Florian Metz ([@Timeraa](http://github.com/Timeraa)) - Gurvir Singh ([@baraich](http://github.com/baraich)) -- Mezannic +- Mezannic ([@mezannic](http://github.com/mezannic)) - Aaron ([@aklinker1](http://github.com/aklinker1)) ## v0.19.10 From 5b408c2bc2948c5f2b58d794411ddc5c43d00b94 Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 3 Oct 2024 13:08:33 -0500 Subject: [PATCH 19/62] chore: Update dependabot configuration --- .github/dependabot.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6171687e..87dfc80e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,7 +6,9 @@ version: 2 updates: - package-ecosystem: npm - directory: '/' # Location of package manifests + directories: + - / + - packages/* schedule: interval: 'monthly' - package-ecosystem: 'github-actions' From c31a5c30eda176cbacffcec6f0087a8220d9cf73 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:10:26 -0500 Subject: [PATCH 20/62] chore(deps): bump stefanzweifel/git-auto-commit-action from 4 to 5 (#1022) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/vhs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vhs.yml b/.github/workflows/vhs.yml index 13936141..1d822165 100644 --- a/.github/workflows/vhs.yml +++ b/.github/workflows/vhs.yml @@ -20,7 +20,7 @@ jobs: - uses: charmbracelet/vhs-action@v2.1.0 with: path: 'docs/tapes/init-demo.tape' - - uses: stefanzweifel/git-auto-commit-action@v4 + - uses: stefanzweifel/git-auto-commit-action@v5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From b68d1ff82815d636506b95f54cd3f7d990fb341e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:11:46 -0500 Subject: [PATCH 21/62] chore(deps): bump magicast from 0.3.4 to 0.3.5 (#1017) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/wxt/package.json | 2 +- pnpm-lock.yaml | 116 +++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 60 deletions(-) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 5a3703a9..94b3c995 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -109,7 +109,7 @@ "json5": "^2.2.3", "jszip": "^3.10.1", "linkedom": "^0.18.4", - "magicast": "^0.3.4", + "magicast": "^0.3.5", "minimatch": "^10.0.1", "natural-compare": "^1.4.0", "normalize-path": "^3.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49ce96fa..5ec7fb8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -286,7 +286,7 @@ importers: version: 0.5.0 c12: specifier: ^1.11.1 - version: 1.11.1(magicast@0.3.4) + version: 1.11.1(magicast@0.3.5) cac: specifier: ^6.7.14 version: 6.7.14 @@ -348,8 +348,8 @@ importers: specifier: ^0.18.4 version: 0.18.4 magicast: - specifier: ^0.3.4 - version: 0.3.4 + specifier: ^0.3.5 + version: 0.3.5 minimatch: specifier: ^10.0.1 version: 10.0.1 @@ -655,16 +655,12 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.7': resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': @@ -683,13 +679,13 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.24.7': - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true @@ -727,14 +723,14 @@ packages: resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} - '@babel/types@7.24.7': resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2697,10 +2693,12 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2850,6 +2848,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3254,8 +3253,8 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -4033,6 +4032,7 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -5054,7 +5054,7 @@ snapshots: '@babel/generator@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -5069,25 +5069,25 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@babel/helper-function-name@7.24.7': dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@babel/helper-module-imports@7.18.6': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@babel/helper-module-imports@7.24.7': dependencies: '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -5107,19 +5107,17 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-string-parser@7.24.1': {} + '@babel/types': 7.25.6 '@babel/helper-string-parser@7.24.7': {} - '@babel/helper-validator-identifier@7.24.5': {} + '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} @@ -5128,7 +5126,7 @@ snapshots: '@babel/helpers@7.24.7': dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@babel/highlight@7.24.7': dependencies: @@ -5137,13 +5135,13 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.24.5': - dependencies: - '@babel/types': 7.24.5 - '@babel/parser@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 + + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': dependencies: @@ -5169,8 +5167,8 @@ snapshots: '@babel/template@7.24.7': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@babel/traverse@7.24.7': dependencies: @@ -5180,25 +5178,25 @@ snapshots: '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.5': - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - '@babel/types@7.24.7': dependencies: '@babel/helper-string-parser': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@devicefarmer/adbkit-logcat@2.1.3': {} @@ -5781,16 +5779,16 @@ snapshots: '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 '@types/chrome@0.0.268': dependencies: @@ -5916,7 +5914,7 @@ snapshots: istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 magic-string: 0.30.10 - magicast: 0.3.4 + magicast: 0.3.5 std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 @@ -5988,7 +5986,7 @@ snapshots: '@vue/compiler-core@3.4.34': dependencies: - '@babel/parser': 7.24.7 + '@babel/parser': 7.25.6 '@vue/shared': 3.4.34 entities: 4.5.0 estree-walker: 2.0.2 @@ -6001,7 +5999,7 @@ snapshots: '@vue/compiler-sfc@3.4.34': dependencies: - '@babel/parser': 7.24.7 + '@babel/parser': 7.25.6 '@vue/compiler-core': 3.4.34 '@vue/compiler-dom': 3.4.34 '@vue/compiler-ssr': 3.4.34 @@ -6204,7 +6202,7 @@ snapshots: '@babel/core': 7.24.7 '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/types': 7.24.7 + '@babel/types': 7.25.6 html-entities: 2.3.3 validate-html-nesting: 1.2.2 @@ -6309,7 +6307,7 @@ snapshots: pkg-types: 1.2.0 rc9: 2.1.1 - c12@1.11.1(magicast@0.3.4): + c12@1.11.1(magicast@0.3.5): dependencies: chokidar: 3.6.0 confbox: 0.1.7 @@ -6324,7 +6322,7 @@ snapshots: pkg-types: 1.1.1 rc9: 2.1.2 optionalDependencies: - magicast: 0.3.4 + magicast: 0.3.5 cac@6.7.14: {} @@ -7700,10 +7698,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magicast@0.3.4: + magicast@0.3.5: dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 source-map-js: 1.2.0 make-dir@4.0.0: From 84e1fd44eb0d89c08bcda6e33777302373164678 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:13:00 -0500 Subject: [PATCH 22/62] chore(deps): bump esbuild from 0.23.0 to 0.24.0 (#1018) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/wxt/package.json | 2 +- pnpm-lock.yaml | 252 +++++++++++++++++++++++++++++++++++++- 2 files changed, 251 insertions(+), 3 deletions(-) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 94b3c995..bcad76b7 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -96,7 +96,7 @@ "defu": "^6.1.4", "dequal": "^2.0.3", "dotenv": "^16.4.5", - "esbuild": "^0.23.0", + "esbuild": "^0.24.0", "execa": "^9.3.1", "fast-glob": "^3.3.2", "filesize": "^10.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ec7fb8e..697572b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -309,8 +309,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 esbuild: - specifier: ^0.23.0 - version: 0.23.0 + specifier: ^0.24.0 + version: 0.24.0 execa: specifier: ^9.3.1 version: 9.3.1 @@ -791,6 +791,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} @@ -809,6 +815,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} @@ -827,6 +839,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} @@ -845,6 +863,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} @@ -863,6 +887,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} @@ -881,6 +911,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} @@ -899,6 +935,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} @@ -917,6 +959,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} @@ -935,6 +983,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} @@ -953,6 +1007,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} @@ -971,6 +1031,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} @@ -989,6 +1055,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} @@ -1007,6 +1079,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} @@ -1025,6 +1103,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} @@ -1043,6 +1127,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} @@ -1061,6 +1151,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} @@ -1079,6 +1175,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} @@ -1097,12 +1199,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.0': resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} @@ -1121,6 +1235,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} @@ -1139,6 +1259,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} @@ -1157,6 +1283,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} @@ -1175,6 +1307,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} @@ -1193,6 +1331,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@faker-js/faker@8.4.1': resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} @@ -2492,6 +2636,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -5256,6 +5405,9 @@ snapshots: '@esbuild/aix-ppc64@0.23.0': optional: true + '@esbuild/aix-ppc64@0.24.0': + optional: true + '@esbuild/android-arm64@0.19.12': optional: true @@ -5265,6 +5417,9 @@ snapshots: '@esbuild/android-arm64@0.23.0': optional: true + '@esbuild/android-arm64@0.24.0': + optional: true + '@esbuild/android-arm@0.19.12': optional: true @@ -5274,6 +5429,9 @@ snapshots: '@esbuild/android-arm@0.23.0': optional: true + '@esbuild/android-arm@0.24.0': + optional: true + '@esbuild/android-x64@0.19.12': optional: true @@ -5283,6 +5441,9 @@ snapshots: '@esbuild/android-x64@0.23.0': optional: true + '@esbuild/android-x64@0.24.0': + optional: true + '@esbuild/darwin-arm64@0.19.12': optional: true @@ -5292,6 +5453,9 @@ snapshots: '@esbuild/darwin-arm64@0.23.0': optional: true + '@esbuild/darwin-arm64@0.24.0': + optional: true + '@esbuild/darwin-x64@0.19.12': optional: true @@ -5301,6 +5465,9 @@ snapshots: '@esbuild/darwin-x64@0.23.0': optional: true + '@esbuild/darwin-x64@0.24.0': + optional: true + '@esbuild/freebsd-arm64@0.19.12': optional: true @@ -5310,6 +5477,9 @@ snapshots: '@esbuild/freebsd-arm64@0.23.0': optional: true + '@esbuild/freebsd-arm64@0.24.0': + optional: true + '@esbuild/freebsd-x64@0.19.12': optional: true @@ -5319,6 +5489,9 @@ snapshots: '@esbuild/freebsd-x64@0.23.0': optional: true + '@esbuild/freebsd-x64@0.24.0': + optional: true + '@esbuild/linux-arm64@0.19.12': optional: true @@ -5328,6 +5501,9 @@ snapshots: '@esbuild/linux-arm64@0.23.0': optional: true + '@esbuild/linux-arm64@0.24.0': + optional: true + '@esbuild/linux-arm@0.19.12': optional: true @@ -5337,6 +5513,9 @@ snapshots: '@esbuild/linux-arm@0.23.0': optional: true + '@esbuild/linux-arm@0.24.0': + optional: true + '@esbuild/linux-ia32@0.19.12': optional: true @@ -5346,6 +5525,9 @@ snapshots: '@esbuild/linux-ia32@0.23.0': optional: true + '@esbuild/linux-ia32@0.24.0': + optional: true + '@esbuild/linux-loong64@0.19.12': optional: true @@ -5355,6 +5537,9 @@ snapshots: '@esbuild/linux-loong64@0.23.0': optional: true + '@esbuild/linux-loong64@0.24.0': + optional: true + '@esbuild/linux-mips64el@0.19.12': optional: true @@ -5364,6 +5549,9 @@ snapshots: '@esbuild/linux-mips64el@0.23.0': optional: true + '@esbuild/linux-mips64el@0.24.0': + optional: true + '@esbuild/linux-ppc64@0.19.12': optional: true @@ -5373,6 +5561,9 @@ snapshots: '@esbuild/linux-ppc64@0.23.0': optional: true + '@esbuild/linux-ppc64@0.24.0': + optional: true + '@esbuild/linux-riscv64@0.19.12': optional: true @@ -5382,6 +5573,9 @@ snapshots: '@esbuild/linux-riscv64@0.23.0': optional: true + '@esbuild/linux-riscv64@0.24.0': + optional: true + '@esbuild/linux-s390x@0.19.12': optional: true @@ -5391,6 +5585,9 @@ snapshots: '@esbuild/linux-s390x@0.23.0': optional: true + '@esbuild/linux-s390x@0.24.0': + optional: true + '@esbuild/linux-x64@0.19.12': optional: true @@ -5400,6 +5597,9 @@ snapshots: '@esbuild/linux-x64@0.23.0': optional: true + '@esbuild/linux-x64@0.24.0': + optional: true + '@esbuild/netbsd-x64@0.19.12': optional: true @@ -5409,9 +5609,15 @@ snapshots: '@esbuild/netbsd-x64@0.23.0': optional: true + '@esbuild/netbsd-x64@0.24.0': + optional: true + '@esbuild/openbsd-arm64@0.23.0': optional: true + '@esbuild/openbsd-arm64@0.24.0': + optional: true + '@esbuild/openbsd-x64@0.19.12': optional: true @@ -5421,6 +5627,9 @@ snapshots: '@esbuild/openbsd-x64@0.23.0': optional: true + '@esbuild/openbsd-x64@0.24.0': + optional: true + '@esbuild/sunos-x64@0.19.12': optional: true @@ -5430,6 +5639,9 @@ snapshots: '@esbuild/sunos-x64@0.23.0': optional: true + '@esbuild/sunos-x64@0.24.0': + optional: true + '@esbuild/win32-arm64@0.19.12': optional: true @@ -5439,6 +5651,9 @@ snapshots: '@esbuild/win32-arm64@0.23.0': optional: true + '@esbuild/win32-arm64@0.24.0': + optional: true + '@esbuild/win32-ia32@0.19.12': optional: true @@ -5448,6 +5663,9 @@ snapshots: '@esbuild/win32-ia32@0.23.0': optional: true + '@esbuild/win32-ia32@0.24.0': + optional: true + '@esbuild/win32-x64@0.19.12': optional: true @@ -5457,6 +5675,9 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true + '@esbuild/win32-x64@0.24.0': + optional: true + '@faker-js/faker@8.4.1': {} '@img/sharp-darwin-arm64@0.33.5': @@ -6917,6 +7138,33 @@ snapshots: '@esbuild/win32-ia32': 0.23.0 '@esbuild/win32-x64': 0.23.0 + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escalade@3.1.1: {} escalade@3.1.2: {} From e022423bade6483ae1650d5be98ae49b79c5e690 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:13:24 -0500 Subject: [PATCH 23/62] chore(deps): bump @vitejs/plugin-vue from 5.1.1 to 5.1.4 (#1020) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/module-vue/package.json | 2 +- pnpm-lock.yaml | 24 ++++++------------------ 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/packages/module-vue/package.json b/packages/module-vue/package.json index 6f8bd373..36352c58 100644 --- a/packages/module-vue/package.json +++ b/packages/module-vue/package.json @@ -45,7 +45,7 @@ "wxt": ">=0.18.6" }, "dependencies": { - "@vitejs/plugin-vue": "^5.1.1" + "@vitejs/plugin-vue": "^5.1.4" }, "devDependencies": { "@aklinker1/check": "^1.4.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 697572b8..c02391da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,8 +242,8 @@ importers: packages/module-vue: dependencies: '@vitejs/plugin-vue': - specifier: ^5.1.1 - version: 5.1.1(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4)) + specifier: ^5.1.4 + version: 5.1.4(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4)) devDependencies: '@aklinker1/check': specifier: ^1.4.5 @@ -1829,15 +1829,8 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitejs/plugin-vue@5.0.5': - resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 - vue: ^3.2.25 - - '@vitejs/plugin-vue@5.1.1': - resolution: {integrity: sha512-sDckXxlHpMsjRQbAH9WanangrfrblsOd3pNifePs+FOHjJg1jfWq5L/P0PsBRndEt3nmdUnmvieP8ULDeX5AvA==} + '@vitejs/plugin-vue@5.1.4': + resolution: {integrity: sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 @@ -6115,12 +6108,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.5(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4))': - dependencies: - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vue: 3.4.34(typescript@5.5.4) - - '@vitejs/plugin-vue@5.1.1(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4))': + '@vitejs/plugin-vue@5.1.4(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4))': dependencies: vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) vue: 3.4.34(typescript@5.5.4) @@ -9427,7 +9415,7 @@ snapshots: '@shikijs/core': 1.10.3 '@shikijs/transformers': 1.10.3 '@types/markdown-it': 14.1.1 - '@vitejs/plugin-vue': 5.0.5(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4)) + '@vitejs/plugin-vue': 5.1.4(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4)) '@vue/devtools-api': 7.3.6 '@vue/shared': 3.4.31 '@vueuse/core': 10.11.0(vue@3.4.34(typescript@5.5.4)) From edcc411d26f40cc7f836ea11a8de9ff828966586 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:25:11 -0500 Subject: [PATCH 24/62] chore(deps-dev): bump changelogen from 0.5.5 to 0.5.7 (#1019) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 141 +++++++++++++++++++++---------------------------- 2 files changed, 61 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index c11bfe5d..d4797298 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@aklinker1/check": "^1.4.5", "@types/fs-extra": "^11.0.4", "@vitest/coverage-v8": "^2.0.4", - "changelogen": "^0.5.5", + "changelogen": "^0.5.7", "consola": "^3.2.3", "dependency-graph": "^1.0.0", "execa": "^9.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c02391da..bf0828ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^2.0.4 version: 2.0.4(vitest@2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8)) changelogen: - specifier: ^0.5.5 - version: 0.5.5 + specifier: ^0.5.7 + version: 0.5.7(magicast@0.3.5) consola: specifier: ^3.2.3 version: 3.2.3 @@ -2161,9 +2161,6 @@ packages: engines: {'0': node >=0.10.0} hasBin: true - c12@1.10.0: - resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} - c12@1.11.1: resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==} peerDependencies: @@ -2172,6 +2169,14 @@ packages: magicast: optional: true + c12@1.11.2: + resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2217,8 +2222,8 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - changelogen@0.5.5: - resolution: {integrity: sha512-IzgToIJ/R9NhVKmL+PW33ozYkv53bXvufDNUSH3GTKXq1iCHGgkbgbtqEWbo8tnWNnt7nPDpjL8PwSG2iS8RVw==} + changelogen@0.5.7: + resolution: {integrity: sha512-cTZXBcJMl3pudE40WENOakXkcVtrbBpbkmSkM20NdRiUqa4+VYRdXdEsgQ0BNQ6JBE2YymTNWtPKVF7UCTN5+g==} hasBin: true check-error@1.0.3: @@ -2714,10 +2719,6 @@ packages: resolution: {integrity: sha512-I9rAm1w8U3CdhgO4EzTJsCvgcbvynZn9lOySkZf78wUdUIQH2w9QOKf3pAX+THt2XMSSR3kJSuM8P7bYux9j8g==} hasBin: true - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} @@ -2835,12 +2836,10 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} - deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2990,7 +2989,6 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3382,10 +3380,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} @@ -3663,6 +3657,9 @@ packages: ofetch@1.3.3: resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} + ofetch@1.4.0: + resolution: {integrity: sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==} + ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} @@ -3824,9 +3821,6 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - pkg-types@1.1.1: resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} @@ -4076,9 +4070,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - rc9@2.1.1: - resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} - rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -4174,7 +4165,6 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -4247,11 +4237,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.2: resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} @@ -4397,9 +4382,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.6.0: - resolution: {integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==} - std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} @@ -4653,6 +4635,9 @@ packages: ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uhyphen@0.2.0: resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} @@ -5001,6 +4986,11 @@ packages: engines: {node: '>= 14'} hasBin: true + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -6501,21 +6491,6 @@ snapshots: mv: 2.1.1 safe-json-stringify: 1.2.0 - c12@1.10.0: - dependencies: - chokidar: 3.6.0 - confbox: 0.1.7 - defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 1.21.6 - mlly: 1.7.1 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.0 - rc9: 2.1.1 - c12@1.11.1(magicast@0.3.5): dependencies: chokidar: 3.6.0 @@ -6533,6 +6508,23 @@ snapshots: optionalDependencies: magicast: 0.3.5 + c12@1.11.2(magicast@0.3.5): + dependencies: + chokidar: 3.6.0 + confbox: 0.1.7 + defu: 6.1.4 + dotenv: 16.4.5 + giget: 1.2.3 + jiti: 1.21.6 + mlly: 1.7.1 + ohash: 1.1.3 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + pkg-types: 1.2.0 + rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} cacheable-lookup@7.0.0: {} @@ -6594,23 +6586,24 @@ snapshots: chalk@5.3.0: {} - changelogen@0.5.5: + changelogen@0.5.7(magicast@0.3.5): dependencies: - c12: 1.10.0 + c12: 1.11.2(magicast@0.3.5) colorette: 2.0.20 consola: 3.2.3 convert-gitmoji: 0.1.5 - execa: 8.0.1 mri: 1.2.0 node-fetch-native: 1.6.4 - ofetch: 1.3.3 - open: 9.1.0 + ofetch: 1.4.0 + open: 10.1.0 pathe: 1.1.2 - pkg-types: 1.0.3 + pkg-types: 1.2.0 scule: 1.3.0 - semver: 7.5.4 - std-env: 3.6.0 - yaml: 2.5.0 + semver: 7.6.3 + std-env: 3.7.0 + yaml: 2.5.1 + transitivePeerDependencies: + - magicast check-error@1.0.3: dependencies: @@ -7268,8 +7261,6 @@ snapshots: minimist: 1.2.8 xml2js: 0.5.0 - flat@5.0.2: {} - focus-trap@7.5.4: dependencies: tabbable: 6.2.0 @@ -7920,10 +7911,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lunr@2.3.9: {} magic-string@0.30.10: @@ -8194,6 +8181,12 @@ snapshots: node-fetch-native: 1.6.4 ufo: 1.4.0 + ofetch@1.4.0: + dependencies: + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 + ohash@1.1.3: {} once@1.4.0: @@ -8359,12 +8352,6 @@ snapshots: pify@3.0.0: {} - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types@1.1.1: dependencies: confbox: 0.1.7 @@ -8624,12 +8611,6 @@ snapshots: quick-lru@5.1.1: {} - rc9@2.1.1: - dependencies: - defu: 6.1.4 - destr: 2.0.2 - flat: 5.0.2 - rc9@2.1.2: dependencies: defu: 6.1.4 @@ -8820,10 +8801,6 @@ snapshots: semver@6.3.1: {} - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 - semver@7.6.2: {} semver@7.6.3: {} @@ -8982,8 +8959,6 @@ snapshots: stackback@0.0.2: {} - std-env@3.6.0: {} - std-env@3.7.0: {} stdin-discarder@0.1.0: @@ -9223,6 +9198,8 @@ snapshots: ufo@1.5.3: {} + ufo@1.5.4: {} + uhyphen@0.2.0: {} unbox-primitive@1.0.2: @@ -9691,6 +9668,8 @@ snapshots: yaml@2.5.0: {} + yaml@2.5.1: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} From 659bdd46a0381f69499865079f2c93100123e676 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:25:47 -0500 Subject: [PATCH 25/62] chore(deps): bump linkedom from 0.18.4 to 0.18.5 (#1034) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- packages/wxt/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index bcad76b7..67e967b1 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -108,7 +108,7 @@ "jiti": "^1.21.6", "json5": "^2.2.3", "jszip": "^3.10.1", - "linkedom": "^0.18.4", + "linkedom": "^0.18.5", "magicast": "^0.3.5", "minimatch": "^10.0.1", "natural-compare": "^1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf0828ef..3cf68fb0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -345,8 +345,8 @@ importers: specifier: ^3.10.1 version: 3.10.1 linkedom: - specifier: ^0.18.4 - version: 0.18.4 + specifier: ^0.18.5 + version: 0.18.5 magicast: specifier: ^0.3.5 version: 0.3.5 @@ -3303,8 +3303,8 @@ packages: resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - linkedom@0.18.4: - resolution: {integrity: sha512-JhLErxMIEOKByMi3fURXgI1fYOzR87L1Cn0+MI9GlMckFrqFZpV1SUGox1jcKtsKN3y6JgclcQf0FzZT//BuGw==} + linkedom@0.18.5: + resolution: {integrity: sha512-JGLaGGtqtu+eOhYrC1wkWYTBcpVWL4AsnwAtMtgO1Q0gI0PuPJKI0zBBE+a/1BrhOE3Uw8JI/ycByAv5cLrAuQ==} lint-staged@15.2.7: resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==} @@ -7806,7 +7806,7 @@ snapshots: lines-and-columns@2.0.3: {} - linkedom@0.18.4: + linkedom@0.18.5: dependencies: css-select: 5.1.0 cssom: 0.5.0 From 8e9b67fea2eed408541b1cbc147cbdd1dfddb5da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 18:24:43 -0500 Subject: [PATCH 26/62] chore(deps): bump execa from 9.3.1 to 9.4.0 (#1031) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- packages/wxt/package.json | 2 +- pnpm-lock.yaml | 35 +++++++++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index d4797298..4d9d2873 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "changelogen": "^0.5.7", "consola": "^3.2.3", "dependency-graph": "^1.0.0", - "execa": "^9.3.1", + "execa": "^9.4.0", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "hasha": "^6.0.0", diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 67e967b1..a3df3252 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -97,7 +97,7 @@ "dequal": "^2.0.3", "dotenv": "^16.4.5", "esbuild": "^0.24.0", - "execa": "^9.3.1", + "execa": "^9.4.0", "fast-glob": "^3.3.2", "filesize": "^10.1.4", "fs-extra": "^11.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cf68fb0..6f83f79d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 execa: - specifier: ^9.3.1 - version: 9.3.1 + specifier: ^9.4.0 + version: 9.4.0 fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -312,8 +312,8 @@ importers: specifier: ^0.24.0 version: 0.24.0 execa: - specifier: ^9.3.1 - version: 9.3.1 + specifier: ^9.4.0 + version: 9.4.0 fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -2684,8 +2684,8 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.3.1: - resolution: {integrity: sha512-gdhefCCNy/8tpH/2+ajP9IQc14vXchNdd0weyzSJEFURhRMGncQ+zKFxwjAufIewPEJm9BPOaJnvg2UtlH2gPQ==} + execa@9.4.0: + resolution: {integrity: sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==} engines: {node: ^18.19.0 || >=20.5.0} extract-zip@2.0.1: @@ -2836,10 +2836,12 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2989,6 +2991,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3631,6 +3634,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -4165,6 +4172,7 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -4656,6 +4664,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unimport@3.11.1: resolution: {integrity: sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==} @@ -7202,7 +7214,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.3.1: + execa@9.4.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.3 @@ -7211,7 +7223,7 @@ snapshots: human-signals: 8.0.0 is-plain-obj: 4.1.0 is-stream: 4.0.1 - npm-run-path: 5.3.0 + npm-run-path: 6.0.0 pretty-ms: 9.0.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 @@ -8149,6 +8161,11 @@ snapshots: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -9244,6 +9261,8 @@ snapshots: undici-types@5.26.5: {} + unicorn-magic@0.3.0: {} + unimport@3.11.1(rollup@4.19.0): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.19.0) From faa4fcb718da9db469ac214a4217a888914dd684 Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 3 Oct 2024 18:47:16 -0500 Subject: [PATCH 27/62] chore: Upgrade all non-major dependencies (#1040) --- package.json | 18 +- packages/auto-icons/package.json | 6 +- packages/i18n/package.json | 10 +- packages/module-react/package.json | 8 +- packages/module-solid/package.json | 6 +- packages/module-svelte/package.json | 6 +- packages/module-vue/package.json | 4 +- packages/wxt-demo/package.json | 8 +- packages/wxt/package.json | 28 +- packages/wxt/src/browser/index.ts | 16 +- pnpm-lock.yaml | 2149 +++++++++++++++------------ templates/react/package.json | 8 +- templates/solid/package.json | 8 +- templates/svelte/package.json | 12 +- templates/vanilla/package.json | 4 +- templates/vue/package.json | 10 +- 16 files changed, 1294 insertions(+), 1007 deletions(-) diff --git a/package.json b/package.json index 4d9d2873..bc0e1a55 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "engines": { "node": ">=18.20.3" }, - "packageManager": "pnpm@9.6.0", + "packageManager": "pnpm@9.12.0", "scripts": { "check": "check && pnpm -r --sequential run check", "test": "pnpm -r --sequential run test run", @@ -17,10 +17,10 @@ "docs:preview": "pnpm -s docs:gen && vitepress preview docs" }, "devDependencies": { - "@aklinker1/buildc": "^1.1.1", + "@aklinker1/buildc": "^1.1.4", "@aklinker1/check": "^1.4.5", "@types/fs-extra": "^11.0.4", - "@vitest/coverage-v8": "^2.0.4", + "@vitest/coverage-v8": "^2.1.2", "changelogen": "^0.5.7", "consola": "^3.2.3", "dependency-graph": "^1.0.0", @@ -28,7 +28,7 @@ "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "hasha": "^6.0.0", - "lint-staged": "^15.2.7", + "lint-staged": "^15.2.10", "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "simple-git-hooks": "^2.11.1", @@ -36,12 +36,12 @@ "typedoc": "^0.25.4", "typedoc-plugin-markdown": "4.0.0-next.23", "typedoc-vitepress-theme": "1.0.0-next.3", - "typescript": "^5.5.4", - "vitepress": "^1.3.1", - "vitest-mock-extended": "^2.0.0", - "vue": "^3.4.34", + "typescript": "^5.6.2", + "vitepress": "^1.3.4", + "vitest-mock-extended": "^2.0.2", + "vue": "^3.5.11", "wxt": "workspace:*", - "yaml": "^2.5.0" + "yaml": "^2.5.1" }, "simple-git-hooks": { "pre-commit": "pnpm lint-staged" diff --git a/packages/auto-icons/package.json b/packages/auto-icons/package.json index a2e0584a..5f2e8ff1 100644 --- a/packages/auto-icons/package.json +++ b/packages/auto-icons/package.json @@ -46,9 +46,9 @@ }, "devDependencies": { "@aklinker1/check": "^1.4.5", - "oxlint": "^0.9.1", - "publint": "^0.2.9", - "typescript": "^5.5.4", + "oxlint": "^0.9.9", + "publint": "^0.2.11", + "typescript": "^5.6.2", "unbuild": "^2.0.0", "wxt": "workspace:*" }, diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 653b8d54..2bc1ffd7 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -40,12 +40,12 @@ "devDependencies": { "@aklinker1/check": "^1.4.5", "@types/chrome": "^0.0.268", - "@types/node": "^20.14.2", - "oxlint": "^0.9.1", - "publint": "^0.2.8", - "typescript": "^5.4.5", + "@types/node": "^20.16.10", + "oxlint": "^0.9.9", + "publint": "^0.2.11", + "typescript": "^5.6.2", "unbuild": "^2.0.0", - "vitest": "^1.6.0", + "vitest": "^2.0.0", "vitest-plugin-random-seed": "^1.1.0", "wxt": "workspace:*" }, diff --git a/packages/module-react/package.json b/packages/module-react/package.json index 029f20c0..cae6ef57 100644 --- a/packages/module-react/package.json +++ b/packages/module-react/package.json @@ -47,16 +47,16 @@ "wxt": ">=0.18.6" }, "dependencies": { - "@vitejs/plugin-react": "^4.3.1" + "@vitejs/plugin-react": "^4.3.2" }, "devDependencies": { "@aklinker1/check": "^1.4.5", - "@types/react": "^18.3.3", + "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", - "publint": "^0.2.9", + "publint": "^0.2.11", "react": "^18.3.1", "react-dom": "^18.3.1", - "typescript": "^5.5.4", + "typescript": "^5.6.2", "unbuild": "^2.0.0", "wxt": "workspace:*" } diff --git a/packages/module-solid/package.json b/packages/module-solid/package.json index 4e02a4d2..81fcb53c 100644 --- a/packages/module-solid/package.json +++ b/packages/module-solid/package.json @@ -51,9 +51,9 @@ }, "devDependencies": { "@aklinker1/check": "^1.4.5", - "publint": "^0.2.9", - "solid-js": "^1.8.19", - "typescript": "^5.5.4", + "publint": "^0.2.11", + "solid-js": "^1.9.1", + "typescript": "^5.6.2", "unbuild": "^2.0.0", "wxt": "workspace:*" } diff --git a/packages/module-svelte/package.json b/packages/module-svelte/package.json index 5cc7157a..61a6d1d6 100644 --- a/packages/module-svelte/package.json +++ b/packages/module-svelte/package.json @@ -45,12 +45,12 @@ "wxt": ">=0.18.6" }, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^3.1.1" + "@sveltejs/vite-plugin-svelte": "^3.1.2" }, "devDependencies": { "@aklinker1/check": "^1.4.5", - "publint": "^0.2.9", - "typescript": "^5.5.4", + "publint": "^0.2.11", + "typescript": "^5.6.2", "unbuild": "^2.0.0", "wxt": "workspace:*" } diff --git a/packages/module-vue/package.json b/packages/module-vue/package.json index 36352c58..a0e77d38 100644 --- a/packages/module-vue/package.json +++ b/packages/module-vue/package.json @@ -49,8 +49,8 @@ }, "devDependencies": { "@aklinker1/check": "^1.4.5", - "publint": "^0.2.9", - "typescript": "^5.5.4", + "publint": "^0.2.11", + "typescript": "^5.6.2", "unbuild": "^2.0.0", "wxt": "workspace:*" } diff --git a/packages/wxt-demo/package.json b/packages/wxt-demo/package.json index 53e1d202..848810d8 100644 --- a/packages/wxt-demo/package.json +++ b/packages/wxt-demo/package.json @@ -23,12 +23,12 @@ }, "devDependencies": { "@types/chrome": "^0.0.269", - "@types/react": "^18.3.3", + "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", "@wxt-dev/auto-icons": "workspace:*", - "sass": "^1.77.8", - "typescript": "^5.5.4", - "vitest": "^2.0.4", + "sass": "^1.79.4", + "typescript": "^5.6.2", + "vitest": "^2.1.2", "vitest-plugin-random-seed": "^1.1.0", "wxt": "workspace:*" }, diff --git a/packages/wxt/package.json b/packages/wxt/package.json index a3df3252..12656d1c 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -88,7 +88,7 @@ "@webext-core/isolated-element": "^1.1.2", "@webext-core/match-patterns": "^1.0.3", "async-mutex": "^0.5.0", - "c12": "^1.11.1", + "c12": "^1.11.2", "cac": "^6.7.14", "chokidar": "^3.6.0", "ci-info": "^4.0.0", @@ -99,7 +99,7 @@ "esbuild": "^0.24.0", "execa": "^9.4.0", "fast-glob": "^3.3.2", - "filesize": "^10.1.4", + "filesize": "^10.1.6", "fs-extra": "^11.2.0", "get-port": "^7.1.0", "giget": "^1.2.3", @@ -113,18 +113,18 @@ "minimatch": "^10.0.1", "natural-compare": "^1.4.0", "normalize-path": "^3.0.0", - "nypm": "^0.3.9", - "ohash": "^1.1.3", + "nypm": "^0.3.12", + "ohash": "^1.1.4", "open": "^10.1.0", "ora": "^8.1.0", "perfect-debounce": "^1.0.0", - "picocolors": "^1.0.1", + "picocolors": "^1.1.0", "prompts": "^2.4.2", - "publish-browser-extension": "^2.1.3", + "publish-browser-extension": "^2.2.2", "scule": "^1.3.0", - "unimport": "^3.11.1", - "vite": "^5.3.5", - "vite-node": "^2.0.4", + "unimport": "^3.13.1", + "vite": "^5.4.8", + "vite-node": "^2.1.2", "web-ext-run": "^0.2.1", "webextension-polyfill": "^0.12.0" }, @@ -134,19 +134,19 @@ "@types/fs-extra": "^11.0.4", "@types/lodash.merge": "^4.6.9", "@types/natural-compare": "^1.4.3", - "@types/node": "^20.14.12", + "@types/node": "^20.16.10", "@types/normalize-path": "^3.0.2", "@types/prompts": "^2.4.9", "extract-zip": "^2.0.1", "happy-dom": "^14.12.3", "lodash.merge": "^4.6.2", - "oxlint": "^0.9.1", + "oxlint": "^0.9.9", "p-map": "^7.0.2", - "publint": "^0.2.9", + "publint": "^0.2.11", "tsx": "4.15.7", - "typescript": "^5.5.4", + "typescript": "^5.6.2", "unbuild": "^2.0.0", - "vitest": "^2.0.4", + "vitest": "^2.1.2", "vitest-plugin-random-seed": "^1.1.0" }, "peerDependenciesMeta": { diff --git a/packages/wxt/src/browser/index.ts b/packages/wxt/src/browser/index.ts index eeb0a4f3..3eb44e11 100644 --- a/packages/wxt/src/browser/index.ts +++ b/packages/wxt/src/browser/index.ts @@ -11,13 +11,17 @@ export type AugmentedBrowser = Omit & { i18n: WxtI18n & Omit; }; -export interface WxtRuntime { - // Overriden per-project -} +/** + * This interface is empty because it is generated per-project when running `wxt prepare`. See: + * - `.wxt/types/paths.d.ts` + */ +export interface WxtRuntime {} -export interface WxtI18n { - // Overriden per-project -} +/** + * This interface is empty because it is generated per-project when running `wxt prepare`. See: + * - `.wxt/types/i18n.d.ts` + */ +export interface WxtI18n {} export const browser: AugmentedBrowser = originalBrowser; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6f83f79d..2fdba416 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: devDependencies: '@aklinker1/buildc': - specifier: ^1.1.1 - version: 1.1.1(typescript@5.5.4) + specifier: ^1.1.4 + version: 1.1.4 '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 '@vitest/coverage-v8': - specifier: ^2.0.4 - version: 2.0.4(vitest@2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8)) + specifier: ^2.1.2 + version: 2.1.2(vitest@2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4)) changelogen: specifier: ^0.5.7 version: 0.5.7(magicast@0.3.5) @@ -42,8 +42,8 @@ importers: specifier: ^6.0.0 version: 6.0.0 lint-staged: - specifier: ^15.2.7 - version: 15.2.7 + specifier: ^15.2.10 + version: 15.2.10 npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -58,31 +58,31 @@ importers: version: 4.15.7 typedoc: specifier: ^0.25.4 - version: 0.25.4(typescript@5.5.4) + version: 0.25.4(typescript@5.6.2) typedoc-plugin-markdown: specifier: 4.0.0-next.23 - version: 4.0.0-next.23(typedoc@0.25.4(typescript@5.5.4)) + version: 4.0.0-next.23(typedoc@0.25.4(typescript@5.6.2)) typedoc-vitepress-theme: specifier: 1.0.0-next.3 - version: 1.0.0-next.3(typedoc-plugin-markdown@4.0.0-next.23(typedoc@0.25.4(typescript@5.5.4))) + version: 1.0.0-next.3(typedoc-plugin-markdown@4.0.0-next.23(typedoc@0.25.4(typescript@5.6.2))) typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 vitepress: - specifier: ^1.3.1 - version: 1.3.1(@algolia/client-search@4.20.0)(@types/node@20.14.12)(@types/react@18.3.3)(postcss@8.4.39)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)(search-insights@2.15.0)(typescript@5.5.4) + specifier: ^1.3.4 + version: 1.3.4(@algolia/client-search@4.20.0)(@types/node@20.16.10)(@types/react@18.3.11)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4)(search-insights@2.15.0)(typescript@5.6.2) vitest-mock-extended: - specifier: ^2.0.0 - version: 2.0.0(typescript@5.5.4)(vitest@2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8)) + specifier: ^2.0.2 + version: 2.0.2(typescript@5.6.2)(vitest@2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4)) vue: - specifier: ^3.4.34 - version: 3.4.34(typescript@5.5.4) + specifier: ^3.5.11 + version: 3.5.11(typescript@5.6.2) wxt: specifier: workspace:* version: link:packages/wxt yaml: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^2.5.1 + version: 2.5.1 packages/auto-icons: dependencies: @@ -98,19 +98,19 @@ importers: devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) oxlint: - specifier: ^0.9.1 - version: 0.9.1 + specifier: ^0.9.9 + version: 0.9.9 publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) wxt: specifier: workspace:* version: link:../wxt @@ -129,31 +129,31 @@ importers: devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) '@types/chrome': specifier: ^0.0.268 version: 0.0.268 '@types/node': - specifier: ^20.14.2 - version: 20.14.12 + specifier: ^20.16.10 + version: 20.16.10 oxlint: - specifier: ^0.9.1 - version: 0.9.1 + specifier: ^0.9.9 + version: 0.9.9 publint: - specifier: ^0.2.8 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 typescript: - specifier: ^5.4.5 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8) + specifier: ^2.0.0 + version: 2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4) vitest-plugin-random-seed: specifier: ^1.1.0 - version: 1.1.0(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + version: 1.1.0(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) wxt: specifier: workspace:* version: link:../wxt @@ -161,21 +161,21 @@ importers: packages/module-react: dependencies: '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + specifier: ^4.3.2 + version: 4.3.2(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) '@types/react': - specifier: ^18.3.3 - version: 18.3.3 + specifier: ^18.3.11 + version: 18.3.11 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 react: specifier: ^18.3.1 version: 18.3.1 @@ -183,11 +183,11 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) wxt: specifier: workspace:* version: link:../wxt @@ -196,23 +196,23 @@ importers: dependencies: vite-plugin-solid: specifier: ^2.10.2 - version: 2.10.2(solid-js@1.8.19)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + version: 2.10.2(solid-js@1.9.1)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 solid-js: - specifier: ^1.8.19 - version: 1.8.19 + specifier: ^1.9.1 + version: 1.9.1 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) wxt: specifier: workspace:* version: link:../wxt @@ -220,21 +220,21 @@ importers: packages/module-svelte: dependencies: '@sveltejs/vite-plugin-svelte': - specifier: ^3.1.1 - version: 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + specifier: ^3.1.2 + version: 3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) wxt: specifier: workspace:* version: link:../wxt @@ -243,20 +243,20 @@ importers: dependencies: '@vitejs/plugin-vue': specifier: ^5.1.4 - version: 5.1.4(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4)) + version: 5.1.4(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))(vue@3.5.11(typescript@5.6.2)) devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) wxt: specifier: workspace:* version: link:../wxt @@ -265,7 +265,7 @@ importers: dependencies: '@aklinker1/rollup-plugin-visualizer': specifier: 5.12.0 - version: 5.12.0(rollup@4.19.0) + version: 5.12.0(rollup@4.24.0) '@types/chrome': specifier: ^0.0.269 version: 0.0.269 @@ -285,8 +285,8 @@ importers: specifier: ^0.5.0 version: 0.5.0 c12: - specifier: ^1.11.1 - version: 1.11.1(magicast@0.3.5) + specifier: ^1.11.2 + version: 1.11.2(magicast@0.3.5) cac: specifier: ^6.7.14 version: 6.7.14 @@ -318,8 +318,8 @@ importers: specifier: ^3.3.2 version: 3.3.2 filesize: - specifier: ^10.1.4 - version: 10.1.4 + specifier: ^10.1.6 + version: 10.1.6 fs-extra: specifier: ^11.2.0 version: 11.2.0 @@ -360,11 +360,11 @@ importers: specifier: ^3.0.0 version: 3.0.0 nypm: - specifier: ^0.3.9 - version: 0.3.9 + specifier: ^0.3.12 + version: 0.3.12 ohash: - specifier: ^1.1.3 - version: 1.1.3 + specifier: ^1.1.4 + version: 1.1.4 open: specifier: ^10.1.0 version: 10.1.0 @@ -375,26 +375,26 @@ importers: specifier: ^1.0.0 version: 1.0.0 picocolors: - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^1.1.0 + version: 1.1.0 prompts: specifier: ^2.4.2 version: 2.4.2 publish-browser-extension: - specifier: ^2.1.3 - version: 2.1.3 + specifier: ^2.2.2 + version: 2.2.2 scule: specifier: ^1.3.0 version: 1.3.0 unimport: - specifier: ^3.11.1 - version: 3.11.1(rollup@4.19.0) + specifier: ^3.13.1 + version: 3.13.1(rollup@4.24.0)(webpack-sources@3.2.3) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.12)(sass@1.77.8) + specifier: ^5.4.8 + version: 5.4.8(@types/node@20.16.10)(sass@1.79.4) vite-node: - specifier: ^2.0.4 - version: 2.0.4(@types/node@20.14.12)(sass@1.77.8) + specifier: ^2.1.2 + version: 2.1.2(@types/node@20.16.10)(sass@1.79.4) web-ext-run: specifier: ^0.2.1 version: 0.2.1 @@ -404,7 +404,7 @@ importers: devDependencies: '@aklinker1/check': specifier: ^1.4.5 - version: 1.4.5(typescript@5.5.4) + version: 1.4.5(typescript@5.6.2) '@faker-js/faker': specifier: ^8.4.1 version: 8.4.1 @@ -418,8 +418,8 @@ importers: specifier: ^1.4.3 version: 1.4.3 '@types/node': - specifier: ^20.14.12 - version: 20.14.12 + specifier: ^20.16.10 + version: 20.16.10 '@types/normalize-path': specifier: ^3.0.2 version: 3.0.2 @@ -436,29 +436,29 @@ importers: specifier: ^4.6.2 version: 4.6.2 oxlint: - specifier: ^0.9.1 - version: 0.9.1 + specifier: ^0.9.9 + version: 0.9.9 p-map: specifier: ^7.0.2 version: 7.0.2 publint: - specifier: ^0.2.9 - version: 0.2.9 + specifier: ^0.2.11 + version: 0.2.11 tsx: specifier: 4.15.7 version: 4.15.7 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.77.8)(typescript@5.5.4) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) vitest: - specifier: ^2.0.4 - version: 2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8) + specifier: ^2.1.2 + version: 2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4) vitest-plugin-random-seed: specifier: ^1.1.0 - version: 1.1.0(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + version: 1.1.0(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) packages/wxt-demo: dependencies: @@ -476,8 +476,8 @@ importers: specifier: ^0.0.269 version: 0.0.269 '@types/react': - specifier: ^18.3.3 - version: 18.3.3 + specifier: ^18.3.11 + version: 18.3.11 '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 @@ -485,28 +485,26 @@ importers: specifier: workspace:* version: link:../auto-icons sass: - specifier: ^1.77.8 - version: 1.77.8 + specifier: ^1.79.4 + version: 1.79.4 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.6.2 + version: 5.6.2 vitest: - specifier: ^2.0.4 - version: 2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8) + specifier: ^2.1.2 + version: 2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4) vitest-plugin-random-seed: specifier: ^1.1.0 - version: 1.1.0(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + version: 1.1.0(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) wxt: specifier: workspace:* version: link:../wxt packages: - '@aklinker1/buildc@1.1.1': - resolution: {integrity: sha512-QuR0c0TkA/8BXh9g+MbLch7FajeBZXZWnKxIsAu4B1zVtMkKze1gvsnoiwRfyVoDjOzqO47RItc1DnCMBPHyvg==} + '@aklinker1/buildc@1.1.4': + resolution: {integrity: sha512-3SQ2zVEsX+UWg/mHfp9TqU9OPI8abRGTOadChQB0Aqb4dtIy311pBddndVPuuD4uQfIhKbvPxkzZ0rwvlw52Rw==} hasBin: true - peerDependencies: - typescript: ^5.0.0 '@aklinker1/check@1.4.5': resolution: {integrity: sha512-whVpnpSK4qa4/83q22JAmxwRAEj35qYs8eIH/tX1C6rKbiwx7EL6kQVmSAhCe1NYqzoIWyOgsISdDPyHjC+h2A==} @@ -601,22 +599,42 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.25.7': + resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.24.7': resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.7': + resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==} + engines: {node: '>=6.9.0'} + '@babel/core@7.24.7': resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} + '@babel/core@7.25.7': + resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.24.7': resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.25.7': + resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.24.7': resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.7': + resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} + engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.24.7': resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} @@ -637,12 +655,22 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.7': + resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.24.7': resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.25.7': + resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.24.7': resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} @@ -651,6 +679,10 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.25.7': + resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.24.7': resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} @@ -663,22 +695,42 @@ packages: resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.7': + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.7': resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.7': + resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.7': resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.25.7': + resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.7': + resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.24.7': resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} @@ -689,6 +741,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.25.7': + resolution: {integrity: sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-jsx@7.24.7': resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} @@ -719,10 +776,18 @@ packages: resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.7': + resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.7': resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.7': + resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.24.7': resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} @@ -731,6 +796,10 @@ packages: resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} + '@babel/types@7.25.7': + resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -747,14 +816,14 @@ packages: engines: {node: '>= 0.10.4'} hasBin: true - '@docsearch/css@3.6.0': - resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} + '@docsearch/css@3.6.2': + resolution: {integrity: sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw==} - '@docsearch/js@3.6.0': - resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} + '@docsearch/js@3.6.2': + resolution: {integrity: sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA==} - '@docsearch/react@3.6.0': - resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} + '@docsearch/react@3.6.2': + resolution: {integrity: sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -1454,10 +1523,6 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1491,43 +1556,43 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxlint/darwin-arm64@0.9.1': - resolution: {integrity: sha512-SzYTggt2eJqMhemijEv9AszSdc8Vv1OBQbmAZpDNPHmwlDzPKEopSrDURwt/Jq56FYsJC/jhzBzrJLXSK55i1A==} + '@oxlint/darwin-arm64@0.9.9': + resolution: {integrity: sha512-My2KfUByjRl49p0rr/Glx9Y/hjney1uFk0JXNjwHqYToHqO9fY/IZ6XT1fdw9sX+1hdpq9bmj88rnkpvu0/cRw==} cpu: [arm64] os: [darwin] - '@oxlint/darwin-x64@0.9.1': - resolution: {integrity: sha512-IDgjpNdtt2XkEcWDIhFyZCkIIonqlBQf3jQ2L1voGQxQFwjl+cP9+hdpFp/m89qGO708MULeegCH+MGq28xWbg==} + '@oxlint/darwin-x64@0.9.9': + resolution: {integrity: sha512-k0r0t+MAzrk8yWs0nxyD9Skfb+Ozmu6HRMTJIsUTLV4AKMt9CZBlLVS0OXzXHi72AOHz3UUve5rXxevVVY9lHQ==} cpu: [x64] os: [darwin] - '@oxlint/linux-arm64-gnu@0.9.1': - resolution: {integrity: sha512-kEGN/CNdUB11So4c3OpTIJi0YvPgu5i9gvUcWX+CxEkeACRPj8dq7/Rm1FgfIqky6oYY5QjXDioZ+yKt+Xw1rQ==} + '@oxlint/linux-arm64-gnu@0.9.9': + resolution: {integrity: sha512-atiotr1pN3rr0i7Ww3SpOEOvkFex97S8GwYmiTlSng0kp+FSIZD6Kjlr9k3oayf9RZUDRuAE4WptwV1KYLvIDw==} cpu: [arm64] os: [linux] - '@oxlint/linux-arm64-musl@0.9.1': - resolution: {integrity: sha512-US5UVB7JDwNuQa2+RZyWzEtgjEOA9wAvwUy8oUmgqomo02cpCrZo3wOQAvAckE5KxJCskr7T6pGW9eA8y3IhsQ==} + '@oxlint/linux-arm64-musl@0.9.9': + resolution: {integrity: sha512-vmd6Eog6WiudMTT0Fa8u5N+47caaWF2KVUHOSEV/d/WauVx+ZOR9z1LEM+54AZwn3Z2TbtFOJDiz7iDukZPbfw==} cpu: [arm64] os: [linux] - '@oxlint/linux-x64-gnu@0.9.1': - resolution: {integrity: sha512-w2Sz/WevEa6FxDjwwg9xbmpebDmLXO9YCvUUs5K4emKhzh05xEwuXrD2kJuQUdFapiHHQUMTQ5/iBF0NOPb9Uw==} + '@oxlint/linux-x64-gnu@0.9.9': + resolution: {integrity: sha512-AUmSRerK4VXIMcTYYk25KGoOU2/z+NGItUhI6nJgMFktrbF8MUD6hlf3vaQZNle454z7FDJNSjARM0bB+xpBiQ==} cpu: [x64] os: [linux] - '@oxlint/linux-x64-musl@0.9.1': - resolution: {integrity: sha512-hSukTLTn+wKyJUbR3934bOmWNoDaJv4yJwumE6QqBQZWoFNyd3seiYJLPWD+7aMJx6nOnot8uqjnvYO1QZsccA==} + '@oxlint/linux-x64-musl@0.9.9': + resolution: {integrity: sha512-jQYIx5KUYbpXbXBFPgIwRPLSm3AO5wa+32BQYASIOCPcsPywV+HJKbQpzmWqXDYel6hrifmIxspgxHhGMlHJ1Q==} cpu: [x64] os: [linux] - '@oxlint/win32-arm64@0.9.1': - resolution: {integrity: sha512-9Y7RuvnulhZyxLdsDrGRaojxytzcBTGHpl7AxED41G/IXGPOs+dE1q2NFyHWB6Gfzi/MJZ6plXYIOKx/e/3t/g==} + '@oxlint/win32-arm64@0.9.9': + resolution: {integrity: sha512-HSOztIKmiivfUAoxGx4qyerYV+aAXGvKbwWf8j4RorAEg2WWBdhVe9XHoSdqgYsOBi1515+YXxXiSRX3F/0xAg==} cpu: [arm64] os: [win32] - '@oxlint/win32-x64@0.9.1': - resolution: {integrity: sha512-51wrzMDGFyCYZbhSczU9VS7EYe1N0tNlDfdne6VCKgpPPJX0+XLZHybgUFZNYVyf7/W5t1/gpyOTFErVYRP0pw==} + '@oxlint/win32-x64@0.9.9': + resolution: {integrity: sha512-T1/tNxqoYd/MMqi1dhSVzAVL0ZINvXDBEQWm6OCSrrjRM6c9UQydTzsgLWfvm9uHWngcMuRGXhN3F+D6KEYs3w==} cpu: [x64] os: [win32] @@ -1601,97 +1666,115 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.19.0': - resolution: {integrity: sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==} + '@rollup/pluginutils@5.1.2': + resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.24.0': + resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.19.0': - resolution: {integrity: sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==} + '@rollup/rollup-android-arm64@4.24.0': + resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.19.0': - resolution: {integrity: sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==} + '@rollup/rollup-darwin-arm64@4.24.0': + resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.19.0': - resolution: {integrity: sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==} + '@rollup/rollup-darwin-x64@4.24.0': + resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.19.0': - resolution: {integrity: sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==} + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.19.0': - resolution: {integrity: sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==} + '@rollup/rollup-linux-arm-musleabihf@4.24.0': + resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.19.0': - resolution: {integrity: sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==} + '@rollup/rollup-linux-arm64-gnu@4.24.0': + resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.19.0': - resolution: {integrity: sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==} + '@rollup/rollup-linux-arm64-musl@4.24.0': + resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.19.0': - resolution: {integrity: sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.19.0': - resolution: {integrity: sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==} + '@rollup/rollup-linux-riscv64-gnu@4.24.0': + resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.19.0': - resolution: {integrity: sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==} + '@rollup/rollup-linux-s390x-gnu@4.24.0': + resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.19.0': - resolution: {integrity: sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==} + '@rollup/rollup-linux-x64-gnu@4.24.0': + resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.19.0': - resolution: {integrity: sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==} + '@rollup/rollup-linux-x64-musl@4.24.0': + resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.19.0': - resolution: {integrity: sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==} + '@rollup/rollup-win32-arm64-msvc@4.24.0': + resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.19.0': - resolution: {integrity: sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==} + '@rollup/rollup-win32-ia32-msvc@4.24.0': + resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.19.0': - resolution: {integrity: sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==} + '@rollup/rollup-win32-x64-msvc@4.24.0': + resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} cpu: [x64] os: [win32] '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@1.10.3': - resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} + '@shikijs/core@1.21.0': + resolution: {integrity: sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==} - '@shikijs/transformers@1.10.3': - resolution: {integrity: sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==} + '@shikijs/engine-javascript@1.21.0': + resolution: {integrity: sha512-jxQHNtVP17edFW4/0vICqAVLDAxmyV31MQJL4U/Kg+heQALeKYVOWo0sMmEZ18FqBt+9UCdyqGKYE7bLRtk9mg==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@shikijs/engine-oniguruma@1.21.0': + resolution: {integrity: sha512-AIZ76XocENCrtYzVU7S4GY/HL+tgHGbVU+qhiDyNw1qgCA5OSi4B4+HY4BtAoJSMGuD/L5hfTzoRVbzEm2WTvg==} + + '@shikijs/transformers@1.21.0': + resolution: {integrity: sha512-aA+XGGSzipcvqdsOYL8l6Q2RYiMuJNdhdt9eZnkJmW+wjSOixN/I7dBq3fISwvEMDlawrtuXM3eybLCEC+Fjlg==} + + '@shikijs/types@1.21.0': + resolution: {integrity: sha512-tzndANDhi5DUndBtpojEq/42+dpUF2wS7wdCDQaFtIXm3Rd1QkrcVgSSRLOvEwexekihOXfbYJINW37g96tJRw==} + + '@shikijs/vscode-textmate@9.2.2': + resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} '@sindresorhus/is@5.4.1': resolution: {integrity: sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==} @@ -1709,8 +1792,8 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 - '@sveltejs/vite-plugin-svelte@3.1.1': - resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==} + '@sveltejs/vite-plugin-svelte@3.1.2': + resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 @@ -1745,6 +1828,9 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/filesystem@0.0.36': resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} @@ -1775,8 +1861,11 @@ packages: '@types/lodash@4.14.200': resolution: {integrity: sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==} - '@types/markdown-it@14.1.1': - resolution: {integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==} + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} @@ -1790,8 +1879,8 @@ packages: '@types/node@20.10.3': resolution: {integrity: sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==} - '@types/node@20.14.12': - resolution: {integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==} + '@types/node@20.16.10': + resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} '@types/normalize-path@3.0.2': resolution: {integrity: sha512-DO++toKYPaFn0Z8hQ7Tx+3iT9t77IJo/nDiqTXilgEP+kPNIYdpS9kh3fXuc53ugqwp9pxC1PVjCpV1tQDyqMA==} @@ -1805,8 +1894,8 @@ packages: '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/react@18.3.11': + resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -1823,8 +1912,11 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@vitejs/plugin-react@4.3.1': - resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react@4.3.2': + resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 @@ -1836,103 +1928,101 @@ packages: vite: ^5.0.0 vue: ^3.2.25 - '@vitest/coverage-v8@2.0.4': - resolution: {integrity: sha512-i4lx/Wpg5zF1h2op7j0wdwuEQxaL/YTwwQaKuKMHYj7MMh8c7I4W7PNfOptZBCSBZI0z1qwn64o0pM/pA8Tz1g==} + '@vitest/coverage-v8@2.1.2': + resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==} peerDependencies: - vitest: 2.0.4 + '@vitest/browser': 2.1.2 + vitest: 2.1.2 + peerDependenciesMeta: + '@vitest/browser': + optional: true - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.1.2': + resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} - '@vitest/expect@2.0.4': - resolution: {integrity: sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==} - - '@vitest/pretty-format@2.0.4': - resolution: {integrity: sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==} - - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} - - '@vitest/runner@2.0.4': - resolution: {integrity: sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==} - - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - - '@vitest/snapshot@2.0.4': - resolution: {integrity: sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==} - - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - - '@vitest/spy@2.0.4': - resolution: {integrity: sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==} - - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - - '@vitest/utils@2.0.4': - resolution: {integrity: sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==} - - '@vue/compiler-core@3.4.34': - resolution: {integrity: sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==} - - '@vue/compiler-dom@3.4.34': - resolution: {integrity: sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==} - - '@vue/compiler-sfc@3.4.34': - resolution: {integrity: sha512-x6lm0UrM03jjDXTPZgD9Ad8bIVD1ifWNit2EaWQIZB5CULr46+FbLQ5RpK7AXtDHGjx9rmvC7QRCTjsiGkAwRw==} - - '@vue/compiler-ssr@3.4.34': - resolution: {integrity: sha512-8TDBcLaTrFm5rnF+Qm4BlliaopJgqJ28Nsrc80qazynm5aJO+Emu7y0RWw34L8dNnTRdcVBpWzJxhGYzsoVu4g==} - - '@vue/devtools-api@7.3.6': - resolution: {integrity: sha512-z6cKyxdXrIGgA++eyGBfquj6dCplRdgjt+I18fJx8hjWTXDTIyeQvryyEBMchnfZVyvUTjK3QjGjDpLCnJxPjw==} - - '@vue/devtools-kit@7.3.6': - resolution: {integrity: sha512-5Ym9V3fkJenEoptqKoo+cgY5RTVwrSssFdzRsuyIgaeiskCT+rRJeQdwoo81tyrQ1mfS7Er1rYZlSzr3Y3L/ew==} - - '@vue/devtools-shared@7.3.6': - resolution: {integrity: sha512-R/FOmdJV+hhuwcNoxp6e87RRkEeDMVhWH+nOsnHUrwjjsyeXJ2W1475Ozmw+cbZhejWQzftkHVKO28Fuo1yqCw==} - - '@vue/reactivity@3.4.34': - resolution: {integrity: sha512-ua+Lo+wBRlBEX9TtgPOShE2JwIO7p6BTZ7t1KZVPoaBRfqbC7N3c8Mpzicx173fXxx5VXeU6ykiHo7WgLzJQDA==} - - '@vue/runtime-core@3.4.34': - resolution: {integrity: sha512-PXhkiRPwcPGJ1BnyBZFI96GfInCVskd0HPNIAZn7i3YOmLbtbTZpB7/kDTwC1W7IqdGPkTVC63IS7J2nZs4Ebg==} - - '@vue/runtime-dom@3.4.34': - resolution: {integrity: sha512-dXqIe+RqFAK2Euak4UsvbIupalrhc67OuQKpD7HJ3W2fv8jlqvI7szfBCsAEcE8o/wyNpkloxB6J8viuF/E3gw==} - - '@vue/server-renderer@3.4.34': - resolution: {integrity: sha512-GeyEUfMVRZMD/mZcNONEqg7MiU10QQ1DB3O/Qr6+8uXpbwdlmVgQ5Qs1/ZUAFX1X2UUtqMoGrDRbxdWfOJFT7Q==} + '@vitest/mocker@2.1.2': + resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} peerDependencies: - vue: 3.4.34 + '@vitest/spy': 2.1.2 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vue/shared@3.4.31': - resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==} + '@vitest/pretty-format@2.1.2': + resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} - '@vue/shared@3.4.34': - resolution: {integrity: sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A==} + '@vitest/runner@2.1.2': + resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} - '@vueuse/core@10.11.0': - resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==} + '@vitest/snapshot@2.1.2': + resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} - '@vueuse/integrations@10.11.0': - resolution: {integrity: sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==} + '@vitest/spy@2.1.2': + resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} + + '@vitest/utils@2.1.2': + resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} + + '@vue/compiler-core@3.5.11': + resolution: {integrity: sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==} + + '@vue/compiler-dom@3.5.11': + resolution: {integrity: sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==} + + '@vue/compiler-sfc@3.5.11': + resolution: {integrity: sha512-gsbBtT4N9ANXXepprle+X9YLg2htQk1sqH/qGJ/EApl+dgpUBdTv3yP7YlR535uHZY3n6XaR0/bKo0BgwwDniw==} + + '@vue/compiler-ssr@3.5.11': + resolution: {integrity: sha512-P4+GPjOuC2aFTk1Z4WANvEhyOykcvEd5bIj2KVNGKGfM745LaXGr++5njpdBTzVz5pZifdlR1kpYSJJpIlSePA==} + + '@vue/devtools-api@7.4.6': + resolution: {integrity: sha512-XipBV5k0/IfTr0sNBDTg7OBUCp51cYMMXyPxLXJZ4K/wmUeMqt8cVdr2ZZGOFq+si/jTyCYnNxeKoyev5DOUUA==} + + '@vue/devtools-kit@7.4.6': + resolution: {integrity: sha512-NbYBwPWgEic1AOd9bWExz9weBzFdjiIfov0yRn4DrRfR+EQJCI9dn4I0XS7IxYGdkmUJi8mFW42LLk18WsGqew==} + + '@vue/devtools-shared@7.4.6': + resolution: {integrity: sha512-rPeSBzElnHYMB05Cc056BQiJpgocQjY8XVulgni+O9a9Gr9tNXgPteSzFFD+fT/iWMxNuUgGKs9CuW5DZewfIg==} + + '@vue/reactivity@3.5.11': + resolution: {integrity: sha512-Nqo5VZEn8MJWlCce8XoyVqHZbd5P2NH+yuAaFzuNSR96I+y1cnuUiq7xfSG+kyvLSiWmaHTKP1r3OZY4mMD50w==} + + '@vue/runtime-core@3.5.11': + resolution: {integrity: sha512-7PsxFGqwfDhfhh0OcDWBG1DaIQIVOLgkwA5q6MtkPiDFjp5gohVnJEahSktwSFLq7R5PtxDKy6WKURVN1UDbzA==} + + '@vue/runtime-dom@3.5.11': + resolution: {integrity: sha512-GNghjecT6IrGf0UhuYmpgaOlN7kxzQBhxWEn08c/SQDxv1yy4IXI1bn81JgEpQ4IXjRxWtPyI8x0/7TF5rPfYQ==} + + '@vue/server-renderer@3.5.11': + resolution: {integrity: sha512-cVOwYBxR7Wb1B1FoxYvtjJD8X/9E5nlH4VSkJy2uMA1MzYNdzAAB//l8nrmN9py/4aP+3NjWukf9PZ3TeWULaA==} + peerDependencies: + vue: 3.5.11 + + '@vue/shared@3.5.11': + resolution: {integrity: sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==} + + '@vueuse/core@11.1.0': + resolution: {integrity: sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==} + + '@vueuse/integrations@11.1.0': + resolution: {integrity: sha512-O2ZgrAGPy0qAjpoI2YR3egNgyEqwG85fxfwmA9BshRIGjV4G6yu6CfOPpMHAOoCD+UfsIl7Vb1bXJ6ifrHYDDA==} peerDependencies: async-validator: ^4 axios: ^1 - change-case: ^4 - drauu: ^0.3 + change-case: ^5 + drauu: ^0.4 focus-trap: ^7 - fuse.js: ^6 + fuse.js: ^7 idb-keyval: ^6 - jwt-decode: ^3 + jwt-decode: ^4 nprogress: ^0.2 qrcode: ^1.5 sortablejs: ^1 - universal-cookie: ^6 + universal-cookie: ^7 peerDependenciesMeta: async-validator: optional: true @@ -1959,11 +2049,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@10.11.0': - resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==} + '@vueuse/metadata@11.1.0': + resolution: {integrity: sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==} - '@vueuse/shared@10.11.0': - resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==} + '@vueuse/shared@11.1.0': + resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==} '@webext-core/fake-browser@1.3.1': resolution: {integrity: sha512-NpBl0rXL6rT3msdl9Fb1GPLd/MKJEZ3pHpxuMdlu+qKW78T6SWJqDvyAVs8VjAmYs9RHoQJc+yObxQoGWdskXQ==} @@ -1974,10 +2064,6 @@ packages: '@webext-core/match-patterns@1.0.3': resolution: {integrity: sha512-NY39ACqCxdKBmHgw361M9pfJma8e4AZo20w9AY+5ZjIj1W2dvXC8J31G5fjfOGbulW9w4WKpT8fPooi0mLkn9A==} - acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} - acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} @@ -1997,6 +2083,10 @@ packages: resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} engines: {node: '>=14.16'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2016,10 +2106,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -2045,9 +2131,6 @@ packages: resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} engines: {node: '>=12'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -2135,6 +2218,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -2161,14 +2249,6 @@ packages: engines: {'0': node >=0.10.0} hasBin: true - c12@1.11.1: - resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==} - peerDependencies: - magicast: ^0.3.4 - peerDependenciesMeta: - magicast: - optional: true - c12@1.11.2: resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} peerDependencies: @@ -2202,9 +2282,11 @@ packages: caniuse-lite@1.0.30001633: resolution: {integrity: sha512-6sT0yf/z5jqf8tISAgpJDrmwOpLsrpnyCdD/lOZKvKkkJK4Dn0X5i7KF7THEZhOq+30bmhwBlNEaqPUiHiKtZg==} - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} + caniuse-lite@1.0.30001666: + resolution: {integrity: sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} @@ -2226,8 +2308,11 @@ packages: resolution: {integrity: sha512-cTZXBcJMl3pudE40WENOakXkcVtrbBpbkmSkM20NdRiUqa4+VYRdXdEsgQ0BNQ6JBE2YymTNWtPKVF7UCTN5+g==} hasBin: true - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} @@ -2237,6 +2322,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -2322,6 +2411,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -2470,14 +2562,19 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -2536,9 +2633,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} - destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} @@ -2546,9 +2640,8 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -2585,6 +2678,9 @@ packages: electron-to-chromium@1.4.802: resolution: {integrity: sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA==} + electron-to-chromium@1.5.32: + resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==} + emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -2601,6 +2697,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2647,6 +2747,10 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} @@ -2707,8 +2811,8 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - filesize@10.1.4: - resolution: {integrity: sha512-ryBwPIIeErmxgPnm6cbESAzXjuEFubs+yKYLBZvg3CaiNcmkJChoOGcBSrZ6IwkMwPABwPpVXE6IlNdGJJrvEg==} + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} fill-range@7.1.1: @@ -2836,12 +2940,10 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} - deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2920,6 +3022,12 @@ packages: resolution: {integrity: sha512-MLydoyGp9QJcjlhE5lsLHXYpWayjjWqkavzju2ZWD2tYa1CgmML1K1gWAu22BLFa2eZ0OfvJ/DlfoVjaD54U2Q==} engines: {node: '>=18'} + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -2938,6 +3046,9 @@ packages: html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} @@ -2991,7 +3102,6 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3253,6 +3363,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -3309,19 +3424,19 @@ packages: linkedom@0.18.5: resolution: {integrity: sha512-JGLaGGtqtu+eOhYrC1wkWYTBcpVWL4AsnwAtMtgO1Q0gI0PuPJKI0zBBE+a/1BrhOE3Uw8JI/ycByAv5cLrAuQ==} - lint-staged@15.2.7: - resolution: {integrity: sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==} + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} engines: {node: '>=18.12.0'} hasBin: true - listr2@8.0.2: - resolution: {integrity: sha512-v5jEMOeEJUpRjSXSB4U3w5A3YPmURYMUO/86f1PA4GGYcdbUQYpkbvKYT7Xaq1iu4Zjn51Rv1UeD1zsBXRijiQ==} - engines: {node: '>=18.0.0'} - listr2@8.2.1: resolution: {integrity: sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g==} engines: {node: '>=18.0.0'} + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -3363,13 +3478,14 @@ packages: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -3413,6 +3529,9 @@ packages: marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} @@ -3434,12 +3553,27 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mimic-fn@2.1.0: @@ -3496,8 +3630,8 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minisearch@7.0.2: - resolution: {integrity: sha512-Pf0sFXaCgRpOBDr4G8wTbVAEH9o9rvJzCMwj0TMe3L/NfUuG188xabfx6Vm3vD/Dv5L500n7JeiMB9Mq3sWMfQ==} + minisearch@7.1.0: + resolution: {integrity: sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==} minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -3551,6 +3685,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multimatch@6.0.0: resolution: {integrity: sha512-I7tSVxHGPlmPN/enE3mS1aOSo6bWBfls+3HmuEeCUBCE7gWnm3cBXCBkpurzFjVRwC6Kld8lLaZ1Iv5vOcjvcQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3593,6 +3730,9 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -3641,8 +3781,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nypm@0.3.9: - resolution: {integrity: sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==} + nypm@0.3.12: + resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -3661,14 +3801,11 @@ packages: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} - ofetch@1.3.3: - resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} - ofetch@1.4.0: resolution: {integrity: sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==} - ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3685,6 +3822,9 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -3709,8 +3849,8 @@ packages: resolution: {integrity: sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==} engines: {node: '>= 0.4.0'} - oxlint@0.9.1: - resolution: {integrity: sha512-77v9YVkaVOWguxUttiJ31yfWkG/Yo7kIzY0CrKHxM6p0xiUqN0LVF4IVgjcE6vevyd9bBVphtOgJOJUq4To/+w==} + oxlint@0.9.9: + resolution: {integrity: sha512-EqUmSKgnU7KNCi29uFe5MQnUZ0GH569Inkry/e84k4lwVRv1QuDr4DHLpu0cXBN2atwhKf1Szk/3uxmB2qgPbw==} engines: {node: '>=14.*'} hasBin: true @@ -3718,10 +3858,6 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-map@7.0.2: resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} engines: {node: '>=18'} @@ -3791,9 +3927,6 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -3807,8 +3940,8 @@ packages: periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -3828,9 +3961,6 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - pkg-types@1.1.3: resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} @@ -4016,6 +4146,10 @@ packages: resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + preact@10.18.1: resolution: {integrity: sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==} @@ -4028,10 +4162,6 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.0.0: resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} engines: {node: '>=18'} @@ -4050,16 +4180,19 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - publint@0.2.9: - resolution: {integrity: sha512-nITKS1NSwD68PQlts0ntryhxrWObep6P0CCycwi1lgXI+K7uKyacMYRRCQi7hTae8imkI3FCi0FlgnwLxjM8yA==} + publint@0.2.11: + resolution: {integrity: sha512-/kxbd+sD/uEG515N/ZYpC6gYs8h89cQ4UIsAq1y6VT4qlNh8xmiSwcP2xU2MbzXFl8J0l2IdONKFweLfYoqhcA==} engines: {node: '>=16'} hasBin: true - publish-browser-extension@2.1.3: - resolution: {integrity: sha512-qisnXUUwjvu5kMvObfG7UQ9rPU3t0XfbKdCdCrwAXaLUySdC25nlM4gxi+CBvL7LiwvK494GJyEK/weQBhIyTQ==} + publish-browser-extension@2.2.2: + resolution: {integrity: sha512-+Kr6/S+X51PL6FhMg36yAiFxOFO9O+YQQRVNRD1ItG64Nt+QVmhSKUGJbyLrCwsS4lI0e6kqhxV8r9cy8sAWDQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -4089,9 +4222,6 @@ packages: peerDependencies: react: ^18.3.1 - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -4115,9 +4245,16 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + regex@4.3.3: + resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + regexp.prototype.flags@1.5.0: resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} @@ -4164,15 +4301,11 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -4187,8 +4320,8 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true - rollup@4.19.0: - resolution: {integrity: sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==} + rollup@4.24.0: + resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4216,8 +4349,8 @@ packages: safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - sass@1.77.8: - resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + sass@1.79.4: + resolution: {integrity: sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==} engines: {node: '>=14.0.0'} hasBin: true @@ -4304,8 +4437,8 @@ packages: shiki@0.14.5: resolution: {integrity: sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==} - shiki@1.10.3: - resolution: {integrity: sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==} + shiki@1.21.0: + resolution: {integrity: sha512-apCH5BoWTrmHDPGgg3RF8+HAAbEL/CdbYr8rMw7eIrdhCkZHdVGat5mMNlRtd1erNG01VPMIKHNQ0Pj2HMAiog==} side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -4342,8 +4475,8 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} - solid-js@1.8.19: - resolution: {integrity: sha512-h8z/TvTQYsf894LM9Iau/ZW2iAKrCzAWDwjPhMcXnonmW1OIIihc28wp82b1wwei1p81fH5+gnfNOe8RzLbDRQ==} + solid-js@1.9.1: + resolution: {integrity: sha512-Gd6QWRFfO2XKKZqVK4YwbhWZkr0jWw1dYHOt+VYebomeyikGP0SuMflf42XcDuU9HAEYDArFJIYsBNjlE7iZsw==} solid-refresh@0.6.3: resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} @@ -4354,6 +4487,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4365,6 +4502,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-sync@1.0.15: resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} @@ -4434,6 +4574,9 @@ packages: string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -4531,12 +4674,11 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} tinypool@1.0.0: resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} @@ -4546,10 +4688,6 @@ packages: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - tinyspy@3.0.0: resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} @@ -4570,6 +4708,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-essentials@10.0.1: resolution: {integrity: sha512-HPH+H2bkkO8FkMDau+hFvv7KYozzned9Zr1Urn7rRPXMF4mZmCKOq+u4AI1AAW+2bofIOXTuSdKo9drQuni2dQ==} peerDependencies: @@ -4586,10 +4727,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -4632,14 +4769,11 @@ packages: peerDependencies: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} - ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} @@ -4664,17 +4798,35 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} - unimport@3.11.1: - resolution: {integrity: sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==} + unimport@3.13.1: + resolution: {integrity: sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==} unique-string@3.0.0: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universalify@1.0.0: resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} engines: {node: '>= 10.0.0'} @@ -4683,9 +4835,14 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - unplugin@1.12.3: - resolution: {integrity: sha512-my8DH0/T/Kx33KO+6QXAqdeMYgyy0GktlOpdQjpagfHKw5DrD0ctPr7SHUyOT3g4ZVpzCQGt/qcpuoKJ/pniHA==} + unplugin@1.14.1: + resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -4701,6 +4858,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + update-notifier@6.0.2: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} @@ -4718,13 +4881,14 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vite-node@2.0.4: - resolution: {integrity: sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@2.1.2: + resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -4738,8 +4902,8 @@ packages: '@testing-library/jest-dom': optional: true - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4747,6 +4911,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -4759,6 +4924,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -4774,8 +4941,8 @@ packages: vite: optional: true - vitepress@1.3.1: - resolution: {integrity: sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==} + vitepress@1.3.4: + resolution: {integrity: sha512-I1/F6OW1xl3kW4PaIMC6snxjWgf3qfziq2aqsDoFc/Gt41WbcRv++z8zjw8qGRIJ+I4bUW7ZcKFDHHN/jkH9DQ==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -4786,8 +4953,8 @@ packages: postcss: optional: true - vitest-mock-extended@2.0.0: - resolution: {integrity: sha512-iDV40gSKlN5RZRSfpOv5SKTdEeBvu4VMpLNNakDSHMWnUmnlfsEVGXHndWAfUD+nZBR+HDcQw7p/JO5sCWo1VQ==} + vitest-mock-extended@2.0.2: + resolution: {integrity: sha512-n3MBqVITKyclZ0n0y66hkT4UiiEYFQn9tteAnIxT0MPz1Z8nFcPUG3Cf0cZOyoPOj/cq6Ab1XFw2lM/qM5EDWQ==} peerDependencies: typescript: 3.x || 4.x || 5.x vitest: '>=2.0.0' @@ -4797,40 +4964,15 @@ packages: peerDependencies: vite: ^4.0.0 || ^5.0.0 - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.1.2: + resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - - vitest@2.0.4: - resolution: {integrity: sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.4 - '@vitest/ui': 2.0.4 + '@vitest/browser': 2.1.2 + '@vitest/ui': 2.1.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -4853,8 +4995,8 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - vue-demi@0.14.8: - resolution: {integrity: sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} hasBin: true peerDependencies: @@ -4864,8 +5006,8 @@ packages: '@vue/composition-api': optional: true - vue@3.4.34: - resolution: {integrity: sha512-VZze05HWlA3ItreQ/ka7Sx7PoD0/3St8FEiSlSTVgb6l4hL+RjtP2/8g5WQBzZgyf8WG2f+g1bXzC7zggLhAJA==} + vue@3.5.11: + resolution: {integrity: sha512-/8Wurrd9J3lb72FTQS7gRMNQD4nztTtKPmuDuPuhqXmmpD6+skVjAeahNpVzsuky6Sy9gy7wn8UadqPtt9SQIg==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4988,16 +5130,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} - engines: {node: '>= 14'} - hasBin: true - - yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} - engines: {node: '>= 14'} - hasBin: true - yaml@2.5.1: resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} @@ -5022,10 +5154,6 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - yoctocolors@2.0.2: resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} engines: {node: '>=18'} @@ -5036,36 +5164,38 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: - '@aklinker1/buildc@1.1.1(typescript@5.5.4)': + '@aklinker1/buildc@1.1.4': dependencies: cac: 6.7.14 consola: 3.2.3 dependency-graph: 1.0.0 fast-glob: 3.3.2 fs-extra: 11.2.0 - ohash: 1.1.3 + ohash: 1.1.4 pathe: 1.1.2 proper-lockfile: 4.1.2 - typescript: 5.5.4 - yaml: 2.5.0 + yaml: 2.5.1 - '@aklinker1/check@1.4.5(typescript@5.5.4)': + '@aklinker1/check@1.4.5(typescript@5.6.2)': dependencies: '@antfu/utils': 0.7.7 ci-info: 4.0.0 citty: 0.1.6 - typescript: 5.5.4 + typescript: 5.6.2 - '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.19.0)': + '@aklinker1/rollup-plugin-visualizer@5.12.0(rollup@4.24.0)': dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.19.0 + rollup: 4.24.0 '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.15.0)': dependencies: @@ -5172,10 +5302,17 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.0 + + '@babel/code-frame@7.25.7': + dependencies: + '@babel/highlight': 7.25.7 + picocolors: 1.1.0 '@babel/compat-data@7.24.7': {} + '@babel/compat-data@7.25.7': {} + '@babel/core@7.24.7': dependencies: '@ampproject/remapping': 2.2.1 @@ -5196,6 +5333,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.25.7': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7) + '@babel/helpers': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/template': 7.25.7 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.24.7': dependencies: '@babel/types': 7.25.6 @@ -5203,6 +5360,13 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.25.7': + dependencies: + '@babel/types': 7.25.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-compilation-targets@7.24.7': dependencies: '@babel/compat-data': 7.24.7 @@ -5211,6 +5375,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.25.7': + dependencies: + '@babel/compat-data': 7.25.7 + '@babel/helper-validator-option': 7.25.7 + browserslist: 4.24.0 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-environment-visitor@7.24.7': dependencies: '@babel/types': 7.25.6 @@ -5235,6 +5407,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.25.7': + dependencies: + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 @@ -5246,6 +5425,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.7)': + dependencies: + '@babel/core': 7.25.7 + '@babel/helper-module-imports': 7.25.7 + '@babel/helper-simple-access': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + '@babel/traverse': 7.25.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-plugin-utils@7.24.7': {} '@babel/helper-simple-access@7.24.7': @@ -5255,6 +5444,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-simple-access@7.25.7': + dependencies: + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.7 + transitivePeerDependencies: + - supports-color + '@babel/helper-split-export-declaration@7.24.7': dependencies: '@babel/types': 7.25.6 @@ -5263,21 +5459,39 @@ snapshots: '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-option@7.24.7': {} + '@babel/helper-validator-option@7.25.7': {} + '@babel/helpers@7.24.7': dependencies: '@babel/template': 7.24.7 '@babel/types': 7.25.6 + '@babel/helpers@7.25.7': + dependencies: + '@babel/template': 7.25.7 + '@babel/types': 7.25.7 + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.0 + + '@babel/highlight@7.25.7': + dependencies: + '@babel/helper-validator-identifier': 7.25.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 '@babel/parser@7.24.7': dependencies: @@ -5287,19 +5501,23 @@ snapshots: dependencies: '@babel/types': 7.25.6 + '@babel/parser@7.25.7': + dependencies: + '@babel/types': 7.25.7 + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.7)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)': + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.7)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.24.7 '@babel/runtime@7.24.7': @@ -5314,6 +5532,12 @@ snapshots: '@babel/parser': 7.25.6 '@babel/types': 7.25.6 + '@babel/template@7.25.7': + dependencies: + '@babel/code-frame': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/types': 7.25.7 + '@babel/traverse@7.24.7': dependencies: '@babel/code-frame': 7.24.7 @@ -5329,6 +5553,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.7': + dependencies: + '@babel/code-frame': 7.25.7 + '@babel/generator': 7.25.7 + '@babel/parser': 7.25.7 + '@babel/template': 7.25.7 + '@babel/types': 7.25.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.24.7': dependencies: '@babel/helper-string-parser': 7.24.7 @@ -5341,6 +5577,12 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.25.7': + dependencies: + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} '@devicefarmer/adbkit-logcat@2.1.3': {} @@ -5359,11 +5601,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@docsearch/css@3.6.0': {} + '@docsearch/css@3.6.2': {} - '@docsearch/js@3.6.0(@algolia/client-search@4.20.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0)': + '@docsearch/js@3.6.2(@algolia/client-search@4.20.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0)': dependencies: - '@docsearch/react': 3.6.0(@algolia/client-search@4.20.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0) + '@docsearch/react': 3.6.2(@algolia/client-search@4.20.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0) preact: 10.18.1 transitivePeerDependencies: - '@algolia/client-search' @@ -5372,14 +5614,14 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.6.0(@algolia/client-search@4.20.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0)': + '@docsearch/react@3.6.2(@algolia/client-search@4.20.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0)': dependencies: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.15.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - '@docsearch/css': 3.6.0 + '@docsearch/css': 3.6.2 algoliasearch: 4.20.0 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.11 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) search-insights: 2.15.0 @@ -5761,10 +6003,6 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -5796,28 +6034,28 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - '@oxlint/darwin-arm64@0.9.1': + '@oxlint/darwin-arm64@0.9.9': optional: true - '@oxlint/darwin-x64@0.9.1': + '@oxlint/darwin-x64@0.9.9': optional: true - '@oxlint/linux-arm64-gnu@0.9.1': + '@oxlint/linux-arm64-gnu@0.9.9': optional: true - '@oxlint/linux-arm64-musl@0.9.1': + '@oxlint/linux-arm64-musl@0.9.9': optional: true - '@oxlint/linux-x64-gnu@0.9.1': + '@oxlint/linux-x64-gnu@0.9.9': optional: true - '@oxlint/linux-x64-musl@0.9.1': + '@oxlint/linux-x64-musl@0.9.9': optional: true - '@oxlint/win32-arm64@0.9.1': + '@oxlint/win32-arm64@0.9.9': optional: true - '@oxlint/win32-x64@0.9.1': + '@oxlint/win32-x64@0.9.9': optional: true '@pkgjs/parseargs@0.11.0': @@ -5884,98 +6122,119 @@ snapshots: optionalDependencies: rollup: 3.29.4 - '@rollup/pluginutils@5.1.0(rollup@4.19.0)': + '@rollup/pluginutils@5.1.2(rollup@4.24.0)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.19.0 + rollup: 4.24.0 - '@rollup/rollup-android-arm-eabi@4.19.0': + '@rollup/rollup-android-arm-eabi@4.24.0': optional: true - '@rollup/rollup-android-arm64@4.19.0': + '@rollup/rollup-android-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-arm64@4.19.0': + '@rollup/rollup-darwin-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-x64@4.19.0': + '@rollup/rollup-darwin-x64@4.24.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.19.0': + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.19.0': + '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.19.0': + '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.19.0': + '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.19.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.19.0': + '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.19.0': + '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.19.0': + '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-musl@4.19.0': + '@rollup/rollup-linux-x64-musl@4.24.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.19.0': + '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.19.0': + '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.19.0': + '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@1.10.3': + '@shikijs/core@1.21.0': dependencies: + '@shikijs/engine-javascript': 1.21.0 + '@shikijs/engine-oniguruma': 1.21.0 + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.21.0': + dependencies: + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 + oniguruma-to-js: 0.4.3 + + '@shikijs/engine-oniguruma@1.21.0': + dependencies: + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 + + '@shikijs/transformers@1.21.0': + dependencies: + shiki: 1.21.0 + + '@shikijs/types@1.21.0': + dependencies: + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 - '@shikijs/transformers@1.10.3': - dependencies: - shiki: 1.10.3 - - '@sinclair/typebox@0.27.8': {} + '@shikijs/vscode-textmate@9.2.2': {} '@sindresorhus/is@5.4.1': {} '@sindresorhus/merge-streams@4.0.0': {} - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)))(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) - debug: 4.3.4 + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + debug: 4.3.5 svelte: 4.2.18 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))': + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)))(svelte@4.2.18)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) - debug: 4.3.4 + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)))(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + debug: 4.3.5 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.11 svelte: 4.2.18 svelte-hmr: 0.16.0(svelte@4.2.18) - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + vitefu: 0.2.5(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) transitivePeerDependencies: - supports-color @@ -6018,6 +6277,8 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/filesystem@0.0.36': dependencies: '@types/filewriter': 0.0.33 @@ -6039,7 +6300,7 @@ snapshots: '@types/jsonfile@6.1.3': dependencies: - '@types/node': 20.14.12 + '@types/node': 20.16.10 '@types/linkify-it@5.0.0': {} @@ -6049,11 +6310,15 @@ snapshots: '@types/lodash@4.14.200': {} - '@types/markdown-it@14.1.1': + '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + '@types/mdurl@2.0.0': {} '@types/minimatch@3.0.5': {} @@ -6064,24 +6329,24 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.14.12': + '@types/node@20.16.10': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 '@types/normalize-path@3.0.2': {} '@types/prompts@2.4.9': dependencies: - '@types/node': 20.14.12 + '@types/node': 20.16.10 kleur: 3.0.3 '@types/prop-types@15.7.9': {} '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.11 - '@types/react@18.3.3': + '@types/react@18.3.11': dependencies: '@types/prop-types': 15.7.9 csstype: 3.1.3 @@ -6096,142 +6361,122 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.12 + '@types/node': 20.16.10 optional: true - '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))': + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) + '@babel/core': 7.25.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.4(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4))': + '@vitejs/plugin-vue@5.1.4(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))(vue@3.5.11(typescript@5.6.2))': dependencies: - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vue: 3.4.34(typescript@5.5.4) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + vue: 3.5.11(typescript@5.6.2) - '@vitest/coverage-v8@2.0.4(vitest@2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8))': + '@vitest/coverage-v8@2.1.2(vitest@2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.5 + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.10 + magic-string: 0.30.11 magicast: 0.3.5 std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8) + vitest: 2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': + '@vitest/expect@2.1.2': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.5.0 - - '@vitest/expect@2.0.4': - dependencies: - '@vitest/spy': 2.0.4 - '@vitest/utils': 2.0.4 + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/pretty-format@2.0.4': + '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': + dependencies: + '@vitest/spy': 2.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.11 + optionalDependencies: + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + + '@vitest/pretty-format@2.1.2': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/runner@2.1.2': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + '@vitest/utils': 2.1.2 pathe: 1.1.2 - '@vitest/runner@2.0.4': + '@vitest/snapshot@2.1.2': dependencies: - '@vitest/utils': 2.0.4 + '@vitest/pretty-format': 2.1.2 + magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': - dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 - - '@vitest/snapshot@2.0.4': - dependencies: - '@vitest/pretty-format': 2.0.4 - magic-string: 0.30.10 - pathe: 1.1.2 - - '@vitest/spy@1.6.0': - dependencies: - tinyspy: 2.2.1 - - '@vitest/spy@2.0.4': + '@vitest/spy@2.1.2': dependencies: tinyspy: 3.0.0 - '@vitest/utils@1.6.0': + '@vitest/utils@2.1.2': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - - '@vitest/utils@2.0.4': - dependencies: - '@vitest/pretty-format': 2.0.4 - estree-walker: 3.0.3 + '@vitest/pretty-format': 2.1.2 loupe: 3.1.1 tinyrainbow: 1.2.0 - '@vue/compiler-core@3.4.34': + '@vue/compiler-core@3.5.11': dependencies: '@babel/parser': 7.25.6 - '@vue/shared': 3.4.34 + '@vue/shared': 3.5.11 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-dom@3.4.34': + '@vue/compiler-dom@3.5.11': dependencies: - '@vue/compiler-core': 3.4.34 - '@vue/shared': 3.4.34 + '@vue/compiler-core': 3.5.11 + '@vue/shared': 3.5.11 - '@vue/compiler-sfc@3.4.34': + '@vue/compiler-sfc@3.5.11': dependencies: '@babel/parser': 7.25.6 - '@vue/compiler-core': 3.4.34 - '@vue/compiler-dom': 3.4.34 - '@vue/compiler-ssr': 3.4.34 - '@vue/shared': 3.4.34 + '@vue/compiler-core': 3.5.11 + '@vue/compiler-dom': 3.5.11 + '@vue/compiler-ssr': 3.5.11 + '@vue/shared': 3.5.11 estree-walker: 2.0.2 magic-string: 0.30.11 - postcss: 8.4.39 + postcss: 8.4.47 source-map-js: 1.2.0 - '@vue/compiler-ssr@3.4.34': + '@vue/compiler-ssr@3.5.11': dependencies: - '@vue/compiler-dom': 3.4.34 - '@vue/shared': 3.4.34 + '@vue/compiler-dom': 3.5.11 + '@vue/shared': 3.5.11 - '@vue/devtools-api@7.3.6': + '@vue/devtools-api@7.4.6': dependencies: - '@vue/devtools-kit': 7.3.6 + '@vue/devtools-kit': 7.4.6 - '@vue/devtools-kit@7.3.6': + '@vue/devtools-kit@7.4.6': dependencies: - '@vue/devtools-shared': 7.3.6 + '@vue/devtools-shared': 7.4.6 birpc: 0.2.17 hookable: 5.5.3 mitt: 3.0.1 @@ -6239,62 +6484,60 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.1 - '@vue/devtools-shared@7.3.6': + '@vue/devtools-shared@7.4.6': dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.4.34': + '@vue/reactivity@3.5.11': dependencies: - '@vue/shared': 3.4.34 + '@vue/shared': 3.5.11 - '@vue/runtime-core@3.4.34': + '@vue/runtime-core@3.5.11': dependencies: - '@vue/reactivity': 3.4.34 - '@vue/shared': 3.4.34 + '@vue/reactivity': 3.5.11 + '@vue/shared': 3.5.11 - '@vue/runtime-dom@3.4.34': + '@vue/runtime-dom@3.5.11': dependencies: - '@vue/reactivity': 3.4.34 - '@vue/runtime-core': 3.4.34 - '@vue/shared': 3.4.34 + '@vue/reactivity': 3.5.11 + '@vue/runtime-core': 3.5.11 + '@vue/shared': 3.5.11 csstype: 3.1.3 - '@vue/server-renderer@3.4.34(vue@3.4.34(typescript@5.5.4))': + '@vue/server-renderer@3.5.11(vue@3.5.11(typescript@5.6.2))': dependencies: - '@vue/compiler-ssr': 3.4.34 - '@vue/shared': 3.4.34 - vue: 3.4.34(typescript@5.5.4) + '@vue/compiler-ssr': 3.5.11 + '@vue/shared': 3.5.11 + vue: 3.5.11(typescript@5.6.2) - '@vue/shared@3.4.31': {} + '@vue/shared@3.5.11': {} - '@vue/shared@3.4.34': {} - - '@vueuse/core@10.11.0(vue@3.4.34(typescript@5.5.4))': + '@vueuse/core@11.1.0(vue@3.5.11(typescript@5.6.2))': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.11.0 - '@vueuse/shared': 10.11.0(vue@3.4.34(typescript@5.5.4)) - vue-demi: 0.14.8(vue@3.4.34(typescript@5.5.4)) + '@vueuse/metadata': 11.1.0 + '@vueuse/shared': 11.1.0(vue@3.5.11(typescript@5.6.2)) + vue-demi: 0.14.10(vue@3.5.11(typescript@5.6.2)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@10.11.0(focus-trap@7.5.4)(vue@3.4.34(typescript@5.5.4))': + '@vueuse/integrations@11.1.0(focus-trap@7.5.4)(vue@3.5.11(typescript@5.6.2))': dependencies: - '@vueuse/core': 10.11.0(vue@3.4.34(typescript@5.5.4)) - '@vueuse/shared': 10.11.0(vue@3.4.34(typescript@5.5.4)) - vue-demi: 0.14.8(vue@3.4.34(typescript@5.5.4)) + '@vueuse/core': 11.1.0(vue@3.5.11(typescript@5.6.2)) + '@vueuse/shared': 11.1.0(vue@3.5.11(typescript@5.6.2)) + vue-demi: 0.14.10(vue@3.5.11(typescript@5.6.2)) optionalDependencies: focus-trap: 7.5.4 transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/metadata@10.11.0': {} + '@vueuse/metadata@11.1.0': {} - '@vueuse/shared@10.11.0(vue@3.4.34(typescript@5.5.4))': + '@vueuse/shared@11.1.0(vue@3.5.11(typescript@5.6.2))': dependencies: - vue-demi: 0.14.8(vue@3.4.34(typescript@5.5.4)) + vue-demi: 0.14.10(vue@3.5.11(typescript@5.6.2)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -6309,10 +6552,6 @@ snapshots: '@webext-core/match-patterns@1.0.3': {} - acorn-walk@8.3.3: - dependencies: - acorn: 8.12.1 - acorn@8.12.1: {} adm-zip@0.5.10: {} @@ -6342,6 +6581,10 @@ snapshots: dependencies: type-fest: 3.13.1 + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -6356,8 +6599,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} any-promise@1.3.0: {} @@ -6380,8 +6621,6 @@ snapshots: array-union@3.0.1: {} - assertion-error@1.1.0: {} - assertion-error@2.0.1: {} async-mutex@0.5.0: @@ -6398,7 +6637,7 @@ snapshots: caniuse-lite: 1.0.30001633 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 postcss: 8.4.39 postcss-value-parser: 4.2.0 @@ -6477,6 +6716,13 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) + browserslist@4.24.0: + dependencies: + caniuse-lite: 1.0.30001666 + electron-to-chromium: 1.5.32 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.0) + buffer-crc32@0.2.13: {} buffer-from@1.1.2: {} @@ -6503,23 +6749,6 @@ snapshots: mv: 2.1.1 safe-json-stringify: 1.2.0 - c12@1.11.1(magicast@0.3.5): - dependencies: - chokidar: 3.6.0 - confbox: 0.1.7 - defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 1.21.6 - mlly: 1.7.1 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.1.1 - rc9: 2.1.2 - optionalDependencies: - magicast: 0.3.5 - c12@1.11.2(magicast@0.3.5): dependencies: chokidar: 3.6.0 @@ -6529,7 +6758,7 @@ snapshots: giget: 1.2.3 jiti: 1.21.6 mlly: 1.7.1 - ohash: 1.1.3 + ohash: 1.1.4 pathe: 1.1.2 perfect-debounce: 1.0.0 pkg-types: 1.2.0 @@ -6567,15 +6796,9 @@ snapshots: caniuse-lite@1.0.30001633: {} - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 + caniuse-lite@1.0.30001666: {} + + ccount@2.0.1: {} chai@5.1.1: dependencies: @@ -6617,9 +6840,9 @@ snapshots: transitivePeerDependencies: - magicast - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} check-error@2.1.1: {} @@ -6635,11 +6858,15 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + chownr@2.0.0: {} chrome-launcher@1.1.0: dependencies: - '@types/node': 20.14.12 + '@types/node': 20.16.10 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.1 @@ -6697,7 +6924,7 @@ snapshots: code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 acorn: 8.12.1 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -6728,6 +6955,8 @@ snapshots: colorette@2.0.20: {} + comma-separated-tokens@2.0.3: {} + commander@12.1.0: {} commander@2.9.0: @@ -6886,14 +7115,14 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -6940,13 +7169,13 @@ snapshots: dequal@2.0.3: {} - destr@2.0.2: {} - destr@2.0.3: {} detect-libc@2.0.3: {} - diff-sequences@29.6.3: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 dir-glob@3.0.1: dependencies: @@ -6985,6 +7214,8 @@ snapshots: electron-to-chromium@1.4.802: {} + electron-to-chromium@1.5.32: {} + emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} @@ -6997,6 +7228,8 @@ snapshots: entities@4.5.0: {} + environment@1.1.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -7162,6 +7395,8 @@ snapshots: escalade@3.1.2: {} + escalade@3.2.0: {} + escape-goat@4.0.0: {} escape-string-regexp@1.0.5: {} @@ -7259,7 +7494,7 @@ snapshots: dependencies: is-unicode-supported: 2.0.0 - filesize@10.1.4: {} + filesize@10.1.6: {} fill-range@7.1.1: dependencies: @@ -7379,8 +7614,8 @@ snapshots: consola: 3.2.3 defu: 6.1.4 node-fetch-native: 1.6.4 - nypm: 0.3.9 - ohash: 1.1.3 + nypm: 0.3.12 + ohash: 1.1.4 pathe: 1.1.2 tar: 6.2.1 @@ -7495,6 +7730,24 @@ snapshots: is-stream: 3.0.0 type-fest: 4.20.0 + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + highlight.js@10.7.3: {} hookable@5.5.3: {} @@ -7507,6 +7760,8 @@ snapshots: html-escaper@3.0.3: {} + html-void-elements@3.0.0: {} + htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 @@ -7668,7 +7923,7 @@ snapshots: is-reference@3.0.2: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 is-regex@1.1.4: dependencies: @@ -7744,7 +7999,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.5 + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -7768,6 +8023,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.0.2: {} + json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -7826,37 +8083,37 @@ snapshots: htmlparser2: 9.1.0 uhyphen: 0.2.0 - lint-staged@15.2.7: + lint-staged@15.2.10: dependencies: chalk: 5.3.0 commander: 12.1.0 - debug: 4.3.4 + debug: 4.3.7 execa: 8.0.1 lilconfig: 3.1.2 - listr2: 8.2.1 - micromatch: 4.0.7 + listr2: 8.2.5 + micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.4.5 + yaml: 2.5.1 transitivePeerDependencies: - supports-color - listr2@8.0.2: - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.0.0 - rfdc: 1.3.1 - wrap-ansi: 9.0.0 - listr2@8.2.1: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.0.0 - rfdc: 1.3.1 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 wrap-ansi: 9.0.0 load-json-file@4.0.0: @@ -7903,14 +8160,18 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -7951,6 +8212,18 @@ snapshots: marky@1.2.5: {} + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + mdn-data@2.0.28: {} mdn-data@2.0.30: {} @@ -7965,12 +8238,29 @@ snapshots: merge2@1.4.1: {} + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + micromatch@4.0.5: dependencies: braces: 3.0.3 picomatch: 2.3.1 - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -8015,7 +8305,7 @@ snapshots: minipass@7.1.2: {} - minisearch@7.0.2: {} + minisearch@7.1.0: {} minizlib@2.1.2: dependencies: @@ -8033,7 +8323,7 @@ snapshots: mkdirp@3.0.1: {} - mkdist@1.5.4(sass@1.77.8)(typescript@5.5.4): + mkdist@1.5.4(sass@1.79.4)(typescript@5.6.2): dependencies: autoprefixer: 10.4.19(postcss@8.4.39) citty: 0.1.6 @@ -8049,8 +8339,8 @@ snapshots: postcss-nested: 6.0.1(postcss@8.4.39) semver: 7.6.2 optionalDependencies: - sass: 1.77.8 - typescript: 5.5.4 + sass: 1.79.4 + typescript: 5.6.2 mlly@1.7.1: dependencies: @@ -8068,6 +8358,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + multimatch@6.0.0: dependencies: '@types/minimatch': 3.0.5 @@ -8115,6 +8407,8 @@ snapshots: node-releases@2.0.14: {} + node-releases@2.0.18: {} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -8170,14 +8464,14 @@ snapshots: dependencies: boolbase: 1.0.0 - nypm@0.3.9: + nypm@0.3.12: dependencies: citty: 0.1.6 consola: 3.2.3 execa: 8.0.1 pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 + pkg-types: 1.2.0 + ufo: 1.5.4 object-assign@4.1.1: {} @@ -8192,19 +8486,13 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 - ofetch@1.3.3: - dependencies: - destr: 2.0.2 - node-fetch-native: 1.6.4 - ufo: 1.4.0 - ofetch@1.4.0: dependencies: destr: 2.0.3 node-fetch-native: 1.6.4 ufo: 1.5.4 - ohash@1.1.3: {} + ohash@1.1.4: {} once@1.4.0: dependencies: @@ -8222,6 +8510,10 @@ snapshots: dependencies: mimic-function: 5.0.1 + oniguruma-to-js@0.4.3: + dependencies: + regex: 4.3.3 + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -8268,23 +8560,19 @@ snapshots: os-shim@0.1.3: {} - oxlint@0.9.1: + oxlint@0.9.9: optionalDependencies: - '@oxlint/darwin-arm64': 0.9.1 - '@oxlint/darwin-x64': 0.9.1 - '@oxlint/linux-arm64-gnu': 0.9.1 - '@oxlint/linux-arm64-musl': 0.9.1 - '@oxlint/linux-x64-gnu': 0.9.1 - '@oxlint/linux-x64-musl': 0.9.1 - '@oxlint/win32-arm64': 0.9.1 - '@oxlint/win32-x64': 0.9.1 + '@oxlint/darwin-arm64': 0.9.9 + '@oxlint/darwin-x64': 0.9.9 + '@oxlint/linux-arm64-gnu': 0.9.9 + '@oxlint/linux-arm64-musl': 0.9.9 + '@oxlint/linux-x64-gnu': 0.9.9 + '@oxlint/linux-x64-musl': 0.9.9 + '@oxlint/win32-arm64': 0.9.9 + '@oxlint/win32-x64': 0.9.9 p-cancelable@3.0.0: {} - p-limit@5.0.0: - dependencies: - yocto-queue: 1.1.1 - p-map@7.0.2: {} package-json-from-dist@1.0.0: {} @@ -8345,8 +8633,6 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} - pathval@2.0.0: {} pend@1.2.0: {} @@ -8355,11 +8641,11 @@ snapshots: periscopic@3.1.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 estree-walker: 3.0.3 is-reference: 3.0.2 - picocolors@1.0.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -8369,12 +8655,6 @@ snapshots: pify@3.0.0: {} - pkg-types@1.1.1: - dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types@1.1.3: dependencies: confbox: 0.1.7 @@ -8551,21 +8831,21 @@ snapshots: postcss@8.4.39: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.0 source-map-js: 1.2.0 + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + preact@10.18.1: {} prettier@3.3.3: {} pretty-bytes@6.1.1: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - pretty-ms@9.0.0: dependencies: parse-ms: 4.0.0 @@ -8587,15 +8867,17 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + property-information@6.5.0: {} + proto-list@1.2.4: {} - publint@0.2.9: + publint@0.2.11: dependencies: npm-packlist: 5.1.3 - picocolors: 1.0.1 + picocolors: 1.1.0 sade: 1.8.1 - publish-browser-extension@2.1.3: + publish-browser-extension@2.2.2: dependencies: cac: 6.7.14 cli-highlight: 2.1.11 @@ -8603,11 +8885,11 @@ snapshots: dotenv: 16.4.5 extract-zip: 2.0.1 formdata-node: 6.0.3 - listr2: 8.0.2 + listr2: 8.2.1 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 - ofetch: 1.3.3 + ofetch: 1.4.0 open: 9.1.0 ora: 6.3.1 prompts: 2.4.2 @@ -8646,8 +8928,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-is@18.3.1: {} - react-refresh@0.14.2: {} react@18.3.1: @@ -8680,8 +8960,12 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.2: {} + regenerator-runtime@0.14.0: {} + regex@4.3.3: {} + regexp.prototype.flags@1.5.0: dependencies: call-bind: 1.0.2 @@ -8726,8 +9010,6 @@ snapshots: reusify@1.0.4: {} - rfdc@1.3.1: {} - rfdc@1.4.1: {} rimraf@2.4.5: @@ -8735,11 +9017,11 @@ snapshots: glob: 6.0.4 optional: true - rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.5.4): + rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.6.2): dependencies: magic-string: 0.30.10 rollup: 3.29.4 - typescript: 5.5.4 + typescript: 5.6.2 optionalDependencies: '@babel/code-frame': 7.24.7 @@ -8747,26 +9029,26 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.19.0: + rollup@4.24.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.19.0 - '@rollup/rollup-android-arm64': 4.19.0 - '@rollup/rollup-darwin-arm64': 4.19.0 - '@rollup/rollup-darwin-x64': 4.19.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.19.0 - '@rollup/rollup-linux-arm-musleabihf': 4.19.0 - '@rollup/rollup-linux-arm64-gnu': 4.19.0 - '@rollup/rollup-linux-arm64-musl': 4.19.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.19.0 - '@rollup/rollup-linux-riscv64-gnu': 4.19.0 - '@rollup/rollup-linux-s390x-gnu': 4.19.0 - '@rollup/rollup-linux-x64-gnu': 4.19.0 - '@rollup/rollup-linux-x64-musl': 4.19.0 - '@rollup/rollup-win32-arm64-msvc': 4.19.0 - '@rollup/rollup-win32-ia32-msvc': 4.19.0 - '@rollup/rollup-win32-x64-msvc': 4.19.0 + '@rollup/rollup-android-arm-eabi': 4.24.0 + '@rollup/rollup-android-arm64': 4.24.0 + '@rollup/rollup-darwin-arm64': 4.24.0 + '@rollup/rollup-darwin-x64': 4.24.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 + '@rollup/rollup-linux-arm-musleabihf': 4.24.0 + '@rollup/rollup-linux-arm64-gnu': 4.24.0 + '@rollup/rollup-linux-arm64-musl': 4.24.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 + '@rollup/rollup-linux-riscv64-gnu': 4.24.0 + '@rollup/rollup-linux-s390x-gnu': 4.24.0 + '@rollup/rollup-linux-x64-gnu': 4.24.0 + '@rollup/rollup-linux-x64-musl': 4.24.0 + '@rollup/rollup-win32-arm64-msvc': 4.24.0 + '@rollup/rollup-win32-ia32-msvc': 4.24.0 + '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 run-applescript@5.0.0: @@ -8794,9 +9076,9 @@ snapshots: get-intrinsic: 1.2.1 is-regex: 1.1.4 - sass@1.77.8: + sass@1.79.4: dependencies: - chokidar: 3.6.0 + chokidar: 4.0.1 immutable: 4.3.4 source-map-js: 1.2.0 @@ -8886,9 +9168,13 @@ snapshots: vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - shiki@1.10.3: + shiki@1.21.0: dependencies: - '@shikijs/core': 1.10.3 + '@shikijs/core': 1.21.0 + '@shikijs/engine-javascript': 1.21.0 + '@shikijs/engine-oniguruma': 1.21.0 + '@shikijs/types': 1.21.0 + '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 side-channel@1.0.4: @@ -8923,23 +9209,25 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - solid-js@1.8.19: + solid-js@1.9.1: dependencies: csstype: 3.1.3 seroval: 1.1.0 seroval-plugins: 1.1.0(seroval@1.1.0) - solid-refresh@0.6.3(solid-js@1.8.19): + solid-refresh@0.6.3(solid-js@1.9.1): dependencies: '@babel/generator': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/types': 7.24.7 - solid-js: 1.8.19 + solid-js: 1.9.1 transitivePeerDependencies: - supports-color source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -8949,6 +9237,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} + spawn-sync@1.0.15: dependencies: concat-stream: 1.6.2 @@ -9032,6 +9322,11 @@ snapshots: dependencies: safe-buffer: 5.1.2 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -9087,7 +9382,7 @@ snapshots: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 acorn: 8.12.1 aria-query: 5.3.0 axobject-query: 4.0.0 @@ -9107,7 +9402,7 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.1 + picocolors: 1.1.0 tabbable@6.2.0: {} @@ -9136,16 +9431,14 @@ snapshots: through@2.3.8: {} - tinybench@2.8.0: {} + tinybench@2.9.0: {} - tinypool@0.8.4: {} + tinyexec@0.3.0: {} tinypool@1.0.0: {} tinyrainbow@1.2.0: {} - tinyspy@2.2.1: {} - tinyspy@3.0.0: {} titleize@3.0.0: {} @@ -9158,9 +9451,11 @@ snapshots: dependencies: is-number: 7.0.0 - ts-essentials@10.0.1(typescript@5.5.4): + trim-lines@3.0.1: {} + + ts-essentials@10.0.1(typescript@5.6.2): optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 tslib@2.6.0: {} @@ -9171,8 +9466,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - type-detect@4.1.0: {} - type-fest@1.4.0: {} type-fest@2.19.0: {} @@ -9193,25 +9486,23 @@ snapshots: typedarray@0.0.6: {} - typedoc-plugin-markdown@4.0.0-next.23(typedoc@0.25.4(typescript@5.5.4)): + typedoc-plugin-markdown@4.0.0-next.23(typedoc@0.25.4(typescript@5.6.2)): dependencies: - typedoc: 0.25.4(typescript@5.5.4) + typedoc: 0.25.4(typescript@5.6.2) - typedoc-vitepress-theme@1.0.0-next.3(typedoc-plugin-markdown@4.0.0-next.23(typedoc@0.25.4(typescript@5.5.4))): + typedoc-vitepress-theme@1.0.0-next.3(typedoc-plugin-markdown@4.0.0-next.23(typedoc@0.25.4(typescript@5.6.2))): dependencies: - typedoc-plugin-markdown: 4.0.0-next.23(typedoc@0.25.4(typescript@5.5.4)) + typedoc-plugin-markdown: 4.0.0-next.23(typedoc@0.25.4(typescript@5.6.2)) - typedoc@0.25.4(typescript@5.5.4): + typedoc@0.25.4(typescript@5.6.2): dependencies: lunr: 2.3.9 marked: 4.3.0 minimatch: 9.0.3 shiki: 0.14.5 - typescript: 5.5.4 + typescript: 5.6.2 - typescript@5.5.4: {} - - ufo@1.4.0: {} + typescript@5.6.2: {} ufo@1.5.3: {} @@ -9226,7 +9517,7 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - unbuild@2.0.0(sass@1.77.8)(typescript@5.5.4): + unbuild@2.0.0(sass@1.79.4)(typescript@5.6.2): dependencies: '@rollup/plugin-alias': 5.1.0(rollup@3.29.4) '@rollup/plugin-commonjs': 25.0.8(rollup@3.29.4) @@ -9243,17 +9534,17 @@ snapshots: hookable: 5.5.3 jiti: 1.21.6 magic-string: 0.30.10 - mkdist: 1.5.4(sass@1.77.8)(typescript@5.5.4) + mkdist: 1.5.4(sass@1.79.4)(typescript@5.6.2) mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.3 pretty-bytes: 6.1.1 rollup: 3.29.4 - rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.5.4) + rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.6.2) scule: 1.3.0 untyped: 1.4.2 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - sass - supports-color @@ -9261,11 +9552,13 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + unicorn-magic@0.3.0: {} - unimport@3.11.1(rollup@4.19.0): + unimport@3.13.1(rollup@4.24.0)(webpack-sources@3.2.3): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.19.0) + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -9277,23 +9570,48 @@ snapshots: pkg-types: 1.2.0 scule: 1.3.0 strip-literal: 2.1.0 - unplugin: 1.12.3 + unplugin: 1.14.1(webpack-sources@3.2.3) transitivePeerDependencies: - rollup + - webpack-sources unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + universalify@1.0.0: {} universalify@2.0.0: {} - unplugin@1.12.3: + unplugin@1.14.1(webpack-sources@3.2.3): dependencies: acorn: 8.12.1 - webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 + optionalDependencies: + webpack-sources: 3.2.3 untildify@4.0.0: {} @@ -9313,7 +9631,13 @@ snapshots: dependencies: browserslist: 4.23.1 escalade: 3.1.2 - picocolors: 1.0.1 + picocolors: 1.1.0 + + update-browserslist-db@1.1.1(browserslist@4.24.0): + dependencies: + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 update-notifier@6.0.2: dependencies: @@ -9343,87 +9667,80 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@1.6.0(@types/node@20.14.12)(sass@1.77.8): + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile-message: 4.0.2 + + vite-node@2.1.2(@types/node@20.16.10)(sass@1.79.4): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.7 pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite-node@2.0.4(@types/node@20.14.12)(sass@1.77.8): - dependencies: - cac: 6.7.14 - debug: 4.3.5 - pathe: 1.1.2 - tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite-plugin-solid@2.10.2(solid-js@1.8.19)(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)): + vite-plugin-solid@2.10.2(solid-js@1.9.1)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)): dependencies: '@babel/core': 7.24.7 '@types/babel__core': 7.20.5 babel-preset-solid: 1.8.17(@babel/core@7.24.7) merge-anything: 5.1.7 - solid-js: 1.8.19 - solid-refresh: 0.6.3(solid-js@1.8.19) - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)) + solid-js: 1.9.1 + solid-refresh: 0.6.3(solid-js@1.9.1) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + vitefu: 0.2.5(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) transitivePeerDependencies: - supports-color - vite@5.3.5(@types/node@20.14.12)(sass@1.77.8): + vite@5.4.8(@types/node@20.16.10)(sass@1.79.4): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 - rollup: 4.19.0 + postcss: 8.4.47 + rollup: 4.24.0 optionalDependencies: - '@types/node': 20.14.12 + '@types/node': 20.16.10 fsevents: 2.3.3 - sass: 1.77.8 + sass: 1.79.4 - vitefu@0.2.5(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)): + vitefu@0.2.5(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)): optionalDependencies: - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) - vitepress@1.3.1(@algolia/client-search@4.20.0)(@types/node@20.14.12)(@types/react@18.3.3)(postcss@8.4.39)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)(search-insights@2.15.0)(typescript@5.5.4): + vitepress@1.3.4(@algolia/client-search@4.20.0)(@types/node@20.16.10)(@types/react@18.3.11)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.4)(search-insights@2.15.0)(typescript@5.6.2): dependencies: - '@docsearch/css': 3.6.0 - '@docsearch/js': 3.6.0(@algolia/client-search@4.20.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0) - '@shikijs/core': 1.10.3 - '@shikijs/transformers': 1.10.3 - '@types/markdown-it': 14.1.1 - '@vitejs/plugin-vue': 5.1.4(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8))(vue@3.4.34(typescript@5.5.4)) - '@vue/devtools-api': 7.3.6 - '@vue/shared': 3.4.31 - '@vueuse/core': 10.11.0(vue@3.4.34(typescript@5.5.4)) - '@vueuse/integrations': 10.11.0(focus-trap@7.5.4)(vue@3.4.34(typescript@5.5.4)) + '@docsearch/css': 3.6.2 + '@docsearch/js': 3.6.2(@algolia/client-search@4.20.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.15.0) + '@shikijs/core': 1.21.0 + '@shikijs/transformers': 1.21.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.1.4(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))(vue@3.5.11(typescript@5.6.2)) + '@vue/devtools-api': 7.4.6 + '@vue/shared': 3.5.11 + '@vueuse/core': 11.1.0(vue@3.5.11(typescript@5.6.2)) + '@vueuse/integrations': 11.1.0(focus-trap@7.5.4)(vue@3.5.11(typescript@5.6.2)) focus-trap: 7.5.4 mark.js: 8.11.1 - minisearch: 7.0.2 - shiki: 1.10.3 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vue: 3.4.34(typescript@5.5.4) + minisearch: 7.1.0 + shiki: 1.21.0 + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + vue: 3.5.11(typescript@5.6.2) optionalDependencies: - postcss: 8.4.39 + postcss: 8.4.47 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -9443,6 +9760,7 @@ snapshots: - react - react-dom - sass + - sass-embedded - search-insights - sortablejs - stylus @@ -9451,78 +9769,46 @@ snapshots: - typescript - universal-cookie - vitest-mock-extended@2.0.0(typescript@5.5.4)(vitest@2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8)): + vitest-mock-extended@2.0.2(typescript@5.6.2)(vitest@2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4)): dependencies: - ts-essentials: 10.0.1(typescript@5.5.4) - typescript: 5.5.4 - vitest: 2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8) + ts-essentials: 10.0.1(typescript@5.6.2) + typescript: 5.6.2 + vitest: 2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4) - vitest-plugin-random-seed@1.1.0(vite@5.3.5(@types/node@20.14.12)(sass@1.77.8)): + vitest-plugin-random-seed@1.1.0(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)): dependencies: - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) - vitest@1.6.0(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8): + vitest@2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.3 - chai: 4.5.0 - debug: 4.3.5 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.10 - pathe: 1.1.2 - picocolors: 1.0.1 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vite-node: 1.6.0(@types/node@20.14.12)(sass@1.77.8) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 20.14.12 - happy-dom: 14.12.3 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vitest@2.0.4(@types/node@20.14.12)(happy-dom@14.12.3)(sass@1.77.8): - dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.4 - '@vitest/pretty-format': 2.0.4 - '@vitest/runner': 2.0.4 - '@vitest/snapshot': 2.0.4 - '@vitest/spy': 2.0.4 - '@vitest/utils': 2.0.4 + '@vitest/expect': 2.1.2 + '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + '@vitest/pretty-format': 2.1.2 + '@vitest/runner': 2.1.2 + '@vitest/snapshot': 2.1.2 + '@vitest/spy': 2.1.2 + '@vitest/utils': 2.1.2 chai: 5.1.1 - debug: 4.3.5 - execa: 8.0.1 - magic-string: 0.30.10 + debug: 4.3.7 + magic-string: 0.30.11 pathe: 1.1.2 std-env: 3.7.0 - tinybench: 2.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@20.14.12)(sass@1.77.8) - vite-node: 2.0.4(@types/node@20.14.12)(sass@1.77.8) + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + vite-node: 2.1.2(@types/node@20.16.10)(sass@1.79.4) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.12 + '@types/node': 20.16.10 happy-dom: 14.12.3 transitivePeerDependencies: - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color @@ -9532,19 +9818,19 @@ snapshots: vscode-textmate@8.0.0: {} - vue-demi@0.14.8(vue@3.4.34(typescript@5.5.4)): + vue-demi@0.14.10(vue@3.5.11(typescript@5.6.2)): dependencies: - vue: 3.4.34(typescript@5.5.4) + vue: 3.5.11(typescript@5.6.2) - vue@3.4.34(typescript@5.5.4): + vue@3.5.11(typescript@5.6.2): dependencies: - '@vue/compiler-dom': 3.4.34 - '@vue/compiler-sfc': 3.4.34 - '@vue/runtime-dom': 3.4.34 - '@vue/server-renderer': 3.4.34(vue@3.4.34(typescript@5.5.4)) - '@vue/shared': 3.4.34 + '@vue/compiler-dom': 3.5.11 + '@vue/compiler-sfc': 3.5.11 + '@vue/runtime-dom': 3.5.11 + '@vue/server-renderer': 3.5.11(vue@3.5.11(typescript@5.6.2)) + '@vue/shared': 3.5.11 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.2 watchpack@2.4.1: dependencies: @@ -9590,7 +9876,8 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-sources@3.2.3: {} + webpack-sources@3.2.3: + optional: true webpack-virtual-modules@0.6.2: {} @@ -9683,10 +9970,6 @@ snapshots: yallist@4.0.0: {} - yaml@2.4.5: {} - - yaml@2.5.0: {} - yaml@2.5.1: {} yargs-parser@20.2.9: {} @@ -9696,7 +9979,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -9718,8 +10001,6 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yocto-queue@1.1.1: {} - yoctocolors@2.0.2: {} zip-dir@2.0.0: @@ -9728,3 +10009,5 @@ snapshots: jszip: 3.10.1 zod@3.22.4: {} + + zwitch@2.0.4: {} diff --git a/templates/react/package.json b/templates/react/package.json index c92fbb3a..1b702c13 100644 --- a/templates/react/package.json +++ b/templates/react/package.json @@ -19,10 +19,10 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@types/react": "^18.3.3", + "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", - "@wxt-dev/module-react": "^1.1.0", - "typescript": "^5.5.4", - "wxt": "^0.19.1" + "@wxt-dev/module-react": "^1.1.1", + "typescript": "^5.6.2", + "wxt": "^0.19.11" } } diff --git a/templates/solid/package.json b/templates/solid/package.json index 8944899e..9115717c 100644 --- a/templates/solid/package.json +++ b/templates/solid/package.json @@ -15,11 +15,11 @@ "postinstall": "wxt prepare" }, "dependencies": { - "solid-js": "^1.8.19" + "solid-js": "^1.9.1" }, "devDependencies": { - "@wxt-dev/module-solid": "^1.1.1", - "typescript": "^5.5.4", - "wxt": "^0.19.1" + "@wxt-dev/module-solid": "^1.1.2", + "typescript": "^5.6.2", + "wxt": "^0.19.11" } } diff --git a/templates/svelte/package.json b/templates/svelte/package.json index 3736a5dc..bdad117b 100644 --- a/templates/svelte/package.json +++ b/templates/svelte/package.json @@ -16,11 +16,11 @@ }, "devDependencies": { "@tsconfig/svelte": "^5.0.4", - "@wxt-dev/module-svelte": "^1.0.0", - "svelte": "^4.2.18", - "svelte-check": "^3.8.4", - "tslib": "^2.6.3", - "typescript": "^5.5.4", - "wxt": "^0.19.1" + "@wxt-dev/module-svelte": "^1.0.1", + "svelte": "^4.2.19", + "svelte-check": "^3.8.6", + "tslib": "^2.7.0", + "typescript": "^5.6.2", + "wxt": "^0.19.11" } } diff --git a/templates/vanilla/package.json b/templates/vanilla/package.json index e547a13a..a5bc9d58 100644 --- a/templates/vanilla/package.json +++ b/templates/vanilla/package.json @@ -15,7 +15,7 @@ "postinstall": "wxt prepare" }, "devDependencies": { - "typescript": "^5.5.4", - "wxt": "^0.19.1" + "typescript": "^5.6.2", + "wxt": "^0.19.11" } } diff --git a/templates/vue/package.json b/templates/vue/package.json index 15b71575..eff1642f 100644 --- a/templates/vue/package.json +++ b/templates/vue/package.json @@ -15,12 +15,12 @@ "postinstall": "wxt prepare" }, "dependencies": { - "vue": "^3.4.34" + "vue": "^3.5.11" }, "devDependencies": { - "@wxt-dev/module-vue": "^1.0.0", - "typescript": "^5.5.4", - "vue-tsc": "^2.0.29", - "wxt": "^0.19.1" + "@wxt-dev/module-vue": "^1.0.1", + "typescript": "^5.6.2", + "vue-tsc": "^2.1.6", + "wxt": "^0.19.11" } } From 2c5ba64b61ce2516746dd98d890aed0f7c7dfe03 Mon Sep 17 00:00:00 2001 From: windmillcode0 Date: Fri, 4 Oct 2024 14:19:35 -0400 Subject: [PATCH 28/62] fix: Friendly error messages for `null` and `undefined` values inside message files (#1041) Co-authored-by: windmillcode0 --- packages/i18n/src/__tests__/build.test.ts | 13 +++++++++++++ packages/i18n/src/build.ts | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/packages/i18n/src/__tests__/build.test.ts b/packages/i18n/src/__tests__/build.test.ts index 7e77b551..ef05be0c 100644 --- a/packages/i18n/src/__tests__/build.test.ts +++ b/packages/i18n/src/__tests__/build.test.ts @@ -161,4 +161,17 @@ describe('Built Tools', () => { ); expect(mockWriteFile).toBeCalledWith('output.d.ts', expectedDts, 'utf8'); }); + + it('should throw an error if messages file contains null or undefined', async () => { + const invalidFileContent = stringifyYAML({ + simple: 'example', + invalidField: null, + }); + + mockReadFile.mockResolvedValue(invalidFileContent); + + await expect(parseMessagesFile('invalid.yml')).rejects.toThrowError( + 'Messages file should not contain `null` (found at "invalidField")', + ); + }); }); diff --git a/packages/i18n/src/build.ts b/packages/i18n/src/build.ts index 8d861a67..7510c452 100644 --- a/packages/i18n/src/build.ts +++ b/packages/i18n/src/build.ts @@ -166,6 +166,11 @@ function _parseMessagesObject( ]; } case 'object': + if ([null, undefined].includes(object)) { + throw new Error( + `Messages file should not contain \`${object}\` (found at "${path.join('.')}")`, + ); + } if (Array.isArray(object)) return object.flatMap((item, i) => _parseMessagesObject(path.concat(String(i)), item, depth + 1), From 947b24f1b02a8897d6cd8c0cd9b8d7a376a470fd Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 4 Oct 2024 18:24:18 +0000 Subject: [PATCH 29/62] chore(release): @wxt-dev/i18n v0.1.1 --- packages/i18n/CHANGELOG.md | 19 +++++++++++++++++++ packages/i18n/package.json | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 packages/i18n/CHANGELOG.md diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md new file mode 100644 index 00000000..89b873d4 --- /dev/null +++ b/packages/i18n/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog + +## v0.1.1 + +[compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.1.0...i18n-v0.1.1) + +### 🩹 Fixes + +- Friendly error messages for `null` and `undefined` values inside message files ([#1041](https://github.com/wxt-dev/wxt/pull/1041)) + +### 🏡 Chore + +- Add `oxlint` for linting ([#947](https://github.com/wxt-dev/wxt/pull/947)) +- Upgrade all non-major dependencies ([#1040](https://github.com/wxt-dev/wxt/pull/1040)) + +### ❤️ Contributors + +- Windmillcode0 +- Aaron ([@aklinker1](http://github.com/aklinker1)) \ No newline at end of file diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 2bc1ffd7..8ff5154a 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,7 +1,7 @@ { "name": "@wxt-dev/i18n", "description": "Type-safe wrapper around browser.i18n.getMessage with additional features", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "repository": { "type": "git", From 6020083b895d8fc822404728c51e6756d9ec1d4e Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Fri, 4 Oct 2024 23:38:06 +0200 Subject: [PATCH 30/62] perf: Replace `execa` with `nano-spawn` for smaller package size (#1042) --- docs/.vitepress/loaders/cli.data.ts | 7 +- package.json | 2 +- packages/wxt/e2e/tests/auto-imports.test.ts | 10 +- packages/wxt/e2e/tests/init.test.ts | 30 +++-- packages/wxt/e2e/tests/zip.test.ts | 12 +- packages/wxt/e2e/utils.ts | 4 +- packages/wxt/package.json | 2 +- packages/wxt/src/cli/cli-utils.ts | 4 +- .../package-managers/__tests__/npm.test.ts | 4 +- .../package-managers/__tests__/pnpm.test.ts | 4 +- packages/wxt/src/core/package-managers/bun.ts | 4 +- packages/wxt/src/core/package-managers/npm.ts | 7 +- .../wxt/src/core/package-managers/pnpm.ts | 4 +- .../wxt/src/core/package-managers/yarn.ts | 4 +- pnpm-lock.yaml | 124 ++---------------- scripts/bump-package-version.ts | 10 +- 16 files changed, 72 insertions(+), 160 deletions(-) diff --git a/docs/.vitepress/loaders/cli.data.ts b/docs/.vitepress/loaders/cli.data.ts index c99d9484..77327e70 100644 --- a/docs/.vitepress/loaders/cli.data.ts +++ b/docs/.vitepress/loaders/cli.data.ts @@ -1,6 +1,6 @@ -import { resolve, join } from 'node:path'; +import { resolve } from 'node:path'; import consola from 'consola'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; const cliDir = resolve('packages/wxt/src/cli/commands'); const cliDirGlob = resolve(cliDir, '**'); @@ -37,7 +37,8 @@ export default { }; async function getHelp(command: string): Promise { - const res = await execaCommand(command + ' --help', { + const args = command.split(' '); + const res = await spawn(args[0], [...args.slice(1), '--help'], { cwd: 'packages/wxt', }); return res.stdout; diff --git a/package.json b/package.json index bc0e1a55..1a3a4e65 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,11 @@ "changelogen": "^0.5.7", "consola": "^3.2.3", "dependency-graph": "^1.0.0", - "execa": "^9.4.0", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "hasha": "^6.0.0", "lint-staged": "^15.2.10", + "nano-spawn": "^0.1.0", "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "simple-git-hooks": "^2.11.1", diff --git a/packages/wxt/e2e/tests/auto-imports.test.ts b/packages/wxt/e2e/tests/auto-imports.test.ts index c1eecb5f..167b33a4 100644 --- a/packages/wxt/e2e/tests/auto-imports.test.ts +++ b/packages/wxt/e2e/tests/auto-imports.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { TestProject } from '../utils'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; describe('Auto Imports', () => { describe('imports: { ... }', () => { @@ -180,7 +180,7 @@ describe('Auto Imports', () => { await project.prepare({ imports: { eslintrc: { enabled: version } }, }); - return await execaCommand('pnpm eslint entrypoints/background.js', { + return await spawn('pnpm', ['eslint', 'entrypoints/background.js'], { cwd: project.root, }); } @@ -205,7 +205,8 @@ describe('Auto Imports', () => { ); await expect(runEslint(project, 9)).rejects.toMatchObject({ - message: expect.stringContaining( + exitCode: 1, + stdout: expect.stringContaining( "'defineBackground' is not defined", ), }); @@ -253,7 +254,8 @@ describe('Auto Imports', () => { ); await expect(runEslint(project, 8)).rejects.toMatchObject({ - message: expect.stringContaining( + exitCode: 1, + stdout: expect.stringContaining( "'defineBackground' is not defined", ), }); diff --git a/packages/wxt/e2e/tests/init.test.ts b/packages/wxt/e2e/tests/init.test.ts index 269a86ce..a004be04 100644 --- a/packages/wxt/e2e/tests/init.test.ts +++ b/packages/wxt/e2e/tests/init.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { TestProject, WXT_PACKAGE_DIR } from '../utils'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; import glob from 'fast-glob'; import { mkdir, writeJson } from 'fs-extra'; @@ -8,11 +8,15 @@ describe('Init command', () => { it('should download and create a template', async () => { const project = new TestProject(); - await execaCommand(`pnpm -s wxt init ${project.root} -t vue --pm npm`, { - env: { ...process.env, CI: 'true' }, - stdio: 'ignore', - cwd: WXT_PACKAGE_DIR, - }); + await spawn( + 'pnpm', + ['-s', 'wxt', 'init', project.root, '-t', 'vue', '--pm', 'npm'], + { + env: { CI: 'true' }, + stdio: 'ignore', + cwd: WXT_PACKAGE_DIR, + }, + ); const files = await glob('**/*', { cwd: project.root, onlyFiles: true, @@ -51,11 +55,15 @@ describe('Init command', () => { await writeJson(project.resolvePath('package.json'), {}); await expect(() => - execaCommand(`pnpm -s wxt init ${project.root} -t vue --pm npm`, { - env: { ...process.env, CI: 'true' }, - stdio: 'ignore', - cwd: WXT_PACKAGE_DIR, - }), + spawn( + 'pnpm', + ['-s', 'wxt', 'init', project.root, '-t', 'vue', '--pm', 'npm'], + { + env: { CI: 'true' }, + stdio: 'ignore', + cwd: WXT_PACKAGE_DIR, + }, + ), ).rejects.toThrowError('Command failed with exit code 1:'); }); }); diff --git a/packages/wxt/e2e/tests/zip.test.ts b/packages/wxt/e2e/tests/zip.test.ts index 713ad68a..e20fccc1 100644 --- a/packages/wxt/e2e/tests/zip.test.ts +++ b/packages/wxt/e2e/tests/zip.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { TestProject } from '../utils'; import extract from 'extract-zip'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; import { readFile, writeFile } from 'fs-extra'; process.env.WXT_PNPM_IGNORE_WORKSPACE = 'true'; @@ -41,13 +41,15 @@ describe('Zipping', () => { // Build zipped extension await expect( - execaCommand('pnpm i --ignore-workspace --frozen-lockfile false', { + spawn('pnpm', ['i', '--ignore-workspace', '--frozen-lockfile', 'false'], { cwd: unzipDir, }), - ).resolves.toMatchObject({ exitCode: 0 }); + ).resolves.not.toHaveProperty('exitCode'); await expect( - execaCommand('pnpm wxt build -b firefox', { cwd: unzipDir }), - ).resolves.toMatchObject({ exitCode: 0 }); + spawn('pnpm', ['wxt', 'build', '-b', 'firefox'], { + cwd: unzipDir, + }), + ).resolves.not.toHaveProperty('exitCode'); await expect(project.fileExists(unzipDir, '.output')).resolves.toBe(true); expect( diff --git a/packages/wxt/e2e/utils.ts b/packages/wxt/e2e/utils.ts index a57943d7..8a44c985 100644 --- a/packages/wxt/e2e/utils.ts +++ b/packages/wxt/e2e/utils.ts @@ -1,7 +1,7 @@ import { dirname, relative, resolve } from 'path'; import fs, { mkdir } from 'fs-extra'; import glob from 'fast-glob'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; import { InlineConfig, UserConfig, @@ -119,7 +119,7 @@ export class TestProject { await fs.writeFile(filePath, content ?? '', 'utf-8'); } - await execaCommand('pnpm --ignore-workspace i --ignore-scripts', { + await spawn('pnpm', ['--ignore-workspace', 'i', '--ignore-scripts'], { cwd: this.root, }); await mkdir(resolve(this.root, 'public'), { recursive: true }).catch( diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 12656d1c..2e7fbd49 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -97,7 +97,6 @@ "dequal": "^2.0.3", "dotenv": "^16.4.5", "esbuild": "^0.24.0", - "execa": "^9.4.0", "fast-glob": "^3.3.2", "filesize": "^10.1.6", "fs-extra": "^11.2.0", @@ -111,6 +110,7 @@ "linkedom": "^0.18.5", "magicast": "^0.3.5", "minimatch": "^10.0.1", + "nano-spawn": "^0.1.0", "natural-compare": "^1.4.0", "normalize-path": "^3.0.0", "nypm": "^0.3.12", diff --git a/packages/wxt/src/cli/cli-utils.ts b/packages/wxt/src/cli/cli-utils.ts index 952416a1..2f525ae6 100644 --- a/packages/wxt/src/cli/cli-utils.ts +++ b/packages/wxt/src/cli/cli-utils.ts @@ -5,6 +5,7 @@ import { printHeader } from '../core/utils/log'; import { formatDuration } from '../core/utils/time'; import { ValidationError } from '../core/utils/validation'; import { registerWxt } from '../core/wxt'; +import spawn from 'nano-spawn'; /** * Wrap an action handler to add a timer, error handling, and maybe enable debug mode. @@ -87,8 +88,7 @@ export function createAliasedCommand( const args = process.argv.slice( process.argv.indexOf(aliasedCommand.name) + 1, ); - const { execa } = await import('execa'); - await execa(bin, args, { + await spawn(bin, args, { stdio: 'inherit', }); } catch { diff --git a/packages/wxt/src/core/package-managers/__tests__/npm.test.ts b/packages/wxt/src/core/package-managers/__tests__/npm.test.ts index 5e27e3e1..de2e8e2a 100644 --- a/packages/wxt/src/core/package-managers/__tests__/npm.test.ts +++ b/packages/wxt/src/core/package-managers/__tests__/npm.test.ts @@ -1,7 +1,7 @@ import { beforeAll, describe, expect, it } from 'vitest'; import path from 'node:path'; import { npm } from '../npm'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; import { exists } from 'fs-extra'; describe('NPM Package Management Utils', () => { @@ -9,7 +9,7 @@ describe('NPM Package Management Utils', () => { const cwd = path.resolve(__dirname, 'fixtures/simple-npm-project'); beforeAll(async () => { // NPM needs the modules installed for 'npm ls' to work - await execaCommand('npm i', { cwd }); + await spawn('npm', ['i'], { cwd }); }, 60e3); it('should list direct dependencies', async () => { diff --git a/packages/wxt/src/core/package-managers/__tests__/pnpm.test.ts b/packages/wxt/src/core/package-managers/__tests__/pnpm.test.ts index 34b48811..20b6312c 100644 --- a/packages/wxt/src/core/package-managers/__tests__/pnpm.test.ts +++ b/packages/wxt/src/core/package-managers/__tests__/pnpm.test.ts @@ -1,7 +1,7 @@ import { beforeAll, describe, expect, it } from 'vitest'; import path from 'node:path'; import { pnpm } from '../pnpm'; -import { execaCommand } from 'execa'; +import spawn from 'nano-spawn'; process.env.WXT_PNPM_IGNORE_WORKSPACE = 'true'; @@ -10,7 +10,7 @@ describe('PNPM Package Management Utils', () => { const cwd = path.resolve(__dirname, 'fixtures/simple-pnpm-project'); beforeAll(async () => { // PNPM needs the modules installed, or 'pnpm ls' will return a blank list. - await execaCommand('pnpm i --ignore-workspace', { cwd }); + await spawn('pnpm', ['i', '--ignore-workspace'], { cwd }); }); it('should list direct dependencies', async () => { diff --git a/packages/wxt/src/core/package-managers/bun.ts b/packages/wxt/src/core/package-managers/bun.ts index 8296c015..e06882d1 100644 --- a/packages/wxt/src/core/package-managers/bun.ts +++ b/packages/wxt/src/core/package-managers/bun.ts @@ -1,5 +1,6 @@ import { dedupeDependencies, npm } from './npm'; import { WxtPackageManagerImpl } from './types'; +import spawn from 'nano-spawn'; export const bun: WxtPackageManagerImpl = { overridesKey: 'overrides', // But also supports "resolutions" @@ -11,8 +12,7 @@ export const bun: WxtPackageManagerImpl = { if (options?.all) { args.push('--all'); } - const { execa } = await import('execa'); - const res = await execa('bun', args, { cwd: options?.cwd }); + const res = await spawn('bun', args, { cwd: options?.cwd }); return dedupeDependencies( res.stdout .split('\n') diff --git a/packages/wxt/src/core/package-managers/npm.ts b/packages/wxt/src/core/package-managers/npm.ts index 4137b962..7ad5386f 100644 --- a/packages/wxt/src/core/package-managers/npm.ts +++ b/packages/wxt/src/core/package-managers/npm.ts @@ -2,13 +2,13 @@ import { Dependency } from '../../types'; import { WxtPackageManagerImpl } from './types'; import path from 'node:path'; import { ensureDir } from 'fs-extra'; +import spawn from 'nano-spawn'; export const npm: WxtPackageManagerImpl = { overridesKey: 'overrides', async downloadDependency(id, downloadDir) { await ensureDir(downloadDir); - const { execa } = await import('execa'); - const res = await execa('npm', ['pack', id, '--json'], { + const res = await spawn('npm', ['pack', id, '--json'], { cwd: downloadDir, }); const packed: PackedDependency[] = JSON.parse(res.stdout); @@ -19,8 +19,7 @@ export const npm: WxtPackageManagerImpl = { if (options?.all) { args.push('--depth', 'Infinity'); } - const { execa } = await import('execa'); - const res = await execa('npm', args, { cwd: options?.cwd }); + const res = await spawn('npm', args, { cwd: options?.cwd }); const project: NpmListProject = JSON.parse(res.stdout); return flattenNpmListOutput([project]); diff --git a/packages/wxt/src/core/package-managers/pnpm.ts b/packages/wxt/src/core/package-managers/pnpm.ts index 891fe18a..32d89b60 100644 --- a/packages/wxt/src/core/package-managers/pnpm.ts +++ b/packages/wxt/src/core/package-managers/pnpm.ts @@ -1,5 +1,6 @@ import { NpmListProject, flattenNpmListOutput, npm } from './npm'; import { WxtPackageManagerImpl } from './types'; +import spawn from 'nano-spawn'; export const pnpm: WxtPackageManagerImpl = { overridesKey: 'resolutions', // "pnpm.overrides" has a higher priority, but I don't want to deal with nesting @@ -19,8 +20,7 @@ export const pnpm: WxtPackageManagerImpl = { ) { args.push('--ignore-workspace'); } - const { execa } = await import('execa'); - const res = await execa('pnpm', args, { cwd: options?.cwd }); + const res = await spawn('pnpm', args, { cwd: options?.cwd }); const projects: NpmListProject[] = JSON.parse(res.stdout); return flattenNpmListOutput(projects); diff --git a/packages/wxt/src/core/package-managers/yarn.ts b/packages/wxt/src/core/package-managers/yarn.ts index c313ca8d..8b544932 100644 --- a/packages/wxt/src/core/package-managers/yarn.ts +++ b/packages/wxt/src/core/package-managers/yarn.ts @@ -1,6 +1,7 @@ import { Dependency } from '../../types'; import { WxtPackageManagerImpl } from './types'; import { dedupeDependencies, npm } from './npm'; +import spawn from 'nano-spawn'; export const yarn: WxtPackageManagerImpl = { overridesKey: 'resolutions', @@ -12,8 +13,7 @@ export const yarn: WxtPackageManagerImpl = { if (options?.all) { args.push('--depth', 'Infinity'); } - const { execa } = await import('execa'); - const res = await execa('yarn', args, { cwd: options?.cwd }); + const res = await spawn('yarn', args, { cwd: options?.cwd }); const tree = res.stdout .split('\n') .map((line) => JSON.parse(line)) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fdba416..c8a3aa8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,9 +29,6 @@ importers: dependency-graph: specifier: ^1.0.0 version: 1.0.0 - execa: - specifier: ^9.4.0 - version: 9.4.0 fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -44,6 +41,9 @@ importers: lint-staged: specifier: ^15.2.10 version: 15.2.10 + nano-spawn: + specifier: ^0.1.0 + version: 0.1.0 npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -311,9 +311,6 @@ importers: esbuild: specifier: ^0.24.0 version: 0.24.0 - execa: - specifier: ^9.4.0 - version: 9.4.0 fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -353,6 +350,9 @@ importers: minimatch: specifier: ^10.0.1 version: 10.0.1 + nano-spawn: + specifier: ^0.1.0 + version: 0.1.0 natural-compare: specifier: ^1.4.0 version: 1.4.0 @@ -1755,9 +1755,6 @@ packages: cpu: [x64] os: [win32] - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@1.21.0': resolution: {integrity: sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==} @@ -1780,10 +1777,6 @@ packages: resolution: {integrity: sha512-axlrvsHlHlFmKKMEg4VyvMzFr93JWJj4eIfXY1STVuO2fsImCa7ncaiG5gC8HKOX590AW5RtRsC41/B+OfrSqw==} engines: {node: '>=14.16'} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} engines: {node: ^18.0.0 || >=20} @@ -2788,10 +2781,6 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.4.0: - resolution: {integrity: sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==} - engines: {node: ^18.19.0 || >=20.5.0} - extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} @@ -2807,10 +2796,6 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - filesize@10.1.6: resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} @@ -2912,10 +2897,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -3071,10 +3052,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - human-signals@8.0.0: - resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} - engines: {node: '>=18.18.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3230,10 +3207,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -3270,10 +3243,6 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -3702,6 +3671,10 @@ packages: nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + nano-spawn@0.1.0: + resolution: {integrity: sha512-Q0fYRut0GGSoysqrS6hF1jlQEc3yOglnGXwsS+DcoaLwu6NCkUxOB8om08hvUF0V+bNRjExzKM3v8ATbfrLWyQ==} + engines: {node: '>=18.19'} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3774,10 +3747,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -3880,10 +3849,6 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -4162,10 +4127,6 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} - pretty-ms@9.0.0: - resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} - engines: {node: '>=18'} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -4601,10 +4562,6 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -4801,10 +4758,6 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - unimport@3.13.1: resolution: {integrity: sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==} @@ -5154,10 +5107,6 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yoctocolors@2.0.2: - resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} - engines: {node: '>=18'} - zip-dir@2.0.0: resolution: {integrity: sha512-uhlsJZWz26FLYXOD6WVuq+fIcZ3aBPGo/cFdiLlv3KNwpa52IF3ISV8fLhQLiqVu5No3VhlqlgthN6gehil1Dg==} @@ -6178,8 +6127,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true - '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@1.21.0': dependencies: '@shikijs/engine-javascript': 1.21.0 @@ -6213,8 +6160,6 @@ snapshots: '@sindresorhus/is@5.4.1': {} - '@sindresorhus/merge-streams@4.0.0': {} - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)))(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': dependencies: '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.18)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) @@ -7449,21 +7394,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.4.0: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.0 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.0.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.0.2 - extract-zip@2.0.1: dependencies: debug: 4.3.4 @@ -7490,10 +7420,6 @@ snapshots: dependencies: pend: 1.2.0 - figures@6.1.0: - dependencies: - is-unicode-supported: 2.0.0 - filesize@10.1.6: {} fill-range@7.1.1: @@ -7594,11 +7520,6 @@ snapshots: get-stream@8.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-symbol-description@1.0.0: dependencies: call-bind: 1.0.2 @@ -7782,8 +7703,6 @@ snapshots: human-signals@5.0.0: {} - human-signals@8.0.0: {} - ieee754@1.2.1: {} ignore-walk@5.0.1: @@ -7907,8 +7826,6 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -7940,8 +7857,6 @@ snapshots: is-stream@3.0.0: {} - is-stream@4.0.1: {} - is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 @@ -8383,6 +8298,8 @@ snapshots: nan@2.17.0: optional: true + nano-spawn@0.1.0: {} + nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -8455,11 +8372,6 @@ snapshots: dependencies: path-key: 4.0.0 - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -8599,8 +8511,6 @@ snapshots: lines-and-columns: 2.0.3 type-fest: 3.13.1 - parse-ms@4.0.0: {} - parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -8846,10 +8756,6 @@ snapshots: pretty-bytes@6.1.1: {} - pretty-ms@9.0.0: - dependencies: - parse-ms: 4.0.0 - process-nextick-args@2.0.1: {} promise-toolbox@0.21.0: @@ -9343,8 +9249,6 @@ snapshots: strip-final-newline@3.0.0: {} - strip-final-newline@4.0.0: {} - strip-json-comments@2.0.1: {} strip-json-comments@5.0.1: {} @@ -9554,8 +9458,6 @@ snapshots: undici-types@6.19.8: {} - unicorn-magic@0.3.0: {} - unimport@3.13.1(rollup@4.24.0)(webpack-sources@3.2.3): dependencies: '@rollup/pluginutils': 5.1.2(rollup@4.24.0) @@ -10001,8 +9903,6 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yoctocolors@2.0.2: {} - zip-dir@2.0.0: dependencies: async: 3.2.4 diff --git a/scripts/bump-package-version.ts b/scripts/bump-package-version.ts index 86d5603e..83863653 100644 --- a/scripts/bump-package-version.ts +++ b/scripts/bump-package-version.ts @@ -5,7 +5,7 @@ import { generateMarkDown, parseChangelogMarkdown, } from 'changelogen'; -import { execa } from 'execa'; +import spawn from 'nano-spawn'; import { getPkgTag, grabPackageDetails, listCommitsInDir } from './git'; import { consola } from 'consola'; import fs from 'fs-extra'; @@ -36,7 +36,7 @@ if (currentVersion.startsWith('0.')) { bumpType = 'patch'; } } -await execa('pnpm', ['version', bumpType], { +await spawn('pnpm', ['version', bumpType], { cwd: pkgDir, }); const updatedPkgJson = await fs.readJson(pkgJsonPath); @@ -82,11 +82,11 @@ await fs.writeFile(changelogPath, newChangelog, 'utf8'); consola.success('Updated changelog'); // Commit changes -await execa('git', ['add', pkgJsonPath, changelogPath]); -await execa('git', [ +await spawn('git', ['add', pkgJsonPath, changelogPath]); +await spawn('git', [ 'commit', '-m', `chore(release): ${pkgName} v${newVersion}`, ]); -await execa('git', ['tag', newTag]); +await spawn('git', ['tag', newTag]); consola.success('Committed version and changelog'); From cab97bca1e1c76c2510f971bc2dc8a9e90556d71 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 4 Oct 2024 16:48:25 -0500 Subject: [PATCH 31/62] perf: Downgrade `esbuild` so a single version is shared between sub-dependencies (#1045) --- packages/wxt/e2e/tests/npm-packages.test.ts | 40 +++ packages/wxt/package.json | 2 +- pnpm-lock.yaml | 256 +------------------- taze.config.ts | 9 +- 4 files changed, 55 insertions(+), 252 deletions(-) create mode 100644 packages/wxt/e2e/tests/npm-packages.test.ts diff --git a/packages/wxt/e2e/tests/npm-packages.test.ts b/packages/wxt/e2e/tests/npm-packages.test.ts new file mode 100644 index 00000000..f5d387d3 --- /dev/null +++ b/packages/wxt/e2e/tests/npm-packages.test.ts @@ -0,0 +1,40 @@ +import { test, expect } from 'vitest'; +import spawn from 'nano-spawn'; +import { + NpmListDependency, + NpmListProject, +} from '../../src/core/package-managers/npm'; + +// Tests to ensure the total size of the WXT module is as small as possible +// https://pkg-size.dev/wxt + +test('Only one version of esbuild should be installed (each version is ~20mb of node_modules)', async () => { + const { stdout } = await spawn('pnpm', [ + 'why', + 'esbuild', + '--prod', + '--json', + ]); + const projects: NpmListProject[] = JSON.parse(stdout); + const esbuildVersions = new Set(); + iterateDependencies(projects, (name, meta) => { + if (name === 'esbuild') esbuildVersions.add(meta.version); + }); + + expect([...esbuildVersions]).toHaveLength(1); +}); + +function iterateDependencies( + projects: NpmListProject[], + cb: (name: string, meta: NpmListDependency) => void, +) { + const recurse = (dependencies: Record) => { + Object.entries(dependencies).forEach(([name, meta]) => { + cb(name, meta); + if (meta.dependencies) recurse(meta.dependencies); + }); + }; + projects.forEach((project) => { + if (project.dependencies) recurse(project.dependencies); + }); +} diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 2e7fbd49..c068711a 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -96,7 +96,7 @@ "defu": "^6.1.4", "dequal": "^2.0.3", "dotenv": "^16.4.5", - "esbuild": "^0.24.0", + "esbuild": "^0.21.5", "fast-glob": "^3.3.2", "filesize": "^10.1.6", "fs-extra": "^11.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8a3aa8a..58f21ece 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -309,8 +309,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 esbuild: - specifier: ^0.24.0 - version: 0.24.0 + specifier: ^0.21.5 + version: 0.21.5 fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -860,12 +860,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.19.12': resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} @@ -884,12 +878,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.19.12': resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} @@ -908,12 +896,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.19.12': resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} @@ -932,12 +914,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.19.12': resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} @@ -956,12 +932,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.19.12': resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} @@ -980,12 +950,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} @@ -1004,12 +968,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} @@ -1028,12 +986,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.19.12': resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} @@ -1052,12 +1004,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.19.12': resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} @@ -1076,12 +1022,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.19.12': resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} @@ -1100,12 +1040,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.19.12': resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} @@ -1124,12 +1058,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.19.12': resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} @@ -1148,12 +1076,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.19.12': resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} @@ -1172,12 +1094,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.19.12': resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} @@ -1196,12 +1112,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.19.12': resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} @@ -1220,12 +1130,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.19.12': resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} @@ -1244,12 +1148,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.19.12': resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} @@ -1268,24 +1166,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.23.0': resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} @@ -1304,12 +1190,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.19.12': resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} @@ -1328,12 +1208,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.19.12': resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} @@ -1352,12 +1226,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.19.12': resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} @@ -1376,12 +1244,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.19.12': resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} @@ -1400,12 +1262,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@faker-js/faker@8.4.1': resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} @@ -2727,11 +2583,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -2921,10 +2772,12 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -3079,6 +2932,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4267,6 +4121,7 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -5591,9 +5446,6 @@ snapshots: '@esbuild/aix-ppc64@0.23.0': optional: true - '@esbuild/aix-ppc64@0.24.0': - optional: true - '@esbuild/android-arm64@0.19.12': optional: true @@ -5603,9 +5455,6 @@ snapshots: '@esbuild/android-arm64@0.23.0': optional: true - '@esbuild/android-arm64@0.24.0': - optional: true - '@esbuild/android-arm@0.19.12': optional: true @@ -5615,9 +5464,6 @@ snapshots: '@esbuild/android-arm@0.23.0': optional: true - '@esbuild/android-arm@0.24.0': - optional: true - '@esbuild/android-x64@0.19.12': optional: true @@ -5627,9 +5473,6 @@ snapshots: '@esbuild/android-x64@0.23.0': optional: true - '@esbuild/android-x64@0.24.0': - optional: true - '@esbuild/darwin-arm64@0.19.12': optional: true @@ -5639,9 +5482,6 @@ snapshots: '@esbuild/darwin-arm64@0.23.0': optional: true - '@esbuild/darwin-arm64@0.24.0': - optional: true - '@esbuild/darwin-x64@0.19.12': optional: true @@ -5651,9 +5491,6 @@ snapshots: '@esbuild/darwin-x64@0.23.0': optional: true - '@esbuild/darwin-x64@0.24.0': - optional: true - '@esbuild/freebsd-arm64@0.19.12': optional: true @@ -5663,9 +5500,6 @@ snapshots: '@esbuild/freebsd-arm64@0.23.0': optional: true - '@esbuild/freebsd-arm64@0.24.0': - optional: true - '@esbuild/freebsd-x64@0.19.12': optional: true @@ -5675,9 +5509,6 @@ snapshots: '@esbuild/freebsd-x64@0.23.0': optional: true - '@esbuild/freebsd-x64@0.24.0': - optional: true - '@esbuild/linux-arm64@0.19.12': optional: true @@ -5687,9 +5518,6 @@ snapshots: '@esbuild/linux-arm64@0.23.0': optional: true - '@esbuild/linux-arm64@0.24.0': - optional: true - '@esbuild/linux-arm@0.19.12': optional: true @@ -5699,9 +5527,6 @@ snapshots: '@esbuild/linux-arm@0.23.0': optional: true - '@esbuild/linux-arm@0.24.0': - optional: true - '@esbuild/linux-ia32@0.19.12': optional: true @@ -5711,9 +5536,6 @@ snapshots: '@esbuild/linux-ia32@0.23.0': optional: true - '@esbuild/linux-ia32@0.24.0': - optional: true - '@esbuild/linux-loong64@0.19.12': optional: true @@ -5723,9 +5545,6 @@ snapshots: '@esbuild/linux-loong64@0.23.0': optional: true - '@esbuild/linux-loong64@0.24.0': - optional: true - '@esbuild/linux-mips64el@0.19.12': optional: true @@ -5735,9 +5554,6 @@ snapshots: '@esbuild/linux-mips64el@0.23.0': optional: true - '@esbuild/linux-mips64el@0.24.0': - optional: true - '@esbuild/linux-ppc64@0.19.12': optional: true @@ -5747,9 +5563,6 @@ snapshots: '@esbuild/linux-ppc64@0.23.0': optional: true - '@esbuild/linux-ppc64@0.24.0': - optional: true - '@esbuild/linux-riscv64@0.19.12': optional: true @@ -5759,9 +5572,6 @@ snapshots: '@esbuild/linux-riscv64@0.23.0': optional: true - '@esbuild/linux-riscv64@0.24.0': - optional: true - '@esbuild/linux-s390x@0.19.12': optional: true @@ -5771,9 +5581,6 @@ snapshots: '@esbuild/linux-s390x@0.23.0': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - '@esbuild/linux-x64@0.19.12': optional: true @@ -5783,9 +5590,6 @@ snapshots: '@esbuild/linux-x64@0.23.0': optional: true - '@esbuild/linux-x64@0.24.0': - optional: true - '@esbuild/netbsd-x64@0.19.12': optional: true @@ -5795,15 +5599,9 @@ snapshots: '@esbuild/netbsd-x64@0.23.0': optional: true - '@esbuild/netbsd-x64@0.24.0': - optional: true - '@esbuild/openbsd-arm64@0.23.0': optional: true - '@esbuild/openbsd-arm64@0.24.0': - optional: true - '@esbuild/openbsd-x64@0.19.12': optional: true @@ -5813,9 +5611,6 @@ snapshots: '@esbuild/openbsd-x64@0.23.0': optional: true - '@esbuild/openbsd-x64@0.24.0': - optional: true - '@esbuild/sunos-x64@0.19.12': optional: true @@ -5825,9 +5620,6 @@ snapshots: '@esbuild/sunos-x64@0.23.0': optional: true - '@esbuild/sunos-x64@0.24.0': - optional: true - '@esbuild/win32-arm64@0.19.12': optional: true @@ -5837,9 +5629,6 @@ snapshots: '@esbuild/win32-arm64@0.23.0': optional: true - '@esbuild/win32-arm64@0.24.0': - optional: true - '@esbuild/win32-ia32@0.19.12': optional: true @@ -5849,9 +5638,6 @@ snapshots: '@esbuild/win32-ia32@0.23.0': optional: true - '@esbuild/win32-ia32@0.24.0': - optional: true - '@esbuild/win32-x64@0.19.12': optional: true @@ -5861,9 +5647,6 @@ snapshots: '@esbuild/win32-x64@0.23.0': optional: true - '@esbuild/win32-x64@0.24.0': - optional: true - '@faker-js/faker@8.4.1': {} '@img/sharp-darwin-arm64@0.33.5': @@ -7309,33 +7092,6 @@ snapshots: '@esbuild/win32-ia32': 0.23.0 '@esbuild/win32-x64': 0.23.0 - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - escalade@3.1.1: {} escalade@3.1.2: {} diff --git a/taze.config.ts b/taze.config.ts index 0d2a1f84..0bc140cf 100644 --- a/taze.config.ts +++ b/taze.config.ts @@ -1,4 +1,11 @@ // https://github.com/antfu-collective/taze?tab=readme-ov-file#config-file export default { - exclude: ['typedoc', 'typedoc-plugin-markdown', 'typedoc-vitepress-theme'], + exclude: [ + // Very touchy, don't change: + 'typedoc', + 'typedoc-plugin-markdown', + 'typedoc-vitepress-theme', + // Manually manage version so a single version is used: + 'esbuild', + ], }; From 539d482f714f93eacb40ae2d3c20e82e2d553d91 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 4 Oct 2024 16:48:35 -0500 Subject: [PATCH 32/62] chore: Remove TS `compilerOptions.noUnusedLocals` because Oxlint already does it (#1047) --- tsconfig.base.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/tsconfig.base.json b/tsconfig.base.json index 1dbd78cf..78d6cbc9 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -11,9 +11,6 @@ "strict": true, "lib": ["DOM", "WebWorker", "ESNext"], - /* Linting */ - "noUnusedLocals": true, - /* Completeness */ "skipLibCheck": true } From 6c6087249f102f6ece4b4c899d6ba72bfb79ae65 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 4 Oct 2024 18:07:57 -0500 Subject: [PATCH 33/62] fix!: Remove invalid options argument (#1048) --- packages/i18n/src/__tests__/index.test.ts | 22 +++------------------- packages/i18n/src/__tests__/types.test.ts | 13 +------------ packages/i18n/src/index.ts | 17 ++--------------- packages/i18n/src/types.ts | 14 -------------- 4 files changed, 6 insertions(+), 60 deletions(-) diff --git a/packages/i18n/src/__tests__/index.test.ts b/packages/i18n/src/__tests__/index.test.ts index 8ac650fd..2ffc37f6 100644 --- a/packages/i18n/src/__tests__/index.test.ts +++ b/packages/i18n/src/__tests__/index.test.ts @@ -1,6 +1,5 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { createI18n } from '../index'; -import { GetMessageOptions } from '../types'; const getMessageMock = vi.fn(); @@ -28,7 +27,7 @@ describe('createI18n', () => { expect(actual).toBe(expectedValue); expect(getMessageMock).toBeCalledTimes(1); - expect(getMessageMock).toBeCalledWith(expectedKey, undefined); + expect(getMessageMock).toBeCalledWith(expectedKey); }); it.each([ @@ -55,28 +54,13 @@ describe('createI18n', () => { expect(actual).toBe(expected); expect(getMessageMock).toBeCalledTimes(1); - expect(getMessageMock).toBeCalledWith(key, [String(count)], undefined); + expect(getMessageMock).toBeCalledWith(key, [String(count)]); }, ); it('should allow overriding the plural substitutions', () => { const i18n = createI18n(); i18n.t('key', 3, ['custom']); - expect(getMessageMock).toBeCalledWith('key', ['custom'], undefined); - }); - - it('should pass options into browser.i18n.getMessage', () => { - const i18n = createI18n(); - const options: GetMessageOptions = { - escapeLt: true, - }; - - i18n.t('key', options); - i18n.t('key', [''], options); - i18n.t('key', 1, options); - i18n.t('key', 1, [''], options); - getMessageMock.mock.calls.forEach((call) => { - expect(call.pop()).toEqual(options); - }); + expect(getMessageMock).toBeCalledWith('key', ['custom']); }); }); diff --git a/packages/i18n/src/__tests__/types.test.ts b/packages/i18n/src/__tests__/types.test.ts index be40b094..6c7999bc 100644 --- a/packages/i18n/src/__tests__/types.test.ts +++ b/packages/i18n/src/__tests__/types.test.ts @@ -22,13 +22,9 @@ describe('I18n Types', () => { describe('t', () => { it('should allow passing any combination of arguments', () => { i18n.t('any'); - i18n.t('any', { escapeLt: true }); i18n.t('any', ['one']); - i18n.t('any', ['one'], { escapeLt: true }); i18n.t('any', ['one', 'two']); - i18n.t('any', ['one', 'two'], { escapeLt: true }); i18n.t('any', n, ['one', 'two']); - i18n.t('any', n, ['one', 'two'], { escapeLt: true }); }); }); }); @@ -46,7 +42,6 @@ describe('I18n Types', () => { describe('t', () => { it('should only allow passing valid combinations of arguments', () => { i18n.t('simple'); - i18n.t('simple', { escapeLt: true }); // @ts-expect-error i18n.t('simple', []); // @ts-expect-error @@ -55,7 +50,6 @@ describe('I18n Types', () => { i18n.t('simple', n); i18n.t('simpleSub1', ['one']); - i18n.t('simpleSub1', ['one'], { escapeLt: true }); // @ts-expect-error i18n.t('simpleSub1'); // @ts-expect-error @@ -66,7 +60,6 @@ describe('I18n Types', () => { i18n.t('simpleSub1', n); i18n.t('simpleSub2', ['one', 'two']); - i18n.t('simpleSub2', ['one', 'two'], { escapeLt: true }); // @ts-expect-error i18n.t('simpleSub2'); // @ts-expect-error @@ -77,7 +70,6 @@ describe('I18n Types', () => { i18n.t('simpleSub2', n); i18n.t('plural', n); - i18n.t('plural', n, { escapeLt: true }); // @ts-expect-error i18n.t('plural'); // @ts-expect-error @@ -88,10 +80,8 @@ describe('I18n Types', () => { i18n.t('plural', n, ['sub']); i18n.t('pluralSub1', n); - i18n.t('pluralSub1', n, { escapeLt: true }); - i18n.t('pluralSub1', n, undefined, { escapeLt: true }); + i18n.t('pluralSub1', n, undefined); i18n.t('pluralSub1', n, ['one']); - i18n.t('pluralSub1', n, ['one'], { escapeLt: true }); // @ts-expect-error i18n.t('pluralSub1'); // @ts-expect-error @@ -102,7 +92,6 @@ describe('I18n Types', () => { i18n.t('pluralSub1', n, ['one', 'two']); i18n.t('pluralSub2', n, ['one', 'two']); - i18n.t('pluralSub2', n, ['one', 'two'], { escapeLt: true }); // @ts-expect-error i18n.t('pluralSub2'); // @ts-expect-error diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts index 2975efae..b5b01b9a 100644 --- a/packages/i18n/src/index.ts +++ b/packages/i18n/src/index.ts @@ -6,7 +6,6 @@ import { DefaultI18nStructure, I18n, Substitution, - GetMessageOptions, } from './types'; export function createI18n< @@ -16,7 +15,6 @@ export function createI18n< // Resolve args let sub: Substitution[] | undefined; let count: number | undefined; - let options: GetMessageOptions | undefined; args.forEach((arg, i) => { if (arg == null) { // ignore nullish args @@ -24,8 +22,6 @@ export function createI18n< count = arg; } else if (Array.isArray(arg)) { sub = arg; - } else if (typeof arg === 'object') { - options = arg; } else { throw Error( `Unknown argument at index ${i}. Must be a number for pluralization, substitution array, or options object.`, @@ -43,18 +39,9 @@ export function createI18n< if (sub?.length) { // Convert all substitutions to strings const stringSubs = sub?.map((sub) => String(sub)); - message = chrome.i18n.getMessage( - key.replaceAll('.', '_'), - stringSubs, - // @ts-ignore - @types/chrome doesn't type the options object, but it's there - options, - ); + message = chrome.i18n.getMessage(key.replaceAll('.', '_'), stringSubs); } else { - message = chrome.i18n.getMessage( - key.replaceAll('.', '_'), - // @ts-ignore - @types/chrome doesn't type the options object, but it's there - options, - ); + message = chrome.i18n.getMessage(key.replaceAll('.', '_')); } if (!message) { console.warn(`[i18n] Message not found: "${key}"`); diff --git a/packages/i18n/src/types.ts b/packages/i18n/src/types.ts index 28b9677b..d742c873 100644 --- a/packages/i18n/src/types.ts +++ b/packages/i18n/src/types.ts @@ -29,7 +29,6 @@ export type TFunction = { ( // prettier-ignore key: K & { [P in keyof T]: T[P] extends { plural: false; substitutions: 0 } ? P : never; }[keyof T], - options?: GetMessageOptions, ): string; // Non-plural with substitutions @@ -39,7 +38,6 @@ export type TFunction = { substitutions: T[K] extends I18nFeatures ? SubstitutionTuple : never, - options?: GetMessageOptions, ): string; // Plural with 1 substitution @@ -48,7 +46,6 @@ export type TFunction = { key: K & { [P in keyof T]: T[P] extends { plural: true; substitutions: 1 } ? P : never; }[keyof T], n: number, substitutions?: SubstitutionTuple<1>, - options?: GetMessageOptions, ): string; // Plural without substitutions @@ -56,7 +53,6 @@ export type TFunction = { // prettier-ignore key: K & { [P in keyof T]: T[P] extends { plural: true; substitutions: 0 | 1 } ? P : never; }[keyof T], n: number, - options?: GetMessageOptions, ): string; // Plural with substitutions @@ -67,7 +63,6 @@ export type TFunction = { substitutions: T[K] extends I18nFeatures ? SubstitutionTuple : never, - options?: GetMessageOptions, ): string; }; @@ -77,13 +72,4 @@ export interface I18n { export type Substitution = string | number; -export interface GetMessageOptions { - /** - * Escape `<` in translation to `<`. This applies only to the message itself, not to the placeholders. Developers might want to use this if the translation is used in an HTML context. Closure Templates used with Closure Compiler generate this automatically. - * - * See https://developer.chrome.com/docs/extensions/reference/api/i18n#type-getMessage-options - */ - escapeLt?: boolean; -} - type SubstitutionCount = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; From 1c3009a48f053a04f8e13a112fe7542e7fa7e47d Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 4 Oct 2024 23:12:34 +0000 Subject: [PATCH 34/62] chore(release): @wxt-dev/i18n v0.2.0 --- packages/i18n/CHANGELOG.md | 16 ++++++++++++++++ packages/i18n/package.json | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index 89b873d4..b9d20bea 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## v0.2.0 + +[⚠️ breaking changes](https://wxt.dev/guide/upgrade-guide/wxt) • [compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.1.1...i18n-v0.2.0) + +### 🩹 Fixes + +- ⚠️ Remove invalid options argument ([#1048](https://github.com/wxt-dev/wxt/pull/1048)) + +#### ⚠️ Breaking Changes + +- ⚠️ Remove invalid options argument ([#1048](https://github.com/wxt-dev/wxt/pull/1048)) + +### ❤️ Contributors + +- Aaron ([@aklinker1](http://github.com/aklinker1)) + ## v0.1.1 [compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.1.0...i18n-v0.1.1) diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 8ff5154a..6de879f3 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,7 +1,7 @@ { "name": "@wxt-dev/i18n", "description": "Type-safe wrapper around browser.i18n.getMessage with additional features", - "version": "0.1.1", + "version": "0.2.0", "type": "module", "repository": { "type": "git", From 10902351be459a79a78dde9ecb46155902b6c07a Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 4 Oct 2024 18:19:33 -0500 Subject: [PATCH 35/62] Fix changelog --- packages/i18n/CHANGELOG.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index b9d20bea..3927d50e 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -2,15 +2,18 @@ ## v0.2.0 -[⚠️ breaking changes](https://wxt.dev/guide/upgrade-guide/wxt) • [compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.1.1...i18n-v0.2.0) +[compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.1.1...i18n-v0.2.0) ### 🩹 Fixes - ⚠️ Remove invalid options argument ([#1048](https://github.com/wxt-dev/wxt/pull/1048)) -#### ⚠️ Breaking Changes +To upgrade, if you were passing a final `options` argument, remove it. If you used the third argument to escape `<` symbol... You'll need to do it yourself: -- ⚠️ Remove invalid options argument ([#1048](https://github.com/wxt-dev/wxt/pull/1048)) +```diff +- i18n.t("someKey", ["sub1"], { escapeLt: true }); ++ i18n.t("someKey", ["sub1"]).replaceAll("<", "<"); +``` ### ❤️ Contributors @@ -32,4 +35,4 @@ ### ❤️ Contributors - Windmillcode0 -- Aaron ([@aklinker1](http://github.com/aklinker1)) \ No newline at end of file +- Aaron ([@aklinker1](http://github.com/aklinker1)) From a0b63e73507c0465dddca3e97d9bd1d660a9dfb5 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 4 Oct 2024 18:20:46 -0500 Subject: [PATCH 36/62] ci: Add missing packages to sync-releases workflow --- .github/workflows/sync-releases.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/sync-releases.yml b/.github/workflows/sync-releases.yml index 09e302c8..4287f089 100644 --- a/.github/workflows/sync-releases.yml +++ b/.github/workflows/sync-releases.yml @@ -12,6 +12,8 @@ on: - module-vue - module-svelte - module-solid + - auto-icons + - i18n jobs: sync: From c2b151be11ba592814b353a57a20da927dc89c60 Mon Sep 17 00:00:00 2001 From: dsrrlldr Date: Sun, 6 Oct 2024 14:57:11 +0200 Subject: [PATCH 37/62] docs: Add "Habit Tracker" to homepage (#1054) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index be5a5615..908ee605 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -44,6 +44,7 @@ const chromeExtensionIds = [ 'opepfpjeogkbgeigkbepobceinnfmjdd', // Dofollow Links for SEO 'pdnenlnelpdomajfejgapbdpmjkfpjkp', // ChatGPT Writer: Use AI on Any Site (GPT-4o, Claude, Gemini, and More) 'jobnhifpphkgoelnhnopgkdhbdkiadmj', // discord message translator + 'ncokhechhpjgjonhjnlaneglmdkfkcbj', // Habit Tracker app widget for daily habit tracking ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 1f7ad781dffcc94c84818d2fe6d4fbda2caa26dc Mon Sep 17 00:00:00 2001 From: uncenter <47499684+uncenter@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:29:18 -0400 Subject: [PATCH 38/62] docs: Add "Catppuccin for GitHub File Explorer Icons" to homepage (#1060) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index 908ee605..a06e77e9 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -45,6 +45,7 @@ const chromeExtensionIds = [ 'pdnenlnelpdomajfejgapbdpmjkfpjkp', // ChatGPT Writer: Use AI on Any Site (GPT-4o, Claude, Gemini, and More) 'jobnhifpphkgoelnhnopgkdhbdkiadmj', // discord message translator 'ncokhechhpjgjonhjnlaneglmdkfkcbj', // Habit Tracker app widget for daily habit tracking + 'lnjaiaapbakfhlbjenjkhffcdpoompki', // Catppuccin for GitHub File Explorer Icons ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 8e527dc96b65a4eb4f6c6da5c42d236f46c9eb2a Mon Sep 17 00:00:00 2001 From: John Wu Date: Sat, 12 Oct 2024 02:39:07 +0800 Subject: [PATCH 39/62] docs: Add "WebChat" to homepage (#1061) Co-authored-by: Aaron --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index a06e77e9..41d31c50 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -46,6 +46,7 @@ const chromeExtensionIds = [ 'jobnhifpphkgoelnhnopgkdhbdkiadmj', // discord message translator 'ncokhechhpjgjonhjnlaneglmdkfkcbj', // Habit Tracker app widget for daily habit tracking 'lnjaiaapbakfhlbjenjkhffcdpoompki', // Catppuccin for GitHub File Explorer Icons + 'cpaedhbidlpnbdfegakhiamfpndhjpgf', // WebChat: Chat with anyone on any website ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 1b900e942b648c3adaa960edd9f5a63b47b42f4f Mon Sep 17 00:00:00 2001 From: Avi Date: Tue, 15 Oct 2024 00:14:28 +0300 Subject: [PATCH 40/62] Update UsingWxtSection.vue (#1063) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index 41d31c50..8a440b83 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -47,6 +47,7 @@ const chromeExtensionIds = [ 'ncokhechhpjgjonhjnlaneglmdkfkcbj', // Habit Tracker app widget for daily habit tracking 'lnjaiaapbakfhlbjenjkhffcdpoompki', // Catppuccin for GitHub File Explorer Icons 'cpaedhbidlpnbdfegakhiamfpndhjpgf', // WebChat: Chat with anyone on any website + 'fcphghnknhkimeagdglkljinmpbagone', // YouTube Auto HD + FPS ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 1fe01290c0a1e923e1acfbe1bf0205feff8f1e2c Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 18 Oct 2024 09:28:26 -0500 Subject: [PATCH 41/62] docs: Rewrite and restructure the documentation website (#933) Co-authored-by: aklinker1 --- README.md | 2 +- docs/.old/development.md | 116 ---- .../components/EntrypointPatterns.vue | 6 +- docs/.vitepress/config.ts | 175 +++--- docs/.vitepress/theme/custom.css | 17 - docs/.vitepress/utils/menus.ts | 43 +- docs/assets/init-demo.gif | Bin 139656 -> 140670 bytes docs/auto-icons.md | 1 + docs/get-started/assets.md | 33 -- docs/get-started/compare.md | 47 -- docs/get-started/configuration.md | 57 -- docs/get-started/entrypoints.md | 60 -- docs/get-started/installation.md | 120 ---- docs/get-started/introduction.md | 47 -- docs/guide/directory-structure/app-config.md | 61 -- docs/guide/directory-structure/assets.md | 42 -- docs/guide/directory-structure/components.md | 5 - docs/guide/directory-structure/composables.md | 5 - .../entrypoints/background.md | 47 -- .../entrypoints/bookmarks.md | 31 - .../entrypoints/content-scripts.md | 107 ---- .../directory-structure/entrypoints/css.md | 44 -- .../entrypoints/devtools.md | 40 -- .../entrypoints/history.md | 31 - .../directory-structure/entrypoints/newtab.md | 31 - .../entrypoints/options.md | 36 -- .../directory-structure/entrypoints/popup.md | 43 -- .../entrypoints/sandbox.md | 37 -- .../entrypoints/sidepanel.md | 49 -- .../entrypoints/unlisted-pages.md | 49 -- .../entrypoints/unlisted-scripts.md | 37 -- docs/guide/directory-structure/env.md | 5 - docs/guide/directory-structure/hooks.md | 5 - docs/guide/directory-structure/output.md | 5 - docs/guide/directory-structure/package.md | 5 - .../guide/directory-structure/public/index.md | 35 -- .../directory-structure/public/locales.md | 5 - docs/guide/directory-structure/tsconfig.md | 5 - docs/guide/directory-structure/utils.md | 5 - .../directory-structure/web-ext-config.md | 65 --- docs/guide/directory-structure/wxt-config.md | 5 - docs/guide/directory-structure/wxt.md | 5 - docs/guide/essentials/assets.md | 82 +++ docs/guide/essentials/config/auto-imports.md | 112 ++++ .../essentials/config/browser-startup.md | 85 +++ docs/guide/essentials/config/build-mode.md | 29 + .../essentials/config/entrypoint-loaders.md | 79 +++ .../config/environment-variables.md | 54 ++ docs/guide/essentials/config/hooks.md | 22 + docs/guide/essentials/config/manifest.md | 258 +++++++++ docs/guide/essentials/config/runtime.md | 56 ++ docs/guide/essentials/config/typescript.md | 65 +++ docs/guide/essentials/config/vite.md | 68 +++ .../content-scripts.md} | 235 +++++++- docs/guide/essentials/e2e-testing.md | 9 + docs/guide/essentials/entrypoints.md | 535 ++++++++++++++++++ docs/guide/essentials/es-modules.md | 38 ++ docs/guide/essentials/extension-apis.md | 92 +++ .../frontend-frameworks.md | 51 +- docs/guide/essentials/i18n.md | 86 +++ docs/guide/essentials/messaging.md | 16 + docs/guide/essentials/project-structure.md | 101 ++++ .../essentials}/publishing.md | 34 +- .../{go-further => essentials}/remote-code.md | 0 .../scripting.md | 8 +- docs/guide/essentials/storage.md | 15 + .../essentials/target-different-browsers.md | 69 +++ docs/guide/essentials/testing-updates.md | 28 + docs/guide/essentials/unit-testing.md | 80 +++ docs/guide/essentials/wxt-modules.md | 242 ++++++++ docs/guide/extension-apis/i18n.md | 56 -- docs/guide/extension-apis/messaging.md | 36 -- docs/guide/extension-apis/others.md | 5 - docs/guide/go-further/custom-events.md | 5 - docs/guide/go-further/debugging.md | 5 - docs/guide/go-further/entrypoint-loaders.md | 120 ---- docs/guide/go-further/es-modules.md | 40 -- docs/guide/go-further/handling-updates.md | 77 --- docs/guide/go-further/reusable-modules.md | 186 ------ docs/guide/go-further/testing.md | 27 - docs/guide/go-further/vite.md | 39 -- docs/guide/i18n/build-integrations.md | 82 --- docs/guide/i18n/editor-support.md | 48 -- docs/guide/i18n/installation.md | 81 --- docs/guide/i18n/introduction.md | 22 - docs/guide/i18n/messages-file-format.md | 170 ------ docs/guide/installation.md | 123 ++++ docs/guide/introduction.md | 26 + docs/guide/key-concepts/auto-imports.md | 117 ---- docs/guide/key-concepts/manifest.md | 249 -------- docs/guide/key-concepts/multiple-browsers.md | 133 ----- .../key-concepts/web-extension-polyfill.md | 108 ---- docs/guide/key-concepts/wxt-submit.md | 9 - docs/guide/resources/compare.md | 57 ++ docs/guide/resources/faq.md | 21 + .../how-wxt-works.md | 0 .../resources/migrate.md} | 41 +- .../wxt.md => resources/upgrading.md} | 29 +- docs/i18n.md | 5 + docs/index.md | 26 +- docs/public/_redirects | 69 +++ docs/{guide/extension-apis => }/storage.md | 31 +- packages/auto-icons/README.md | 2 + packages/i18n/README.md | 369 +++++++++++- packages/wxt/README.md | 2 +- packages/wxt/src/browser/chrome.ts | 2 + .../src/client/content-scripts/ui/index.ts | 6 +- packages/wxt/src/core/builders/vite/index.ts | 2 +- packages/wxt/src/core/generate-wxt-dir.ts | 2 +- packages/wxt/src/virtual/README.md | 2 +- 110 files changed, 3347 insertions(+), 3196 deletions(-) delete mode 100644 docs/.old/development.md create mode 100644 docs/auto-icons.md delete mode 100644 docs/get-started/assets.md delete mode 100644 docs/get-started/compare.md delete mode 100644 docs/get-started/configuration.md delete mode 100644 docs/get-started/entrypoints.md delete mode 100644 docs/get-started/installation.md delete mode 100644 docs/get-started/introduction.md delete mode 100644 docs/guide/directory-structure/app-config.md delete mode 100644 docs/guide/directory-structure/assets.md delete mode 100644 docs/guide/directory-structure/components.md delete mode 100644 docs/guide/directory-structure/composables.md delete mode 100644 docs/guide/directory-structure/entrypoints/background.md delete mode 100644 docs/guide/directory-structure/entrypoints/bookmarks.md delete mode 100644 docs/guide/directory-structure/entrypoints/content-scripts.md delete mode 100644 docs/guide/directory-structure/entrypoints/css.md delete mode 100644 docs/guide/directory-structure/entrypoints/devtools.md delete mode 100644 docs/guide/directory-structure/entrypoints/history.md delete mode 100644 docs/guide/directory-structure/entrypoints/newtab.md delete mode 100644 docs/guide/directory-structure/entrypoints/options.md delete mode 100644 docs/guide/directory-structure/entrypoints/popup.md delete mode 100644 docs/guide/directory-structure/entrypoints/sandbox.md delete mode 100644 docs/guide/directory-structure/entrypoints/sidepanel.md delete mode 100644 docs/guide/directory-structure/entrypoints/unlisted-pages.md delete mode 100644 docs/guide/directory-structure/entrypoints/unlisted-scripts.md delete mode 100644 docs/guide/directory-structure/env.md delete mode 100644 docs/guide/directory-structure/hooks.md delete mode 100644 docs/guide/directory-structure/output.md delete mode 100644 docs/guide/directory-structure/package.md delete mode 100644 docs/guide/directory-structure/public/index.md delete mode 100644 docs/guide/directory-structure/public/locales.md delete mode 100644 docs/guide/directory-structure/tsconfig.md delete mode 100644 docs/guide/directory-structure/utils.md delete mode 100644 docs/guide/directory-structure/web-ext-config.md delete mode 100644 docs/guide/directory-structure/wxt-config.md delete mode 100644 docs/guide/directory-structure/wxt.md create mode 100644 docs/guide/essentials/assets.md create mode 100644 docs/guide/essentials/config/auto-imports.md create mode 100644 docs/guide/essentials/config/browser-startup.md create mode 100644 docs/guide/essentials/config/build-mode.md create mode 100644 docs/guide/essentials/config/entrypoint-loaders.md create mode 100644 docs/guide/essentials/config/environment-variables.md create mode 100644 docs/guide/essentials/config/hooks.md create mode 100644 docs/guide/essentials/config/manifest.md create mode 100644 docs/guide/essentials/config/runtime.md create mode 100644 docs/guide/essentials/config/typescript.md create mode 100644 docs/guide/essentials/config/vite.md rename docs/guide/{key-concepts/content-script-ui.md => essentials/content-scripts.md} (58%) create mode 100644 docs/guide/essentials/e2e-testing.md create mode 100644 docs/guide/essentials/entrypoints.md create mode 100644 docs/guide/essentials/es-modules.md create mode 100644 docs/guide/essentials/extension-apis.md rename docs/guide/{key-concepts => essentials}/frontend-frameworks.md (56%) create mode 100644 docs/guide/essentials/i18n.md create mode 100644 docs/guide/essentials/messaging.md create mode 100644 docs/guide/essentials/project-structure.md rename docs/{get-started => guide/essentials}/publishing.md (84%) rename docs/guide/{go-further => essentials}/remote-code.md (100%) rename docs/guide/{extension-apis => essentials}/scripting.md (70%) create mode 100644 docs/guide/essentials/storage.md create mode 100644 docs/guide/essentials/target-different-browsers.md create mode 100644 docs/guide/essentials/testing-updates.md create mode 100644 docs/guide/essentials/unit-testing.md create mode 100644 docs/guide/essentials/wxt-modules.md delete mode 100644 docs/guide/extension-apis/i18n.md delete mode 100644 docs/guide/extension-apis/messaging.md delete mode 100644 docs/guide/extension-apis/others.md delete mode 100644 docs/guide/go-further/custom-events.md delete mode 100644 docs/guide/go-further/debugging.md delete mode 100644 docs/guide/go-further/entrypoint-loaders.md delete mode 100644 docs/guide/go-further/es-modules.md delete mode 100644 docs/guide/go-further/handling-updates.md delete mode 100644 docs/guide/go-further/reusable-modules.md delete mode 100644 docs/guide/go-further/testing.md delete mode 100644 docs/guide/go-further/vite.md delete mode 100644 docs/guide/i18n/build-integrations.md delete mode 100644 docs/guide/i18n/editor-support.md delete mode 100644 docs/guide/i18n/installation.md delete mode 100644 docs/guide/i18n/introduction.md delete mode 100644 docs/guide/i18n/messages-file-format.md create mode 100644 docs/guide/installation.md create mode 100644 docs/guide/introduction.md delete mode 100644 docs/guide/key-concepts/auto-imports.md delete mode 100644 docs/guide/key-concepts/manifest.md delete mode 100644 docs/guide/key-concepts/multiple-browsers.md delete mode 100644 docs/guide/key-concepts/web-extension-polyfill.md delete mode 100644 docs/guide/key-concepts/wxt-submit.md create mode 100644 docs/guide/resources/compare.md create mode 100644 docs/guide/resources/faq.md rename docs/guide/{go-further => resources}/how-wxt-works.md (100%) rename docs/{get-started/migrate-to-wxt.md => guide/resources/migrate.md} (67%) rename docs/guide/{upgrade-guide/wxt.md => resources/upgrading.md} (89%) create mode 100644 docs/i18n.md rename docs/{guide/extension-apis => }/storage.md (96%) diff --git a/README.md b/README.md index 3808327c..295b4d77 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Or see the [installation guide](https://wxt.dev/guide/installation.html) to get - 🦾 Auto-imports - 🤖 Automated publishing - 🎨 Frontend framework agnostic: works with Vue, React, Svelte, etc -- 📦 Modular architecture with [WXT modules](https://wxt.dev/guide/go-further/reusable-modules.html#overview) +- 📦 [Module system](https://wxt.dev/guide/essentials/wxt-modules.html#overview) for reusing code between extensions - 🖍️ Quickly bootstrap a new project - 📏 Bundle analysis - ⬇️ Download and bundle remote URL imports diff --git a/docs/.old/development.md b/docs/.old/development.md deleted file mode 100644 index 50098add..00000000 --- a/docs/.old/development.md +++ /dev/null @@ -1,116 +0,0 @@ -# Development - -WXT's main goal is providing the best DX it possibly can. When running your extension in dev mode, each part of your extension is reloaded separately when possible. - -| | HMR | Reloaded individually | Reload extension | Restart browser | -| ------------------- | :-: | :-------------------: | :--------------: | :----------------------------------------------------: | -| HTML File | | ✅ | -| HTML Dependency | ✅ | -| MV3 Content Script | | ✅ | -| MV2 Content Script | | | ✅ | -| Background | | | ✅ | -| manifest.json | | | | 🟡 See [#16](https://github.com/wxt-dev/wxt/issues/16) | -| `wxt.config.ts` | | | | 🟡 See [#10](https://github.com/wxt-dev/wxt/issues/10) | -| `web-ext.config.ts` | | | | 🟡 See [#10](https://github.com/wxt-dev/wxt/issues/10) | - -## Dev Mode vs Production Builds - -There are some notable differences between the development and production versions of an extension. During development: - -1. **Content scripts are not listed in the `manifest.json`** when targeting MV3. Instead, the [`scripting`](https://developer.chrome.com/docs/extensions/reference/api/scripting) permission is used to register content scripts at runtime so they can be reloaded individually. - - To get the list of content scripts during development, run the following in the background's console: - - ```ts - await chrome.scripting.getRegisteredContentScripts(); - ``` - -2. **The CSP is modified to allow loading scripts from the dev server**. Make sure you're using Chrome v110 or above for HMR to work. - -3. If you don't include a background script/service worker, one will be created to perform various tasks in dev mode, mostly related to reloading different parts of the extension on change. - -For production builds, none of the above modifications will be applied, and you're extension/manifest will only include what you have defined. - -## Configure Browser Startup - -WXT uses [`web-ext` by Mozilla](https://github.com/mozilla/web-ext) to automatically open a browser with the extension installed. You can configure the runner's behavior via the [`runner`](/api/reference/wxt/interfaces/InlineConfig#runner) option, or in a separate gitignored file, `web-ext.config.ts`. - -:::code-group - -```ts [wxt.config.ts] -import { defineConfig } from 'wxt'; - -export default defineConfig({ - runner: { - // Runner config - }, -}); -``` - -```ts [web-ext.config.ts] -import { defineRunnerConfig } from 'wxt'; - -export default defineRunnerConfig({ - // Runner config -}); -``` - -::: - -### Browser Binaries - -`web-ext`'s browser discovery is very limited. By default, it only guesses at where Chrome and Firefox are installed. If you've customized your install locations, you may need to tell `web-ext` where the binaries/executables are located using the [`binaries` option](/api/reference/wxt/interfaces/ExtensionRunnerConfig#binaries). For other Chromium based browsers, like Edge or Opera, you'll need to explicitly list them in the `binaries` option as well, otherwise they will open in Chrome by default. - -```ts -// ~/web-ext.config.ts -import { defineRunnerConfig } from 'wxt'; - -export default defineRunnerConfig({ - binaries: { - chrome: '/path/to/chrome-beta', // Use Chrome Beta instead of regular Chrome - firefox: 'firefoxdeveloperedition', // Use Firefox Developer Edition instead of regular Firefox - edge: '/path/to/edge', // Open MS Edge when running "wxt -b edge" - }, -}); -``` - -:::tip -When configuring browser binaries, it's helpful to put them in `~/web-ext.config.ts` instead of the project directory's `web-ext.config.ts` file. When placed in your home directory (`~/`), this config will be used by all WXT projects, so you only need to configure the binaries once. -::: - -### Other options - -You can customize other options as well, like startup URLs, profiles, or additional command line arguments: - -```ts -// web-ext.config.ts -import { defineRunnerConfig } from 'wxt'; - -export default defineRunnerConfig({ - startUrls: ['https://google.com', 'https://duckduckgo.com'], - chromiumProfile: '/path/to/profile/to/use', - chromiumArgs: ['--window-size=400,300'], -}); -``` - -For a full list of options, see the [API Reference](/api/reference/wxt/interfaces/ExtensionRunnerConfig). - -## Reload the Extension - -Normally, to manually reload an extension, you have to visit `chrome://extensions` and click the reload button for your extension. - -When running `wxt` command to start the dev server, WXT adds a keyboard shortcut `Alt+R`, that reloads the extension when pressed, without visiting `chrome://extensions`. This can also be customized or disabled: - -```ts [wxt.config.ts] -import { defineConfig } from 'wxt'; - -export default defineConfig({ - dev: { - reloadCommand: 'Alt+T', // false, to disable - }, -}); -``` - -:::info -This shortcut is only available during development, and is not be added to your extension when running `wxt build` or `wxt-zip`. -::: diff --git a/docs/.vitepress/components/EntrypointPatterns.vue b/docs/.vitepress/components/EntrypointPatterns.vue index 0600a066..8f73d7c2 100644 --- a/docs/.vitepress/components/EntrypointPatterns.vue +++ b/docs/.vitepress/components/EntrypointPatterns.vue @@ -8,14 +8,14 @@ const props = defineProps<{ - + - - diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 33a97536..87f398dc 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -8,6 +8,9 @@ import { prepareTypedocSidebar, } from './utils/menus'; import { meta, script } from './utils/head'; +import { version as wxtVersion } from '../../packages/wxt/package.json'; +import { version as i18nVersion } from '../../packages/i18n/package.json'; +import { version as autoIconsVersion } from '../../packages/auto-icons/package.json'; const title = 'Next-gen Web Extension Framework'; const titleSuffix = ' – WXT'; @@ -64,111 +67,93 @@ export default defineConfig({ ], nav: [ - navItem('Get Started', '/get-started/introduction'), - navItem('Guide', '/guide/key-concepts/manifest'), - navItem('API', '/api/reference/wxt'), + navItem('Guide', '/guide/installation'), navItem('Examples', '/examples'), + navItem('API', '/api/reference/wxt'), + navItem(`v${wxtVersion}`, [ + navItem('wxt', [ + navItem(`v${wxtVersion}`, '/'), + navItem( + `Changelog`, + 'https://github.com/wxt-dev/wxt/blob/main/packages/wxt/CHANGELOG.md', + ), + ]), + navItem('Other Packages', [ + navItem(`wxt/storage — ${wxtVersion}`, '/storage'), + navItem(`@wxt-dev/auto-icons — ${autoIconsVersion}`, '/auto-icons'), + navItem(`@wxt-dev/i18n — ${i18nVersion}`, '/i18n'), + ]), + ]), ], sidebar: { - '/get-started/': menuRoot([ - menuGroup('Get Started', '/get-started/', [ - menuItem('Introduction', 'introduction'), - menuItem('Installation', 'installation'), - menuItem('Configuration', 'configuration'), - menuItem('Entrypoints', 'entrypoints'), - menuItem('Assets', 'assets'), - menuItem('Publishing', 'publishing'), - menuItem('Migrate to WXT', 'migrate-to-wxt'), - menuItem('Compare', 'compare'), - ]), - ]), '/guide/': menuRoot([ - menuGroup('Key Concepts', '/guide/key-concepts/', [ - menuItem('Manifest', 'manifest'), - menuItem('Auto-imports', 'auto-imports'), - menuItem('Web Extension Polyfill', 'web-extension-polyfill'), - menuItem('Frontend Frameworks', 'frontend-frameworks'), - menuItem('Content Script UI', 'content-script-ui'), - ]), - menuGroup('Directory Structure', '/guide/directory-structure/', [ - // Folders - menuItem('.output/', 'output'), - menuItem('.wxt/', 'wxt'), - menuItem('assets/', 'assets'), - menuItem('components/', 'components'), - menuItem('composables/', 'composables'), - menuGroup('entrypoints/', '/guide/directory-structure/entrypoints/', [ - menuItem('background', 'background.md'), - menuItem('bookmarks', 'bookmarks.md'), - menuItem('*.content.ts', 'content-scripts.md'), - menuItem('*.css', 'css.md'), - menuItem('devtools', 'devtools.md'), - menuItem('history', 'history.md'), - menuItem('newtab', 'newtab.md'), - menuItem('options', 'options.md'), - menuItem('popup', 'popup.md'), - menuItem('sandbox', 'sandbox.md'), - menuItem('sidepanel', 'sidepanel.md'), - menuItem('*.html', 'unlisted-pages.md'), - menuItem('*.ts', 'unlisted-scripts.md'), - ]), - menuItem('hooks/', 'hooks'), - menuItem('public/', 'public/', [ - menuItem('_locales/', 'public/locales'), - ]), - menuItem('utils/', 'utils'), - - // Files - menuItem('.env', 'env'), - menuItem('app.config.ts', 'app-config'), - menuItem('package.json', 'package'), - menuItem('tsconfig.json', 'tsconfig'), - menuItem('web-ext.config.ts', 'web-ext-config'), - menuItem('wxt.config.ts', 'wxt-config'), - ]), - menuGroup('Extension APIs', '/guide/extension-apis/', [ - menuItem('Storage', 'storage'), - menuItem('Messaging', 'messaging'), - menuItem('I18n', 'i18n'), - menuItem('Scripting', 'scripting'), - menuItem('Others', 'others'), - ]), - menuGroup('Go Further', '/guide/go-further/', [ - menuItem('Testing', 'testing'), - menuItem('ES Modules', 'es-modules'), - menuItem('Debugging', 'debugging'), - menuItem('Handling Updates', 'handling-updates'), - menuItem('Vite', 'vite'), - menuItem('Custom Events', 'custom-events'), - menuItem('Reusable Modules', 'reusable-modules'), - menuItem('Remote Code', 'remote-code'), - menuItem('Entrypoint Loaders', 'entrypoint-loaders'), - menuItem('How WXT Works', 'how-wxt-works'), - ]), - menuGroup('Upgrade Guide', '/guide/upgrade-guide/', [ - menuItem('wxt', 'wxt'), - ]), - menuGroup('@wxt-dev/i18n', '/guide/i18n/', [ + menuGroup('Get Started', '/guide/', [ menuItem('Introduction', 'introduction.md'), menuItem('Installation', 'installation.md'), - menuItem('Messages File Format', 'messages-file-format.md'), - menuItem('Build Integrations', 'build-integrations.md'), - menuItem('Editor Support', 'editor-support.md'), + ]), + menuGroup('Essentials', '/guide/essentials/', [ + menuItem('Project Structure', 'project-structure.md'), + menuItem('Entrypoints', 'entrypoints.md'), + menuGroup( + 'Configuration', + '/guide/essentials/config/', + [ + menuItem('Manifest', 'manifest.md'), + menuItem('Browser Startup', 'browser-startup.md'), + menuItem('Auto-imports', 'auto-imports.md'), + menuItem('Environment Variables', 'environment-variables.md'), + menuItem('Runtime Config', 'runtime.md'), + menuItem('Vite', 'vite.md'), + menuItem('Build Mode', 'build-mode.md'), + menuItem('TypeScript', 'typescript.md'), + menuItem('Hooks', 'hooks.md'), + menuItem('Entrypoint Loaders', 'entrypoint-loaders.md'), + ], + true, + ), + menuItem('Extension APIs', 'extension-apis.md'), + menuItem('Assets', 'assets.md'), + menuItem('Target Different Browsers', 'target-different-browsers.md'), + menuItem('Content Scripts', 'content-scripts.md'), + menuItem('Storage', 'storage.md'), + menuItem('Messaging', 'messaging.md'), + menuItem('I18n', 'i18n.md'), + menuItem('Scripting', 'scripting.md'), + menuItem('WXT Modules', 'wxt-modules.md'), + menuItem('Frontend Frameworks', 'frontend-frameworks.md'), + menuItem('ES Modules', 'es-modules.md'), + menuItem('Remote Code', 'remote-code.md'), + menuItem('Unit Testing', 'unit-testing.md'), + menuItem('E2E Testing', 'e2e-testing.md'), + menuItem('Publishing', 'publishing.md'), + menuItem('Testing Updates', 'testing-updates.md'), + ]), + menuGroup('Resources', '/guide/resources/', [ + menuItem('Compare', 'compare.md'), + menuItem('FAQ', 'faq.md'), + menuItem('Upgrading WXT', 'upgrading.md'), + menuItem('Migrate to WXT', 'migrate.md'), + menuItem('How WXT Works', 'how-wxt-works.md'), ]), ]), '/api/': menuRoot([ - menuGroup('CLI', '/api/cli/', [ - menuItem('wxt', 'wxt.md'), - menuItem('wxt build', 'wxt-build.md'), - menuItem('wxt zip', 'wxt-zip.md'), - menuItem('wxt prepare', 'wxt-prepare.md'), - menuItem('wxt clean', 'wxt-clean.md'), - menuItem('wxt init', 'wxt-init.md'), - menuItem('wxt submit', 'wxt-submit.md'), - menuItem('wxt submit init', 'wxt-submit-init.md'), - ]), - menuGroup('API Reference', prepareTypedocSidebar(typedocSidebar)), + menuGroup( + 'CLI Reference', + '/api/cli/', + [ + menuItem('wxt', 'wxt.md'), + menuItem('wxt build', 'wxt-build.md'), + menuItem('wxt zip', 'wxt-zip.md'), + menuItem('wxt prepare', 'wxt-prepare.md'), + menuItem('wxt clean', 'wxt-clean.md'), + menuItem('wxt init', 'wxt-init.md'), + menuItem('wxt submit', 'wxt-submit.md'), + menuItem('wxt submit init', 'wxt-submit-init.md'), + ], + true, + ), + menuGroup('API Reference', prepareTypedocSidebar(typedocSidebar), true), ]), }, }, diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css index 1d249f5a..a7aa5980 100644 --- a/docs/.vitepress/theme/custom.css +++ b/docs/.vitepress/theme/custom.css @@ -85,23 +85,6 @@ body { user-select: none; } -.VPSidebarItem.level-0.collapsible { - padding-bottom: 0.5rem; -} - -.VPSidebarItem.level-0.collapsible .items { - /*border-left: 1px solid var(--vp-c-divider);*/ -} - -.VPSidebarItem.level-1 { - padding-left: 0.75rem; -} - -.VPSidebar .group + .group { - border-top: none; - padding-top: 0; -} - .VPSidebarItem .badge { display: inline-block; min-width: 1.6em; diff --git a/docs/.vitepress/utils/menus.ts b/docs/.vitepress/utils/menus.ts index aad00c56..8395cabb 100644 --- a/docs/.vitepress/utils/menus.ts +++ b/docs/.vitepress/utils/menus.ts @@ -2,9 +2,20 @@ import { DefaultTheme } from 'vitepress'; type SidebarItem = DefaultTheme.SidebarItem; type NavItem = DefaultTheme.NavItem; +type NavItemWithLink = DefaultTheme.NavItemWithLink; +type NavItemWithChildren = DefaultTheme.NavItemWithChildren; +type NavItemChildren = DefaultTheme.NavItemChildren; -export function navItem(text: string, link: string): NavItem { - return { text, link }; +export function navItem(text: string): NavItemChildren; +export function navItem(text: string, link: string): NavItemChildren; +export function navItem(text: string, items: any[]): NavItemWithChildren; +export function navItem(text: string, arg2?: unknown): any { + if (typeof arg2 === 'string') { + return { text, link: arg2 }; + } else if (Array.isArray(arg2)) { + return { text, items: arg2 }; + } + return { text }; } export function menuRoot(items: SidebarItem[]) { @@ -14,31 +25,39 @@ export function menuRoot(items: SidebarItem[]) { }); } -export function menuGroup(text: string, items: SidebarItem[]): SidebarItem; +export function menuGroup( + text: string, + items: SidebarItem[], + collapsable?: boolean, +): SidebarItem; export function menuGroup( text: string, base: string, items: SidebarItem[], + collapsable?: boolean, ): SidebarItem; export function menuGroup( text: string, a: string | SidebarItem[], - b?: SidebarItem[], + b?: SidebarItem[] | boolean, + c?: boolean, ): SidebarItem { - const collapsed = true; - if (typeof a === 'string') { + if (typeof a === 'string' && Array.isArray(b)) { return { text, base: a, items: b, - collapsed, + collapsed: c, }; } - return { - text, - items: a, - collapsed, - }; + if (typeof a !== 'string' && !Array.isArray(b)) + return { + text, + items: a, + collapsed: b, + }; + + throw Error('Unknown overload'); } export function menuItems(items: SidebarItem[]) { diff --git a/docs/assets/init-demo.gif b/docs/assets/init-demo.gif index 474db34c2e2bf5c7a3d456c330fddd6e33b41a1b..353c8b73aaa92ed97061b187bfbc35bca429b93f 100644 GIT binary patch delta 129730 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�vd046 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 @ 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 RFV1H)rAm$1_(~GcRAxrp3x` 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�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

P%+h6TR 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

PO= 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

dO@#QTs8+qdUo>M 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 diff --git a/docs/auto-icons.md b/docs/auto-icons.md new file mode 100644 index 00000000..474e842c --- /dev/null +++ b/docs/auto-icons.md @@ -0,0 +1 @@ + diff --git a/docs/get-started/assets.md b/docs/get-started/assets.md deleted file mode 100644 index f8ef639a..00000000 --- a/docs/get-started/assets.md +++ /dev/null @@ -1,33 +0,0 @@ -# Assets - -WXT has two directories for storing assets like CSS, images, or fonts. - -- [public directory](/guide/directory-structure/public/): Store files that will be copied into the output directory as-is -- [assets directory](/guide/directory-structure/assets): Store files that will be processed by Vite during the build process - -To learn more about how to use assets at runtime from either of these directories, visit their guides linked above. - -## Public Directory - -Place static files like the extension icon or `_locales/` directory here. These files will be copied over to the output directory without being transformed by Vite. - -``` - -└─ public/ - ├─ icon-16.png - ├─ icon-32.png - ├─ icon-48.png - ├─ icon-96.png - └─ icon-128.png -``` - -## Assets Directory - -Files in the assets directory will be processed by Vite. They are imported in your source code, and will be transformed or renamed in the output directory. - -``` - -└─ assets/ - ├─ tailwind.css - └─ illustration.svg -``` diff --git a/docs/get-started/compare.md b/docs/get-started/compare.md deleted file mode 100644 index 37e9e9ea..00000000 --- a/docs/get-started/compare.md +++ /dev/null @@ -1,47 +0,0 @@ -# Compare - -Lets compare the features of WXT vs [Plasmo](https://docs.plasmo.com/framework) (another framework) and [CRXJS](https://crxjs.dev/vite-plugin) (a bundler plugin). - -## Overview - -| Features | WXT | Plasmo | CRXJS | -| ---------------------------------------------------- | :--------------: | :-------------: | :--------------: | -| Supports all browsers | ✅ | ✅ | 🟡 10 | -| MV2 Support | ✅ | ✅ | 🟡 1 | -| MV3 Support | ✅ | ✅ | 🟡 1 | -| Create Extension ZIPs | ✅ | ✅ | ❌ | -| Create Firefox Sources ZIP | ✅ | ❌ | ❌ | -| First-class TypeScript support | ✅ | ✅ | ✅ | -| Entrypoint discovery | ✅ 2 | ✅ 2 | ❌ | -| Inline entrypoint config | ✅ | ✅ | ❌ 9 | -| Auto-imports | ✅ | ❌ | ❌ | -| Supports all frontend frameworks | ✅ | 🟡 3 | ✅ | -| Framework specific entrypoints (like `Popup.tsx`) | 🟡 4 | ✅ 5 | ❌ | -| Automated publishing | ✅ | ✅ | ❌ | -| Remote Code Bundling (Google Analytics) | ✅ | ✅ | ❌ | -| Dev Mode | | | -| `.env` Files | ✅ | ✅ | ✅ | -| Opens browser with extension installed | ✅ | ❌ | ❌ | -| HMR for UIs | ✅ | 🟡 6 | ✅ | -| Reload HTML Files on Change | ✅ | 🟡 7 | ✅ | -| Reload Content Scripts on Change | ✅ | 🟡 7 | ✅ | -| Reload Background on Change | 🟡 7 | 🟡 7 | 🟡 7 | -| Respects Content Script `run_at` | ✅ | ✅ | ❌ 8 | -| Built-in Utils | | | | -| Storage | ✅ | ✅ | ❌ 11 | -| Messaging | ❌ 11 | ✅ | ❌ 11 | -| Content Script UI | ✅ | ✅ | ❌ 11 | - - - 1: Either MV2 or MV3, not both. -
2: File based. -
3: Only React, Vue, and Svelte. -
4: .html .ts .tsx. -
5: .html .ts .tsx. .vue .svelte. -
6: React only. -
7: Reloads entire extension. -
8: ESM-style loaders run asynchronously. -
9: Entrypoint options all configured in `manifest.json`. -
10: As of v2.0.0-beta.23, but v2 stable hasn't been released yet. -
11: There is no built-in wrapper around this API. However, you can still access the standard APIs via chrome/browser globals or use any 3rd party NPM package. -
diff --git a/docs/get-started/configuration.md b/docs/get-started/configuration.md deleted file mode 100644 index 04cb62ef..00000000 --- a/docs/get-started/configuration.md +++ /dev/null @@ -1,57 +0,0 @@ -# Configuration - -By default, WXT provides sensible configuration for bundling web extensions with Vite. - -## Config File - -To configure WXT, create a `wxt.config.ts` file in your project root. It should have the following contents: - -```ts -import { defineConfig } from 'wxt'; - -export default defineConfig({ - // My WXT config -}); -``` - -:::info -For more information on configuring WXT via the `wxt.config.ts` file, read the dedicated [`wxt.config.ts` guide](/guide/directory-structure/wxt-config). -::: - -## Manifest.json - -WXT generates your extension's `manifest.json` based on the project structure. To add additional properties, like permissions, use the [`manifest` property](/api/reference/wxt/interfaces/InlineConfig#manifest). - -```ts -import { defineConfig } from 'wxt'; - -export default defineConfig({ - manifest: { - permissions: ['storage'], - }, -}); -``` - -:::info -For more information on configuring the manifest, read the dedicated [Manifest guide](/guide/key-concepts/manifest). -::: - -## Environment - -WXT can read `.env` files, and variables are accessible via `import.meta.env.*`. - -:::code-group - -```sh [.env] -VITE_OAUTH_CLIENT_ID=abc123 -``` - -```ts [JS] -import.meta.env.VITE_OAUTH_CLIENT_ID; -``` - -::: - -:::info -For more information on using .env files, read the dedicated [`.env` guide](/guide/directory-structure/env). -::: diff --git a/docs/get-started/entrypoints.md b/docs/get-started/entrypoints.md deleted file mode 100644 index 65b7bf08..00000000 --- a/docs/get-started/entrypoints.md +++ /dev/null @@ -1,60 +0,0 @@ -# Entrypoints - -An "entrypoint" is any HTML, JS, or CSS file that needs to be bundled and included with your extension, which will be loaded and executed by the browser. - -## Defining Entrypoints - -In WXT, you create an entrypoint by adding a file to the `entrypoints/` directory. - -``` - -└─ entrypoints/ - ├─ background.ts - ├─ content.ts - ├─ injected.ts - └─ popup.html -``` - -Some entrypoint filesname patterns are reserved by WXT and effect how the manifest is generated. - -- `popup` adds an `action` to the manifest -- `background` adds a background script/service worker -- `*.content.ts` adds a content script -- ... - -> For a full list of recognized filenames, see the the [Entrypoints Directory guide](/guide/directory-structure/entrypoints/background). - -Any other files, whether JS, CSS, or HTML, is considered "unlisted". Unlisted files, like `injected.ts` from above, are just bundled to the output directory and not added to the manifest. You can still access or load them at runtime. - -## Entrypoint Options - -Most entrypoints allow customizing their options in the file you define them in. This differs from regular web extension development, where all options are placed in the `manifest.json`. - -WXT looks for custom options in the entrypoint, and adds them to the manifest when generated. - -In HTML files, options are listed as `meta` tags: - -```html - - - - - - -``` - -In TS files, options are apart of the file's default export: - -```ts -export default defineContentScript({ - matches: ['*://*.google.com/*'], - runAt: 'document_start', - main() { - // ... - }, -}); -``` - -:::info -All options for each entrypoint type is listed in the [entrypoints directory docs](/guide/directory-structure/entrypoints/background). -::: diff --git a/docs/get-started/installation.md b/docs/get-started/installation.md deleted file mode 100644 index 7bf4765c..00000000 --- a/docs/get-started/installation.md +++ /dev/null @@ -1,120 +0,0 @@ -# Installation - -Bootstrap a new project, start from scratch, or [migrate an existing project](/get-started/migrate-to-wxt). - -## Bootstrap Project - -:::code-group - -```sh [pnpm] -pnpm dlx wxt@latest init -``` - -```sh [npm] -npx wxt@latest init -``` - -```sh [bun] -# The "wxt init" command currently fails when ran with bunx. -# Use NPX as a workaround, and select "bun" as your package -# manager. To stay up to date with this issue, follow -# https://github.com/wxt-dev/wxt/issues/707 -# -# bunx wxt@latest init - -npx wxt@latest init -``` - -### Demo - -![wxt init demo](/assets/init-demo.gif) - -::: - -There are several starting templates available. - -| TypeScript | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [`vanilla`](https://github.com/wxt-dev/wxt/tree/main/templates/vanilla) | -| [`vue`](https://github.com/wxt-dev/wxt/tree/main/templates/vue) | -| [`react`](https://github.com/wxt-dev/wxt/tree/main/templates/react) | -| [`svelte`](https://github.com/wxt-dev/wxt/tree/main/templates/svelte) | -| [`solid`](https://github.com/wxt-dev/wxt/tree/main/templates/solid) | - -:::info -All templates default to TypeScript. Rename the file extensions to `.js` to use JavaScript instead. -::: - -## From Scratch - -Initialize a project and install `wxt`: - -:::code-group - -```sh [pnpm] -pnpm init -pnpm add -D wxt -``` - -```sh [npm] -npm init -npm i --save-dev wxt -``` - -```sh [yarn] -yarn init -yarn add --dev wxt -``` - -```sh [bun] -bun init -bun add --dev wxt -``` - -::: - -Add your first entrypoint: - -```ts -// entrypoints/background.ts -export default defineBackground(() => { - console.log(`Hello from ${browser.runtime.id}!`); -}); -``` - -And add scripts to your `package.json`: - -```json -{ - "scripts": { - "dev": "wxt", // [!code ++] - "dev:firefox": "wxt --browser firefox", // [!code ++] - "build": "wxt build", // [!code ++] - "build:firefox": "wxt build --browser firefox", // [!code ++] - "zip": "wxt zip", // [!code ++] - "zip:firefox": "wxt zip --browser firefox", // [!code ++] - "postinstall": "wxt prepare" // [!code ++] - } -} -``` - -## Development - -Once the project is setup, you can start the development server using the `dev` script. - -```sh -pnpm dev -``` - -:::tip 🎉 Well done! -The dev command will build the extension for development, open the browser, and reload the different parts of the extension when you save changes. -::: - -## Next Steps - -You're ready to build your web extension! - -- Read the rest of the "Get Started" pages for a high-overview of what WXT can do -- Read the [Guide](/guide/key-concepts/manifest) to learn in-depth about each feature WXT supports -- [Configure WXT](./configuration) by creating a `wxt.config.ts` file -- Checkout [example projects](https://github.com/wxt-dev/examples) to see how to perform common tasks with WXT diff --git a/docs/get-started/introduction.md b/docs/get-started/introduction.md deleted file mode 100644 index 1a66b8c6..00000000 --- a/docs/get-started/introduction.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -head: - - - link - - rel: canonical - href: https://wxt.dev ---- - -# Introduction - -## Overview - -WXT is a free and open source framework for building web extensions in a conventional, intuitive, and safe way **_for all browsers_**. - -WXT is based on [Nuxt](https://nuxt.com), and aims to provide the same great DX with TypeScript, auto-imports, and an opinionated project structure. - -![Example build output](../assets/cli-output.png) - -## Conventions - -WXT is an opinionated framework. This helps keep projects consistent and easy to pick up. - -- **Generated manifest**: Based on your project's file structure -- **Entrypoint configuration**: Configure entrypoints from the same file they're declare in -- **Type-safety is a priority**: Out-of-the-box TypeScript support with improved browser API typing -- **Simple output file structure**: Output file paths minimize the path at runtime - -## Development - -WXT's dev server supports modern features like HMR to provide a lighting fast dev mode. - -When changes can't be hot-reloaded, like content scripts or background scripts, they're reloaded individually to prevent reloading the entire extension and slowing down your development cycle. - -## Production-ready - -Production builds are optimized for store review, changing as few files as possible between builds. - -In addition, WXT fully supports Firefox's source code requirements when using a bundler. It will automatically create and upload a ZIP file of your source code. - -:::info -See [Publishing](./publishing) for more info around production builds. -::: - -## New to Extension Development? - -Most of these docs assume you have a basic understanding of how to write a chrome or web extension. - -If you've never written a web extension before or need a refresher, follow Google's ["Hello, World!" tutorial](https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world) to understand the basics. diff --git a/docs/guide/directory-structure/app-config.md b/docs/guide/directory-structure/app-config.md deleted file mode 100644 index e5c2582c..00000000 --- a/docs/guide/directory-structure/app-config.md +++ /dev/null @@ -1,61 +0,0 @@ -# `/app.config.ts` - -:::warning Nuxt Users -If you're familiar with Nuxt, this file is meant to be a direct equivalent to Nuxt's `app.config.ts` file. - -However, some of Nuxt's features, like overriding the app config based on a `.env` file or automatically generating the config's types, are not implemented. They are planned, just not implemented yet. Feel free to open a PR! -::: - -## Overview - -Define runtime configuration in a single place. - -```ts -// /app.config.ts -import { defineAppConfig } from 'wxt/sandbox'; - -// Define types for your config -declare module 'wxt/sandbox' { - export interface WxtAppConfig { - theme?: 'light' | 'dark'; - } -} - -export default defineAppConfig({ - theme: 'dark', -}); -``` - -Then access the config in your extension by calling `useAppConfig`: - -```ts -console.log(useAppConfig()); // { theme: "dark" } -``` - -## Environment Variables - -If you have a `.env` file, you can access any variables defined in it here. You can convert them to better types (like booleans), add types for them, or leave them as is. - -```txt -# .env -VITE_BUG_REPORTING_DISABLED=true -VITE_API_KEY=... -``` - -```ts -// /app.config.ts - -declare module 'wxt/sandbox' { - export interface WxtAppConfig { - bugReportingDisabled: boolean; - apiKey?: string; - } -} - -export default defineAppConfig({ - bugReportingDisabled: import.meta.env.VITE_BUG_REPORTING_DISABLED === 'true', - apiKey: import.meta.env.VITE_API_KEY, -}); -``` - -> You don't have to do this, you can use `import.meta.env.VITE_*` anywhere in your runtime code, but putting them here consolidates them to one place and defines what variables are expected. diff --git a/docs/guide/directory-structure/assets.md b/docs/guide/directory-structure/assets.md deleted file mode 100644 index f28bac1a..00000000 --- a/docs/guide/directory-structure/assets.md +++ /dev/null @@ -1,42 +0,0 @@ -# `/assets` - -Files in the assets directory will be processed by Vite. They are imported in your source code, and will be transformed or renamed in the output directory. - -``` - -└─ assets/ - ├─ style.css - └─ illustration.svg -``` - -### Example - -:::code-group - -```html [popup.html] - - - - - - - - - - -``` - -```ts [content.ts] -import '~/assets/style.css'; -import illustration from '~/assets/style.svg'; - -defineContentScript({ - main() { - const image = document.createElement('img'); - image.src = illustration; - document.body.append(image); - }, -}); -``` - -::: diff --git a/docs/guide/directory-structure/components.md b/docs/guide/directory-structure/components.md deleted file mode 100644 index 0bb2f0b2..00000000 --- a/docs/guide/directory-structure/components.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/components` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/composables.md b/docs/guide/directory-structure/composables.md deleted file mode 100644 index c1ada3ec..00000000 --- a/docs/guide/directory-structure/composables.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/composables` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/entrypoints/background.md b/docs/guide/directory-structure/entrypoints/background.md deleted file mode 100644 index b5df3dd9..00000000 --- a/docs/guide/directory-structure/entrypoints/background.md +++ /dev/null @@ -1,47 +0,0 @@ -# Background - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/manifest/background/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/background) - -For MV2, the background is added as a script to the background page. For MV3, the background becomes a service worker. - -## Filenames - - - -## Definition - -:::warning -The main function of the background **_CANNOT BE ASYNC_**. Event listeners must be added synchronously on background startup. If your main function returns a promise, WXT will log an error. -::: - -```ts -export default defineBackground(() => { - // Executed when background is loaded -}); -``` - -or - -```ts -export default defineBackground({ - // Set manifest options - persistent: undefined | true | false, - type: undefined | 'module', - - // Set include/exclude if the background should be removed from some builds - include: undefined | string[], - exclude: undefined | string[], - - // Executed when background is loaded - main() { - // ... - }, -}); -``` - -> All manifest options default to `undefined`. diff --git a/docs/guide/directory-structure/entrypoints/bookmarks.md b/docs/guide/directory-structure/entrypoints/bookmarks.md deleted file mode 100644 index 10434f3c..00000000 --- a/docs/guide/directory-structure/entrypoints/bookmarks.md +++ /dev/null @@ -1,31 +0,0 @@ -# Bookmarks - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/override/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/chrome_url_overrides) - -## Filenames - - - -## Definition - -```html - - - - - - Title - - - - - - - - -``` diff --git a/docs/guide/directory-structure/entrypoints/content-scripts.md b/docs/guide/directory-structure/entrypoints/content-scripts.md deleted file mode 100644 index 5ad58331..00000000 --- a/docs/guide/directory-structure/entrypoints/content-scripts.md +++ /dev/null @@ -1,107 +0,0 @@ -# Content Scripts - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts) - -When creating content script entrypoints, they are automatically included in the `manifest.json` along with any CSS files they import. - -## Filenames - - - -## Definition - -```ts -export default defineContentScript({ - // Set manifest options - matches: string[], - excludeMatches: undefined | [], - includeGlobs: undefined | [], - excludeGlobs: undefined | [], - allFrames: undefined | true | false, - runAt: undefined | 'document_start' | 'document_end' | 'document_idle', - matchAboutBlank: undefined | true | false, - matchOriginAsFallback: undefined | true | false, - world: undefined | 'ISOLATED' | 'MAIN', - - // Set include/exclude if the background should be removed from some builds - include: undefined | string[], - exclude: undefined | string[], - - // Configure how CSS is injected onto the page - cssInjectionMode: undefined | "manifest" | "manual" | "ui", - - // Configure how/when content script will be registered - registration: undefined | "manifest" | "runtime", - - main(ctx: ContentScriptContext) { - // Executed when content script is loaded - }, -}); -``` - -> All manifest options default to `undefined`. - -When defining multiple content scripts, content script entrypoints that have the same set of options will be merged into a single `content_script` item in the manifest. - -## CSS - -To include CSS with your content script, import the CSS file at the top of your entrypoint. - -``` - -/ -└─ entrypoints/ - └─ overlay.content/ - ├─ index.ts - └─ style.css -``` - -```ts -// entrypoints/overlay.content/index.ts -import './style.css'; - -export default defineContentScript({ - matches: ['*://google.com/*', '*://duckduckgo.com/*'], - - main(ctx) { - // ... - }, -}); -``` - -Any styles imported in your content script will be added to that content script's `css` array in your `manifest.json`: - -```json -// .output/chrome-mv3/manifest.json -{ - "content_scripts": [ - { - "matches": ["*://google.com/*", "*://duckduckgo.com/*"], - "js": ["content-scripts/overlay.js"], - "css": ["content-scripts/overlay.css"] - } - ] -} -``` - -To disable this behavior, set `cssInjectionMode` to `"manual"` or `"ui"`. - -```ts -export default defineContentScript({ - matches: ['*://google.com/*', '*://duckduckgo.com/*'], - cssInjectionMode: 'manual', - - main(ctx) { - // ... - }, -}); -``` - -See [Content Script UI](/guide/key-concepts/content-script-ui) for more info on creating UIs and including CSS in content scripts. diff --git a/docs/guide/directory-structure/entrypoints/css.md b/docs/guide/directory-structure/entrypoints/css.md deleted file mode 100644 index 0e38c46c..00000000 --- a/docs/guide/directory-structure/entrypoints/css.md +++ /dev/null @@ -1,44 +0,0 @@ -# CSS - -WXT can build CSS entrypoints individually. CSS entrypoints are always unlisted. - -See [Content Script CSS](/guide/directory-structure/entrypoints/content-scripts#css) documentation for the recommended approach to include CSS with a content script. - -:::info -If the recommended approach doesn't work for your use case, you can use any of the filename patterns below to build the styles separate from the JS and use the [`transformManifest` hook](/api/reference/wxt/interfaces/InlineConfig#transformmanifest) to manually add your CSS file to the manifest. -::: - -## Filenames - - - -## Definition - -```css -body { - /* Plain CSS file */ -} -``` - -Follow Vite's guide to setup a preprocessor: https://vitejs.dev/guide/features.html#css-pre-processors - -```sh -pnpm i sass -``` - -```scss -body { - h1 { - /* ...*/ - } -} -``` diff --git a/docs/guide/directory-structure/entrypoints/devtools.md b/docs/guide/directory-structure/entrypoints/devtools.md deleted file mode 100644 index da3cda04..00000000 --- a/docs/guide/directory-structure/entrypoints/devtools.md +++ /dev/null @@ -1,40 +0,0 @@ -# Devtools - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/devtools/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/devtools_page) - -## Filenames - - - -## Definition - -```html - - - - - - - - - - - - - -``` - -## Adding UI Elements - -Chrome extensions allow you to add panels and side panes to the devtools window. - -![DevTools window showing Elements panel and Styles sidebar pane.](https://developer.chrome.com/static/docs/extensions/how-to/devtools/extend-devtools/image/devtools-window-showing-e-9051f7f0347cd_1920.png) - -See the WXT's examples for a full walkthrough of extending the devtools window: - -- [Devtools Setup](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vanilla-devtools#readme) diff --git a/docs/guide/directory-structure/entrypoints/history.md b/docs/guide/directory-structure/entrypoints/history.md deleted file mode 100644 index 9fc11a1b..00000000 --- a/docs/guide/directory-structure/entrypoints/history.md +++ /dev/null @@ -1,31 +0,0 @@ -# History - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/override/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/chrome_url_overrides) - -## Filenames - - - -## Definition - -```html - - - - - - Title - - - - - - - - -``` diff --git a/docs/guide/directory-structure/entrypoints/newtab.md b/docs/guide/directory-structure/entrypoints/newtab.md deleted file mode 100644 index e15dcb2b..00000000 --- a/docs/guide/directory-structure/entrypoints/newtab.md +++ /dev/null @@ -1,31 +0,0 @@ -# Newtab - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/override/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/chrome_url_overrides) - -## Filenames - - - -## Definition - -```html - - - - - - Title - - - - - - - - -``` diff --git a/docs/guide/directory-structure/entrypoints/options.md b/docs/guide/directory-structure/entrypoints/options.md deleted file mode 100644 index f4af0271..00000000 --- a/docs/guide/directory-structure/entrypoints/options.md +++ /dev/null @@ -1,36 +0,0 @@ -# Options - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/options/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/options_ui) - -## Filenames - - - -## Definition - -```html - - - - - - Options Title - - - - - - - - - - - -``` - -> All manifest options default to `undefined` when the `meta` tag is not present. diff --git a/docs/guide/directory-structure/entrypoints/popup.md b/docs/guide/directory-structure/entrypoints/popup.md deleted file mode 100644 index 536742e4..00000000 --- a/docs/guide/directory-structure/entrypoints/popup.md +++ /dev/null @@ -1,43 +0,0 @@ -# Popup - -[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/action/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/action) - -## Filenames - - - -## Definition - -```html - - - - - - Default Popup Title - - - - - - - - - - - -``` - -> All manifest options default to `undefined` when the `meta` tag is not present. diff --git a/docs/guide/directory-structure/entrypoints/sandbox.md b/docs/guide/directory-structure/entrypoints/sandbox.md deleted file mode 100644 index 886c64dc..00000000 --- a/docs/guide/directory-structure/entrypoints/sandbox.md +++ /dev/null @@ -1,37 +0,0 @@ -# Sandbox - -[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/manifest/sandbox/) - -:::tip Chromium Only -Firefox does not support sandboxed pages. -::: - -## Filenames - - - -## Definition - -```html - - - - - - Title - - - - - - - - -``` diff --git a/docs/guide/directory-structure/entrypoints/sidepanel.md b/docs/guide/directory-structure/entrypoints/sidepanel.md deleted file mode 100644 index 8e61a07c..00000000 --- a/docs/guide/directory-structure/entrypoints/sidepanel.md +++ /dev/null @@ -1,49 +0,0 @@ -# Side Panel - -[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/sidePanel/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/user_interface/Sidebars) - -In Chrome, side panels use the "side_panel" API, while Firefox uses the "sidebar_action" API. - -:::warning -Chrome added support for sidepanels in Manifest V3, they are not available in Manifest V2. -::: - -## Filenames - - - -## Definition - -```html - - - - - - Default Side Panel Title - - - - - - - - - - - -``` diff --git a/docs/guide/directory-structure/entrypoints/unlisted-pages.md b/docs/guide/directory-structure/entrypoints/unlisted-pages.md deleted file mode 100644 index c9812e99..00000000 --- a/docs/guide/directory-structure/entrypoints/unlisted-pages.md +++ /dev/null @@ -1,49 +0,0 @@ -# Unlisted Pages - -HTML pages that are bundled and shipped with the extension, but are not included in the manifest. - -If you plan on using the page in an iframe, don't forget to add the page to [`web_accessible_resources`](https://developer.chrome.com/docs/extensions/reference/manifest/web-accessible-resources). - -### Examples - -- Onboarding -- Dashboard -- FAQ -- Help -- Changelog - -## Filenames - - - -Pages are accessible at `'/.html'`: - -```ts -const url = browser.runtime.getURL('/.html', ''); - -console.log(url); // "chrome-extension:///.html" -``` - -## Definition - -```html - - - - - - Title - - - - - - - - -``` diff --git a/docs/guide/directory-structure/entrypoints/unlisted-scripts.md b/docs/guide/directory-structure/entrypoints/unlisted-scripts.md deleted file mode 100644 index 89a2da53..00000000 --- a/docs/guide/directory-structure/entrypoints/unlisted-scripts.md +++ /dev/null @@ -1,37 +0,0 @@ -# Unlisted Scripts - -TypeScript files that are bundled and shipped with the extension, but are not included in the manifest. - -You are responsible for loading/running these scripts where needed. If necessary, don't forget to add the script and/or any related stylesheets to [`web_accessible_resources`](https://developer.chrome.com/docs/extensions/reference/manifest/web-accessible-resources). - -## Filenames - - - -## Definition - -```ts -export default defineUnlistedScript(() => { - // Executed when script is loaded -}); -``` - -or - -```ts -export default defineUnlistedScript({ - // Set include/exclude if the script should be removed from some builds - include: undefined | string[], - exclude: undefined | string[], - - // Executed when script is loaded - main() { - // ... - }, -}); -``` diff --git a/docs/guide/directory-structure/env.md b/docs/guide/directory-structure/env.md deleted file mode 100644 index 6a17fbce..00000000 --- a/docs/guide/directory-structure/env.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/.env` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/hooks.md b/docs/guide/directory-structure/hooks.md deleted file mode 100644 index e6e19836..00000000 --- a/docs/guide/directory-structure/hooks.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/hooks` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/output.md b/docs/guide/directory-structure/output.md deleted file mode 100644 index bb5ef417..00000000 --- a/docs/guide/directory-structure/output.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/.output` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/package.md b/docs/guide/directory-structure/package.md deleted file mode 100644 index 79f23b57..00000000 --- a/docs/guide/directory-structure/package.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/package.json` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/public/index.md b/docs/guide/directory-structure/public/index.md deleted file mode 100644 index 765e1a44..00000000 --- a/docs/guide/directory-structure/public/index.md +++ /dev/null @@ -1,35 +0,0 @@ -# `public/` - -Place static files like the extension icon or `_locales/` directory here. These files will be copied over to the output directory without being transformed by Vite. - -``` - -└─ public/ - ├─ icon-16.png - ├─ icon-32.png - ├─ icon-48.png - ├─ icon-96.png - └─ icon-128.png -``` - -### Example - -You can reference these files by using absolute paths in HTML files or `browser.runtime.getURL` in content scripts. - -:::code-group - -```html [popup.html] - -``` - -```ts [content.ts] -defineContentScript({ - main() { - const image = document.createElement('img'); - image.src = browser.runtime.getURL('/icon-128.png'); - document.body.append(image); - }, -}); -``` - -::: diff --git a/docs/guide/directory-structure/public/locales.md b/docs/guide/directory-structure/public/locales.md deleted file mode 100644 index 36a57303..00000000 --- a/docs/guide/directory-structure/public/locales.md +++ /dev/null @@ -1,5 +0,0 @@ -# `public/_locales/` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/tsconfig.md b/docs/guide/directory-structure/tsconfig.md deleted file mode 100644 index 81220e42..00000000 --- a/docs/guide/directory-structure/tsconfig.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/tsconfig.json` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/utils.md b/docs/guide/directory-structure/utils.md deleted file mode 100644 index 54cd86e5..00000000 --- a/docs/guide/directory-structure/utils.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/utils` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/web-ext-config.md b/docs/guide/directory-structure/web-ext-config.md deleted file mode 100644 index 88b33744..00000000 --- a/docs/guide/directory-structure/web-ext-config.md +++ /dev/null @@ -1,65 +0,0 @@ -# `web-ext.config.ts` - -This file lets you configure the browser startup when running `wxt dev`. - -```ts -import { defineRunnerConfig } from 'wxt'; - -export default defineRunnerConfig({ - startUrls: ['https://google.com', 'https://youtube.com'], -}); -``` - -There are three places you can customize the runner: - -- `/wxt.config.ts` - Use the `runner` option. Changes here will be committed and shared with everyone developing the project. -- `/web-ext.config.ts` - A gitignored file for you to customize the startup behavior to your liking without effecting others -- `$HOME/web-ext.config.ts` - Stores system-wide config effecting all projects running on your machine. - -See below examples on how to accomplish common configuration: - -[[toc]] - -## Configuring Binaries - -`web-ext`'s browser discovery is very limited. By default, it only guesses at where Chrome and Firefox are installed. If you've customized your install locations, you may need to tell `web-ext` where the binaries/executables are located using the [`binaries` option](/api/reference/wxt/interfaces/ExtensionRunnerConfig#binaries). For other Chromium based browsers, like Edge or Opera, you'll need to explicitly list them in the `binaries` option as well, otherwise they will open in Chrome by default. - -```ts -import { defineRunnerConfig } from 'wxt'; - -export default defineRunnerConfig({ - binaries: { - chrome: '/path/to/chrome-beta', // Use Chrome Beta instead of regular Chrome - firefox: 'firefoxdeveloperedition', // Use Firefox Developer Edition instead of regular Firefox - edge: '/path/to/edge', // Open MS Edge when running "wxt -b edge" - }, -}); -``` - -## Disable Opening Browser - -Disabling the browser can be useful if it's difficult to develop your extension with fresh profiles. Maybe you need to sign into a website to see a content script run, and a fresh profile isn't helpful because it doesn't save your login info. - -To disable opening the extension automatically in a new window, just disable the runner: - -```ts -export default defineRunnerConfig({ - disabled: true, -}); -``` - -## Profile Customization - -Another option, instead of disabling the runner, to stay logged into websites is to use a custom profile. - -`web-ext` comes with some built-in ways of using an existing profile, but it's not really using the same profile. It copies the profile to a temp directory, and uses that. - -Instead, I've found it's better to pass Chrome's `--user-data-dir` argument. This let's you use a fresh profile initially, and customize it to your liking. You can install devtool extensions, set custom flags, and log into websites. Next time you run the extension in dev mode, all that will be remembered! - -```ts -export default defineRunnerConfig({ - chromiumArgs: ['--user-data-dir=./chrome-data'], -}); -``` - -> This only works for Chrome. You'll have to use `firefoxProfile` option instead, which has the same limitations mentioned above, where you won't be signed into websites automatically. diff --git a/docs/guide/directory-structure/wxt-config.md b/docs/guide/directory-structure/wxt-config.md deleted file mode 100644 index 30c0e831..00000000 --- a/docs/guide/directory-structure/wxt-config.md +++ /dev/null @@ -1,5 +0,0 @@ -# `/wxt.config.ts` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/directory-structure/wxt.md b/docs/guide/directory-structure/wxt.md deleted file mode 100644 index 557ce148..00000000 --- a/docs/guide/directory-structure/wxt.md +++ /dev/null @@ -1,5 +0,0 @@ -# `.wxt/` - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/essentials/assets.md b/docs/guide/essentials/assets.md new file mode 100644 index 00000000..29638fd1 --- /dev/null +++ b/docs/guide/essentials/assets.md @@ -0,0 +1,82 @@ +# Assets + +## `/assets` Directory + +Any assets imported or referenced inside the `/assets/` directory will be processed by WXT's bundler. + +Here's how you access them: + +:::code-group + +```ts [JS] +import imageUrl from '~/assets/image.png'; + +const img = document.createElement('img'); +img.src = imageUrl; +``` + +```html [HTML] + +``` + +```css [CSS] +.bg-image { + background-image: url(~/assets/image.png); +} +``` + +::: + +## `/public` Directory + +Files inside `/public/` are copied into the output folder as-is, without being processed by WXT's bundler. + +Here's how you access them: + +:::code-group + +```ts [JS] +import imageUrl from '/image.png'; + +const img = document.createElement('img'); +img.src = imageUrl; +``` + +```html [HTML] + +``` + +```css [CSS] +.bg-image { + background-image: url(/image.png); +} +``` + +::: + +## Inside Content Scripts + +Assets inside content scripts are a little different. By default, when you import an asset, it returns just the path to the asset. This is because Vite assumes you're loading assets from the same hostname. + +But, inside content scripts, the hostname is whatever the tab is set to. So if you try to fetch the asset, manually or as an ``'s `src`, it will be loaded from the tab's website, not your extension. + +To fix this, you need to convert the image to a full URL using `browser.runtime.getURL`: + +```ts +// entrypoints/content.ts +import iconUrl from '/icon/128.png'; + +export default defineContentScript({ + matches: ['*://*.google.com/*'], + main() { + console.log(iconUrl); // "/icon/128.png" + console.log(browser.runtime.getURL(iconUrl)); // "chrome-extension:///icon/128.png" + }, +}); +``` + +## WASM + +:::warning 🚧 Under construction +These docs will be coming soon! +::: diff --git a/docs/guide/essentials/config/auto-imports.md b/docs/guide/essentials/config/auto-imports.md new file mode 100644 index 00000000..92aca6aa --- /dev/null +++ b/docs/guide/essentials/config/auto-imports.md @@ -0,0 +1,112 @@ +# Auto-imports + +WXT uses [`unimport`](https://www.npmjs.com/package/unimport), the same tool as Nuxt, to setup auto-imports. + +```ts +export default defineConfig({ + // See https://www.npmjs.com/package/unimport#configurations + imports: { + // ... + }, +}); +``` + +By default, WXT automatically setups up auto-imports for all of it's own APIs: + +- [`browser`](/api/reference/wxt/browser/variables/browser) from `wxt/browser` +- [`defineContentScript`](/api/reference/wxt/sandbox/functions/defineContentScript) from `wxt/sandbox` +- [`defineBackground`](/api/reference/wxt/sandbox/functions/defineBackground) from `wxt/sandbox` +- [`defineUnlistedScript`](/api/reference/wxt/sandbox/functions/defineUnlistedScript) from `wxt/sandbox` +- [`createIntegratedUi`](/api/reference/wxt/client/functions/createIntegratedUi) from `wxt/client` +- [`createShadowRootUi`](/api/reference/wxt/client/functions/createShadowRootUi) from `wxt/client` +- [`createIframeUi`](/api/reference/wxt/client/functions/createIframeUi) from `wxt/client` +- [`fakeBrowser`](/api/reference/wxt/testing/variables/fakeBrowser) from `wxt/testing` +- And more! + +WXT also adds some project directories as auto-import sources automatically: + +- `/components/*` +- `/composables/*` +- `/hooks/*` +- `/utils/*` + +All named and default exports from files in these directories are available everywhere else in your project without having to import them. + +## TypeScript + +For TypeScript and your editor to recognize auto-imported variables, you need to run the [`wxt prepare` command](/api/cli/wxt-prepare). + +Add this command to your `postinstall` script so your editor has everything it needs to report type errors after installing dependencies: + +```jsonc +// package.json +{ + "scripts": { + "postinstall": "wxt prepare", // [!code ++] + }, +} +``` + +## ESLint + +ESLint doesn't know about the auto-imported variables unless they are explicitly defined in the ESLint's `globals`. By default, WXT will generate the config if it detects ESLint is installed in your project. If the config isn't generated automatically, you can manually tell WXT to generate it. + +:::code-group + +```ts [ESLint 9] +export default defineConfig({ + imports: { + eslintrc: { + enabled: 9, + }, + }, +}); +``` + +```ts [ESLint 8] +export default defineConfig({ + imports: { + eslintrc: { + enabled: 8, + }, + }, +}); +``` + +::: + +Then in your ESLint config, import and use the generated file: + +:::code-group + +```js [ESLint 9] +// eslint.config.mjs +import autoImports from './.wxt/eslint-auto-imports.mjs'; + +export default [ + autoImports, + { + // The rest of your config... + }, +]; +``` + +```js [ESLint 8] +// .eslintrc.mjs +export default { + extends: ['./.wxt/eslintrc-auto-import.json'], + // The rest of your config... +}; +``` + +::: + +## Disabling Auto-imports + +Not all developers like auto-imports. To disable them, set `imports` to `false`. + +```ts +export default defineConfig({ + imports: false, // [!code ++] +}); +``` diff --git a/docs/guide/essentials/config/browser-startup.md b/docs/guide/essentials/config/browser-startup.md new file mode 100644 index 00000000..676d5e22 --- /dev/null +++ b/docs/guide/essentials/config/browser-startup.md @@ -0,0 +1,85 @@ +--- +outline: deep +--- + +# Browser Startup + +> See the [API Reference](/api/reference/wxt/interfaces/ExtensionRunnerConfig) for a full list of config. + +During development WXT uses [`web-ext` by Mozilla](https://www.npmjs.com/package/web-ext) to automatically open a browser window with your extension installed. + +## Config Files + +You can configure browser startup in 3 places: + +1. `/web-ext.config.ts`: Ignored from version control, this file lets you configure your own options for a specific project without affecting other developers + + ```ts + import { defineRunnerConfig } from 'wxt'; + + export default defineRunnerConfig({ + // ... + }); + ``` + +2. `/wxt.config.ts`: Via the [`runner` config](/api/reference/wxt/interfaces/InlineConfig#runner), included in version control +3. `$HOME/web-ext.config.ts`: Provide default values for all WXT projects on your computer + +## Recipes + +### Set Browser Binaries + +To set or customize the browser opened during development: + +```ts +export default defineRunnerConfig({ + binaries: { + chrome: '/path/to/chrome-beta', // Use Chrome Beta instead of regular Chrome + firefox: 'firefoxdeveloperedition', // Use Firefox Developer Edition instead of regular Firefox + edge: '/path/to/edge', // Open MS Edge when running "wxt -b edge" + }, +}); +``` + +### Persist Data + +By default, to keep from modifying your browser's existing profiles, `web-ext` creates a brand new profile every time you run the `dev` script. + +Right now, Chromium based browsers are the only browsers that support overriding this behavior and persisting data when running the `dev` script multiple times. + +To persist data, set the `--user-data-dir` flag: + +:::code-group + +```ts [Mac/Linux] +export default defineRunnerConfig({ + chromiumArgs: ['--user-data-dir=./.wxt/chrome-data'], +}); +``` + +```ts [Windows] +import { resolve } from 'node:path'; + +export default defineRunnerConfig({ + // On Windows, the path must be absolute + chromiumArgs: [`--user-data-dir="${resolve(".wxt/chrome-data")}"` +}); +``` + +::: + +Now, next time you run the `dev` script, a persistent profile will be created in `.wxt/chrome-data/{profile-name}`. With a persistent profile, you can install devtools extensions to help with development, allow the browser to remember logins, etc, without worrying about the profile being reset the next time you run the `dev` script. + +:::tip +You can use any directory you'd like for `--user-data-dir`, the examples above create a persistent profile for each WXT project. To create a profile for all WXT projects, you can put the `chrome-data` directory inside you're user's home directory. +::: + +### Disable Opening Browser + +If you prefer to load the extension into your browser manually, you can disable the auto-open behavior: + +```ts +export default defineRunnerConfig({ + disabled: true, +}); +``` diff --git a/docs/guide/essentials/config/build-mode.md b/docs/guide/essentials/config/build-mode.md new file mode 100644 index 00000000..850f499f --- /dev/null +++ b/docs/guide/essentials/config/build-mode.md @@ -0,0 +1,29 @@ +# Build Modes + +Because WXT is powered by Vite, it supports [modes](https://vite.dev/guide/env-and-mode.html#modes) in the same way. + +When running any dev or build commands, pass the `--mode` flag: + +```sh +wxt --mode production +wxt build --mode development +wxt zip --mode testing +``` + +By default, `--mode` is `development` for the dev command and `production` for all other commands (build, zip, etc). + +## Get Mode at Runtime + +You can access the current mode in your extension using `import.meta.env.MODE`: + +```ts +switch (import.meta.env.MODE) { + case 'development': // ... + case 'production': // ... + + // Custom modes specified with --mode + case 'testing': // ... + case 'staging': // ... + // ... +} +``` diff --git a/docs/guide/essentials/config/entrypoint-loaders.md b/docs/guide/essentials/config/entrypoint-loaders.md new file mode 100644 index 00000000..a61708b4 --- /dev/null +++ b/docs/guide/essentials/config/entrypoint-loaders.md @@ -0,0 +1,79 @@ +# Entrypoint Loaders + +To generate the manifest and other files at build-time, WXT must import each entrypoint to get their options, like content script `matches`. For HTML files, this is easy. For JS/TS entrypoints, the process is more complicated. + +When loading your JS/TS entrypoints, they are imported into a NodeJS environment, not the `browser` environment that they normally run in. This can lead to issues commonly seen when running browser-only code in a NodeJS environment, like missing global variables. + +WXT does several pre-processing steps to try and prevent errors during this process: + +1. Use `linkedom` to make a small set of browser globals (`window`, `document`, etc) available. +2. Use `@webext-core/fake-browser` to create a fake version of the `chrome` and `browser` globals expected by extensions. +3. Pre-process the JS/TS code, stripping out the `main` function then tree-shaking unused code from the file + +However, this process is not perfect. It doesn't setup all the globals found in the browser and the APIs may behave differently. As such, **_you should avoid using browser or extension APIs outside the `main` function of your entrypoints!_** + +:::tip +If you're running into errors while importing entrypoints, run `wxt prepare --debug` to see more details about this process. When debugging, WXT will print out the pre-processed code to help you identify issues. +::: + +Once the environment has been polyfilled and your code pre-processed, it's up the entrypoint loader to import your code, extracting the options from the default export. + +There are two options for loading your entrypoints: + +1. `vite-node` - default as of `v0.19.0` +2. `jiti` (**DEPRECATED, will be removed in `v0.20.0`**) - Default before `v0.19.0` + +## vite-node + +Since 0.19.0, WXT uses `vite-node`, the same tool that powers Vitest and Nuxt, to import your entrypoint files. It re-uses the same vite config used when building your extension, making it the most stable entrypoint loader. + +## jiti + +To enable `jiti`: + +```ts +export default defineConfig({ + entrypointLoader: 'jiti', +}); +``` + +This is the original method WXT used to import TS files. However, because it doesn't support vite plugins like `vite-node`, it does one additional pre-processing step: It removes **_ALL_** imports from your code. + +That means you cannot use imported variables outside the `main` function in JS entrypoints, like for content script `matches` or other options: + +```ts +// entrypoints/content.ts +import { GOOGLE_MATCHES } from '~/utils/match-patterns'; + +export default defineContentScript({ + matches: GOOGLE_MATCHES, + main() { + // ... + }, +}); +``` + +``` +$ wxt build +wxt build + +WXT 0.14.1 +ℹ Building chrome-mv3 for production with Vite 5.0.5 +✖ Command failed after 360 ms + +[8:55:54 AM] ERROR entrypoints/content.ts: Cannot use imported variable "GOOGLE_MATCHES" before main function. +``` + +Usually, this error occurs when you try to extract options into a shared file or when running code outside the `main` function. To fix the example from above, use literal values when defining an entrypoint instead of importing them: + +```ts +import { GOOGLE_MATCHES } from '~/utils/match-patterns'; // [!code --] + +export default defineContentScript({ + matches: GOOGLE_MATCHES, // [!code --] + matches: ['*//*.google.com/*'], // [!code ++] + main() { + // ... + }, +}); +``` diff --git a/docs/guide/essentials/config/environment-variables.md b/docs/guide/essentials/config/environment-variables.md new file mode 100644 index 00000000..be97952f --- /dev/null +++ b/docs/guide/essentials/config/environment-variables.md @@ -0,0 +1,54 @@ +# Environment Variables + +## Dotenv Files + +WXT supports [dotenv files the same way as Vite](https://vite.dev/guide/env-and-mode.html#env-files). Create any of the following files: + +``` +.env +.env.local +.env.[mode] +.env.[mode].local +``` + +And any environment variables listed inside them will be available at runtime: + +```sh +# .env +VITE_API_KEY=... +``` + +```ts +await fetch(`/some-api?apiKey=${import.meta.env.VITE_API_KEY}`); +``` + +Remember to prefix any environment variables with `VITE_`, otherwise they won't be available at runtime, as per [Vite's convention](https://vite.dev/guide/env-and-mode.html#env-files). + +## Built-in Environment Variables + +WXT provides some custom environment variables based on the current command: + +| Usage | Type | Description | +| ---------------------------------- | --------- | ----------------------------------------------------- | +| `import.meta.env.MANIFEST_VERSION` | `2 │ 3` | The target manifest version | +| `import.meta.env.BROWSER` | `string` | The target browser | +| `import.meta.env.CHROME` | `boolean` | Equivalent to `import.meta.env.BROWSER === "chrome"` | +| `import.meta.env.FIREFOX` | `boolean` | Equivalent to `import.meta.env.BROWSER === "firefox"` | +| `import.meta.env.SAFARI` | `boolean` | Equivalent to `import.meta.env.BROWSER === "safari"` | +| `import.meta.env.EDGE` | `boolean` | Equivalent to `import.meta.env.BROWSER === "edge"` | +| `import.meta.env.OPERA` | `boolean` | Equivalent to `import.meta.env.BROWSER === "opera"` | + +You can also access all of [Vite's environment variables](https://vite.dev/guide/env-and-mode.html#env-variables): + +| Usage | Type | Description | +| ---------------------- | --------- | --------------------------------------------------------------------------- | +| `import.meta.env.MODE` | `string` | The [mode](/guide/essentials/config/build-mode) the extension is running in | +| `import.meta.env.PROD` | `boolean` | When `NODE_ENV='production'` | +| `import.meta.env.DEV` | `boolean` | Opposite of `import.meta.env.PROD` | + +:::details Other Vite Environment Variables +Vite provides two other environment variables, but they aren't useful in WXT projects: + +- `import.meta.env.BASE_URL`: Use `browser.runtime.getURL` instead. +- `import.meta.env.SSR`: Always `false`. + ::: diff --git a/docs/guide/essentials/config/hooks.md b/docs/guide/essentials/config/hooks.md new file mode 100644 index 00000000..930b8bdf --- /dev/null +++ b/docs/guide/essentials/config/hooks.md @@ -0,0 +1,22 @@ +# Hooks + +WXT includes a system that lets you hook into the build process and make changes. + +Here's an example hook that modifies the `manifest.json` file before it is written to the output directory: + +```ts +// wxt.config.ts +export default defineConfig({ + hooks: { + 'build:manifestGenerated': (wxt, manifest) => { + if (wxt.config.mode === 'development') { + manifest.title += ' (DEV)'; + } + }, + }, +}); +``` + +> Most hooks provide the `wxt` object as the first argument. It contains the resolved config and other info about the current build. + +Putting one-off hooks like this in your config file is simple, but if you find yourself writing lots of hooks, you should extract them into [WXT Modules](/guide/essentials/wxt-modules) instead. diff --git a/docs/guide/essentials/config/manifest.md b/docs/guide/essentials/config/manifest.md new file mode 100644 index 00000000..6aeab49d --- /dev/null +++ b/docs/guide/essentials/config/manifest.md @@ -0,0 +1,258 @@ +# Manifest + +In WXT, there is no `manifest.json` file in your source code. Instead, WXT generates it during the build process based off files in your project. + +## Manifest Config + +To manually add a property to the `manifest.json` output during builds, use the `manifest` config inside `wxt.config.ts`: + +```ts +export default defineConfig({ + manifest: { + // Put manual changes here + }, +}); +``` + +You can also define the manifest as a function, and use JS to generate it based on the target browser, mode, and more. + +```ts +export default defineConfig({ + manifest: ({ browser, manifestVersion, mode, command }) => { + return { + // ... + }; + }, +}); +``` + +### MV2 and MV3 Compatibility + +When adding properties to the manifest, always define the property in it's MV3 format when possible. When targeting MV2, WXT will automatically convert these properties to their MV2 format. + +For example, for this config: + +```ts +export default defineConfig({ + manifest: { + action: { + default_title: 'Some Title', + }, + web_accessible_resources: [ + { + matches: ['*://*.google.com/*'], + resources: ['icon/*.png'], + }, + ], + }, +}); +``` + +WXT will generate the following manifests: + +:::code-group + +```json [MV2] +{ + "manifest_version": 2, + // ... + "browser_action": { + "default_title": "Some Title" + }, + "web_accessible_resources": ["icon/*.png"] +} +``` + +```json [MV3] +{ + "manifest_version": 3, + // ... + "action": { + "default_title": "Some Title" + }, + "web_accessible_resources": [ + { + "matches": ["*://*.google.com/*"], + "resources": ["icon/*.png"] + } + ] +} +``` + +::: + +You can also specify properties specific to a single manifest version, and they will be stripped out when targeting the other manifest version. + +## Name + +> [Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/manifest/name/) + +If not provided via the `manifest` config, the manifest's `name` property defaults to your `package.json`'s `name` property. + +## Version and Version Name + +> [Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/manifest/version/) + +Your extension's `version` and `version_name` is based on the `version` from your `package.json`. + +- `version_name` is the exact string listed +- `version` is the string cleaned up, with any invalid suffixes removed + +Example: + +```json +// package.json +{ + "version": "1.3.0-alpha2" +} +``` + +```json +// .output//manifest.json +{ + "version": "1.3.0", + "version_name": "1.3.0-alpha2" +} +``` + +If a version is not present in your `package.json`, it defaults to `"0.0.0"`. + +## Icons + +WXT automatically discovers your extension's icon by looking at files in the `public/` directory: + +``` +public/ +├─ icon-16.png +├─ icon-24.png +├─ icon-48.png +├─ icon-96.png +└─ icon-128.png +``` + +Specifically, if an icon must match one of these regex to be discovered: + +<<< @/../packages/wxt/src/core/utils/manifest.ts#snippet + +If you don't like these filename or you're migrating to WXT and don't want to rename the files, you can manually specify an `icon` in your manifest: + +```ts +export default defineConfig({ + manifest: { + icons: { + 16: '/extension-icon-16.png', + 24: '/extension-icon-24.png', + 48: '/extension-icon-48.png', + 96: '/extension-icon-96.png', + 128: '/extension-icon-128.png', + }, + }, +}); +``` + +Alternatively, you can use [`@wxt-dev/auto-icons`](https://www.npmjs.com/package/@wxt-dev/auto-icons) to let WXT generate your icon at the required sizes. + +## Permissions + +> [Chrome docs](https://developer.chrome.com/docs/extensions/reference/permissions/) + +```ts +export default defineConfig({ + manifest: { + permissions: ['storage', 'tabs'], + }, +}); +``` + +## Host Permissions + +> [Chrome docs](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#host-permissions) + +```ts +export default defineConfig({ + manifest: { + permissions: ['storage', 'tabs'], + }, +}); +``` + +:::warning +If you use host permissions and target both MV2 and MV3, make sure to only include the required host permissions for each version: + +```ts +export default defineConfig({ + manifest: ({ manifestVersion }) => ({ + host_permissions: manifestVersion === 2 ? [...] : [...], + }), +}); +``` + +::: + +## Default Locale + +```ts +export default defineConfig({ + manifest: { + name: '__MSG_extName__', + description: '__MSG_extDescription__', + default_locale: 'en', + }, +}); +``` + +> See [I18n docs](/guide/essentials/i18n) for a full guide on internationalizing your extension. + +## Actions + +In MV2, you have two options: [`browser_action`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/browser_action) and [`page_action`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/page_action). In MV3, they were merged into a single [`action`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/action) API. + +By default, whenever an `action` is generated, WXT falls back to `browser_action` when targeting MV2. + +### Action With Popup + +To generate a manifest where a UI appears after clicking the icon, just create a [Popup entrypoint](/guide/essentials/entrypoints#popup). + +```ts +export default defineConfig({ + hooks: { + build: { + manifestGenerated(manifest) { + // Update the manifest variable by reference + manifest.name = 'Overriden name'; + }, + }, + }, +}); +``` + +If you want to use a `page_action` for MV2, add the following meta tag to the HTML document's head: + +```html + +``` + +### Action Without Popup + +If you want to use the `activeTab` permission or the `browser.action.onClicked` event, but don't want to show a popup: + +1. Delete the [Popup entrypoint](/guide/essentials/entrypoints#popup) if it exists +2. Add the `action` key to your manifest: + ```ts + export default defineConfig({ + manifest: { + action: {}, + }, + }); + ``` + +Same as an action with a popup, WXT will fallback on using `browser_action` for MV2. To use a `page_action` instead, add that key as well: + +```ts +export default defineConfig({ + manifest: { + action: {}, + page_action: {}, + }, +}); +``` diff --git a/docs/guide/essentials/config/runtime.md b/docs/guide/essentials/config/runtime.md new file mode 100644 index 00000000..084a43f5 --- /dev/null +++ b/docs/guide/essentials/config/runtime.md @@ -0,0 +1,56 @@ +# Runtime Config + +> This API is still a WIP, with more features coming soon! + +Define runtime configuration in a single place, `/app.config.ts`: + +```ts +import { defineAppConfig } from 'wxt/sandbox'; + +// Define types for your config +declare module 'wxt/sandbox' { + export interface WxtAppConfig { + theme?: 'light' | 'dark'; + } +} + +export default defineAppConfig({ + theme: 'dark', +}); +``` + +:::warning +This file is committed to the repo, so don't put any secrets here. Instead, use [Environment Variables](#environment-variables) +::: + +To access runtime config, WXT provides the `useAppConfig` function: + +```ts +import { useAppConfig } from 'wxt/sandbox'; + +console.log(useAppConfig()); // { theme: "dark" } +``` + +## Environment Variables in App Config + +You can use environment variables in the `app.config.ts` file. + +```ts +declare module 'wxt/sandbox' { + export interface WxtAppConfig { + apiKey?: string; + skipWelcome: boolean; + } +} + +export default defineAppConfig({ + apiKey: import.meta.env.VITE_API_KEY, + skipWelcome: import.meta.env.VITE_SKIP_WELCOME === 'true', +}); +``` + +This has several advantages: + +- Define all expected environment variables in a single file +- Convert strings to other types, like booleans or arrays +- Provide default values if an environment variable is not provided diff --git a/docs/guide/essentials/config/typescript.md b/docs/guide/essentials/config/typescript.md new file mode 100644 index 00000000..be220883 --- /dev/null +++ b/docs/guide/essentials/config/typescript.md @@ -0,0 +1,65 @@ +# TypeScript Configuration + +When you run [`wxt prepare`](/api/cli/wxt-prepare), WXT generates a base TSConfig file for your project at `/.wxt/tsconfig.json`. + +At a minimum, you need to create a TSConfig in your root directory that looks like this: + +```jsonc +// /tsconfig.json +{ + "extends": ".wxt/tsconfig.json", +} +``` + +Or if you're in a monorepo, you may not want to extend the config. If you don't extend it, you need to add `.wxt/wxt.d.ts` to the TypeScript project: + +```ts +/// +``` + +## Compiler Options + +To specify custom compiler options, add them in `/tsconfig.json`: + +```jsonc +// /tsconfig.json +{ + "extends": ".wxt/tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + }, +} +``` + +## TSConfig Paths + +WXT provides a default set of path aliases. + +| Alias | To | Example | +| ----- | ------------- | ----------------------------------------------- | +| `~~` | `/*` | `import "~~/scripts"` | +| `@@` | `/*` | `import "@@/scripts"` | +| `~` | `/*` | `import { toLowerCase } from "~/utils/strings"` | +| `@` | `/*` | `import { toLowerCase } from "@/utils/strings"` | + +To add your own, DO NOT add them to your `tsconfig.json`! Instead, use the [`alias` option](/api/reference/wxt/interfaces/InlineConfig#alias) in `wxt.config.ts`. + +This will add your custom aliases to `/.wxt/tsconfig.json` next time you run `wxt prepare`. It also adds your alias to the bundler so it can resolve imports. + +```ts +import { resolve } from 'node:path'; + +export default defineConfig({ + alias: { + // Directory: + testing: resolve('utils/testing'), + // File: + strings: resolve('utils/strings.ts'), + }, +}); +``` + +```ts +import { fakeTab } from 'testing/fake-objects'; +import { toLowerCase } from 'strings'; +``` diff --git a/docs/guide/essentials/config/vite.md b/docs/guide/essentials/config/vite.md new file mode 100644 index 00000000..47bb8eff --- /dev/null +++ b/docs/guide/essentials/config/vite.md @@ -0,0 +1,68 @@ +# Vite + +WXT uses [Vite](https://vitejs.dev/) under the hood to bundle your extension. + +This page explains how to customize your project's Vite config. Refer to [Vite's documentation](https://vite.dev/config/) to learn more about configuring the bundler. + +:::tip +In most cases, you shouldn't change Vite's build settings. WXT provides sensible defaults that output a valid extension accepted by all stores when publishing. +::: + +## Change Vite Config + +You can change Vite's config via the `wxt.config.ts` file: + +```ts +// wxt.config.ts +import { defineConfig } from 'wxt'; + +export default defineConfig({ + vite: () => ({ + // Override config here, same as `defineConfig({ ... })` + // inside vite.config.ts files + }), +}); +``` + +## Add Vite Plugins + +To add a plugin, install the NPM package and add it to the Vite config: + +```ts +// wxt.config.ts +import { defineConfig } from 'wxt'; +import VueRouter from 'unplugin-vue-router/vite'; + +export default defineConfig({ + vite: () => ({ + plugins: [ + VueRouter({ + /* ... */ + }), + ], + }), +}); +``` + +:::warning +Due to the way WXT orchestrates Vite builds, some plugins may not work as expected. For example, `vite-plugin-remove-console` normally only runs when you build for production (`vite build`). However, WXT uses a combination of dev server and builds during development, so you need to manually tell it when to run: + +```ts +// wxt.config.ts +import { defineConfig } from 'wxt'; +import removeConsole from 'vite-plugin-remove-console'; + +export default defineConfig({ + vite: (configEnv) => ({ + plugins: + configEnv.mode === 'production' + ? [removeConsole({ includes: ['log'] })] + : [], + }), +}); +``` + +Search [GitHub issues](https://github.com/wxt-dev/wxt/issues?q=is%3Aissue+label%3A%22vite+plugin%22) if you run into issues with a specific plugin. + +If an issue doesn't exist for your plugin, [open a new one](https://github.com/wxt-dev/wxt/issues/new/choose). +::: diff --git a/docs/guide/key-concepts/content-script-ui.md b/docs/guide/essentials/content-scripts.md similarity index 58% rename from docs/guide/key-concepts/content-script-ui.md rename to docs/guide/essentials/content-scripts.md index c75935ee..caf74255 100644 --- a/docs/guide/key-concepts/content-script-ui.md +++ b/docs/guide/essentials/content-scripts.md @@ -1,8 +1,102 @@ -# Content Script UI +--- +outline: deep +--- -There are three ways to mount a UI inside a content script: +# Content Scripts -[[toc]] +## Context + +The first argument to a content script's `main` function is it's "context". + +```ts +// entrypoints/content.ts +export default defineContentScript({ + main(ctx) {}, +}); +``` + +This object is responsible for tracking whether or not the content script's context is "invalidated". Most browsers, by default, do not stop content scripts if the extension is uninstalled, updated, or disabled. When this happens, content scripts start reporting this error: + +``` +Error: Extension context invalidated. +``` + +The `ctx` object provides several helpers to stop asynchronous code from running once the context is invalidated: + +```ts +ctx.addEventListener(...); +ctx.setTimeout(...); +ctx.setInterval(...); +ctx.requestAnimationFrame(...); +// and more +``` + +You can also check if the context is invalidated manually: + +```ts +if (ctx.isValid) { + // do something +} +// OR +if (ctx.isInvalid) { + // do something +} +``` + +## CSS + +In regular web extensions, CSS for content scripts is usually a separate CSS file, that is added to a CSS array in the manifest: + +```json +{ + "content_scripts": [ + { + "css": ["content/style.css"], + "js": ["content/index.js"], + "matches": ["*://*/*"] + } + ] +} +``` + +In WXT, to add CSS to a content script, simply import the CSS file into your JS entrypoint, and WXT will automatically add the bundled CSS output to the `css` array. + +```ts +// entrypoints/content/index.ts +import './style.css'; + +export default defineContentScript({ + // ... +}); +``` + +To create a standalone content script that only includes a CSS file: + +1. Create the CSS file: `entrypoints/example.content.css` +2. Use the `build:manifestGenerated` hook to add the content script to the manifest: + ```ts + // wxt.config.ts + export default defineConfig({ + hooks: { + "build:manifestGenerated": (wxt, manifest) => { + manifest.content_scripts ??= []; + manifest.content_scripts.push({ + // Build extension once to see where your CSS get's written to + css: ["content-scripts/example.css"], + matches: ["*://*/*"] + ) + } + } + }) + ``` + +## UI + +WXT provides 3 built-in utilities for adding UIs to a page from a content script: + +- [Integrated](#integrated) - `createIntegratedUi` +- [Shadow Root](#shadow-root) -`createShadowRootUi` +- [IFrame](#iframe) - `createIframeUi` Each has their own set of advantages and disadvantages. @@ -12,7 +106,7 @@ Each has their own set of advantages and disadvantages. | Shadow Root | ✅ | ✅ (off by default) | ❌ | ✅ | | IFrame | ✅ | ✅ | ✅ | ❌ | -## Integrated +### Integrated Integrated content script UIs are injected alongside the content of a page. This means that they are affected by CSS on that page. @@ -26,6 +120,7 @@ export default defineContentScript({ main(ctx) { const ui = createIntegratedUi(ctx, { position: 'inline', + anchor: 'body', onMount: (container) => { // Append children to the container const app = document.createElement('p'); @@ -51,6 +146,7 @@ export default defineContentScript({ main(ctx) { const ui = createIntegratedUi(ctx, { position: 'inline', + anchor: 'body', onMount: (container) => { // Create the app and mount it to the UI container const app = createApp(App); @@ -80,6 +176,7 @@ export default defineContentScript({ main(ctx) { const ui = createIntegratedUi(ctx, { position: 'inline', + anchor: 'body', onMount: (container) => { // Create a root on the UI container and render a component const root = ReactDOM.createRoot(container); @@ -108,6 +205,7 @@ export default defineContentScript({ main(ctx) { const ui = createIntegratedUi(ctx, { position: 'inline', + anchor: 'body', onMount: (container) => { // Create the Svelte app inside the UI container const app = new App({ @@ -137,6 +235,7 @@ export default defineContentScript({ main(ctx) { const ui = createIntegratedUi(ctx, { position: 'inline', + anchor: 'body', onMount: (container) => { // Render your app to the UI container const unmount = render(() =>

...
, container); @@ -157,13 +256,11 @@ export default defineContentScript({ See the [API Reference](/api/reference/wxt/client/functions/createIntegratedUi) for the complete list of options. -You can control how CSS is injected for an integrated content script UI with the [`cssInjectionMode`](/api/reference/wxt/interfaces/BaseContentScriptEntrypointOptions#cssinjectionmode) property. Usually, you'll want to leave it as `"manifest"`, the default, so the UI inherits its style from the website's CSS. - -## Shadow Root +### Shadow Root Often in web extensions, you don't want your content script's CSS affecting the page, or vise-versa. The [`ShadowRoot`](https://developer.mozilla.org/en-US/docs/Web/API/ShadowRoot) API is ideal for this. -WXT's [`createShadowRootUi`](/api/reference/wxt/client/functions/createShadowRootUi) abstracts all the `ShadowRoot` setup away, making it easy to create UIs with isolated CSS. It also supports an optional `isolateEvents` parameter to further isolate user interactions. +WXT's [`createShadowRootUi`](/api/reference/wxt/client/functions/createShadowRootUi) abstracts all the `ShadowRoot` setup away, making it easy to create UIs whose styles are isolated from the page. It also supports an optional `isolateEvents` parameter to further isolate user interactions. To use `createShadowRootUi`, follow these steps: @@ -188,6 +285,7 @@ export default defineContentScript({ const ui = await createShadowRootUi(ctx, { name: 'example-ui', position: 'inline', + anchor: 'body', onMount(container) { // Define how your UI will be mounted inside the container const app = document.createElement('p'); @@ -218,6 +316,7 @@ export default defineContentScript({ const ui = await createShadowRootUi(ctx, { name: 'example-ui', position: 'inline', + anchor: 'body', onMount: (container) => { // Define how your UI will be mounted inside the container const app = createApp(App); @@ -252,6 +351,7 @@ export default defineContentScript({ const ui = await createShadowRootUi(ctx, { name: 'example-ui', position: 'inline', + anchor: 'body', onMount: (container) => { // Container is a body, and React warns when creating a root on the body, so create a wrapper div const app = document.createElement('div'); @@ -289,6 +389,7 @@ export default defineContentScript({ const ui = await createShadowRootUi(ctx, { name: 'example-ui', position: 'inline', + anchor: 'body', onMount: (container) => { // Create the Svelte app inside the UI container const app = new App({ @@ -323,6 +424,7 @@ export default defineContentScript({ const ui = await createShadowRootUi(ctx, { name: 'example-ui', position: 'inline', + anchor: 'body', onMount: (container) => { // Render your app to the UI container const unmount = render(() =>
...
, container); @@ -343,17 +445,18 @@ export default defineContentScript({ See the [API Reference](/api/reference/wxt/client/functions/createShadowRootUi) for the complete list of options. -:::info TailwindCSS -`createShadowRootUi` supports TailwindCSS out of the box! When importing the styles, just import the main CSS file containing the `@tailwind` directives, and everything will just work :+1:. -::: +Full examples: -## IFrame +- [react-content-script-ui](https://github.com/wxt-dev/examples/tree/main/examples/react-content-script-ui) +- [tailwindcss](https://github.com/wxt-dev/examples/tree/main/examples/tailwindcss) + +### IFrame If you don't need to run your UI in the same frame as the content script, you can use an IFrame to host your UI instead. Since an IFrame just hosts an HTML page, **_HMR is supported_**. WXT provides a helper function, [`createIframeUi`](/api/reference/wxt/client/functions/createIframeUi), which simplifies setting up the IFrame. -1. Create an HTML page that will be loaded into your IFrame +1. Create an HTML page that will be loaded into your IFrame: ```html @@ -368,7 +471,7 @@ WXT provides a helper function, [`createIframeUi`](/api/reference/wxt/client/fun ``` -1. Add the page to the manifest's `web_accessible_resources` +1. Add the page to the manifest's `web_accessible_resources`: ```ts // wxt.config.ts export default defineConfig({ @@ -382,7 +485,7 @@ WXT provides a helper function, [`createIframeUi`](/api/reference/wxt/client/fun }, }); ``` -1. Create and mount the IFrame +1. Create and mount the IFrame: ```ts export default defineContentScript({ @@ -393,6 +496,7 @@ WXT provides a helper function, [`createIframeUi`](/api/reference/wxt/client/fun const ui = createIframeUi(ctx, { page: '/example-iframe.html', position: 'inline', + anchor: 'body', onMount: (wrapper, iframe) => { // Add styles to the iframe like width iframe.width = '123'; @@ -406,3 +510,104 @@ WXT provides a helper function, [`createIframeUi`](/api/reference/wxt/client/fun ``` See the [API Reference](/api/reference/wxt/client/functions/createIframeUi) for the complete list of options. + +## Isolated World vs Main World + +By default, all content scripts run in an isolated context where only the DOM is shared with the webpage it is running on - an "isolated world". In MV3, Chromium introduced the ability to run content scripts in the "main" world - where everything, not just the DOM, is available to the content script, just like if the script were loaded by the webpage. + +You can enable this for a content script by setting the `world` option: + +```ts +export default defineContentScript({ + world: 'MAIN', +}); +``` + +However, this approach has several notable drawbacks: + +- Doesn't support MV2 +- `world: "MAIN"` is only supported by Chromium browsers +- Main world content scripts don't have access to the extension API + +Instead, WXT recommends injecting a script into the main world manually using it's `injectScript` function. This will address the drawbacks mentioned before. + +- `injectScript` supports both MV2 and MV3 +- `injectScript` supports all browsers +- Having a "parent" content script means you can send messages back and forth, making it possible to access the extension API + +To use `injectScript`, we need two entrypoints, one content script and one unlisted script: + + +```html +📂 entrypoints/ + 📄 example.content.ts + 📄 example-main-world.ts +``` + +```ts +// entrypoints/example-main-world.ts +export default defineUnlistedScript(() => { + console.log('Hello from the main world!'); +}); +``` + +```ts +// entrypoints/example.content.ts +export default defineContentScript(async () => { + await injectScript('/example-main-world.js', { + keepInDom: true, + }); +}); +``` + +`injectScript` works by creating a `script` element on the page pointing to your script. This loads the script into the page's context so it runs in the main world. + +`injectScript` returns a promise, that when resolved, means the script has been evaluated by the browser and you can start communicating with it. + +:::warning Warning: `run_at` Caveat +For MV3, `injectScript` is synchronous and the injected script will be evaluated at the same time as your the content script's `run_at`. + +However for MV2, `injectScript` has to `fetch` the script's text content and create an inline ` + +``` + +## Background + +In your background script, set `type: "module"`: + +```ts +export default defineBackground({ + type: 'module', // !code ++ + main() { + // ... + }, +}); +``` + +:::warning +Only MV3 supports ESM background scripts/service workers. When targeting MV2, the `type` option is ignored and the background is always bundled into a single file as IIFE. +::: + +## Content Scripts + +WXT does not yet include built-in support for ESM content scripts. The plan is to add support for chunking to reduce bundle size, but not support HMR for now. There are several technical issues that make implementing a generic solution for HMR impossible. See [Content Script ESM Support #357](https://github.com/wxt-dev/wxt/issues/357) for details. + +If you can't wait, and need ESM support right now, you can implement ESM support manually. See the [ESM Content Script UI](https://github.com/wxt-dev/examples/tree/main/examples/esm-content-script-ui) example to get started. diff --git a/docs/guide/essentials/extension-apis.md b/docs/guide/essentials/extension-apis.md new file mode 100644 index 00000000..529558d8 --- /dev/null +++ b/docs/guide/essentials/extension-apis.md @@ -0,0 +1,92 @@ +# Extension APIs + +[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/api) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Browser_support_for_JavaScript_APIs) + +Different browsers provide different global variables for accessing the extension APIs (chrome provides `chrome`, firefox provides `browser`, etc). + +WXT simplifies this - always use `browser`: + +```ts +browser.action.onClicked.addListener(() => { + // ... +}); +``` + +Other than that, refer to Chrome and Mozilla's documentation for how to use specific APIs. Everything a normal extension can do, WXT can do as well, just via `browser` instead of `chrome`. + +## Webextension Polyfill + +> Since `v0.1.0` + +By default, WXT uses the [`webextension-polyfill` by Mozilla](https://www.npmjs.com/package/webextension-polyfill) to make the extension API consistent between browsers. + +To access types, you should import the relevant namespace from `wxt/browser`: + +```ts +import { Runtime } from 'wxt/browser'; + +function handleMessage(message: any, sender: Runtime.Sender) { + // ... +} +``` + +### Disabling the polyfill + +> Since `v0.19.0` + +After the release of MV3 and Chrome's official deprecation of MV2 in June 2024, the polyfill isn't really doing anything useful anymore. + +You can disable it with a single line: + +```ts +// wxt.config.ts +export default defineConfig({ + extensionApi: 'chrome', +}); +``` + +This will change `wxt/browser` to simply export the `browser` or `chrome` globals based on browser at runtime: + +<<< @/../packages/wxt/src/browser/chrome.ts#snippet + +Accessing types is a little different with the polyfill disabled. They do not need to be imported; they're available on the `browser` object itself: + +```ts +function handleMessage(message: any, sender: browser.runtime.Sender) { + // ... +} +``` + +## Feature Detection + +Depending on the manifest version and browser, some APIs are not available at runtime. If an API is not available, it will be `undefined`. + +:::warning +Types will not help you here. The types WXT provides for `browser` assume all APIs exist. You are responsible for knowing whether an API is available or not. +::: + +To check if an API is available, use feature detection: + +```ts +if (browser.runtime.onSuspend != null) { + browser.runtime.onSuspend.addListener(() => { + // ... + }); +} +``` + +Here, [optional chaining](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining) is your best friend: + +```ts +browser.runtime.onSuspend?.addListener(() => { + // ... +}); +``` + +Alternatively, if you're trying to use similar APIs under different names (to support MV2 and MV3), you can do something like this: + +```ts +(browser.action ?? browser.browser_action).onClicked.addListener(() => { + // +}); +``` diff --git a/docs/guide/key-concepts/frontend-frameworks.md b/docs/guide/essentials/frontend-frameworks.md similarity index 56% rename from docs/guide/key-concepts/frontend-frameworks.md rename to docs/guide/essentials/frontend-frameworks.md index c5295310..27657a35 100644 --- a/docs/guide/key-concepts/frontend-frameworks.md +++ b/docs/guide/essentials/frontend-frameworks.md @@ -2,7 +2,7 @@ ## Built-in Modules -WXT has preconfigured modules for 4 frameworks: +WXT has preconfigured modules for the most popular frontend frameworks: - [`@wxt-dev/module-react`](https://github.com/wxt-dev/wxt/tree/main/packages/module-react) - [`@wxt-dev/module-vue`](https://github.com/wxt-dev/wxt/tree/main/packages/module-vue) @@ -64,45 +64,36 @@ export default defineConfig({ }); ``` -The WXT modules just simplify the configuration and add auto-imports. They're not much different than the above. +> The WXT modules just simplify the configuration and add auto-imports. They're not much different than the above. ## Multiple Apps -Since web extensions usually contain multiple UIs as separate HTML files (popup, options, changelog, side panel, etc), you'll need to create individual app instances, one per HTML page. +Since web extensions usually contain multiple UIs across multiple entrypoints (popup, options, changelog, side panel, content scripts, etc), you'll need to create individual app instances, one per entrypoint. -Usually, this means each entrypoint should be a directory with it's own files inside it: +Usually, this means each entrypoint should be a directory with it's own files inside it. Here's the recommended folder structure: -``` -/ - ├ assets/ <------------------ Put shared assets here - │ ├ style.css <------------ Like styles all your pages share - │ └ ... - ├ components/ <-------------- Put shared components here - │ └ ... - └ entrypoints/ - ├ popup/ <--------------- Use a folder with an index.html file in it - │ ├ index.html - │ ├ main.tsx <--------- Create and mount your app here - │ ├ style.css <-------- Have some global styles to apply? - │ └ ... <--------------- Rest of the files can be named whatever - └ options/ - ├ pages/ <------------ A good place to put your router pages - │ ├ [id]/ - │ │ └ details.tsx - │ ├ index.tsx - │ └... - ├ index.html - ├ App.vue - ├ main.ts - ├ style.css - └ router.ts + +```html +📂 {srcDir}/ + 📂 assets/ <---------- Put shared assets here + 📄 tailwind.css + 📂 components/ + 📄 Button.tsx + 📂 entrypoints/ + 📂 options/ <--------- Use a folder with an index.html file in it + 📁 pages/ <--------- A good place to put your router pages if you have them + 📄 index.html + 📄 App.tsx + 📄 main.tsx <--------- Create and mount your app here + 📄 style.css <--------- Entrypoint-specific styles + 📄 router.ts ``` ## Configuring Routers -Lots of frameworks come with routers for building a multi-page app using the URL's path. Chrome extensions don't work like this. Since HTML files are static, `chrome-extension://{id}/popup.html`, there's no way to change the entire path for routing. +All frameworks come with routers for building a multi-page app using the URL's path... But web extensions don't work like this. Since HTML files are static, `chrome-extension://{id}/popup.html`, there's no way to change the entire path for routing. -Instead, you need to configure the router to run in "hash" mode, where the routing information is apart of the URL's hash, not the path (ie: `popup.html#/` and `popup.html#/account/settings`). +Instead, you need to configure the router to run in "hash" mode, where the routing information is a part of the URL's hash, not the path (ie: `popup.html#/` and `popup.html#/account/settings`). Refer to your router's docs for information about hash mode and how to enable it. Here's a non-extensive list of a few popular routers: diff --git a/docs/guide/essentials/i18n.md b/docs/guide/essentials/i18n.md new file mode 100644 index 00000000..9c012986 --- /dev/null +++ b/docs/guide/essentials/i18n.md @@ -0,0 +1,86 @@ +# I18n + +[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/api/i18n) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/i18n) + +This page discusses how to setup internationalization using the vanilla `browser.i18n` APIs and mentions some alternatives if you want to use something else. + +[[toc]] + +## Usage + +1. Add `default_locale` to your manifest: + ```ts + export default defineConfig({ + manifest: { + default_locale: 'en', + }, + }); + ``` +2. Create `messages.json` files in the `public/` directory: + + + ```html + 📂 {srcDir}/ + 📂 public/ + 📂 _locales/ + 📂 en/ + 📄 messages.json + 📂 de/ + 📄 messages.json + 📂 ko/ + 📄 messages.json + ``` + + ```jsonc + // public/_locales/en/messages.json + { + "helloWorld": { + "message": "Hello world!", + }, + } + ``` + +3. Get the translation: + ```ts + browser.i18n.getMessage('helloWorld'); + ``` +4. _Optional_: Add translations for extension name and description: + +```json +{ + "extName": { + "message": "..." + }, + "extDescription": { + "message": "..." + }, + "helloWorld": { + "message": "Hello world!" + } +} +``` + +```ts +export default defineConfig({ + manifest: { + name: '__MSG_extName__', + description: '__MSG_extDescription__', + default_locale: 'en', + }, +}); +``` + +## Alternatives + +The vanilla API has very few features, which is why you may want to consider using third-party NPM packages like `i18next`, `react-i18n`, `vue-i18n`, etc. + +However, it is recommended you stick with the vanilla API (or a package based on top of the vanilla API, like [`@wxt-dev/i18n`](/i18n)), because: + +- They can localize text in your manifest and CSS files +- Translations are loaded synchronously +- Translations are not bundled multiple times, keeping your extension small +- Zero configuration + +Here are some examples of how to setup a third party i18n library: + +- [vue-i18n](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vue-i18n) diff --git a/docs/guide/essentials/messaging.md b/docs/guide/essentials/messaging.md new file mode 100644 index 00000000..2cb8d5bd --- /dev/null +++ b/docs/guide/essentials/messaging.md @@ -0,0 +1,16 @@ +# Messaging + +[Chrome Docs](https://developer.chrome.com/docs/extensions/develop/concepts/messaging) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#communicating_with_background_scripts) + +Read the docs linked above to learn more about using the vanilla messaging APIs. + +## Alternatives + +The vanilla APIs are difficult to use and are a pain point to many new extension developers. For this reason, WXT recommends installing an NPM package that wraps around the vanilla APIs. + +Here are some popular messaging libraries that support all browsers and work with WXT: + +- [`trpc-chrome`](https://www.npmjs.com/package/trpc-chrome) - [tRPC](https://trpc.io/) adapter for Web Extensions. +- [`webext-bridge`](https://www.npmjs.com/package/webext-bridge) - Messaging in WebExtensions made super easy. Out of the box. +- [`@webext-core/messaging`](https://www.npmjs.com/package/@webext-core/messaging) - Light weight, type-safe wrapper around the web extension messaging APIs +- [`@webext-core/proxy-service`](https://www.npmjs.com/package/@webext-core/proxy-service) - A type-safe wrapper around the web extension messaging APIs that lets you call a function from anywhere, but execute it in the background. diff --git a/docs/guide/essentials/project-structure.md b/docs/guide/essentials/project-structure.md new file mode 100644 index 00000000..d8cb3959 --- /dev/null +++ b/docs/guide/essentials/project-structure.md @@ -0,0 +1,101 @@ +# Project Structure + +WXT follows a strict project structure. By default, it's a flat folder structure that looks like this: + + +```html +📂 {rootDir}/ + 📁 .output/ + 📁 .wxt/ + 📁 assets/ + 📁 components/ + 📁 composables/ + 📁 entrypoints/ + 📁 hooks/ + 📁 modules/ + 📁 public/ + 📁 utils/ + 📄 .env + 📄 .env.publish + 📄 app.config.ts + 📄 package.json + 📄 tsconfig.json + 📄 web-ext.config.ts + 📄 wxt.config.ts +``` + +Here's a brief summary of each of these files and directories: + +- `.output/`: All build artifacts will go here +- `.wxt/`: Generated by WXT, it contains TS config +- `assets/`: Contains all CSS, images, and other assets that should be processed by WXT +- `components/`: Auto-imported by default, contains UI components +- `composables/`: Auto-imported by default, contains composable functions for Vue +- `entrypoints/`: Contains all the entrypoints that get bundled into your extension +- `hooks/`: Auto-imported by default, contains hooks for React and Solid +- `public/`: Contains any files you want to copy into the output folder as-is, without being processed by WXT +- `utils/`: Auto-imported by default, contains generic utilities used throughout your project +- `.env`: Contains [Environment Variables](/guide/essentials/config/runtime#environment-variables) +- `.env.publish`: Contains Environment Variables for [publishing](/guide/essentials/publishing) +- `app.config.ts`: Contains [Runtime Config](/guide/essentials/config/runtime) +- `package.json`: The standard file used by your package manager +- `tsconfig.json`: Config telling TypeScript how to behave +- `web-ext.config.ts`: Configure [Browser Startup](/guide/essentials/config/browser-startup) +- `wxt.config.ts`: The main config file for WXT projects + +## Adding a `src/` Directory + +Many developers like having a `src/` directory to separate source code from configuration files. You can enable it inside the `wxt.config.ts` file: + +```ts +// wxt.config.ts +export default defineConfig({ + srcDir: 'src', +}); +``` + +After enabling it, your project structure should look like this: + + +```html +📂 {rootDir}/ +📁 .output/ +📁 .wxt/ +📂 src/ + 📁 assets/ + 📁 components/ + 📁 composables/ + 📁 entrypoints/ + 📁 hooks/ + 📁 modules/ + 📁 public/ + 📁 utils/ + 📄 app.config.ts +📄 .env +📄 .env.publish +📄 package.json +📄 tsconfig.json +📄 web-ext.config.ts +📄 wxt.config.ts +``` + +## Customizing Other Directories + +You can configure the following directories: + + +```ts +// wxt.config.ts +export default defineConfig({ + // Relative to project root + srcDir: "src", // default: "." + outDir: "dist", // default: ".output" + + // Relative to srcDir + entrypointsDir: "entries", // default: "entrypoints" + modulesDir: "wxt-modules", // default: "modules" + publicDir: "static", // default: "public" +}) +``` + +You can use absolute or relative paths. diff --git a/docs/get-started/publishing.md b/docs/guide/essentials/publishing.md similarity index 84% rename from docs/get-started/publishing.md rename to docs/guide/essentials/publishing.md index f51373fd..7edf7d1d 100644 --- a/docs/get-started/publishing.md +++ b/docs/guide/essentials/publishing.md @@ -4,7 +4,7 @@ outline: deep # Publishing -WXT will help you ZIP your extensions and submit them to the stores for review. +WXT can ZIP your extension and submit it to various stores for review or for self-hosting. ## First Time Publishing @@ -18,7 +18,7 @@ For specific details about each store, see the stores sections below. ## Automation -WXT provides two commands to help automate the release process: +WXT provides two commands to help automate submitting a new version for review and publishing: - `wxt submit init`: Setup all the required secrets and options for the `wxt submit` command - `wxt submit`: Submit new versions of your extension for review (and publish them automatically once approved) @@ -27,7 +27,7 @@ To get started, run `wxt submit init` and follow the prompts. Once finished, you > In CI, make sure you add all the environment variables to the submit step. -To release an update, build all the ZIPs you plan on releasing: +To submit a new version for publishing, build all the ZIPs you plan on releasing: ```sh wxt zip @@ -36,29 +36,25 @@ wxt zip -b firefox Then run the `wxt submit` command, passing in all the ZIP files you want to release. In this case, we'll do a release for all 3 major stores: Chrome Web Store, Edge Addons, and Firefox Addons Store. -If it's your first time running the command, you'll want to test your secrets by passing the `--dry-run` flag: +If it's your first time running the command or you recently made changes to the release process, you'll want to test your secrets by passing the `--dry-run` flag. ```sh wxt submit --dry-run \ - --chrome-zip .output/--chrome.zip \ - --firefox-zip .output/--firefox.zip --firefox-sources-zip .output/--sources.zip \ - --edge-zip .output/--chrome.zip + --chrome-zip .output/{your-extension}-{version}-chrome.zip \ + --firefox-zip .output/{your-extension}-{version}-firefox.zip --firefox-sources-zip .output/{your-extension}-{version}-sources.zip \ + --edge-zip .output/{your-extension}-{version}-chrome.zip ``` If the dry run passes, remove the flag and do the actual release: ```sh wxt submit \ - --chrome-zip .output/--chrome.zip \ - --firefox-zip .output/--firefox.zip --firefox-sources-zip .output/--sources.zip \ - --edge-zip .output/--chrome.zip + --chrome-zip .output/{your-extension}-{version}-chrome.zip \ + --firefox-zip .output/{your-extension}-{version}-firefox.zip --firefox-sources-zip .output/{your-extension}-{version}-sources.zip \ + --edge-zip .output/{your-extension}-{version}-chrome.zip ``` -:::tip -If you only need to release to a single store, only pass that store's ZIP flag. -::: - -:::tip +:::warning See the [Firefox Addon Store](#firefox-addon-store) section for more details about the `--firefox-sources-zip` option. ::: @@ -133,9 +129,7 @@ wxt zip Firefox requires you to upload a ZIP of your source code. This allows them to rebuild your extension and review the code in a readable way. More details can be found in [Firefox's docs](https://extensionworkshop.com/documentation/publish/source-code-submission/). -WXT fully supports generating and automatically submitting a source code ZIP. - -When you run `wxt zip -b firefox`, your sources are zipped into the `.output` directory alongside the extension. WXT will automatically exclude certain files such as config files, hidden files, and tests. However, it's important to manually check the ZIP to ensure it only contains the files necessary to rebuild your extension. +When running `wxt zip -b firefox`, WXT will zip both your extension and sources. Certain files (such as config files, hidden files, and tests) are automatically excluded from your sources. However, it's important to manually check the ZIP to ensure it only contains the files necessary to rebuild your extension. To customize which files are zipped, add the `zip` option to your config file. @@ -181,7 +175,7 @@ Ensure that you have a `README.md` or `SOURCE_CODE_REVIEW.md` file with the abov Make sure the build output is the exact same when running `wxt build -b firefox` in your main project and inside the zipped sources. :::warning -If you use a `.env` files, they can effect the chunk hashes in the output directory. Either delete the .env file before running `wxt zip -b firefox`, or include it in your sources zip with the [`zip.includeSources`](/api/reference/wxt/interfaces/InlineConfig#includesources) option. Be careful to not include any secrets in your `.env` files. +If you use a `.env` files, they can affect the chunk hashes in the output directory. Either delete the .env file before running `wxt zip -b firefox`, or include it in your sources zip with the [`zip.includeSources`](/api/reference/wxt/interfaces/InlineConfig#includesources) option. Be careful to not include any secrets in your `.env` files. See Issue [#377](https://github.com/wxt-dev/wxt/issues/377) for more details. ::: @@ -205,7 +199,7 @@ export default defineConfig({ Depending on your package manager, the `package.json` in the sources zip will be modified to use the downloaded dependencies via the `overrides` or `resolutions` field. :::warning -WXT uses the command `npm pack ` to download the package. That means regardless of your package manager, you need to properly setup a `.npmrc` file. NPM and PNPM both respect `.npmrc` files, but Yarn and Bun have their own ways of authorizing private registries, so you'll need to add an `.npmrc` file. +WXT uses the command `npm pack ` to download the package. That means regardless of your package manager, you need to properly setup a `.npmrc` file. NPM and PNPM both respect `.npmrc` files, but Yarn and Bun have their own ways of authorizing private registries, so you'll need to add a `.npmrc` file. ::: ### Safari diff --git a/docs/guide/go-further/remote-code.md b/docs/guide/essentials/remote-code.md similarity index 100% rename from docs/guide/go-further/remote-code.md rename to docs/guide/essentials/remote-code.md diff --git a/docs/guide/extension-apis/scripting.md b/docs/guide/essentials/scripting.md similarity index 70% rename from docs/guide/extension-apis/scripting.md rename to docs/guide/essentials/scripting.md index 9565a739..53b8a304 100644 --- a/docs/guide/extension-apis/scripting.md +++ b/docs/guide/essentials/scripting.md @@ -1,12 +1,12 @@ -# `browser.scripting` +# Scripting -[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/api/scripting) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting) +[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/api/scripting) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting) Refer to the browser docs above for basics on how the API works. ## Execute Script Return Values -When using `browser.scripting.executeScript`, you can execute content scripts or unlisted scripts. To return a value, just return a value from the script's main function. +When using `browser.scripting.executeScript`, you can execute content scripts or unlisted scripts. To return a value, just return a value from the script's `main` function. ```ts // entrypoints/background.ts @@ -19,7 +19,7 @@ console.log(res); // "Hello John!" ```ts // entrypoints/injected.js -export default defineContentScript(() => { +export default defineUnlistedScript(() => { console.log('Script was injected!'); return 'Hello John!'; }); diff --git a/docs/guide/essentials/storage.md b/docs/guide/essentials/storage.md new file mode 100644 index 00000000..5213e115 --- /dev/null +++ b/docs/guide/essentials/storage.md @@ -0,0 +1,15 @@ +# Storage + +[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/api/storage) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) + +You can use the vanilla APIs (see docs above), use [WXT's built-in storage API](/storage), or install a package from NPM. + +## Alternatives + +1. [`wxt/storage`](/storage) (recommended): WXT ships with its own wrapper around the vanilla storage APIs that simplifies common use cases + +2. DIY: If you're migrating to WXT and already have a storage wrapper, keep using it. In the future, if you want to delete that code, you can use one of these alternatives, but there's no reason to replace working code during a migration. + +3. Any other NPM package: [There are lots of wrappers around the storage API](https://www.npmjs.com/search?q=chrome%20storage), you can find one you like. Here's some popular ones: + - [`webext-storage`](https://www.npmjs.com/package/webext-storage) - A more usable typed storage API for Web Extensions + - [`@webext-core/storage`](https://www.npmjs.com/package/@webext-core/storage) - A type-safe, localStorage-esque wrapper around the web extension storage APIs diff --git a/docs/guide/essentials/target-different-browsers.md b/docs/guide/essentials/target-different-browsers.md new file mode 100644 index 00000000..680042dd --- /dev/null +++ b/docs/guide/essentials/target-different-browsers.md @@ -0,0 +1,69 @@ +# Targeting Different Browsers + +When building an extension with WXT, you can create multiple builds of your extension targeting different browsers and manifest versions. + +## Target a Browser + +Use the `-b` CLI flag to create a separate build of your extension for a specific browser. By default, `chrome` is targetted. + +```sh +wxt # same as: wxt -b chrome +wxt -b firefox +wxt -b custom +``` + +Targeting a browser has several effects: + +1. During development, when passing `firefox`, WXT will automatically open Firefox with the extension installed. For all other browsers, it will open Chrome/Chromium +2. Changes build-time constants provided by WXT: + - `import.meta.env.BROWSER`: A string, the targeted browser + - `import.meta.env.CHROME`: A boolean equivalent to `import.meta.env.BROWSER === "chrome"` + - `import.meta.env.FIREFOX`: A boolean equivalent to `import.meta.env.BROWSER === "firefox"` + - `import.meta.env.EDGE`: A boolean equivalent to `import.meta.env.BROWSER === "edge"` + - `import.meta.env.SAFARI`: A boolean equivalent to `import.meta.env.BROWSER === "safari"` + - `import.meta.env.OPERA`: A boolean equivalent to `import.meta.env.BROWSER === "opera"` + +## Target a Manifest Version + +To target specific manifest versions, use the `--mv2` or `--mv3` CLI flags. + +:::tip Default Manifest Version +By default, WXT will target MV2 for Safari and Firefox and MV3 for all other browers. +::: + +To get the target manifest version at runtime, use the built-time constant provided by WXT: + +- `import.meta.env.MANIFEST_VERSION`: A number, either `2` or `3` + +## Filtering Entrypoints + +Every entrypoint can be included or excluded when targetting specific browsers via the `include` and `exclude` options. + +Here are some examples: + +- Content script only built when targetting `firefox`: + + ```ts + export default defineContentScript({ + include: ['firefox'], + + main(ctx) { + // ... + }, + }); + ``` + +- HTML file only built for all targets other than `chrome`: + ```html + + + + + + + + + + + + ``` diff --git a/docs/guide/essentials/testing-updates.md b/docs/guide/essentials/testing-updates.md new file mode 100644 index 00000000..e578778b --- /dev/null +++ b/docs/guide/essentials/testing-updates.md @@ -0,0 +1,28 @@ +# Testing Updates + +## Testing Permission Changes + +When `permissions`/`host_permissions` change during an update, depending on what exactly changed, the browser will disable your extension until the user accepts the new permissions. + +You can test if your permission changes will result in a disabled extension: + +- Chromium: Use [Google's Extension Update Testing tool](https://github.com/GoogleChromeLabs/extension-update-testing-tool) +- Firefox: See their [Test Permission Requests](https://extensionworkshop.com/documentation/develop/test-permission-requests/) page +- Safari: Everyone breaks something in production eventually... 🫡 Good luck soldier + +## Update Event + +You can setup a callback that runs after your extension updates like so: + +```ts +browser.runtime.onInstalled.addListener(({ reason }) => { + if (reason === 'update') { + // Do something + } +}); +``` + +If the logic is simple, write a unit test to cover this logic. If you feel the need to manually test this callback, you can either: + +1. In dev mode, remove the `if` statement and reload the extension from `chrome://extensions` +2. Use [Google's Extension Update Testing tool](https://github.com/GoogleChromeLabs/extension-update-testing-tool) diff --git a/docs/guide/essentials/unit-testing.md b/docs/guide/essentials/unit-testing.md new file mode 100644 index 00000000..43f38b5a --- /dev/null +++ b/docs/guide/essentials/unit-testing.md @@ -0,0 +1,80 @@ +# Unit Testing + +[[toc]] + +## Vitest + +WXT provides first class support for Vitest for unit testing: + +```ts +// vitest.config.ts +import { defineConfig } from 'vitest/config'; +import { WxtVitest } from 'wxt/testing'; + +export default defineConfig({ + plugins: [WxtVitest()], +}); +``` + +This plugin does several things: + +- Polyfills the extension API, `browser`, with an in-memory implementation using [`@webext-core/fake-browser`](https://webext-core.aklinker1.io/fake-browser/installation) +- Adds all vite config or plugins in `wxt.config.ts` +- Configures auto-imports (if enabled) +- Applies internal WXT vite plugins for things like [bundling remote code](/guide/essentials/remote-code) +- Sets up global variables provided by WXT (`import.meta.env.BROWSER`, `import.meta.env.MANIFEST_VERSION`, `import.meta.env.IS_CHROME`, etc) +- Configures aliases (`@/*`, `@@/*`, etc) so imports can be resolved + +Here are real projects with unit testing setup. Look at the code and tests to see how they're written. + +- [`aklinker1/github-better-line-counts`](https://github.com/aklinker1/github-better-line-counts) +- [`wxt-dev/examples`'s Vitest Example](https://github.com/wxt-dev/examples/tree/main/examples/vitest-unit-testing) + +### Example Tests + +This example demonstrates that you don't have to mock `browser.storage` (used by `wxt/storage`) in tests - [`@webext-core/fake-browser`](https://webext-core.aklinker1.io/fake-browser/installation) implements storage in-memory so it behaves like it would in a real extension! + +```ts +import { describe, it, expect } from 'vitest'; +import { fakeBrowser } from 'wxt/testing'; + +const accountStorage = storage.defineItem('local:account'); + +async function isLoggedIn(): Promise { + const value = await accountStorage.getValue(); + return value != null; +} + +describe('isLoggedIn', () => { + beforeEach(() => { + // See https://webext-core.aklinker1.io/fake-browser/reseting-state + fakeBrowser.reset(); + }); + + it('should return true when the account exists in storage', async () => { + const account: Account = { + username: '...', + preferences: { + // ... + }, + }; + await accountStorage.setValue(account); + + expect(await isLoggedIn()).toBe(true); + }); + + it('should return false when the account does not exist in storage', async () => { + await accountStorage.deleteValue(); + + expect(await isLoggedIn()).toBe(false); + }); +}); +``` + +## Other Testing Frameworks + +To use a different framework, you will likely have to disable auto-imports, setup import aliases, manually mock the extension APIs, and setup the test environment to support all of WXT's features that you use. + +It is possible to do, but will require a bit more setup. Refer to Vitest's setup for an example of how to setup a test environment: + +https://github.com/wxt-dev/wxt/blob/main/packages/wxt/src/testing/wxt-vitest-plugin.ts diff --git a/docs/guide/essentials/wxt-modules.md b/docs/guide/essentials/wxt-modules.md new file mode 100644 index 00000000..e7fa2d4e --- /dev/null +++ b/docs/guide/essentials/wxt-modules.md @@ -0,0 +1,242 @@ +# WXT Modules + +WXT provides a "module system" that let's you run code at different steps in the build process to modify it. + +[[toc]] + +## Adding a Module + +There are two ways to add a module to your project: + +1. **NPM**: install an NPM package, like [`@wxt-dev/auto-icons`](https://www.npmjs.com/package/@wxt-dev/auto-icons) and add it to your config: + ```ts + // wxt.config.ts + export default defineConfig({ + modules: ['@wxt-dev/auto-icons'], + }); + ``` + > Searching for ["wxt module"](https://www.npmjs.com/search?q=wxt%20module) on NPM is a good way to find published WXT modules. +2. **Local**: add a file to your project's `modules/` directory: + ``` + / + modules/ + my-module.ts + ``` + > To learn more about writing your own modules, read the [Writing Modules](/guide/essentials/wxt-modules) docs. + +## Module Options + +WXT modules may require or allow setting custom options to change their behavior. There are two types of options: + +1. **Build-time**: Any config used during the build process, like feature flags +2. **Runtime**: Any config accessed at runtime, like callback functions + +Build-time options are placed in your `wxt.config.ts`, while runtime options is placed in the [`app.config.ts` file](/guide/essentials/config/runtime). Refer to each module's documentation about what options are required and where they should be placed. + +If you use TypeScript, modules augment WXT's types so you will get type errors if options are missing or incorrect. + +## Writing Modules + +Here's what a basic WXT module looks like: + +```ts +import { defineWxtModule } from 'wxt/modules'; + +export default defineWxtModule({ + setup(wxt) { + // Your module code here... + }, +}); +``` + +Each module's setup function is executed after the `wxt.config.ts` file is loaded. The `wxt` object provides everything you need to write a module: + +- Use `wxt.hook(...)` to hook into the build's lifecycle and make changes +- Use `wxt.config` to get the resolved config from the project's `wxt.config.ts` file +- Use `wxt.logger` to log messages to the console +- and more! + +Refer to the [API reference](/api/reference/wxt/interfaces/Wxt) for a complete list of properties and functions available. + +Also to make sure and read about all the [hooks that are available](https://wxt.dev/api/reference/wxt/interfaces/WxtHooks) - they are essential to writing modules. + +### Recipes + +Modules are complex and require a deeper understanding of WXT's code and how it works. The best way to learn is by example. + +#### Update resolved config + +```ts +import { defineWxtModule } from 'wxt/modules'; + +export default defineWxtModule({ + setup(wxt) { + wxt.hook('ready', () => { + wxt.config.outDir = 'dist'; + }); + }, +}); +``` + +#### Add built-time config + +```ts +import { defineWxtModule } from 'wxt/modules'; +import 'wxt'; + +export interface MyModuleOptions { + // Add your build-time options here... +} +declare module 'wxt' { + export interface InlineConfig { + // Add types for the "myModule" key in wxt.config.ts + myModule: MyModuleOptions; + } +} + +export default defineWxtModule({ + configKey: 'myModule', + + // Build time config is available via the second argument of setup + setup(wxt, options) { + console.log(options); + }, +}); +``` + +#### Add runtime config + +```ts +import { defineWxtModule } from 'wxt/modules'; +import 'wxt/sandbox'; + +export interface MyModuleRuntimeOptions { + // Add your runtime options here... +} +declare module 'wxt/sandbox' { + export interface WxtAppConfig { + myModule: MyModuleOptions; + } +} +``` + +Runtime options are returned when calling + +```ts +const config = useAppConfig(); +console.log(config.myModule); +``` + +This is very useful when [generating runtime code](#generate-runtime-module). + +#### Generate output file + +```ts +import { defineWxtModule } from 'wxt/modules'; + +export default defineWxtModule({ + setup(wxt) { + // Relative to the output directory + const generatedFilePath = 'some-file.txt'; + + wxt.hook('build:publicAssets', (_, assets) => { + assets.push({ + relativeDest: generatedFilePath, + contents: 'some generated text', + }); + }); + + wxt.hook('build:manifestGenerated', (_, manifest) => { + manifest.web_accessible_resources ??= []; + manifest.web_accessible_resources.push({ + matches: ['*://*'], + resources: [generatedFilePath], + }); + }); + }, +}); +``` + +This file could then be loaded at runtime: + +```ts +const res = await fetch(browser.runtime.getURL('/some-text.txt')); +``` + +#### Generate runtime module + +Create a file in `.wxt`, add an alias to import it, and add auto-imports for exported variables. + +```ts +import { defineWxtModule } from 'wxt/modules'; +import { resolve } from 'node:path'; + +export default defineWxtModule({ + imports: [ + // Add auto-imports + { from: '#analytics', name: 'analytics' }, + { from: '#analytics', name: 'reportEvent' }, + { from: '#analytics', name: 'reportPageView' }, + ], + + setup(wxt) { + const analyticsModulePath = resolve( + wxt.config.wxtDir, + 'analytics/index.ts', + ); + const analyticsModuleCode = ` + import { createAnalytics } from 'some-module'; + + export const analytics = createAnalytics(useAppConfig().analytics); + export const { reportEvent, reportPageView } = analytics; + `; + + addAlias(wxt, '#analytics', analyticsModulePath); + + wxt.hook('prepare:types', async (_, entries) => { + entries.push({ + path: analyticsModulePath, + text: analyticsModuleCode, + }); + }); + }, +}); +``` + +#### Generate declaration file + +```ts +import { defineWxtModule } from 'wxt/modules'; +import { resolve } from 'node:path'; + +export default defineWxtModule({ + setup(wxt) { + const typesPath = resolve(wxt.config.wxtDir, 'my-module/types.d.ts'); + const typesCode = ` + // Declare global types, perform type augmentation + `; + + wxt.hook('prepare:types', async (_, entries) => { + entries.push({ + path: 'my-module/types.d.ts', + text: ` + // Declare global types, perform type augmentation, etc + `, + // IMPORTANT - without this line your declaration file will not be a part of the TS project: + tsReference: true, + }); + }); + }, +}); +``` + +### Example Modules + +You should also look through the code of modules other people have written and published. Here's some examples: + +- [`@wxt-dev/auto-icons`](https://github.com/wxt-dev/wxt/blob/main/packages/auto-icons) +- [`@wxt-dev/i18n`](https://github.com/wxt-dev/wxt/blob/main/packages/i18n) +- [`@wxt-dev/module-vue`](https://github.com/wxt-dev/wxt/blob/main/packages/module-vue) +- [`@wxt-dev/module-solid`](https://github.com/wxt-dev/wxt/blob/main/packages/module-solid) +- [`@wxt-dev/module-react`](https://github.com/wxt-dev/wxt/blob/main/packages/module-react) +- [`@wxt-dev/module-svelte`](https://github.com/wxt-dev/wxt/blob/main/packages/module-svelte) diff --git a/docs/guide/extension-apis/i18n.md b/docs/guide/extension-apis/i18n.md deleted file mode 100644 index e02e0134..00000000 --- a/docs/guide/extension-apis/i18n.md +++ /dev/null @@ -1,56 +0,0 @@ -# Internationalization - -This guide is for using the vanilla, `browser.i18n` APIs. There are two other alternatives: - -1. [`@wxt-dev/i18n`](/guide/i18n/installation) - a wrapper around `browser.i18n` APIs with additional features, a simplified localization file format, and editor support -2. Third party packages - You can use any i18n package on NPM, most of which are more feature rich than `browser.i18n` and `@wxt-dev/i18n` - -:::info -Currently, using the `browser.i18n` APIs are the recommended approach. WXT has some built-in support for them and they work well enough. `@wxt-dev/i18n` was recently released, and it will become the recommended approach after some of the bugs have been worked out. Head over to [it's docs](/guide/i18n/introduction.md) to learn more. -::: - -## Setup - -First familiarize yourself with [Chrome's docs](https://developer.chrome.com/docs/extensions/reference/api/i18n). The only difference when using these APIs with WXT is where you put the localization files - in the [`public` directory](/guide/directory-structure/public/). - -``` -/ -└─ public/ - └─ _locales/ - ├─ en/ - │ └─ messages.json - ├─ de/ - │ └─ messages.json - └─ ko/ - └─ messages.json -``` - -Next, to set a `default_locale` on your manifest, add it to your `wxt.config.ts` file: - -```ts -// wxt.config.ts -export default defineConfig({ - manifest: { - default_locale: 'en', - name: '__MSG_extName__', - description: '__MSG_extDescription__', - }, -}); -``` - -> You can localize the `name` and `description` of your extension from the `manifest` config as well. - -Finally, to get a translation, call `browser.i18n.getMessage`: - -```ts -browser.i18n.getMessage('extName'); -browser.i18n.getMessage('extDescription'); -browser.i18n.getMessage(/* etc */); -``` - -## Examples - -See the official localization examples for more details: - -- [I18n](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vanilla-i18n#readme) -- [Vue I18n](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vue-i18n#readme) diff --git a/docs/guide/extension-apis/messaging.md b/docs/guide/extension-apis/messaging.md deleted file mode 100644 index a55f1355..00000000 --- a/docs/guide/extension-apis/messaging.md +++ /dev/null @@ -1,36 +0,0 @@ -# Messaging - -## Overview - -Follow [Chrome's message passing guide](https://developer.chrome.com/docs/extensions/mv3/messaging/) to understand how message passing works in web extensions. In Google's examples, just replace `chrome` with `browser`, and it will work in WXT. - -Here's a basic request/response example: - -```ts -// popup/main.ts -const res = await browser.runtime.sendMessage('ping'); - -console.log(res); // "pong" -``` - -```ts -// background.ts -export default defineBackground(() => { - browser.runtime.onMessage.addListener((message, sender, sendResponse) => { - console.log(message); // "ping" - - // Wait 1 second and respond with "pong" - setTimeout(() => sendResponse('pong'), 1000); - return true; - }); -}); -``` - -## Third Party Libraries - -There are a number of message passing libraries you can use to improve the message passing experience. - -- [`@webext-core/messaging`](https://webext-core.aklinker1.io/guide/messaging/) - "A light-weight, type-safe wrapper around the `browser.runtime` messaging APIs" -- [`@webext-core/proxy-service`](https://webext-core.aklinker1.io/guide/proxy-service/) - "Create RPC-like services that can be called from anywhere but run in the background" -- [`webext-bridge`](https://github.com/zikaari/webext-bridge) - "Messaging in Web Extensions made super easy. Out of the box." -- [`trpc-chrome`](https://www.npmjs.com/package/trpc-chrome) - "tRPC adapter for Web Extensions 🧩" diff --git a/docs/guide/extension-apis/others.md b/docs/guide/extension-apis/others.md deleted file mode 100644 index db707c98..00000000 --- a/docs/guide/extension-apis/others.md +++ /dev/null @@ -1,5 +0,0 @@ -# All Other APIs - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/go-further/custom-events.md b/docs/guide/go-further/custom-events.md deleted file mode 100644 index 9963a574..00000000 --- a/docs/guide/go-further/custom-events.md +++ /dev/null @@ -1,5 +0,0 @@ -# Custom Events - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/go-further/debugging.md b/docs/guide/go-further/debugging.md deleted file mode 100644 index 26920e60..00000000 --- a/docs/guide/go-further/debugging.md +++ /dev/null @@ -1,5 +0,0 @@ -# Debugging - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/go-further/entrypoint-loaders.md b/docs/guide/go-further/entrypoint-loaders.md deleted file mode 100644 index 4f295390..00000000 --- a/docs/guide/go-further/entrypoint-loaders.md +++ /dev/null @@ -1,120 +0,0 @@ -# Entrypoint Loaders - -Because entrypoint options, like content script `matches`, are listed in the entrypoint's JS file, WXT has to import them during the build process to use those options when generating the manifest. - -There are two options for loading your entrypoints: - -1. `vite-node` - default as of `v0.19.0` -2. `jiti` (**DEPRECATED, will be removed in `v0.20.0`**) - Default before `v0.19.0` - -## vite-node - -Since 0.19.0, WXT uses `vite-node`, the same tool that powers Vitest and Nuxt, to import your entrypoint files. - -If you use any runtime packages that depend on `webextension-polyfill`, you need to add them to [Vite's `ssr.noExternal` option](https://vitejs.dev/config/ssr-options#ssr-noexternal): - -```ts -export default defineConfig({ - vite: () => ({ - ssr: { - noExternal: ['@webext-core/messaging', '@webext-core/proxy-service'], - }, - }), -}); -``` - -:::details Why? -This tells Vite it needs process these module's, letting WXT properly disable the polyfill in the NodeJS environment so it doesn't cause any build errors like this: - -``` -ERROR This script should only be loaded in a browser extension -``` - -::: - -To get a list of installed packages that use on `webextension-polyfill`, run your package manager's `list` command. Here's an example with PNPM: - -```sh -$ pnpm why webextension-polyfill - -dependencies: -@webext-core/messaging 1.4.0 -└── webextension-polyfill 0.10.0 -@webext-core/proxy-service 1.2.0 -├─┬ @webext-core/messaging 1.4.0 peer -│ └── webextension-polyfill 0.10.0 -└── webextension-polyfill 0.12.0 peer - -devDependencies: -@wxt-dev/module-vue 1.0.0 -└─┬ wxt 0.19.0-alpha1 peer - └── webextension-polyfill 0.12.0 -webextension-polyfill 0.12.0 -wxt 0.19.0-alpha1 -└── webextension-polyfill 0.12.0 -``` - -Ignoring WXT itself (it's added automatically for you), there are three packages that depend on the polyfill: `@wxt-dev/module-vue`, `@webext-core/messaging`, and `@webext-core/proxy-service`. Since the vue module is a build dependency, with no runtime code, you don't have to add it. That means for this case, you need to add `@webext-core/messaging`, and `@webext-core/proxy-service`, as shown in the original code snippet. - -## jiti - -The original method WXT used to import TS files. However, because it doesn't support vite plugins like `vite-node`, there is one main caveot to it's usage: **_module side-effects_**. - -To enable `jiti`: - -```ts -export default defineConfig({ - entrypointLoader: 'jiti', -}); -``` - -You cannot use imported variables outside the `main` function in JS entrypoints. This includes options, as shown below: - -```ts -// entrypoints/content.ts -import { GOOGLE_MATCHES } from '~/utils/match-patterns'; - -export default defineContentScript({ - matches: GOOGLE_MATCHES, - main() { - // ... - }, -}); -``` - -``` -$ wxt build -wxt build - -WXT 0.14.1 -ℹ Building chrome-mv3 for production with Vite 5.0.5 -✖ Command failed after 360 ms - -[8:55:54 AM] ERROR entrypoints/content.ts: Cannot use imported variable "GOOGLE_MATCHES" before main function. See https://wxt.dev/guide/entrypoints.html#side-effects -``` - -This throws an error because WXT needs to import each entrypoint during the build process to extract its definition (containing the `match`, `runAt`, `include`/`exclude`, etc.) to render the `manifest.json` correctly. Before loading an entrypoint, a transformation is applied to remove all imports. This prevents imported modules (local or NPM) with side-effects from running during the build process, potentially throwing an error. - -:::details Why? - -When importing your entrypoint to get its definition, the file is imported in a **_node environment_**, and doesn't have access to the `window`, `chrome`, or `browser` globals a web extension usually has access to. If WXT doesn't remove all the imports from the file, the imported modules could try and access one of these variables, throwing an error. - -::: - -:::warning -See [`wxt-dev/wxt#336`](https://github.com/wxt-dev/wxt/issues/336) to track the status of this bug. -::: - -Usually, this error occurs when you try to extract options into a shared file or try to run code outside the `main` function. To fix the example from above, use literal values when defining an entrypoint instead of importing them: - -```ts -import { GOOGLE_MATCHES } from '~/utils/match-patterns'; // [!code --] - -export default defineContentScript({ - matches: GOOGLE_MATCHES, // [!code --] - matches: ['*//*.google.com/*'], // [!code ++] - main() { - // ... - }, -}); -``` diff --git a/docs/guide/go-further/es-modules.md b/docs/guide/go-further/es-modules.md deleted file mode 100644 index ad9a859f..00000000 --- a/docs/guide/go-further/es-modules.md +++ /dev/null @@ -1,40 +0,0 @@ -# ES Modules - -Configure entrypoints to use ESM at runtime. - -Currently, ESM entrypoints are opt-in, so you must configure each entrypoint with that in mind. - -## HTML Pages - -In general, you should always make HTML pages import ESM scripts, unless you need to support old browsers. - -To make a script ESM, add `type="module"`: - - -```html - - -``` - -## Background - -In your background script, set `type: "module"`: - -```ts -export default defineBackground({ - type: 'module', // !code ++ - main() { - // ... - }, -}); -``` - -:::warning -Only MV3 support ESM background scripts/service workers. When targeting MV2, the `type` option is ignored and the background is always bundled into a single file as IIFE. -::: - -## Content Scripts - -WXT does not include built-in support for ESM content scripts. There are several technical issues that make implementing a generic solution impossible. See [Content Script ESM Support #357](https://github.com/wxt-dev/wxt/issues/357) for details. - -Instead, depending on your requirements, you can implement ESM support manually. See the [ESM Content Script UI](https://github.com/wxt-dev/examples/tree/main/examples/esm-content-script-ui) example to get started. diff --git a/docs/guide/go-further/handling-updates.md b/docs/guide/go-further/handling-updates.md deleted file mode 100644 index 63f39d2f..00000000 --- a/docs/guide/go-further/handling-updates.md +++ /dev/null @@ -1,77 +0,0 @@ -# Handling Extension Updates - -When releasing an update to your extension, there's a couple of things you need to keep in mind: - -[[toc]] - -## Content Script Cleanup - -Old content scripts are not automatically stopped when an extension updates and reloads. Often, this leads to "Invalidated context" errors in production when a content script from an old version of your extension tries to use an extension API. - -WXT provides a utility for handling this process: `ContentScriptContext`. An instance of this class is provided to you automatically inside the `main` function of each content script. - -When your extension updates or reloads, the context will become invalidated, and will trigger any `ctx.onInvalidated` listeners you add: - -```ts -export default defineContentScript({ - main(ctx) { - ctx.onInvalidated(() => { - // Do something - }); - }, -) -``` - -The `ctx` also provides other convenient APIs for stopping your content script without manually calling `onInvalidated` to add a listener: - -1. Setting timers: - ```ts - ctx.setTimeout(() => { ... }, ...); - ctx.setInterval(() => { ... }, ...); - ctx.requestAnimationFrame(() => { ... }); - ``` -1. Adding DOM events: - ```ts - ctx.addEventListener(window, "mousemove", (event) => { ... }); - ``` -1. Implements [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) for canceling standard APIs: - ```ts - fetch('...', { - signal: ctx.signal, - }); - ``` - -Other WXT APIs require a `ctx` object so they can clean themselves up. For example, [`createIntegratedUi`](/guide/key-concepts/content-script-ui#integrated), [`createShadowRootUi`](/guide/key-concepts/content-script-ui#shadow-root), and [`createIframeUi`](/guide/key-concepts/content-script-ui#iframe) automatically unmount and stop a UI when the script is invalidated. - -:::warning -When working with content scripts, **you should always use the `ctx` object to stop any async or future work.** - -This prevents old content scripts from interfering with new content scripts, and prevents error messages from being logged to the console in production. -::: - -## Testing Permission Changes - -When `permissions`/`host_permissions` change during an update, depending on what exactly changed, the browser will disable your extension until the user accepts the new permissions. - -You can test if your permission changes will result in a disabled extension: - -- Chromium: Use [Google's Extension Update Testing tool](https://github.com/GoogleChromeLabs/extension-update-testing-tool) -- Firefox: See their [Test Permission Requests](https://extensionworkshop.com/documentation/develop/test-permission-requests/) page -- Safari: Everyone breaks something in production eventually... 🫡 Good luck soldier - -## Update Event - -You can setup a callback that runs after your extension updates like so: - -```ts -browser.runtime.onInstalled.addListener(({ reason }) => { - if (reason === 'update') { - // Do something - } -}); -``` - -If the logic is simple, write a unit test to cover this logic. If you feel the need to manually test this callback, you can either: - -1. In dev mode, remove the `if` statement and reload the extension from `chrome://extensions` -2. Use [Google's Extension Update Testing tool](https://github.com/GoogleChromeLabs/extension-update-testing-tool) diff --git a/docs/guide/go-further/reusable-modules.md b/docs/guide/go-further/reusable-modules.md deleted file mode 100644 index 50aaf8f0..00000000 --- a/docs/guide/go-further/reusable-modules.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -outline: deep ---- - -# Reusable Modules - -## Overview - -WXT provides a "module" API that lets you modify the build process. This API lets you add entrypoints, inject runtime code, add vite plugins, and more! - -What's more, these modules can be shared on NPM and re-used between projects! - -## Adding a Module - -There are two ways to add a module to your project: - -1. **Local file**: Any file present in the `modules/` directory will be treated as a module and loaded at build-time by WXT. You can use `modules/*.ts` or `modules/*/index.ts`, similar to entrypoints. - - ```ts - // modules/example.ts - import { defineWxtModule } from 'wxt/modules'; - - export default defineWxtModule((wxt) => { - // ... - }); - ``` - -2. **NPM package**: Find WXT modules on NPM and include them in your project: - ```ts - // wxt.config.ts - export default defineConfig({ - // Add the module to your project - modules: ['@wxt-dev/auto-icons'], - }); - ``` - -## Writing Modules - -Modules contain a setup function that is executed at the beginning of the build process. - -:::code-group - -```ts [Function Definition] -import { defineWxtModule } from 'wxt/modules'; - -export default defineWxtModule((wxt) => { - // ... -}); -``` - -```ts [Object Definition] -import { defineWxtModule } from 'wxt/modules'; - -export default defineWxtModule({ - // Add metadata... - setup(wxt) { - // ... - }, -}); -``` - -::: - -### Module Options - -You can define custom options for your module by setting the `configKey`: - -```ts -// modules/analytics.ts -import { defineWxtModule } from 'wxt/modules'; - -export default defineWxtModule({ - configKey: 'analytics', - setup(wxt, options) { - console.log(options); // { clientId: "..." } - }, -}); - -// Define the option types -export interface AnalyticsModuleOptions { - clientId: string; -} - -// Use "module augmentation" to add types for the new key -declare module 'wxt' { - export interface InlineConfig { - analytics: AnalyticsModuleOptions; - } -} -``` - -Now, when the user provides options to the `analytics` key in their `wxt.config.ts`, those options are passed into the setup function as the second argument. - -```ts -export default defineConfig({ - analytics: { clientId: '...' }, -}); -``` - -### Actually Doing Something - -The first argument of the setup function, `wxt`, provides full access to the current build's context. You can access the resolved configuration via `wxt.config`, or setup hooks to manipulate the build at different steps of the build process with `wxt.hooks`. - -Here's an example that updates the `outDir` based on the build mode. It's a very simple example of how to access config and setup a hook. - -```ts -export default defineWxtModule((wxt) => { - if (wxt.config.mode === 'development') { - // Use the "ready" hook to update wxt.config - wxt.hooks.hook('ready', (wxt) => { - wxt.config.outDir = wxt.config.outDir.replace('.output', '.output/dev'); - }); - } -}); -``` - -:::info Async Modules -Both the `setup` function and hook callbacks can be async. Don't forget to add `await`! -::: - -It's important to understand the basics of how hooks work. Make sure to read the [API reference](/api/reference/wxt/interfaces/WxtHooks.html) for the full list of hooks and what they should be used for. They are the key to modifying your extension. - -### Module Utils - -Additionally, WXT provides several helper functions that setup hooks behind the scenes to streamline common operations. - -For example, if you want to include an entrypoint from inside a module, you can use the `addEntrypoint` util: - -```ts -// modules/changelog.ts -import { defineWxtModule, addEntrypoint } from 'wxt/modules'; -import { resolve } from 'node:path'; - -export default defineWxtModule({ - name: 'changelog', - setup(wxt) { - addEntrypoint(wxt, { - type: 'unlisted-page', - name: 'changelog', - // Point to the "modules/changelog.html" file - inputPath: resolve(__dirname, 'changelog.html'), - outputDir: wxt.config.outDir, - options: {}, - }); - }, -}); -``` - -Refer to the [API reference](/api/reference/wxt/modules/#functions) for the full list of the utilities. - -## Plugins - -Whereas modules are executed at build-time, plugins are executed at runtime. As of now, the only way to add a plugin is with the `addWxtPlugin` helper inside a module. - -Here's a minimal example to execute something at runtime. - -:::code-group - -```ts [modules/example/index.ts] -import { defineWxtModule, addWxtPlugin } from 'wxt/modules'; -import { resolve } from 'node:path'; - -export default defineWxtModule((wxt) => { - addWxtPlugin(wxt, resolve(__dirname, 'plugin.ts')); -}); -``` - -```ts [modules/example/plugin.ts] -import { defineWxtPlugin } from 'wxt/sandbox'; - -export default defineWxtPlugin(() => { - console.log('Executing plugin!'); -}); -``` - -::: - -:::warning Async Plugins -Unlike modules, **_plugins cannot be async_**!! If you need to do some async work and expose that result to the rest of the extension, store the result's promise synchronously and await it later on. -::: - -## Publishing to NPM - -:::warning 🚧 Under construction -These docs will be coming soon! -::: diff --git a/docs/guide/go-further/testing.md b/docs/guide/go-further/testing.md deleted file mode 100644 index 8c5f2300..00000000 --- a/docs/guide/go-further/testing.md +++ /dev/null @@ -1,27 +0,0 @@ -# Testing - -## Official Frameworks - -WXT officially supports [Vitest](https://vitest.dev/) for unit tests and either [Playwright](https://playwright.dev/) or [Puppeteer](https://pptr.dev/) for E2E tests against Chromium browsers. - -For details setting up each testing framework, see the official examples: - -- [Vitest](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vanilla-vitest#readme) -- [Playwright](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vanilla-playwright#readme) -- [Puppeteer](https://github.com/wxt-dev/wxt-examples/tree/main/examples/vanilla-puppeteer#readme) - -### Unofficial Frameworks - -Puppeteer and Playwright are the only E2E test runners that support Chrome Extensions. There are no other options at the time of writing. - -There are other options for unit tests however, like [Jest](https://jestjs.io/), [Mocha](https://mochajs.org/), or [`node:test`](https://nodejs.org/api/test.html). **_WXT does not claim to support any of them_** because none of them support all of WXT's features, like TypeScript or auto-imports. - -If you want to try to use a different framework for unit tests, you will need to configure the environment manually: - -- **Auto-imports**: Add `unimport` to your test environment or disable them by setting `imports: false` in your `wxt.config.ts` file -- **`browser` mock**: Mock the `webextension-polyfill` module globally with `wxt/dist/virtual/mock-browser.mjs` -- **[Remote Code Bundling](/guide/go-further/remote-code)**: If you use it, configure your environment to handle the `url:` module prefix -- **Global Variables**: If you consume them, manually define globals provided by WXT (like `import.meta.env.BROWSER`) by adding them to the global scope before accessing them (`import.meta.env.BROWSER = "chrome"`) -- **Import paths**: If you use the `@/` or `~/` path aliases, add them to your test environment - -[Here's how Vitest is configured](https://github.com/wxt-dev/wxt/blob/main/packages/wxt/src/testing/wxt-vitest-plugin.ts) for reference. diff --git a/docs/guide/go-further/vite.md b/docs/guide/go-further/vite.md deleted file mode 100644 index 98e67d10..00000000 --- a/docs/guide/go-further/vite.md +++ /dev/null @@ -1,39 +0,0 @@ -# Vite - -Under the hood, WXT uses Vite to bundle your web extension. - -## Basic Vite Configuration - -All of Vite's config can be customized by setting the `vite` configuration in your `wxt.config.ts` file. - -```ts -import { defineConfig } from 'wxt'; - -export default defineConfig({ - vite: () => ({ - // Same as `defineConfig({ ... })` inside vite.config.ts - }), -}); -``` - -## Using Plugins - -Plugins can be passed into the `vite` configuration in your `wxt.config.ts` file, just like any other option. - -```ts -import { defineConfig } from 'wxt'; - -export default defineConfig({ - vite: () => ({ - plugins: [ - // ... - ], - }), -}); -``` - -:::warning UNEXPECTED BEHAVIOR -Due to the way WXT orchestrates Vite builds, some plugins may not work as expected. Search [GitHub issues](https://github.com/wxt-dev/wxt/issues?q=is%3Aissue+label%3A%22vite+plugin%22) if you run into issues with a specific plugin. - -If one doesn't exist, please open a [new issue](https://github.com/wxt-dev/wxt/issues/new/choose)! -::: diff --git a/docs/guide/i18n/build-integrations.md b/docs/guide/i18n/build-integrations.md deleted file mode 100644 index 0dd9aba2..00000000 --- a/docs/guide/i18n/build-integrations.md +++ /dev/null @@ -1,82 +0,0 @@ -# Build Integrations - -To use the custom messages file format, you'll need to use `@wxt-dev/i18n/build` to transform the custom format to the one expected by browsers. - -Here's a list of build tools that already have an integration: - -[[toc]] - -:::info -If you want to contribute, please do! In particular, an `unplugin` integration would be awesome! -::: - -## WXT - -See [Installation with WXT](./installation#with-wxt). - -But TLDR, all you need is: - -```ts -// wxt.config.ts -export default defineConfig({ - modules: ['@wxt-dev/i18n/module'], -}); -``` - -Types are generated whenever you run `wxt prepare` or another build command: - -```sh -wxt prepare -wxt -wxt build -wxt zip -# etc -``` - -## Custom - -If you're not using WXT, you'll have to pre-process the localization files yourself. Here's a basic script to generate the `_locales/.../messages.json` and `wxt-i18n-structure.d.ts` files: - -```ts -// build-i18n.js -import { - parseMessagesFile, - generateChromeMessagesFile, - generateTypeFile, -} from '@wxt-dev/i18n/build'; - -// Read your localization files -const messages = { - en: await parseMessagesFile('path/locales/en.yml'), - de: await parseMessagesFile('path/locales/de.yml'), - // ... -}; - -// Generate JSON files for the browser -await generateChromeMessagesFile('dist/_locales/en/messages.json', messages.en); -await generateChromeMessagesFile('dist/_locales/de/messages.json', messages.de); -// ... - -// Generate a types file based on your default_locale -await generateTypeFile('wxt-i18n-structure.d.ts', messages.en); -``` - -Then run the script: - -```sh -node generate-i18n.js -``` - -If your build tool has a dev mode, you'll also want to rerun the script whenever you change a localization file. - -### Type Safety - -Once you've generated `wxt-i18n-structure.d.ts` (see the [Custom](#custom) section), you can use it to pass the generated type into `createI18n`: - -```ts -import type { WxtI18nStructure } from './wxt-i18n-structure'; - -export const i18n = createI18n(); -``` - -And just like that, you have type safety! diff --git a/docs/guide/i18n/editor-support.md b/docs/guide/i18n/editor-support.md deleted file mode 100644 index 704ab104..00000000 --- a/docs/guide/i18n/editor-support.md +++ /dev/null @@ -1,48 +0,0 @@ -# Editor Support - -For better DX, you can configure your editor with plugins and extensions. - -[[toc]] - -## VS Code - -Install the [I18n Ally Extension](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) to: - -- Go to translation definition -- Inline previews of text -- Hover to see other translations - -You'll need to configure it the extension so it knows where your localization files are and what function represents getting a translation: - -`.vscode/i18n-ally-custom-framework.yml`: - -```yml -# An array of strings which contain Language Ids defined by VS Code -# You can check available language ids here: https://code.visualstudio.com/docs/languages/identifiers -languageIds: - - typescript - -# Look for t("...") -usageMatchRegex: - - "[^\\w\\d]t\\(['\"`]({key})['\"`]" - -# Disable other built-in i18n ally frameworks -monopoly: true -``` - -`.vscode/settings.json`: - -```json -{ - "i18n-ally.localesPaths": ["src/locales"], - "i18n-ally.keystyle": "nested" -} -``` - -## Zed - -As of time of writing, Aug 18, 2024, no extensions exist for Zed to add I18n support. - -## IntelliJ - -Unknown - Someone who uses IntelliJ will have to open a PR for this! diff --git a/docs/guide/i18n/installation.md b/docs/guide/i18n/installation.md deleted file mode 100644 index f1779ffd..00000000 --- a/docs/guide/i18n/installation.md +++ /dev/null @@ -1,81 +0,0 @@ -# Installation - -[[toc]] - -### With WXT - -1. Install `@wxt-dev/i18n` via your package manager: - - ```sh - pnpm i @wxt-dev/i18n - ``` - -2. Add the WXT module to your `wxt.config.ts` file and setup a default locale: - - ```ts - export default defineConfig({ - modules: ['@wxt-dev/i18n/module'], - manifest: { - default_locale: 'en', - }, - }); - ``` - -3. Create a localization file at `/locales/.yml` or move your existing localization files there. - - ```yml - # /locales/en.yml - helloWorld: Hello world! - ``` - - :::tip - `@wxt-dev/i18n` supports the standard messages format, so if you already have localization files at `/public/_locale//messages.json`, you don't need to convert them to YAML or refactor them - just move them to `/locales/.json` and they'll just work out of the box! - ::: - -4. To get a translation, use the auto-imported `i18n` object or import it manually: - - ```ts - import { i18n } from '#i18n'; - - i18n.t('helloWorld'); // "Hello world!" - ``` - -And you're done! Using WXT, you get type-safety out of the box. - -### Without WXT - -1. Install `@wxt-dev/i18n` via your package manager: - - ```sh - pnpm i @wxt-dev/i18n - ``` - -2. Create a messages file at `_locales//messages.json` or move your existing translations there: - - ```json - { - "helloWorld": { - "message": "Hello world!" - } - } - ``` - - :::info - For the best DX, you should to integrate `@wxt-dev/i18n` into your build process. This enables: - - 1. Plural forms - 2. Simple messages file format - 3. Type safety - - See [Build Integrations](./build-integrations) to set it up. - ::: - -3. Create the `i18n` object, export it, and use it wherever you want! - - ```ts - import { createI18n } from '@wxt-dev/i18n'; - - export const i18n = createI18n(); - - i18n.t('helloWorld'); // "Hello world!"; - ``` diff --git a/docs/guide/i18n/introduction.md b/docs/guide/i18n/introduction.md deleted file mode 100644 index 37404dda..00000000 --- a/docs/guide/i18n/introduction.md +++ /dev/null @@ -1,22 +0,0 @@ -# Introduction - -:::info -You don't have to use `wxt` to use this package - it will work in any bundler setup. See [Installation without WXT](./installation#without-wxt) for more details. -::: - -`@wxt-dev/i18n` is a simple, type-safe wrapper around the `browser.i18n` APIs. It provides several benefits over the standard API: - -1. Simple messages file format -2. Plural form support -3. Integrates with the [I18n Ally VS Code extension](./editor-support#vscode) - -It also provides several benefits over other non-web extension specific i18n packages: - -1. Does not bundle localization files into every entrypoint -2. Don't need to fetch the localization files asynchronously -3. Can localize extension name in manifest -4. Can access localized strings inside CSS files - -However, it does have one major downside: - -1. Like the `browser.i18n` API, to change the language, users must change the browser's language diff --git a/docs/guide/i18n/messages-file-format.md b/docs/guide/i18n/messages-file-format.md deleted file mode 100644 index f6e699d9..00000000 --- a/docs/guide/i18n/messages-file-format.md +++ /dev/null @@ -1,170 +0,0 @@ -# Messages File Format - -You can only use the file format discussed on this page if you have [integrated `@wxt-dev/i18n` into your build process](./build-integrations). If you have not integrated it into your build process, you must use JSON files in the `_locales` directory, like a normal web extension. - -[[toc]] - -## File Extensions - -You can define your messages in several different file types: - -- `.yml` -- `.yaml` -- `.json` -- `.jsonc` -- `.json5` -- `.toml` - -## Nested Keys - -You can have translations at the top level or nest them into groups: - -```yml -ok: OK -cancel: Cancel -welcome: - title: Welcome to XYZ -dialogs: - confirmation: - title: 'Are you sure?' -``` - -To access a nested key, use `.`: - -```ts -i18n.t('ok'); // "OK" -i18n.t('cancel'); // "Cancel" -i18n.t('welcome.title'); // "Welcome to XYZ" -i18n.t('dialogs.confirmation.title'); // "Are you sure?" -``` - -## Substitutions - -Because `@wxt-dev/i18n` is based on `browser.i18n`, you define substitutions the same way, with `$1`-`$9`: - -```yml -hello: Hello $1! -order: Thanks for ordering your $1 -``` - -### Escapting `$` - -To escape the dollar sign, put another `$` in front of it: - -```yml -dollars: $$$1 -``` - -```ts -i18n.t('dollars', ['1.00']); // "$1.00" -``` - -## Plural Forms - -:::warning -Plural support languages like Arabic, that have different forms for "few" or "many", is not supported right now. Feel free to open a PR if you are interested in this! -::: - -To get a different translation based on a count: - -```yml -items: - 1: 1 item - n: $1 items -``` - -Then you pass in the count as the second argument to `i18n.t`: - -```ts -i18n.t('items', 0); // "0 items" -i18n.t('items', 1); // "1 item" -i18n.t('items', 2); // "2 items" -``` - -To add a custom translation for 0 items: - -```yml -items: - 0: No items - 1: 1 item - n: $1 items -``` - -```ts -i18n.t('items', 0); // "No items" -i18n.t('items', 1); // "1 item" -i18n.t('items', 2); // "2 items" -``` - -If you need to pass a custom substitution for `$1` instead of the count, just add the substitution: - -```yml -items: - 0: No items - 1: $1 item - n: $1 items -``` - -```ts -i18n.t('items', 0, ['Zero']); // "No items" -i18n.t('items', 1, ['One']); // "One item" -i18n.t('items', 2, ['Multiple']); // "Multiple items" -``` - -## Verbose Keys - -`@wxt-dev/i18n` is compatible with the message format used by [`browser.i18n`](https://developer.chrome.com/docs/extensions/reference/api/i18n). - -:::info -This means if you're migrating to `@wxt-dev/i18n` and you're already using the verbose format, you don't have to change anything! -::: - -A key is treated as "verbose" when it is: - -1. At the top level (not nested) -2. Only contains the following properties: `message`, `description` and/or `placeholder` - -:::code-group - -```json [JSON] -{ - "appName": { - "message": "GitHub - Better Line Counts", - "description": "The app's name, should not be translated", - }, - "ok": "OK", - "deleteConfirmation": { - "title": "Delete XYZ?" - "message": "You cannot undo this action once taken." - } -} -``` - -```yml [YAML] -appName: - message: GitHub - Better Line Counts - description: The app's name, should not be translated -ok: OK -deleteConfirmation: - title: Delete XYZ? - message: You cannot undo this action once taken. -``` - -::: - -In this example, only `appName` is considered verbose. `deleteConfirmation` is not verbose because it contains the additional property `title`. - -```ts -i18n.t('appName'); // ✅ "GitHub - Better Line Counts" -i18n.t('appName.message'); // ❌ -i18n.t('ok'); // ✅ "OK" -i18n.t('deleteConfirmation'); // ❌ -i18n.t('deleteConfirmation.title'); // ✅ "Delete XYZ?" -i18n.t('deleteConfirmation.message'); // ✅ "You cannot undo this action once taken." -``` - -If this is confusing, don't worry! With type-safety, you'll get a type error if you do it wrong. If type-safety is disabled, you'll get a runtime warning in the devtools console. - -:::warning -Using the verbose format is not recommended. I have yet to see a translation service and software that supports this format out of the box. Stick with the simple format when you can. -::: diff --git a/docs/guide/installation.md b/docs/guide/installation.md new file mode 100644 index 00000000..1f59ad49 --- /dev/null +++ b/docs/guide/installation.md @@ -0,0 +1,123 @@ +# Installation + +Bootstrap a new project, start from scratch, or [migrate an existing project](/guide/resources/migrate). + +[[toc]] + +## Bootstrap Project + +Run the [`init` command](/api/cli/wxt-init), and follow the instructions. + +:::code-group + +```sh [PNPM] +pnpm dlx wxt@latest init +``` + +```sh [Bun] +bunx wxt@latest init +``` + +```sh [NPM] +npx wxt@latest init +``` + +```sh [Yarn] +# Use NPM initially, but select Yarn when prompted +npx wxt@latest init +``` + +::: + +:::info Starter Templates: +[Vanilla](https://github.com/wxt-dev/wxt/tree/main/templates/vanilla)
[Vue](https://github.com/wxt-dev/wxt/tree/main/templates/vue)
[React](https://github.com/wxt-dev/wxt/tree/main/templates/react)
[Svelte](https://github.com/wxt-dev/wxt/tree/main/templates/svelte)
[Solid](https://github.com/wxt-dev/wxt/tree/main/templates/solid) + +All templates use TypeScript by default. To use JavaScript, change the file extensions. +::: + +### Demo + +![wxt init demo](/assets/init-demo.gif) + +Once you've run the `dev` command, continue to [Next Steps](#next-steps)! + +## From Scratch + +1. Create a new project + :::code-group + ```sh [PNPM] + cd my-project + pnpm init + ``` + ```sh [Bun] + cd my-project + bun init + ``` + ```sh [NPM] + cd my-project + npm init + ``` + ```sh [Yarn] + cd my-project + yarn init + ``` + ::: +2. Install WXT: + :::code-group + ```sh [PNPM] + pnpm i -D wxt + ``` + ```sh [Bun] + bun i -D wxt + ``` + ```sh [NPM] + npm i -D wxt + ``` + ```sh [Yarn] + yarn add --dev wxt + ``` + ::: +3. Add an entrypoint, `my-project/entrypoints/background.ts`: + :::code-group + ```ts + export default defineBackground(() => { + console.log('Hello world!'); + }); + ``` + ::: +4. Add scripts to your `package.json`: + ```json + { + "scripts": { + "dev": "wxt", // [!code ++] + "dev:firefox": "wxt -b firefox", // [!code ++] + "build": "wxt build", // [!code ++] + "build:firefox": "wxt build -b firefox", // [!code ++] + "zip": "wxt zip", // [!code ++] + "zip:firefox": "wxt zip -b firefox", // [!code ++] + "postinstall": "wxt prepare" // [!code ++] + } + } + ``` +5. Run your extension in dev mode + :::code-group + ```sh [PNPM] + pnpm dev + ``` + ```sh [Bun] + bun run dev + ``` + ```sh [NPM] + npm run dev + ``` + ```sh [Yarn] + yarn dev + ``` + ::: + WXT will automatically open a browser window with your extension installed. + +## Next Steps + +- Keep reading on about WXT's [Project Structure](/guide/essentials/project-structure) and other essential concepts to learn +- Configure [automatic browser startup](/guide/essentials/config/browser-startup) during dev mode +- Explore [WXT's example library](/examples) to see how to use specific APIs or perform common tasks diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md new file mode 100644 index 00000000..c373e7c5 --- /dev/null +++ b/docs/guide/introduction.md @@ -0,0 +1,26 @@ +# Welcome to WXT! + +WXT is a modern, open-source framework for building web extensions. Inspired by Nuxt, its goals are to: + +- Provide an awesome [DX](https://about.gitlab.com/topics/devops/what-is-developer-experience/) +- Provide first-class support for all major browsers + +Check out the [comparison](/guide/resources/compare) to see how WXT compares to other tools for building web extnesions. + +## Prerequisites + +These docs assume you have a basic knowledge of how Chrome extensions are structured and how you access the extension APIs. + +:::warning New to extension development? +If you have never written an extension before, follow Chrome's [Hello World tutorial](https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world) to first **_create an extension without WXT_**, then come back here. +::: + +You should also be aware of [Chrome's extension docs](https://developer.chrome.com/docs/extensions) and [Mozilla's extension docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions). WXT does not change how you use the extension APIs, and you'll need to refer to these docs often when using specific APIs. + +
+ +--- + +
+ +Alright, got a basic understanding of how web extensions are structured? Do you know how to access the extension APIs? Then continue to the [Installation page](/guide/installation) to create your first WXT extension. diff --git a/docs/guide/key-concepts/auto-imports.md b/docs/guide/key-concepts/auto-imports.md deleted file mode 100644 index ac3b699d..00000000 --- a/docs/guide/key-concepts/auto-imports.md +++ /dev/null @@ -1,117 +0,0 @@ -# Auto-imports - -WXT uses the same tool as Nuxt for auto-imports, [`unimport`](https://github.com/unjs/unimport). - -## WXT Auto-imports - -Some WXT APIs can be used without importing them: - -- [`browser`](/api/reference/wxt/browser/variables/browser) from `wxt/browser`, a small wrapper around `webextension-polyfill` -- [`defineContentScript`](/api/reference/wxt/sandbox/functions/defineContentScript) from `wxt/sandbox` -- [`defineBackground`](/api/reference/wxt/sandbox/functions/defineBackground) from `wxt/sandbox` -- [`defineUnlistedScript`](/api/reference/wxt/sandbox/functions/defineUnlistedScript) from `wxt/sandbox` -- [`createIntegratedUi`](/api/reference/wxt/client/functions/createIntegratedUi) from `wxt/client` -- [`createShadowRootUi`](/api/reference/wxt/client/functions/createShadowRootUi) from `wxt/client` -- [`createIframeUi`](/api/reference/wxt/client/functions/createIframeUi) from `wxt/client` -- [`fakeBrowser`](/api/reference/wxt/testing/variables/fakeBrowser) from `wxt/testing` - -And more! - -## Project Auto-imports - -In addition WXT APIs, default and named exports from inside the following directories can be used without listing them in imports. - -- `/components/*` -- `/composables/*` -- `/hooks/*` -- `/utils/*` - -To add auto-imports from subdirectories, like `utils/api/some-file.ts`, re-export them from the base directory: - -```ts -// utils/index.ts -export * from './api/some-file.ts'; -``` - -Alternatively, you could add the directory to the list of auto-import directories in your config file. - -## TypeScript - -For TypeScript to work, you need to run the `wxt prepare` command. This will ensure types are generated for auto-imports. - -This should be added to your `postinstall` script so your editor has everything it needs to report type errors after installing dependencies: - -```json -// package.json -{ - "scripts": { - "postinstall": "wxt prepare" // [!code ++] - } -} -``` - -## Customization - -You can override the default auto-import behavior in your `wxt.config.ts` file. - -See [`unimport`'s documentation](https://github.com/unjs/unimport#configurations) for a complete list of options. - -```ts -import { defineConfig } from 'wxt'; - -export default defineConfig({ - imports: { - // Add auto-imports for vue functions like createApp, ref, computed, watch, toRaw, etc... - presets: ['vue'], - }, -}); -``` - -## Disabling Auto-imports - -To disable auto-imports, set `imports: false` - -```ts -export default defineConfig({ - imports: false, -}); -``` - -## ESLint - -ESLint doesn't know about the auto-imported variables unless they are explicitly defined in the `globals` config. By default, WXT will generate the config if it detects ESLint is installed in your project. If the config isn't generated automatically, you can manually tell WXT to generate it. - -```ts -// wxt.config.ts -export default defineConfig({ - imports: { - eslintrc: { - enabled: 8, // Generate ESLint v8 compatible config - // or - enabled: 9, // Generate ESLint v9 compatible config - }, - }, -}); -``` - -### ESLint 9 and above - -WXT supports the "flat config" file format introduced in ESLint 9. Just import the generated file and add it to the array of config to extend. - -```js -// eslint.config.mjs -import autoImports from './.wxt/eslint-auto-imports.mjs'; - -export default [autoImports]; -``` - -### ESLint 8 and below - -Just extend the generated file: - -```js -// .eslintrc.mjs -export default { - extends: ['./.wxt/eslintrc-auto-import.json'], -}; -``` diff --git a/docs/guide/key-concepts/manifest.md b/docs/guide/key-concepts/manifest.md deleted file mode 100644 index 6ee21f6f..00000000 --- a/docs/guide/key-concepts/manifest.md +++ /dev/null @@ -1,249 +0,0 @@ -# Manifest - -## Overview - -Sometimes, you'll need to make manual changes to how the `manifest.json` is generated. You can do this by using the `manifest` configuration: - -```ts -// wxt.config.ts -export default defineConfig({ - manifest: { - // Put manual changes here - }, -}); -``` - -## Manifest Version Compatibility - -When defining options in the manifest, always define them for MV3 when possible. WXT will either convert them to their MV2 equivalents or remove them from the generated manifest if there is not MV2 equivalent. - -So for fields like `web_accessible_resources` or `content_security_policy`, you just need to list them in their MV3 forms. Other fields, like `side_panel`, which doesn't exist in MV2, will be removed automatically. - -Here's an example `wxt.config.ts` file: - -```ts -import { defineConfig } from 'wxt'; - -export default defineConfig({ - manifest: { - action: { - default_title: 'Some Title', - }, - web_accessible_resources: [ - { - matches: ['*://*.google.com/*'], - resources: ['icon/*.png'], - }, - ], - }, -}); -``` - -And here's the different `manifest.json` files generated: - -:::code-group - -```json [MV2] -{ - "manifest_version": 2, - // ... - "browser_action": { - "default_title": "Some Title" - }, - "web_accessible_resources": ["icon/*.png"] -} -``` - -```json [MV3] -{ - "manifest_version": 3, - // ... - "action": { - "default_title": "Some Title" - }, - "web_accessible_resources": [ - { - "matches": ["*://*.google.com/*"], - "resources": ["icon/*.png"] - } - ] -} -``` - -::: - -## Name - -If not provided via the `manifest` config, the [manifest's `name`](https://developer.chrome.com/docs/extensions/mv3/manifest/name/) defaults to your `package.json`'s `name` property. - -## Version - -The [manifest's `version` and `version_name`](https://developer.chrome.com/docs/extensions/mv3/manifest/version/) properties are based on the `version` field listed in your `package.json` or `wxt.config.ts`. - -- `version_name` is the exact string listed in your `package.json` or `wxt.config.ts` file -- `version` is the string cleaned up, with any invalid suffixes removed - -If a version is not found, a warning is logged and the version defaults to `"0.0.0"`. - -#### Example - -```json -// package.json -{ - "version": "1.3.0-alpha2" -} -``` - -```json -// .output/
/manifest.json -{ - "version": "1.3.0", - "version_name": "1.3.0-alpha2" -} -``` - -## `icons` - -By default, WXT will discover icons in your [`public` directory](/guide/directory-structure/public/) and use them for the [manifest's `icons`](https://developer.chrome.com/docs/extensions/mv3/manifest/icons/). - -``` -public/ -├─ icon-16.png -├─ icon-24.png -├─ icon-48.png -├─ icon-96.png -└─ icon-128.png -``` - -Icon files need to match the following regex to be automatically included in the manifest. Most design software can output icons in one of these formats - -<<< @/../packages/wxt/src/core/utils/manifest.ts#snippet - -If you prefer to use filenames in a different format, you can add the icons manually in your `wxt.config.ts` file: - -```ts -export default defineConfig({ - manifest: { - icons: { - 16: '/extension-icon-16.png', - 24: '/extension-icon-24.png', - 48: '/extension-icon-48.png', - 96: '/extension-icon-96.png', - 128: '/extension-icon-128.png', - }, - }, -}); -``` - -## Permissions - -[Permissions](https://developer.chrome.com/docs/extensions/reference/permissions/) must be listed in the manifest config. - -```ts -export default defineConfig({ - manifest: { - permissions: ['storage', 'tabs'], - }, -}); -``` - -## Host Permissions - -[Host Permissions](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#host-permissions) must be listed in the manifest config. - -```ts -export default defineConfig({ - manifest: { - host_permissions: ['*://*.google.com/*'], - }, -}); -``` - -:::warning -If you use host permissions and target both MV2 and MV3, make sure to only include the required host permissions for each version: - -```ts -export default defineConfig({ - manifest: ({ manifestVersion }) => ({ - host_permissions: manifestVersion === 2 ? [...] : [...], - }), -}); -``` - -::: - -## Default Locale - -See the dedicated [I18n docs](/guide/extension-apis/i18n) for setting up localization and a `default_locale`. - -## Actions - -In MV2, you had two options: [`browser_action`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/browser_action) and [`page_action`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/page_action). In MV3, they were merged into a single [`action`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/action) API. - -By default, whenever an action is generated, WXT falls back to `browser_action` when targetting MV2. - -### Action With Popup - -To generate a manifest where a UI appears after clicking the icon, just create a [popup entrypoint](/guide/directory-structure/entrypoints/popup). - -If you want to use a `page_action` for MV2, add the following `meta` tag to the HTML document's head: - -```html - -``` - -### Action Without Popup - -If you want to use the `activeTab` permission or the `browser.action.onClick` event, but don't want to show a popup UI: - -1. Delete the [popup entrypoint](/guide/directory-structure/entrypoints/popup) if it exists -2. Add the `action` key to your manifest: - ```ts - // wxt.config.ts - export default defineConfig({ - manifest: { - action: {}, - }, - }); - ``` - -Same as an action with a popup, WXT will fallback on using `browser_action` for MV2. To use a `page_action` instead, add that key as well: - -```ts -// wxt.config.ts -export default defineConfig({ - manifest: { - action: {}, - page_action: {}, - }, -}); -``` - -## Full Control - -The `manifest` option can also be set equal to a function, letting you use logical statements to determine what should be output. - -```ts -// wxt.config.ts -export default defineConfig({ - manifest: ({ manifestVersion, browser, mode, command }) => { - return { ... } - } -}) -``` - -Or, you can use the `build:manifestGenerated` hook to transform the manifest before it is written to the output directory. - -```ts -// wxt.config.ts -export default defineConfig({ - hooks: { - build: { - manifestGenerated(manifest) { - // Update the manifest variable by reference - manifest.name = 'Overriden name'; - }, - }, - }, -}); -``` diff --git a/docs/guide/key-concepts/multiple-browsers.md b/docs/guide/key-concepts/multiple-browsers.md deleted file mode 100644 index ee5a743d..00000000 --- a/docs/guide/key-concepts/multiple-browsers.md +++ /dev/null @@ -1,133 +0,0 @@ -# Multiple Browsers - -You can build an extension for any combination of browser and manifest version. Different browsers and manifest versions support different APIs and entrypoints, so be sure to check that your extension functions as expected for each target. - -Separate build targets are written to their own output directories: - -``` - -└─ .output - ├─ chrome-mv3 - ├─ firefox-mv2 - ├─ edge-mv3 - └─ ... -``` - -## Target Browser - -To build for a specific browser, pass the `-b --browser` flag from the CLI: - -```sh -wxt --browser firefox -wxt build --browser firefox -``` - -By default, it will build for `chrome`. When excluding the [manifest version flags](#target-manifest-version), it will default to the commonly accepted manifest version for that browser. - -| Browser | Default Manifest Version | -| ---------------- | :----------------------: | -| `chrome` | 3 | -| `firefox` | 2 | -| `safari` | 2 | -| `edge` | 3 | -| Any other string | 3 | - -:::tip -To configure which browser is opened when running dev mode via `wxt -b `, see the [`web-ext.config.ts` docs](/guide/directory-structure/web-ext-config). -::: - -## Target Manifest Version - -To build for a specific manifest version, pass either the `--mv2` flag or `--mv3` flag from the CLI. - -```sh -wxt --mv2 -wxt build --mv2 -``` - -When the `-b --browser` flag is not passed, it defaults to `chrome`. So here, we're targeting MV2 for Chrome. - -## Customizing Entrypoints - -There are several ways to customize entrypoint definitions per browser. - -First, you can use either the `include` or `exclude` option to include or exclude the entrypoint from specific browsers. Here are some examples - -:::code-group - -```ts [Background] -export default defineBackground({ - // Only include a background script when targeting chrome - include: ['chrome'], -}); -``` - -```ts [Content Script] -export default defineContentScript({ - // Do not add this content script to the manifest when targeting firefox - exclude: ['firefox'], -}); -``` - -```html [HTML page] - - - - - - - -``` - -::: - -Second, you can change individual options per-browser: - -:::code-group - -```ts [Background] -export default defineBackground({ - persistent: { - // Use a non-persistent background script for just safari - safari: false, - }, -}); -``` - -```ts [Content Script] -export default defineContentScript({ - matches: { - // Run the content script on different pages for each browser - chrome: ['*://*.google.com/*'], - firefox: ['*://*.duckduckgo.com/*'], - edge: ['*://*.bing.com/*'], - }, -}); -``` - -::: - -:::warning -Only `defineBackground` and `defineContentScript` support per-browser options right now. -::: - -## Runtime - -To determine the browser or manifest version at runtime, you can use any of the below variables: - -- `import.meta.env.BROWSER`: A string, the target browser, usually equal to the `--browser` flag -- `import.meta.env.MANIFEST_VERSION`: A number, either `2` or `3`, depending on the manifest version targeted -- `import.meta.env.CHROME`: A boolean equivalent to `import.meta.env.BROWSER === "chrome"` -- `import.meta.env.FIREFOX`: A boolean equivalent to `import.meta.env.BROWSER === "firefox"` -- `import.meta.env.EDGE`: A boolean equivalent to `import.meta.env.BROWSER === "edge"` -- `import.meta.env.SAFARI`: A boolean equivalent to `import.meta.env.BROWSER === "safari"` -- `import.meta.env.OPERA`: A boolean equivalent to `import.meta.env.BROWSER === "opera"` -- `import.meta.env.COMMAND`: A string, `"serve"` when running `wxt` for development or `"build"` in all other cases. - -:::info -These variables are constants defined at build time based on the build target. They do not actually detect which browser the code is running in. - -For example, if you build for `--browser chrome` and publish it on Edge, `import.meta.env.BROWSER` will be `"chrome"`, not `"edge"`. You have to build a separate ZIP for `--browser edge` before `import.meta.env.BROWSER` will be `"edge"`. - -If you need to know the actual browser your code is being ran on, you should use a [user agent parser](https://www.npmjs.com/package/ua-parser-js). -::: diff --git a/docs/guide/key-concepts/web-extension-polyfill.md b/docs/guide/key-concepts/web-extension-polyfill.md deleted file mode 100644 index 09ae0139..00000000 --- a/docs/guide/key-concepts/web-extension-polyfill.md +++ /dev/null @@ -1,108 +0,0 @@ -# Web Extension Polyfill - -## Overview - -WXT is built on top [`webextension-polyfill` by Mozilla](https://www.npmjs.com/package/webextension-polyfill). The polyfill standardizes much of web extension APIs so they behave the same across different browsers and manifest versions. - -Unlike with Chrome Extension development, which uses a `chrome` global, you need to import the `browser` variable from WXT to access the extension APIs: - -```ts -import { browser } from 'wxt/browser'; - -console.log(browser.runtime.id); -``` - -If you use auto-imports (enabled by default), you don't need to import this variable, it will work just like the `chrome` global: - -```ts -console.log(browser.runtime.id); -``` - -## Handling Differences - -Web extensions behave **_VERY_** differently between browsers and manifest versions. You will have to handle these API differences yourself. - -:::info -MDN has great compatibility tables for tracking which browsers support which APIs: [Web Extension Browser Support for JavaScript APIs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Browser_support_for_JavaScript_APIs) -::: - -Lets go over a few approaches: - -1. **Feature detection**: If an API isn't available, it is `undefined`. So check if that's the case before using it. - - ```ts - if (browser.runtime.onStartup) { - browser.runtime.onStartup.addListener(...); - } - ``` - - If there's a similar API you can fallback on, you can do something like this: - - ```ts - (browser.action ?? browser.browserAction).setBadgeColor('red'); - ``` - -2. **Check the browser**: WXT provides environment variables about which browser is being targeted. - ```ts - if (!import.meta.env.SAFARI) { - // Safari doesn't implement `onStartup` correctly, so we need a custom solution - // ... - } else { - browser.runtime.onStartup.addListener(...) - } - ``` -3. **Check the manifest version**: WXT provides environment variables about which manifest version is being targeted. - ```ts - if (import.meta.env.MANIFEST_VERSION === 3) { - // MV3 only code... - } else { - // MV2 only code... - } - ``` - -### Environment Variables - -| Name | Type | Description | -| ---------------------------------- | --------- | ----------------------------------------------------- | -| `import.meta.env.BROWSER` | `string` | The target browser | -| `import.meta.env.MANIFEST_VERSION` | `2 │ 3` | The target manifest version | -| `import.meta.env.CHROME` | `boolean` | equivalent to `import.meta.env.BROWSER === "chrome"` | -| `import.meta.env.FIREFOX` | `boolean` | equivalent to `import.meta.env.BROWSER === "firefox"` | -| `import.meta.env.SAFARI` | `boolean` | equivalent to `import.meta.env.BROWSER === "safari"` | -| `import.meta.env.EDGE` | `boolean` | equivalent to `import.meta.env.BROWSER === "edge"` | -| `import.meta.env.OPERA` | `boolean` | equivalent to `import.meta.env.BROWSER === "opera"` | - -WXT uses Vite, so all of Vite's `import.meta.env` variables are also available: - - - -## Augmented Types - -Based on the files in your project, WXT will modify some of the polyfill's types to be type-safe. - -For example, `browser.runtime.getURL` will be typed to only allow getting the URL of known files. `browser.i18n.getMessage` will only allow getting translations of messages defined in your `public/_locales//messages.json` file. - -## Missing Types - -Some newer APIs that Chrome provides are missing types. Don't worry, the APIs are present at runtime! The polyfill only provides types for standard and stable APIs that work on all browsers, so just be careful when you use them. - -If you're using TypeScript, you can use `@ts-expect-error` to ignore any errors when using an API that doesn't have any types. - -```ts -// @ts-expect-error: desktopCapture is not typed -browser.desktopCapture.chooseDesktopMedia(...) -``` - -Note that when running this code in a different browser that doesn't support the `desktopCapture` API, `browser.desktopCapture` will evaluate to `undefined` and an error will be thrown. - -## Missing Permissions - -Just like with the `chrome` global, you need to request the required permissions to use each API. Otherwise, `browser.{apiName}` will be `undefined`. - -For example, if you try to use `browser.storage.local.getItem(...)` without requesting the `storage` permission, the extension will throw an error: - -``` -Cannot access property "local" of undefined. -``` - -You can request permissions using the [`wxt.config.ts` file](/guide/directory-structure/wxt-config#permissions). diff --git a/docs/guide/key-concepts/wxt-submit.md b/docs/guide/key-concepts/wxt-submit.md deleted file mode 100644 index 2c194929..00000000 --- a/docs/guide/key-concepts/wxt-submit.md +++ /dev/null @@ -1,9 +0,0 @@ -# `wxt submit` - -> Alias for [`publish-browser-extension`](https://www.npmjs.com/package/publish-browser-extension) - - - -
{{ data.submit }}
diff --git a/docs/guide/resources/compare.md b/docs/guide/resources/compare.md new file mode 100644 index 00000000..ef025f7f --- /dev/null +++ b/docs/guide/resources/compare.md @@ -0,0 +1,57 @@ +# Compare + +Lets compare the features of WXT vs [Plasmo](https://docs.plasmo.com/framework) (another framework) and [CRXJS](https://crxjs.dev/vite-plugin) (a bundler plugin). + +## Overview + +- ✅ - Full support +- 🟡 - Partial support +- ❌ - No support + +| Features | WXT | Plasmo | CRXJS | +| ------------------------------------------------------- | :--------------: | :-------------: | :--------------: | +| Supports all browsers | ✅ | ✅ | 🟡 10 | +| MV2 Support | ✅ | ✅ | 🟡 1 | +| MV3 Support | ✅ | ✅ | 🟡 1 | +| Create Extension ZIPs | ✅ | ✅ | ❌ | +| Create Firefox Sources ZIP | ✅ | ❌ | ❌ | +| First-class TypeScript support | ✅ | ✅ | ✅ | +| Entrypoint discovery | ✅ 2 | ✅ 2 | ❌ | +| Inline entrypoint config | ✅ | ✅ | ❌ 9 | +| Auto-imports | ✅ | ❌ | ❌ | +| Reusable module system | ✅ | ❌ | ❌ | +| Supports all frontend frameworks | ✅ | 🟡 3 | ✅ | +| Framework specific entrypoints (like `Popup.tsx`) | 🟡 4 | ✅ 5 | ❌ | +| Automated publishing | ✅ | ✅ | ❌ | +| Remote Code Bundling (Google Analytics) | ✅ | ✅ | ❌ | +| Unlisted HTML Pages | ✅ | ✅ | ✅ | +| Unlisted Scripts | ✅ | ❌ | ❌ | +| ESM Content Scripts | ❌ 12 | ❌ | ✅ | +| Dev Mode | | | +| `.env` Files | ✅ | ✅ | ✅ | +| Opens browser with extension installed | ✅ | ❌ | ❌ | +| HMR for UIs | ✅ | 🟡 6 | ✅ | +| Reload HTML Files on Change | ✅ | 🟡 7 | ✅ | +| Reload Content Scripts on Change | ✅ | 🟡 7 | ✅ | +| Reload Background on Change | 🟡 7 | 🟡 7 | 🟡 7 | +| Respects Content Script `run_at` | ✅ | ✅ | ❌ 8 | +| Built-in Wrappers | | | | +| Storage | ✅ | ✅ | ❌ 11 | +| Messaging | ❌ 11 | ✅ | ❌ 11 | +| Content Script UI | ✅ | ✅ | ❌ 11 | +| I18n | ✅ | ❌ | ❌ | + + + 1: Either MV2 or MV3, not both. +
2: File based. +
3: Only React, Vue, and Svelte. +
4: .html .ts .tsx. +
5: .html .ts .tsx. .vue .svelte. +
6: React only. +
7: Reloads entire extension. +
8: ESM-style loaders run asynchronously. +
9: Entrypoint options all configured in manifest.json. +
10: As of v2.0.0-beta.23, but v2 stable hasn't been released yet. +
11: There is no built-in wrapper around this API. However, you can still access the standard APIs via chrome/browser globals or use any 3rd party NPM package. +
12: WIP, moving very slowly. Follow
wxt-dev/wxt#357 for updates. + diff --git a/docs/guide/resources/faq.md b/docs/guide/resources/faq.md new file mode 100644 index 00000000..275bfb3b --- /dev/null +++ b/docs/guide/resources/faq.md @@ -0,0 +1,21 @@ +--- +outline: false +--- + +# FAQ + +Commonly asked questions about how to use WXT or why it behaves the way it does. + +[[toc]] + +--- + +### Why are content scripts not showing up in the manifest? + +During development, WXT registers content scripts dynamically so they can be reloaded individually when a file is saved without reloading your entire extension. + +To list the content scripts registered during development, open the service worker's console and run: + +```js +await chrome.scripting.getRegisteredContentScripts(); +``` diff --git a/docs/guide/go-further/how-wxt-works.md b/docs/guide/resources/how-wxt-works.md similarity index 100% rename from docs/guide/go-further/how-wxt-works.md rename to docs/guide/resources/how-wxt-works.md diff --git a/docs/get-started/migrate-to-wxt.md b/docs/guide/resources/migrate.md similarity index 67% rename from docs/get-started/migrate-to-wxt.md rename to docs/guide/resources/migrate.md index d51a3339..d7a14901 100644 --- a/docs/get-started/migrate-to-wxt.md +++ b/docs/guide/resources/migrate.md @@ -18,15 +18,18 @@ pnpm dlx wxt@latest init example-wxt --template vanilla In general, you'll need to:   Install `wxt`
+  [Extend `.wxt/tsconfig.json`](/guide/essentials/config/typescript.html#typescript-configuration) in your project's `tsconfig.json`
Update/create `package.json` scripts to use `wxt` (don't forget about `postinstall`)
Move entrypoints into `entrypoints/` directory
Move assets into either the `assets/` or `public/` directories
-  Move manifest.json content into `wxt.config.ts`
+  Move `manifest.json` content into `wxt.config.ts`
Convert custom import syntax to be compatible with Vite
-  Add a default export to JS entrypoints
+  Add a default export to JS entrypoints (`defineBackground`, `defineContentScript`, or `defineUnlistedScript`)
Use the `browser` global instead of `chrome`
-  Compare final `manifest.json` files, making sure permissions and host permissions are unchanged. Use [Google's update testing tool](https://github.com/GoogleChromeLabs/extension-update-testing-tool) if your extension is already live on the Chrome Web Store
-  Extension output by `wxt build` works the same way as before the migration
+  Compare final `manifest.json` files, making sure permissions and host permissions are unchanged
+:::warning +If your extension is already live on the Chrome Web Store, use [Google's update testing tool](https://github.com/GoogleChromeLabs/extension-update-testing-tool) to make sure no new permissions are being requested. +::: Every project is different, so there's no one-solution-fits-all to migrating your project. Just make sure `wxt dev` runs, `wxt build` results in a working extension, and the list of permissions in the `manifest.json` hasn't changed. If all that looks good, you've finished migrating your extension! @@ -34,6 +37,18 @@ Every project is different, so there's no one-solution-fits-all to migrating you Here's specific steps for other popular frameworks/build tools. +### Plasmo + +1. Install `wxt` +2. Move entrypoints into `entrypoints/` directory + - For JS entrypoints, merge the named exports used to configure your JS entrypoints into WXT's default export + - For HTML entrypoints, you cannot use JSX/Vue/Svelte files directly, you need to create an HTML file and manually create and mount your app. Refer to the [React](https://github.com/wxt-dev/wxt/tree/main/templates/react/entrypoints/popup), [Vue](https://github.com/wxt-dev/wxt/tree/main/templates/vue/entrypoints/popup), and [Svelte](https://github.com/wxt-dev/wxt/tree/main/templates/svelte/src/entrypoints/popup) templates as an example. +3. Move public `assets/*` into the `public/` directory +4. If you use CSUI, migrate to WXT's `createContentScriptUi` +5. Convert Plasmo's custom import resolutions to Vite's +6. If importing remote code via a URL, add a `url:` prefix so it works with WXT +7. Compare your output `manifest.json` files from before the migration to after the migration. They should have the same content. If not, tweak your entrypoints and config to get as close as possible. + ### `vite-plugin-web-extension` Since you're already using Vite, it's a simple refactor. @@ -45,21 +60,3 @@ Since you're already using Vite, it's a simple refactor. 5. Move the `manifest.json` into `wxt.config.ts` 6. Move any custom settings from `vite.config.ts` into `wxt.config.ts`'s 7. Compare `dist/manifest.json` to `.output/*/manifest.json`, they should have the same content as before. If not, tweak your entrypoints and config to get as close as possible. - -### `plasmo` - -1. Install `wxt` -2. Move entrypoints into `entrypoints/` directory, merging the named exports used to configure your JS entrypoints into WXT's default export -3. Move public `assets/*` into the `public/` directory -4. If you use CSUI, migrate to WXT's `createContentScriptUi` -5. Convert Plasmo's custom import resolutions to Vite's -6. If importing remote code via a URL, add a `url:` prefix so it works with WXT -7. Compare your output `manifest.json` files from before the migration to after the migration. They should have the same content. If not, tweak your entrypoints and config to get as close as possible. - - diff --git a/docs/guide/upgrade-guide/wxt.md b/docs/guide/resources/upgrading.md similarity index 89% rename from docs/guide/upgrade-guide/wxt.md rename to docs/guide/resources/upgrading.md index fae42874..4bf8f1c1 100644 --- a/docs/guide/upgrade-guide/wxt.md +++ b/docs/guide/resources/upgrading.md @@ -8,7 +8,9 @@ To upgrade WXT to the latest version... just install it! pnpm i wxt@latest ``` -If there was a major version change, follow the steps below to fix breaking changes. +Listed below are all the breaking changes you should address when upgrading to a new version of WXT. + +Currently, WXT is in pre-release. This means changes to the second digit, `v0.X`, are considered major and have breaking changes. Once v1 is released, only major version bumps will have breaking changes. ## v0.18.5 → v0.19.0 @@ -27,7 +29,7 @@ export default defineConfig({ }); ``` -> [Read the full docs](/guide/go-further/entrypoint-loaders#vite-node) for more information. +> [Read the full docs](/guide/essentials/config/entrypoint-loaders#vite-node) for more information. :::details This change enables: @@ -92,7 +94,28 @@ Vite also provides steps for migrating to ESM. Check them out for more details: ### New `modules/` Directory -WXT now recognizes the `modules/` directory as a folder containing [WXT modules](/guide/go-further/reusable-modules). +WXT now recognizes the `modules/` directory as a folder containing [WXT modules](/guide/essentials/wxt-modules). + +If you already have `/modules` or `/Modules` directory, `wxt prepare` and other commands will fail. + +You have two options: + +1. [Recommended] Keep your files where they are and tell WXT to look in a different folder: + ```ts + // wxt.config.ts + export default defineConfig({ + modulesDir: 'wxt-modules', // defaults to "modules" + }); + ``` +2. Rename your `modules` directory to something else. + +## v0.18.0 → v0.18.5 + +> When this version was released, it was not considered a breaking change... but it should have been. + +### New `modules/` Directory + +WXT now recognizes the `modules/` directory as a folder containing [WXT modules](/guide/essentials/wxt-modules). If you already have `/modules` or `/Modules` directory, `wxt prepare` and other commands will fail. diff --git a/docs/i18n.md b/docs/i18n.md new file mode 100644 index 00000000..1447f7d5 --- /dev/null +++ b/docs/i18n.md @@ -0,0 +1,5 @@ +--- +outline: deep +--- + + diff --git a/docs/index.md b/docs/index.md index d0c15a8e..b880af3e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,29 +13,29 @@ hero: actions: - theme: brand text: Get Started - link: /get-started/installation + link: /guide/installation - theme: alt text: Learn More - link: /get-started/introduction + link: /guide/introduction features: - icon: 🌐 title: Supported Browsers details: WXT will build extensions for Chrome, Firefox, Edge, Safari, and any Chromium based browser. - link: /guide/key-concepts/web-extension-polyfill + link: /guide/essentials/target-different-browsers linkText: Read docs - icon: ✅ title: MV2 and MV3 details: Build Manifest V2 or V3 extensions for any browser using the same codebase. - link: /guide/key-concepts/manifest + link: /guide/essentials/config/manifest linkText: Read docs - icon: ⚡ title: Fast Dev Mode - details: Lighting fast HMR for UI development and fast reloads for content/background scripts enables faster iterations. + details: Lightning fast HMR for UI development and fast reloads for content/background scripts enables faster iterations. - icon: 📂 title: File Based Entrypoints details: Manifest is generated based on files in the project with inline configuration. - link: /get-started/entrypoints + link: /guide/essentials/project-structure linkText: See project structure - icon: 🚔 title: TypeScript @@ -43,7 +43,7 @@ features: - icon: 🦾 title: Auto-imports details: Nuxt-like auto-imports to speed up development. - link: /guide/key-concepts/auto-imports + link: /guide/essentials/config/auto-imports linkText: Read docs - icon: 🤖 title: Automated Publishing @@ -51,17 +51,17 @@ features: - icon: 🎨 title: Frontend Framework Agnostic details: Works with any front-end framework with a Vite plugin. - link: /guide/key-concepts/frontend-frameworks + link: /guide/essentials/frontend-frameworks linkText: Add a framework - icon: 📦 - title: Modular Architecture + title: Module System details: Reuse build-time and runtime-code across multiple extensions. - link: /guide/go-further/reusable-modules + link: /guide/essentials/wxt-modules linkText: Read docs - icon: 🖍️ title: Bootstrap a New Project details: Get started quickly with several awesome project templates. - link: /get-started/installation#bootstrap-project + link: /guide/installation#bootstrap-project linkText: See templates - icon: 📏 title: Bundle Analysis @@ -69,13 +69,13 @@ features: - icon: ⬇️ title: Bundle Remote Code details: Downloads and bundles remote code imported from URLs. - link: /guide/go-further/remote-code + link: /guide/essentials/remote-code linkText: Read docs --- ## Put Developer Experience First -WXT's simplifies the chrome extension development process by providing tools for zipping and publishing, the best-in-class dev mode, an opinionated project structure, and more. Iterate faster, develop features not build scripts, and use everything the JS ecosystem has to offer. +WXT simplifies the chrome extension development process by providing tools for zipping and publishing, the best-in-class dev mode, an opinionated project structure, and more. Iterate faster, develop features not build scripts, and use everything the JS ecosystem has to offer.
diff --git a/docs/public/_redirects b/docs/public/_redirects index efd94762..ccc1a02a 100644 --- a/docs/public/_redirects +++ b/docs/public/_redirects @@ -6,6 +6,7 @@ # OLD /config.html /api/reference/wxt/interfaces/InlineConfig.html /api/config.html /api/reference/wxt/interfaces/InlineConfig.html +/api/config /api/reference/wxt/interfaces/InlineConfig.html /entrypoints /entrypoints/background.html /get-started/assets.html /guide/assets.html /get-started/build-targets.html /guide/multiple-browsers.html @@ -34,3 +35,71 @@ # 0.19.0 /guide/go-further/entrypoint-side-effects.html /guide/go-further/entrypoint-loaders.html + +# https://github.com/wxt-dev/wxt/issues/704 +# Generated via `pnpm docs:build && find docs/.vitepress/dist -type f -name "*.html"` + +/guide/i18n/build-integrations.html /i18n#build-integrations +/guide/i18n/introduction.html /i18n +/guide/i18n/messages-file-format.html /i18n#messages-file-format +/guide/i18n/editor-support.html /i18n#editor-support +/guide/i18n/installation.html /i18n#installation +/guide/key-concepts/content-script-ui.html /guide/essentials/content-scripts.html#ui +/guide/key-concepts/manifest.html /guide/essentials/config/manifest.html +/guide/key-concepts/wxt-submit.html /api/cli/wxt-submit.html +/guide/key-concepts/auto-imports.html /guide/essentials/config/auto-imports.html +/guide/key-concepts/web-extension-polyfill.html /guide/essentials/extension-apis.html +/guide/key-concepts/frontend-frameworks.html /guide/essentials/frontend-frameworks.html +/guide/key-concepts/multiple-browsers.html /guide/essentials/target-different-browsers.html +/guide/go-further/entrypoint-loaders.html /guide/essentials/config/entrypoint-loaders.html +/guide/go-further/es-modules.html /guide/essentials/es-modules.html +/guide/go-further/handling-updates.html /guide/essentials/testing-updates.html +/guide/go-further/custom-events.html /guide/essentials/content-scripts.html#dealing-with-spas +/guide/go-further/debugging.html /TODO +/guide/go-further/remote-code.html /guide/essentials/remote-code.html +/guide/go-further/vite.html /guide/essentials/config/vite.html +/guide/go-further/testing.html /guide/essentials/unit-testing.html +/guide/go-further/how-wxt-works.html /guide/resources/how-wxt-works.html +/guide/go-further/reusable-modules.html /guide/essentials/wxt-modules.html +/guide/extension-apis/messaging.html /guide/essentials/messaging.html +/guide/extension-apis/i18n.html /guide/essentials/i18n.html +/guide/extension-apis/storage.html /guide/essentials/storage.html +/guide/extension-apis/scripting.html /guide/essentials/scripting.html +/guide/extension-apis/others.html /guide/essentials/extension-apis.html +/guide/upgrade-guide/wxt.html /guide/resources/upgrading.html +/guide/directory-structure/components.html /guide/essentials/project-structure.html +/guide/directory-structure/hooks.html /guide/essentials/config/hooks.html +/guide/directory-structure/assets.html /guide/essentials/assets.html#assets-directory +/guide/directory-structure/package.html /guide/essentials/project-structure.html +/guide/directory-structure/env.html /guide/essentials/config/runtime.html +/guide/directory-structure/wxt-config.html /guide/essentials/project-structure.html +/guide/directory-structure/wxt.html /guide/essentials/project-structure.html +/guide/directory-structure/public/locales.html /guide/essentials/project-structure.html +/guide/directory-structure/public/index.html /guide/essentials/assets.html#public-directory +/guide/directory-structure/entrypoints/devtools.html /guide/essentials/entrypoints.html#devtools +/guide/directory-structure/entrypoints/sidepanel.html /guide/essentials/entrypoints.html#sidepanel +/guide/directory-structure/entrypoints/content-scripts.html /guide/essentials/entrypoints.html#content-scripts +/guide/directory-structure/entrypoints/newtab.html /guide/essentials/entrypoints.html#newtab +/guide/directory-structure/entrypoints/bookmarks.html /guide/essentials/entrypoints.html#bookmarks +/guide/directory-structure/entrypoints/unlisted-pages.html /guide/essentials/entrypoints.html#unlisted-pages +/guide/directory-structure/entrypoints/unlisted-scripts.html /guide/essentials/entrypoints.html#unlisted-scripts +/guide/directory-structure/entrypoints/options.html /guide/essentials/entrypoints.html#options +/guide/directory-structure/entrypoints/background.html /guide/essentials/entrypoints.html#background +/guide/directory-structure/entrypoints/popup.html /guide/essentials/entrypoints.html#popup +/guide/directory-structure/entrypoints/history.html /guide/essentials/entrypoints.html#history +/guide/directory-structure/entrypoints/sandbox.html /guide/essentials/entrypoints.html#sandbox +/guide/directory-structure/entrypoints/css.html /guide/essentials/entrypoints.html#unlisted-css +/guide/directory-structure/web-ext-config.html /guide/essentials/config/browser-startup.html +/guide/directory-structure/tsconfig.html /guide/essentials/config/typescript.html +/guide/directory-structure/utils.html /guide/essentials/project-structure.html +/guide/directory-structure/app-config.html /guide/essentials/config/runtime.html +/guide/directory-structure/composables.html /guide/essentials/project-structure.html +/guide/directory-structure/output.html /guide/essentials/project-structure.html +/get-started/assets.html /guide/essentials/assets.html +/get-started/introduction.html /guide/introduction.html +/get-started/configuration.html /guide/essentials/config/manifest.html +/get-started/publishing.html /guide/essentials/publishing.html +/get-started/migrate-to-wxt.html /guide/resources/migrate.html +/get-started/compare.html /guide/resources/compare.html +/get-started/entrypoints.html /guide/essentials/entrypoints.html +/get-started/installation.html /guide/installation.html diff --git a/docs/guide/extension-apis/storage.md b/docs/storage.md similarity index 96% rename from docs/guide/extension-apis/storage.md rename to docs/storage.md index 9d593074..6fb876d3 100644 --- a/docs/guide/extension-apis/storage.md +++ b/docs/storage.md @@ -2,7 +2,9 @@ outline: deep --- -# Storage API +# WXT Storage + +[Changelog](https://github.com/wxt-dev/wxt/blob/main/packages/wxt/CHANGELOG.md) WXT provides a simplified API to replace the `browser.storage.*` APIs. Use the `storage` auto-import from `wxt/storage` or import it manually to get started: @@ -10,22 +12,17 @@ WXT provides a simplified API to replace the `browser.storage.*` APIs. Use the ` import { storage } from 'wxt/storage'; ``` -:::warning -To use the `wxt/storage` API, the `"storage"` permission must be added to the manifest: - -```ts -// wxt.config.ts -export default defineConfig({ - manifest: { - permissions: ['storage'], - }, -}); -``` - -More info on permissions [here](/guide/key-concepts/manifest#permissions). -::: - -[[toc]] +> [!IMPORTANT] +> To use the `wxt/storage` API, the `"storage"` permission must be added to the manifest: +> +> ```ts +> // wxt.config.ts +> export default defineConfig({ +> manifest: { +> permissions: ['storage'], +> }, +> }); +> ``` ## Basic Usage diff --git a/packages/auto-icons/README.md b/packages/auto-icons/README.md index 0cef2993..3ee34773 100644 --- a/packages/auto-icons/README.md +++ b/packages/auto-icons/README.md @@ -1,5 +1,7 @@ # WXT Auto Icons +[Changelog](https://github.com/wxt-dev/wxt/blob/main/packages/auto-icons/CHANGELOG.md) + ## Features - Generate extension icons with the correct sizes diff --git a/packages/i18n/README.md b/packages/i18n/README.md index ea50ac14..d1fc05dc 100644 --- a/packages/i18n/README.md +++ b/packages/i18n/README.md @@ -1,3 +1,368 @@ -# WXT I18n +# `@wxt-dev/i18n` -[Read the docs](https://wxt.dev/guide/i18n/installation) to get started. +[Changelog](https://github.com/wxt-dev/wxt/blob/main/packages/i18n/CHANGELOG.md) + +`@wxt-dev/i18n` is a simple, type-safe wrapper around the `browser.i18n` APIs. It provides several benefits over the standard API: + +1. Simple messages file format +2. Plural form support +3. Integrates with the [I18n Ally VS Code extension](#vscode) + +It also provides several benefits over other non-web extension specific i18n packages: + +1. Does not bundle localization files into every entrypoint +2. Don't need to fetch the localization files asynchronously +3. Can localize text in manifest and CSS files + +However, it does have one major downside: + +1. Like the `browser.i18n` API, to change the language, users must change the browser's language + +> [!IMPORTANT] +> You don't have to use `wxt` to use this package - it will work in any bundler setup. See [Installation without WXT](#without-wxt) for more details. + +## Installation + +### With WXT + +1. Install `@wxt-dev/i18n` via your package manager: + + ```sh + pnpm i @wxt-dev/i18n + ``` + +2. Add the WXT module to your `wxt.config.ts` file and setup a default locale: + + ```ts + export default defineConfig({ + modules: ['@wxt-dev/i18n/module'], + manifest: { + default_locale: 'en', + }, + }); + ``` + +3. Create a localization file at `/locales/.yml` or move your existing localization files there. + + ```yml + # /locales/en.yml + helloWorld: Hello world! + ``` + + > `@wxt-dev/i18n` supports the standard messages format, so if you already have localization files at `/public/_locale//messages.json`, you don't need to convert them to YAML or refactor them - just move them to `/locales/.json` and they'll just work out of the box! + +4. To get a translation, use the auto-imported `i18n` object or import it manually: + + ```ts + import { i18n } from '#i18n'; + + i18n.t('helloWorld'); // "Hello world!" + ``` + +And you're done! Using WXT, you get type-safety out of the box. + +### Without WXT + +1. Install `@wxt-dev/i18n` via your package manager: + + ```sh + pnpm i @wxt-dev/i18n + ``` + +2. Create a messages file at `_locales//messages.json` or move your existing translations there: + + ```json + { + "helloWorld": { + "message": "Hello world!" + } + } + ``` + + > [!NOTE] + > For the best DX, you should to integrate `@wxt-dev/i18n` into your build process. This enables: + + > 1. Plural forms + > 2. Simple messages file format + > 3. Type safety + > + > See [Build Integrations](#build-integrations) to set it up. + +3. Create the `i18n` object, export it, and use it wherever you want! + + ```ts + import { createI18n } from '@wxt-dev/i18n'; + + export const i18n = createI18n(); + + i18n.t('helloWorld'); // "Hello world!"; + ``` + +## Messages File Format + +> [!DANGER] +> You can only use the file format discussed on this page if you have [integrated `@wxt-dev/i18n` into your build process](#build-integrations). If you have not integrated it into your build process, you must use JSON files in the `_locales` directory, like a normal web extension. + +### File Extensions + +You can define your messages in several different file types: + +- `.yml` +- `.yaml` +- `.json` +- `.jsonc` +- `.json5` +- `.toml` + +### Nested Keys + +You can have translations at the top level or nest them into groups: + +```yml +ok: OK +cancel: Cancel +welcome: + title: Welcome to XYZ +dialogs: + confirmation: + title: 'Are you sure?' +``` + +To access a nested key, use `.`: + +```ts +i18n.t('ok'); // "OK" +i18n.t('cancel'); // "Cancel" +i18n.t('welcome.title'); // "Welcome to XYZ" +i18n.t('dialogs.confirmation.title'); // "Are you sure?" +``` + +### Substitutions + +Because `@wxt-dev/i18n` is based on `browser.i18n`, you define substitutions the same way, with `$1`-`$9`: + +```yml +hello: Hello $1! +order: Thanks for ordering your $1 +``` + +#### Escapting `$` + +To escape the dollar sign, put another `$` in front of it: + +```yml +dollars: $$$1 +``` + +```ts +i18n.t('dollars', ['1.00']); // "$1.00" +``` + +### Plural Forms + +> [!WARNING] +> Plural support languages like Arabic, that have different forms for "few" or "many", is not supported right now. Feel free to open a PR if you are interested in this! + +To get a different translation based on a count: + +```yml +items: + 1: 1 item + n: $1 items +``` + +Then you pass in the count as the second argument to `i18n.t`: + +```ts +i18n.t('items', 0); // "0 items" +i18n.t('items', 1); // "1 item" +i18n.t('items', 2); // "2 items" +``` + +To add a custom translation for 0 items: + +```yml +items: + 0: No items + 1: 1 item + n: $1 items +``` + +```ts +i18n.t('items', 0); // "No items" +i18n.t('items', 1); // "1 item" +i18n.t('items', 2); // "2 items" +``` + +If you need to pass a custom substitution for `$1` instead of the count, just add the substitution: + +```yml +items: + 0: No items + 1: $1 item + n: $1 items +``` + +```ts +i18n.t('items', 0, ['Zero']); // "No items" +i18n.t('items', 1, ['One']); // "One item" +i18n.t('items', 2, ['Multiple']); // "Multiple items" +``` + +### Verbose Keys + +`@wxt-dev/i18n` is compatible with the message format used by [`browser.i18n`](https://developer.chrome.com/docs/extensions/reference/api/i18n). + +> [!IMPORTANT] +> This means if you're migrating to `@wxt-dev/i18n` and you're already using the verbose format, you don't have to change anything! + +A key is treated as "verbose" when it is: + +1. At the top level (not nested) +2. Only contains the following properties: `message`, `description` and/or `placeholder` + +```json +{ + "appName": { + "message": "GitHub - Better Line Counts", + "description": "The app's name, should not be translated", + }, + "ok": "OK", + "deleteConfirmation": { + "title": "Delete XYZ?" + "message": "You cannot undo this action once taken." + } +} +``` + +In this example, only `appName` is considered verbose. `deleteConfirmation` is not verbose because it contains the additional property `title`. + +```ts +i18n.t('appName'); // ✅ "GitHub - Better Line Counts" +i18n.t('appName.message'); // ❌ +i18n.t('ok'); // ✅ "OK" +i18n.t('deleteConfirmation'); // ❌ +i18n.t('deleteConfirmation.title'); // ✅ "Delete XYZ?" +i18n.t('deleteConfirmation.message'); // ✅ "You cannot undo this action once taken." +``` + +If this is confusing, don't worry! With type-safety, you'll get a type error if you do it wrong. If type-safety is disabled, you'll get a runtime warning in the devtools console. + +> [!WARNING] +> Using the verbose format is not recommended. I have yet to see a translation service and software that supports this format out of the box. Stick with the simple format when you can. + +## Build Integrations + +To use the custom messages file format, you'll need to use `@wxt-dev/i18n/build` to transform the custom format to the one expected by browsers. + +### WXT + +See [Installation with WXT](#with-wxt). + +But TLDR, all you need is: + +```ts +// wxt.config.ts +export default defineConfig({ + modules: ['@wxt-dev/i18n/module'], +}); +``` + +Types are generated whenever you run `wxt prepare` or another build command. + +### Custom + +If you're not using WXT, you'll have to pre-process the localization files yourself. Here's a basic script to generate the `_locales/.../messages.json` and `wxt-i18n-structure.d.ts` files: + +```ts +// build-i18n.js +import { + parseMessagesFile, + generateChromeMessagesFile, + generateTypeFile, +} from '@wxt-dev/i18n/build'; + +// Read your localization files +const messages = { + en: await parseMessagesFile('path/locales/en.yml'), + de: await parseMessagesFile('path/locales/de.yml'), + // ... +}; + +// Generate JSON files for the browser +await generateChromeMessagesFile('dist/_locales/en/messages.json', messages.en); +await generateChromeMessagesFile('dist/_locales/de/messages.json', messages.de); +// ... + +// Generate a types file based on your default_locale +await generateTypeFile('wxt-i18n-structure.d.ts', messages.en); +``` + +Then run the script: + +```sh +node generate-i18n.js +``` + +If your build tool has a dev mode, you'll also want to rerun the script whenever you change a localization file. + +#### Type Safety + +Once you've generated `wxt-i18n-structure.d.ts` (see the [Custom](#custom) section), you can use it to pass the generated type into `createI18n`: + +```ts +import type { WxtI18nStructure } from './wxt-i18n-structure'; + +export const i18n = createI18n(); +``` + +And just like that, you have type safety! + +## Editor Support + +For better DX, you can configure your editor with plugins and extensions. + +### VS Code + +The [I18n Ally Extension](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) adds several features to VS Code: + +- Go to translation definition +- Inline previews of text +- Hover to see other translations + +You'll need to configure it the extension so it knows where your localization files are and what function represents getting a translation: + +`.vscode/i18n-ally-custom-framework.yml`: + +```yml +# An array of strings which contain Language Ids defined by VS Code +# You can check available language ids here: https://code.visualstudio.com/docs/languages/identifiers +languageIds: + - typescript + +# Look for t("...") +usageMatchRegex: + - "[^\\w\\d]t\\(['\"`]({key})['\"`]" + +# Disable other built-in i18n ally frameworks +monopoly: true +``` + +`.vscode/settings.json`: + +```json +{ + "i18n-ally.localesPaths": ["src/locales"], + "i18n-ally.keystyle": "nested" +} +``` + +### Zed + +As of time of writing, Aug 18, 2024, no extensions exist for Zed to add I18n support. + +### Jetbrains IDEs + +Install the [I18n Ally plugin](https://plugins.jetbrains.com/plugin/17212-i18n-ally). The docs are limited around their Jetbrains support, but you'll probably need to configure the plugin similar to [VS Code](#vs-code)... Not sure where the files go though. + +Please open a PR if you figure it out! diff --git a/packages/wxt/README.md b/packages/wxt/README.md index f629dbd0..530b187b 100644 --- a/packages/wxt/README.md +++ b/packages/wxt/README.md @@ -71,7 +71,7 @@ Or see the [installation guide](https://wxt.dev/guide/installation.html) to get - 🦾 Auto-imports - 🤖 Automated publishing - 🎨 Frontend framework agnostic: works with Vue, React, Svelte, etc -- 📦 Modular architecture with [WXT modules](https://wxt.dev/guide/go-further/reusable-modules.html#overview) +- 📦 [Module system](https://wxt.dev/guide/essentials/wxt-modules.html#overview) for reusing code between extensions - 🖍️ Quickly bootstrap a new project - 📏 Bundle analysis - ⬇️ Download and bundle remote URL imports diff --git a/packages/wxt/src/browser/chrome.ts b/packages/wxt/src/browser/chrome.ts index cb9a4430..d1dad85d 100644 --- a/packages/wxt/src/browser/chrome.ts +++ b/packages/wxt/src/browser/chrome.ts @@ -13,9 +13,11 @@ export type WxtBrowser = Omit & { i18n: WxtI18n & Omit<(typeof chrome)['i18n'], 'getMessage'>; }; +// #region snippet export const browser: WxtBrowser = // @ts-expect-error globalThis.browser?.runtime?.id == null ? globalThis.chrome : // @ts-expect-error globalThis.browser; +// #endregion snippet diff --git a/packages/wxt/src/client/content-scripts/ui/index.ts b/packages/wxt/src/client/content-scripts/ui/index.ts index c9ba6fb4..6c7a614a 100644 --- a/packages/wxt/src/client/content-scripts/ui/index.ts +++ b/packages/wxt/src/client/content-scripts/ui/index.ts @@ -17,7 +17,7 @@ export * from './types'; /** * Create a content script UI without any isolation. * - * @see https://wxt.dev/guide/key-concepts/content-script-ui.html#integrated + * @see https://wxt.dev/guide/essentials/content-scripts.html#integrated */ export function createIntegratedUi( ctx: ContentScriptContext, @@ -53,7 +53,7 @@ export function createIntegratedUi( /** * Create a content script UI using an iframe. * - * @see https://wxt.dev/guide/key-concepts/content-script-ui.html#iframe + * @see https://wxt.dev/guide/essentials/content-scripts.html#iframe */ export function createIframeUi( ctx: ContentScriptContext, @@ -96,7 +96,7 @@ export function createIframeUi( * * > This function is async because it has to load the CSS via a network call. * - * @see https://wxt.dev/guide/key-concepts/content-script-ui.html#shadowroot + * @see https://wxt.dev/guide/essentials/content-scripts.html#shadowroot */ export async function createShadowRootUi( ctx: ContentScriptContext, diff --git a/packages/wxt/src/core/builders/vite/index.ts b/packages/wxt/src/core/builders/vite/index.ts index 9af93a7a..dfe7fc9b 100644 --- a/packages/wxt/src/core/builders/vite/index.ts +++ b/packages/wxt/src/core/builders/vite/index.ts @@ -111,7 +111,7 @@ export async function createViteBuilder( plugins, esbuild: { // Add a footer with the returned value so it can return values to `scripting.executeScript` - // Footer is added apart of esbuild to make sure it's not minified. It + // Footer is added a part of esbuild to make sure it's not minified. It // get's removed if added to `build.rollupOptions.output.footer` // See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript#return_value footer: iifeReturnValueName + ';', diff --git a/packages/wxt/src/core/generate-wxt-dir.ts b/packages/wxt/src/core/generate-wxt-dir.ts index ef39c8a8..cf9980c7 100644 --- a/packages/wxt/src/core/generate-wxt-dir.ts +++ b/packages/wxt/src/core/generate-wxt-dir.ts @@ -22,7 +22,7 @@ export async function generateWxtDir(entrypoints: Entrypoint[]): Promise { // Add references to modules installed from NPM to the TS project so their // type augmentation can update InlineConfig correctly. Local modules defined - // in /modules are already apart of the project, so we don't need to + // in /modules are already a part of the project, so we don't need to // add them. wxt.config.userModules.forEach((module) => { if (module.type === 'node_module') entries.push({ module: module.id }); diff --git a/packages/wxt/src/virtual/README.md b/packages/wxt/src/virtual/README.md index b06cebed..248c7042 100644 --- a/packages/wxt/src/virtual/README.md +++ b/packages/wxt/src/virtual/README.md @@ -2,7 +2,7 @@ This folder contains scripts that are either loaded as entrypoints to JS files or included in HTML files, just like a project using WXT might load their own scripts. -While they are bundled and shipped inside WXT, Vite considers them apart of your project's source code, not WXT's. This means they cannot import 3rd party modules directly, otherwise `pnpm i --shamefully-hoist=false` and Yarn PnP will fail. +While they are bundled and shipped inside WXT, Vite considers them a part of your project's source code, not WXT's. This means they cannot import 3rd party modules directly, otherwise `pnpm i --shamefully-hoist=false` and Yarn PnP will fail. For this reason, the virtual entrypoints get their own TS project to isolate them from the rest of the project. They can only import from `wxt/*` or utils that don't have any imports from node_modules, like the logger. From 1dbb5a468d565be067eceef9d10e2e231321cf2f Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 18 Oct 2024 10:43:39 -0500 Subject: [PATCH 42/62] feat: Add support for `WXT_` environment variable prefix (#1076) --- docs/guide/essentials/config/environment-variables.md | 6 +++--- docs/guide/essentials/config/runtime.md | 4 ++-- packages/wxt/src/core/builders/vite/index.ts | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/guide/essentials/config/environment-variables.md b/docs/guide/essentials/config/environment-variables.md index be97952f..ee1e2297 100644 --- a/docs/guide/essentials/config/environment-variables.md +++ b/docs/guide/essentials/config/environment-variables.md @@ -15,14 +15,14 @@ And any environment variables listed inside them will be available at runtime: ```sh # .env -VITE_API_KEY=... +WXT_API_KEY=... ``` ```ts -await fetch(`/some-api?apiKey=${import.meta.env.VITE_API_KEY}`); +await fetch(`/some-api?apiKey=${import.meta.env.WXT_API_KEY}`); ``` -Remember to prefix any environment variables with `VITE_`, otherwise they won't be available at runtime, as per [Vite's convention](https://vite.dev/guide/env-and-mode.html#env-files). +Remember to prefix any environment variables with `WXT_` or `VITE_`, otherwise they won't be available at runtime, as per [Vite's convention](https://vite.dev/guide/env-and-mode.html#env-files). ## Built-in Environment Variables diff --git a/docs/guide/essentials/config/runtime.md b/docs/guide/essentials/config/runtime.md index 084a43f5..2bdd8c8a 100644 --- a/docs/guide/essentials/config/runtime.md +++ b/docs/guide/essentials/config/runtime.md @@ -44,8 +44,8 @@ declare module 'wxt/sandbox' { } export default defineAppConfig({ - apiKey: import.meta.env.VITE_API_KEY, - skipWelcome: import.meta.env.VITE_SKIP_WELCOME === 'true', + apiKey: import.meta.env.WXT_API_KEY, + skipWelcome: import.meta.env.WXT_SKIP_WELCOME === 'true', }); ``` diff --git a/packages/wxt/src/core/builders/vite/index.ts b/packages/wxt/src/core/builders/vite/index.ts index dfe7fc9b..6ab15ab4 100644 --- a/packages/wxt/src/core/builders/vite/index.ts +++ b/packages/wxt/src/core/builders/vite/index.ts @@ -44,6 +44,7 @@ export async function createViteBuilder( config.configFile = false; config.logLevel = 'warn'; config.mode = wxtConfig.mode; + config.envPrefix ??= ['VITE_', 'WXT_']; config.build ??= {}; config.publicDir = wxtConfig.publicDir; From 1a9cd438d99822e5da30fa7fa7775309a1dc4a2e Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Fri, 18 Oct 2024 17:47:12 +0200 Subject: [PATCH 43/62] chore: shrink down on dependencies (#1050) --- .github/workflows/publish-docs.yml | 2 + package.json | 6 +- packages/wxt-demo/package.json | 2 +- packages/wxt/package.json | 7 +- pnpm-lock.yaml | 676 +---------------------------- 5 files changed, 8 insertions(+), 685 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 89f1fbd1..e80893d5 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -12,6 +12,8 @@ on: jobs: publish: + # Only run if it's the upstream repository, not forks + if: github.repository == 'wxt-dev/wxt' runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 diff --git a/package.json b/package.json index 1a3a4e65..70e7fb10 100644 --- a/package.json +++ b/package.json @@ -23,13 +23,10 @@ "@vitest/coverage-v8": "^2.1.2", "changelogen": "^0.5.7", "consola": "^3.2.3", - "dependency-graph": "^1.0.0", "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", - "hasha": "^6.0.0", "lint-staged": "^15.2.10", "nano-spawn": "^0.1.0", - "npm-run-all": "^4.1.5", "prettier": "^3.3.3", "simple-git-hooks": "^2.11.1", "tsx": "4.15.7", @@ -40,8 +37,7 @@ "vitepress": "^1.3.4", "vitest-mock-extended": "^2.0.2", "vue": "^3.5.11", - "wxt": "workspace:*", - "yaml": "^2.5.1" + "wxt": "workspace:*" }, "simple-git-hooks": { "pre-commit": "pnpm lint-staged" diff --git a/packages/wxt-demo/package.json b/packages/wxt-demo/package.json index 848810d8..8bec6784 100644 --- a/packages/wxt-demo/package.json +++ b/packages/wxt-demo/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "buildc --deps-only -- wxt", "build": "buildc --deps-only -- wxt build", - "build:all": "buildc --deps-only -- run-s -s 'build:all:*'", + "build:all": "buildc --deps-only -- pnpm run --reporter-hide-prefix /^build:all:.*/", "build:all:chrome-mv3": "wxt build", "build:all:chrome-mv2": "wxt build --mv2", "build:all:firefox-mv3": "wxt build -b firefox --mv3", diff --git a/packages/wxt/package.json b/packages/wxt/package.json index c068711a..eb44a03c 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -5,7 +5,7 @@ "description": "Next gen framework for developing web extensions", "repository": { "type": "git", - "url": "https://github.com/wxt-dev/wxt" + "url": "git+https://github.com/wxt-dev/wxt.git" }, "homepage": "https://wxt.dev", "keywords": [ @@ -72,7 +72,7 @@ "scripts": { "wxt": "tsx src/cli/index.ts", "build": "buildc -- unbuild", - "check": "pnpm build && run-s -c check:*", + "check": "pnpm build && pnpm run --reporter-hide-prefix /^check:.*/", "check:default": "check", "check:tsc-virtual": "tsc --noEmit -p src/virtual", "test": "buildc --deps-only -- vitest", @@ -111,7 +111,6 @@ "magicast": "^0.3.5", "minimatch": "^10.0.1", "nano-spawn": "^0.1.0", - "natural-compare": "^1.4.0", "normalize-path": "^3.0.0", "nypm": "^0.3.12", "ohash": "^1.1.4", @@ -133,7 +132,6 @@ "@faker-js/faker": "^8.4.1", "@types/fs-extra": "^11.0.4", "@types/lodash.merge": "^4.6.9", - "@types/natural-compare": "^1.4.3", "@types/node": "^20.16.10", "@types/normalize-path": "^3.0.2", "@types/prompts": "^2.4.9", @@ -141,7 +139,6 @@ "happy-dom": "^14.12.3", "lodash.merge": "^4.6.2", "oxlint": "^0.9.9", - "p-map": "^7.0.2", "publint": "^0.2.11", "tsx": "4.15.7", "typescript": "^5.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58f21ece..d94a395f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,27 +26,18 @@ importers: consola: specifier: ^3.2.3 version: 3.2.3 - dependency-graph: - specifier: ^1.0.0 - version: 1.0.0 fast-glob: specifier: ^3.3.2 version: 3.3.2 fs-extra: specifier: ^11.2.0 version: 11.2.0 - hasha: - specifier: ^6.0.0 - version: 6.0.0 lint-staged: specifier: ^15.2.10 version: 15.2.10 nano-spawn: specifier: ^0.1.0 version: 0.1.0 - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -80,9 +71,6 @@ importers: wxt: specifier: workspace:* version: link:packages/wxt - yaml: - specifier: ^2.5.1 - version: 2.5.1 packages/auto-icons: dependencies: @@ -353,9 +341,6 @@ importers: nano-spawn: specifier: ^0.1.0 version: 0.1.0 - natural-compare: - specifier: ^1.4.0 - version: 1.4.0 normalize-path: specifier: ^3.0.0 version: 3.0.0 @@ -414,9 +399,6 @@ importers: '@types/lodash.merge': specifier: ^4.6.9 version: 4.6.9 - '@types/natural-compare': - specifier: ^1.4.3 - version: 1.4.3 '@types/node': specifier: ^20.16.10 version: 20.16.10 @@ -438,9 +420,6 @@ importers: oxlint: specifier: ^0.9.9 version: 0.9.9 - p-map: - specifier: ^7.0.2 - version: 7.0.2 publint: specifier: ^0.2.11 version: 0.2.11 @@ -1722,9 +1701,6 @@ packages: '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/natural-compare@1.4.3': - resolution: {integrity: sha512-XCAxy+Gg6+S6VagwzcknnvCKujj/bVv1q+GFuCrFEelqaZPqJoC+FeXLwc2dp+oLP7qDZQ4ZfQiTJQ9sIUmlLw==} - '@types/node@20.10.3': resolution: {integrity: sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==} @@ -1969,9 +1945,6 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - array-differ@4.0.0: resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2001,10 +1974,6 @@ packages: peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} @@ -2118,9 +2087,6 @@ packages: resolution: {integrity: sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==} engines: {node: '>=14.16'} - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} @@ -2316,10 +2282,6 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2467,10 +2429,6 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -2553,18 +2511,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} @@ -2662,9 +2608,6 @@ packages: focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.2.1: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} @@ -2703,13 +2646,6 @@ packages: function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - fx-runner@1.4.0: resolution: {integrity: sha512-rci1g6U0rdTg6bAaBboP7XdRu01dzTAaKXxFf+PUqGuCv6Xu7o8NZdY1D5MvKGIjb6EdS1g3VlXOgksir1uGkg==} hasBin: true @@ -2729,9 +2665,6 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - get-port@7.1.0: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} @@ -2748,10 +2681,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - get-tsconfig@4.7.5: resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} @@ -2772,12 +2701,10 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} - deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2787,17 +2714,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - globby@13.2.2: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -2818,9 +2738,6 @@ packages: resolution: {integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==} engines: {node: '>=16.0.0'} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -2829,21 +2746,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - has-yarn@3.0.0: resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2852,10 +2754,6 @@ packages: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} - hasha@6.0.0: - resolution: {integrity: sha512-MLydoyGp9QJcjlhE5lsLHXYpWayjjWqkavzju2ZWD2tYa1CgmML1K1gWAu22BLFa2eZ0OfvJ/DlfoVjaD54U2Q==} - engines: {node: '>=18'} - hast-util-to-html@9.0.3: resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} @@ -2868,9 +2766,6 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-entities@2.3.3: resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} @@ -2932,7 +2827,6 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2944,42 +2838,24 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} - internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - is-absolute@0.1.7: resolution: {integrity: sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==} engines: {node: '>=0.10.0'} - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true @@ -2987,10 +2863,6 @@ packages: is-core-module@2.12.1: resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -3037,18 +2909,10 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3078,17 +2942,10 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-relative@0.1.3: resolution: {integrity: sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==} engines: {node: '>=0.10.0'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -3097,18 +2954,6 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -3120,9 +2965,6 @@ packages: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -3194,9 +3036,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - json-parse-even-better-errors@3.0.0: resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -3260,10 +3099,6 @@ packages: resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} engines: {node: '>=18.0.0'} - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -3361,10 +3196,6 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -3534,16 +3365,10 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - ncp@2.0.0: resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} hasBin: true - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} @@ -3560,9 +3385,6 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3588,11 +3410,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true - npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3613,17 +3430,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - ofetch@1.4.0: resolution: {integrity: sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==} @@ -3681,10 +3487,6 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} - p-map@7.0.2: - resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} - engines: {node: '>=18'} - package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} @@ -3695,10 +3497,6 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - parse-json@7.1.1: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} @@ -3716,10 +3514,6 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3735,10 +3529,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3766,20 +3556,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} hasBin: true - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - pkg-types@1.1.3: resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} @@ -4045,10 +3826,6 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -4070,10 +3847,6 @@ packages: regex@4.3.3: resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} - regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} @@ -4121,7 +3894,6 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -4162,9 +3934,6 @@ packages: safe-json-stringify@1.2.0: resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - sass@1.79.4: resolution: {integrity: sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==} engines: {node: '>=14.0.0'} @@ -4186,10 +3955,6 @@ packages: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} engines: {node: '>=12'} - semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4225,18 +3990,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -4244,9 +4001,6 @@ packages: shell-quote@1.7.3: resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shellwords@0.1.1: resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} @@ -4256,9 +4010,6 @@ packages: shiki@1.21.0: resolution: {integrity: sha512-apCH5BoWTrmHDPGgg3RF8+HAAbEL/CdbYr8rMw7eIrdhCkZHdVGat5mMNlRtd1erNG01VPMIKHNQ0Pj2HMAiog==} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -4324,18 +4075,6 @@ packages: spawn-sync@1.0.15: resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} - speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} @@ -4373,20 +4112,6 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.padend@3.1.4: - resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - - string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4401,10 +4126,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-bom@5.0.0: resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} engines: {node: '>=12'} @@ -4551,13 +4272,6 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - type-fest@4.20.0: - resolution: {integrity: sha512-MBh+PHUHHisjXf4tlx0CFWoMdjx8zCMLJHOjnV1prABYZFHqtFOyauCIK2/7w4oIfwkF8iNhLtnJEfVY2vn3iw==} - engines: {node: '>=16'} - - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -4595,9 +4309,6 @@ packages: uhyphen@0.2.0: resolution: {integrity: sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - unbuild@2.0.0: resolution: {integrity: sha512-JWCUYx3Oxdzvw2J9kTAp+DKE8df/BnH/JTSj6JyA4SH40ECdFu7FoJJcrm8G92B7TjofQ6GZGjJs50TRxoH6Wg==} hasBin: true @@ -4686,9 +4397,6 @@ packages: validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -4854,21 +4562,10 @@ packages: when@3.7.7: resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - which@1.2.4: resolution: {integrity: sha512-zDRAqDSBudazdfM9zpiI30Fu9ve47htYXcGi3ln0wfKu2a7SmrT6F3VDoYONu//48V8Vz4TdCRNPjtvyRO3yBA==} hasBin: true - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6051,8 +5748,6 @@ snapshots: '@types/minimatch@3.0.5': {} - '@types/natural-compare@1.4.3': {} - '@types/node@20.10.3': dependencies: undici-types: 5.26.5 @@ -6340,11 +6035,6 @@ snapshots: dependencies: dequal: 2.0.3 - array-buffer-byte-length@1.0.0: - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - array-differ@4.0.0: {} array-union@3.0.1: {} @@ -6369,8 +6059,6 @@ snapshots: postcss: 8.4.39 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.5: {} - axobject-query@4.0.0: dependencies: dequal: 2.0.3 @@ -6508,11 +6196,6 @@ snapshots: normalize-url: 8.0.0 responselike: 3.0.0 - call-bind@1.0.2: - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - camelcase@7.0.1: {} caniuse-api@3.0.0: @@ -6733,14 +6416,6 @@ snapshots: core-util-is@1.0.3: {} - cross-spawn@6.0.5: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -6886,11 +6561,6 @@ snapshots: define-lazy-prop@3.0.0: {} - define-properties@1.2.0: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - defu@6.1.4: {} dependency-graph@1.0.0: {} @@ -6962,55 +6632,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.21.2: - dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - - es-set-tostringtag@2.0.1: - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - es6-error@4.1.1: {} esbuild@0.19.12: @@ -7110,7 +6731,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 eventemitter3@5.0.1: {} @@ -7194,10 +6815,6 @@ snapshots: dependencies: tabbable: 6.2.0 - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 @@ -7233,15 +6850,6 @@ snapshots: function-bind@1.1.1: {} - function.prototype.name@1.1.5: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - fx-runner@1.4.0: dependencies: commander: 2.9.0 @@ -7259,13 +6867,6 @@ snapshots: get-func-name@2.0.2: {} - get-intrinsic@1.2.1: - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - get-port@7.1.0: {} get-stream@5.2.0: @@ -7276,11 +6877,6 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -7334,10 +6930,6 @@ snapshots: globals@11.12.0: {} - globalthis@1.0.3: - dependencies: - define-properties: 1.2.0 - globby@13.2.2: dependencies: dir-glob: 3.0.1 @@ -7346,10 +6938,6 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.1 - got@12.6.1: dependencies: '@sindresorhus/is': 5.4.1 @@ -7378,35 +6966,16 @@ snapshots: webidl-conversions: 7.0.0 whatwg-mimetype: 3.0.0 - has-bigints@1.0.2: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.2.1 - - has-proto@1.0.1: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - has-yarn@3.0.0: {} has@1.0.3: dependencies: function-bind: 1.1.1 - hasha@6.0.0: - dependencies: - is-stream: 3.0.0 - type-fest: 4.20.0 - hast-util-to-html@9.0.3: dependencies: '@types/hast': 3.0.4 @@ -7429,8 +6998,6 @@ snapshots: hookable@5.5.3: {} - hosted-git-info@2.8.9: {} - html-entities@2.3.3: {} html-escaper@2.0.2: {} @@ -7486,45 +7053,22 @@ snapshots: ini@2.0.0: {} - internal-slot@1.0.5: - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - is-absolute@0.1.7: dependencies: is-relative: 0.1.3 - is-array-buffer@3.0.2: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.10 - is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - is-callable@1.2.7: {} - is-ci@3.0.1: dependencies: ci-info: 3.8.0 @@ -7533,10 +7077,6 @@ snapshots: dependencies: has: 1.0.3 - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.0 - is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -7568,14 +7108,8 @@ snapshots: is-module@1.0.0: {} - is-negative-zero@2.0.2: {} - is-npm@6.0.0: {} - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -7598,47 +7132,18 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-regex@1.1.4: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - is-relative@0.1.3: {} - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.2 - is-stream@2.0.1: {} is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.10: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typedarray@1.0.0: {} is-unicode-supported@1.3.0: {} is-unicode-supported@2.0.0: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.2 - is-what@4.1.16: {} is-wsl@2.2.0: @@ -7698,8 +7203,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-better-errors@1.0.2: {} - json-parse-even-better-errors@3.0.0: {} json5@2.2.3: {} @@ -7787,13 +7290,6 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - load-json-file@4.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - local-pkg@0.5.0: dependencies: mlly: 1.7.1 @@ -7899,8 +7395,6 @@ snapshots: mdn-data@2.0.30: {} - memorystream@0.3.1: {} - merge-anything@5.1.7: dependencies: is-what: 4.1.16 @@ -8058,13 +7552,9 @@ snapshots: nanoid@3.3.7: {} - natural-compare@1.4.0: {} - ncp@2.0.0: optional: true - nice-try@1.0.5: {} - node-fetch-native@1.6.4: {} node-forge@1.3.1: {} @@ -8082,13 +7572,6 @@ snapshots: node-releases@2.0.18: {} - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.2 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -8108,18 +7591,6 @@ snapshots: npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 - npm-run-all@4.1.5: - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.1 - string.prototype.padend: 3.1.4 - npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -8143,17 +7614,6 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.12.3: {} - - object-keys@1.1.1: {} - - object.assign@4.1.4: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - ofetch@1.4.0: dependencies: destr: 2.0.3 @@ -8241,8 +7701,6 @@ snapshots: p-cancelable@3.0.0: {} - p-map@7.0.2: {} - package-json-from-dist@1.0.0: {} package-json@8.1.1: @@ -8254,11 +7712,6 @@ snapshots: pako@1.0.11: {} - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - parse-json@7.1.1: dependencies: '@babel/code-frame': 7.24.7 @@ -8278,8 +7731,6 @@ snapshots: path-is-absolute@1.0.1: optional: true - path-key@2.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -8291,10 +7742,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-type@3.0.0: - dependencies: - pify: 3.0.0 - path-type@4.0.0: {} pathe@1.1.2: {} @@ -8315,12 +7762,8 @@ snapshots: picomatch@2.3.1: {} - pidtree@0.3.1: {} - pidtree@0.6.0: {} - pify@3.0.0: {} - pkg-types@1.1.3: dependencies: confbox: 0.1.7 @@ -8596,12 +8039,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - read-pkg@3.0.0: - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -8628,12 +8065,6 @@ snapshots: regex@4.3.3: {} - regexp.prototype.flags@1.5.0: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - registry-auth-token@5.0.2: dependencies: '@pnpm/npm-conf': 2.2.2 @@ -8732,17 +8163,11 @@ snapshots: safe-json-stringify@1.2.0: optional: true - safe-regex-test@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - sass@1.79.4: dependencies: chokidar: 4.0.1 immutable: 4.3.4 - source-map-js: 1.2.0 + source-map-js: 1.2.1 sax@1.2.4: {} @@ -8758,8 +8183,6 @@ snapshots: dependencies: semver: 7.6.3 - semver@5.7.1: {} - semver@6.3.1: {} semver@7.6.2: {} @@ -8805,22 +8228,14 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} shell-quote@1.7.3: {} - shell-quote@1.8.1: {} - shellwords@0.1.1: {} shiki@0.14.5: @@ -8839,12 +8254,6 @@ snapshots: '@shikijs/vscode-textmate': 9.2.2 '@types/hast': 3.0.4 - side-channel@1.0.4: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -8906,20 +8315,6 @@ snapshots: concat-stream: 1.6.2 os-shim: 0.1.3 - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.13 - - spdx-exceptions@2.3.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.13 - - spdx-license-ids@3.0.13: {} - speakingurl@14.0.1: {} split@1.0.1: @@ -8956,30 +8351,6 @@ snapshots: get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.padend@3.1.4: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - string.prototype.trim@1.2.7: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - string.prototype.trimend@1.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - string.prototype.trimstart@1.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -8997,8 +8368,6 @@ snapshots: dependencies: ansi-regex: 6.0.1 - strip-bom@3.0.0: {} - strip-bom@5.0.0: {} strip-final-newline@2.0.0: {} @@ -9132,14 +8501,6 @@ snapshots: type-fest@3.13.1: {} - type-fest@4.20.0: {} - - typed-array-length@1.0.4: - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -9170,13 +8531,6 @@ snapshots: uhyphen@0.2.0: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - unbuild@2.0.0(sass@1.79.4)(typescript@5.6.2): dependencies: '@rollup/plugin-alias': 5.1.0(rollup@3.29.4) @@ -9320,11 +8674,6 @@ snapshots: validate-html-nesting@1.2.2: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 @@ -9543,32 +8892,11 @@ snapshots: when@3.7.7: {} - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-typed-array@1.1.9: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - which@1.2.4: dependencies: is-absolute: 0.1.7 isexe: 1.1.2 - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 From cde060ff4f3bbe75eb9821d16fbf8c4490c43b57 Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 18 Oct 2024 13:00:01 -0500 Subject: [PATCH 44/62] docs: Add migration step for Plasmo `--tag` to WXT `--mode` --- docs/guide/resources/migrate.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/guide/resources/migrate.md b/docs/guide/resources/migrate.md index d7a14901..8deb49f3 100644 --- a/docs/guide/resources/migrate.md +++ b/docs/guide/resources/migrate.md @@ -47,7 +47,8 @@ Here's specific steps for other popular frameworks/build tools. 4. If you use CSUI, migrate to WXT's `createContentScriptUi` 5. Convert Plasmo's custom import resolutions to Vite's 6. If importing remote code via a URL, add a `url:` prefix so it works with WXT -7. Compare your output `manifest.json` files from before the migration to after the migration. They should have the same content. If not, tweak your entrypoints and config to get as close as possible. +7. Replace your [Plasmo tags](https://docs.plasmo.com/framework/workflows/build#with-a-custom-tag) (`--tag`) with [WXT build modes](/guide/essentials/config/build-mode) (`--mode`) +8. Compare your output `manifest.json` files from before the migration to after the migration. They should have the same content. If not, tweak your entrypoints and config to get as close as possible. ### `vite-plugin-web-extension` From 9affa07639dbd2e69efb5fa03abc1e4f40fb76e7 Mon Sep 17 00:00:00 2001 From: MultiViewer <106821994+f1multiviewer@users.noreply.github.com> Date: Fri, 18 Oct 2024 20:39:05 +0200 Subject: [PATCH 45/62] docs: Add "MultiViewer Companion" to homepage (#1079) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index 8a440b83..4ffdb830 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -48,6 +48,7 @@ const chromeExtensionIds = [ 'lnjaiaapbakfhlbjenjkhffcdpoompki', // Catppuccin for GitHub File Explorer Icons 'cpaedhbidlpnbdfegakhiamfpndhjpgf', // WebChat: Chat with anyone on any website 'fcphghnknhkimeagdglkljinmpbagone', // YouTube Auto HD + FPS + 'lpomjgbicdemjkgmbnkjncgdebogkhlb', // MultiViewer Companion ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From d09cf6d4b19880e1711203aa370841402677d922 Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Fri, 18 Oct 2024 23:32:11 +0200 Subject: [PATCH 46/62] feat(config): Add `outDirTemplate` for customizing output directory structure (#1074) Co-authored-by: Aaron --- packages/wxt/e2e/tests/user-config.test.ts | 27 ++++++++++++++++++++++ packages/wxt/src/core/resolve-config.ts | 16 ++++++++++++- packages/wxt/src/types.ts | 17 ++++++++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/packages/wxt/e2e/tests/user-config.test.ts b/packages/wxt/e2e/tests/user-config.test.ts index 01ac7f4d..c0b49750 100644 --- a/packages/wxt/e2e/tests/user-config.test.ts +++ b/packages/wxt/e2e/tests/user-config.test.ts @@ -130,4 +130,31 @@ describe('User Config', () => { await project.fileExists('.custom-output/chrome-mv3/background.js'), ).toBe(true); }); + + it('should respect outDirTemplate', async () => { + const project = new TestProject(); + project.setConfigFileConfig({ + srcDir: 'src', + outDirTemplate: + 'test-{{browser}}-mv{{manifestVersion}}-{{mode}}{{modeSuffix}}-{{command}}', + }); + project.addFile( + 'src/entrypoints/background.ts', + `export default defineBackground( + () => console.log('Hello background'), + );`, + ); + + await project.build(); + + expect( + await project.fileExists('.output/test-chrome-mv3-production-build'), + ).toBe(true); + + await project.build({ mode: 'development' }); + + expect( + await project.fileExists('.output/test-chrome-mv3-development-dev-build'), + ).toBe(true); + }); }); diff --git a/packages/wxt/src/core/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts index 8269179c..5c2b9cd9 100644 --- a/packages/wxt/src/core/resolve-config.ts +++ b/packages/wxt/src/core/resolve-config.ts @@ -96,7 +96,21 @@ export async function resolveConfig( const publicDir = path.resolve(srcDir, mergedConfig.publicDir ?? 'public'); const typesDir = path.resolve(wxtDir, 'types'); const outBaseDir = path.resolve(root, mergedConfig.outDir ?? '.output'); - const outDir = path.resolve(outBaseDir, `${browser}-mv${manifestVersion}`); + const modeSuffixes: Record = { + production: '', + development: '-dev', + }; + const outDirTemplate = ( + mergedConfig.outDirTemplate ?? `${browser}-mv${manifestVersion}` + ) + // Resolve all variables in the template + .replaceAll('{{browser}}', browser) + .replaceAll('{{manifestVersion}}', manifestVersion.toString()) + .replaceAll('{{modeSuffix}}', modeSuffixes[mode] ?? `-${mode}`) + .replaceAll('{{mode}}', mode) + .replaceAll('{{command}}', command); + + const outDir = path.resolve(outBaseDir, outDirTemplate); const reloadCommand = mergedConfig.dev?.reloadCommand ?? 'Alt+R'; const runnerConfig = await loadConfig({ diff --git a/packages/wxt/src/types.ts b/packages/wxt/src/types.ts index 445f0447..4041f0b0 100644 --- a/packages/wxt/src/types.ts +++ b/packages/wxt/src/types.ts @@ -53,6 +53,19 @@ export interface InlineConfig { * @default ".output" */ outDir?: string; + /** + * Template string for customizing the output directory structure. + * Available variables: + * - `{{browser}}`: The target browser (e.g., 'chrome', 'firefox') + * - `{{manifestVersion}}`: The manifest version (e.g., 2 or 3) + * - `{{mode}}`: The build mode (e.g., 'development', 'production') + * - `{{modeSuffix}}`: A suffix based on the mode ('-dev' for development, '' for production) + * - `{{command}}`: The WXT command being run (e.g., 'build', 'serve') + * + * @example "{{browser}}-mv{{manifestVersion}}{{modeSuffix}}" + * @default `"{{browser}}-mv{{manifestVersion}}"` + */ + outDirTemplate?: string; /** * > Only available when using the JS API. Not available in `wxt.config.ts` files * @@ -62,7 +75,7 @@ export interface InlineConfig { */ configFile?: string | false; /** - * Set to `true` to show debug logs. Overriden by the command line `--debug` option. + * Set to `true` to show debug logs. Overridden by the command line `--debug` option. * * @default false */ @@ -1234,7 +1247,7 @@ export interface Wxt { */ pm: WxtPackageManager; /** - * If the dev server was started, it will be availble. + * If the dev server was started, it will be available. */ server?: WxtDevServer; /** From cee1424a4c1a5c037a8f2519abcb7542ae99808f Mon Sep 17 00:00:00 2001 From: Aaron Date: Fri, 18 Oct 2024 22:08:14 -0500 Subject: [PATCH 47/62] fix: Ensure consistent hook execution order and add docs (#1081) --- docs/guide/essentials/config/hooks.md | 40 +++++++++++++++++++++++-- docs/guide/essentials/wxt-modules.md | 4 +++ packages/wxt/src/core/resolve-config.ts | 2 ++ packages/wxt/src/core/wxt.ts | 15 ++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/docs/guide/essentials/config/hooks.md b/docs/guide/essentials/config/hooks.md index 930b8bdf..2885ef28 100644 --- a/docs/guide/essentials/config/hooks.md +++ b/docs/guide/essentials/config/hooks.md @@ -2,7 +2,9 @@ WXT includes a system that lets you hook into the build process and make changes. -Here's an example hook that modifies the `manifest.json` file before it is written to the output directory: +## Adding Hooks + +The easiest way to add a hook is via the `wxt.config.ts`. Here's an example hook that modifies the `manifest.json` file before it is written to the output directory: ```ts // wxt.config.ts @@ -17,6 +19,40 @@ export default defineConfig({ }); ``` -> Most hooks provide the `wxt` object as the first argument. It contains the resolved config and other info about the current build. +Most hooks provide the `wxt` object as the first argument. It contains the resolved config and other info about the current build. The other arguments can be modified by reference to change different parts of the build system. Putting one-off hooks like this in your config file is simple, but if you find yourself writing lots of hooks, you should extract them into [WXT Modules](/guide/essentials/wxt-modules) instead. + +## Execution Order + +Because hooks can be defined in multiple places, including [WXT Modules](/guide/essentials/wxt-modules), the order which they're executed can matter. Hooks are executed in the following order: + +1. NPM modules in the order listed in the [`modules` config](/api/reference/wxt/interfaces/InlineConfig#modules) +2. User modules in [`/modules` folder](/guide/essentials/project-structure), loaded alphabetically +3. Hooks listed in your `wxt.config.ts` + +To see the order for your project, run `wxt prepare --debug` flag and search for the "Hook execution order": + +``` +⚙ Hook execution order: +⚙ 1. wxt:built-in:unimport +⚙ 2. src/modules/auto-icons.ts +⚙ 3. src/modules/example.ts +⚙ 4. src/modules/i18n.ts +⚙ 5. wxt.config.ts > hooks +``` + +Changing execution order is simple: + +- Prefix your user modules with a number (lower numbers are loaded first): + + ```html + 📁 modules/ + 📄 0.my-module.ts + 📄 1.another-module.ts + ``` +- If you need to run an NPM module after user modules, just make it a user module and prefix the filename with a number! + ```ts + // modules/2.i18n.ts + export { default } from '@wxt-dev/i18n/module'; + ``` diff --git a/docs/guide/essentials/wxt-modules.md b/docs/guide/essentials/wxt-modules.md index e7fa2d4e..9ec0c43f 100644 --- a/docs/guide/essentials/wxt-modules.md +++ b/docs/guide/essentials/wxt-modules.md @@ -35,6 +35,10 @@ Build-time options are placed in your `wxt.config.ts`, while runtime options is If you use TypeScript, modules augment WXT's types so you will get type errors if options are missing or incorrect. +## Execution Order + +Modules are loaded in the same order as hooks are executed. Refer to the [Hooks documentation](/guide/essentials/config/hooks#execution-order) for more details. + ## Writing Modules Here's what a basic WXT module looks like: diff --git a/packages/wxt/src/core/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts index 5c2b9cd9..e99dbb10 100644 --- a/packages/wxt/src/core/resolve-config.ts +++ b/packages/wxt/src/core/resolve-config.ts @@ -494,6 +494,8 @@ export async function resolveWxtUserModules( cwd: modulesDir, onlyFiles: true, }).catch(() => []); + // Sort modules to ensure a consistent execution order + localModulePaths.sort(); const localModules = await Promise.all>( localModulePaths.map(async (file) => { const absolutePath = normalizePath(path.resolve(modulesDir, file)); diff --git a/packages/wxt/src/core/wxt.ts b/packages/wxt/src/core/wxt.ts index 41be019c..a95c27ae 100644 --- a/packages/wxt/src/core/wxt.ts +++ b/packages/wxt/src/core/wxt.ts @@ -12,6 +12,7 @@ import { createHooks } from 'hookable'; import { createWxtPackageManager } from './package-managers'; import { createViteBuilder } from './builders/vite'; import { builtinModules } from '../builtin-modules'; +import { relative } from 'path'; /** * Global variable set once `createWxt` is called once. Since this variable is used everywhere, this @@ -66,6 +67,20 @@ export async function registerWxt( // Initialize hooks wxt.hooks.addHooks(config.hooks); + if (wxt.config.debug) { + const order = [ + ...builtinModules.map((module) => module.name), + ...config.userModules.map((module) => + relative(wxt.config.root, module.id), + ), + 'wxt.config.ts > hooks', + ]; + wxt.logger.debug('Hook execution order:'); + order.forEach((name, i) => { + wxt.logger.debug(` ${i + 1}. ${name}`); + }); + } + await wxt.hooks.callHook('ready', wxt); } From 4ec2ece85f0b5e01f4937408da56c85926c366b7 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 19 Oct 2024 00:13:11 -0500 Subject: [PATCH 48/62] docs: Add missing redirect for dead link --- docs/public/_redirects | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/public/_redirects b/docs/public/_redirects index ccc1a02a..825f4cad 100644 --- a/docs/public/_redirects +++ b/docs/public/_redirects @@ -39,11 +39,12 @@ # https://github.com/wxt-dev/wxt/issues/704 # Generated via `pnpm docs:build && find docs/.vitepress/dist -type f -name "*.html"` -/guide/i18n/build-integrations.html /i18n#build-integrations -/guide/i18n/introduction.html /i18n -/guide/i18n/messages-file-format.html /i18n#messages-file-format -/guide/i18n/editor-support.html /i18n#editor-support -/guide/i18n/installation.html /i18n#installation +/guide/i18n/build-integrations.html /i18n.html#build-integrations +/guide/i18n/introduction.html /i18n.html +/guide/i18n/messages-file-format.html /i18n.html#messages-file-format +/guide/i18n/editor-support.html /i18n.html#editor-support +/guide/i18n/installation.html /i18n.html#installation +/guide/i18n/installation /i18n.html#installation /guide/key-concepts/content-script-ui.html /guide/essentials/content-scripts.html#ui /guide/key-concepts/manifest.html /guide/essentials/config/manifest.html /guide/key-concepts/wxt-submit.html /api/cli/wxt-submit.html From 22b529453f4867b6b5687ec44f23e0a4c93ba3a5 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 19 Oct 2024 00:43:30 -0500 Subject: [PATCH 49/62] fix: Add missing "type" keyword to type export in generated file --- packages/i18n/src/module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/i18n/src/module.ts b/packages/i18n/src/module.ts index bd7bb368..2699f503 100644 --- a/packages/i18n/src/module.ts +++ b/packages/i18n/src/module.ts @@ -128,7 +128,7 @@ import type { GeneratedI18nStructure } from './structure'; export const i18n = createI18n(); -export { GeneratedI18nStructure } +export { type GeneratedI18nStructure } `, }); }); From 21894d2890cd3d2b14ec215c2e19dace1d0c4660 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 19 Oct 2024 00:45:07 -0500 Subject: [PATCH 50/62] chore: Fix typo in internal function name --- packages/i18n/src/__tests__/utils.test.ts | 16 ++++++++-------- packages/i18n/src/build.ts | 8 ++++---- packages/i18n/src/utils.ts | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/i18n/src/__tests__/utils.test.ts b/packages/i18n/src/__tests__/utils.test.ts index 21477224..e3ef657e 100644 --- a/packages/i18n/src/__tests__/utils.test.ts +++ b/packages/i18n/src/__tests__/utils.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { ChromeMessage } from '../build'; -import { applyChromeMessagePlaceholders, getSubstitionCount } from '../utils'; +import { applyChromeMessagePlaceholders, getSubstitutionCount } from '../utils'; describe('Utils', () => { describe('applyChromeMessagePlaceholders', () => { @@ -38,26 +38,26 @@ describe('Utils', () => { }); }); - describe('getSubstitionCount', () => { + describe('getSubstitutionCount', () => { it('should return the last substution present in the message', () => { - expect(getSubstitionCount('I like $1, but I like $2 better')).toBe(2); + expect(getSubstitutionCount('I like $1, but I like $2 better')).toBe(2); }); it('should return 0 when no substitutions are present', () => { - expect(getSubstitionCount('test')).toBe(0); + expect(getSubstitutionCount('test')).toBe(0); }); it('should ignore escaped dollar signs', () => { - expect(getSubstitionCount('buy $1 now for $$2 dollars')).toBe(1); + expect(getSubstitutionCount('buy $1 now for $$2 dollars')).toBe(1); }); it('should return the highest substitution when skipping numbers', () => { - expect(getSubstitionCount('I like $1, but I like $8 better')).toBe(8); + expect(getSubstitutionCount('I like $1, but I like $8 better')).toBe(8); }); it('should only allow up to 9 substitutions', () => { - expect(getSubstitionCount('Hello $9')).toBe(9); - expect(getSubstitionCount('Hello $10')).toBe(1); + expect(getSubstitutionCount('Hello $9')).toBe(9); + expect(getSubstitutionCount('Hello $10')).toBe(1); }); }); }); diff --git a/packages/i18n/src/build.ts b/packages/i18n/src/build.ts index 7510c452..7ad7aef8 100644 --- a/packages/i18n/src/build.ts +++ b/packages/i18n/src/build.ts @@ -8,7 +8,7 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { parseYAML, parseJSON5, parseTOML } from 'confbox'; import { dirname, extname } from 'node:path'; -import { applyChromeMessagePlaceholders, getSubstitionCount } from './utils'; +import { applyChromeMessagePlaceholders, getSubstitutionCount } from './utils'; // // TYPES @@ -155,7 +155,7 @@ function _parseMessagesObject( case 'number': case 'symbol': { const message = String(object); - const substitutions = getSubstitionCount(message); + const substitutions = getSubstitutionCount(message); return [ { type: 'simple', @@ -177,7 +177,7 @@ function _parseMessagesObject( ); if (isPluralMessage(object)) { const message = Object.values(object).join('|'); - const substitutions = getSubstitionCount(message); + const substitutions = getSubstitutionCount(message); return [ { type: 'plural', @@ -189,7 +189,7 @@ function _parseMessagesObject( } if (depth === 1 && isChromeMessage(object)) { const message = applyChromeMessagePlaceholders(object); - const substitutions = getSubstitionCount(message); + const substitutions = getSubstitutionCount(message); return [ { type: 'chrome', diff --git a/packages/i18n/src/utils.ts b/packages/i18n/src/utils.ts index 905aa1c0..cb9b9634 100644 --- a/packages/i18n/src/utils.ts +++ b/packages/i18n/src/utils.ts @@ -11,7 +11,7 @@ export function applyChromeMessagePlaceholders(message: ChromeMessage): string { ); } -export function getSubstitionCount(message: string): number { +export function getSubstitutionCount(message: string): number { return ( 1 + Array.from({ length: MAX_SUBSTITUTIONS }).findLastIndex((_, i) => From b14c9107fe8a44d273912b9d349c9aadeb5f12a6 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 19 Oct 2024 05:49:58 +0000 Subject: [PATCH 51/62] chore(release): @wxt-dev/i18n v0.2.1 --- packages/i18n/CHANGELOG.md | 22 +++++++++++++++++++++- packages/i18n/package.json | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index 3927d50e..ec1a39df 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## v0.2.1 + +[compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.2.0...i18n-v0.2.1) + +### 🩹 Fixes + +- Add missing "type" keyword to type export in generated file ([22b5294](https://github.com/wxt-dev/wxt/commit/22b5294)) + +### 📖 Documentation + +- Rewrite and restructure the documentation website ([#933](https://github.com/wxt-dev/wxt/pull/933)) + +### 🏡 Chore + +- Fix typo in internal function name ([21894d2](https://github.com/wxt-dev/wxt/commit/21894d2)) + +### ❤️ Contributors + +- Aaron ([@aklinker1](http://github.com/aklinker1)) + ## v0.2.0 [compare changes](https://github.com/wxt-dev/wxt/compare/i18n-v0.1.1...i18n-v0.2.0) @@ -35,4 +55,4 @@ To upgrade, if you were passing a final `options` argument, remove it. If you us ### ❤️ Contributors - Windmillcode0 -- Aaron ([@aklinker1](http://github.com/aklinker1)) +- Aaron ([@aklinker1](http://github.com/aklinker1)) \ No newline at end of file diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 6de879f3..d079c9e1 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,7 +1,7 @@ { "name": "@wxt-dev/i18n", "description": "Type-safe wrapper around browser.i18n.getMessage with additional features", - "version": "0.2.0", + "version": "0.2.1", "type": "module", "repository": { "type": "git", From 842c158f96b1e469f50efdca385f9909e35811f0 Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 19 Oct 2024 02:38:45 -0500 Subject: [PATCH 52/62] chore: Enable `extensionApi: chrome` in template projects (#1083) --- packages/wxt/src/types.ts | 2 +- templates/react/wxt.config.ts | 1 + templates/solid/wxt.config.ts | 1 + templates/svelte/wxt.config.ts | 1 + templates/vanilla/wxt.config.ts | 4 +++- templates/vue/wxt.config.ts | 1 + 6 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/wxt/src/types.ts b/packages/wxt/src/types.ts index 4041f0b0..3ad48acf 100644 --- a/packages/wxt/src/types.ts +++ b/packages/wxt/src/types.ts @@ -329,7 +329,7 @@ export interface InlineConfig { * Which extension API to use. * * - `"webextension-polyfill"`: Use `browser` and types from [`webextension-polyfill`](https://www.npmjs.com/package/webextension-polyfill). - * - `"chrome"` (unstable): Use the regular `chrome` (or `browser` for Firefox/Safari) globals provided by the browser. Types provided by [`@types/chrome`](https://www.npmjs.com/package/@types/chrome), make sure to install the package or types won't work. + * - `"chrome"`: Use the regular `chrome` (or `browser` for Firefox/Safari) globals provided by the browser. Types provided by [`@types/chrome`](https://www.npmjs.com/package/@types/chrome). * * @default "webextension-polyfill" * @since 0.19.0 diff --git a/templates/react/wxt.config.ts b/templates/react/wxt.config.ts index 429f2b90..d1e35387 100644 --- a/templates/react/wxt.config.ts +++ b/templates/react/wxt.config.ts @@ -2,5 +2,6 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ + extensionApi: 'chrome', modules: ['@wxt-dev/module-react'], }); diff --git a/templates/solid/wxt.config.ts b/templates/solid/wxt.config.ts index 1cc7596d..0a5a994f 100644 --- a/templates/solid/wxt.config.ts +++ b/templates/solid/wxt.config.ts @@ -2,5 +2,6 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ + extensionApi: 'chrome', modules: ['@wxt-dev/module-solid'], }); diff --git a/templates/svelte/wxt.config.ts b/templates/svelte/wxt.config.ts index 5749b4e6..f0e4f9aa 100644 --- a/templates/svelte/wxt.config.ts +++ b/templates/svelte/wxt.config.ts @@ -3,5 +3,6 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ srcDir: 'src', + extensionApi: 'chrome', modules: ['@wxt-dev/module-svelte'], }); diff --git a/templates/vanilla/wxt.config.ts b/templates/vanilla/wxt.config.ts index 1e2f53d3..35c7ade7 100644 --- a/templates/vanilla/wxt.config.ts +++ b/templates/vanilla/wxt.config.ts @@ -1,4 +1,6 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html -export default defineConfig({}); +export default defineConfig({ + extensionApi: 'chrome', +}); diff --git a/templates/vue/wxt.config.ts b/templates/vue/wxt.config.ts index 55fbc4af..2ab714b1 100644 --- a/templates/vue/wxt.config.ts +++ b/templates/vue/wxt.config.ts @@ -2,5 +2,6 @@ import { defineConfig } from 'wxt'; // See https://wxt.dev/api/config.html export default defineConfig({ + extensionApi: 'chrome', modules: ['@wxt-dev/module-vue'], }); From e839671f136b8b8e2e2ec90f2a5a621046acfdc8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 19 Oct 2024 19:02:32 +0000 Subject: [PATCH 53/62] chore(release): wxt v0.19.12 --- packages/wxt/CHANGELOG.md | 40 +++++++++++++++++++++++++++++++++++++++ packages/wxt/package.json | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/wxt/CHANGELOG.md b/packages/wxt/CHANGELOG.md index 04f1ab48..bb691427 100644 --- a/packages/wxt/CHANGELOG.md +++ b/packages/wxt/CHANGELOG.md @@ -1,5 +1,45 @@ # Changelog +## v0.19.12 + +[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.11...wxt-v0.19.12) + +### 🚀 Enhancements + +- Add support for `WXT_` environment variable prefix ([#1076](https://github.com/wxt-dev/wxt/pull/1076)) +- **config:** Add `outDirTemplate` for customizing output directory structure ([#1074](https://github.com/wxt-dev/wxt/pull/1074)) + +### 🔥 Performance + +- Replace `execa` with `nano-spawn` for smaller package size ([#1042](https://github.com/wxt-dev/wxt/pull/1042)) +- Downgrade `esbuild` so a single version is shared between sub-dependencies ([#1045](https://github.com/wxt-dev/wxt/pull/1045)) + +### 🩹 Fixes + +- Use directory name when `zip.name` and `package.json#name` are not provided ([#1028](https://github.com/wxt-dev/wxt/pull/1028)) +- Ensure consistent hook execution order and add docs ([#1081](https://github.com/wxt-dev/wxt/pull/1081)) + +### 📖 Documentation + +- Rewrite and restructure the documentation website ([#933](https://github.com/wxt-dev/wxt/pull/933)) + +### 🏡 Chore + +- Remove email from changelog ([#1027](https://github.com/wxt-dev/wxt/pull/1027)) +- **deps:** Bump magicast from 0.3.4 to 0.3.5 ([#1017](https://github.com/wxt-dev/wxt/pull/1017)) +- **deps:** Bump esbuild from 0.23.0 to 0.24.0 ([#1018](https://github.com/wxt-dev/wxt/pull/1018)) +- **deps:** Bump linkedom from 0.18.4 to 0.18.5 ([#1034](https://github.com/wxt-dev/wxt/pull/1034)) +- **deps:** Bump execa from 9.3.1 to 9.4.0 ([#1031](https://github.com/wxt-dev/wxt/pull/1031)) +- Upgrade all non-major dependencies ([#1040](https://github.com/wxt-dev/wxt/pull/1040)) +- Shrink down on dependencies ([#1050](https://github.com/wxt-dev/wxt/pull/1050)) +- Enable `extensionApi: chrome` in template projects ([#1083](https://github.com/wxt-dev/wxt/pull/1083)) + +### ❤️ Contributors + +- Aaron ([@aklinker1](http://github.com/aklinker1)) +- Florian Metz ([@Timeraa](http://github.com/Timeraa)) +- Mezannic ([@mezannic](http://github.com/mezannic)) + ## v0.19.11 [compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.10...wxt-v0.19.11) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index eb44a03c..b3c6a2e2 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -1,7 +1,7 @@ { "name": "wxt", "type": "module", - "version": "0.19.11", + "version": "0.19.12", "description": "Next gen framework for developing web extensions", "repository": { "type": "git", From 1b138f86b918f15d79057f10750b319ab0069d9d Mon Sep 17 00:00:00 2001 From: Aaron Date: Mon, 21 Oct 2024 08:48:52 -0500 Subject: [PATCH 54/62] docs: Remove duplicate env data --- .../essentials/target-different-browsers.md | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/docs/guide/essentials/target-different-browsers.md b/docs/guide/essentials/target-different-browsers.md index 680042dd..5db2fda5 100644 --- a/docs/guide/essentials/target-different-browsers.md +++ b/docs/guide/essentials/target-different-browsers.md @@ -4,7 +4,7 @@ When building an extension with WXT, you can create multiple builds of your exte ## Target a Browser -Use the `-b` CLI flag to create a separate build of your extension for a specific browser. By default, `chrome` is targetted. +Use the `-b` CLI flag to create a separate build of your extension for a specific browser. By default, `chrome` is targeted. ```sh wxt # same as: wxt -b chrome @@ -12,36 +12,44 @@ wxt -b firefox wxt -b custom ``` -Targeting a browser has several effects: +During development, if you target Firefox, Firefox will open. All other strings open Chrome by default. To customize which browsers open, see [Set Browser Binaries](/guide/essentials/config/browser-startup#set-browser-binaries). -1. During development, when passing `firefox`, WXT will automatically open Firefox with the extension installed. For all other browsers, it will open Chrome/Chromium -2. Changes build-time constants provided by WXT: - - `import.meta.env.BROWSER`: A string, the targeted browser - - `import.meta.env.CHROME`: A boolean equivalent to `import.meta.env.BROWSER === "chrome"` - - `import.meta.env.FIREFOX`: A boolean equivalent to `import.meta.env.BROWSER === "firefox"` - - `import.meta.env.EDGE`: A boolean equivalent to `import.meta.env.BROWSER === "edge"` - - `import.meta.env.SAFARI`: A boolean equivalent to `import.meta.env.BROWSER === "safari"` - - `import.meta.env.OPERA`: A boolean equivalent to `import.meta.env.BROWSER === "opera"` +Additionally, WXT defines several constants you can use at runtime to detect which browser is in use: + +```ts +if (import.meta.env.BROWSER === 'firefox') { + console.log('Do something only in Firefox builds'); +} +if (import.meta.env.FIREFOX) { + // Shorthand, equivalent to the if-statement above +} +``` + +Read about [Built-in Environment Variables](/guide/essentials/config/environment-variables.html#built-in-environment-variables) for more details. ## Target a Manifest Version To target specific manifest versions, use the `--mv2` or `--mv3` CLI flags. :::tip Default Manifest Version -By default, WXT will target MV2 for Safari and Firefox and MV3 for all other browers. +By default, WXT will target MV2 for Safari and Firefox and MV3 for all other browsers. ::: -To get the target manifest version at runtime, use the built-time constant provided by WXT: +Similar to the browser, you can get the target manifest version at runtime using the [built-in environment variable](/guide/essentials/config/environment-variables.html#built-in-environment-variables): -- `import.meta.env.MANIFEST_VERSION`: A number, either `2` or `3` +```ts +if (import.meta.env.MANIFEST_VERSION === 2) { + console.log('Do something only in MV2 builds'); +} +``` ## Filtering Entrypoints -Every entrypoint can be included or excluded when targetting specific browsers via the `include` and `exclude` options. +Every entrypoint can be included or excluded when targeting specific browsers via the `include` and `exclude` options. Here are some examples: -- Content script only built when targetting `firefox`: +- Content script only built when targeting `firefox`: ```ts export default defineContentScript({ From 9721bca5a1367958fa033f6626ba5ae4326bcd38 Mon Sep 17 00:00:00 2001 From: Semro Date: Tue, 22 Oct 2024 03:48:03 +0300 Subject: [PATCH 55/62] docs: Add "Sync Watch" extension to homepage (#1098) --- docs/.vitepress/components/UsingWxtSection.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/.vitepress/components/UsingWxtSection.vue b/docs/.vitepress/components/UsingWxtSection.vue index 4ffdb830..610f4e02 100644 --- a/docs/.vitepress/components/UsingWxtSection.vue +++ b/docs/.vitepress/components/UsingWxtSection.vue @@ -49,6 +49,7 @@ const chromeExtensionIds = [ 'cpaedhbidlpnbdfegakhiamfpndhjpgf', // WebChat: Chat with anyone on any website 'fcphghnknhkimeagdglkljinmpbagone', // YouTube Auto HD + FPS 'lpomjgbicdemjkgmbnkjncgdebogkhlb', // MultiViewer Companion + 'ggiafipgeeaaahnjamgpjcgkdpanhddg', // Sync Watch - Watch videos together on any site ]; const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds); From 0092556c1a9647f375656f4dc30bfd0589ddee45 Mon Sep 17 00:00:00 2001 From: Aaron Date: Tue, 22 Oct 2024 08:04:50 -0500 Subject: [PATCH 56/62] fix: Don't use `#private` member variables in `ContentScriptContext` (#1103) --- .../content-scripts/content-script-context.ts | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/wxt/src/client/content-scripts/content-script-context.ts b/packages/wxt/src/client/content-scripts/content-script-context.ts index 38cb9ed3..4474ca46 100644 --- a/packages/wxt/src/client/content-scripts/content-script-context.ts +++ b/packages/wxt/src/client/content-scripts/content-script-context.ts @@ -37,30 +37,30 @@ import { createLocationWatcher } from './location-watcher'; export class ContentScriptContext implements AbortController { private static SCRIPT_STARTED_MESSAGE_TYPE = 'wxt:content-script-started'; - #isTopFrame = window.self === window.top; - #abortController: AbortController; - #locationWatcher = createLocationWatcher(this); + private isTopFrame = window.self === window.top; + private abortController: AbortController; + private locationWatcher = createLocationWatcher(this); constructor( private readonly contentScriptName: string, public readonly options?: Omit, ) { - this.#abortController = new AbortController(); + this.abortController = new AbortController(); - if (this.#isTopFrame) { - this.#listenForNewerScripts({ ignoreFirstEvent: true }); - this.#stopOldScripts(); + if (this.isTopFrame) { + this.listenForNewerScripts({ ignoreFirstEvent: true }); + this.stopOldScripts(); } else { - this.#listenForNewerScripts(); + this.listenForNewerScripts(); } } get signal() { - return this.#abortController.signal; + return this.abortController.signal; } abort(reason?: any): void { - return this.#abortController.abort(reason); + return this.abortController.abort(reason); } get isInvalid(): boolean { @@ -188,7 +188,7 @@ export class ContentScriptContext implements AbortController { ) { if (type === 'wxt:locationchange') { // Start the location watcher when adding the event for the first time - if (this.isValid) this.#locationWatcher.run(); + if (this.isValid) this.locationWatcher.run(); } target.addEventListener?.( @@ -213,7 +213,7 @@ export class ContentScriptContext implements AbortController { ); } - #stopOldScripts() { + stopOldScripts() { // Use postMessage so it get's sent to all the frames of the page. window.postMessage( { @@ -224,7 +224,7 @@ export class ContentScriptContext implements AbortController { ); } - #listenForNewerScripts(options?: { ignoreFirstEvent?: boolean }) { + listenForNewerScripts(options?: { ignoreFirstEvent?: boolean }) { let isFirst = true; const cb = (event: MessageEvent) => { From 6ba12e97369f55dc064fc299054f463a02146ddb Mon Sep 17 00:00:00 2001 From: Florian Metz Date: Tue, 22 Oct 2024 15:28:02 +0200 Subject: [PATCH 57/62] feat: unocss module (#1043) Co-authored-by: Aaron --- .github/workflows/release.yml | 1 + docs/.vitepress/config.ts | 2 + docs/unocss.md | 1 + packages/unocss/README.md | 47 ++ packages/unocss/package.json | 55 ++ packages/unocss/src/index.ts | 68 +++ packages/unocss/tsconfig.json | 4 + packages/wxt-demo/package.json | 2 + packages/wxt-demo/src/common/style.css | 4 - packages/wxt-demo/src/entrypoints/popup.html | 2 +- .../src/entrypoints/ui.content/index.ts | 3 +- .../src/entrypoints/ui.content/style.css | 5 - packages/wxt-demo/src/modules/unocss.ts | 1 + packages/wxt-demo/wxt.config.ts | 29 ++ pnpm-lock.yaml | 490 ++++++++++++++++++ 15 files changed, 703 insertions(+), 11 deletions(-) create mode 100644 docs/unocss.md create mode 100644 packages/unocss/README.md create mode 100644 packages/unocss/package.json create mode 100644 packages/unocss/src/index.ts create mode 100644 packages/unocss/tsconfig.json delete mode 100644 packages/wxt-demo/src/common/style.css create mode 100644 packages/wxt-demo/src/modules/unocss.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5dc10afd..4ab2d2c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,7 @@ on: - module-solid - module-svelte - module-vue + - unocss - wxt jobs: diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 87f398dc..4a649ece 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -11,6 +11,7 @@ import { meta, script } from './utils/head'; import { version as wxtVersion } from '../../packages/wxt/package.json'; import { version as i18nVersion } from '../../packages/i18n/package.json'; import { version as autoIconsVersion } from '../../packages/auto-icons/package.json'; +import { version as unocssVersion } from '../../packages/unocss/package.json'; const title = 'Next-gen Web Extension Framework'; const titleSuffix = ' – WXT'; @@ -82,6 +83,7 @@ export default defineConfig({ navItem(`wxt/storage — ${wxtVersion}`, '/storage'), navItem(`@wxt-dev/auto-icons — ${autoIconsVersion}`, '/auto-icons'), navItem(`@wxt-dev/i18n — ${i18nVersion}`, '/i18n'), + navItem(`@wxt-dev/unocss — ${unocssVersion}`, '/unocss'), ]), ]), ], diff --git a/docs/unocss.md b/docs/unocss.md new file mode 100644 index 00000000..8e407a35 --- /dev/null +++ b/docs/unocss.md @@ -0,0 +1 @@ + diff --git a/packages/unocss/README.md b/packages/unocss/README.md new file mode 100644 index 00000000..b1ba5a62 --- /dev/null +++ b/packages/unocss/README.md @@ -0,0 +1,47 @@ +# WXT UnoCSS + +Use UnoCSS in your WXT extension! + +## Usage + +Install the package: + +```sh +npm i --save-dev @wxt-dev/unocss unocss +pnpm i -D @wxt-dev/unocss unocss +yarn add --dev @wxt-dev/unocss unocss +bun i -D @wxt-dev/unocss unocss +``` + +Add the module to `wxt.config.ts`: + +```ts +export default defineConfig({ + modules: ['@wxt-dev/unocss'], +}); +``` + +Now in your entrypoint, import UnoCSS: + +```ts +import 'uno.css'; +``` + +> [!IMPORTANT] +> While in dev mode, you may see a warning about `uno.css` not being found. This is because in development, we don't know which files should be injected with UnoCSS styles. The warning can be safely ignored as the styles will be properly applied during the build process. + +## Configuration + +The module can be configured via the `unocss` config: + +```ts +export default defineConfig({ + modules: ['@wxt-dev/unocss'], + unocss: { + // Will only apply unocss for popup/main.ts + entrypoints: ['popup/main.ts'], + }, +}); +``` + +Options have JSDocs available in your editor, or you can read them in the source code: [`UnoCSSOptions`](./src/index.ts). diff --git a/packages/unocss/package.json b/packages/unocss/package.json new file mode 100644 index 00000000..c50ab9d4 --- /dev/null +++ b/packages/unocss/package.json @@ -0,0 +1,55 @@ +{ + "name": "@wxt-dev/unocss", + "description": "UnoCSS integration for WXT", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "git+https://github.com/wxt-dev/wxt.git", + "directory": "packages/unocss" + }, + "homepage": "http://wxt.dev/guide/unocss.html", + "keywords": [ + "wxt", + "module", + "unocss", + "css" + ], + "author": { + "name": "Florian Metz", + "email": "me@timeraa.dev" + }, + "license": "MIT", + "type": "module", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "buildc -- unbuild", + "check": "buildc --deps-only -- check" + }, + "peerDependencies": { + "unocss": ">=0.60.0", + "wxt": ">=0.19.0" + }, + "devDependencies": { + "@aklinker1/check": "^1.4.5", + "oxlint": "^0.9.9", + "publint": "^0.2.11", + "typescript": "^5.6.2", + "unbuild": "^2.0.0", + "unocss": "^0.63.3", + "wxt": "workspace:*" + }, + "dependencies": { + "defu": "^6.1.4", + "fast-glob": "^3.3.2" + } +} diff --git a/packages/unocss/src/index.ts b/packages/unocss/src/index.ts new file mode 100644 index 00000000..18ebf51c --- /dev/null +++ b/packages/unocss/src/index.ts @@ -0,0 +1,68 @@ +import 'wxt'; +import { defineWxtModule } from 'wxt/modules'; +import defu from 'defu'; +import UnoCSS from 'unocss/vite'; + +export default defineWxtModule({ + name: '@wxt-dev/unocss', + configKey: 'unocss', + async setup(wxt, options) { + const resolvedOptions = defu, UnoCSSOptions[]>( + options, + { + enabled: true, + excludeEntrypoints: ['background'], + configOrPath: undefined, + }, + ); + + if (!resolvedOptions.enabled) + return wxt.logger.warn(`\`[unocss]\` ${this.name} disabled`); + + const excludedEntrypoints = new Set(resolvedOptions.excludeEntrypoints); + if (wxt.config.debug) { + wxt.logger.debug( + `\`[unocss]\` Excluded entrypoints:`, + [...excludedEntrypoints].join(', '), + ); + } + + wxt.hooks.hook('vite:devServer:extendConfig', (config) => { + config.plugins?.push(UnoCSS()); + }); + + wxt.hooks.hook('vite:build:extendConfig', async (entries, config) => { + if (entries.every((entry) => excludedEntrypoints.has(entry.name))) return; + config.plugins?.push(UnoCSS(resolvedOptions.configOrPath)); + }); + }, +}); + +/** + * Options for the UnoCSS module + */ +export interface UnoCSSOptions { + /** + * Enable UnoCSS + * @default true + */ + enabled?: boolean; + /** + * List of entrypoint names that UnoCSS is not used in. By default, the UnoCSS + * vite plugin is added to all build steps, but this option is used to exclude + * it from specific builds. + * @example ["popup", "options"] + * @default [] + */ + excludeEntrypoints?: string[]; + /** + * The path to your `unocss.config.ts` file, relative to , or inline configuration. + */ + configOrPath?: Parameters>[0]; +} + +declare module 'wxt' { + export interface InlineConfig { + unocss?: UnoCSSOptions; + } +} diff --git a/packages/unocss/tsconfig.json b/packages/unocss/tsconfig.json new file mode 100644 index 00000000..9b2dc061 --- /dev/null +++ b/packages/unocss/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.base.json", + "exclude": ["node_modules/**", "dist/**"] +} diff --git a/packages/wxt-demo/package.json b/packages/wxt-demo/package.json index 8bec6784..5ea0a281 100644 --- a/packages/wxt-demo/package.json +++ b/packages/wxt-demo/package.json @@ -26,8 +26,10 @@ "@types/react": "^18.3.11", "@types/react-dom": "^18.3.0", "@wxt-dev/auto-icons": "workspace:*", + "@wxt-dev/unocss": "workspace:*", "sass": "^1.79.4", "typescript": "^5.6.2", + "unocss": "^0.63.3", "vitest": "^2.1.2", "vitest-plugin-random-seed": "^1.1.0", "wxt": "workspace:*" diff --git a/packages/wxt-demo/src/common/style.css b/packages/wxt-demo/src/common/style.css deleted file mode 100644 index ea1e941c..00000000 --- a/packages/wxt-demo/src/common/style.css +++ /dev/null @@ -1,4 +0,0 @@ -body { - margin: 0; - padding: 0; -} diff --git a/packages/wxt-demo/src/entrypoints/popup.html b/packages/wxt-demo/src/entrypoints/popup.html index 624c1bce..c8f20f68 100644 --- a/packages/wxt-demo/src/entrypoints/popup.html +++ b/packages/wxt-demo/src/entrypoints/popup.html @@ -4,7 +4,7 @@ Popup - +

Hello popup!

diff --git a/packages/wxt-demo/src/entrypoints/ui.content/index.ts b/packages/wxt-demo/src/entrypoints/ui.content/index.ts index f552d8e6..914e73c3 100644 --- a/packages/wxt-demo/src/entrypoints/ui.content/index.ts +++ b/packages/wxt-demo/src/entrypoints/ui.content/index.ts @@ -1,4 +1,4 @@ -import '../../common/style.css'; +import 'uno.css'; import './style.css'; export default defineContentScript({ @@ -13,6 +13,7 @@ export default defineContentScript({ anchor: 'form[role=search]', onMount: (container) => { const app = document.createElement('div'); + app.classList.add('m-4', 'text-red-500'); app.textContent = i18n.t('prompt_for_name'); container.append(app); }, diff --git a/packages/wxt-demo/src/entrypoints/ui.content/style.css b/packages/wxt-demo/src/entrypoints/ui.content/style.css index ce526c21..3bfc8130 100644 --- a/packages/wxt-demo/src/entrypoints/ui.content/style.css +++ b/packages/wxt-demo/src/entrypoints/ui.content/style.css @@ -1,11 +1,6 @@ :root { color-scheme: dark; - color: indianred; } html { background-color: black; } - -div { - padding: 16px; -} diff --git a/packages/wxt-demo/src/modules/unocss.ts b/packages/wxt-demo/src/modules/unocss.ts new file mode 100644 index 00000000..f184c4d5 --- /dev/null +++ b/packages/wxt-demo/src/modules/unocss.ts @@ -0,0 +1 @@ +export { default } from '@wxt-dev/unocss'; diff --git a/packages/wxt-demo/wxt.config.ts b/packages/wxt-demo/wxt.config.ts index 57f8d520..f732c1c3 100644 --- a/packages/wxt-demo/wxt.config.ts +++ b/packages/wxt-demo/wxt.config.ts @@ -1,4 +1,5 @@ import { defineConfig } from 'wxt'; +import { presetUno } from 'unocss'; export default defineConfig({ srcDir: 'src', @@ -27,4 +28,32 @@ export default defineConfig({ // @ts-expect-error: c is not defined, this should error out c: 'c', }, + unocss: { + excludeEntrypoints: [ + 'example', + 'iframe-src', + 'injected', + 'example-tsx', + 'example-2', + 'iframe', + 'location-change', + 'main-world', + 'sandbox', + 'sidepanel', + 'unlisted', + ], + configOrPath: { + content: { + pipeline: { + include: [ + // the default + /\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/, + // include js/ts files + 'src/entrypoints/**/*.{js,ts}', + ], + }, + }, + presets: [presetUno()], + }, + }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d94a395f..83199a50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,6 +249,37 @@ importers: specifier: workspace:* version: link:../wxt + packages/unocss: + dependencies: + defu: + specifier: ^6.1.4 + version: 6.1.4 + fast-glob: + specifier: ^3.3.2 + version: 3.3.2 + devDependencies: + '@aklinker1/check': + specifier: ^1.4.5 + version: 1.4.5(typescript@5.6.2) + oxlint: + specifier: ^0.9.9 + version: 0.9.9 + publint: + specifier: ^0.2.11 + version: 0.2.11 + typescript: + specifier: ^5.6.2 + version: 5.6.2 + unbuild: + specifier: ^2.0.0 + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) + unocss: + specifier: ^0.63.3 + version: 0.63.4(postcss@8.4.47)(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + wxt: + specifier: workspace:* + version: link:../wxt + packages/wxt: dependencies: '@aklinker1/rollup-plugin-visualizer': @@ -463,12 +494,18 @@ importers: '@wxt-dev/auto-icons': specifier: workspace:* version: link:../auto-icons + '@wxt-dev/unocss': + specifier: workspace:* + version: link:../unocss sass: specifier: ^1.79.4 version: 1.79.4 typescript: specifier: ^5.6.2 version: 5.6.2 + unocss: + specifier: ^0.63.3 + version: 0.63.4(postcss@8.4.47)(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) vitest: specifier: ^2.1.2 version: 2.1.2(@types/node@20.16.10)(happy-dom@14.12.3)(sass@1.79.4) @@ -571,6 +608,12 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@antfu/utils@0.7.7': resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} @@ -1245,6 +1288,12 @@ packages: resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.1.33': + resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1447,6 +1496,9 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@rollup/plugin-alias@5.1.0': resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} @@ -1740,6 +1792,86 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@unocss/astro@0.63.4': + resolution: {integrity: sha512-qu1uMDUT8lXU3mm5EjZpnizvjSYtfY0TTDivR5QNm1i3Xd+ErHfdfOpXdJ2mYvxv+X7C570//KUugkTI3Mb3kQ==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/cli@0.63.4': + resolution: {integrity: sha512-kBWEiVW7KWfjptAJsk38w9dVqOmrO2/z0WADFnlX2RuKNDoCn422Rus6tFB12wZsEujC9eFM34P2nnU7IWWtlQ==} + engines: {node: '>=14'} + hasBin: true + + '@unocss/config@0.63.4': + resolution: {integrity: sha512-LfAzM8z0r2comUW94KaSo4JaaEZjPkvrfyVWfO/hyaXa+/xSVIkCTW7+lfWh77hrg1e2SUY1HEvIFBg9Jvb1xQ==} + engines: {node: '>=14'} + + '@unocss/core@0.63.4': + resolution: {integrity: sha512-VB4DJ5DsRWpX64si5tWYRXf1n5UkYQqe2s1V22qFiWmXa7Ec+Vf9s3cxWZmoWFC5P9RQiwM9kAqxdg1G+elVkQ==} + + '@unocss/extractor-arbitrary-variants@0.63.4': + resolution: {integrity: sha512-gI/+2Nv+cH/ZoOc/4X7RLD9CuBXH51jfwGJ1xRveS7tj+EBs8VshP7Vhbn6Jyp69E00wt4hyzjviDoGqcIA8bA==} + + '@unocss/inspector@0.63.4': + resolution: {integrity: sha512-NHvOTScsMrh6oMmwGMrqB1q1RCFTHZCIK0Vwp8hL8/gmNlza2Kd2cQ/WYSEsjW132xeLCOqTME5qny1gpG6SpA==} + + '@unocss/postcss@0.63.4': + resolution: {integrity: sha512-JnSAV1hAZumkm0KZGXYqWsP2I7wnOdr+oeDckHKLdZR2mHNVbDm46H8XGbie55t/gPftaLSsMbaPvRjU2Fclqg==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + + '@unocss/preset-attributify@0.63.4': + resolution: {integrity: sha512-Q2DT4oVdxaL7XxD9sDP3adb5tnYr05sCxCxPhv3ch8brU7uvwbyqkiEw105pWbj0Hb3i/0kD4iq7lVMZYRH5nw==} + + '@unocss/preset-icons@0.63.4': + resolution: {integrity: sha512-V7JV2xvEGeNVjP6HT4IG/BY/HgajJt9CLT2sgKbaVCU9hNOuBs1YTOxua0KLynbTYwr5F5cDMuE/9slQYinZmg==} + + '@unocss/preset-mini@0.63.4': + resolution: {integrity: sha512-sim1/uy/XaVzdnMdepXdbdacXF5QNkPDnl4PYBWTyGuT5yKFpuipWpJDS5zZH5W6PYzKdcDA3YiaJ0S5CiUWpQ==} + + '@unocss/preset-tagify@0.63.4': + resolution: {integrity: sha512-RQkeSCKrGAowomjh8/chlnVWWOFlC+QkHB1oY5isRXNO2HStESZljyL/MisRpgjj0ubPiocoFCI2hRzXT/HrSg==} + + '@unocss/preset-typography@0.63.4': + resolution: {integrity: sha512-PtRXDqF8dW1GYDxiF1Opl+M5fhZeKx63bhvtXXf3iHjVzPDSHB6w1kTElh6vIWeLDNM9GZbbJyB5f2C8DBjibw==} + + '@unocss/preset-uno@0.63.4': + resolution: {integrity: sha512-VMc2R0XRMjXA5u5HnP0SkiWtc8EnEJvipNPKsWBuyyVb0QrsIXtF5z3l3cuZmD6V7m/o9s81yshL0gFOBpF7iQ==} + + '@unocss/preset-web-fonts@0.63.4': + resolution: {integrity: sha512-XuU4dNwTQ0ULlYpQFSKk2JRYACTzpIzpPGP5ZnqdwBxEQH5JhXx4mEmaOhu1OH3c2hZURAkdQvBzYWia4oZ6og==} + + '@unocss/preset-wind@0.63.4': + resolution: {integrity: sha512-8fTUp6ZxH9YiScz4nZ1tRqprayrlQSfguzkjxDvOrwazfNcmxvHSZfC9dtpEmY+QssM1zHH0mmWmWgQYwU9Zdw==} + + '@unocss/reset@0.63.4': + resolution: {integrity: sha512-7lnVH9zuVMekY0IUtcQRrbEqlkhvyGixgzHSWPBF/JA/Pto18bhd+cMeZhuz4eHRbN274bANX+//I+Ilfo7SSg==} + + '@unocss/rule-utils@0.63.4': + resolution: {integrity: sha512-7yRWF881ymxnMcCJSiI/1kMI8uwRqRi3l5XnV+JSGjjF2fDr1POUQjSLaA4s7ZfdEgmjagdLK3F5xqkfMMECNA==} + engines: {node: '>=14'} + + '@unocss/transformer-attributify-jsx@0.63.4': + resolution: {integrity: sha512-5cO9BY/Bga6YmbTch1Neg+E46HerJp5wLxPkIcFCDNsqy2MsB97jsFG1dO0jDUg43E26MRI19tg1eqrWL6sTYg==} + + '@unocss/transformer-compile-class@0.63.4': + resolution: {integrity: sha512-ta6mqq2S5OWcfBzzYnaiMt3ekn2ECNZTqzzqMglnIKPkE+GmqUmmRavRnpc+NGobuqMRcI4F6x8MSSHf4MV0jw==} + + '@unocss/transformer-directives@0.63.4': + resolution: {integrity: sha512-N/dNhmn3e9/Z4IvAujxCdwhNMfx2SihPA2/7GFSMMRi7F0Hn/o2hOqQquRqIJbQwIvi6bJtKwyasxjDoUhJqBA==} + + '@unocss/transformer-variant-group@0.63.4': + resolution: {integrity: sha512-uEHltdfR0Y1nvs1eqHwsgevRFhZkLmA/MsaMEfNblDJ6CLHe/ACNmMoLX1Mcuq/lAPs0X6jGnKudk4QTrCv15Q==} + + '@unocss/vite@0.63.4': + resolution: {integrity: sha512-YK0L177GD8Kx+JtfiCJy4YyBYckAXo4ogC8LZ+pYVNXDMN+F+XItpGI/ofLRaGIaewNg+MJgGY+CQZceABEAfg==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + '@vitejs/plugin-react@4.3.2': resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2062,6 +2194,12 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + bunyan@1.8.15: resolution: {integrity: sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==} engines: {'0': node >=0.10.0} @@ -2307,6 +2445,10 @@ packages: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@3.0.0: + resolution: {integrity: sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -2479,6 +2621,9 @@ packages: resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} engines: {node: '>=0.10'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2593,6 +2738,14 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + filesize@10.1.6: resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} @@ -2701,10 +2854,12 @@ packages: glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -2734,6 +2889,10 @@ packages: growly@1.3.0: resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + happy-dom@14.12.3: resolution: {integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==} engines: {node: '>=16.0.0'} @@ -2821,12 +2980,16 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + importx@0.4.4: + resolution: {integrity: sha512-Lo1pukzAREqrBnnHC+tj+lreMTAvyxtkKsMxLY8H15M/bvLl54p3YuoTI70Tz7Il0AsgSlD7Lrk/FaApRcBL7w==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3017,6 +3180,10 @@ packages: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + jiti@2.0.0-beta.3: + resolution: {integrity: sha512-pmfRbVRs/7khFrSAYnSiJ8C0D5GvzkE4Ey2pAvUcJsw1ly/p+7ut27jbJrjY79BpAJQJ4gXYFtK6d1Aub+9baQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3065,6 +3232,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} @@ -3099,6 +3269,10 @@ packages: resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} engines: {node: '>=18.0.0'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -3196,6 +3370,9 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.10.0: + resolution: {integrity: sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==} + merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -3333,6 +3510,10 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -3494,6 +3675,9 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} + package-manager-detector@0.2.2: + resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==} + pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -3556,6 +3740,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -3894,6 +4082,7 @@ packages: rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup-plugin-dts@6.1.1: @@ -4027,6 +4216,10 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -4213,6 +4406,10 @@ packages: tinyexec@0.3.0: resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyglobby@0.2.9: + resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} + engines: {node: '>=12.0.0'} + tinypool@1.0.0: resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4241,6 +4438,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4260,6 +4461,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + engines: {node: '>=18.0.0'} + hasBin: true + type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -4318,6 +4524,9 @@ packages: typescript: optional: true + unconfig@0.5.5: + resolution: {integrity: sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -4354,6 +4563,18 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + unocss@0.63.4: + resolution: {integrity: sha512-MQ/ktuJ2MoXBsd117DEONFubJRQN6Og4mQJLbT+0nna2aTW4jYJESJ479mJYWq/ajonxEaM+zrf8M92VIWxzEw==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.63.4 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + unplugin@1.14.1: resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} engines: {node: '>=14.0.0'} @@ -4798,6 +5019,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + '@antfu/install-pkg@0.4.1': + dependencies: + package-manager-detector: 0.2.2 + tinyexec: 0.3.0 + + '@antfu/utils@0.7.10': {} + '@antfu/utils@0.7.7': {} '@babel/code-frame@7.24.7': @@ -5346,6 +5574,20 @@ snapshots: '@faker-js/faker@8.4.1': {} + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.1.33': + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/types': 2.0.0 + debug: 4.3.7 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.7.1 + transitivePeerDependencies: + - supports-color + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 @@ -5502,6 +5744,8 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@polka/url@1.0.0-next.28': {} + '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': dependencies: slash: 4.0.0 @@ -5789,6 +6033,152 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@unocss/astro@0.63.4(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/reset': 0.63.4 + '@unocss/vite': 0.63.4(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + optionalDependencies: + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + transitivePeerDependencies: + - rollup + - supports-color + + '@unocss/cli@0.63.4(rollup@4.24.0)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@unocss/config': 0.63.4 + '@unocss/core': 0.63.4 + '@unocss/preset-uno': 0.63.4 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + magic-string: 0.30.11 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + tinyglobby: 0.2.9 + transitivePeerDependencies: + - rollup + - supports-color + + '@unocss/config@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + unconfig: 0.5.5 + transitivePeerDependencies: + - supports-color + + '@unocss/core@0.63.4': {} + + '@unocss/extractor-arbitrary-variants@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + + '@unocss/inspector@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/rule-utils': 0.63.4 + gzip-size: 6.0.0 + sirv: 2.0.4 + + '@unocss/postcss@0.63.4(postcss@8.4.47)': + dependencies: + '@unocss/config': 0.63.4 + '@unocss/core': 0.63.4 + '@unocss/rule-utils': 0.63.4 + css-tree: 3.0.0 + postcss: 8.4.47 + tinyglobby: 0.2.9 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-attributify@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + + '@unocss/preset-icons@0.63.4': + dependencies: + '@iconify/utils': 2.1.33 + '@unocss/core': 0.63.4 + ofetch: 1.4.0 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-mini@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/extractor-arbitrary-variants': 0.63.4 + '@unocss/rule-utils': 0.63.4 + + '@unocss/preset-tagify@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + + '@unocss/preset-typography@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/preset-mini': 0.63.4 + + '@unocss/preset-uno@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/preset-mini': 0.63.4 + '@unocss/preset-wind': 0.63.4 + '@unocss/rule-utils': 0.63.4 + + '@unocss/preset-web-fonts@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + ofetch: 1.4.0 + + '@unocss/preset-wind@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/preset-mini': 0.63.4 + '@unocss/rule-utils': 0.63.4 + + '@unocss/reset@0.63.4': {} + + '@unocss/rule-utils@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + magic-string: 0.30.11 + + '@unocss/transformer-attributify-jsx@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + + '@unocss/transformer-compile-class@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + + '@unocss/transformer-directives@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + '@unocss/rule-utils': 0.63.4 + css-tree: 3.0.0 + + '@unocss/transformer-variant-group@0.63.4': + dependencies: + '@unocss/core': 0.63.4 + + '@unocss/vite@0.63.4(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@unocss/config': 0.63.4 + '@unocss/core': 0.63.4 + '@unocss/inspector': 0.63.4 + chokidar: 3.6.0 + magic-string: 0.30.11 + tinyglobby: 0.2.9 + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + transitivePeerDependencies: + - rollup + - supports-color + '@vitejs/plugin-react@4.3.2(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': dependencies: '@babel/core': 7.25.7 @@ -6158,6 +6548,11 @@ snapshots: dependencies: run-applescript: 7.0.0 + bundle-require@5.0.0(esbuild@0.21.5): + dependencies: + esbuild: 0.21.5 + load-tsconfig: 0.2.5 + bunyan@1.8.15: optionalDependencies: dtrace-provider: 0.8.8 @@ -6448,6 +6843,11 @@ snapshots: mdn-data: 2.0.30 source-map-js: 1.2.0 + css-tree@3.0.0: + dependencies: + mdn-data: 2.10.0 + source-map-js: 1.2.1 + css-what@6.1.0: {} cssesc@3.0.0: {} @@ -6608,6 +7008,8 @@ snapshots: nan: 2.17.0 optional: true + duplexer@0.1.2: {} + eastasianwidth@0.2.0: {} electron-to-chromium@1.4.802: {} @@ -6797,6 +7199,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + filesize@10.1.6: {} fill-range@7.1.1: @@ -6960,6 +7366,10 @@ snapshots: growly@1.3.0: {} + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + happy-dom@14.12.3: dependencies: entities: 4.5.0 @@ -7040,6 +7450,18 @@ snapshots: import-lazy@4.0.0: {} + importx@0.4.4: + dependencies: + bundle-require: 5.0.0(esbuild@0.21.5) + debug: 4.3.7 + esbuild: 0.21.5 + jiti: 2.0.0-beta.3 + jiti-v1: jiti@1.21.6 + pathe: 1.1.2 + tsx: 4.19.1 + transitivePeerDependencies: + - supports-color + imurmurhash@0.1.4: {} inflight@1.0.6: @@ -7193,6 +7615,8 @@ snapshots: jiti@1.21.6: {} + jiti@2.0.0-beta.3: {} + js-tokens@4.0.0: {} js-tokens@9.0.0: {} @@ -7230,6 +7654,8 @@ snapshots: kleur@4.1.5: {} + kolorist@1.8.0: {} + latest-version@7.0.0: dependencies: package-json: 8.1.1 @@ -7290,6 +7716,8 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 + load-tsconfig@0.2.5: {} + local-pkg@0.5.0: dependencies: mlly: 1.7.1 @@ -7395,6 +7823,8 @@ snapshots: mdn-data@2.0.30: {} + mdn-data@2.10.0: {} + merge-anything@5.1.7: dependencies: is-what: 4.1.16 @@ -7519,6 +7949,8 @@ snapshots: mri@1.2.0: {} + mrmime@2.0.0: {} + ms@2.0.0: {} ms@2.1.2: {} @@ -7710,6 +8142,8 @@ snapshots: registry-url: 6.0.1 semver: 7.6.3 + package-manager-detector@0.2.2: {} + pako@1.0.11: {} parse-json@7.1.1: @@ -7762,6 +8196,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.6.0: {} pkg-types@1.1.3: @@ -8266,6 +8702,12 @@ snapshots: dependencies: is-arrayish: 0.3.2 + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + sisteransi@1.0.5: {} slash@4.0.0: {} @@ -8464,6 +8906,11 @@ snapshots: tinyexec@0.3.0: {} + tinyglobby@0.2.9: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.0: {} tinyrainbow@1.2.0: {} @@ -8480,6 +8927,8 @@ snapshots: dependencies: is-number: 7.0.0 + totalist@3.0.1: {} + trim-lines@3.0.1: {} ts-essentials@10.0.1(typescript@5.6.2): @@ -8495,6 +8944,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + tsx@4.19.1: + dependencies: + esbuild: 0.23.0 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 + type-fest@1.4.0: {} type-fest@2.19.0: {} @@ -8564,6 +9020,14 @@ snapshots: - supports-color - vue-tsc + unconfig@0.5.5: + dependencies: + '@antfu/utils': 0.7.10 + defu: 6.1.4 + importx: 0.4.4 + transitivePeerDependencies: + - supports-color + undici-types@5.26.5: {} undici-types@6.19.8: {} @@ -8618,6 +9082,32 @@ snapshots: universalify@2.0.0: {} + unocss@0.63.4(postcss@8.4.47)(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)): + dependencies: + '@unocss/astro': 0.63.4(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + '@unocss/cli': 0.63.4(rollup@4.24.0) + '@unocss/core': 0.63.4 + '@unocss/postcss': 0.63.4(postcss@8.4.47) + '@unocss/preset-attributify': 0.63.4 + '@unocss/preset-icons': 0.63.4 + '@unocss/preset-mini': 0.63.4 + '@unocss/preset-tagify': 0.63.4 + '@unocss/preset-typography': 0.63.4 + '@unocss/preset-uno': 0.63.4 + '@unocss/preset-web-fonts': 0.63.4 + '@unocss/preset-wind': 0.63.4 + '@unocss/transformer-attributify-jsx': 0.63.4 + '@unocss/transformer-compile-class': 0.63.4 + '@unocss/transformer-directives': 0.63.4 + '@unocss/transformer-variant-group': 0.63.4 + '@unocss/vite': 0.63.4(rollup@4.24.0)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) + optionalDependencies: + vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + unplugin@1.14.1(webpack-sources@3.2.3): dependencies: acorn: 8.12.1 From d06f8128f570dd51857ecd9b1d79534bf1f7cd42 Mon Sep 17 00:00:00 2001 From: Malix Date: Tue, 22 Oct 2024 15:35:23 +0200 Subject: [PATCH 58/62] enhance(docs): comparison to real footnotes (#1096) Co-authored-by: Aaron --- docs/.vitepress/config.ts | 7 ++ docs/guide/resources/compare.md | 101 ++++++++++++++++------------- package.json | 4 ++ patches/markdown-it-footnote.md | 1 + patches/markdown-it-footnote.patch | 79 ++++++++++++++++++++++ pnpm-lock.yaml | 13 ++++ 6 files changed, 159 insertions(+), 46 deletions(-) create mode 100644 patches/markdown-it-footnote.md create mode 100644 patches/markdown-it-footnote.patch diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 4a649ece..1a575731 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -8,6 +8,7 @@ import { prepareTypedocSidebar, } from './utils/menus'; import { meta, script } from './utils/head'; +import footnote from 'markdown-it-footnote'; import { version as wxtVersion } from '../../packages/wxt/package.json'; import { version as i18nVersion } from '../../packages/i18n/package.json'; import { version as autoIconsVersion } from '../../packages/auto-icons/package.json'; @@ -47,6 +48,12 @@ export default defineConfig({ }), ], + markdown: { + config: (md) => { + md.use(footnote); + }, + }, + themeConfig: { // https://vitepress.dev/reference/default-theme-config logo: { diff --git a/docs/guide/resources/compare.md b/docs/guide/resources/compare.md index ef025f7f..88080cb6 100644 --- a/docs/guide/resources/compare.md +++ b/docs/guide/resources/compare.md @@ -8,50 +8,59 @@ Lets compare the features of WXT vs [Plasmo](https://docs.plasmo.com/framework) - 🟡 - Partial support - ❌ - No support -| Features | WXT | Plasmo | CRXJS | -| ------------------------------------------------------- | :--------------: | :-------------: | :--------------: | -| Supports all browsers | ✅ | ✅ | 🟡 10 | -| MV2 Support | ✅ | ✅ | 🟡 1 | -| MV3 Support | ✅ | ✅ | 🟡 1 | -| Create Extension ZIPs | ✅ | ✅ | ❌ | -| Create Firefox Sources ZIP | ✅ | ❌ | ❌ | -| First-class TypeScript support | ✅ | ✅ | ✅ | -| Entrypoint discovery | ✅ 2 | ✅ 2 | ❌ | -| Inline entrypoint config | ✅ | ✅ | ❌ 9 | -| Auto-imports | ✅ | ❌ | ❌ | -| Reusable module system | ✅ | ❌ | ❌ | -| Supports all frontend frameworks | ✅ | 🟡 3 | ✅ | -| Framework specific entrypoints (like `Popup.tsx`) | 🟡 4 | ✅ 5 | ❌ | -| Automated publishing | ✅ | ✅ | ❌ | -| Remote Code Bundling (Google Analytics) | ✅ | ✅ | ❌ | -| Unlisted HTML Pages | ✅ | ✅ | ✅ | -| Unlisted Scripts | ✅ | ❌ | ❌ | -| ESM Content Scripts | ❌ 12 | ❌ | ✅ | -| Dev Mode | | | -| `.env` Files | ✅ | ✅ | ✅ | -| Opens browser with extension installed | ✅ | ❌ | ❌ | -| HMR for UIs | ✅ | 🟡 6 | ✅ | -| Reload HTML Files on Change | ✅ | 🟡 7 | ✅ | -| Reload Content Scripts on Change | ✅ | 🟡 7 | ✅ | -| Reload Background on Change | 🟡 7 | 🟡 7 | 🟡 7 | -| Respects Content Script `run_at` | ✅ | ✅ | ❌ 8 | -| Built-in Wrappers | | | | -| Storage | ✅ | ✅ | ❌ 11 | -| Messaging | ❌ 11 | ✅ | ❌ 11 | -| Content Script UI | ✅ | ✅ | ❌ 11 | -| I18n | ✅ | ❌ | ❌ | +| Features | WXT | Plasmo | CRXJS | +| ------------------------------------------------------- | :-----: | :-----: | :-----: | +| Supports all browsers | ✅ | ✅ | 🟡 [^j] | +| MV2 Support | ✅ | ✅ | 🟡 [^a] | +| MV3 Support | ✅ | ✅ | 🟡 [^a] | +| Create Extension ZIPs | ✅ | ✅ | ❌ | +| Create Firefox Sources ZIP | ✅ | ❌ | ❌ | +| First-class TypeScript support | ✅ | ✅ | ✅ | +| Entrypoint discovery | ✅ [^b] | ✅ [^b] | ❌ | +| Inline entrypoint config | ✅ | ✅ | ❌ [^i] | +| Auto-imports | ✅ | ❌ | ❌ | +| Reusable module system | ✅ | ❌ | ❌ | +| Supports all frontend frameworks | ✅ | 🟡 [^c] | ✅ | +| Framework specific entrypoints (like `Popup.tsx`) | 🟡 [^d] | ✅ [^e] | ❌ | +| Automated publishing | ✅ | ✅ | ❌ | +| Remote Code Bundling (Google Analytics) | ✅ | ✅ | ❌ | +| Unlisted HTML Pages | ✅ | ✅ | ✅ | +| Unlisted Scripts | ✅ | ❌ | ❌ | +| ESM Content Scripts | ❌ [^l] | ❌ | ✅ | +| Dev Mode | | | | +| `.env` Files | ✅ | ✅ | ✅ | +| Opens browser with extension installed | ✅ | ❌ | ❌ | +| HMR for UIs | ✅ | 🟡 [^f] | ✅ | +| Reload HTML Files on Change | ✅ | 🟡 [^g] | ✅ | +| Reload Content Scripts on Change | ✅ | 🟡 [^g] | ✅ | +| Reload Background on Change | 🟡 [^g] | 🟡 [^g] | 🟡 [^g] | +| Respects Content Script `run_at` | ✅ | ✅ | ❌ [^h] | +| Built-in Wrappers | | | | +| Storage | ✅ | ✅ | ❌ [^k] | +| Messaging | ❌ [^k] | ✅ | ❌ [^k] | +| Content Script UI | ✅ | ✅ | ❌ [^k] | +| I18n | ✅ | ❌ | ❌ | - - 1: Either MV2 or MV3, not both. -
2: File based. -
3: Only React, Vue, and Svelte. -
4: .html .ts .tsx. -
5: .html .ts .tsx. .vue .svelte. -
6: React only. -
7: Reloads entire extension. -
8: ESM-style loaders run asynchronously. -
9: Entrypoint options all configured in manifest.json. -
10: As of v2.0.0-beta.23, but v2 stable hasn't been released yet. -
11: There is no built-in wrapper around this API. However, you can still access the standard APIs via chrome/browser globals or use any 3rd party NPM package. -
12: WIP, moving very slowly. Follow wxt-dev/wxt#357 for updates. -
+[^a]: Either MV2 or MV3, not both. + +[^b]: File based. + +[^c]: Only React, Vue, and Svelte. + +[^d]: `.html`, `.ts`, `.tsx`. + +[^e]: `.html`, `.ts`, `.tsx`, `.vue`, `.svelte`. + +[^f]: React only. + +[^g]: Reloads entire extension. + +[^h]: ESM-style loaders run asynchronously. + +[^i]: Entrypoint options all configured in `manifest.json`. + +[^j]: As of `v2.0.0-beta.23`, but v2 stable hasn't been released yet. + +[^k]: There is no built-in wrapper around this API. However, you can still access the standard APIs via `chrome`/`browser` globals or use any 3rd party NPM package. + +[^l]: WIP, moving very slowly. Follow [wxt-dev/wxt#357](https://github.com/wxt-dev/wxt/issues/357) for updates. diff --git a/package.json b/package.json index 70e7fb10..21ea5945 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "fast-glob": "^3.3.2", "fs-extra": "^11.2.0", "lint-staged": "^15.2.10", + "markdown-it-footnote": "^4.0.0", "nano-spawn": "^0.1.0", "prettier": "^3.3.3", "simple-git-hooks": "^2.11.1", @@ -51,6 +52,9 @@ "@algolia/client-search", "search-insights" ] + }, + "patchedDependencies": { + "markdown-it-footnote": "patches/markdown-it-footnote.patch" } } } diff --git a/patches/markdown-it-footnote.md b/patches/markdown-it-footnote.md new file mode 100644 index 00000000..dc985a62 --- /dev/null +++ b/patches/markdown-it-footnote.md @@ -0,0 +1 @@ +Removed sub-ids from rendered links. When you link to the same footnote multiple times, the link would look like `[3.2]` instead of just `[3]`. Didn't like how that looked, so this patch removes that function. diff --git a/patches/markdown-it-footnote.patch b/patches/markdown-it-footnote.patch new file mode 100644 index 00000000..2667c4ed --- /dev/null +++ b/patches/markdown-it-footnote.patch @@ -0,0 +1,79 @@ +diff --git a/dist/index.cjs.js b/dist/index.cjs.js +index 806448c967261a61288f0faa0633a91f77d35968..6812dd84bbbb7176af4115a287677454fa562883 100644 +--- a/dist/index.cjs.js ++++ b/dist/index.cjs.js +@@ -13,14 +13,14 @@ function render_footnote_anchor_name(tokens, idx, options, env /*, slf */) { + } + function render_footnote_caption(tokens, idx /*, options, env, slf */) { + let n = Number(tokens[idx].meta.id + 1).toString(); +- if (tokens[idx].meta.subId > 0) n += `:${tokens[idx].meta.subId}`; ++ // if (tokens[idx].meta.subId > 0) n += `:${tokens[idx].meta.subId}`; + return `[${n}]`; + } + function render_footnote_ref(tokens, idx, options, env, slf) { + const id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf); + const caption = slf.rules.footnote_caption(tokens, idx, options, env, slf); + let refid = id; +- if (tokens[idx].meta.subId > 0) refid += `:${tokens[idx].meta.subId}`; ++ // if (tokens[idx].meta.subId > 0) refid += `:${tokens[idx].meta.subId}`; + return `${caption}`; + } + function render_footnote_block_open(tokens, idx, options) { +@@ -31,7 +31,7 @@ function render_footnote_block_close() { + } + function render_footnote_open(tokens, idx, options, env, slf) { + let id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf); +- if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}`; ++ // if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}`; + return `
  • `; + } + function render_footnote_close() { +@@ -39,7 +39,7 @@ function render_footnote_close() { + } + function render_footnote_anchor(tokens, idx, options, env, slf) { + let id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf); +- if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}`; ++ // if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}`; + + /* ↩ with escape code to prevent display as Apple Emoji on iOS */ + return ` \u21a9\uFE0E`; +diff --git a/index.mjs b/index.mjs +index 48277ca67206f248b9deb0058e9a7d69dbc07702..718e3e527b2513e4f6f59cba9d4526a36d58f6bc 100644 +--- a/index.mjs ++++ b/index.mjs +@@ -17,7 +17,7 @@ function render_footnote_anchor_name (tokens, idx, options, env/*, slf */) { + function render_footnote_caption (tokens, idx/*, options, env, slf */) { + let n = Number(tokens[idx].meta.id + 1).toString() + +- if (tokens[idx].meta.subId > 0) n += `:${tokens[idx].meta.subId}` ++ // if (tokens[idx].meta.subId > 0) n += `:${tokens[idx].meta.subId}` + + return `[${n}]` + } +@@ -27,7 +27,7 @@ function render_footnote_ref (tokens, idx, options, env, slf) { + const caption = slf.rules.footnote_caption(tokens, idx, options, env, slf) + let refid = id + +- if (tokens[idx].meta.subId > 0) refid += `:${tokens[idx].meta.subId}` ++ // if (tokens[idx].meta.subId > 0) refid += `:${tokens[idx].meta.subId}` + + return `${caption}` + } +@@ -45,7 +45,7 @@ function render_footnote_block_close () { + function render_footnote_open (tokens, idx, options, env, slf) { + let id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf) + +- if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}` ++ // if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}` + + return `
  • ` + } +@@ -57,7 +57,7 @@ function render_footnote_close () { + function render_footnote_anchor (tokens, idx, options, env, slf) { + let id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf) + +- if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}` ++ // if (tokens[idx].meta.subId > 0) id += `:${tokens[idx].meta.subId}` + + /* ↩ with escape code to prevent display as Apple Emoji on iOS */ + return ` \u21a9\uFE0E` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83199a50..f6686a44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + markdown-it-footnote: + hash: ue34jdgdx43siqdj557feoepzq + path: patches/markdown-it-footnote.patch + importers: .: @@ -35,6 +40,9 @@ importers: lint-staged: specifier: ^15.2.10 version: 15.2.10 + markdown-it-footnote: + specifier: ^4.0.0 + version: 4.0.0(patch_hash=ue34jdgdx43siqdj557feoepzq) nano-spawn: specifier: ^0.1.0 version: 0.1.0 @@ -3353,6 +3361,9 @@ packages: mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-it-footnote@4.0.0: + resolution: {integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==} + marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} @@ -7803,6 +7814,8 @@ snapshots: mark.js@8.11.1: {} + markdown-it-footnote@4.0.0(patch_hash=ue34jdgdx43siqdj557feoepzq): {} + marked@4.3.0: {} marky@1.2.5: {} From c031c6e82e7ac95f4384f19f674313724d94cbf2 Mon Sep 17 00:00:00 2001 From: Craig Slusher Date: Tue, 22 Oct 2024 09:36:24 -0400 Subject: [PATCH 59/62] feat(env): Load env from `.env.[browser]` variants (#1078) Co-authored-by: Aaron --- .../essentials/config/environment-variables.md | 4 ++++ packages/wxt/src/core/resolve-config.ts | 2 +- packages/wxt/src/core/utils/env.ts | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/guide/essentials/config/environment-variables.md b/docs/guide/essentials/config/environment-variables.md index ee1e2297..8e299665 100644 --- a/docs/guide/essentials/config/environment-variables.md +++ b/docs/guide/essentials/config/environment-variables.md @@ -9,6 +9,10 @@ WXT supports [dotenv files the same way as Vite](https://vite.dev/guide/env-and- .env.local .env.[mode] .env.[mode].local +.env.[browser] +.env.[browser].local +.env.[mode].[browser] +.env.[mode].[browser].local ``` And any environment variables listed inside them will be available at runtime: diff --git a/packages/wxt/src/core/resolve-config.ts b/packages/wxt/src/core/resolve-config.ts index e99dbb10..dc93a319 100644 --- a/packages/wxt/src/core/resolve-config.ts +++ b/packages/wxt/src/core/resolve-config.ts @@ -74,7 +74,7 @@ export async function resolveConfig( const mode = mergedConfig.mode ?? COMMAND_MODES[command]; const env: ConfigEnv = { browser, command, manifestVersion, mode }; - loadEnv(mode); // Load any environment variables used below + loadEnv(mode, browser); // Load any environment variables used below const root = path.resolve( inlineConfig.root ?? userConfig.root ?? process.cwd(), diff --git a/packages/wxt/src/core/utils/env.ts b/packages/wxt/src/core/utils/env.ts index a6a65ae3..cd189ab2 100644 --- a/packages/wxt/src/core/utils/env.ts +++ b/packages/wxt/src/core/utils/env.ts @@ -1,10 +1,21 @@ import { config } from 'dotenv'; +import type { TargetBrowser } from '../../types'; /** - * Load environment files based on the current mode. + * Load environment files based on the current mode and browser. */ -export function loadEnv(mode: string) { +export function loadEnv(mode: string, browser: TargetBrowser) { return config({ - path: [`.env.${mode}.local`, `.env.${mode}`, `.env.local`, `.env`], + // Files on top override files below + path: [ + `.env.${mode}.${browser}.local`, + `.env.${mode}.${browser}`, + `.env.${browser}.local`, + `.env.${browser}`, + `.env.${mode}.local`, + `.env.${mode}`, + `.env.local`, + `.env`, + ], }); } From ae1e27657737732cd6e8b1082f3d0c7bd651868e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 22 Oct 2024 13:45:03 +0000 Subject: [PATCH 60/62] chore(release): wxt v0.19.13 --- packages/wxt/CHANGELOG.md | 17 +++++++++++++++++ packages/wxt/package.json | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/wxt/CHANGELOG.md b/packages/wxt/CHANGELOG.md index bb691427..333c1458 100644 --- a/packages/wxt/CHANGELOG.md +++ b/packages/wxt/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## v0.19.13 + +[compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.12...wxt-v0.19.13) + +### 🚀 Enhancements + +- **env:** Load env from `.env.[browser]` variants ([#1078](https://github.com/wxt-dev/wxt/pull/1078)) + +### 🩹 Fixes + +- Don't use `#private` member variables in `ContentScriptContext` ([#1103](https://github.com/wxt-dev/wxt/pull/1103)) + +### ❤️ Contributors + +- Craig Slusher +- Aaron + ## v0.19.12 [compare changes](https://github.com/wxt-dev/wxt/compare/wxt-v0.19.11...wxt-v0.19.12) diff --git a/packages/wxt/package.json b/packages/wxt/package.json index b3c6a2e2..11259f9e 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -1,7 +1,7 @@ { "name": "wxt", "type": "module", - "version": "0.19.12", + "version": "0.19.13", "description": "Next gen framework for developing web extensions", "repository": { "type": "git", From d20793d5e67209afece505e77a99a006e2f37774 Mon Sep 17 00:00:00 2001 From: Aaron Date: Tue, 22 Oct 2024 09:50:57 -0500 Subject: [PATCH 61/62] docs: Use full URLs in README so they work on the docs site --- packages/auto-icons/README.md | 2 +- packages/unocss/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/auto-icons/README.md b/packages/auto-icons/README.md index 3ee34773..60ee8558 100644 --- a/packages/auto-icons/README.md +++ b/packages/auto-icons/README.md @@ -41,4 +41,4 @@ export default defineConfig({ }); ``` -Options have JSDocs available in your editor, or you can read them in the source code: [`AutoIconsOptions`](./src/index.ts). +Options have JSDocs available in your editor, or you can read them in the source code: [`AutoIconsOptions`](https://github.com/wxt-dev/wxt/blob/main/packages/auto-icons/src/index.ts). diff --git a/packages/unocss/README.md b/packages/unocss/README.md index b1ba5a62..b3476738 100644 --- a/packages/unocss/README.md +++ b/packages/unocss/README.md @@ -44,4 +44,4 @@ export default defineConfig({ }); ``` -Options have JSDocs available in your editor, or you can read them in the source code: [`UnoCSSOptions`](./src/index.ts). +Options have JSDocs available in your editor, or you can read them in the source code: [`UnoCSSOptions`](https://github.com/wxt-dev/wxt/blob/main/packages/auto-icons/src/index.ts). From bdb775c88d63bec9fd25beeb8e407442ac70620a Mon Sep 17 00:00:00 2001 From: Aaron Date: Tue, 22 Oct 2024 09:58:51 -0500 Subject: [PATCH 62/62] Update changelog --- packages/wxt/CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/wxt/CHANGELOG.md b/packages/wxt/CHANGELOG.md index 333c1458..b1be4b69 100644 --- a/packages/wxt/CHANGELOG.md +++ b/packages/wxt/CHANGELOG.md @@ -14,8 +14,8 @@ ### ❤️ Contributors -- Craig Slusher -- Aaron +- Aaron ([@aklinker1](http://github.com/aklinker1)) +- Craig Slusher ([@sleekslush](http://github.com/sleekslush)) ## v0.19.12 @@ -2578,4 +2578,4 @@ Initial release of WXT. Full support for production builds and initial toolkit f ### 🤖 CI - Create validation workflow ([#12](https://github.com/wxt-dev/wxt/pull/12)) -- Create release workflow ([#13](https://github.com/wxt-dev/wxt/pull/13)) \ No newline at end of file +- Create release workflow ([#13](https://github.com/wxt-dev/wxt/pull/13))
  • Input PatternFilename Output Path
    + entrypoints/{{ pattern[0] }} @@ -31,7 +31,7 @@ const props = defineProps<{ /> + /{{ pattern[1] }}