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: {}