diff --git a/examples/svelte-state-rune/README.md b/examples/svelte-state-rune/README.md new file mode 100644 index 0000000..3971f13 --- /dev/null +++ b/examples/svelte-state-rune/README.md @@ -0,0 +1,20 @@ +--- +name: Svelte State Rune +description: A uses a state rune with WXT's storage to enable clean subscriptions in Svelte (and TS) as well as persisting state. +--- + +```sh +npm install +npm run dev +``` + +Demonstrates how the browser.storage API allows different parts of the extension share state and reflect activity on the current page. + +- The page fires a "counter:updated" event every second. +- The Content Script handles these events by pushing the event payload into session storage. +- The CounterState class watches the store and updates its reactive state property on change +- App.svelte reflects the value of `counterState.state` + +Open dev tools or the extension service worker logs, click the extension's action icon and watch the events being fired by the active page update the counter. + +When closing and re-opening the Popup, the state is persisted. diff --git a/examples/svelte-state-rune/index.html b/examples/svelte-state-rune/index.html new file mode 100644 index 0000000..790b1fb --- /dev/null +++ b/examples/svelte-state-rune/index.html @@ -0,0 +1,24 @@ + + + + + + Document + + +

Emit events

+ + + + diff --git a/examples/svelte-state-rune/package.json b/examples/svelte-state-rune/package.json new file mode 100644 index 0000000..6dce655 --- /dev/null +++ b/examples/svelte-state-rune/package.json @@ -0,0 +1,26 @@ +{ + "name": "svelte-state-rune", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "wxt", + "dev:firefox": "wxt -b firefox", + "build": "wxt build", + "build:firefox": "wxt build -b firefox", + "zip": "wxt zip", + "zip:firefox": "wxt zip -b firefox", + "check": "svelte-check --tsconfig ./tsconfig.json", + "postinstall": "wxt prepare" + }, + "devDependencies": { + "@tsconfig/svelte": "^5.0.4", + "@wxt-dev/module-svelte": "^2.0.3", + "svelte": "^5.28.2", + "svelte-check": "^4.1.6", + "tslib": "^2.7.0", + "typescript": "^5.8.2", + "vite": "6.3.3", + "wxt": "^0.20.5" + } +} diff --git a/examples/svelte-state-rune/public/icon/128.png b/examples/svelte-state-rune/public/icon/128.png new file mode 100644 index 0000000..9e35d13 Binary files /dev/null and b/examples/svelte-state-rune/public/icon/128.png differ diff --git a/examples/svelte-state-rune/public/icon/16.png b/examples/svelte-state-rune/public/icon/16.png new file mode 100644 index 0000000..cd09f8c Binary files /dev/null and b/examples/svelte-state-rune/public/icon/16.png differ diff --git a/examples/svelte-state-rune/public/icon/32.png b/examples/svelte-state-rune/public/icon/32.png new file mode 100644 index 0000000..f51ce1b Binary files /dev/null and b/examples/svelte-state-rune/public/icon/32.png differ diff --git a/examples/svelte-state-rune/public/icon/48.png b/examples/svelte-state-rune/public/icon/48.png new file mode 100644 index 0000000..cb7a449 Binary files /dev/null and b/examples/svelte-state-rune/public/icon/48.png differ diff --git a/examples/svelte-state-rune/public/icon/96.png b/examples/svelte-state-rune/public/icon/96.png new file mode 100644 index 0000000..c28ad52 Binary files /dev/null and b/examples/svelte-state-rune/public/icon/96.png differ diff --git a/examples/svelte-state-rune/public/wxt.svg b/examples/svelte-state-rune/public/wxt.svg new file mode 100644 index 0000000..0e76320 --- /dev/null +++ b/examples/svelte-state-rune/public/wxt.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/examples/svelte-state-rune/src/assets/svelte.svg b/examples/svelte-state-rune/src/assets/svelte.svg new file mode 100644 index 0000000..8c056ce --- /dev/null +++ b/examples/svelte-state-rune/src/assets/svelte.svg @@ -0,0 +1 @@ + diff --git a/examples/svelte-state-rune/src/entrypoints/background.ts b/examples/svelte-state-rune/src/entrypoints/background.ts new file mode 100644 index 0000000..2b548bc --- /dev/null +++ b/examples/svelte-state-rune/src/entrypoints/background.ts @@ -0,0 +1,7 @@ +export default defineBackground(() => { + // Set the access level so `browser.storage.session` is defined and availble + // in content scripts: https://developer.chrome.com/docs/extensions/reference/api/storage#storage_areas + void browser.storage.session.setAccessLevel?.({ + accessLevel: "TRUSTED_AND_UNTRUSTED_CONTEXTS", + }); +}); diff --git a/examples/svelte-state-rune/src/entrypoints/content.ts b/examples/svelte-state-rune/src/entrypoints/content.ts new file mode 100644 index 0000000..6809f7b --- /dev/null +++ b/examples/svelte-state-rune/src/entrypoints/content.ts @@ -0,0 +1,11 @@ +import { counterStore } from "@/lib/counter-store"; + +export default defineContentScript({ + matches: ["http://localhost/*"], + + main() { + document.addEventListener("counter:updated", (event) => { + void counterStore.setValue(event.detail); + }); + }, +}); diff --git a/examples/svelte-state-rune/src/entrypoints/popup/App.svelte b/examples/svelte-state-rune/src/entrypoints/popup/App.svelte new file mode 100644 index 0000000..8fecc4c --- /dev/null +++ b/examples/svelte-state-rune/src/entrypoints/popup/App.svelte @@ -0,0 +1,22 @@ + + +
+
+ + + + + + +
+

WXT + Svelte

+ +
+

{counterState.state.counter}

+
+ +

Click on the WXT and Svelte logos to learn more

+
diff --git a/examples/svelte-state-rune/src/entrypoints/popup/app.css b/examples/svelte-state-rune/src/entrypoints/popup/app.css new file mode 100644 index 0000000..94b9a0a --- /dev/null +++ b/examples/svelte-state-rune/src/entrypoints/popup/app.css @@ -0,0 +1,53 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +.app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; + + &:hover { + filter: drop-shadow(0 0 2em #54bc4ae0); + } + + &.svelte:hover { + filter: drop-shadow(0 0 2em #ff3e00aa); + } +} + +.read-the-docs { + color: #888; +} + +.card { + font-size: 2rem; +} diff --git a/examples/svelte-state-rune/src/entrypoints/popup/index.html b/examples/svelte-state-rune/src/entrypoints/popup/index.html new file mode 100644 index 0000000..5a2184e --- /dev/null +++ b/examples/svelte-state-rune/src/entrypoints/popup/index.html @@ -0,0 +1,13 @@ + + + + + + Default Popup Title + + + +
+ + + diff --git a/examples/svelte-state-rune/src/entrypoints/popup/main.ts b/examples/svelte-state-rune/src/entrypoints/popup/main.ts new file mode 100644 index 0000000..356e261 --- /dev/null +++ b/examples/svelte-state-rune/src/entrypoints/popup/main.ts @@ -0,0 +1,10 @@ +import { mount } from "svelte"; + +import "./app.css"; +import App from "./App.svelte"; + +const app = mount(App, { + target: document.getElementById("app")!, +}); + +export default app; diff --git a/examples/svelte-state-rune/src/lib/counter-state.svelte.ts b/examples/svelte-state-rune/src/lib/counter-state.svelte.ts new file mode 100644 index 0000000..c28234d --- /dev/null +++ b/examples/svelte-state-rune/src/lib/counter-state.svelte.ts @@ -0,0 +1,16 @@ +import { counterStore } from "./counter-store.ts"; + +class CounterState { + state = $state(counterStore.fallback); + + constructor() { + counterStore.getValue().then(this.updateCounter); + counterStore.watch(this.updateCounter); + } + + updateCounter = (newState: { counter: number } | null) => { + this.state = newState ?? counterStore.fallback; + }; +} + +export const counterState = new CounterState(); diff --git a/examples/svelte-state-rune/src/lib/counter-store.ts b/examples/svelte-state-rune/src/lib/counter-store.ts new file mode 100644 index 0000000..4d51383 --- /dev/null +++ b/examples/svelte-state-rune/src/lib/counter-store.ts @@ -0,0 +1,6 @@ +export const counterStore = storage.defineItem<{ counter: number }>( + "session:counter", + { + fallback: { counter: 0 } + } +); diff --git a/examples/svelte-state-rune/src/typings/example.d.ts b/examples/svelte-state-rune/src/typings/example.d.ts new file mode 100644 index 0000000..833ab9e --- /dev/null +++ b/examples/svelte-state-rune/src/typings/example.d.ts @@ -0,0 +1,3 @@ +export type CounterEvent = CustomEvent<{ + counter: number; +}>; diff --git a/examples/svelte-state-rune/src/typings/globals.ts b/examples/svelte-state-rune/src/typings/globals.ts new file mode 100644 index 0000000..b69117f --- /dev/null +++ b/examples/svelte-state-rune/src/typings/globals.ts @@ -0,0 +1,7 @@ +import type { CounterEvent } from "./example.d.ts"; + +declare global { + interface DocumentEventMap { + "counter:updated": CounterEvent; + } +} diff --git a/examples/svelte-state-rune/tsconfig.json b/examples/svelte-state-rune/tsconfig.json new file mode 100644 index 0000000..bbcd150 --- /dev/null +++ b/examples/svelte-state-rune/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "./.wxt/tsconfig.json", + "compilerOptions": { + "useDefineForClassFields": true, + "allowImportingTsExtensions": true + } +} diff --git a/examples/svelte-state-rune/wxt-env.d.ts b/examples/svelte-state-rune/wxt-env.d.ts new file mode 100644 index 0000000..1a25456 --- /dev/null +++ b/examples/svelte-state-rune/wxt-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/svelte-state-rune/wxt.config.ts b/examples/svelte-state-rune/wxt.config.ts new file mode 100644 index 0000000..41355f9 --- /dev/null +++ b/examples/svelte-state-rune/wxt.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "wxt"; + +// See https://wxt.dev/api/config.html +export default defineConfig({ + srcDir: "src", + modules: ["@wxt-dev/module-svelte"], + manifest: { + permissions: ["storage"], + }, + webExt: { + startUrls: ["http://localhost:3000"], + }, +}); diff --git a/metadata.json b/metadata.json index c498a18..634daed 100644 --- a/metadata.json +++ b/metadata.json @@ -297,6 +297,24 @@ "storage" ] }, + { + "name": "Svelte State Rune", + "description": "A uses a state rune with WXT's storage to enable clean subscriptions in Svelte (and TS) as well as persisting state.", + "searchText": "Svelte State Rune|A uses a state rune with WXT's storage to enable clean subscriptions in Svelte (and TS) as well as persisting state.|@wxt-dev/module-svelte|svelte|vite|storage|browser.storage.session.setAccessLevel|browser.storage.session", + "url": "https://github.com/wxt-dev/examples/tree/main/examples/svelte-state-rune", + "apis": [ + "browser.storage.session.setAccessLevel", + "browser.storage.session" + ], + "packages": [ + "@wxt-dev/module-svelte", + "svelte", + "vite" + ], + "permissions": [ + "storage" + ] + }, { "name": "TailwindCSS", "description": "Add TailwindCSS to your extension.", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94c95d0..e4cdbd3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -355,7 +355,7 @@ importers: version: 5.28.2 svelte-check: specifier: ^4.1.6 - version: 4.1.6(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.2) + version: 4.1.7(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.2) tslib: specifier: ^2.7.0 version: 2.8.0 @@ -674,6 +674,11 @@ packages: engines: {node: '>= 0.10.4'} hasBin: true + '@devicefarmer/adbkit@3.3.8': + resolution: {integrity: sha512-7rBLLzWQnBwutH2WZ0EWUkQdihqrnLYCUMaB44hSol9e0/cdIhuNFcqZO0xNheAU6qqHVA8sMiLofkYTgb+lmw==} + engines: {node: '>= 0.10.4'} + hasBin: true + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1801,6 +1806,13 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + atomically@2.0.3: + resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1840,6 +1852,10 @@ packages: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -1921,6 +1937,10 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001636: resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} @@ -1976,6 +1996,11 @@ packages: engines: {node: '>=12.13.0'} hasBin: true + chrome-launcher@1.1.2: + resolution: {integrity: sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==} + engines: {node: '>=12.13.0'} + hasBin: true + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -2074,6 +2099,10 @@ packages: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} + configstore@7.0.0: + resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==} + engines: {node: '>=18'} + consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2251,6 +2280,10 @@ packages: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + dotenv-expand@12.0.1: resolution: {integrity: sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==} engines: {node: '>=12'} @@ -2404,6 +2437,10 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -2446,6 +2483,11 @@ packages: resolution: {integrity: sha512-I9rAm1w8U3CdhgO4EzTJsCvgcbvynZn9lOySkZf78wUdUIQH2w9QOKf3pAX+THt2XMSSR3kJSuM8P7bYux9j8g==} hasBin: true + firefox-profile@4.7.0: + resolution: {integrity: sha512-aGApEu5bfCNbA4PGUZiRJAIU6jKmghV2UVdklXAofnNtiDjqYw0czLS46W7IfFqVKgKhFB8Ao2YoNGHY4BoIMQ==} + engines: {node: '>=18'} + hasBin: true + for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -2677,6 +2719,14 @@ packages: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -2741,6 +2791,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ci@1.0.0: + resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} + engines: {node: '>=18'} + hasBin: true + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2750,6 +2805,10 @@ packages: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} + is-installed-globally@1.0.0: + resolution: {integrity: sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==} + engines: {node: '>=18'} + is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} @@ -2770,6 +2829,10 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -2892,10 +2955,18 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + ky@1.8.1: + resolution: {integrity: sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw==} + engines: {node: '>=18'} + latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -3445,6 +3516,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -3481,6 +3555,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -3583,6 +3660,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + recast@0.23.9: resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} engines: {node: '>= 4'} @@ -3763,6 +3844,10 @@ packages: spawn-sync@1.0.15: resolution: {integrity: sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -3850,6 +3935,9 @@ packages: strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + sugarss@4.0.1: resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} @@ -3900,6 +3988,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -4060,6 +4151,10 @@ packages: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} + update-notifier@7.3.1: + resolution: {integrity: sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA==} + engines: {node: '>=18'} + use-callback-ref@1.3.2: resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} @@ -4238,6 +4333,10 @@ packages: resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -4293,6 +4392,9 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + when-exit@2.1.4: + resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} + when@3.7.7: resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} @@ -4318,6 +4420,10 @@ packages: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + winreg@0.0.12: resolution: {integrity: sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==} @@ -4363,6 +4469,10 @@ packages: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -4705,6 +4815,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@devicefarmer/adbkit@3.3.8': + dependencies: + '@devicefarmer/adbkit-logcat': 2.1.3 + '@devicefarmer/adbkit-monkey': 1.2.1 + bluebird: 3.7.2 + commander: 9.5.0 + debug: 4.3.5 + node-forge: 1.3.1 + split: 1.0.1 + transitivePeerDependencies: + - supports-color + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -5784,6 +5906,13 @@ snapshots: at-least-node@1.0.0: {} + atomic-sleep@1.0.0: {} + + atomically@2.0.3: + dependencies: + stubborn-fs: 1.2.5 + when-exit: 2.1.4 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -5823,6 +5952,17 @@ snapshots: widest-line: 4.0.1 wrap-ansi: 8.1.0 + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.40.1 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 @@ -5923,6 +6063,8 @@ snapshots: camelcase@7.0.1: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001636: {} caniuse-lite@1.0.30001715: {} @@ -5982,6 +6124,15 @@ snapshots: transitivePeerDependencies: - supports-color + chrome-launcher@1.1.2: + dependencies: + '@types/node': 22.7.3 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.1 + transitivePeerDependencies: + - supports-color + ci-info@3.9.0: {} ci-info@4.2.0: {} @@ -6080,6 +6231,13 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 + configstore@7.0.0: + dependencies: + atomically: 2.0.3 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + consola@3.2.3: {} consola@3.4.2: {} @@ -6229,6 +6387,10 @@ snapshots: dependencies: is-obj: 2.0.0 + dot-prop@9.0.0: + dependencies: + type-fest: 4.20.1 + dotenv-expand@12.0.1: dependencies: dotenv: 16.4.7 @@ -6424,6 +6586,8 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-redact@3.5.0: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -6461,6 +6625,14 @@ snapshots: minimist: 1.2.8 xml2js: 0.5.0 + firefox-profile@4.7.0: + dependencies: + adm-zip: 0.5.14 + fs-extra: 11.3.0 + ini: 4.1.3 + minimist: 1.2.8 + xml2js: 0.6.2 + for-each@0.3.3: dependencies: is-callable: 1.2.7 @@ -6683,6 +6855,10 @@ snapshots: ini@2.0.0: {} + ini@4.1.1: {} + + ini@4.1.3: {} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -6734,6 +6910,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ci@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -6743,6 +6921,11 @@ snapshots: global-dirs: 3.0.1 is-path-inside: 3.0.3 + is-installed-globally@1.0.0: + dependencies: + global-directory: 4.0.1 + is-path-inside: 4.0.0 + is-interactive@2.0.0: {} is-npm@6.0.0: {} @@ -6753,6 +6936,8 @@ snapshots: is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -6844,10 +7029,16 @@ snapshots: kleur@4.1.5: {} + ky@1.8.1: {} + latest-version@7.0.0: dependencies: package-json: 8.1.1 + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -7385,6 +7576,8 @@ snapshots: process-nextick-args@2.0.1: {} + process-warning@4.0.1: {} + process@0.11.10: {} promise-toolbox@0.21.0: @@ -7437,6 +7630,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} rc9@2.1.2: @@ -7556,6 +7751,8 @@ snapshots: readdirp@4.1.2: {} + real-require@0.2.0: {} + recast@0.23.9: dependencies: ast-types: 0.16.1 @@ -7743,6 +7940,8 @@ snapshots: concat-stream: 1.6.2 os-shim: 0.1.3 + split2@4.2.0: {} + split@1.0.1: dependencies: through: 2.3.8 @@ -7825,6 +8024,8 @@ snapshots: dependencies: js-tokens: 9.0.1 + stubborn-fs@1.2.5: {} + sugarss@4.0.1(postcss@8.4.38): dependencies: postcss: 8.4.38 @@ -7889,6 +8090,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + through@2.3.8: {} tiny-invariant@1.3.3: {} @@ -8041,6 +8246,19 @@ snapshots: semver-diff: 4.0.0 xdg-basedir: 5.1.0 + update-notifier@7.3.1: + dependencies: + boxen: 8.0.1 + chalk: 5.3.0 + configstore: 7.0.0 + is-in-ci: 1.0.0 + is-installed-globally: 1.0.0 + is-npm: 6.0.0 + latest-version: 9.0.0 + pupa: 3.1.0 + semver: 7.7.1 + xdg-basedir: 5.1.0 + use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): dependencies: react: 18.3.1 @@ -8260,35 +8478,37 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 web-ext-run@0.2.2: dependencies: - '@babel/runtime': 7.24.7 - '@devicefarmer/adbkit': 3.2.6 - bunyan: 1.8.15 - chrome-launcher: 1.1.0 + '@babel/runtime': 7.27.0 + '@devicefarmer/adbkit': 3.3.8 + chrome-launcher: 1.1.2 debounce: 1.2.1 es6-error: 4.1.1 - firefox-profile: 4.6.0 - fs-extra: 11.2.0 + firefox-profile: 4.7.0 fx-runner: 1.4.0 - mkdirp: 3.0.1 multimatch: 6.0.0 - mz: 2.7.0 node-notifier: 10.0.1 parse-json: 7.1.1 + pino: 9.6.0 promise-toolbox: 0.21.0 set-value: 4.1.0 source-map-support: 0.5.21 strip-bom: 5.0.0 strip-json-comments: 5.0.1 tmp: 0.2.3 - update-notifier: 6.0.2 - watchpack: 2.4.1 - ws: 8.18.0 + update-notifier: 7.3.1 + watchpack: 2.4.2 + ws: 8.18.1 zip-dir: 2.0.0 transitivePeerDependencies: - bufferutil @@ -8352,6 +8572,8 @@ snapshots: webpack-virtual-modules@0.6.2: {} + when-exit@2.1.4: {} + when@3.7.7: {} which-typed-array@1.1.15: @@ -8380,6 +8602,10 @@ snapshots: dependencies: string-width: 5.1.2 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + winreg@0.0.12: {} wrap-ansi@7.0.0: @@ -8546,6 +8772,11 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + xmlbuilder@11.0.1: {} y18n@5.0.8: {}