From 0de958e08babab91295456d8e91414df5bd37ca9 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Sat, 7 Dec 2024 15:04:49 -0500 Subject: [PATCH 01/20] Enter pre-release mode for v1. --- .changeset/pre.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 00000000..63fed6d7 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,12 @@ +{ + "mode": "pre", + "tag": "alpha", + "initialVersions": { + "examples/basic-react": "0.0.16", + "examples/basic-react-superjson": "0.0.16", + "examples/basic-vanilla-esm": "0.0.16", + "electron-trpc": "0.6.1", + "www": "0.0.1" + }, + "changesets": [] +} From 70b70d683f957873ab3533189333c001d45d4eda Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Sat, 7 Dec 2024 15:54:07 -0500 Subject: [PATCH 02/20] Reapply "Add vanilla esm support and example. (#204)" This reverts commit 4e177dafd0a23e231ac3b494889e2b463ee577bd. --- .changeset/healthy-tigers-enjoy.md | 5 + .github/workflows/test.yml | 9 +- README.md | 2 +- .../basic-react-superjson/preload/preload.ts | 2 +- examples/basic-react-superjson/tsconfig.json | 2 +- examples/basic-react/index.e2e.ts | 6 +- examples/basic-react/preload/preload.ts | 2 +- examples/basic-react/tsconfig.json | 2 +- examples/basic-vanilla-esm/CHANGELOG.md | 134 ++++++++++++++++++ examples/basic-vanilla-esm/electron/api.mjs | 32 +++++ examples/basic-vanilla-esm/electron/index.mjs | 33 +++++ examples/basic-vanilla-esm/index.e2e.js | 25 ++++ examples/basic-vanilla-esm/index.html | 12 ++ examples/basic-vanilla-esm/package.json | 23 +++ .../basic-vanilla-esm/preload/preload.mjs | 3 + examples/basic-vanilla-esm/src/index.mjs | 29 ++++ examples/basic-vanilla-esm/vite.config.ts | 6 + package.json | 3 +- .../dts-bundle-generator.config.ts | 13 +- packages/electron-trpc/package.json | 9 +- packages/electron-trpc/preload.d.ts | 5 + packages/electron-trpc/src/main/index.ts | 1 - .../{main => preload}/exposeElectronTRPC.ts | 0 packages/electron-trpc/src/preload/index.ts | 1 + .../electron-trpc/src/preload/vite.config.ts | 21 +++ packages/electron-trpc/tsconfig.json | 2 +- playwright.config.ts | 2 +- pnpm-lock.yaml | 25 ++++ 28 files changed, 391 insertions(+), 18 deletions(-) create mode 100644 .changeset/healthy-tigers-enjoy.md create mode 100644 examples/basic-vanilla-esm/CHANGELOG.md create mode 100644 examples/basic-vanilla-esm/electron/api.mjs create mode 100644 examples/basic-vanilla-esm/electron/index.mjs create mode 100644 examples/basic-vanilla-esm/index.e2e.js create mode 100644 examples/basic-vanilla-esm/index.html create mode 100644 examples/basic-vanilla-esm/package.json create mode 100644 examples/basic-vanilla-esm/preload/preload.mjs create mode 100644 examples/basic-vanilla-esm/src/index.mjs create mode 100644 examples/basic-vanilla-esm/vite.config.ts create mode 100644 packages/electron-trpc/preload.d.ts rename packages/electron-trpc/src/{main => preload}/exposeElectronTRPC.ts (100%) create mode 100644 packages/electron-trpc/src/preload/index.ts create mode 100644 packages/electron-trpc/src/preload/vite.config.ts diff --git a/.changeset/healthy-tigers-enjoy.md b/.changeset/healthy-tigers-enjoy.md new file mode 100644 index 00000000..0e9f3d9c --- /dev/null +++ b/.changeset/healthy-tigers-enjoy.md @@ -0,0 +1,5 @@ +--- +'electron-trpc': major +--- + +Breaking change: exposeElectronTRPC is now imported from 'electron-trpc/preload'. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 555059e7..ea7f4225 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ jobs: node-version: ${{ matrix.node }} cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm build + - run: pnpm build:code - run: pnpm test:ci - uses: codecov/codecov-action@v4 @@ -40,5 +40,10 @@ jobs: node-version: ${{ matrix.node }} cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm build + - run: pnpm build:code + - run: | + sudo chown root examples/basic-react/node_modules/electron/dist/chrome-sandbox \ + && sudo chmod 4755 examples/basic-react/node_modules/electron/dist/chrome-sandbox \ + && sudo chown root examples/basic-vanilla-esm/node_modules/electron/dist/chrome-sandbox \ + && sudo chmod 4755 examples/basic-vanilla-esm/node_modules/electron/dist/chrome-sandbox - run: xvfb-run --auto-servernum -- pnpm test:e2e diff --git a/README.md b/README.md index d5adc79d..49bcf7a6 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ npm install --save electron-trpc 2. Expose the IPC to the render process from the [preload file](https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts): ```ts - import { exposeElectronTRPC } from 'electron-trpc/main'; + import { exposeElectronTRPC } from 'electron-trpc/preload'; process.once('loaded', async () => { exposeElectronTRPC(); diff --git a/examples/basic-react-superjson/preload/preload.ts b/examples/basic-react-superjson/preload/preload.ts index 4b7d56fa..5e5f754c 100644 --- a/examples/basic-react-superjson/preload/preload.ts +++ b/examples/basic-react-superjson/preload/preload.ts @@ -1,4 +1,4 @@ -import { exposeElectronTRPC } from 'electron-trpc/main'; +import { exposeElectronTRPC } from 'electron-trpc/preload'; process.once('loaded', async () => { exposeElectronTRPC(); diff --git a/examples/basic-react-superjson/tsconfig.json b/examples/basic-react-superjson/tsconfig.json index 1a26c4e1..1c1d0b97 100644 --- a/examples/basic-react-superjson/tsconfig.json +++ b/examples/basic-react-superjson/tsconfig.json @@ -5,7 +5,7 @@ "forceConsistentCasingInFileNames": true, "jsx": "react", "lib": ["dom", "esnext"], - "module": "esnext", + "module": "node16", "moduleResolution": "node16", "noEmit": true, "noFallthroughCasesInSwitch": true, diff --git a/examples/basic-react/index.e2e.ts b/examples/basic-react/index.e2e.ts index 5bee439d..b95bd4a5 100644 --- a/examples/basic-react/index.e2e.ts +++ b/examples/basic-react/index.e2e.ts @@ -3,7 +3,11 @@ import { _electron as electron, test, expect } from '@playwright/test'; test('Hello Electron', async () => { const electronApp = await electron.launch({ args: [`${__dirname}`], - executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH ?? undefined, + executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH || undefined, + env: { + ...process.env, + NODE_ENV: 'development', + }, }); const window = await electronApp.firstWindow(); diff --git a/examples/basic-react/preload/preload.ts b/examples/basic-react/preload/preload.ts index 4b7d56fa..5e5f754c 100644 --- a/examples/basic-react/preload/preload.ts +++ b/examples/basic-react/preload/preload.ts @@ -1,4 +1,4 @@ -import { exposeElectronTRPC } from 'electron-trpc/main'; +import { exposeElectronTRPC } from 'electron-trpc/preload'; process.once('loaded', async () => { exposeElectronTRPC(); diff --git a/examples/basic-react/tsconfig.json b/examples/basic-react/tsconfig.json index 1a26c4e1..1c1d0b97 100644 --- a/examples/basic-react/tsconfig.json +++ b/examples/basic-react/tsconfig.json @@ -5,7 +5,7 @@ "forceConsistentCasingInFileNames": true, "jsx": "react", "lib": ["dom", "esnext"], - "module": "esnext", + "module": "node16", "moduleResolution": "node16", "noEmit": true, "noFallthroughCasesInSwitch": true, diff --git a/examples/basic-vanilla-esm/CHANGELOG.md b/examples/basic-vanilla-esm/CHANGELOG.md new file mode 100644 index 00000000..dd34f099 --- /dev/null +++ b/examples/basic-vanilla-esm/CHANGELOG.md @@ -0,0 +1,134 @@ +# examples/basic + +## 0.0.16 + +### Patch Changes + +- Updated dependencies [[`fb7845f`](https://github.com/jsonnull/electron-trpc/commit/fb7845fbc771002309dea9d8b4c2079860350656), [`2bc0233`](https://github.com/jsonnull/electron-trpc/commit/2bc02333172b8a25a493c34c8e17434b8ffb4eea)]: + - electron-trpc@0.6.1 + +## 0.0.15 + +### Patch Changes + +- Updated dependencies [[`a15c6c4d0c531b3596689b4cc470548a5228c989`](https://github.com/jsonnull/electron-trpc/commit/a15c6c4d0c531b3596689b4cc470548a5228c989), [`50953c7e5bcb69d4e5482405f4a621b229f0ca82`](https://github.com/jsonnull/electron-trpc/commit/50953c7e5bcb69d4e5482405f4a621b229f0ca82)]: + - electron-trpc@0.6.0 + +## 0.0.14 + +### Patch Changes + +- Updated dependencies [[`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a), [`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a)]: + - electron-trpc@0.5.2 + +## 0.0.13 + +### Patch Changes + +- Updated dependencies [[`c43ae93`](https://github.com/jsonnull/electron-trpc/commit/c43ae93df4af397986c602c432fc32178d62796b)]: + - electron-trpc@0.5.1 + +## 0.0.12 + +### Patch Changes + +- Updated dependencies [[`68ddf63`](https://github.com/jsonnull/electron-trpc/commit/68ddf63ff6b3560626bf78d45ca2bf7ed2851f22)]: + - electron-trpc@0.5.0 + +## 0.0.11 + +### Patch Changes + +- Updated dependencies [[`70d13e4`](https://github.com/jsonnull/electron-trpc/commit/70d13e400d8b0678a359c633511b419736ef4b5d)]: + - electron-trpc@0.4.5 + +## 0.0.10 + +### Patch Changes + +- Updated dependencies [[`84d1139`](https://github.com/jsonnull/electron-trpc/commit/84d1139d6b6970b8863fdb1ba22a0aaa709045ec)]: + - electron-trpc@0.4.4 + +## 0.0.9 + +### Patch Changes + +- Updated dependencies [[`42abc41`](https://github.com/jsonnull/electron-trpc/commit/42abc4182c260580e320e8ec61926ed3ad372940)]: + - electron-trpc@0.4.3 + +## 0.0.8 + +### Patch Changes + +- Updated dependencies [[`cbae157`](https://github.com/jsonnull/electron-trpc/commit/cbae1570ddeab2405950806656c0d4fc19d72855)]: + - electron-trpc@0.4.2 + +## 0.0.7 + +### Patch Changes + +- Updated dependencies [[`b73c1a8`](https://github.com/jsonnull/electron-trpc/commit/b73c1a89c77258bf4372991fda563d6fa0ba299f)]: + - electron-trpc@0.4.1 + +## 0.0.6 + +### Patch Changes + +- Updated dependencies [[`70e8e5c`](https://github.com/jsonnull/electron-trpc/commit/70e8e5c5f3e2654d055663a286c4107a66f362e7)]: + - electron-trpc@0.4.0 + +## 0.0.5 + +### Patch Changes + +- Updated dependencies [[`46d79ef`](https://github.com/jsonnull/electron-trpc/commit/46d79efde7ccc12cd1e99eb086413aa83bda29f8)]: + - electron-trpc@0.3.2 + +## 0.0.4 + +### Patch Changes + +- Updated dependencies [[`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730)]: + - electron-trpc@0.3.1 + +## 0.0.3 + +### Patch Changes + +- Updated dependencies [[`b67f2a7`](https://github.com/jsonnull/electron-trpc/commit/b67f2a7a87cd77b88d337e6996d78c6507a9c187)]: + - electron-trpc@0.3.0 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies [[`c9031f5`](https://github.com/jsonnull/electron-trpc/commit/c9031f5b521095d3c648fc905b642471e875d86f)]: + - electron-trpc@0.2.1 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies [[`231afea`](https://github.com/jsonnull/electron-trpc/commit/231afea9f21f0d4ba7f12c37fd781f22ca5d4141), [`960999f`](https://github.com/jsonnull/electron-trpc/commit/960999f5c2fec8b70152cfdf6cadc737c60edd48), [`3c76498`](https://github.com/jsonnull/electron-trpc/commit/3c76498c152e92fe1b084d3e7a5170d8f2c1dee3), [`7c7ee89`](https://github.com/jsonnull/electron-trpc/commit/7c7ee89b45c6c27527e26b0a6100fc0cb41d8ba6), [`ddc11cb`](https://github.com/jsonnull/electron-trpc/commit/ddc11cb1f1502568a028476acdefdb8d95d9562c), [`4615cf6`](https://github.com/jsonnull/electron-trpc/commit/4615cf63c382a0ea21781efb5093a531cc6378e6), [`006d01e`](https://github.com/jsonnull/electron-trpc/commit/006d01e73a995f756be622769192444bba3b4a87), [`c46f700`](https://github.com/jsonnull/electron-trpc/commit/c46f700b6171835a5b00d6d2c44061acdcd49874), [`42f2b09`](https://github.com/jsonnull/electron-trpc/commit/42f2b09efbaf322af42df176b74f72b972724f99), [`d2870a4`](https://github.com/jsonnull/electron-trpc/commit/d2870a4ef4429053c6a0d3e44bb204d0177adda9)]: + - electron-trpc@0.2.0 + +## 0.0.1-next.2 + +### Patch Changes + +- Updated dependencies [[`169c47f`](https://github.com/jsonnull/electron-trpc/commit/169c47f325de8899784187af06140c29758b0c0a)]: + - electron-trpc@0.2.0-next.7 + +## 0.0.1-next.1 + +### Patch Changes + +- Updated dependencies [[`a2103c4`](https://github.com/jsonnull/electron-trpc/commit/a2103c4e9789741aa98aa057fcebf78e4f339d9b)]: + - electron-trpc@0.2.0-next.6 + +## 0.0.1-next.0 + +### Patch Changes + +- Updated dependencies [[`333197f`](https://github.com/jsonnull/electron-trpc/commit/333197fb3e567aa37f350af992d123f8f8ed6796)]: + - electron-trpc@0.2.0-next.5 diff --git a/examples/basic-vanilla-esm/electron/api.mjs b/examples/basic-vanilla-esm/electron/api.mjs new file mode 100644 index 00000000..3ea11c56 --- /dev/null +++ b/examples/basic-vanilla-esm/electron/api.mjs @@ -0,0 +1,32 @@ +import z from 'zod'; +import { initTRPC } from '@trpc/server'; +import { observable } from '@trpc/server/observable'; +import { EventEmitter } from 'events'; + +const ee = new EventEmitter(); + +const t = initTRPC.create({ isServer: true }); + +export const router = t.router({ + greeting: t.procedure.input(z.object({ name: z.string() })).query((req) => { + const { input } = req; + + ee.emit('greeting', `Greeted ${input.name}`); + return { + text: `Hello ${input.name}`, + }; + }), + subscription: t.procedure.subscription(() => { + return observable((emit) => { + function onGreet(text) { + emit.next({ text }); + } + + ee.on('greeting', onGreet); + + return () => { + ee.off('greeting', onGreet); + }; + }); + }), +}); diff --git a/examples/basic-vanilla-esm/electron/index.mjs b/examples/basic-vanilla-esm/electron/index.mjs new file mode 100644 index 00000000..263003a4 --- /dev/null +++ b/examples/basic-vanilla-esm/electron/index.mjs @@ -0,0 +1,33 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { app, BrowserWindow } from 'electron'; +import { createIPCHandler } from 'electron-trpc/main'; +import { router } from './api.mjs'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); + +const html = path.join(dirname, '../dist/index.html'); +const preload = path.join(dirname, '../preload/preload.mjs'); + +app.on('ready', () => { + const win = new BrowserWindow({ + webPreferences: { + /* + * Disabling sandbox allows preload script to use ESM imports. + * + * It is recommended to instead use a bundler to bundle the preload script with its dependencies and leave the + * sandbox enabled. + * + * See https://www.electronjs.org/docs/latest/tutorial/esm + */ + sandbox: false, + preload, + }, + }); + + createIPCHandler({ router, windows: [win] }); + + win.loadFile(html); + + win.show(); +}); diff --git a/examples/basic-vanilla-esm/index.e2e.js b/examples/basic-vanilla-esm/index.e2e.js new file mode 100644 index 00000000..97a560c8 --- /dev/null +++ b/examples/basic-vanilla-esm/index.e2e.js @@ -0,0 +1,25 @@ +import { _electron as electron, test, expect } from '@playwright/test'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); + +test('Hello Electron', async () => { + const electronApp = await electron.launch({ + args: [dirname], + executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH || undefined, + env: { + ...process.env, + NODE_ENV: 'development', + }, + }); + + const window = await electronApp.firstWindow(); + await window.waitForEvent('load'); + expect(await window.title()).toBe('Hello from Electron renderer!'); + + const response = await window.textContent('[data-testid="greeting"]'); + expect(response).toBe('Hello Electron'); + + await electronApp.close(); +}); diff --git a/examples/basic-vanilla-esm/index.html b/examples/basic-vanilla-esm/index.html new file mode 100644 index 00000000..e8cc8f5f --- /dev/null +++ b/examples/basic-vanilla-esm/index.html @@ -0,0 +1,12 @@ + + + + + + + + Hello from Electron renderer! + + + + diff --git a/examples/basic-vanilla-esm/package.json b/examples/basic-vanilla-esm/package.json new file mode 100644 index 00000000..10a0e8d7 --- /dev/null +++ b/examples/basic-vanilla-esm/package.json @@ -0,0 +1,23 @@ +{ + "name": "examples/basic-vanilla-esm", + "type": "module", + "version": "0.0.16", + "private": true, + "main": "electron/index.mjs", + "license": "MIT", + "scripts": { + "start": "corepack pnpm build && electron .", + "build": "vite build" + }, + "dependencies": { + "@trpc/client": "10.33.1", + "@trpc/server": "10.33.1", + "electron": "29.3.2", + "electron-trpc": "0.6.1", + "vite": "^5.2.11", + "zod": "^3.21.4" + }, + "devDependencies": { + "@types/node": "^20.12.8" + } +} diff --git a/examples/basic-vanilla-esm/preload/preload.mjs b/examples/basic-vanilla-esm/preload/preload.mjs new file mode 100644 index 00000000..73cd474c --- /dev/null +++ b/examples/basic-vanilla-esm/preload/preload.mjs @@ -0,0 +1,3 @@ +import { exposeElectronTRPC } from 'electron-trpc/preload'; + +exposeElectronTRPC(); diff --git a/examples/basic-vanilla-esm/src/index.mjs b/examples/basic-vanilla-esm/src/index.mjs new file mode 100644 index 00000000..57e83865 --- /dev/null +++ b/examples/basic-vanilla-esm/src/index.mjs @@ -0,0 +1,29 @@ +import { ipcLink } from 'electron-trpc/renderer'; +import { createTRPCProxyClient } from '@trpc/client'; + +const trpc = createTRPCProxyClient({ + links: [ipcLink()], +}); + +async function writeGreeting() { + const greeting = await trpc.greeting.query({ name: 'Electron' }); + + console.log('greeting', greeting); + + const div = document.createElement('div'); + div.innerText = greeting.text; + div.setAttribute('data-testid', 'greeting'); + + document.body.appendChild(div); +} + +async function listenForSubscription() { + trpcReact.subscription.subscribe(undefined, { + onData: (data) => { + console.log(data); + }, + }); +} + +writeGreeting(); +listenForSubscription(); diff --git a/examples/basic-vanilla-esm/vite.config.ts b/examples/basic-vanilla-esm/vite.config.ts new file mode 100644 index 00000000..a2469381 --- /dev/null +++ b/examples/basic-vanilla-esm/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + mode: 'development', + base: './', +}); diff --git a/package.json b/package.json index ac6a5a91..cd01af59 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,9 @@ "license": "MIT", "scripts": { "build": "corepack pnpm -r build", + "build:code": "corepack pnpm --filter=!www build", "test": "corepack pnpm -r test", - "test:e2e": "playwright test", + "test:e2e": "DEBUG=pw:browser* playwright test", "test:ci": "corepack pnpm -r test:ci", "lint": "prettier --check .", "lint:fix": "prettier --write .", diff --git a/packages/electron-trpc/dts-bundle-generator.config.ts b/packages/electron-trpc/dts-bundle-generator.config.ts index 9d72840b..76d0716b 100644 --- a/packages/electron-trpc/dts-bundle-generator.config.ts +++ b/packages/electron-trpc/dts-bundle-generator.config.ts @@ -4,13 +4,18 @@ const config = { }, entries: [ { - filePath: './src/renderer/index.ts', - outFile: `./dist/renderer.d.ts`, + filePath: './src/main/index.ts', + outFile: `./dist/main.d.ts`, noCheck: true, }, { - filePath: './src/main/index.ts', - outFile: `./dist/main.d.ts`, + filePath: './src/preload/index.ts', + outFile: `./dist/preload.d.ts`, + noCheck: true, + }, + { + filePath: './src/renderer/index.ts', + outFile: `./dist/renderer.d.ts`, noCheck: true, }, ], diff --git a/packages/electron-trpc/package.json b/packages/electron-trpc/package.json index b770f4c0..682d8053 100644 --- a/packages/electron-trpc/package.json +++ b/packages/electron-trpc/package.json @@ -23,6 +23,11 @@ "import": "./dist/main.mjs", "types": "./dist/main.d.ts" }, + "./preload": { + "require": "./dist/preload.cjs", + "import": "./dist/preload.mjs", + "types": "./dist/preload.d.ts" + }, "./renderer": { "require": "./dist/renderer.cjs", "import": "./dist/renderer.mjs", @@ -39,10 +44,10 @@ "README.md" ], "scripts": { - "build": "tsc && vite build -c src/main/vite.config.ts && vite build -c src/renderer/vite.config.ts && corepack pnpm build:types", + "build": "tsc && vite build -c src/main/vite.config.ts && vite build -c src/renderer/vite.config.ts && vite build -c src/preload/vite.config.ts && corepack pnpm build:types", "build:types": "dts-bundle-generator --config ./dts-bundle-generator.config.ts && corepack pnpm run copy:types", "copy:readme": "cp ../../README.md ./", - "copy:types": "cp dist/main.d.ts dist/renderer.d.ts ./", + "copy:types": "cp dist/main.d.ts dist/renderer.d.ts dist/preload.d.ts ./", "test": "vitest -c vitest.config.ts", "test:ci": "vitest run -c vitest.config.ts --coverage", "prepublishOnly": "corepack pnpm copy:readme && corepack pnpm build", diff --git a/packages/electron-trpc/preload.d.ts b/packages/electron-trpc/preload.d.ts new file mode 100644 index 00000000..55dc9d78 --- /dev/null +++ b/packages/electron-trpc/preload.d.ts @@ -0,0 +1,5 @@ +// Generated by dts-bundle-generator v9.5.1 + +export declare const exposeElectronTRPC: () => void; + +export {}; diff --git a/packages/electron-trpc/src/main/index.ts b/packages/electron-trpc/src/main/index.ts index 4061ae1f..60e78048 100644 --- a/packages/electron-trpc/src/main/index.ts +++ b/packages/electron-trpc/src/main/index.ts @@ -1,4 +1,3 @@ export * from '../constants'; export * from './createIPCHandler'; -export * from './exposeElectronTRPC'; export * from './types'; diff --git a/packages/electron-trpc/src/main/exposeElectronTRPC.ts b/packages/electron-trpc/src/preload/exposeElectronTRPC.ts similarity index 100% rename from packages/electron-trpc/src/main/exposeElectronTRPC.ts rename to packages/electron-trpc/src/preload/exposeElectronTRPC.ts diff --git a/packages/electron-trpc/src/preload/index.ts b/packages/electron-trpc/src/preload/index.ts new file mode 100644 index 00000000..e8998009 --- /dev/null +++ b/packages/electron-trpc/src/preload/index.ts @@ -0,0 +1 @@ +export * from './exposeElectronTRPC'; diff --git a/packages/electron-trpc/src/preload/vite.config.ts b/packages/electron-trpc/src/preload/vite.config.ts new file mode 100644 index 00000000..44691c4b --- /dev/null +++ b/packages/electron-trpc/src/preload/vite.config.ts @@ -0,0 +1,21 @@ +/// +import path from 'path'; +import { defineConfig } from 'vite'; + +module.exports = defineConfig({ + base: './', + build: { + // Importantly, `main` build runs first and empties the out dir + emptyOutDir: false, + lib: { + entry: path.resolve(__dirname, './index.ts'), + name: 'electron-trpc', + formats: ['es', 'cjs'], + fileName: (format) => ({ es: 'preload.mjs', cjs: 'preload.cjs' })[format as 'es' | 'cjs'], + }, + outDir: path.resolve(__dirname, '../../dist'), + rollupOptions: { + external: ['electron'], + }, + }, +}); diff --git a/packages/electron-trpc/tsconfig.json b/packages/electron-trpc/tsconfig.json index b0800322..ecdd4888 100644 --- a/packages/electron-trpc/tsconfig.json +++ b/packages/electron-trpc/tsconfig.json @@ -15,6 +15,6 @@ "strict": true, "target": "esnext" }, - "include": ["src/main/*.ts", "src/renderer/*.ts"], + "include": ["src/main/*.ts", "src/preload/*.ts", "src/renderer/*.ts"], "exclude": ["node_modules"] } diff --git a/playwright.config.ts b/playwright.config.ts index c9fef873..b19b14c0 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from '@playwright/test'; export default defineConfig({ - testMatch: /.*\.e2e\.ts/, + testMatch: /.*\.e2e\.(ts|js)/, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75fb5caf..95eff568 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,6 +125,31 @@ importers: specifier: ^0.28.7 version: 0.28.7 + examples/basic-vanilla-esm: + dependencies: + '@trpc/client': + specifier: 10.33.1 + version: 10.33.1(@trpc/server@10.33.1) + '@trpc/server': + specifier: 10.33.1 + version: 10.33.1 + electron: + specifier: 29.3.2 + version: 29.3.2 + electron-trpc: + specifier: 0.6.1 + version: link:../../packages/electron-trpc + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.8) + zod: + specifier: ^3.21.4 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: ^20.12.8 + version: 20.12.8 + packages/electron-trpc: dependencies: debug: From 32f765ea56373d9347787c8f4fc5c9afb6da1d8d Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Sat, 7 Dec 2024 15:57:07 -0500 Subject: [PATCH 03/20] Adjust changeset. --- .changeset/{healthy-tigers-enjoy.md => seven-carrots-live.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .changeset/{healthy-tigers-enjoy.md => seven-carrots-live.md} (84%) diff --git a/.changeset/healthy-tigers-enjoy.md b/.changeset/seven-carrots-live.md similarity index 84% rename from .changeset/healthy-tigers-enjoy.md rename to .changeset/seven-carrots-live.md index 0e9f3d9c..37aa84da 100644 --- a/.changeset/healthy-tigers-enjoy.md +++ b/.changeset/seven-carrots-live.md @@ -2,4 +2,4 @@ 'electron-trpc': major --- -Breaking change: exposeElectronTRPC is now imported from 'electron-trpc/preload'. +Breaking change: exposeElectronTRPC is now imported from 'electron-trpc/preload' From f3677b528c601c7a107ad9eabb37e4e2f14ca69c Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 10:48:20 -0400 Subject: [PATCH 04/20] Adjust versioned packages. --- .changeset/config.json | 3 +- examples/basic-react-superjson/CHANGELOG.md | 155 -------------------- examples/basic-react-superjson/package.json | 4 +- examples/basic-react/CHANGELOG.md | 155 -------------------- examples/basic-react/package.json | 4 +- examples/basic-vanilla-esm/CHANGELOG.md | 134 ----------------- examples/basic-vanilla-esm/package.json | 4 +- pnpm-lock.yaml | 6 +- 8 files changed, 11 insertions(+), 454 deletions(-) delete mode 100644 examples/basic-react-superjson/CHANGELOG.md delete mode 100644 examples/basic-react/CHANGELOG.md delete mode 100644 examples/basic-vanilla-esm/CHANGELOG.md diff --git a/.changeset/config.json b/.changeset/config.json index 0c14f5ba..aa586b67 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -6,5 +6,6 @@ "linked": [], "access": "public", "baseBranch": "main", - "updateInternalDependencies": "patch" + "updateInternalDependencies": "patch", + "ignore": ["examples/*"] } diff --git a/examples/basic-react-superjson/CHANGELOG.md b/examples/basic-react-superjson/CHANGELOG.md deleted file mode 100644 index 37a6206d..00000000 --- a/examples/basic-react-superjson/CHANGELOG.md +++ /dev/null @@ -1,155 +0,0 @@ -# examples/basic - -## 0.0.19 - -### Patch Changes - -- Updated dependencies [[`1c5caaa`](https://github.com/jsonnull/electron-trpc/commit/1c5caaa0e58cee2a8324b27cdf5c793a312f844b)]: - - electron-trpc@0.7.1 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies [[`95525ca`](https://github.com/jsonnull/electron-trpc/commit/95525ca1c2a28a0d657ec5063eb33a8dde32a289)]: - - electron-trpc@0.7.0 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies [[`f5f3ef3`](https://github.com/jsonnull/electron-trpc/commit/f5f3ef3b2ffd70d3daa899aaa0bb1745ce267951)]: - - electron-trpc@0.6.2 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies [[`fb7845f`](https://github.com/jsonnull/electron-trpc/commit/fb7845fbc771002309dea9d8b4c2079860350656), [`2bc0233`](https://github.com/jsonnull/electron-trpc/commit/2bc02333172b8a25a493c34c8e17434b8ffb4eea)]: - - electron-trpc@0.6.1 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies [[`a15c6c4d0c531b3596689b4cc470548a5228c989`](https://github.com/jsonnull/electron-trpc/commit/a15c6c4d0c531b3596689b4cc470548a5228c989), [`50953c7e5bcb69d4e5482405f4a621b229f0ca82`](https://github.com/jsonnull/electron-trpc/commit/50953c7e5bcb69d4e5482405f4a621b229f0ca82)]: - - electron-trpc@0.6.0 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies [[`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a), [`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a)]: - - electron-trpc@0.5.2 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies [[`c43ae93`](https://github.com/jsonnull/electron-trpc/commit/c43ae93df4af397986c602c432fc32178d62796b)]: - - electron-trpc@0.5.1 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies [[`68ddf63`](https://github.com/jsonnull/electron-trpc/commit/68ddf63ff6b3560626bf78d45ca2bf7ed2851f22)]: - - electron-trpc@0.5.0 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies [[`70d13e4`](https://github.com/jsonnull/electron-trpc/commit/70d13e400d8b0678a359c633511b419736ef4b5d)]: - - electron-trpc@0.4.5 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies [[`84d1139`](https://github.com/jsonnull/electron-trpc/commit/84d1139d6b6970b8863fdb1ba22a0aaa709045ec)]: - - electron-trpc@0.4.4 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies [[`42abc41`](https://github.com/jsonnull/electron-trpc/commit/42abc4182c260580e320e8ec61926ed3ad372940)]: - - electron-trpc@0.4.3 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies [[`cbae157`](https://github.com/jsonnull/electron-trpc/commit/cbae1570ddeab2405950806656c0d4fc19d72855)]: - - electron-trpc@0.4.2 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [[`b73c1a8`](https://github.com/jsonnull/electron-trpc/commit/b73c1a89c77258bf4372991fda563d6fa0ba299f)]: - - electron-trpc@0.4.1 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [[`70e8e5c`](https://github.com/jsonnull/electron-trpc/commit/70e8e5c5f3e2654d055663a286c4107a66f362e7)]: - - electron-trpc@0.4.0 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`46d79ef`](https://github.com/jsonnull/electron-trpc/commit/46d79efde7ccc12cd1e99eb086413aa83bda29f8)]: - - electron-trpc@0.3.2 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730)]: - - electron-trpc@0.3.1 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [[`b67f2a7`](https://github.com/jsonnull/electron-trpc/commit/b67f2a7a87cd77b88d337e6996d78c6507a9c187)]: - - electron-trpc@0.3.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [[`c9031f5`](https://github.com/jsonnull/electron-trpc/commit/c9031f5b521095d3c648fc905b642471e875d86f)]: - - electron-trpc@0.2.1 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [[`231afea`](https://github.com/jsonnull/electron-trpc/commit/231afea9f21f0d4ba7f12c37fd781f22ca5d4141), [`960999f`](https://github.com/jsonnull/electron-trpc/commit/960999f5c2fec8b70152cfdf6cadc737c60edd48), [`3c76498`](https://github.com/jsonnull/electron-trpc/commit/3c76498c152e92fe1b084d3e7a5170d8f2c1dee3), [`7c7ee89`](https://github.com/jsonnull/electron-trpc/commit/7c7ee89b45c6c27527e26b0a6100fc0cb41d8ba6), [`ddc11cb`](https://github.com/jsonnull/electron-trpc/commit/ddc11cb1f1502568a028476acdefdb8d95d9562c), [`4615cf6`](https://github.com/jsonnull/electron-trpc/commit/4615cf63c382a0ea21781efb5093a531cc6378e6), [`006d01e`](https://github.com/jsonnull/electron-trpc/commit/006d01e73a995f756be622769192444bba3b4a87), [`c46f700`](https://github.com/jsonnull/electron-trpc/commit/c46f700b6171835a5b00d6d2c44061acdcd49874), [`42f2b09`](https://github.com/jsonnull/electron-trpc/commit/42f2b09efbaf322af42df176b74f72b972724f99), [`d2870a4`](https://github.com/jsonnull/electron-trpc/commit/d2870a4ef4429053c6a0d3e44bb204d0177adda9)]: - - electron-trpc@0.2.0 - -## 0.0.1-next.2 - -### Patch Changes - -- Updated dependencies [[`169c47f`](https://github.com/jsonnull/electron-trpc/commit/169c47f325de8899784187af06140c29758b0c0a)]: - - electron-trpc@0.2.0-next.7 - -## 0.0.1-next.1 - -### Patch Changes - -- Updated dependencies [[`a2103c4`](https://github.com/jsonnull/electron-trpc/commit/a2103c4e9789741aa98aa057fcebf78e4f339d9b)]: - - electron-trpc@0.2.0-next.6 - -## 0.0.1-next.0 - -### Patch Changes - -- Updated dependencies [[`333197f`](https://github.com/jsonnull/electron-trpc/commit/333197fb3e567aa37f350af992d123f8f8ed6796)]: - - electron-trpc@0.2.0-next.5 diff --git a/examples/basic-react-superjson/package.json b/examples/basic-react-superjson/package.json index fc324965..5ad09381 100644 --- a/examples/basic-react-superjson/package.json +++ b/examples/basic-react-superjson/package.json @@ -1,6 +1,6 @@ { "name": "examples/basic-react-superjson", - "version": "0.0.19", + "version": "0.0.0", "private": true, "main": "dist-electron/index.js", "license": "MIT", @@ -14,7 +14,7 @@ "@trpc/react-query": "10.33.1", "@trpc/server": "10.33.1", "electron": "29.3.2", - "electron-trpc": "0.7.1", + "electron-trpc": "workspace:*", "react": "^18.2.0", "react-dom": "^18.2.0", "superjson": "^1.12.3", diff --git a/examples/basic-react/CHANGELOG.md b/examples/basic-react/CHANGELOG.md deleted file mode 100644 index 37a6206d..00000000 --- a/examples/basic-react/CHANGELOG.md +++ /dev/null @@ -1,155 +0,0 @@ -# examples/basic - -## 0.0.19 - -### Patch Changes - -- Updated dependencies [[`1c5caaa`](https://github.com/jsonnull/electron-trpc/commit/1c5caaa0e58cee2a8324b27cdf5c793a312f844b)]: - - electron-trpc@0.7.1 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies [[`95525ca`](https://github.com/jsonnull/electron-trpc/commit/95525ca1c2a28a0d657ec5063eb33a8dde32a289)]: - - electron-trpc@0.7.0 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies [[`f5f3ef3`](https://github.com/jsonnull/electron-trpc/commit/f5f3ef3b2ffd70d3daa899aaa0bb1745ce267951)]: - - electron-trpc@0.6.2 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies [[`fb7845f`](https://github.com/jsonnull/electron-trpc/commit/fb7845fbc771002309dea9d8b4c2079860350656), [`2bc0233`](https://github.com/jsonnull/electron-trpc/commit/2bc02333172b8a25a493c34c8e17434b8ffb4eea)]: - - electron-trpc@0.6.1 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies [[`a15c6c4d0c531b3596689b4cc470548a5228c989`](https://github.com/jsonnull/electron-trpc/commit/a15c6c4d0c531b3596689b4cc470548a5228c989), [`50953c7e5bcb69d4e5482405f4a621b229f0ca82`](https://github.com/jsonnull/electron-trpc/commit/50953c7e5bcb69d4e5482405f4a621b229f0ca82)]: - - electron-trpc@0.6.0 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies [[`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a), [`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a)]: - - electron-trpc@0.5.2 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies [[`c43ae93`](https://github.com/jsonnull/electron-trpc/commit/c43ae93df4af397986c602c432fc32178d62796b)]: - - electron-trpc@0.5.1 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies [[`68ddf63`](https://github.com/jsonnull/electron-trpc/commit/68ddf63ff6b3560626bf78d45ca2bf7ed2851f22)]: - - electron-trpc@0.5.0 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies [[`70d13e4`](https://github.com/jsonnull/electron-trpc/commit/70d13e400d8b0678a359c633511b419736ef4b5d)]: - - electron-trpc@0.4.5 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies [[`84d1139`](https://github.com/jsonnull/electron-trpc/commit/84d1139d6b6970b8863fdb1ba22a0aaa709045ec)]: - - electron-trpc@0.4.4 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies [[`42abc41`](https://github.com/jsonnull/electron-trpc/commit/42abc4182c260580e320e8ec61926ed3ad372940)]: - - electron-trpc@0.4.3 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies [[`cbae157`](https://github.com/jsonnull/electron-trpc/commit/cbae1570ddeab2405950806656c0d4fc19d72855)]: - - electron-trpc@0.4.2 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [[`b73c1a8`](https://github.com/jsonnull/electron-trpc/commit/b73c1a89c77258bf4372991fda563d6fa0ba299f)]: - - electron-trpc@0.4.1 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [[`70e8e5c`](https://github.com/jsonnull/electron-trpc/commit/70e8e5c5f3e2654d055663a286c4107a66f362e7)]: - - electron-trpc@0.4.0 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`46d79ef`](https://github.com/jsonnull/electron-trpc/commit/46d79efde7ccc12cd1e99eb086413aa83bda29f8)]: - - electron-trpc@0.3.2 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730)]: - - electron-trpc@0.3.1 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [[`b67f2a7`](https://github.com/jsonnull/electron-trpc/commit/b67f2a7a87cd77b88d337e6996d78c6507a9c187)]: - - electron-trpc@0.3.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [[`c9031f5`](https://github.com/jsonnull/electron-trpc/commit/c9031f5b521095d3c648fc905b642471e875d86f)]: - - electron-trpc@0.2.1 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [[`231afea`](https://github.com/jsonnull/electron-trpc/commit/231afea9f21f0d4ba7f12c37fd781f22ca5d4141), [`960999f`](https://github.com/jsonnull/electron-trpc/commit/960999f5c2fec8b70152cfdf6cadc737c60edd48), [`3c76498`](https://github.com/jsonnull/electron-trpc/commit/3c76498c152e92fe1b084d3e7a5170d8f2c1dee3), [`7c7ee89`](https://github.com/jsonnull/electron-trpc/commit/7c7ee89b45c6c27527e26b0a6100fc0cb41d8ba6), [`ddc11cb`](https://github.com/jsonnull/electron-trpc/commit/ddc11cb1f1502568a028476acdefdb8d95d9562c), [`4615cf6`](https://github.com/jsonnull/electron-trpc/commit/4615cf63c382a0ea21781efb5093a531cc6378e6), [`006d01e`](https://github.com/jsonnull/electron-trpc/commit/006d01e73a995f756be622769192444bba3b4a87), [`c46f700`](https://github.com/jsonnull/electron-trpc/commit/c46f700b6171835a5b00d6d2c44061acdcd49874), [`42f2b09`](https://github.com/jsonnull/electron-trpc/commit/42f2b09efbaf322af42df176b74f72b972724f99), [`d2870a4`](https://github.com/jsonnull/electron-trpc/commit/d2870a4ef4429053c6a0d3e44bb204d0177adda9)]: - - electron-trpc@0.2.0 - -## 0.0.1-next.2 - -### Patch Changes - -- Updated dependencies [[`169c47f`](https://github.com/jsonnull/electron-trpc/commit/169c47f325de8899784187af06140c29758b0c0a)]: - - electron-trpc@0.2.0-next.7 - -## 0.0.1-next.1 - -### Patch Changes - -- Updated dependencies [[`a2103c4`](https://github.com/jsonnull/electron-trpc/commit/a2103c4e9789741aa98aa057fcebf78e4f339d9b)]: - - electron-trpc@0.2.0-next.6 - -## 0.0.1-next.0 - -### Patch Changes - -- Updated dependencies [[`333197f`](https://github.com/jsonnull/electron-trpc/commit/333197fb3e567aa37f350af992d123f8f8ed6796)]: - - electron-trpc@0.2.0-next.5 diff --git a/examples/basic-react/package.json b/examples/basic-react/package.json index a49cd558..cc124675 100644 --- a/examples/basic-react/package.json +++ b/examples/basic-react/package.json @@ -1,6 +1,6 @@ { "name": "examples/basic-react", - "version": "0.0.19", + "version": "0.0.0", "private": true, "main": "dist-electron/index.js", "license": "MIT", @@ -14,7 +14,7 @@ "@trpc/react-query": "10.33.1", "@trpc/server": "10.33.1", "electron": "29.3.2", - "electron-trpc": "0.7.1", + "electron-trpc": "workspace:*", "react": "^18.2.0", "react-dom": "^18.2.0", "zod": "^3.21.4" diff --git a/examples/basic-vanilla-esm/CHANGELOG.md b/examples/basic-vanilla-esm/CHANGELOG.md deleted file mode 100644 index dd34f099..00000000 --- a/examples/basic-vanilla-esm/CHANGELOG.md +++ /dev/null @@ -1,134 +0,0 @@ -# examples/basic - -## 0.0.16 - -### Patch Changes - -- Updated dependencies [[`fb7845f`](https://github.com/jsonnull/electron-trpc/commit/fb7845fbc771002309dea9d8b4c2079860350656), [`2bc0233`](https://github.com/jsonnull/electron-trpc/commit/2bc02333172b8a25a493c34c8e17434b8ffb4eea)]: - - electron-trpc@0.6.1 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies [[`a15c6c4d0c531b3596689b4cc470548a5228c989`](https://github.com/jsonnull/electron-trpc/commit/a15c6c4d0c531b3596689b4cc470548a5228c989), [`50953c7e5bcb69d4e5482405f4a621b229f0ca82`](https://github.com/jsonnull/electron-trpc/commit/50953c7e5bcb69d4e5482405f4a621b229f0ca82)]: - - electron-trpc@0.6.0 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies [[`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a), [`0e72fe9`](https://github.com/jsonnull/electron-trpc/commit/0e72fe93b7605636b80cb3b3e47b6992cb4c097a)]: - - electron-trpc@0.5.2 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies [[`c43ae93`](https://github.com/jsonnull/electron-trpc/commit/c43ae93df4af397986c602c432fc32178d62796b)]: - - electron-trpc@0.5.1 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies [[`68ddf63`](https://github.com/jsonnull/electron-trpc/commit/68ddf63ff6b3560626bf78d45ca2bf7ed2851f22)]: - - electron-trpc@0.5.0 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies [[`70d13e4`](https://github.com/jsonnull/electron-trpc/commit/70d13e400d8b0678a359c633511b419736ef4b5d)]: - - electron-trpc@0.4.5 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies [[`84d1139`](https://github.com/jsonnull/electron-trpc/commit/84d1139d6b6970b8863fdb1ba22a0aaa709045ec)]: - - electron-trpc@0.4.4 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies [[`42abc41`](https://github.com/jsonnull/electron-trpc/commit/42abc4182c260580e320e8ec61926ed3ad372940)]: - - electron-trpc@0.4.3 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies [[`cbae157`](https://github.com/jsonnull/electron-trpc/commit/cbae1570ddeab2405950806656c0d4fc19d72855)]: - - electron-trpc@0.4.2 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [[`b73c1a8`](https://github.com/jsonnull/electron-trpc/commit/b73c1a89c77258bf4372991fda563d6fa0ba299f)]: - - electron-trpc@0.4.1 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [[`70e8e5c`](https://github.com/jsonnull/electron-trpc/commit/70e8e5c5f3e2654d055663a286c4107a66f362e7)]: - - electron-trpc@0.4.0 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`46d79ef`](https://github.com/jsonnull/electron-trpc/commit/46d79efde7ccc12cd1e99eb086413aa83bda29f8)]: - - electron-trpc@0.3.2 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730), [`25b6c5a`](https://github.com/jsonnull/electron-trpc/commit/25b6c5a5cb56a93a4facf7345a10c3bb2db37730)]: - - electron-trpc@0.3.1 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [[`b67f2a7`](https://github.com/jsonnull/electron-trpc/commit/b67f2a7a87cd77b88d337e6996d78c6507a9c187)]: - - electron-trpc@0.3.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [[`c9031f5`](https://github.com/jsonnull/electron-trpc/commit/c9031f5b521095d3c648fc905b642471e875d86f)]: - - electron-trpc@0.2.1 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [[`231afea`](https://github.com/jsonnull/electron-trpc/commit/231afea9f21f0d4ba7f12c37fd781f22ca5d4141), [`960999f`](https://github.com/jsonnull/electron-trpc/commit/960999f5c2fec8b70152cfdf6cadc737c60edd48), [`3c76498`](https://github.com/jsonnull/electron-trpc/commit/3c76498c152e92fe1b084d3e7a5170d8f2c1dee3), [`7c7ee89`](https://github.com/jsonnull/electron-trpc/commit/7c7ee89b45c6c27527e26b0a6100fc0cb41d8ba6), [`ddc11cb`](https://github.com/jsonnull/electron-trpc/commit/ddc11cb1f1502568a028476acdefdb8d95d9562c), [`4615cf6`](https://github.com/jsonnull/electron-trpc/commit/4615cf63c382a0ea21781efb5093a531cc6378e6), [`006d01e`](https://github.com/jsonnull/electron-trpc/commit/006d01e73a995f756be622769192444bba3b4a87), [`c46f700`](https://github.com/jsonnull/electron-trpc/commit/c46f700b6171835a5b00d6d2c44061acdcd49874), [`42f2b09`](https://github.com/jsonnull/electron-trpc/commit/42f2b09efbaf322af42df176b74f72b972724f99), [`d2870a4`](https://github.com/jsonnull/electron-trpc/commit/d2870a4ef4429053c6a0d3e44bb204d0177adda9)]: - - electron-trpc@0.2.0 - -## 0.0.1-next.2 - -### Patch Changes - -- Updated dependencies [[`169c47f`](https://github.com/jsonnull/electron-trpc/commit/169c47f325de8899784187af06140c29758b0c0a)]: - - electron-trpc@0.2.0-next.7 - -## 0.0.1-next.1 - -### Patch Changes - -- Updated dependencies [[`a2103c4`](https://github.com/jsonnull/electron-trpc/commit/a2103c4e9789741aa98aa057fcebf78e4f339d9b)]: - - electron-trpc@0.2.0-next.6 - -## 0.0.1-next.0 - -### Patch Changes - -- Updated dependencies [[`333197f`](https://github.com/jsonnull/electron-trpc/commit/333197fb3e567aa37f350af992d123f8f8ed6796)]: - - electron-trpc@0.2.0-next.5 diff --git a/examples/basic-vanilla-esm/package.json b/examples/basic-vanilla-esm/package.json index 10a0e8d7..965c19ed 100644 --- a/examples/basic-vanilla-esm/package.json +++ b/examples/basic-vanilla-esm/package.json @@ -1,7 +1,7 @@ { "name": "examples/basic-vanilla-esm", "type": "module", - "version": "0.0.16", + "version": "0.0.0", "private": true, "main": "electron/index.mjs", "license": "MIT", @@ -13,7 +13,7 @@ "@trpc/client": "10.33.1", "@trpc/server": "10.33.1", "electron": "29.3.2", - "electron-trpc": "0.6.1", + "electron-trpc": "workspace:*", "vite": "^5.2.11", "zod": "^3.21.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95eff568..2783acb9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,7 +42,7 @@ importers: specifier: 29.3.2 version: 29.3.2 electron-trpc: - specifier: 0.7.1 + specifier: workspace:* version: link:../../packages/electron-trpc react: specifier: ^18.2.0 @@ -91,7 +91,7 @@ importers: specifier: 29.3.2 version: 29.3.2 electron-trpc: - specifier: 0.7.1 + specifier: workspace:* version: link:../../packages/electron-trpc react: specifier: ^18.2.0 @@ -137,7 +137,7 @@ importers: specifier: 29.3.2 version: 29.3.2 electron-trpc: - specifier: 0.6.1 + specifier: workspace:* version: link:../../packages/electron-trpc vite: specifier: ^5.2.11 From e3a595fbc7920af8e5375b4f1e303dcb899e8f22 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 11:22:18 -0400 Subject: [PATCH 05/20] Fix e2e tests. --- examples/basic-vanilla-esm/index.e2e.js | 1 - examples/basic-vanilla-esm/src/index.mjs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/basic-vanilla-esm/index.e2e.js b/examples/basic-vanilla-esm/index.e2e.js index 97a560c8..0bdd8e65 100644 --- a/examples/basic-vanilla-esm/index.e2e.js +++ b/examples/basic-vanilla-esm/index.e2e.js @@ -15,7 +15,6 @@ test('Hello Electron', async () => { }); const window = await electronApp.firstWindow(); - await window.waitForEvent('load'); expect(await window.title()).toBe('Hello from Electron renderer!'); const response = await window.textContent('[data-testid="greeting"]'); diff --git a/examples/basic-vanilla-esm/src/index.mjs b/examples/basic-vanilla-esm/src/index.mjs index 57e83865..06d95ed1 100644 --- a/examples/basic-vanilla-esm/src/index.mjs +++ b/examples/basic-vanilla-esm/src/index.mjs @@ -18,7 +18,7 @@ async function writeGreeting() { } async function listenForSubscription() { - trpcReact.subscription.subscribe(undefined, { + trpc.subscription.subscribe(undefined, { onData: (data) => { console.log(data); }, From 309416170b5acfd769183990212b942a206f9e62 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 12:24:47 -0400 Subject: [PATCH 06/20] Move to automatic preload registration by default. --- README.md | 28 +++++++- examples/basic-react-superjson/package.json | 3 +- examples/basic-react-superjson/tsconfig.json | 4 +- examples/basic-react/electron/index.ts | 6 +- examples/basic-react/package.json | 3 +- examples/basic-react/preload/preload.ts | 5 -- examples/basic-react/tsconfig.json | 4 +- examples/basic-react/vite.config.ts | 6 -- examples/basic-vanilla-esm/electron/index.mjs | 15 ++-- examples/manual-preload-react/electron/api.ts | 34 +++++++++ .../manual-preload-react/electron/index.ts | 35 ++++++++++ examples/manual-preload-react/index.e2e.ts | 20 ++++++ examples/manual-preload-react/index.html | 14 ++++ examples/manual-preload-react/package.json | 31 +++++++++ .../manual-preload-react/preload/preload.ts | 7 ++ examples/manual-preload-react/src/index.tsx | 42 +++++++++++ examples/manual-preload-react/tsconfig.json | 22 ++++++ examples/manual-preload-react/vite.config.ts | 21 ++++++ package.json | 1 + packages/electron-trpc/package.json | 7 +- .../src/main/createIPCHandler.ts | 32 ++++++++- .../electron-trpc/src/main/vite.config.ts | 2 +- .../electron-trpc/src/preload/autoPreload.ts | 6 ++ .../src/preload/vite-auto.config.ts | 24 +++++++ pnpm-lock.yaml | 69 +++++++++++++++++++ www/package.json | 1 + 26 files changed, 405 insertions(+), 37 deletions(-) delete mode 100644 examples/basic-react/preload/preload.ts create mode 100644 examples/manual-preload-react/electron/api.ts create mode 100644 examples/manual-preload-react/electron/index.ts create mode 100644 examples/manual-preload-react/index.e2e.ts create mode 100644 examples/manual-preload-react/index.html create mode 100644 examples/manual-preload-react/package.json create mode 100644 examples/manual-preload-react/preload/preload.ts create mode 100644 examples/manual-preload-react/src/index.tsx create mode 100644 examples/manual-preload-react/tsconfig.json create mode 100644 examples/manual-preload-react/vite.config.ts create mode 100644 packages/electron-trpc/src/preload/autoPreload.ts create mode 100644 packages/electron-trpc/src/preload/vite-auto.config.ts diff --git a/README.md b/README.md index 49bcf7a6..5e913b42 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,7 @@ npm install --save electron-trpc app.on('ready', () => { const win = new BrowserWindow({ webPreferences: { - // Replace this path with the path to your preload file (see next step) - preload: 'path/to/preload.js', + contextIsolation: true, // Required for electron-trpc }, }); @@ -55,7 +54,19 @@ npm install --save electron-trpc }); ``` -2. Expose the IPC to the render process from the [preload file](https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts): + > Note: The preload script is now automatically registered by default. No manual preload configuration needed! + +2. If you need to use a custom preload script, you can disable automatic registration: + + ```ts + createIPCHandler({ + router, + windows: [win], + autoRegisterPreload: false // Disable automatic preload registration + }); + ``` + + Then manually create a preload file: ```ts import { exposeElectronTRPC } from 'electron-trpc/preload'; @@ -65,6 +76,17 @@ npm install --save electron-trpc }); ``` + And specify it in your BrowserWindow: + + ```ts + const win = new BrowserWindow({ + webPreferences: { + preload: 'path/to/preload.js', + contextIsolation: true, + }, + }); + ``` + > Note: `electron-trpc` depends on `contextIsolation` being enabled, which is the default. 3. When creating the client in the render process, use the `ipcLink` (instead of the HTTP or batch HTTP links): diff --git a/examples/basic-react-superjson/package.json b/examples/basic-react-superjson/package.json index 5ad09381..c4031631 100644 --- a/examples/basic-react-superjson/package.json +++ b/examples/basic-react-superjson/package.json @@ -6,7 +6,8 @@ "license": "MIT", "scripts": { "start": "vite", - "build": "vite build" + "build": "vite build", + "typecheck": "tsc" }, "dependencies": { "@tanstack/react-query": "^4.29.14", diff --git a/examples/basic-react-superjson/tsconfig.json b/examples/basic-react-superjson/tsconfig.json index 1c1d0b97..64311e42 100644 --- a/examples/basic-react-superjson/tsconfig.json +++ b/examples/basic-react-superjson/tsconfig.json @@ -5,8 +5,8 @@ "forceConsistentCasingInFileNames": true, "jsx": "react", "lib": ["dom", "esnext"], - "module": "node16", - "moduleResolution": "node16", + "module": "esnext", + "moduleResolution": "bundler", "noEmit": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, diff --git a/examples/basic-react/electron/index.ts b/examples/basic-react/electron/index.ts index 62973aff..66069f78 100644 --- a/examples/basic-react/electron/index.ts +++ b/examples/basic-react/electron/index.ts @@ -6,13 +6,13 @@ import { router } from './api'; process.env.DIST = path.join(__dirname, '../dist'); process.env.PUBLIC = app.isPackaged ? process.env.DIST : path.join(process.env.DIST, '../public'); -const preload = path.join(__dirname, './preload.js'); const url = process.env['VITE_DEV_SERVER_URL']; app.on('ready', () => { const win = new BrowserWindow({ webPreferences: { - preload, + // Context isolation is required for electron-trpc + contextIsolation: true, }, }); @@ -21,7 +21,7 @@ app.on('ready', () => { if (url) { win.loadURL(url); } else { - win.loadFile(path.join(process.env.DIST, 'index.html')); + win.loadFile(path.join(process.env.DIST!, 'index.html')); } win.show(); diff --git a/examples/basic-react/package.json b/examples/basic-react/package.json index cc124675..44e55ac1 100644 --- a/examples/basic-react/package.json +++ b/examples/basic-react/package.json @@ -6,7 +6,8 @@ "license": "MIT", "scripts": { "start": "vite", - "build": "vite build" + "build": "vite build", + "typecheck": "tsc" }, "dependencies": { "@tanstack/react-query": "^4.29.14", diff --git a/examples/basic-react/preload/preload.ts b/examples/basic-react/preload/preload.ts deleted file mode 100644 index 5e5f754c..00000000 --- a/examples/basic-react/preload/preload.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { exposeElectronTRPC } from 'electron-trpc/preload'; - -process.once('loaded', async () => { - exposeElectronTRPC(); -}); diff --git a/examples/basic-react/tsconfig.json b/examples/basic-react/tsconfig.json index 1c1d0b97..64311e42 100644 --- a/examples/basic-react/tsconfig.json +++ b/examples/basic-react/tsconfig.json @@ -5,8 +5,8 @@ "forceConsistentCasingInFileNames": true, "jsx": "react", "lib": ["dom", "esnext"], - "module": "node16", - "moduleResolution": "node16", + "module": "esnext", + "moduleResolution": "bundler", "noEmit": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, diff --git a/examples/basic-react/vite.config.ts b/examples/basic-react/vite.config.ts index 03d72670..31d505cc 100644 --- a/examples/basic-react/vite.config.ts +++ b/examples/basic-react/vite.config.ts @@ -10,12 +10,6 @@ export default defineConfig({ { entry: 'electron/index.ts', }, - { - entry: 'preload/preload.ts', - onstart(options) { - options.reload(); - }, - }, ]), ], }); diff --git a/examples/basic-vanilla-esm/electron/index.mjs b/examples/basic-vanilla-esm/electron/index.mjs index 263003a4..fe39737f 100644 --- a/examples/basic-vanilla-esm/electron/index.mjs +++ b/examples/basic-vanilla-esm/electron/index.mjs @@ -7,24 +7,17 @@ import { router } from './api.mjs'; const dirname = path.dirname(fileURLToPath(import.meta.url)); const html = path.join(dirname, '../dist/index.html'); -const preload = path.join(dirname, '../preload/preload.mjs'); app.on('ready', () => { const win = new BrowserWindow({ webPreferences: { - /* - * Disabling sandbox allows preload script to use ESM imports. - * - * It is recommended to instead use a bundler to bundle the preload script with its dependencies and leave the - * sandbox enabled. - * - * See https://www.electronjs.org/docs/latest/tutorial/esm - */ - sandbox: false, - preload, + // Context isolation is required for electron-trpc + contextIsolation: true, + // No preload script needed - it will be auto-registered! }, }); + // The autoRegisterPreload option defaults to true now createIPCHandler({ router, windows: [win] }); win.loadFile(html); diff --git a/examples/manual-preload-react/electron/api.ts b/examples/manual-preload-react/electron/api.ts new file mode 100644 index 00000000..1e3e6d92 --- /dev/null +++ b/examples/manual-preload-react/electron/api.ts @@ -0,0 +1,34 @@ +import z from 'zod'; +import { initTRPC } from '@trpc/server'; +import { observable } from '@trpc/server/observable'; +import { EventEmitter } from 'events'; + +const ee = new EventEmitter(); + +const t = initTRPC.create({ isServer: true }); + +export const router = t.router({ + greeting: t.procedure.input(z.object({ name: z.string() })).query((req) => { + const { input } = req; + + ee.emit('greeting', `Greeted ${input.name}`); + return { + text: `Hello ${input.name}` as const, + }; + }), + subscription: t.procedure.subscription(() => { + return observable((emit) => { + function onGreet(text: string) { + emit.next({ text }); + } + + ee.on('greeting', onGreet); + + return () => { + ee.off('greeting', onGreet); + }; + }); + }), +}); + +export type AppRouter = typeof router; diff --git a/examples/manual-preload-react/electron/index.ts b/examples/manual-preload-react/electron/index.ts new file mode 100644 index 00000000..6c033cb0 --- /dev/null +++ b/examples/manual-preload-react/electron/index.ts @@ -0,0 +1,35 @@ +import path from 'path'; +import { app, BrowserWindow } from 'electron'; +import { createIPCHandler } from 'electron-trpc/main'; +import { router } from './api'; + +process.env.DIST = path.join(__dirname, '../dist'); +process.env.PUBLIC = app.isPackaged ? process.env.DIST : path.join(process.env.DIST, '../public'); + +const preload = path.join(__dirname, './preload.js'); +const url = process.env['VITE_DEV_SERVER_URL']; + +app.on('ready', () => { + const win = new BrowserWindow({ + webPreferences: { + preload, + // Context isolation is required for electron-trpc + contextIsolation: true, + }, + }); + + // Explicitly disable automatic preload registration + createIPCHandler({ + router, + windows: [win], + autoRegisterPreload: false, + }); + + if (url) { + win.loadURL(url); + } else { + win.loadFile(path.join(process.env.DIST!, 'index.html')); + } + + win.show(); +}); diff --git a/examples/manual-preload-react/index.e2e.ts b/examples/manual-preload-react/index.e2e.ts new file mode 100644 index 00000000..b95bd4a5 --- /dev/null +++ b/examples/manual-preload-react/index.e2e.ts @@ -0,0 +1,20 @@ +import { _electron as electron, test, expect } from '@playwright/test'; + +test('Hello Electron', async () => { + const electronApp = await electron.launch({ + args: [`${__dirname}`], + executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH || undefined, + env: { + ...process.env, + NODE_ENV: 'development', + }, + }); + + const window = await electronApp.firstWindow(); + expect(await window.title()).toBe('Hello from Electron renderer!'); + + const response = await window.textContent('[data-testid="greeting"]'); + expect(response).toBe('Hello Electron'); + + await electronApp.close(); +}); diff --git a/examples/manual-preload-react/index.html b/examples/manual-preload-react/index.html new file mode 100644 index 00000000..8e25ae17 --- /dev/null +++ b/examples/manual-preload-react/index.html @@ -0,0 +1,14 @@ + + + + + + + + Hello from Electron renderer! + + +
+ + + diff --git a/examples/manual-preload-react/package.json b/examples/manual-preload-react/package.json new file mode 100644 index 00000000..ed1b8abb --- /dev/null +++ b/examples/manual-preload-react/package.json @@ -0,0 +1,31 @@ +{ + "name": "examples/manual-preload-react", + "version": "0.0.0", + "private": true, + "main": "dist-electron/index.js", + "license": "MIT", + "scripts": { + "start": "vite", + "build": "vite build", + "typecheck": "tsc" + }, + "dependencies": { + "@tanstack/react-query": "^4.29.14", + "@trpc/client": "10.33.1", + "@trpc/react-query": "10.33.1", + "@trpc/server": "10.33.1", + "electron": "29.3.2", + "electron-trpc": "workspace:*", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zod": "^3.21.4" + }, + "devDependencies": { + "@types/node": "^20.12.8", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.2.1", + "vite": "^5.2.11", + "vite-plugin-electron": "^0.28.7" + } +} diff --git a/examples/manual-preload-react/preload/preload.ts b/examples/manual-preload-react/preload/preload.ts new file mode 100644 index 00000000..10e82efa --- /dev/null +++ b/examples/manual-preload-react/preload/preload.ts @@ -0,0 +1,7 @@ +// This example demonstrates manual preload script configuration +// The automatic preload registration is disabled in electron/index.ts +import { exposeElectronTRPC } from 'electron-trpc/preload'; + +process.once('loaded', async () => { + exposeElectronTRPC(); +}); diff --git a/examples/manual-preload-react/src/index.tsx b/examples/manual-preload-react/src/index.tsx new file mode 100644 index 00000000..4efe1a86 --- /dev/null +++ b/examples/manual-preload-react/src/index.tsx @@ -0,0 +1,42 @@ +import React, { useState } from 'react'; +import ReactDom from 'react-dom'; +import { ipcLink } from 'electron-trpc/renderer'; +import { createTRPCReact } from '@trpc/react-query'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import type { AppRouter } from '../electron/api'; + +const trpcReact = createTRPCReact(); + +function App() { + const [queryClient] = useState(() => new QueryClient()); + const [trpcClient] = useState(() => + trpcReact.createClient({ + links: [ipcLink()], + }) + ); + + return ( + + + + + + ); +} + +function HelloElectron() { + const { data } = trpcReact.greeting.useQuery({ name: 'Electron' }); + trpcReact.subscription.useSubscription(undefined, { + onData: (data) => { + console.log(data); + }, + }); + + if (!data) { + return null; + } + + return
{data.text}
; +} + +ReactDom.render(, document.getElementById('react-root')); diff --git a/examples/manual-preload-react/tsconfig.json b/examples/manual-preload-react/tsconfig.json new file mode 100644 index 00000000..64311e42 --- /dev/null +++ b/examples/manual-preload-react/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "alwaysStrict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react", + "lib": ["dom", "esnext"], + "module": "esnext", + "moduleResolution": "bundler", + "noEmit": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "useDefineForClassFields": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "esnext" + }, + "include": ["./*.ts", "./*.tsx"], + "exclude": ["node_modules"] +} diff --git a/examples/manual-preload-react/vite.config.ts b/examples/manual-preload-react/vite.config.ts new file mode 100644 index 00000000..03d72670 --- /dev/null +++ b/examples/manual-preload-react/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import electron from 'vite-plugin-electron'; + +export default defineConfig({ + mode: 'development', + plugins: [ + react(), + electron([ + { + entry: 'electron/index.ts', + }, + { + entry: 'preload/preload.ts', + onstart(options) { + options.reload(); + }, + }, + ]), + ], +}); diff --git a/package.json b/package.json index cd01af59..272f8bfc 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "test": "corepack pnpm -r test", "test:e2e": "DEBUG=pw:browser* playwright test", "test:ci": "corepack pnpm -r test:ci", + "typecheck": "corepack pnpm -r typecheck", "lint": "prettier --check .", "lint:fix": "prettier --write .", "prepublishOnly": "corepack pnpm build", diff --git a/packages/electron-trpc/package.json b/packages/electron-trpc/package.json index 682d8053..7bcf4dd0 100644 --- a/packages/electron-trpc/package.json +++ b/packages/electron-trpc/package.json @@ -28,6 +28,10 @@ "import": "./dist/preload.mjs", "types": "./dist/preload.d.ts" }, + "./preload-auto": { + "require": "./dist/preload-auto.cjs", + "default": "./dist/preload-auto.cjs" + }, "./renderer": { "require": "./dist/renderer.cjs", "import": "./dist/renderer.mjs", @@ -44,12 +48,13 @@ "README.md" ], "scripts": { - "build": "tsc && vite build -c src/main/vite.config.ts && vite build -c src/renderer/vite.config.ts && vite build -c src/preload/vite.config.ts && corepack pnpm build:types", + "build": "tsc && vite build -c src/main/vite.config.ts && vite build -c src/renderer/vite.config.ts && vite build -c src/preload/vite.config.ts && vite build -c src/preload/vite-auto.config.ts && corepack pnpm build:types", "build:types": "dts-bundle-generator --config ./dts-bundle-generator.config.ts && corepack pnpm run copy:types", "copy:readme": "cp ../../README.md ./", "copy:types": "cp dist/main.d.ts dist/renderer.d.ts dist/preload.d.ts ./", "test": "vitest -c vitest.config.ts", "test:ci": "vitest run -c vitest.config.ts --coverage", + "typecheck": "tsc", "prepublishOnly": "corepack pnpm copy:readme && corepack pnpm build", "changeset": "changeset", "release": "changeset publish" diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index dc3cd1e5..297d21da 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -1,5 +1,5 @@ import type { AnyRouter, inferRouterContext } from '@trpc/server'; -import { ipcMain } from 'electron'; +import { ipcMain, session } from 'electron'; import type { BrowserWindow, IpcMainEvent } from 'electron'; import { handleIPCMessage } from './handleIPCMessage'; import { CreateContextOptions } from './types'; @@ -7,6 +7,8 @@ import { ELECTRON_TRPC_CHANNEL } from '../constants'; import { ETRPCRequest } from '../types'; import { Unsubscribable } from '@trpc/server/observable'; import debugFactory from 'debug'; +import path from 'path'; +import { fileURLToPath } from 'url'; const debug = debugFactory('electron-trpc:main:IPCHandler'); @@ -109,10 +111,38 @@ export const createIPCHandler = ({ createContext, router, windows = [], + autoRegisterPreload = true, }: { createContext?: (opts: CreateContextOptions) => Promise>; router: TRouter; windows?: Electron.BrowserWindow[]; + autoRegisterPreload?: boolean; }) => { + if (autoRegisterPreload) { + // Register the preload script automatically + let preloadPath: string; + + // Determine the preload script path + if (typeof require !== 'undefined' && typeof require.resolve === 'function') { + // CommonJS - use require.resolve for better compatibility with bundlers + preloadPath = require.resolve('electron-trpc/preload-auto'); + } else if (typeof import.meta.url !== 'undefined') { + // ESM - import.meta.url will be in the dist directory + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + preloadPath = path.join(__dirname, 'preload-auto.cjs'); + } else { + throw new Error( + 'Failed to resolve electron-trpc preload script path. ' + + 'Unable to determine current module directory.' + ); + } + + debug('Auto-registering preload script at:', preloadPath); + + // Use setPreloads to automatically inject the preload script + session.defaultSession.setPreloads([...session.defaultSession.getPreloads(), preloadPath]); + } + return new IPCHandler({ createContext, router, windows }); }; diff --git a/packages/electron-trpc/src/main/vite.config.ts b/packages/electron-trpc/src/main/vite.config.ts index 89db1c7c..a0d23e74 100644 --- a/packages/electron-trpc/src/main/vite.config.ts +++ b/packages/electron-trpc/src/main/vite.config.ts @@ -13,7 +13,7 @@ module.exports = defineConfig({ }, outDir: path.resolve(__dirname, '../../dist'), rollupOptions: { - external: ['electron'], + external: ['electron', 'path', 'url'], }, }, }); diff --git a/packages/electron-trpc/src/preload/autoPreload.ts b/packages/electron-trpc/src/preload/autoPreload.ts new file mode 100644 index 00000000..4f6f4c9a --- /dev/null +++ b/packages/electron-trpc/src/preload/autoPreload.ts @@ -0,0 +1,6 @@ +// This is a self-executing preload script that automatically exposes electronTRPC +// It's designed to be used with session.setPreloads() for automatic registration +import { exposeElectronTRPC } from './exposeElectronTRPC'; + +// Automatically expose electronTRPC when the preload script is loaded +exposeElectronTRPC(); \ No newline at end of file diff --git a/packages/electron-trpc/src/preload/vite-auto.config.ts b/packages/electron-trpc/src/preload/vite-auto.config.ts new file mode 100644 index 00000000..fde233a6 --- /dev/null +++ b/packages/electron-trpc/src/preload/vite-auto.config.ts @@ -0,0 +1,24 @@ +/// +import path from 'path'; +import { defineConfig } from 'vite'; + +module.exports = defineConfig({ + base: './', + build: { + emptyOutDir: false, + lib: { + entry: path.resolve(__dirname, './autoPreload.ts'), + name: 'electron-trpc-preload-auto', + formats: ['cjs'], + fileName: () => 'preload-auto.cjs', + }, + outDir: path.resolve(__dirname, '../../dist'), + rollupOptions: { + external: ['electron'], + output: { + // Force everything into a single file + inlineDynamicImports: true, + }, + }, + }, +}); \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2783acb9..a938a386 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,6 +150,55 @@ importers: specifier: ^20.12.8 version: 20.12.8 + examples/manual-preload-react: + dependencies: + '@tanstack/react-query': + specifier: ^4.29.14 + version: 4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@trpc/client': + specifier: 10.33.1 + version: 10.33.1(@trpc/server@10.33.1) + '@trpc/react-query': + specifier: 10.33.1 + version: 10.33.1(@tanstack/react-query@4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@trpc/server': + specifier: 10.33.1 + version: 10.33.1 + electron: + specifier: 29.3.2 + version: 29.3.2 + electron-trpc: + specifier: workspace:* + version: link:../../packages/electron-trpc + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + zod: + specifier: ^3.21.4 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: ^20.12.8 + version: 20.12.8 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.2.1(vite@5.2.11(@types/node@20.12.8)) + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.8) + vite-plugin-electron: + specifier: ^0.28.7 + version: 0.28.7 + packages/electron-trpc: dependencies: debug: @@ -5449,6 +5498,14 @@ snapshots: optionalDependencies: react-dom: 18.2.0(react@18.2.0) + '@tanstack/react-query@4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/query-core': 4.29.14 + react: 18.3.1 + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + '@tanstack/react-query@5.32.1(react@18.3.1)': dependencies: '@tanstack/query-core': 5.32.1 @@ -5470,6 +5527,14 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + '@trpc/react-query@10.33.1(@tanstack/react-query@4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/react-query': 4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@trpc/client': 10.33.1(@trpc/server@10.33.1) + '@trpc/server': 10.33.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@trpc/server@10.33.1': {} '@trpc/server@10.45.2': {} @@ -9078,6 +9143,10 @@ snapshots: dependencies: react: 18.2.0 + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} validate-npm-package-license@3.0.4: diff --git a/www/package.json b/www/package.json index 646715f9..0e475a94 100644 --- a/www/package.json +++ b/www/package.json @@ -7,6 +7,7 @@ "dev": "astro dev", "start": "astro dev", "build": "astro check && astro build", + "typecheck": "astro check", "preview": "astro preview", "astro": "astro", "publish-pages": "wrangler pages deploy" From 7e3b17cee1a5fb5e45bb425181880baee4459628 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 13:05:35 -0400 Subject: [PATCH 07/20] Try to make e2e behave the same on CI and local. --- examples/basic-react/index.e2e.ts | 1 + examples/basic-vanilla-esm/index.e2e.js | 1 + examples/manual-preload-react/index.e2e.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/examples/basic-react/index.e2e.ts b/examples/basic-react/index.e2e.ts index b95bd4a5..44250bee 100644 --- a/examples/basic-react/index.e2e.ts +++ b/examples/basic-react/index.e2e.ts @@ -11,6 +11,7 @@ test('Hello Electron', async () => { }); const window = await electronApp.firstWindow(); + await window.waitForLoadState('load'); expect(await window.title()).toBe('Hello from Electron renderer!'); const response = await window.textContent('[data-testid="greeting"]'); diff --git a/examples/basic-vanilla-esm/index.e2e.js b/examples/basic-vanilla-esm/index.e2e.js index 0bdd8e65..2cfb1e90 100644 --- a/examples/basic-vanilla-esm/index.e2e.js +++ b/examples/basic-vanilla-esm/index.e2e.js @@ -15,6 +15,7 @@ test('Hello Electron', async () => { }); const window = await electronApp.firstWindow(); + await window.waitForLoadState('load'); expect(await window.title()).toBe('Hello from Electron renderer!'); const response = await window.textContent('[data-testid="greeting"]'); diff --git a/examples/manual-preload-react/index.e2e.ts b/examples/manual-preload-react/index.e2e.ts index b95bd4a5..44250bee 100644 --- a/examples/manual-preload-react/index.e2e.ts +++ b/examples/manual-preload-react/index.e2e.ts @@ -11,6 +11,7 @@ test('Hello Electron', async () => { }); const window = await electronApp.firstWindow(); + await window.waitForLoadState('load'); expect(await window.title()).toBe('Hello from Electron renderer!'); const response = await window.textContent('[data-testid="greeting"]'); From 87c98af6e18bcfd5d248e190a1139c41f79c9eda Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 13:18:19 -0400 Subject: [PATCH 08/20] Add changeset for automatic preload. --- .changeset/modern-pumpkins-collect.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/modern-pumpkins-collect.md diff --git a/.changeset/modern-pumpkins-collect.md b/.changeset/modern-pumpkins-collect.md new file mode 100644 index 00000000..a6b6474b --- /dev/null +++ b/.changeset/modern-pumpkins-collect.md @@ -0,0 +1,5 @@ +--- +"electron-trpc": major +--- + +Preload is automatically registered by default in CJS or ESM contexts. From 4b52bc2e4e81656acc04d7b3e014a615b9fe06fe Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 13:19:20 -0400 Subject: [PATCH 09/20] Ignore www in changeset generation. --- .changeset/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index aa586b67..aeffa265 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["examples/*"] + "ignore": ["examples/*", "www"] } From b9d226a2ae85920dd3f8f237cb08218e105fa194 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 13:20:02 -0400 Subject: [PATCH 10/20] Use consistent wording in changeset notes. --- .changeset/modern-pumpkins-collect.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changeset/modern-pumpkins-collect.md b/.changeset/modern-pumpkins-collect.md index a6b6474b..b3757a04 100644 --- a/.changeset/modern-pumpkins-collect.md +++ b/.changeset/modern-pumpkins-collect.md @@ -1,5 +1,5 @@ --- -"electron-trpc": major +'electron-trpc': major --- -Preload is automatically registered by default in CJS or ESM contexts. +Breaking change: Preload is automatically registered by default in CJS or ESM contexts. From 8ea14ad3ec8fb3ee65009eb43474d60152c32e48 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Mon, 28 Jul 2025 23:09:01 -0400 Subject: [PATCH 11/20] Test the current `createIPCHandler` behavior. --- .../main/__tests__/createIPCHandler.test.ts | 558 ++++++++++++++++++ .../src/main/createIPCHandler.ts | 26 +- 2 files changed, 571 insertions(+), 13 deletions(-) create mode 100644 packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts diff --git a/packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts b/packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts new file mode 100644 index 00000000..06174b2f --- /dev/null +++ b/packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts @@ -0,0 +1,558 @@ +import { describe, it, expect, vi, beforeEach, MockedFunction } from 'vitest'; +import { BrowserWindow, ipcMain, IpcMainEvent, WebContents, WebFrameMain, session } from 'electron'; +import { createIPCHandler } from '../createIPCHandler'; +import { ELECTRON_TRPC_CHANNEL } from '../../constants'; +import { ETRPCRequest } from '../../types'; +import { handleIPCMessage } from '../handleIPCMessage'; +import { initTRPC } from '@trpc/server'; + +vi.mock('../handleIPCMessage', () => ({ + handleIPCMessage: vi.fn(), +})); + +vi.mock('electron', () => ({ + ipcMain: { + on: vi.fn(), + }, + session: { + defaultSession: { + getPreloads: vi.fn(() => []), + setPreloads: vi.fn(), + }, + }, +})); + +interface MockWebContents { + id: number; + on: MockedFunction<(event: string, handler: any) => void>; + isDestroyed: () => boolean; +} + +interface MockWebFrameMain { + routingId: number; +} + +interface MockBrowserWindow { + id: number; + webContents: MockWebContents; + isDestroyed: () => boolean; +} + +interface MockIpcMainEvent { + sender: MockWebContents & { id: number }; + senderFrame: MockWebFrameMain; + reply: MockedFunction<(channel: string, ...args: any[]) => void>; +} + +const makeBrowserWindow = (window: MockBrowserWindow) => window as unknown as BrowserWindow; +const makeIpcMainEvent = (event: MockIpcMainEvent) => event as unknown as IpcMainEvent; + +describe('IPCHandler', () => { + let mockHandleIPCMessage: MockedFunction; + let ipcMainHandler: ((event: IpcMainEvent, request: ETRPCRequest) => void) | undefined; + + beforeEach(() => { + vi.clearAllMocks(); + mockHandleIPCMessage = vi.mocked(handleIPCMessage); + ipcMainHandler = undefined; + + vi.mocked(ipcMain.on).mockImplementation((channel, handler) => { + if (channel === ELECTRON_TRPC_CHANNEL) { + ipcMainHandler = handler; + } + return ipcMain; + }); + }); + + describe('constructor', () => { + it('should register ipcMain handler', () => { + const t = initTRPC.create(); + const router = t.router({}); + + createIPCHandler({ router }); + + expect(ipcMain.on).toHaveBeenCalledWith(ELECTRON_TRPC_CHANNEL, expect.any(Function)); + }); + + it('should attach initial windows', () => { + const t = initTRPC.create(); + const router = t.router({}); + + const mockWindow1: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + const mockWindow2: MockBrowserWindow = { + id: 2, + webContents: { + id: 102, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + createIPCHandler({ + router, + windows: [makeBrowserWindow(mockWindow1), makeBrowserWindow(mockWindow2)], + }); + + expect(mockWindow1.webContents.on).toHaveBeenCalledWith( + 'did-start-navigation', + expect.any(Function) + ); + expect(mockWindow1.webContents.on).toHaveBeenCalledWith('destroyed', expect.any(Function)); + expect(mockWindow2.webContents.on).toHaveBeenCalledWith( + 'did-start-navigation', + expect.any(Function) + ); + expect(mockWindow2.webContents.on).toHaveBeenCalledWith('destroyed', expect.any(Function)); + }); + + it('should pass createContext to handleIPCMessage', () => { + const t = initTRPC.create(); + const router = t.router({}); + const createContext = vi.fn().mockResolvedValue({ user: 'test' }); + + createIPCHandler({ router, createContext }); + + const mockEvent: MockIpcMainEvent = { + sender: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + senderFrame: { + routingId: 1, + }, + reply: vi.fn(), + }; + + const request: ETRPCRequest = { + method: 'request', + operation: { + id: 1, + type: 'query', + path: 'test.query', + input: undefined, + context: {}, + }, + }; + + ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); + + expect(mockHandleIPCMessage).toHaveBeenCalledWith({ + router, + createContext, + internalId: '101-1:1', + event: expect.any(Object), + message: request, + subscriptions: expect.any(Map), + }); + }); + }); + + describe('attachWindow', () => { + it('should attach a new window', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + handler.attachWindow(makeBrowserWindow(mockWindow)); + + expect(mockWindow.webContents.on).toHaveBeenCalledWith( + 'did-start-navigation', + expect.any(Function) + ); + expect(mockWindow.webContents.on).toHaveBeenCalledWith('destroyed', expect.any(Function)); + }); + + it('should not attach the same window twice', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + const browserWindow = makeBrowserWindow(mockWindow); + handler.attachWindow(browserWindow); + handler.attachWindow(browserWindow); + + expect(mockWindow.webContents.on).toHaveBeenCalledTimes(2); + }); + }); + + describe('detachWindow', () => { + it('should detach a window and clean up subscriptions', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + const browserWindow = makeBrowserWindow(mockWindow); + handler.attachWindow(browserWindow); + + const subscriptions = (handler as any)['subscriptions'] as Map; + const mockUnsubscribe = vi.fn(); + subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe }); + subscriptions.set('102-1:subscription2', { unsubscribe: vi.fn() }); + + handler.detachWindow(browserWindow); + + expect(mockUnsubscribe).toHaveBeenCalled(); + expect(subscriptions.has('101-1:subscription1')).toBe(false); + expect(subscriptions.has('102-1:subscription2')).toBe(true); + }); + + it('should throw error when detaching destroyed window without webContentsId', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => true, + }; + + const browserWindow = makeBrowserWindow(mockWindow); + + expect(() => handler.detachWindow(browserWindow)).toThrow( + 'webContentsId is required when calling detachWindow on a destroyed window' + ); + }); + + it('should allow detaching destroyed window with webContentsId', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + isDestroyed: () => true, + }; + + const browserWindow = makeBrowserWindow(mockWindow); + handler.attachWindow(browserWindow); + + expect(() => handler.detachWindow(browserWindow, 101)).not.toThrow(); + }); + }); + + describe('subscription cleanup handlers', () => { + it('should clean up subscriptions on hard navigation', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + let navigationHandler: ((event: any) => void) | undefined; + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn().mockImplementation((event, handler) => { + if (event === 'did-start-navigation') { + navigationHandler = handler; + } + }), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + handler.attachWindow(makeBrowserWindow(mockWindow)); + + const subscriptions = (handler as any)['subscriptions'] as Map; + const mockUnsubscribe1 = vi.fn(); + const mockUnsubscribe2 = vi.fn(); + const mockUnsubscribe3 = vi.fn(); + + subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe1 }); + subscriptions.set('101-2:subscription2', { unsubscribe: mockUnsubscribe2 }); + subscriptions.set('102-1:subscription3', { unsubscribe: mockUnsubscribe3 }); + + navigationHandler?.({ + isSameDocument: false, + frame: { routingId: 1 }, + }); + + expect(mockUnsubscribe1).toHaveBeenCalled(); + expect(mockUnsubscribe2).not.toHaveBeenCalled(); + expect(mockUnsubscribe3).not.toHaveBeenCalled(); + expect(subscriptions.has('101-1:subscription1')).toBe(false); + expect(subscriptions.has('101-2:subscription2')).toBe(true); + expect(subscriptions.has('102-1:subscription3')).toBe(true); + }); + + it('should not clean up subscriptions on soft navigation', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + let navigationHandler: ((event: any) => void) | undefined; + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn().mockImplementation((event, handler) => { + if (event === 'did-start-navigation') { + navigationHandler = handler; + } + }), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + handler.attachWindow(makeBrowserWindow(mockWindow)); + + const subscriptions = (handler as any)['subscriptions'] as Map; + const mockUnsubscribe = vi.fn(); + subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe }); + + navigationHandler?.({ + isSameDocument: true, + frame: { routingId: 1 }, + }); + + expect(mockUnsubscribe).not.toHaveBeenCalled(); + expect(subscriptions.has('101-1:subscription1')).toBe(true); + }); + + it('should detach window on webContents destroyed event', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const eventHandlers: { [key: string]: (() => void)[] } = { + destroyed: [], + 'did-start-navigation': [], + }; + + const mockWindow: MockBrowserWindow = { + id: 1, + webContents: { + id: 101, + on: vi.fn().mockImplementation((event, handler) => { + eventHandlers[event].push(handler); + }), + isDestroyed: () => false, + }, + isDestroyed: () => false, + }; + + const browserWindow = makeBrowserWindow(mockWindow); + handler.attachWindow(browserWindow); + + const subscriptions = (handler as any)['subscriptions'] as Map; + const mockUnsubscribe1 = vi.fn(); + const mockUnsubscribe2 = vi.fn(); + const mockUnsubscribe3 = vi.fn(); + + subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe1 }); + subscriptions.set('101-2:subscription2', { unsubscribe: mockUnsubscribe2 }); + subscriptions.set('102-1:subscription3', { unsubscribe: mockUnsubscribe3 }); + + expect((handler as any)['windows']).toHaveLength(1); + + mockWindow.isDestroyed = () => true; + + expect(eventHandlers.destroyed).toHaveLength(1); + eventHandlers.destroyed.forEach((handler) => handler()); + + expect((handler as any)['windows']).toHaveLength(0); + + expect(mockUnsubscribe1).toHaveBeenCalled(); + expect(mockUnsubscribe2).toHaveBeenCalled(); + expect(mockUnsubscribe3).not.toHaveBeenCalled(); // Different webContentsId + expect(subscriptions.has('101-1:subscription1')).toBe(false); + expect(subscriptions.has('101-2:subscription2')).toBe(false); + expect(subscriptions.has('102-1:subscription3')).toBe(true); + }); + }); + + describe('IPC message handling', () => { + it('should handle request messages', () => { + const t = initTRPC.create(); + const router = t.router({}); + createIPCHandler({ router }); + + const mockEvent: MockIpcMainEvent = { + sender: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + senderFrame: { + routingId: 1, + }, + reply: vi.fn(), + }; + + const request: ETRPCRequest = { + method: 'request', + operation: { + id: 1, + type: 'query', + path: 'test.query', + input: undefined, + context: {}, + }, + }; + + ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); + + expect(mockHandleIPCMessage).toHaveBeenCalledOnce(); + expect(mockHandleIPCMessage).toHaveBeenCalledWith({ + router, + createContext: undefined, + internalId: '101-1:1', + event: expect.any(Object), + message: request, + subscriptions: expect.any(Map), + }); + }); + + it('should handle subscription.stop messages', () => { + const t = initTRPC.create(); + const router = t.router({}); + createIPCHandler({ router }); + + const mockEvent: MockIpcMainEvent = { + sender: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + senderFrame: { + routingId: 1, + }, + reply: vi.fn(), + }; + + const request: ETRPCRequest = { + method: 'subscription.stop', + id: 1, + }; + + ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); + + expect(mockHandleIPCMessage).toHaveBeenCalledWith({ + router, + createContext: undefined, + internalId: '101-1:1', + event: expect.any(Object), + message: request, + subscriptions: expect.any(Map), + }); + }); + + it('should share subscriptions map across all IPC messages', () => { + const t = initTRPC.create(); + const router = t.router({}); + const handler = createIPCHandler({ router }); + + const subscriptions = (handler as any)['subscriptions'] as Map; + subscriptions.set('test-subscription', { unsubscribe: vi.fn() }); + + const mockEvent: MockIpcMainEvent = { + sender: { + id: 101, + on: vi.fn(), + isDestroyed: () => false, + }, + senderFrame: { + routingId: 1, + }, + reply: vi.fn(), + }; + + const request: ETRPCRequest = { + method: 'request', + operation: { + id: 1, + type: 'query', + path: 'test.query', + input: undefined, + context: {}, + }, + }; + + ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); + + const passedSubscriptions = mockHandleIPCMessage.mock.calls[0][0].subscriptions; + expect(passedSubscriptions.has('test-subscription')).toBe(true); + }); + }); + + describe('autoRegisterPreload', () => { + it('should auto-register preload script by default', () => { + const t = initTRPC.create(); + const router = t.router({}); + + // Mock existing preloads + const existingPreloads = ['/path/to/existing/preload.js']; + vi.mocked(session.defaultSession.getPreloads).mockReturnValue(existingPreloads); + + createIPCHandler({ router }); + + expect(vi.mocked(session.defaultSession.getPreloads)).toHaveBeenCalled(); + expect(vi.mocked(session.defaultSession.setPreloads)).toHaveBeenCalledWith([ + ...existingPreloads, + expect.stringContaining('electron-trpc/dist/preload-auto'), + ]); + }); + + it('should not register preload script when autoRegisterPreload is false', () => { + const t = initTRPC.create(); + const router = t.router({}); + + createIPCHandler({ router, autoRegisterPreload: false }); + + expect(vi.mocked(session.defaultSession.getPreloads)).not.toHaveBeenCalled(); + expect(vi.mocked(session.defaultSession.setPreloads)).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 297d21da..6be7019d 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -20,8 +20,8 @@ const getInternalId = (event: IpcMainEvent, request: ETRPCRequest) => { }; class IPCHandler { - #windows: BrowserWindow[] = []; - #subscriptions: Map = new Map(); + private windows: BrowserWindow[] = []; + private subscriptions: Map = new Map(); constructor({ createContext, @@ -41,20 +41,20 @@ class IPCHandler { internalId: getInternalId(event, request), event, message: request, - subscriptions: this.#subscriptions, + subscriptions: this.subscriptions, }); }); } attachWindow(win: BrowserWindow) { - if (this.#windows.includes(win)) { + if (this.windows.includes(win)) { return; } debug('Attaching window', win.id); - this.#windows.push(win); - this.#attachSubscriptionCleanupHandlers(win); + this.windows.push(win); + this.attachSubscriptionCleanupHandlers(win); } detachWindow(win: BrowserWindow, webContentsId?: number) { @@ -64,27 +64,27 @@ class IPCHandler { throw new Error('webContentsId is required when calling detachWindow on a destroyed window'); } - this.#windows = this.#windows.filter((w) => w !== win); - this.#cleanUpSubscriptions({ webContentsId: webContentsId ?? win.webContents.id }); + this.windows = this.windows.filter((w) => w !== win); + this.cleanUpSubscriptions({ webContentsId: webContentsId ?? win.webContents.id }); } - #cleanUpSubscriptions({ + private cleanUpSubscriptions({ webContentsId, frameRoutingId, }: { webContentsId: number; frameRoutingId?: number; }) { - for (const [key, sub] of this.#subscriptions.entries()) { + for (const [key, sub] of this.subscriptions.entries()) { if (key.startsWith(`${webContentsId}-${frameRoutingId ?? ''}`)) { debug('Closing subscription', key); sub.unsubscribe(); - this.#subscriptions.delete(key); + this.subscriptions.delete(key); } } } - #attachSubscriptionCleanupHandlers(win: BrowserWindow) { + private attachSubscriptionCleanupHandlers(win: BrowserWindow) { const webContentsId = win.webContents.id; win.webContents.on('did-start-navigation', ({ isSameDocument, frame }) => { // Check if it's a hard navigation @@ -94,7 +94,7 @@ class IPCHandler { `webContentsId: ${webContentsId}`, `frameRoutingId: ${frame.routingId}` ); - this.#cleanUpSubscriptions({ + this.cleanUpSubscriptions({ webContentsId: webContentsId, frameRoutingId: frame.routingId, }); From 85f0b718d41910c3d1779f174f2253e3a76be50a Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 17:37:18 -0400 Subject: [PATCH 12/20] Modernize toolchain for v1. - Replace shell.nix with a flake (Node 24, pnpm 12) and `use flake`. - Drop corepack from scripts and move pnpm settings into pnpm-workspace.yaml. - Build with tsdown instead of four vite configs and dts-bundle-generator, emitting per-format type declarations listed first in `exports`. - Upgrade to TypeScript 7, Vitest 5, Electron 45 and Playwright 1.64, and remove unused dev dependencies. - Skip IPC messages and navigations whose frame is already gone, now that Electron types `senderFrame` and navigation `frame` as nullable. - Run CI on Node 24 with current action versions, and set up the Electron sandbox for every example. --- .envrc | 2 +- .github/workflows/lint.yml | 14 +- .github/workflows/release.yml | 8 +- .github/workflows/test.yml | 40 +- .github/workflows/www.yml | 14 +- .gitignore | 3 +- .node_version | 2 +- .npmrc | 2 - .prettierignore | 1 + README.md | 6 +- examples/basic-vanilla-esm/package.json | 2 +- flake.lock | 61 + flake.nix | 37 + package.json | 37 +- .../dts-bundle-generator.config.ts | 24 - packages/electron-trpc/package.json | 83 +- packages/electron-trpc/preload.d.ts | 5 - .../src/main/createIPCHandler.ts | 15 +- .../electron-trpc/src/main/vite.config.ts | 19 - .../electron-trpc/src/preload/autoPreload.ts | 2 +- .../src/preload/vite-auto.config.ts | 24 - .../electron-trpc/src/preload/vite.config.ts | 21 - .../electron-trpc/src/renderer/tsconfig.json | 20 - .../electron-trpc/src/renderer/vite.config.ts | 18 - packages/electron-trpc/src/types.ts | 3 +- packages/electron-trpc/tsconfig.json | 13 +- packages/electron-trpc/tsdown.config.ts | 25 + packages/electron-trpc/vitest.config.ts | 8 +- pnpm-lock.yaml | 9095 ++++++++--------- pnpm-workspace.yaml | 8 + shell.nix | 27 - 31 files changed, 4552 insertions(+), 5087 deletions(-) delete mode 100644 .npmrc create mode 100644 flake.lock create mode 100644 flake.nix delete mode 100644 packages/electron-trpc/dts-bundle-generator.config.ts delete mode 100644 packages/electron-trpc/preload.d.ts delete mode 100644 packages/electron-trpc/src/main/vite.config.ts delete mode 100644 packages/electron-trpc/src/preload/vite-auto.config.ts delete mode 100644 packages/electron-trpc/src/preload/vite.config.ts delete mode 100644 packages/electron-trpc/src/renderer/tsconfig.json delete mode 100644 packages/electron-trpc/src/renderer/vite.config.ts create mode 100644 packages/electron-trpc/tsdown.config.ts delete mode 100644 shell.nix diff --git a/.envrc b/.envrc index 1d953f4b..3550a30f 100644 --- a/.envrc +++ b/.envrc @@ -1 +1 @@ -use nix +use flake diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index fbc45d93..b53849fc 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,18 +12,14 @@ env: jobs: lint: - runs-on: ${{ matrix.os }} - strategy: - matrix: - node: ['18.x'] - os: [ubuntu-latest] + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: - node-version: ${{ matrix.node }} + node-version-file: .node_version cache: 'pnpm' - run: pnpm install --frozen-lockfile - run: pnpm lint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c2a9c9c..76a58152 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,11 +13,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: - node-version: '18.x' + node-version-file: .node_version cache: 'pnpm' - run: pnpm install --frozen-lockfile - uses: changesets/action@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea7f4225..2aa58304 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,43 +7,35 @@ env: jobs: test: - runs-on: ${{ matrix.os }} - strategy: - matrix: - node: ['18.x'] - os: [ubuntu-latest] + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: - node-version: ${{ matrix.node }} + node-version-file: .node_version cache: 'pnpm' - run: pnpm install --frozen-lockfile - run: pnpm build:code - run: pnpm test:ci - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v7 test-e2e: - runs-on: ${{ matrix.os }} - strategy: - matrix: - node: ['18.x'] - os: [ubuntu-latest] + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: - node-version: ${{ matrix.node }} + node-version-file: .node_version cache: 'pnpm' - run: pnpm install --frozen-lockfile - run: pnpm build:code - - run: | - sudo chown root examples/basic-react/node_modules/electron/dist/chrome-sandbox \ - && sudo chmod 4755 examples/basic-react/node_modules/electron/dist/chrome-sandbox \ - && sudo chown root examples/basic-vanilla-esm/node_modules/electron/dist/chrome-sandbox \ - && sudo chmod 4755 examples/basic-vanilla-esm/node_modules/electron/dist/chrome-sandbox + - name: Set up Electron sandbox + run: | + for sandbox in examples/*/node_modules/electron/dist/chrome-sandbox; do + sudo chown root "$sandbox" && sudo chmod 4755 "$sandbox" + done - run: xvfb-run --auto-servernum -- pnpm test:e2e diff --git a/.github/workflows/www.yml b/.github/workflows/www.yml index 31334247..bc1db834 100644 --- a/.github/workflows/www.yml +++ b/.github/workflows/www.yml @@ -10,18 +10,14 @@ env: jobs: deploy: - runs-on: ${{ matrix.os }} - strategy: - matrix: - node: ['18.x'] - os: [ubuntu-latest] + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - - uses: actions/setup-node@v4 + - uses: actions/checkout@v7 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 with: - node-version: ${{ matrix.node }} + node-version-file: .node_version cache: 'pnpm' - run: pnpm install --frozen-lockfile - run: pnpm docs:build diff --git a/.gitignore b/.gitignore index f71b1f86..a7dcefe1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ dist/ dist-electron/ docs/.vitepress/cache/ coverage/ -packages/electron-trpc/renderer.d.ts -packages/electron-trpc/main.d.ts +test-results/ diff --git a/.node_version b/.node_version index 3c032078..a45fd52c 100644 --- a/.node_version +++ b/.node_version @@ -1 +1 @@ -18 +24 diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 928c2981..00000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -strict-peer-dependencies=false -link-workspace-packages=true diff --git a/.prettierignore b/.prettierignore index 79809ac6..0979ddb4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,3 +3,4 @@ **/coverage/ pnpm-lock.yaml +**/test-results/ diff --git a/README.md b/README.md index 5e913b42..1c7b6456 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,10 @@ npm install --save electron-trpc 2. If you need to use a custom preload script, you can disable automatic registration: ```ts - createIPCHandler({ - router, + createIPCHandler({ + router, windows: [win], - autoRegisterPreload: false // Disable automatic preload registration + autoRegisterPreload: false, // Disable automatic preload registration }); ``` diff --git a/examples/basic-vanilla-esm/package.json b/examples/basic-vanilla-esm/package.json index 965c19ed..710b503b 100644 --- a/examples/basic-vanilla-esm/package.json +++ b/examples/basic-vanilla-esm/package.json @@ -6,7 +6,7 @@ "main": "electron/index.mjs", "license": "MIT", "scripts": { - "start": "corepack pnpm build && electron .", + "start": "pnpm build && electron .", "build": "vite build" }, "dependencies": { diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..ef2f958f --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1791914995, + "narHash": "sha256-Zf/xfQEAasnwnmEfHqW/4hjDE/s44yn2hD4RuVIZRjA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b7a79d3fea1e214f6d668d521cecec0c01e26544", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1793110635, + "narHash": "sha256-dhoW6VgFWlaodSY5jrBn+CF2FLmaUvDVgM7+C7T2+NM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "31ecbaca1bdefa45dffc409f0250bd8039ea0010", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..e4caff20 --- /dev/null +++ b/flake.nix @@ -0,0 +1,37 @@ +{ + description = "electron-trpc dev shell"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = + { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { inherit system; }; + requiredNodejs = pkgs.nodejs_24; + in + { + devShells.default = + assert pkgs.lib.versionAtLeast requiredNodejs.version "24.11.0"; + pkgs.mkShell { + packages = with pkgs; [ + requiredNodejs + pnpm_12 + git + xvfb-run + ]; + + # Playwright only drives Electron, it never needs its own browsers. + PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = 1; + }; + } + ); +} diff --git a/package.json b/package.json index 272f8bfc..0b23f74c 100644 --- a/package.json +++ b/package.json @@ -1,38 +1,33 @@ { "license": "MIT", "scripts": { - "build": "corepack pnpm -r build", - "build:code": "corepack pnpm --filter=!www build", - "test": "corepack pnpm -r test", + "build": "pnpm -r build", + "build:code": "pnpm --filter=!www build", + "test": "pnpm -r test", "test:e2e": "DEBUG=pw:browser* playwright test", - "test:ci": "corepack pnpm -r test:ci", - "typecheck": "corepack pnpm -r typecheck", + "test:ci": "pnpm -r test:ci", + "typecheck": "pnpm -r typecheck", "lint": "prettier --check .", "lint:fix": "prettier --write .", - "prepublishOnly": "corepack pnpm build", + "prepublishOnly": "pnpm build", "changeset": "changeset", "changeset:version": "changeset version && pnpm install --no-frozen-lockfile", "release": "changeset publish", - "docs:start": "corepack pnpm --filter www dev", - "docs:build": "corepack pnpm --filter www build", - "docs:preview": "corepack pnpm --filter www preview", - "docs:publish": "corepack pnpm --filter www publish-pages" + "docs:start": "pnpm --filter www dev", + "docs:build": "pnpm --filter www build", + "docs:preview": "pnpm --filter www preview", + "docs:publish": "pnpm --filter www publish-pages" }, - "packageManager": "pnpm@9.15.0", + "packageManager": "pnpm@12.9.0", "devDependencies": { "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.1", - "@playwright/test": "^1.43.1", - "prettier": "^3.2.5", - "typescript": "^5.4.5" + "@playwright/test": "^1.64.1", + "prettier": "^3.9.10", + "typescript": "^7.0.2" }, "engines": { - "node": ">=18", - "pnpm": ">=9" - }, - "pnpm": { - "requiredScripts": [ - "build" - ] + "node": ">=24.11", + "pnpm": ">=12" } } diff --git a/packages/electron-trpc/dts-bundle-generator.config.ts b/packages/electron-trpc/dts-bundle-generator.config.ts deleted file mode 100644 index 76d0716b..00000000 --- a/packages/electron-trpc/dts-bundle-generator.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -const config = { - compilationOptions: { - preferredConfigPath: './tsconfig.json', - }, - entries: [ - { - filePath: './src/main/index.ts', - outFile: `./dist/main.d.ts`, - noCheck: true, - }, - { - filePath: './src/preload/index.ts', - outFile: `./dist/preload.d.ts`, - noCheck: true, - }, - { - filePath: './src/renderer/index.ts', - outFile: `./dist/renderer.d.ts`, - noCheck: true, - }, - ], -}; - -module.exports = config; diff --git a/packages/electron-trpc/package.json b/packages/electron-trpc/package.json index 7bcf4dd0..82739258 100644 --- a/packages/electron-trpc/package.json +++ b/packages/electron-trpc/package.json @@ -2,6 +2,7 @@ "name": "electron-trpc", "description": "Electron support for tRPC", "version": "0.7.1", + "type": "module", "repository": { "type": "git", "url": "https://github.com/jsonnull/electron-trpc.git" @@ -19,63 +20,65 @@ ], "exports": { "./main": { - "require": "./dist/main.cjs", - "import": "./dist/main.mjs", - "types": "./dist/main.d.ts" + "import": { + "types": "./dist/main.d.mts", + "default": "./dist/main.mjs" + }, + "require": { + "types": "./dist/main.d.cts", + "default": "./dist/main.cjs" + } }, "./preload": { - "require": "./dist/preload.cjs", - "import": "./dist/preload.mjs", - "types": "./dist/preload.d.ts" - }, - "./preload-auto": { - "require": "./dist/preload-auto.cjs", - "default": "./dist/preload-auto.cjs" + "import": { + "types": "./dist/preload.d.mts", + "default": "./dist/preload.mjs" + }, + "require": { + "types": "./dist/preload.d.cts", + "default": "./dist/preload.cjs" + } }, + "./preload-auto": "./dist/preload-auto.cjs", "./renderer": { - "require": "./dist/renderer.cjs", - "import": "./dist/renderer.mjs", - "types": "./dist/renderer.d.ts" - } + "import": { + "types": "./dist/renderer.d.mts", + "default": "./dist/renderer.mjs" + }, + "require": { + "types": "./dist/renderer.d.cts", + "default": "./dist/renderer.cjs" + } + }, + "./package.json": "./package.json" }, "author": "Jason Nall ", "license": "MIT", "files": [ "dist", "src", - "main.d.ts", - "renderer.d.ts", "README.md" ], "scripts": { - "build": "tsc && vite build -c src/main/vite.config.ts && vite build -c src/renderer/vite.config.ts && vite build -c src/preload/vite.config.ts && vite build -c src/preload/vite-auto.config.ts && corepack pnpm build:types", - "build:types": "dts-bundle-generator --config ./dts-bundle-generator.config.ts && corepack pnpm run copy:types", - "copy:readme": "cp ../../README.md ./", - "copy:types": "cp dist/main.d.ts dist/renderer.d.ts dist/preload.d.ts ./", - "test": "vitest -c vitest.config.ts", - "test:ci": "vitest run -c vitest.config.ts --coverage", + "build": "tsdown", + "test": "vitest", + "test:ci": "vitest run --coverage", "typecheck": "tsc", - "prepublishOnly": "corepack pnpm copy:readme && corepack pnpm build", - "changeset": "changeset", - "release": "changeset publish" + "copy:readme": "cp ../../README.md ./", + "prepublishOnly": "pnpm copy:readme && pnpm build" }, "devDependencies": { - "@tanstack/react-query": "^5.32.1", "@trpc/client": "10.45.2", "@trpc/server": "10.45.2", - "@types/debug": "^4.1.12", - "@types/node": "^20.12.8", - "@vitest/coverage-v8": "^1.6.0", - "builtin-modules": "^4.0.0", - "dts-bundle-generator": "9.5.1", - "electron": "29.3.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "superjson": "^2.2.1", - "vite": "^5.2.11", - "vite-plugin-commonjs-externals": "^0.1.4", - "vitest": "^1.6.0", - "zod": "^3.23.6" + "@types/debug": "^4.1.13", + "@types/node": "^24.9.0", + "@vitest/coverage-v8": "^5.0.5", + "electron": "^45.1.0", + "superjson": "^2.2.6", + "tsdown": "0.23.3", + "typescript": "^7.0.2", + "vitest": "^5.0.5", + "zod": "^4.6.7" }, "peerDependencies": { "@trpc/client": ">10.0.0", @@ -83,6 +86,6 @@ "electron": ">19.0.0" }, "dependencies": { - "debug": "^4.3.4" + "debug": "^4.4.3" } } diff --git a/packages/electron-trpc/preload.d.ts b/packages/electron-trpc/preload.d.ts deleted file mode 100644 index 55dc9d78..00000000 --- a/packages/electron-trpc/preload.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Generated by dts-bundle-generator v9.5.1 - -export declare const exposeElectronTRPC: () => void; - -export {}; diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 6be7019d..5d321d73 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -1,6 +1,6 @@ import type { AnyRouter, inferRouterContext } from '@trpc/server'; import { ipcMain, session } from 'electron'; -import type { BrowserWindow, IpcMainEvent } from 'electron'; +import type { BrowserWindow, IpcMainEvent, WebFrameMain } from 'electron'; import { handleIPCMessage } from './handleIPCMessage'; import { CreateContextOptions } from './types'; import { ELECTRON_TRPC_CHANNEL } from '../constants'; @@ -14,9 +14,9 @@ const debug = debugFactory('electron-trpc:main:IPCHandler'); type Awaitable = T | Promise; -const getInternalId = (event: IpcMainEvent, request: ETRPCRequest) => { +const getInternalId = (event: IpcMainEvent, frame: WebFrameMain, request: ETRPCRequest) => { const messageId = request.method === 'request' ? request.operation.id : request.id; - return `${event.sender.id}-${event.senderFrame.routingId}:${messageId}`; + return `${event.sender.id}-${frame.routingId}:${messageId}`; }; class IPCHandler { @@ -35,10 +35,13 @@ class IPCHandler { windows.forEach((win) => this.attachWindow(win)); ipcMain.on(ELECTRON_TRPC_CHANNEL, (event: IpcMainEvent, request: ETRPCRequest) => { + // The sending frame has already navigated or been destroyed, so there is no one to reply to. + if (!event.senderFrame) return; + handleIPCMessage({ router, createContext, - internalId: getInternalId(event, request), + internalId: getInternalId(event, event.senderFrame, request), event, message: request, subscriptions: this.subscriptions, @@ -88,7 +91,7 @@ class IPCHandler { const webContentsId = win.webContents.id; win.webContents.on('did-start-navigation', ({ isSameDocument, frame }) => { // Check if it's a hard navigation - if (!isSameDocument) { + if (!isSameDocument && frame) { debug( 'Handling hard navigation event', `webContentsId: ${webContentsId}`, @@ -134,7 +137,7 @@ export const createIPCHandler = ({ } else { throw new Error( 'Failed to resolve electron-trpc preload script path. ' + - 'Unable to determine current module directory.' + 'Unable to determine current module directory.' ); } diff --git a/packages/electron-trpc/src/main/vite.config.ts b/packages/electron-trpc/src/main/vite.config.ts deleted file mode 100644 index a0d23e74..00000000 --- a/packages/electron-trpc/src/main/vite.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -/// -import path from 'path'; -import { defineConfig } from 'vite'; - -module.exports = defineConfig({ - base: './', - build: { - lib: { - entry: path.resolve(__dirname, './index.ts'), - name: 'electron-trpc', - formats: ['es', 'cjs'], - fileName: (format) => ({ es: 'main.mjs', cjs: 'main.cjs' })[format as 'es' | 'cjs'], - }, - outDir: path.resolve(__dirname, '../../dist'), - rollupOptions: { - external: ['electron', 'path', 'url'], - }, - }, -}); diff --git a/packages/electron-trpc/src/preload/autoPreload.ts b/packages/electron-trpc/src/preload/autoPreload.ts index 4f6f4c9a..89efd068 100644 --- a/packages/electron-trpc/src/preload/autoPreload.ts +++ b/packages/electron-trpc/src/preload/autoPreload.ts @@ -3,4 +3,4 @@ import { exposeElectronTRPC } from './exposeElectronTRPC'; // Automatically expose electronTRPC when the preload script is loaded -exposeElectronTRPC(); \ No newline at end of file +exposeElectronTRPC(); diff --git a/packages/electron-trpc/src/preload/vite-auto.config.ts b/packages/electron-trpc/src/preload/vite-auto.config.ts deleted file mode 100644 index fde233a6..00000000 --- a/packages/electron-trpc/src/preload/vite-auto.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// -import path from 'path'; -import { defineConfig } from 'vite'; - -module.exports = defineConfig({ - base: './', - build: { - emptyOutDir: false, - lib: { - entry: path.resolve(__dirname, './autoPreload.ts'), - name: 'electron-trpc-preload-auto', - formats: ['cjs'], - fileName: () => 'preload-auto.cjs', - }, - outDir: path.resolve(__dirname, '../../dist'), - rollupOptions: { - external: ['electron'], - output: { - // Force everything into a single file - inlineDynamicImports: true, - }, - }, - }, -}); \ No newline at end of file diff --git a/packages/electron-trpc/src/preload/vite.config.ts b/packages/electron-trpc/src/preload/vite.config.ts deleted file mode 100644 index 44691c4b..00000000 --- a/packages/electron-trpc/src/preload/vite.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -/// -import path from 'path'; -import { defineConfig } from 'vite'; - -module.exports = defineConfig({ - base: './', - build: { - // Importantly, `main` build runs first and empties the out dir - emptyOutDir: false, - lib: { - entry: path.resolve(__dirname, './index.ts'), - name: 'electron-trpc', - formats: ['es', 'cjs'], - fileName: (format) => ({ es: 'preload.mjs', cjs: 'preload.cjs' })[format as 'es' | 'cjs'], - }, - outDir: path.resolve(__dirname, '../../dist'), - rollupOptions: { - external: ['electron'], - }, - }, -}); diff --git a/packages/electron-trpc/src/renderer/tsconfig.json b/packages/electron-trpc/src/renderer/tsconfig.json deleted file mode 100644 index bc7054b4..00000000 --- a/packages/electron-trpc/src/renderer/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "alwaysStrict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "lib": ["dom", "es2017"], - "module": "commonjs", - "moduleResolution": "node", - "noEmit": true, - "noFallthroughCasesInSwitch": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "resolveJsonModule": true, - "strict": true, - "target": "esnext" - }, - "include": ["src/main/*.ts", "src/renderer/*.ts"], - "exclude": ["node_modules"] -} diff --git a/packages/electron-trpc/src/renderer/vite.config.ts b/packages/electron-trpc/src/renderer/vite.config.ts deleted file mode 100644 index a54b3a06..00000000 --- a/packages/electron-trpc/src/renderer/vite.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// -import path from 'path'; -import { defineConfig } from 'vite'; - -module.exports = defineConfig({ - base: './', - build: { - // Importantly, `main` build runs first and empties the out dir - emptyOutDir: false, - lib: { - entry: path.resolve(__dirname, './index.ts'), - name: 'electron-trpc', - formats: ['es', 'cjs'], - fileName: (format) => ({ es: 'renderer.mjs', cjs: 'renderer.cjs' })[format as 'es' | 'cjs'], - }, - outDir: path.resolve(__dirname, '../../dist'), - }, -}); diff --git a/packages/electron-trpc/src/types.ts b/packages/electron-trpc/src/types.ts index 3043455b..66278c90 100644 --- a/packages/electron-trpc/src/types.ts +++ b/packages/electron-trpc/src/types.ts @@ -2,8 +2,7 @@ import type { Operation } from '@trpc/client'; import type { TRPCResponseMessage } from '@trpc/server/rpc'; export type ETRPCRequest = - | { method: 'request'; operation: Operation } - | { method: 'subscription.stop'; id: number }; + { method: 'request'; operation: Operation } | { method: 'subscription.stop'; id: number }; export interface RendererGlobalElectronTRPC { sendMessage: (args: ETRPCRequest) => void; diff --git a/packages/electron-trpc/tsconfig.json b/packages/electron-trpc/tsconfig.json index ecdd4888..9334314e 100644 --- a/packages/electron-trpc/tsconfig.json +++ b/packages/electron-trpc/tsconfig.json @@ -1,20 +1,17 @@ { "compilerOptions": { - "alwaysStrict": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, "isolatedModules": true, - "lib": ["dom", "es2017"], + "lib": ["dom", "esnext"], "module": "esnext", "moduleResolution": "bundler", "noEmit": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "noUnusedParameters": true, - "resolveJsonModule": true, "strict": true, - "target": "esnext" + "target": "esnext", + "types": ["node"] }, - "include": ["src/main/*.ts", "src/preload/*.ts", "src/renderer/*.ts"], - "exclude": ["node_modules"] + "include": ["src"], + "exclude": ["src/**/__tests__"] } diff --git a/packages/electron-trpc/tsdown.config.ts b/packages/electron-trpc/tsdown.config.ts new file mode 100644 index 00000000..9b5c28ce --- /dev/null +++ b/packages/electron-trpc/tsdown.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from 'tsdown'; + +export default defineConfig([ + { + entry: { + main: 'src/main/index.ts', + preload: 'src/preload/index.ts', + renderer: 'src/renderer/index.ts', + }, + format: ['esm', 'cjs'], + platform: 'node', + dts: true, + clean: true, + }, + { + // Registered as a session preload, which may run sandboxed. Sandboxed preloads can only + // `require('electron')`, so everything else has to be bundled into this one file. + entry: { 'preload-auto': 'src/preload/autoPreload.ts' }, + format: 'cjs', + platform: 'node', + dts: false, + clean: false, + deps: { onlyImport: ['electron'] }, + }, +]); diff --git a/packages/electron-trpc/vitest.config.ts b/packages/electron-trpc/vitest.config.ts index e5fdda01..46e7d5e9 100644 --- a/packages/electron-trpc/vitest.config.ts +++ b/packages/electron-trpc/vitest.config.ts @@ -1,14 +1,10 @@ -/// -import path from 'path'; -import { defineConfig } from 'vite'; +import { defineConfig } from 'vitest/config'; -module.exports = defineConfig({ +export default defineConfig({ test: { coverage: { - all: true, include: ['src/**/*'], reporter: ['text', 'cobertura', 'html'], - reportsDirectory: path.resolve(__dirname, './coverage/'), }, }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a938a386..7e87433c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3 +1,161 @@ +--- +lockfileVersion: '9.0' + +importers: + + .: + configDependencies: {} + packageManagerDependencies: + pnpm: + specifier: 12.9.0 + version: 12.9.0 + +packages: + + '@pnpm/exe.android-arm64@12.9.0': + resolution: {integrity: sha512-/53fHFwP1mBYQjli6h3LBZsocAMjrEY6hCDiomIwdLIFbtxHrWucPg/s8ozOG3K6Qt8yEA78v7fCcNrgZKTlEQ==} + cpu: [arm64] + os: [android] + + '@pnpm/exe.android-x64@12.9.0': + resolution: {integrity: sha512-QI+Md3q3Df0WbDGpqciRw9ge0r7CGbxSlP3HcyIf34/YdZsbmUTl416oWOe3RrkZpVVVCA20f8B9esYrITpArA==} + cpu: [x64] + os: [android] + + '@pnpm/exe.darwin-arm64@12.9.0': + resolution: {integrity: sha512-mWr7fGPYJ12GuvU/q0SyJfj7X/9Eqa5dA6cc+yUUAKRdYEcqW4lQcsDd1ArfxJNSDYooz9X+UhFeVxKO9e/xDA==} + cpu: [arm64] + os: [darwin] + + '@pnpm/exe.darwin-x64@12.9.0': + resolution: {integrity: sha512-fr4ns4FyMLptdYbWqW3yc/yvbfQP7D1RBCFUJpSPr7tOzd3JxZvl+Tkvg65kEAGU5wXI6vl3eCOofumEj/n3Gw==} + cpu: [x64] + os: [darwin] + + '@pnpm/exe.freebsd-x64@12.9.0': + resolution: {integrity: sha512-4+hZPeJzSSw1oOrfUg+v4QylHv6qKhdgcCnKt9ooryE79p1Z9oyozVJ5em+g6ajbvv6jlH+epnht8/s9Cp5M3Q==} + cpu: [x64] + os: [freebsd] + + '@pnpm/exe.linux-arm64-musl@12.9.0': + resolution: {integrity: sha512-+mHQSbA6M6W71PyV0IxYu2T43lZA8rAhlw4Gy7EMlyiv8H2GWJAXtUXl2huw7tnsar2AhCRlPn/ZvUv+/mIBkA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-arm64@12.9.0': + resolution: {integrity: sha512-U1mBoG27+J/HuWYtVZOQrvbiKnTlDsDVzyroKQqHsJaTHTXi0H5Y+fU1GjUyMcNG5r/EXtbhp9iAwQt64uXTxQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-ppc64@12.9.0': + resolution: {integrity: sha512-P5bgei3i6wjlKq6s4PNg/0cvik354upY2wW3YGSfweYTABnAZP2zGzgMc0eO5SHTz934Cbya8Z0YFRdw6MfmCg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-riscv64@12.9.0': + resolution: {integrity: sha512-oNx2uOo2gVrRckEvz7V+FKeq9HOF0rKNHcCyxRRHSXEXpmP6ZMMgJ+iU/m/zfSGp6bAcC5mvAE270FhAeIeKhA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-s390x@12.9.0': + resolution: {integrity: sha512-OChHS7hOlqdBMtZqjIB1QoZGNfzLPSsvTa2kYanf3qso5Q+KgnROQ+uV4a0wRGC6sdshSA63+Ui8MCylRy6iwA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@pnpm/exe.linux-x64-musl@12.9.0': + resolution: {integrity: sha512-ubZPsDMXS+LEnPa7wZD18E+KTpOAZPt+ms/khfIROt+6Cp0A2kayQA8aIsvV7+jGZD0xoknvaGN/P3v9OisZUg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@pnpm/exe.linux-x64@12.9.0': + resolution: {integrity: sha512-ElANYUwQuMfWqMJR4m5L5h9zKjvGKcA8hi2put4J1DMx2smVaNGkGnxkgeIYgMjmF7UFxlZDcL4jItkScgsW4A==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@pnpm/exe.win32-arm64@12.9.0': + resolution: {integrity: sha512-cqnBKZg5e9fFghmYtgJLyZOAsS1EyLeDVJ0qNsjR7hcc+dq1mWRiDo0erqdj2PGoYaVogyF9WejZSJoKvlfXDw==} + cpu: [arm64] + os: [win32] + + '@pnpm/exe.win32-x64@12.9.0': + resolution: {integrity: sha512-khqst6QGgHdKs2lEmz0N75qN/EoOcEywNQlRPfBrBrq1SytHra6ro/xViueJkVvDOz9gEO8oYcXTdZeAjErjMg==} + cpu: [x64] + os: [win32] + + pnpm@12.9.0: + resolution: {integrity: sha512-j2TvoLeSmGypiuVoeRvNdyKAfidMTwwdmFPGIRZJXFhBGduYdioqU0OxaE02G5rib90W1VFmbXY1NG0/roMN3Q==} + engines: {node: '>=18.*'} + hasBin: true + +snapshots: + + '@pnpm/exe.android-arm64@12.9.0': + optional: true + + '@pnpm/exe.android-x64@12.9.0': + optional: true + + '@pnpm/exe.darwin-arm64@12.9.0': + optional: true + + '@pnpm/exe.darwin-x64@12.9.0': + optional: true + + '@pnpm/exe.freebsd-x64@12.9.0': + optional: true + + '@pnpm/exe.linux-arm64-musl@12.9.0': + optional: true + + '@pnpm/exe.linux-arm64@12.9.0': + optional: true + + '@pnpm/exe.linux-ppc64@12.9.0': + optional: true + + '@pnpm/exe.linux-riscv64@12.9.0': + optional: true + + '@pnpm/exe.linux-s390x@12.9.0': + optional: true + + '@pnpm/exe.linux-x64-musl@12.9.0': + optional: true + + '@pnpm/exe.linux-x64@12.9.0': + optional: true + + '@pnpm/exe.win32-arm64@12.9.0': + optional: true + + '@pnpm/exe.win32-x64@12.9.0': + optional: true + + pnpm@12.9.0: + optionalDependencies: + '@pnpm/exe.android-arm64': 12.9.0 + '@pnpm/exe.android-x64': 12.9.0 + '@pnpm/exe.darwin-arm64': 12.9.0 + '@pnpm/exe.darwin-x64': 12.9.0 + '@pnpm/exe.freebsd-x64': 12.9.0 + '@pnpm/exe.linux-arm64': 12.9.0 + '@pnpm/exe.linux-arm64-musl': 12.9.0 + '@pnpm/exe.linux-ppc64': 12.9.0 + '@pnpm/exe.linux-riscv64': 12.9.0 + '@pnpm/exe.linux-s390x': 12.9.0 + '@pnpm/exe.linux-x64': 12.9.0 + '@pnpm/exe.linux-x64-musl': 12.9.0 + '@pnpm/exe.win32-arm64': 12.9.0 + '@pnpm/exe.win32-x64': 12.9.0 + +--- lockfileVersion: '9.0' settings: @@ -10,31 +168,31 @@ importers: devDependencies: '@changesets/changelog-github': specifier: ^0.5.0 - version: 0.5.0 + version: 0.5.2 '@changesets/cli': specifier: ^2.27.1 - version: 2.27.1 + version: 2.31.1(@types/node@24.19.2) '@playwright/test': - specifier: ^1.43.1 - version: 1.43.1 + specifier: ^1.64.1 + version: 1.64.1 prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.9.10 + version: 3.9.10 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^7.0.2 + version: 7.0.2 examples/basic-react: dependencies: '@tanstack/react-query': specifier: ^4.29.14 - version: 4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/client': specifier: 10.33.1 version: 10.33.1(@trpc/server@10.33.1) '@trpc/react-query': specifier: 10.33.1 - version: 10.33.1(@tanstack/react-query@4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: 10.33.1 version: 10.33.1 @@ -46,44 +204,44 @@ importers: version: link:../../packages/electron-trpc react: specifier: ^18.2.0 - version: 18.2.0 + version: 18.3.1 react-dom: specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) zod: specifier: ^3.21.4 - version: 3.21.4 + version: 3.25.76 devDependencies: '@types/node': specifier: ^20.12.8 - version: 20.12.8 + version: 20.19.43 '@types/react': specifier: ^18.3.1 - version: 18.3.1 + version: 18.3.31 '@types/react-dom': specifier: ^18.3.0 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.2.11(@types/node@20.12.8)) + version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0)) vite: specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8) + version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) vite-plugin-electron: specifier: ^0.28.7 - version: 0.28.7 + version: 0.28.8 examples/basic-react-superjson: dependencies: '@tanstack/react-query': specifier: ^4.29.14 - version: 4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/client': specifier: 10.33.1 version: 10.33.1(@trpc/server@10.33.1) '@trpc/react-query': specifier: 10.33.1 - version: 10.33.1(@tanstack/react-query@4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: 10.33.1 version: 10.33.1 @@ -95,35 +253,35 @@ importers: version: link:../../packages/electron-trpc react: specifier: ^18.2.0 - version: 18.2.0 + version: 18.3.1 react-dom: specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) superjson: specifier: ^1.12.3 - version: 1.12.3 + version: 1.13.3 zod: specifier: ^3.21.4 - version: 3.21.4 + version: 3.25.76 devDependencies: '@types/node': specifier: ^20.12.8 - version: 20.12.8 + version: 20.19.43 '@types/react': specifier: ^18.3.1 - version: 18.3.1 + version: 18.3.31 '@types/react-dom': specifier: ^18.3.0 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.2.11(@types/node@20.12.8)) + version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0)) vite: specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8) + version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) vite-plugin-electron: specifier: ^0.28.7 - version: 0.28.7 + version: 0.28.8 examples/basic-vanilla-esm: dependencies: @@ -141,26 +299,26 @@ importers: version: link:../../packages/electron-trpc vite: specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8) + version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) zod: specifier: ^3.21.4 - version: 3.23.8 + version: 3.25.76 devDependencies: '@types/node': specifier: ^20.12.8 - version: 20.12.8 + version: 20.19.43 examples/manual-preload-react: dependencies: '@tanstack/react-query': specifier: ^4.29.14 - version: 4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/client': specifier: 10.33.1 version: 10.33.1(@trpc/server@10.33.1) '@trpc/react-query': specifier: 10.33.1 - version: 10.33.1(@tanstack/react-query@4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: 10.33.1 version: 10.33.1 @@ -178,36 +336,33 @@ importers: version: 18.3.1(react@18.3.1) zod: specifier: ^3.21.4 - version: 3.23.8 + version: 3.25.76 devDependencies: '@types/node': specifier: ^20.12.8 - version: 20.12.8 + version: 20.19.43 '@types/react': specifier: ^18.3.1 - version: 18.3.1 + version: 18.3.31 '@types/react-dom': specifier: ^18.3.0 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.2.11(@types/node@20.12.8)) + version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0)) vite: specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8) + version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) vite-plugin-electron: specifier: ^0.28.7 - version: 0.28.7 + version: 0.28.8 packages/electron-trpc: dependencies: debug: - specifier: ^4.3.4 - version: 4.3.4 + specifier: ^4.4.3 + version: 4.4.3 devDependencies: - '@tanstack/react-query': - specifier: ^5.32.1 - version: 5.32.1(react@18.3.1) '@trpc/client': specifier: 10.45.2 version: 10.45.2(@trpc/server@10.45.2) @@ -215,72 +370,60 @@ importers: specifier: 10.45.2 version: 10.45.2 '@types/debug': - specifier: ^4.1.12 - version: 4.1.12 + specifier: ^4.1.13 + version: 4.1.13 '@types/node': - specifier: ^20.12.8 - version: 20.12.8 + specifier: ^24.9.0 + version: 24.19.2 '@vitest/coverage-v8': - specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.12.8)) - builtin-modules: - specifier: ^4.0.0 - version: 4.0.0 - dts-bundle-generator: - specifier: 9.5.1 - version: 9.5.1 + specifier: ^5.0.5 + version: 5.0.5(vitest@5.0.5) electron: - specifier: 29.3.2 - version: 29.3.2 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^45.1.0 + version: 45.1.0 superjson: - specifier: ^2.2.1 - version: 2.2.1 - vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.8) - vite-plugin-commonjs-externals: - specifier: ^0.1.4 - version: 0.1.4(vite@5.2.11(@types/node@20.12.8)) + specifier: ^2.2.6 + version: 2.2.6 + tsdown: + specifier: 0.23.3 + version: 0.23.3(typescript@7.0.2) + typescript: + specifier: ^7.0.2 + version: 7.0.2 vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.8) + specifier: ^5.0.5 + version: 5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) zod: - specifier: ^3.23.6 - version: 3.23.6 + specifier: ^4.6.7 + version: 4.6.7 www: dependencies: '@astrojs/check': specifier: ^0.7.0 - version: 0.7.0(prettier@3.2.5)(typescript@5.4.5) + version: 0.7.0(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@5.9.3) '@astrojs/starlight': specifier: ^0.23.2 - version: 0.23.2(astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5)) + version: 0.23.4(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)) astro: specifier: ^4.8.6 - version: 4.9.2(@types/node@20.12.8)(typescript@5.4.5) + version: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) sharp: specifier: ^0.32.5 version: 0.32.6 typescript: specifier: ^5.4.5 - version: 5.4.5 + version: 5.9.3 devDependencies: wrangler: specifier: ^3.58.0 - version: 3.58.0 + version: 3.114.17 packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@astrojs/astro2tsx@0.1.3': + resolution: {integrity: sha512-GMDC7Eo0myBUA/QLBl0u+OcegJ8LiBhccmNZR34KmprQNP8gQUJlWlOOZWUsxNA2rNS6GuPYcGDyLoPnjmn4/Q==} + engines: {node: ^20.19.0 || >=22.12.0} '@astrojs/check@0.7.0': resolution: {integrity: sha512-UTqwOeKNu9IYZmJXEeWnQuTdSd/pX58Hl4TUARsMlT97SVDL//kLBE4T/ctxRz6J573N87oE5ddtW/uOOnQTug==} @@ -288,14 +431,14 @@ packages: peerDependencies: typescript: ^5.0.0 - '@astrojs/compiler@2.8.0': - resolution: {integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==} + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} - '@astrojs/internal-helpers@0.4.0': - resolution: {integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==} + '@astrojs/internal-helpers@0.4.1': + resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} - '@astrojs/language-server@2.10.0': - resolution: {integrity: sha512-crHXpqYfA5qWioiuZnZFpTsNItgBlF1f0S9MzDYS7/pfCALkHNJ7K3w9U/j0uMKymsT4hC7BfMaX0DYlfdSzHg==} + '@astrojs/language-server@2.17.3': + resolution: {integrity: sha512-QIAFu1e/4quJMTPdmBOm+ZPXc5NDGZE4/YQjgR3EgjhGLl/tdidaWJDr5WmO2lesVc+BW1qN/xNBURmuePDG2A==} hasBin: true peerDependencies: prettier: ^3.0.0 @@ -306,11 +449,11 @@ packages: prettier-plugin-astro: optional: true - '@astrojs/markdown-remark@5.1.0': - resolution: {integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==} + '@astrojs/markdown-remark@5.3.0': + resolution: {integrity: sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==} - '@astrojs/mdx@3.0.1': - resolution: {integrity: sha512-UcPja14Qt6OEm7Wjak41Qa5f7G1M0oB2ARCsyIkXy6+Z65fJ6c1648UqEOqnEgR6Xtqq+V47wtK2qSP6KQKrAg==} + '@astrojs/mdx@3.1.9': + resolution: {integrity: sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} peerDependencies: astro: ^4.8.0 @@ -319,11 +462,11 @@ packages: resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@astrojs/sitemap@3.1.5': - resolution: {integrity: sha512-GLdzJ01387Uzb8RKYpsYLlg/GzoPnGbmDeQNkarSE11i2+l9Qp8Nj/WoTEy9nkTS25fxxy0kxDfJmreeVleCqg==} + '@astrojs/sitemap@3.7.4': + resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==} - '@astrojs/starlight@0.23.2': - resolution: {integrity: sha512-j8odYR744qCilip9s0UXNzDQ66uu1klD24zRI5Aqzxoj01eVnAsEgDPC8rU/gDTvydKWhF5diBRC1QVDN5JIYw==} + '@astrojs/starlight@0.23.4': + resolution: {integrity: sha512-EHsjFfnvv+m2bHGJCwFoCLrbW1kfCPnHaPIbqCTMW+NWU8xO/bwtz6MgK6ant5wqjf0DqUkwHY6Esn72kmc9jQ==} peerDependencies: astro: ^4.8.6 @@ -331,240 +474,216 @@ packages: resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.24.5': - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} - engines: {node: '>=6.9.0'} + '@astrojs/yaml2ts@0.2.4': + resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==} - '@babel/generator@7.24.5': - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.6': - resolution: {integrity: sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.6': - resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.24.5': - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.5': - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.24.6': - resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.5': - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-string-parser@7.29.11': + resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.24.5': - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.6': - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + '@babel/helpers@7.29.10': + resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.5': - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.6': - resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.24.5': - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.5': - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.24.5': - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.29.11': + resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.24.6': - resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.5': - resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.1': - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.24.6': - resolution: {integrity: sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==} + '@babel/plugin-transform-react-jsx@7.29.7': + resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.24.5': - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/runtime@7.29.10': + resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.5': - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.5': - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/traverse@7.29.10': + resolution: {integrity: sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.6': - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + '@babel/types@7.29.11': + resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} - '@changesets/apply-release-plan@7.0.0': - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} - '@changesets/assemble-release-plan@6.0.0': - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/changelog-github@0.5.0': - resolution: {integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==} + '@changesets/changelog-github@0.5.2': + resolution: {integrity: sha512-HeGeDl8HaIGj9fQHo/tv5XKQ2SNEi9+9yl1Bss1jttPqeiASRXhfi0A2wv8yFKCp07kR1gpOI5ge6+CWNm1jPw==} - '@changesets/cli@2.27.1': - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + '@changesets/cli@2.31.1': + resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} hasBin: true - '@changesets/config@3.0.0': - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.0.0': - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} - '@changesets/get-github-info@0.6.0': - resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + '@changesets/get-github-info@0.7.0': + resolution: {integrity: sha512-+i67Bmhfj9V4KfDeS1+Tz3iF32btKZB2AAx+cYMqDSRFP7r3/ZdGbjCo+c6qkyViN9ygDuBjzageuPGJtKGe5A==} - '@changesets/get-release-plan@4.0.0': - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.0': - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/logger@0.1.0': - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/pre@2.0.0': - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} - '@changesets/read@0.6.0': - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.0': - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@cloudflare/kv-asset-handler@0.3.2': - resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} + '@cloudflare/kv-asset-handler@0.3.4': + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} - '@cloudflare/workerd-darwin-64@1.20240524.0': - resolution: {integrity: sha512-ATaXjefbTsrv4mpn4Fdua114RRDXcX5Ky+Mv+f4JTUllgalmqC4CYMN4jxRz9IpJU/fNMN8IEfvUyuJBAcl9Iw==} + '@cloudflare/unenv-preset@2.0.2': + resolution: {integrity: sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==} + peerDependencies: + unenv: 2.0.0-rc.14 + workerd: ^1.20250124.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20250718.0': + resolution: {integrity: sha512-FHf4t7zbVN8yyXgQ/r/GqLPaYZSGUVzeR7RnL28Mwj2djyw2ZergvytVc7fdGcczl6PQh+VKGfZCfUqpJlbi9g==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20240524.0': - resolution: {integrity: sha512-wnbsZI4CS0QPCd+wnBHQ40C28A/2Qo4ESi1YhE2735G3UNcc876MWksZhsubd+XH0XPIra6eNFqyw6wRMpQOXA==} + '@cloudflare/workerd-darwin-arm64@1.20250718.0': + resolution: {integrity: sha512-fUiyUJYyqqp4NqJ0YgGtp4WJh/II/YZsUnEb6vVy5Oeas8lUOxnN+ZOJ8N/6/5LQCVAtYCChRiIrBbfhTn5Z8Q==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20240524.0': - resolution: {integrity: sha512-E8mj+HPBryKwaJAiNsYzXtVjKCL0KvUBZbtxJxlWM4mLSQhT+uwGT3nydb/hFY59rZnQgZslw0oqEWht5TEYiQ==} + '@cloudflare/workerd-linux-64@1.20250718.0': + resolution: {integrity: sha512-5+eb3rtJMiEwp08Kryqzzu8d1rUcK+gdE442auo5eniMpT170Dz0QxBrqkg2Z48SFUPYbj+6uknuA5tzdRSUSg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20240524.0': - resolution: {integrity: sha512-/Fr1W671t2triNCDCBWdStxngnbUfZunZ/2e4kaMLzJDJLYDtYdmvOUCBDzUD4ssqmIMbn9RCQQ0U+CLEoqBqw==} + '@cloudflare/workerd-linux-arm64@1.20250718.0': + resolution: {integrity: sha512-Aa2M/DVBEBQDdATMbn217zCSFKE+ud/teS+fFS+OQqKABLn0azO2qq6ANAHYOIE6Q3Sq4CxDIQr8lGdaJHwUog==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20240524.0': - resolution: {integrity: sha512-G+ThDEx57g9mAEKqhWnHaaJgpeGYtyhkmwM/BDpLqPks/rAY5YEfZbY4YL1pNk1kkcZDXGrwIsY8xe9Apf5JdA==} + '@cloudflare/workerd-windows-64@1.20250718.0': + resolution: {integrity: sha512-dY16RXKffmugnc67LTbyjdDHZn5NoTF1yHEf2fN4+OaOnoGSp3N1x77QubTDwqZ9zECWxgQfDLjddcH8dWeFhg==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -573,22 +692,30 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@ctrl/tinycolor@4.1.0': - resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} + '@ctrl/tinycolor@4.2.2': + resolution: {integrity: sha512-9rQHijqB2Rq6qOEC/xHaA6aPlsKGi5kmCQW50O1asn9g63XFeD5NmBwysriistW5Xx0JPafyD/TA7yk2S3pXGQ==} engines: {node: '>=14'} - '@electron/get@2.0.2': - resolution: {integrity: sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==} + '@electron-internal/extract-zip@1.0.7': + resolution: {integrity: sha512-+ZdkmRVBonPJwpZBFQr9y4pY8DP6lgbm+Pj5pQzSFrnDGiBAi3Pee1jivAsgK61Ct4W8SGUHVtl7FNbm5c6rgg==} + engines: {node: '>=22.12.0'} + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} + '@electron/get@5.1.0': + resolution: {integrity: sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==} + engines: {node: '>=22.12.0'} + '@emmetio/abbreviation@2.3.3': resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} '@emmetio/css-abbreviation@2.1.8': resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} - '@emmetio/css-parser@0.4.0': - resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} '@emmetio/html-matcher@1.3.0': resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} @@ -602,8 +729,14 @@ packages: '@emmetio/stream-reader@2.2.0': resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} '@esbuild-plugins/node-globals-polyfill@0.2.3': resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} @@ -615,14 +748,8 @@ packages: peerDependencies: esbuild: '*' - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.21.4': - resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -633,14 +760,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.21.4': - resolution: {integrity: sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -651,14 +772,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.21.4': - resolution: {integrity: sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -669,14 +784,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.21.4': - resolution: {integrity: sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -687,14 +796,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.21.4': - resolution: {integrity: sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -705,14 +808,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.4': - resolution: {integrity: sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -723,14 +820,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.21.4': - resolution: {integrity: sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -741,14 +832,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.4': - resolution: {integrity: sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -759,14 +844,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.21.4': - resolution: {integrity: sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -777,14 +856,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.21.4': - resolution: {integrity: sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -795,14 +868,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.21.4': - resolution: {integrity: sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -813,14 +880,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.21.4': - resolution: {integrity: sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -831,14 +892,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.21.4': - resolution: {integrity: sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -849,14 +904,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.21.4': - resolution: {integrity: sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -867,14 +916,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.4': - resolution: {integrity: sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -885,14 +928,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.21.4': - resolution: {integrity: sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -903,14 +940,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.21.4': - resolution: {integrity: sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -921,14 +952,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.21.4': - resolution: {integrity: sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -939,14 +964,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.21.4': - resolution: {integrity: sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -957,14 +976,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.21.4': - resolution: {integrity: sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -975,14 +988,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.21.4': - resolution: {integrity: sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -993,14 +1000,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.21.4': - resolution: {integrity: sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1011,175 +1012,169 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.21.4': - resolution: {integrity: sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@expressive-code/core@0.35.3': - resolution: {integrity: sha512-SYamcarAjufYhbuK/kfvJSvAXLsfnM7DKc78R7Dq4B73R5bKQK2m5zR0l57tXr4yp2C5Z8lu5xZncdwWxcmPdg==} + '@expressive-code/core@0.35.6': + resolution: {integrity: sha512-xGqCkmfkgT7lr/rvmfnYdDSeTdCSp1otAHgoFS6wNEeO7wGDPpxdosVqYiIcQ8CfWUABh/pGqWG90q+MV3824A==} - '@expressive-code/plugin-frames@0.35.3': - resolution: {integrity: sha512-QYytMq6IsaHgTofQ5b6d+CnbxkqLdikSF2hC+IL/ZZwPYHYZoUlmjIwmJZhY4/hHqJGELrtZsyVdlt06RntgmA==} + '@expressive-code/plugin-frames@0.35.6': + resolution: {integrity: sha512-CqjSWjDJ3wabMJZfL9ZAzH5UAGKg7KWsf1TBzr4xvUbZvWoBtLA/TboBML0U1Ls8h/4TRCIvR4VEb8dv5+QG3w==} - '@expressive-code/plugin-shiki@0.35.3': - resolution: {integrity: sha512-aFQBPepv0zhVXqJFAvfQ4vXYv/meJKiqmEEKSxdjAfwXllIV49PDlnGEXmbGYjR4hUQQjbfDgzAbrbfePc3YVQ==} + '@expressive-code/plugin-shiki@0.35.6': + resolution: {integrity: sha512-xm+hzi9BsmhkDUGuyAWIydOAWer7Cs9cj8FM0t4HXaQ+qCubprT6wJZSKUxuvFJIUsIOqk1xXFaJzGJGnWtKMg==} - '@expressive-code/plugin-text-markers@0.35.3': - resolution: {integrity: sha512-gDdnQrfDRXw5Y+PKHJDkpAUdf2pthYOthGcgy3JB8GOTQ3EL1h+755Ct/bGc4MR6jn+dgnQP47uHMWQaccvN6Q==} + '@expressive-code/plugin-text-markers@0.35.6': + resolution: {integrity: sha512-/k9eWVZSCs+uEKHR++22Uu6eIbHWEciVHbIuD8frT8DlqTtHYaaiwHPncO6KFWnGDz5i/gL7oyl6XmOi/E6GVg==} '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@img/sharp-darwin-arm64@0.33.4': - resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@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} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.4': - resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.2': - resolution: {integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==} - engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.2': - resolution: {integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==} - engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.2': - resolution: {integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-arm@1.0.2': - resolution: {integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.0.2': - resolution: {integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==} - engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-x64@1.0.2': - resolution: {integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==} - engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': - resolution: {integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.0.2': - resolution: {integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==} - engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] - '@img/sharp-linux-arm64@0.33.4': - resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-linux-arm@0.33.4': - resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] - '@img/sharp-linux-s390x@0.33.4': - resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} - engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-linux-x64@0.33.4': - resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.33.4': - resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-linuxmusl-x64@0.33.4': - resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] - '@img/sharp-wasm32@0.33.4': - resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.4': - resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.4': - resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@istanbuljs/schema@0.1.3': - 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} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': - resolution: {integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -1190,8 +1185,22 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mdx-js/mdx@3.0.1': - resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/wasm-runtime@1.2.4': + resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1205,124 +1214,327 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pagefind/darwin-arm64@1.1.0': - resolution: {integrity: sha512-SLsXNLtSilGZjvqis8sX42fBWsWAVkcDh1oerxwqbac84HbiwxpxOC2jm8hRwcR0Z55HPZPWO77XeRix/8GwTg==} + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@oxc-project/types@0.155.0': + resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} + + '@pagefind/darwin-arm64@1.5.2': + resolution: {integrity: sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==} cpu: [arm64] os: [darwin] - '@pagefind/darwin-x64@1.1.0': - resolution: {integrity: sha512-QjQSE/L5oS1C8N8GdljGaWtjCBMgMtfrPAoiCmINTu9Y9dp0ggAyXvF8K7Qg3VyIMYJ6v8vg2PN7Z3b+AaAqUA==} + '@pagefind/darwin-x64@1.5.2': + resolution: {integrity: sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==} cpu: [x64] os: [darwin] - '@pagefind/default-ui@1.1.0': - resolution: {integrity: sha512-+XiAJAK++C64nQcD7s3Prdmd5S92lT05fwjOxm0L1jj80jbL+tmvcqkkFnPpoqhnicIPgcAX/Y5W0HRZnBt35w==} + '@pagefind/default-ui@1.5.2': + resolution: {integrity: sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg==} + + '@pagefind/freebsd-x64@1.5.2': + resolution: {integrity: sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==} + cpu: [x64] + os: [freebsd] - '@pagefind/linux-arm64@1.1.0': - resolution: {integrity: sha512-8zjYCa2BtNEL7KnXtysPtBELCyv5DSQ4yHeK/nsEq6w4ToAMTBl0K06khqxdSGgjMSwwrxvLzq3so0LC5Q14dA==} + '@pagefind/linux-arm64@1.5.2': + resolution: {integrity: sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==} cpu: [arm64] os: [linux] - '@pagefind/linux-x64@1.1.0': - resolution: {integrity: sha512-4lsg6VB7A6PWTwaP8oSmXV4O9H0IHX7AlwTDcfyT+YJo/sPXOVjqycD5cdBgqNLfUk8B9bkWcTDCRmJbHrKeCw==} + '@pagefind/linux-x64@1.5.2': + resolution: {integrity: sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==} cpu: [x64] os: [linux] - '@pagefind/windows-x64@1.1.0': - resolution: {integrity: sha512-OboCM76BcMKT9IoSfZuFhiqMRgTde8x4qDDvKulFmycgiJrlL5WnIqBHJLQxZq+o2KyZpoHF97iwsGAm8c32sQ==} + '@pagefind/windows-arm64@1.5.2': + resolution: {integrity: sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==} + cpu: [arm64] + os: [win32] + + '@pagefind/windows-x64@1.5.2': + resolution: {integrity: sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==} cpu: [x64] os: [win32] - '@playwright/test@1.43.1': - resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} - engines: {node: '>=16'} + '@playwright/test@1.64.1': + resolution: {integrity: sha512-IaYGml/nSOiZWROfPtuIL7neuu9qDOZ3TNvNljUIrhDMxiGTgPjzj/g9p9RxpS2tSepPDRY+UwAaEeiKtUvIAg==} + engines: {node: '>=20'} hasBin: true - '@rollup/rollup-android-arm-eabi@4.17.2': - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + '@quansync/fs@1.1.0': + resolution: {integrity: sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==} + + '@rolldown/binding-android-arm-eabi@1.2.15': + resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.17.2': - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + '@rolldown/binding-android-arm64@1.2.15': + resolution: {integrity: sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.17.2': - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + '@rolldown/binding-darwin-arm64@1.2.15': + resolution: {integrity: sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.17.2': - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + '@rolldown/binding-darwin-x64@1.2.15': + resolution: {integrity: sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} - cpu: [arm] - os: [linux] + '@rolldown/binding-freebsd-x64@1.2.15': + resolution: {integrity: sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] - '@rollup/rollup-linux-arm-musleabihf@4.17.2': - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + resolution: {integrity: sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.17.2': - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + '@rolldown/binding-linux-arm64-gnu@1.2.15': + resolution: {integrity: sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.17.2': - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + '@rolldown/binding-linux-arm64-musl@1.2.15': + resolution: {integrity: sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + resolution: {integrity: sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.17.2': - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} - cpu: [riscv64] + '@rolldown/binding-linux-s390x-gnu@1.2.15': + resolution: {integrity: sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.15': + resolution: {integrity: sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.15': + resolution: {integrity: sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.15': + resolution: {integrity: sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.15': + resolution: {integrity: sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.15': + resolution: {integrity: sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/pluginutils@5.5.1': + resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==} + 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.66.0': + resolution: {integrity: sha512-7y4XeoUHPecjfUDRmap8U0q6bjfLAPn7uOGT8BKyqy8uNDOjsGS8rlBhOx6sZLVwwjN6hapvGl2mW9/IS6UNww==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.66.0': + resolution: {integrity: sha512-e8WugYZXpgqrlMXLCudYVRAxAcK7AIY36JxRDwFRD38L9q62G1VsEUW6ijXxzjxYjNB8i1zo3B/ycIQ/qjLC/Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.66.0': + resolution: {integrity: sha512-6vkDCfyDjNLokh+Rt1D2KtNgFFMEPdkWha/mbtP4cSjh9xiN8T/JBS/A7nDYKjmMAXHrvR9J3AzUk2LtFbIBLg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.66.0': + resolution: {integrity: sha512-/mzZAX0+Q6eXxvkR0HB0RZCCrsbmFD8DpsvCQoMYABDfq/DjqkbfytuJ7GvZ4AhR/Mgis2fXbZrGqfbcK2Z5fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.66.0': + resolution: {integrity: sha512-JQJx9E8tUjGqed1RevDmoHaS3V30ODdV8uyvGxlwd4K5se6bkPrMeltSybqAtpJ+ltDRfo7FORQaJG2Hd5nGog==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.66.0': + resolution: {integrity: sha512-GEaUQQjMaG7X1304qMgqLjzCKv6CdDirzJSS+UqUs3xhJ9X2Kjzu0JDbLoUU42FWxwmZqz+SsgU1SlQv9GNRVA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.66.0': + resolution: {integrity: sha512-DgmAU9N0NhDQDzHgFUocDio7zRO8jR/nY/obDGvCR8zbJ6J77Fg6X49yPuExJUpYPbC82EOaRhG969pWzUSnHQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.66.0': + resolution: {integrity: sha512-zG09YZ+sk/HoHq+P9gYB0EseQ3M20RbDuKGWey6fbiMDV1LxfXvhgSW9jDaCcvFPMgfLXpimzXY+UYvA8R2mLQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.66.0': + resolution: {integrity: sha512-vlArhgyXbcVc1D4WZPoiYuqJIaMiSHBj6etRXua0KlfjlZeuiQyVAPYi0/N49O4mSp3u1iGUBLEjNa8ec81XZg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.66.0': + resolution: {integrity: sha512-RxJZtk0G87YPotDaRDvRqStV8cbqLSC5TroHvQHHKsqBg0ok64RxKgtXeFsa7FBcy7mb4crBrG3xK8USWIqWNA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.66.0': + resolution: {integrity: sha512-qlGcw959PrLLkZhiBxF3OZ6SQvj+OKY85mCqGNgSRs4LZlDJ6ICqmz6UdxtINdhcXYwNIbZoapQVBAmZlD2hUQ==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.66.0': + resolution: {integrity: sha512-TvTI/7Cy0WvRA1SXgwzu6bwXBnMpmeT/ln5q7WvSpqmXy1VbmEnY8HVIDQNBiaHJvoWqRr0M4FNo7qiqtyMaFw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.66.0': + resolution: {integrity: sha512-UZEDkSoDRZ50NyLj70nO6mpIK3dvs2cPTTvQb1bA/PBDmr9fvn5KiESuGfh6srd7Zi6Lt9Sv2sVrFr1QoHLvPQ==} + cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.17.2': - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + '@rollup/rollup-linux-ppc64-musl@4.66.0': + resolution: {integrity: sha512-VRbxTvagLh3HRcysx1CNq+HHcvJbSebNI6fCbk7jwmmWHkXjrSIV3igXBpRHUTFdg0pagWGu50xoSZXnrZHjVQ==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.66.0': + resolution: {integrity: sha512-uWdJpvYqh0LE/i+YBL3sMX0a2kUkICENjmrPmyBmMOFc3jMrs6MSQH/pMD+VIpGEoUcr3XkHGLLfymzIqPSRRg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.66.0': + resolution: {integrity: sha512-3FUd88pxgWAjK60OgCrika1AcNG+u8zaCdWjg4TlcZTDkt5TGyci8ZU64l3OJ9ax0MEjw3P80B/3PoSQDCLwJQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.66.0': + resolution: {integrity: sha512-qT2rMmgyej62g5AdwktK+Bt2lBu497pzWZe12TTQ5JmZjOYPnEwcPEAOSLTBxBV+6gIES75rXm219v/QkT397A==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.17.2': - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + '@rollup/rollup-linux-x64-gnu@4.66.0': + resolution: {integrity: sha512-E46rnZgp7J84Qwe8RMlF+rgimnDo/9fuiGbUArGB0ZkMWf97O7yeSCfKls5x/YJOF0RcuSe9RctuKe1hlxICiA==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.17.2': - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + '@rollup/rollup-linux-x64-musl@4.66.0': + resolution: {integrity: sha512-Uz1HiZe+qBzqgdPsON+z0wRx3WdATuyzwvGT6cr2VZVrqqko0ZJVfkrQJtwDMuDcAfXYdo7XucaxJ7lTLjEcgg==} cpu: [x64] os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.66.0': + resolution: {integrity: sha512-Ph7TX3Ex5qdfcb7Tc6eEPugVkRfJ501eTovO4T5029YObfpZ7dzn3RiwpFvGp50nk2QUhvBMZ0PFGlEj6pOYTg==} + cpu: [x64] + os: [openbsd] - '@rollup/rollup-win32-arm64-msvc@4.17.2': - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + '@rollup/rollup-openharmony-arm64@4.66.0': + resolution: {integrity: sha512-nZYPEya7ZkeNxUEiF7qmNZbyLTyRN3MK5cO22KqsaoneUzXJuzBIQRw+7BEQy9LGj2O5vrCE9V3EpK06FYo1tQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.66.0': + resolution: {integrity: sha512-u7aTfS3R6C4hRsqXSzaO6qLZYLVuMkHMvcWlux4IM8IJif1VCl2cgPBSo5gSNoFoStQypQP+qwq8W1IyFBf1QQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.17.2': - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + '@rollup/rollup-win32-ia32-msvc@4.66.0': + resolution: {integrity: sha512-e+i9ueHrH1Bafb0cf0woAIVJbYcoC8vRaD+vz+Xi8w6jz9cYJSV3vyKO6ELGSZ6g4W4MJOm2WPLN4/nQf77h7w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.17.2': - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + '@rollup/rollup-win32-x64-gnu@4.66.0': + resolution: {integrity: sha512-KfTCbrtr2zXTqH2E1F+uYlFTrYibxHKqPAHobpd8Kfg49cEHmuHebOidCTDRgqG1suaPFX7oejFQeGE71zWKfA==} cpu: [x64] os: [win32] - '@shikijs/core@1.6.1': - resolution: {integrity: sha512-CqYyepN4SnBopaoXYwng4NO8riB5ask/LTCkhOFq+GNGtr2X+aKeD767eYdqYukeixEUvv4bXdyTYVaogj7KBw==} + '@rollup/rollup-win32-x64-msvc@4.66.0': + resolution: {integrity: sha512-xA+neBh1bqkqaS3b48T2UHZnDsTIpb9B0h+TdBzynjF/ymCpYndhfY10RqW0qSKB1HqqQA83mINVhAdwA+mETg==} + cpu: [x64] + os: [win32] - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@shikijs/core@1.29.2': + resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + + '@shikijs/engine-javascript@1.29.2': + resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} + + '@shikijs/engine-oniguruma@1.29.2': + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + + '@shikijs/langs@1.29.2': + resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + + '@shikijs/themes@1.29.2': + resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + + '@shikijs/types@1.29.2': + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + + '@shikijs/vscode-textmate@10.1.0': + resolution: {integrity: sha512-cVBuhDQjBZaNMTwBquYfPydrUP+E3hE6oYGasx8h6ZrODIM7/r+gxLDXdd66oszbrggZHEntdE6j+5gYIVyMWQ==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -1332,17 +1544,14 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tanstack/query-core@4.29.14': - resolution: {integrity: sha512-ElEAahtLWA7Y7c2Haw10KdEf2tx+XZl/Z8dmyWxZehxWK3TPL5qtXtb7kUEhvt/8u2cSP62fLxgh2qqzMMGnDQ==} + '@tanstack/query-core@4.44.0': + resolution: {integrity: sha512-swSgb7OiPRR3UuIL7NuDrZNSMGmQD+wdtHxPD7j60SvBEnxbXurl5XOirtGEX2gm2hbK6mC8kMV1I+uO3l0UOw==} - '@tanstack/query-core@5.32.1': - resolution: {integrity: sha512-mCWa1wdGb1jiny4+qYegbSeadcFj+Nq65KFSs4A1DRveoIq7SrTwUhqu7hrB6d54cQH5x59DfJvxusn3w1Cj/g==} - - '@tanstack/react-query@4.29.14': - resolution: {integrity: sha512-wh4bd/QIy85YgTDBtj/7/9ZkpRX41QdZuUL8xKoSzuMCukXvAE1/oJ4p0F15lqQq9W3g2pgcbr2Aa+CNvqABhg==} + '@tanstack/react-query@4.44.0': + resolution: {integrity: sha512-RuIqHYrS98LrK/8kJJOJMMSQ/BCpojwsXDh7p0fBmp38ZOz6dlk+uyFRRusH+V+t3POoCsDOQ2zhomEYOeReXw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-native: '*' peerDependenciesMeta: react-dom: @@ -1350,11 +1559,6 @@ packages: react-native: optional: true - '@tanstack/react-query@5.32.1': - resolution: {integrity: sha512-+nXLMB0JK0XwTJ+lQt49DPNLrbSppni9N5W5yMR085yW3YaRKRUFhfVTER3TvQd1UycHpoGPFnt1gHiijXERAg==} - peerDependencies: - react: ^18.0.0 - '@trpc/client@10.33.1': resolution: {integrity: sha512-j1YKBl/VtjCK3nUQFacsouGpsk/DFVNiekp4sZf8Lryb6f1OIChlLJZNEipl+DUuHxsPVuaCQis4PGkrIb2ieg==} peerDependencies: @@ -1380,41 +1584,47 @@ packages: '@trpc/server@10.45.2': resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} - '@types/http-cache-semantics@4.0.1': - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -1422,123 +1632,319 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/nlcst@1.0.4': - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - - '@types/node@20.12.8': - resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/node@24.19.2': + resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} - '@types/responselike@1.0.0': - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] - '@vitejs/plugin-react@4.2.1': - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@5.0.5': + resolution: {integrity: sha512-4KpkGdIrSqBihx/JyP/e+S+IKB98etg1XDQiLAxksLfcShnwi1VReGeOT9NI43hLHbknosKp/1CCLn9Zgcs8mg==} peerDependencies: - vitest: 1.6.0 + '@vitest/browser': 5.0.5 + vitest: 5.0.5 + peerDependenciesMeta: + '@vitest/browser': + optional: true - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/istanbul-lib-coverage@1.0.2': + resolution: {integrity: sha512-9J/JMwOf9AoJhAywhrn7ScKTL38hsWQP/qPG60OtaAFcQ5OXPwKsxZFlbnuCKmZ61m8/lGgHYnFpdyQZUvG/iA==} + engines: {node: '>=22'} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/istanbul-lib-report@1.0.2': + resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} + engines: {node: '>=22'} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/mocker@5.0.5': + resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} + peerDependencies: + msw: ^2.4.9 || ^3.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/spy@5.0.5': + resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@volar/kit@2.4.30': + resolution: {integrity: sha512-VocLtumfXnqnPQEWc9Yx7uC1uOh9gyjVNlrn2+6Zx/z9aM6yTLhPK8lSqM9Ilu81XRa48I00lcYJWLi2BLxx8Q==} + peerDependencies: + typescript: <7 - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@volar/language-core@2.4.30': + resolution: {integrity: sha512-73fjwEV8wat6aOZ6U/y/hqtE30ocrIWECg67b0txGczOMNw+MffLmvJ5fnFfN9drVUEYZzLdaNo6VAy6G6avMw==} - '@volar/kit@2.2.5': - resolution: {integrity: sha512-Bmn0UCaT43xUGGRwcmFG9lKhiCCLjRT4ScSLLPn5C9ltUcSGnIFFDlbZZa1PreHYHq25/4zkXt9Ap32klAh17w==} + '@volar/language-server@2.4.30': + resolution: {integrity: sha512-tcP9fzzUBbsLIFHhgnRU4ncQjMn9G9Vax0ffkQmdCrXVEYqRroUepmyC5AVgiju5bCiLD6a55qen5iOTQHkb3g==} peerDependencies: - typescript: '*' + typescript: <7 + peerDependenciesMeta: + typescript: + optional: true - '@volar/language-core@2.2.5': - resolution: {integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==} + '@volar/language-service@2.4.30': + resolution: {integrity: sha512-w/xDsASiqC71ggCOm7sTDXDNk/l72XEptodeRC68tgZ0e5QM4hM3zAqBGC7mBctvhrpYwKfMG+t9xcUo2hEFtA==} + peerDependencies: + typescript: <7 + peerDependenciesMeta: + typescript: + optional: true - '@volar/language-server@2.2.5': - resolution: {integrity: sha512-PV/jkUkI+m72HTXwnY7hsGqLY3VNi96ZRoWFRzVC9QG/853bixxjveXPJIiydMJ9I739lO3kcj3hnGrF5Sm+HA==} + '@volar/source-map@2.4.30': + resolution: {integrity: sha512-zym1ob/KwDDyN+0jGVtxwbxJSRRnUvv5HspCtz3yEfVVdCG4/dzxJktMGPAgemqRuVs81O0o/y0q3qOUErR8kg==} - '@volar/language-service@2.2.5': - resolution: {integrity: sha512-a97e/0uCe+uSu23F4zvgvldqJtZe6jugQeEHWjTfhgOEO8+Be0t5CZNNVItQqmPyAsD8eElg0S/cP6uxvCmCSQ==} + '@volar/typescript@2.4.30': + resolution: {integrity: sha512-/DgA5tgYFPfrLFuSjIMXMGHk1LQv2+P8eny6+BhGNzFJELWIW7UZlc56ZLIRFhLsPpMfIFxM8/HvOPBggrjTZg==} + peerDependencies: + typescript: <7 + peerDependenciesMeta: + typescript: + optional: true - '@volar/snapshot-document@2.2.5': - resolution: {integrity: sha512-MTOvWVKxM7ugKO3Amffkv2pND03fe2JtfygYaputqjVFML7YxtTXj8SPnI2pODLeSwOKzDYL6Q8r5j6Y5AgUzQ==} + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} - '@volar/source-map@2.2.5': - resolution: {integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==} + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - '@volar/typescript@2.2.5': - resolution: {integrity: sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==} + '@yuku-core/binding-android-arm64@0.19.0': + resolution: {integrity: sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==} + cpu: [arm64] + os: [android] - '@vscode/emmet-helper@2.9.3': - resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} + '@yuku-core/binding-darwin-arm64@0.19.0': + resolution: {integrity: sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==} + cpu: [arm64] + os: [darwin] - '@vscode/l10n@0.0.16': - resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==} + '@yuku-core/binding-darwin-x64@0.19.0': + resolution: {integrity: sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==} + cpu: [x64] + os: [darwin] - '@vscode/l10n@0.0.18': - resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@yuku-core/binding-freebsd-x64@0.19.0': + resolution: {integrity: sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==} + cpu: [x64] + os: [freebsd] + + '@yuku-core/binding-linux-arm-gnu@0.19.0': + resolution: {integrity: sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-core/binding-linux-arm-musl@0.19.0': + resolution: {integrity: sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + resolution: {integrity: sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-core/binding-linux-arm64-musl@0.19.0': + resolution: {integrity: sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-core/binding-linux-x64-gnu@0.19.0': + resolution: {integrity: sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-core/binding-linux-x64-musl@0.19.0': + resolution: {integrity: sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-core/binding-win32-arm64@0.19.0': + resolution: {integrity: sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==} + cpu: [arm64] + os: [win32] + + '@yuku-core/binding-win32-x64@0.19.0': + resolution: {integrity: sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.19.0': + resolution: {integrity: sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1549,11 +1955,32 @@ packages: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-i18n@4.2.0: + resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==} + peerDependencies: + ajv: ^8.0.0-beta.0 + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -1565,24 +1992,16 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: 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==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} anymatch@3.1.3: @@ -1598,11 +2017,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} array-iterate@2.0.1: @@ -1612,68 +2028,81 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@1.0.7: + resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - astro-expressive-code@0.35.3: - resolution: {integrity: sha512-f1L1m3J3EzZHDEox6TXmuKo5fTSbaNxE/HU0S0UQmvlCowtOKnU/LOsoDwsbQSYGKz+fdLRPsCjFMiKqEoyfcw==} + astro-expressive-code@0.35.6: + resolution: {integrity: sha512-1U4KrvFuodaCV3z4I1bIR16SdhQlPkolGsYTtiANxPZUVv/KitGSCTjzksrkPonn1XuwVqvnwmUUVzTLWngnBA==} peerDependencies: astro: ^4.0.0-beta || ^3.3.0 - astro@4.9.2: - resolution: {integrity: sha512-apzpRoISk6L8g99m3zKIW5SYxw2GhOju/1Gq0Ccf3SH+X2UcFXF+MTdxPOFl5yJUQg7X0qsVQDOIVf8zHRRKFg==} + astro@4.16.19: + resolution: {integrity: sha512-baeSswPC5ZYvhGDoj25L2FuzKRWMgx105FetOPQVJFMCAp0o08OonYC7AhwsFdhvp7GapqjnC1Fe3lKb2lupYw==} engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} hasBin: true - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - axobject-query@4.0.0: - resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} - - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + b4a@1.9.0: + resolution: {integrity: sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - bare-events@2.3.1: - resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} + bare-events@2.9.2: + resolution: {integrity: sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true - bare-fs@2.3.0: - resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} + bare-fs@4.8.4: + resolution: {integrity: sha512-MPC2eyrpbk3A873sK4y6rk+Iv4o2enxTjHZ8zH3HO0mjrpm5XjnguY2XmfidIsDV6vnjpbMBKUAJpV0ISD2SsQ==} + engines: {bare: '>=1.28.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true - bare-os@2.3.0: - resolution: {integrity: sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==} + bare-path@3.1.2: + resolution: {integrity: sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + bare-stream@2.13.4: + resolution: {integrity: sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true - bare-stream@1.0.0: - resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} + bare-url@2.5.5: + resolution: {integrity: sha512-iM9qJCruvpt2rPaLsrumVDru9pogI7PHziHIa9kTNRFt8C8HuSa+kI9kFezK+NvHEFnnz71rKGZ1EAilq/3V/Q==} base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} @@ -1681,11 +2110,16 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.11.34: + resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==} + engines: {node: '>=6.0.0'} + hasBin: true + bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - bcp-47@2.1.0: - resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bcp-47@2.1.2: + resolution: {integrity: sha512-wsv86UuNFuPnVieKLyECTT+CP1WSAHeoIg5P3xu2kA9Z+7fVPoKt7dxzSeEhtJel0AI+NW3fIW3KtTKQKUCngg==} better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -1706,23 +2140,18 @@ packages: boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.29.5: + resolution: {integrity: sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1732,13 +2161,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builtin-modules@4.0.0: - resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} - engines: {node: '>=18.20'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + cac@7.1.0: + resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} + engines: {node: '>=20.19.0'} cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -1748,45 +2173,22 @@ packages: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - - caniuse-lite@1.0.30001615: - resolution: {integrity: sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} - capnp-ts@0.7.0: - resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + caniuse-lite@1.0.30001819: + resolution: {integrity: sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} + engines: {node: '>=18'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} character-entities-html4@2.1.0: @@ -1801,11 +2203,8 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1814,29 +2213,22 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1844,10 +2236,6 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1855,16 +2243,10 @@ packages: collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1881,78 +2263,44 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + copy-anything@4.1.5: + resolution: {integrity: sha512-vePst2VLTSqPglW7Q98VwFpGiGpOHTyXIo81MO5VyLecA5zMbZw/P/V1vmwD1jksa2iJpn/YkDrJ3XhTfzUyhQ==} + engines: {node: '>=18'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-selector-parser@3.0.5: - resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - - csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - - csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - - csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1960,32 +2308,17 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -1994,14 +2327,13 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2010,8 +2342,8 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node@2.1.0: @@ -2021,18 +2353,14 @@ packages: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} - devalue@5.0.0: - resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} + devalue@5.9.4: + resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -2050,112 +2378,104 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} - dset@3.1.3: - resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} - dts-bundle-generator@9.5.1: - resolution: {integrity: sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA==} - engines: {node: '>=14.0.0'} - hasBin: true - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true - electron-to-chromium@1.4.756: - resolution: {integrity: sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==} + electron-to-chromium@1.5.467: + resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==} electron@29.3.2: resolution: {integrity: sha512-pRWsaFtbd78kEHR0lg5aMhZDY6b5JykIEhZRtyTCaJpGFObB2NFIJDzR7mTia0cZp3pPq60n/SS4gRxvSM5WFQ==} engines: {node: '>= 12.20.55'} hasBin: true - emmet@2.4.7: - resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} + electron@45.1.0: + resolution: {integrity: sha512-i7qKVAh/KR5v1pf56NhGGX2QYHcdjvLgS7koL6ui50c+zUDGLRunR95nXcTpHPURKOQ4GDBG8BmXiDgOQ8DD0A==} + engines: {node: '>= 22.12.0'} + hasBin: true + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} + engines: {node: '>=14'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.2: - resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.21.4: - resolution: {integrity: sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2178,6 +2498,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-util-scope@1.0.1: + resolution: {integrity: sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA==} + estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} @@ -2187,15 +2510,17 @@ packages: estree-walker@0.6.1: resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} @@ -2205,8 +2530,15 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expressive-code@0.35.3: - resolution: {integrity: sha512-XjWWUCxS4uQjPoRM98R7SNWWIYlFEaOeHm1piWv+c7coHCekuWno81thsc3g/UJ+DajNtOEsIQIAAcsBQZ8LMg==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + expressive-code@0.35.6: + resolution: {integrity: sha512-+mx+TPTbMqgo0mL92Xh9QgjW0kSQIsEivMgEcOnaqKqL7qCw8Vkqc5Rg/di7ZYw4aMUSr74VTc+w8GQWu05j1g==} + + exsolve@1.2.0: + resolution: {integrity: sha512-h1pQPR9XoeSMdntRNCjyTznaume4UpfXrULBnlkZ2CUM/G5eSa+pBByGldO5uR8dxbPC+OuJXsPPNf+JZ81ADg==} extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -2218,40 +2550,51 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} hasBin: true + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fast-uri@3.1.9: + resolution: {integrity: sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==} + + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} @@ -2259,9 +2602,6 @@ packages: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -2273,32 +2613,11 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2307,20 +2626,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} - 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-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} @@ -2328,13 +2637,9 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -2349,21 +2654,10 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} - globals@11.12.0: - 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'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -2372,8 +2666,9 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} @@ -2382,105 +2677,66 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - 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'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-format@1.1.0: + resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} hast-util-has-property@3.0.0: resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - hast-util-is-body-ok-link@3.0.0: - resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} hast-util-phrasing@3.0.1: resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - hast-util-raw@9.0.3: - resolution: {integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==} + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - hast-util-select@6.0.2: - resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} - hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} - hast-util-to-html@9.0.1: - resolution: {integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-to-text@4.0.3: + resolution: {integrity: sha512-5yrlWOvGFs6CqHriUpSsNrjzT/Tdo+IOQudbznxOn8K5qblp18MJyzOg8IgDOKQ8MYgQcJA7SusuCjSpDr8mSA==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -2488,14 +2744,11 @@ packages: hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - hastscript@9.0.0: - resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} @@ -2503,43 +2756,37 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - html-whitespace-sensitive-tag-names@3.0.0: - resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} + html-whitespace-sensitive-tag-names@3.0.1: + resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + human-id@4.2.2: + resolution: {integrity: sha512-Z+8unD6em/MJwyrkWQ2M3wygRGI1+MztbutiNwk1DCuEPXOZRWGjtcMPZYP1exY9iNZMhd7ZOSMQSo9WYtiQRw==} + hasBin: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + import-without-cache@0.4.1: + resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} + engines: {node: ^22.18.0 || >=24.0.0} inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2547,15 +2794,8 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - inline-style-parser@0.2.3: - resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2563,46 +2803,13 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - 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-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} 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-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -2639,126 +2846,65 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - 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'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - 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-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-stream@3.0.0: - 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-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} - is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-what@4.1.15: - resolution: {integrity: sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@5.0.4: - resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -2771,43 +2917,109 @@ packages: jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - keyv@4.5.2: - resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -2822,50 +3034,34 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - 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'} - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + magic-string@1.4.5: + resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} @@ -2874,23 +3070,23 @@ packages: mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} - mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + mdast-util-directive@3.1.1: + resolution: {integrity: sha512-Gqpa3MHorXYEZ0VfbroyvBlVKUfz371V6mIERqOYMcb0W1D3LwmFq1ZW4O2TDrbn+4ZmGLwMWeFRJgYZ+bc5fQ==} - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-find-and-replace@3.0.4: + resolution: {integrity: sha512-z4B5c6jrnJ1ltOQemhWYPBSAo6y42Z8Gt2yEgfgNTMcLSU59B8bfj8Z8AnAlJrBGLnqkdAUZ7jdDEqQw3KuipQ==} - mdast-util-from-markdown@2.0.1: - resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.1.0: + resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==} - mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + mdast-util-gfm-strikethrough@2.0.1: + resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==} mdast-util-gfm-table@2.0.0: resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} @@ -2898,14 +3094,14 @@ packages: mdast-util-gfm-task-list-item@2.0.0: resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - mdast-util-mdx-jsx@3.1.2: - resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} mdast-util-mdx@3.0.0: resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} @@ -2916,58 +3112,51 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.2.1: + resolution: {integrity: sha512-ThatlCBxG2GE+mljhNSfZPv56d3QrGiRh97jjYgIk80IzS4uU6d7cHAaexCYSAmUCCcOs3grJ07kX3oTGsFUOw==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.4: + resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==} - micromark-extension-directive@3.0.0: - resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} - micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + micromark-extension-gfm-table@2.1.2: + resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==} micromark-extension-gfm-tagfilter@2.0.0: resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - micromark-extension-mdx-jsx@3.0.0: - resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} micromark-extension-mdx-md@2.0.0: resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} @@ -2978,74 +3167,77 @@ packages: micromark-extension-mdxjs@3.0.0: resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-mdx-expression@2.0.1: - resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.1.0: + resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==} - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-edit-map@1.0.0: + resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==} - micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark-util-types@2.0.3: + resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromark@4.0.3: + resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime@3.0.0: @@ -3053,13 +3245,9 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} @@ -3069,41 +3257,27 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - miniflare@3.20240524.1: - resolution: {integrity: sha512-5d3pRxvd5pT7lX1SsBH9+AjXuyHJnChSNOnYhubfi7pxMek4ZfULwhnUmNUp1R7b2xKuzqdFDZa0fsZuUoFxlw==} + miniflare@3.20250718.3: + resolution: {integrity: sha512-JuPrDJhwLrNLEJiNLWO7ZzJrv/Vv9kZuwMYCfv0LskQDM6Eonw4OvywO3CH/wCGjgHzha/qyjUh8JQ068TjDgQ==} engines: {node: '>=16.13'} hasBin: true - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -3112,22 +3286,23 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - node-abi@3.63.0: - resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} + node-abi@3.101.0: + resolution: {integrity: sha512-bkb/RkuWCE64eWu1PCh3Fu2pGc9mKRs+kOE+FU2bGHRYlQa86/D321DSATV54AsCQMKz3/xSt9sRgraZTpqdhQ==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -3142,15 +3317,9 @@ packages: encoding: optional: true - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + node-releases@2.0.60: + resolution: {integrity: sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==} + engines: {node: '>=18'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -3160,46 +3329,34 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - not@0.1.0: - resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} - ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -3215,57 +3372,45 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - p-queue@8.0.1: - resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} engines: {node: '>=18'} - p-timeout@6.1.2: - resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pagefind@1.1.0: - resolution: {integrity: sha512-1nmj0/vfYcMxNEQj0YDRp6bTVv9hI7HLdPhK/vBBYlrnwjATndQvHyicj5Y7pUHrpCFZpFnLVQXIF829tpFmaw==} - hasBin: true - - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + pagefind@1.5.2: + resolution: {integrity: sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==} + hasBin: true - parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -3274,47 +3419,34 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -3323,65 +3455,55 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} - - playwright-core@1.43.1: - resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} - engines: {node: '>=16'} + playwright-core@1.64.1: + resolution: {integrity: sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==} + engines: {node: '>=20'} hasBin: true - playwright@1.43.1: - resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} - engines: {node: '>=16'} + playwright@1.64.1: + resolution: {integrity: sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==} + engines: {node: '>=20'} hasBin: true - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.5: + resolution: {integrity: sha512-TEHFzb5KRDKaOgJ4TYE+0jyJtFbjLvkdVOu0fZ2b6MTWzoqZd4Le+61aEppWkvTlYePgOX4ATL1wsAIPMLTw6Q==} engines: {node: '>=4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.32: + resolution: {integrity: sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true - preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + preferred-pm@4.1.1: + resolution: {integrity: sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==} + engines: {node: '>=18.12'} prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.9.10: + resolution: {integrity: sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==} engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} progress@2.0.3: @@ -3395,21 +3517,20 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} @@ -3419,39 +3540,19 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 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'} - - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -3464,64 +3565,75 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} - rehype-expressive-code@0.35.3: - resolution: {integrity: sha512-kj43Rg+WzYUs8RRr6XyBr60pnrIZEgbmn9yJoV6qka1UDpcx7r8icn6Q2uSAgaLtlEUy+HCPgQJraOZrA53LOQ==} + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - rehype-format@5.0.0: - resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} + regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} - rehype-minify-whitespace@6.0.0: - resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - rehype-parse@9.0.0: - resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + + rehype-expressive-code@0.35.6: + resolution: {integrity: sha512-pPdE+pRcRw01kxMOwHQjuRxgwlblZt5+wAc3w2aPGgmcnn57wYjn07iKO7zaznDxYVxMYVvYlnL+R3vWFQS4Gw==} + + rehype-format@5.0.1: + resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - rehype-stringify@10.0.0: - resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - rehype@13.0.1: - resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} - remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-mdx@3.0.1: - resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - remark-smartypants@2.1.0: - resolution: {integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - remark-smartypants@3.0.1: - resolution: {integrity: sha512-qyshfCl2eLO0i0558e79ZJsfojC5wjnYLByjt0FmjJQN6aYwcRxpoj784LZJSoWCdnA2ubh5rLNGb8Uur/wDng==} + remark-smartypants@3.0.3: + resolution: {integrity: sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==} engines: {node: '>=16.0.0'} remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + request-light@0.7.0: resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} @@ -3529,8 +3641,9 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -3539,53 +3652,63 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} - retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} - - retext-smartypants@6.1.0: - resolution: {integrity: sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==} - - retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} retext-stringify@4.0.0: resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} - retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} - retext@9.0.0: resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} roarr@2.15.4: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} + rolldown-plugin-dts@0.28.8: + resolution: {integrity: sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} + peerDependencies: + '@typescript/native-preview': '*' + '@volar/typescript': ~2.4.0 + '@vue/language-core': ~3.2.0 || ~3.3.0 + rolldown: ^1.2.0 + typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 + vue-tsc: ~3.2.0 || ~3.3.0 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + '@volar/typescript': + optional: true + '@vue/language-core': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.2.15: + resolution: {integrity: sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-inject@3.0.2: resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. @@ -3596,33 +3719,23 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + rollup@4.66.0: + resolution: {integrity: sha512-Onq6/qO4ARhxIs+jYiHE0pYehadLyMECAiGEqQ+0/aWND3+2PmifJIIqBLYtuBODqHTlOUEQFtIVPyCy0Lck7A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -3631,32 +3744,15 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -3664,53 +3760,24 @@ packages: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} - sharp@0.33.4: - resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} - engines: {libvips: '>=8.15.2', 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'} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.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'} - shiki@1.6.1: - resolution: {integrity: sha512-1Pu/A1rtsG6HZvQm4W0NExQ45e02og+rPog7PDaFDiMumZgOYnZIu4JtGQeAIfMwdbKSjJQoCUr79vDLKUUxWA==} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + shiki@1.29.2: + resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -3722,37 +3789,32 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - sitemap@7.1.2: - resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} + sitemap@9.0.1: + resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==} + engines: {node: '>=20.19.5', npm: '>=10.8.2'} hasBin: true slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -3761,35 +3823,20 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.2: - resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stacktracey@2.2.0: + resolution: {integrity: sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==} - stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} @@ -3799,38 +3846,17 @@ packages: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} - stream-replace-string@2.0.0: - resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} - - stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - - streamx@2.18.0: - resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + streamx@2.28.1: + resolution: {integrity: sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3841,8 +3867,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-bom-string@1.0.0: @@ -3853,93 +3879,69 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - - style-to-object@1.0.6: - resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} - superjson@1.12.3: - resolution: {integrity: sha512-0j+U70KUtP8+roVPbwfqkyQI7lBt7ETnuA7KXbTDX3mCKiD/4fXs2ldKSMdt0MCfpTwiMxo20yFU3vu6ewETpQ==} + superjson@1.13.3: + resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} engines: {node: '>=10'} - superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} engines: {node: '>=16'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-fs@3.1.3: + resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.2.2: + resolution: {integrity: sha512-+8NeqHRjQWH9nYlwo2gamAMImZCVzI4UoEgDpWorBt9OEfppiZn+uSkskzQKPWIZyji/C8fpWO7u69G0DX0tbg==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-decoder@1.1.0: - resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@6.2.2: + resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} + engines: {node: '>=20.0.0'} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} + engines: {node: '>=14.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -3948,19 +3950,20 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - tsconfck@3.1.0: - resolution: {integrity: sha512-CMjc5zMnyAjcS9sPLytrbFmj89st2g+JYtY/c02ug4Q+CZaAtCgbyviI0n1YvjZE/pzoc6FbNsINS13DOL1B9w==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -3968,97 +3971,98 @@ packages: typescript: optional: true - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} + tsdown@0.23.3: + resolution: {integrity: sha512-yAju1F5b7GDEPCLl4ewM3g54lq0NyyYpFnK2lh/ax7/uznmsn4wBOS9/49pI3cGvxtj2LoOjBUtzaT17UEQkhQ==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.23.3 + '@tsdown/exe': 0.23.3 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 + unplugin-unused: '>=0.5.0' + unrun: '*' + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + tsx: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} typesafe-path@0.2.2: resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} - typescript-auto-import-cache@0.3.2: - resolution: {integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==} + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} - unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + undici@7.30.1: + resolution: {integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==} + engines: {node: '>=20.18.1'} - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unenv@2.0.0-rc.14: + resolution: {integrity: sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} unist-util-modify-children@4.0.0: resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} @@ -4072,137 +4076,172 @@ packages: unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} - unist-util-visit-children@3.0.0: resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.1.0: + resolution: {integrity: sha512-vKXxz6O38sKDj1mtx/k2cWvkkFBuYGx6uGrlzBkVeWCRF/F8sdI0j3Wbkz/5rVNRRuVc8UrgRdbCxNhmYXgP3w==} - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.2.0: + resolution: {integrity: sha512-fpsYs/VVoZxfGY9/j3FQpZmN8wdLJaV1Pt38AaJNZu9uKIHcFU3halCdBveEq1HGKO1OEfJY65w1zvoFV1b3qQ==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - update-browserslist-db@1.0.14: - resolution: {integrity: sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==} + update-browserslist-db@1.3.4: + resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + use-sync-external-store@1.7.0: + resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} + engines: {node: '>=18.12.0'} - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vite-plugin-electron@0.28.8: + resolution: {integrity: sha512-ir+B21oSGK9j23OEvt4EXyco9xDCaF6OGFe0V/8Zc0yL2+HMyQ6mmNQEIhXsEsZCSfIowBpwQBeHH4wVsfraeg==} + peerDependencies: + vite-plugin-electron-renderer: '*' + peerDependenciesMeta: + vite-plugin-electron-renderer: + optional: true - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - - vite-plugin-commonjs-externals@0.1.4: - resolution: {integrity: sha512-mJ5KzL8F3RqyFh8IhEBfRK6cDY+HXz7HXIDht5c9W+DOKbLpk57CX1LOwnG/Lx3v++ywIcMt51yRuezATV8kaQ==} peerDependencies: - vite: ^4.3.9 || ^5.0.0 - - vite-plugin-electron@0.28.7: - resolution: {integrity: sha512-wsiFUY9AN/HBwn6Jc+i7ehNQISAzUzy6p7NvgJJB1jKCNvZ7PyYlZloH0m3LWFkC+/dFDRGwW89kyAafRRPsLA==} - peerDependencies: - vite-plugin-electron-renderer: '*' + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 peerDependenciesMeta: - vite-plugin-electron-renderer: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: optional: true - vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@8.3.5: + resolution: {integrity: sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 || ^0.8.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true - less: + '@vitejs/devtools': optional: true - lightningcss: + esbuild: + optional: true + jiti: + optional: true + less: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitefu@0.2.5: - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: vite: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@5.0.5: + resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.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 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.5 + '@vitest/browser-preview': 5.0.5 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.5 + '@vitest/coverage-v8': 5.0.5 + '@vitest/ui': 5.0.5 happy-dom: '*' jsdom: '*' + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -4211,34 +4250,34 @@ packages: jsdom: optional: true - volar-service-css@0.0.45: - resolution: {integrity: sha512-f+AlUI1+kESbcZSVaNJVAnK0c/9Da5StoxzPqA5/8VqUHJWNdubWNnwG5xpFVTfgh6pgTcey3UBhBfHytFaIOg==} + volar-service-css@0.0.71: + resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==} peerDependencies: - '@volar/language-service': ~2.2.3 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-emmet@0.0.45: - resolution: {integrity: sha512-9nLXSDkR1vA/3fQkFEsSXAu3XovQxOpTkVG2jilQgfek/K1ZLkaA/WMhN/TtmPmQg4NxE9Ni6mA5udBQ5gVXIA==} + volar-service-emmet@0.0.71: + resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==} peerDependencies: - '@volar/language-service': ~2.2.3 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-html@0.0.45: - resolution: {integrity: sha512-tLTJqfy1v5C4nmeAsfekFIKPl4r4qDMyL0L9MWywr/EApZzPCsbeUGxCqdzxSMC2q7PMCfX2i167txDo+J0LVA==} + volar-service-html@0.0.71: + resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==} peerDependencies: - '@volar/language-service': ~2.2.3 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-prettier@0.0.45: - resolution: {integrity: sha512-+mBS2EsDgp/kunKEBnHvhBwIQm5v2ahw4NKpKdg4sTpXy3UxqHt+Fq/wRYQ7Z8LlNVNRVfp75ThjM+w2zaZBAw==} + volar-service-prettier@0.0.71: + resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==} peerDependencies: - '@volar/language-service': ~2.2.3 + '@volar/language-service': ~2.4.0 prettier: ^2.2 || ^3.0 peerDependenciesMeta: '@volar/language-service': @@ -4246,27 +4285,49 @@ packages: prettier: optional: true - volar-service-typescript-twoslash-queries@0.0.45: - resolution: {integrity: sha512-KrPUUvKggZgV9mrDpstCzmf20irgv0ooMv+FGDzIIQUkya+d2+nSS8Mx2h9FvsYgLccUVw5jU3Rhwhd3pv/7qg==} + volar-service-typescript-twoslash-queries@0.0.71: + resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==} + peerDependencies: + '@volar/language-service': ~2.4.0 + typescript: '*' + peerDependenciesMeta: + '@volar/language-service': + optional: true + typescript: + optional: true + + volar-service-typescript@0.0.71: + resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==} peerDependencies: - '@volar/language-service': ~2.2.3 + '@volar/language-service': ~2.4.0 + typescript: '*' peerDependenciesMeta: '@volar/language-service': optional: true + typescript: + optional: true - volar-service-typescript@0.0.45: - resolution: {integrity: sha512-i/mMIIAMastJ2kgPo3qvX0Rrl7NyxhIYZ0ug/B4ambZcLPI1vzBgS2fmvyWX3jhBYHh8NmbAotFj+0Y9JtN47A==} + volar-service-yaml@0.0.71: + resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==} peerDependencies: - '@volar/language-service': ~2.2.3 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true - vscode-css-languageservice@6.2.14: - resolution: {integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==} + vscode-css-languageservice@6.3.10: + resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==} + + vscode-html-languageservice@5.6.2: + resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==} - vscode-html-languageservice@5.2.0: - resolution: {integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==} + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@10.0.0: + resolution: {integrity: sha512-USSfxg0vDIpTQqlQBGxF3mBARyoS8cU7LHLpbYNh6dOJt32dlskxPWB0Irrh5TllTmyf7oNLAvqDqzklbwwnpA==} + engines: {node: '>=14.17.0'} vscode-jsonrpc@8.2.0: resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} @@ -4275,12 +4336,18 @@ packages: vscode-languageserver-protocol@3.17.5: resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + vscode-languageserver-protocol@3.18.5: + resolution: {integrity: sha512-FW4fBMzZ99N8xeob4py0l050wgCoRgTpEq5Xcsb9lM1bc29UKGR/wSV+4knaqFxssFHajy7OzNiKP/m3U1ZEuA==} + + vscode-languageserver-textdocument@1.0.16: + resolution: {integrity: sha512-qeNEuOi9a3qkqRf7Gfez2WL2VwlBTLCNekHBGO9kxPVUp9XuY15yfTJ9jwvOwKI0I2MhUUfZq95NSp+LK1CLQg==} vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver-types@3.18.5: + resolution: {integrity: sha512-kPd6+JQNz3HMJvjKlqUxERSlZHAntl/aGpsk7ImwIh0ewDKDcjgAEyVSYciPiOJD3ftbK9IrfiqUeTZLSbCizw==} + vscode-languageserver@9.0.1: resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} hasBin: true @@ -4288,14 +4355,8 @@ packages: vscode-nls@5.2.0: resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - vscode-uri@2.1.2: - resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==} - - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + vscode-uri@3.2.0: + resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -4306,78 +4367,56 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-pm-runs@1.1.0: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - - which-pm@2.2.0: - resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} - engines: {node: '>=8.15'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which-pm@3.0.1: + resolution: {integrity: sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==} + engines: {node: '>=18.12'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} hasBin: true - widest-line@4.0.1: - 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'} - workerd@1.20240524.0: - resolution: {integrity: sha512-LWLe5D8PVHBcqturmBbwgI71r7YPpIMYZoVEH6S4G35EqIJ55cb0n3FipoSyraoIfpcCxCFxX1K6WsRHbP3pFA==} + workerd@1.20250718.0: + resolution: {integrity: sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==} engines: {node: '>=16'} hasBin: true - wrangler@3.58.0: - resolution: {integrity: sha512-h9gWER7LXLnmHABDNP1p3aqXtchlvSBN8Dp22ZurnkxaLMZ3L3H1Ze1ftiFSs0VRWv0BUnz7AWIUqZmzuBY4Nw==} + wrangler@3.114.17: + resolution: {integrity: sha512-tAvf7ly+tB+zwwrmjsCyJ2pJnnc7SZhbnNwXbH+OIdVas3zTSmjcZOjmLKcGGptssAA3RyTKhcF9BvKZzMUycA==} engines: {node: '>=16.17.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20240524.0 + '@cloudflare/workers-types': ^4.20250408.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4388,395 +4427,375 @@ packages: utf-8-validate: optional: true - xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml-language-server@1.23.0: + resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==} + hasBin: true + + yaml@2.8.3: + resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + engines: {node: '>= 14.6'} + hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - youch@3.3.3: - resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + youch@3.3.4: + resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} - zod-to-json-schema@3.23.0: - resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==} + yuku-ast@0.19.0: + resolution: {integrity: sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==} + engines: {node: '>=14.18.0'} + + yuku-codegen@0.19.0: + resolution: {integrity: sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==} + engines: {node: '>=14.18.0'} + + yuku-core@0.19.0: + resolution: {integrity: sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==} + engines: {node: '>=14.18.0'} + + yuku-parser@0.19.0: + resolution: {integrity: sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==} + engines: {node: '>=14.18.0'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} peerDependencies: - zod: ^3.23.3 + zod: ^3.25.28 || ^4 - zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - zod@3.23.6: - resolution: {integrity: sha512-RTHJlZhsRbuA8Hmp/iNL7jnfc4nZishjsanDAfEY1QpDQZCahUp3xDzl+zfweE9BklxMUcgBgS1b7Lvie/ZVwA==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@ampproject/remapping@2.3.0': + '@astrojs/astro2tsx@0.1.3(@emnapi/runtime@1.11.3)': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@emnapi/core': 1.11.3 + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + transitivePeerDependencies: + - '@emnapi/runtime' - '@astrojs/check@0.7.0(prettier@3.2.5)(typescript@5.4.5)': + '@astrojs/check@0.7.0(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.10.0(prettier@3.2.5)(typescript@5.4.5) + '@astrojs/language-server': 2.17.3(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@5.9.3) chokidar: 3.6.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 kleur: 4.1.5 - typescript: 5.4.5 - yargs: 17.7.2 + typescript: 5.9.3 + yargs: 17.7.3 transitivePeerDependencies: + - '@emnapi/runtime' - prettier - prettier-plugin-astro - '@astrojs/compiler@2.8.0': {} - - '@astrojs/internal-helpers@0.4.0': {} - - '@astrojs/language-server@2.10.0(prettier@3.2.5)(typescript@5.4.5)': - dependencies: - '@astrojs/compiler': 2.8.0 - '@jridgewell/sourcemap-codec': 1.4.15 - '@volar/kit': 2.2.5(typescript@5.4.5) - '@volar/language-core': 2.2.5 - '@volar/language-server': 2.2.5 - '@volar/language-service': 2.2.5 - '@volar/typescript': 2.2.5 - fast-glob: 3.3.2 - volar-service-css: 0.0.45(@volar/language-service@2.2.5) - volar-service-emmet: 0.0.45(@volar/language-service@2.2.5) - volar-service-html: 0.0.45(@volar/language-service@2.2.5) - volar-service-prettier: 0.0.45(@volar/language-service@2.2.5)(prettier@3.2.5) - volar-service-typescript: 0.0.45(@volar/language-service@2.2.5) - volar-service-typescript-twoslash-queries: 0.0.45(@volar/language-service@2.2.5) - vscode-html-languageservice: 5.2.0 - vscode-uri: 3.0.8 + '@astrojs/compiler@2.13.1': {} + + '@astrojs/internal-helpers@0.4.1': {} + + '@astrojs/language-server@2.17.3(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@5.9.3)': + dependencies: + '@astrojs/astro2tsx': 0.1.3(@emnapi/runtime@1.11.3) + '@astrojs/yaml2ts': 0.2.4 + '@volar/kit': 2.4.30(typescript@5.9.3) + '@volar/language-core': 2.4.30 + '@volar/language-server': 2.4.30(typescript@5.9.3) + '@volar/language-service': 2.4.30(typescript@5.9.3) + muggle-string: 0.4.1 + tinyglobby: 0.2.17 + volar-service-css: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)) + volar-service-emmet: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)) + volar-service-html: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)) + volar-service-prettier: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3))(prettier@3.9.10) + volar-service-typescript: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3))(typescript@5.9.3) + volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3))(typescript@5.9.3) + volar-service-yaml: 0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)) + vscode-html-languageservice: 5.6.2 + vscode-uri: 3.2.0 optionalDependencies: - prettier: 3.2.5 + prettier: 3.9.10 transitivePeerDependencies: + - '@emnapi/runtime' - typescript - '@astrojs/markdown-remark@5.1.0': + '@astrojs/markdown-remark@5.3.0': dependencies: '@astrojs/prism': 3.1.0 github-slugger: 2.0.0 - hast-util-from-html: 2.0.1 - hast-util-to-text: 4.0.2 - import-meta-resolve: 4.1.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.3 + import-meta-resolve: 4.2.0 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 remark-parse: 11.0.0 - remark-rehype: 11.1.0 - remark-smartypants: 2.1.0 - shiki: 1.6.1 - unified: 11.0.4 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.3 + shiki: 1.29.2 + unified: 11.0.5 unist-util-remove-position: 5.0.0 - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.1 + unist-util-visit: 5.2.0 + unist-util-visit-parents: 6.1.0 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.0.1(astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5))': + '@astrojs/mdx@3.1.9(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3))': dependencies: - '@astrojs/markdown-remark': 5.1.0 - '@mdx-js/mdx': 3.0.1 - acorn: 8.11.3 - astro: 4.9.2(@types/node@20.12.8)(typescript@5.4.5) - es-module-lexer: 1.5.2 + '@astrojs/markdown-remark': 5.3.0 + '@mdx-js/mdx': 3.1.1 + acorn: 8.19.0 + astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) + es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 - github-slugger: 2.0.0 gray-matter: 4.0.3 - hast-util-to-html: 9.0.1 + hast-util-to-html: 9.0.5 kleur: 4.1.5 rehype-raw: 7.0.0 - remark-gfm: 4.0.0 - remark-smartypants: 3.0.1 - source-map: 0.7.4 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.3 + source-map: 0.7.6 + unist-util-visit: 5.2.0 + vfile: 6.0.3 transitivePeerDependencies: - supports-color '@astrojs/prism@3.1.0': dependencies: - prismjs: 1.29.0 + prismjs: 1.30.0 - '@astrojs/sitemap@3.1.5': + '@astrojs/sitemap@3.7.4': dependencies: - sitemap: 7.1.2 - stream-replace-string: 2.0.0 - zod: 3.23.8 + sitemap: 9.0.1 + zod: 4.6.7 - '@astrojs/starlight@0.23.2(astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5))': + '@astrojs/starlight@0.23.4(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3))': dependencies: - '@astrojs/mdx': 3.0.1(astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5)) - '@astrojs/sitemap': 3.1.5 - '@pagefind/default-ui': 1.1.0 - '@types/hast': 3.0.4 + '@astrojs/mdx': 3.1.9(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)) + '@astrojs/sitemap': 3.7.4 + '@pagefind/default-ui': 1.5.2 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - astro: 4.9.2(@types/node@20.12.8)(typescript@5.4.5) - astro-expressive-code: 0.35.3(astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5)) - bcp-47: 2.1.0 - hast-util-from-html: 2.0.1 - hast-util-select: 6.0.2 - hast-util-to-string: 3.0.0 + astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) + astro-expressive-code: 0.35.6(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)) + bcp-47: 2.1.2 + hast-util-from-html: 2.0.3 + hast-util-select: 6.0.4 + hast-util-to-string: 3.0.1 hastscript: 8.0.0 - mdast-util-directive: 3.0.0 - mdast-util-to-markdown: 2.1.0 - pagefind: 1.1.0 - rehype: 13.0.1 - rehype-format: 5.0.0 - remark-directive: 3.0.0 - unified: 11.0.4 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + mdast-util-directive: 3.1.1 + mdast-util-to-markdown: 2.2.1 + pagefind: 1.5.2 + rehype: 13.0.2 + rehype-format: 5.0.1 + remark-directive: 3.0.1 + unified: 11.0.5 + unist-util-visit: 5.2.0 + vfile: 6.0.3 transitivePeerDependencies: - supports-color '@astrojs/telemetry@3.1.0': dependencies: - ci-info: 4.0.0 - debug: 4.3.4 + ci-info: 4.4.0 + debug: 4.4.3 dlv: 1.1.3 - dset: 3.1.3 + dset: 3.1.4 is-docker: 3.0.0 - is-wsl: 3.1.0 + is-wsl: 3.1.1 which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color - '@babel/code-frame@7.24.2': + '@astrojs/yaml2ts@0.2.4': dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.0 + yaml: 2.9.1 - '@babel/compat-data@7.24.4': {} - - '@babel/core@7.24.5': + '@babel/code-frame@7.29.7': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.10 + '@babel/parser': 7.29.11 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.10 + '@babel/types': 7.29.11 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.5': + '@babel/generator@7.29.8': dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.24.6': + '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.29.11 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.29.5 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-module-imports@7.24.3': - dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-module-imports@7.24.6': - dependencies: - '@babel/types': 7.24.6 - - '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - - '@babel/helper-plugin-utils@7.24.5': {} - - '@babel/helper-plugin-utils@7.24.6': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-simple-access@7.24.5': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/types': 7.24.5 + '@babel/traverse': 7.29.10 + '@babel/types': 7.29.11 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.24.5': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/types': 7.24.5 - - '@babel/helper-string-parser@7.24.1': {} - - '@babel/helper-string-parser@7.24.6': {} + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.10 + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-identifier@7.24.5': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-validator-identifier@7.24.6': {} + '@babel/helper-string-parser@7.29.11': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helpers@7.24.5': - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option@7.29.7': {} - '@babel/highlight@7.24.5': + '@babel/helpers@7.29.10': dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.11 - '@babel/parser@7.24.5': + '@babel/parser@7.29.11': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.29.11 - '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.5)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx@7.24.6(@babel/core@7.24.5)': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 - '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.5) - '@babel/types': 7.24.6 + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.11 + transitivePeerDependencies: + - supports-color - '@babel/runtime@7.24.5': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.29.10': {} - '@babel/template@7.24.0': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 - '@babel/traverse@7.24.5': + '@babel/traverse@7.29.10': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4 - globals: 11.12.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.11 + '@babel/template': 7.29.7 + '@babel/types': 7.29.11 + debug: 4.4.3 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.6': + '@babel/types@7.29.11': dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.29.11 + '@babel/helper-validator-identifier': 7.29.7 - '@bcoe/v8-coverage@0.2.3': {} + '@bcoe/v8-coverage@1.0.2': {} - '@changesets/apply-release-plan@7.0.0': + '@changesets/apply-release-plan@7.1.1': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/config': 3.0.0 + '@changesets/config': 3.1.4 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/types': 6.0.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -4784,194 +4803,210 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.0 + semver: 7.8.5 - '@changesets/assemble-release-plan@6.0.0': + '@changesets/assemble-release-plan@6.0.10': dependencies: - '@babel/runtime': 7.24.5 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.0 + semver: 7.8.5 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/changelog-github@0.5.0': + '@changesets/changelog-github@0.5.2': dependencies: - '@changesets/get-github-info': 0.6.0 - '@changesets/types': 6.0.0 + '@changesets/get-github-info': 0.7.0 + '@changesets/types': 6.1.0 dotenv: 8.6.0 transitivePeerDependencies: - encoding - '@changesets/cli@2.27.1': + '@changesets/cli@2.31.1(@types/node@24.19.2)': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@24.19.2) '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 ansi-colors: 4.1.3 - chalk: 2.4.2 - ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 - p-limit: 2.3.0 - preferred-pm: 3.1.3 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.6.0 - spawndamnit: 2.0.0 + semver: 7.8.5 + spawndamnit: 3.0.1 term-size: 2.2.1 - tty-table: 4.2.3 + transitivePeerDependencies: + - '@types/node' - '@changesets/config@3.0.0': + '@changesets/config@3.1.4': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.0.0': + '@changesets/get-dependents-graph@2.1.4': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 - semver: 7.6.0 + picocolors: 1.1.1 + semver: 7.8.5 - '@changesets/get-github-info@0.6.0': + '@changesets/get-github-info@0.7.0': dependencies: dataloader: 1.4.0 node-fetch: 2.7.0 transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.0': + '@changesets/get-release-plan@4.0.16': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.0': + '@changesets/git@3.0.4': dependencies: - '@babel/runtime': 7.24.5 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 - '@changesets/logger@0.1.0': + '@changesets/logger@0.1.1': dependencies: - chalk: 2.4.2 + picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.3': dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 + '@changesets/types': 6.1.0 + js-yaml: 4.3.2 - '@changesets/pre@2.0.0': + '@changesets/pre@2.0.2': dependencies: - '@babel/runtime': 7.24.5 '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.0': + '@changesets/read@0.6.7': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - chalk: 2.4.2 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.0': + '@changesets/write@0.4.0': dependencies: - '@babel/runtime': 7.24.5 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.2.2 prettier: 2.8.8 - '@cloudflare/kv-asset-handler@0.3.2': + '@cloudflare/kv-asset-handler@0.3.4': dependencies: mime: 3.0.0 - '@cloudflare/workerd-darwin-64@1.20240524.0': + '@cloudflare/unenv-preset@2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250718.0)': + dependencies: + unenv: 2.0.0-rc.14 + optionalDependencies: + workerd: 1.20250718.0 + + '@cloudflare/workerd-darwin-64@1.20250718.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20240524.0': + '@cloudflare/workerd-darwin-arm64@1.20250718.0': optional: true - '@cloudflare/workerd-linux-64@1.20240524.0': + '@cloudflare/workerd-linux-64@1.20250718.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20240524.0': + '@cloudflare/workerd-linux-arm64@1.20250718.0': optional: true - '@cloudflare/workerd-windows-64@1.20240524.0': + '@cloudflare/workerd-windows-64@1.20250718.0': optional: true '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@ctrl/tinycolor@4.1.0': {} + '@ctrl/tinycolor@4.2.2': {} - '@electron/get@2.0.2': + '@electron-internal/extract-zip@1.0.7': {} + + '@electron/get@2.0.3': dependencies: - debug: 4.3.4 + debug: 4.4.3 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 progress: 2.0.3 - semver: 6.3.0 + semver: 6.3.1 sumchecker: 3.0.1 optionalDependencies: global-agent: 3.0.0 transitivePeerDependencies: - supports-color + '@electron/get@5.1.0': + dependencies: + debug: 4.4.3 + env-paths: 3.0.0 + graceful-fs: 4.2.11 + progress: 2.0.3 + semver: 7.8.5 + sumchecker: 3.0.1 + optionalDependencies: + undici: 7.30.1 + transitivePeerDependencies: + - supports-color + '@emmetio/abbreviation@2.3.3': dependencies: '@emmetio/scanner': 1.0.4 @@ -4980,7 +5015,7 @@ snapshots: dependencies: '@emmetio/scanner': 1.0.4 - '@emmetio/css-parser@0.4.0': + '@emmetio/css-parser@0.4.1': dependencies: '@emmetio/stream-reader': 2.2.0 '@emmetio/stream-reader-utils': 0.1.0 @@ -4995,10 +5030,18 @@ snapshots: '@emmetio/stream-reader@2.2.0': {} - '@emnapi/runtime@1.2.0': + '@emnapi/core@1.11.3': dependencies: - tslib: 2.6.2 - optional: true + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': dependencies: @@ -5010,391 +5053,329 @@ snapshots: escape-string-regexp: 4.0.0 rollup-plugin-node-polyfills: 0.2.1 - '@esbuild/aix-ppc64@0.20.2': - optional: true - - '@esbuild/aix-ppc64@0.21.4': + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.17.19': optional: true - '@esbuild/android-arm64@0.20.2': - optional: true - - '@esbuild/android-arm64@0.21.4': + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.17.19': optional: true - '@esbuild/android-arm@0.20.2': - optional: true - - '@esbuild/android-arm@0.21.4': + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.17.19': optional: true - '@esbuild/android-x64@0.20.2': - optional: true - - '@esbuild/android-x64@0.21.4': + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.17.19': optional: true - '@esbuild/darwin-arm64@0.20.2': - optional: true - - '@esbuild/darwin-arm64@0.21.4': + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.17.19': optional: true - '@esbuild/darwin-x64@0.20.2': - optional: true - - '@esbuild/darwin-x64@0.21.4': + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.17.19': optional: true - '@esbuild/freebsd-arm64@0.20.2': - optional: true - - '@esbuild/freebsd-arm64@0.21.4': + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.17.19': optional: true - '@esbuild/freebsd-x64@0.20.2': - optional: true - - '@esbuild/freebsd-x64@0.21.4': + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.17.19': optional: true - '@esbuild/linux-arm64@0.20.2': - optional: true - - '@esbuild/linux-arm64@0.21.4': + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.17.19': optional: true - '@esbuild/linux-arm@0.20.2': - optional: true - - '@esbuild/linux-arm@0.21.4': + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.17.19': optional: true - '@esbuild/linux-ia32@0.20.2': - optional: true - - '@esbuild/linux-ia32@0.21.4': + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.17.19': optional: true - '@esbuild/linux-loong64@0.20.2': - optional: true - - '@esbuild/linux-loong64@0.21.4': + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.17.19': optional: true - '@esbuild/linux-mips64el@0.20.2': - optional: true - - '@esbuild/linux-mips64el@0.21.4': + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.17.19': optional: true - '@esbuild/linux-ppc64@0.20.2': - optional: true - - '@esbuild/linux-ppc64@0.21.4': + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.17.19': optional: true - '@esbuild/linux-riscv64@0.20.2': - optional: true - - '@esbuild/linux-riscv64@0.21.4': + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.17.19': optional: true - '@esbuild/linux-s390x@0.20.2': - optional: true - - '@esbuild/linux-s390x@0.21.4': + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.17.19': optional: true - '@esbuild/linux-x64@0.20.2': - optional: true - - '@esbuild/linux-x64@0.21.4': + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.17.19': optional: true - '@esbuild/netbsd-x64@0.20.2': - optional: true - - '@esbuild/netbsd-x64@0.21.4': + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.17.19': optional: true - '@esbuild/openbsd-x64@0.20.2': - optional: true - - '@esbuild/openbsd-x64@0.21.4': + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.17.19': optional: true - '@esbuild/sunos-x64@0.20.2': - optional: true - - '@esbuild/sunos-x64@0.21.4': + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.17.19': optional: true - '@esbuild/win32-arm64@0.20.2': - optional: true - - '@esbuild/win32-arm64@0.21.4': + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.17.19': optional: true - '@esbuild/win32-ia32@0.20.2': - optional: true - - '@esbuild/win32-ia32@0.21.4': + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.17.19': optional: true - '@esbuild/win32-x64@0.20.2': - optional: true - - '@esbuild/win32-x64@0.21.4': + '@esbuild/win32-x64@0.21.5': optional: true - '@expressive-code/core@0.35.3': + '@expressive-code/core@0.35.6': dependencies: - '@ctrl/tinycolor': 4.1.0 - hast-util-select: 6.0.2 - hast-util-to-html: 9.0.1 - hast-util-to-text: 4.0.2 - hastscript: 9.0.0 - postcss: 8.4.38 - postcss-nested: 6.0.1(postcss@8.4.38) - unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 + '@ctrl/tinycolor': 4.2.2 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.3 + hastscript: 9.0.1 + postcss: 8.5.32 + postcss-nested: 6.2.0(postcss@8.5.32) + unist-util-visit: 5.2.0 + unist-util-visit-parents: 6.1.0 - '@expressive-code/plugin-frames@0.35.3': + '@expressive-code/plugin-frames@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 + '@expressive-code/core': 0.35.6 - '@expressive-code/plugin-shiki@0.35.3': + '@expressive-code/plugin-shiki@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 - shiki: 1.6.1 + '@expressive-code/core': 0.35.6 + shiki: 1.29.2 - '@expressive-code/plugin-text-markers@0.35.3': + '@expressive-code/plugin-text-markers@0.35.6': dependencies: - '@expressive-code/core': 0.35.3 + '@expressive-code/core': 0.35.6 '@fastify/busboy@2.1.1': {} - '@img/sharp-darwin-arm64@0.33.4': + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.4': + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.2': + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.2': + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.2': + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.2': + '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-s390x@1.0.2': + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.2': + '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.2': + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-linux-arm64@0.33.4': + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm@0.33.4': + '@img/sharp-linux-arm@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-s390x@0.33.4': + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-x64@0.33.4': + '@img/sharp-linux-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.4': + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.4': + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-wasm32@0.33.4': + '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.2.0 + '@emnapi/runtime': 1.11.3 optional: true - '@img/sharp-win32-ia32@0.33.4': + '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-x64@0.33.4': + '@img/sharp-win32-x64@0.33.5': optional: true - '@istanbuljs/schema@0.1.3': {} - - '@jest/schemas@29.6.3': + '@inquirer/external-editor@1.0.3(@types/node@24.19.2)': dependencies: - '@sinclair/typebox': 0.27.8 + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 24.19.2 - '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.6.0': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.6.0 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.29.10 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.29.10 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 + '@types/hast': 3.0.5 + '@types/mdx': 2.0.14 + acorn: 8.19.0 collapse-white-space: 2.1.0 devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-scope: 1.0.1 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 + hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.1 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.19.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + unist-util-visit: 5.2.0 + vfile: 6.0.3 transitivePeerDependencies: - supports-color + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5405,112 +5386,226 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.20.3 + + '@oslojs/encoding@1.1.0': {} + + '@oxc-project/types@0.155.0': {} + + '@pagefind/darwin-arm64@1.5.2': + optional: true + + '@pagefind/darwin-x64@1.5.2': + optional: true + + '@pagefind/default-ui@1.5.2': {} + + '@pagefind/freebsd-x64@1.5.2': + optional: true + + '@pagefind/linux-arm64@1.5.2': + optional: true + + '@pagefind/linux-x64@1.5.2': + optional: true + + '@pagefind/windows-arm64@1.5.2': + optional: true + + '@pagefind/windows-x64@1.5.2': + optional: true + + '@playwright/test@1.64.1': + dependencies: + playwright: 1.64.1 + + '@quansync/fs@1.1.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm-eabi@1.2.15': + optional: true + + '@rolldown/binding-android-arm64@1.2.15': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.15': + optional: true + + '@rolldown/binding-darwin-x64@1.2.15': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.15': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.15': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.15': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.15': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.15': + optional: true - '@pagefind/darwin-arm64@1.1.0': + '@rolldown/binding-linux-s390x-gnu@1.2.15': optional: true - '@pagefind/darwin-x64@1.1.0': + '@rolldown/binding-linux-x64-gnu@1.2.15': optional: true - '@pagefind/default-ui@1.1.0': {} + '@rolldown/binding-linux-x64-musl@1.2.15': + optional: true - '@pagefind/linux-arm64@1.1.0': + '@rolldown/binding-openharmony-arm64@1.2.15': optional: true - '@pagefind/linux-x64@1.1.0': + '@rolldown/binding-win32-arm64-msvc@1.2.15': optional: true - '@pagefind/windows-x64@1.1.0': + '@rolldown/binding-win32-x64-msvc@1.2.15': optional: true - '@playwright/test@1.43.1': + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/pluginutils@5.5.1(rollup@4.66.0)': dependencies: - playwright: 1.43.1 + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.7 + optionalDependencies: + rollup: 4.66.0 + + '@rollup/rollup-android-arm-eabi@4.66.0': + optional: true + + '@rollup/rollup-android-arm64@4.66.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.66.0': + optional: true + + '@rollup/rollup-darwin-x64@4.66.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.66.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.66.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.66.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.66.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.66.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.17.2': + '@rollup/rollup-linux-arm64-musl@4.66.0': optional: true - '@rollup/rollup-android-arm64@4.17.2': + '@rollup/rollup-linux-loong64-gnu@4.66.0': optional: true - '@rollup/rollup-darwin-arm64@4.17.2': + '@rollup/rollup-linux-loong64-musl@4.66.0': optional: true - '@rollup/rollup-darwin-x64@4.17.2': + '@rollup/rollup-linux-ppc64-gnu@4.66.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + '@rollup/rollup-linux-ppc64-musl@4.66.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.17.2': + '@rollup/rollup-linux-riscv64-gnu@4.66.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.17.2': + '@rollup/rollup-linux-riscv64-musl@4.66.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.17.2': + '@rollup/rollup-linux-s390x-gnu@4.66.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + '@rollup/rollup-linux-x64-gnu@4.66.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.17.2': + '@rollup/rollup-linux-x64-musl@4.66.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.17.2': + '@rollup/rollup-openbsd-x64@4.66.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.17.2': + '@rollup/rollup-openharmony-arm64@4.66.0': optional: true - '@rollup/rollup-linux-x64-musl@4.17.2': + '@rollup/rollup-win32-arm64-msvc@4.66.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.17.2': + '@rollup/rollup-win32-ia32-msvc@4.66.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.17.2': + '@rollup/rollup-win32-x64-gnu@4.66.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.17.2': + '@rollup/rollup-win32-x64-msvc@4.66.0': optional: true - '@shikijs/core@1.6.1': {} + '@shikijs/core@1.29.2': + dependencies: + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 - '@sinclair/typebox@0.27.8': {} + '@shikijs/engine-javascript@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.1.0 + oniguruma-to-es: 2.3.0 - '@sindresorhus/is@4.6.0': {} + '@shikijs/engine-oniguruma@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.1.0 - '@szmarczak/http-timer@4.0.6': + '@shikijs/langs@1.29.2': dependencies: - defer-to-connect: 2.0.1 + '@shikijs/types': 1.29.2 + + '@shikijs/themes@1.29.2': + dependencies: + '@shikijs/types': 1.29.2 + + '@shikijs/types@1.29.2': + dependencies: + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 - '@tanstack/query-core@4.29.14': {} + '@shikijs/vscode-textmate@10.1.0': {} - '@tanstack/query-core@5.32.1': {} + '@sindresorhus/is@4.6.0': {} - '@tanstack/react-query@4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@szmarczak/http-timer@4.0.6': dependencies: - '@tanstack/query-core': 4.29.14 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - optionalDependencies: - react-dom: 18.2.0(react@18.2.0) + defer-to-connect: 2.0.1 + + '@tanstack/query-core@4.44.0': {} - '@tanstack/react-query@4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-core': 4.29.14 + '@tanstack/query-core': 4.44.0 react: 18.3.1 - use-sync-external-store: 1.2.0(react@18.3.1) + use-sync-external-store: 1.7.0(react@18.3.1) optionalDependencies: react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-query@5.32.1(react@18.3.1)': - dependencies: - '@tanstack/query-core': 5.32.1 - react: 18.3.1 - '@trpc/client@10.33.1(@trpc/server@10.33.1)': dependencies: '@trpc/server': 10.33.1 @@ -5519,17 +5614,9 @@ snapshots: dependencies: '@trpc/server': 10.45.2 - '@trpc/react-query@10.33.1(@tanstack/react-query@4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/react-query': 4.29.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@trpc/client': 10.33.1(@trpc/server@10.33.1) - '@trpc/server': 10.33.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@trpc/react-query@10.33.1(@tanstack/react-query@4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 4.29.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/client': 10.33.1(@trpc/server@10.33.1) '@trpc/server': 10.33.1 react: 18.3.1 @@ -5539,250 +5626,339 @@ snapshots: '@trpc/server@10.45.2': {} - '@types/acorn@4.0.6': + '@tybys/wasm-util@0.10.4': dependencies: - '@types/estree': 1.0.5 + tslib: 2.8.1 '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - '@types/babel__generator': 7.6.8 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.28.0 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.29.11 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.29.11 '@types/cacheable-request@6.0.3': dependencies: - '@types/http-cache-semantics': 4.0.1 + '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 20.12.8 - '@types/responselike': 1.0.0 + '@types/node': 20.19.43 + '@types/responselike': 1.0.3 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 '@types/cookie@0.6.0': {} - '@types/debug@4.1.12': + '@types/debug@4.1.13': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 + + '@types/deep-eql@4.0.2': {} '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 - '@types/estree@1.0.5': {} + '@types/estree@1.0.9': {} - '@types/hast@3.0.4': + '@types/hast@3.0.5': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 - '@types/http-cache-semantics@4.0.1': {} + '@types/http-cache-semantics@4.2.0': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 20.12.8 + '@types/node': 20.19.43 '@types/mdast@4.0.4': dependencies: - '@types/unist': 3.0.2 - - '@types/mdx@2.0.13': {} - - '@types/minimist@1.2.5': {} + '@types/unist': 3.0.3 - '@types/ms@0.7.34': {} + '@types/mdx@2.0.14': {} - '@types/nlcst@1.0.4': - dependencies: - '@types/unist': 2.0.10 + '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': dependencies: - '@types/unist': 3.0.2 - - '@types/node-forge@1.3.11': - dependencies: - '@types/node': 20.12.8 + '@types/unist': 3.0.3 '@types/node@12.20.55': {} - '@types/node@17.0.45': {} - - '@types/node@20.12.8': + '@types/node@20.19.43': dependencies: - undici-types: 5.26.5 + undici-types: 6.21.0 - '@types/normalize-package-data@2.4.4': {} + '@types/node@24.19.2': + dependencies: + undici-types: 7.24.6 - '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.15': {} - '@types/react-dom@18.3.0': + '@types/react-dom@18.3.7(@types/react@18.3.31)': dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.31 - '@types/react@18.3.1': + '@types/react@18.3.31': dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + '@types/prop-types': 15.7.15 + csstype: 3.2.3 - '@types/responselike@1.0.0': + '@types/responselike@1.0.3': dependencies: - '@types/node': 20.12.8 + '@types/node': 20.19.43 '@types/sax@1.2.7': dependencies: - '@types/node': 20.12.8 - - '@types/semver@7.5.8': {} + '@types/node': 24.19.2 - '@types/unist@2.0.10': {} + '@types/unist@2.0.11': {} - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.12.8 + '@types/node': 20.19.43 + optional: true + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': optional: true - '@ungap/structured-clone@1.2.0': {} + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@ungap/structured-clone@1.4.0': {} - '@vitejs/plugin-react@4.2.1(vite@5.2.11(@types/node@20.12.8))': + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0))': dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.2.11(@types/node@20.12.8) - transitivePeerDependencies: - - supports-color - - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.8))': - dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.4 - istanbul-reports: 3.1.7 - magic-string: 0.30.10 - magicast: 0.3.4 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.1.0 - test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.12.8) + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': - dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 - - '@vitest/runner@1.6.0': + '@vitest/coverage-v8@5.0.5(vitest@5.0.5)': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.2 + '@bcoe/v8-coverage': 1.0.2 + '@vitest/istanbul-lib-coverage': 1.0.2 + '@vitest/istanbul-lib-report': 1.0.2 + ast-v8-to-istanbul: 1.0.7 + magicast: 0.5.5 + obug: 3.0.0 + std-env: 4.3.0 + tinyrainbow: 3.2.0 + vitest: 5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) - '@vitest/snapshot@1.6.0': - dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 + '@vitest/istanbul-lib-coverage@1.0.2': {} - '@vitest/spy@1.6.0': + '@vitest/istanbul-lib-report@1.0.2': dependencies: - tinyspy: 2.2.1 + '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/utils@1.6.0': + '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1))': dependencies: - diff-sequences: 29.6.3 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.5 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + magic-string: 1.4.5 + optionalDependencies: + vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + + '@vitest/spy@5.0.5': {} - '@volar/kit@2.2.5(typescript@5.4.5)': + '@volar/kit@2.4.30(typescript@5.9.3)': dependencies: - '@volar/language-service': 2.2.5 - '@volar/typescript': 2.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) + '@volar/typescript': 2.4.30(typescript@5.9.3) typesafe-path: 0.2.2 - typescript: 5.4.5 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 + typescript: 5.9.3 + vscode-languageserver-textdocument: 1.0.16 + vscode-uri: 3.2.0 - '@volar/language-core@2.2.5': + '@volar/language-core@2.4.30': dependencies: - '@volar/source-map': 2.2.5 + '@volar/source-map': 2.4.30 - '@volar/language-server@2.2.5': + '@volar/language-server@2.4.30(typescript@5.9.3)': dependencies: - '@volar/language-core': 2.2.5 - '@volar/language-service': 2.2.5 - '@volar/snapshot-document': 2.2.5 - '@volar/typescript': 2.2.5 - '@vscode/l10n': 0.0.16 + '@volar/language-core': 2.4.30 + '@volar/language-service': 2.4.30(typescript@5.9.3) + '@volar/typescript': 2.4.30(typescript@5.9.3) path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 - - '@volar/language-service@2.2.5': - dependencies: - '@volar/language-core': 2.2.5 - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 + vscode-languageserver-protocol: 3.18.5 + vscode-languageserver-textdocument: 1.0.16 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 5.9.3 - '@volar/snapshot-document@2.2.5': + '@volar/language-service@2.4.30(typescript@5.9.3)': dependencies: - vscode-languageserver-protocol: 3.17.5 - vscode-languageserver-textdocument: 1.0.11 + '@volar/language-core': 2.4.30 + vscode-languageserver-protocol: 3.18.5 + vscode-languageserver-textdocument: 1.0.16 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 5.9.3 - '@volar/source-map@2.2.5': - dependencies: - muggle-string: 0.4.1 + '@volar/source-map@2.4.30': {} - '@volar/typescript@2.2.5': + '@volar/typescript@2.4.30(typescript@5.9.3)': dependencies: - '@volar/language-core': 2.2.5 + '@volar/language-core': 2.4.30 + '@volar/language-service': 2.4.30(typescript@5.9.3) path-browserify: 1.0.1 + vscode-uri: 3.2.0 + optionalDependencies: + typescript: 5.9.3 - '@vscode/emmet-helper@2.9.3': + '@vscode/emmet-helper@2.11.0': dependencies: - emmet: 2.4.7 + emmet: 2.4.11 jsonc-parser: 2.3.1 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-uri: 2.1.2 - - '@vscode/l10n@0.0.16': {} + vscode-languageserver-textdocument: 1.0.16 + vscode-languageserver-types: 3.18.5 + vscode-uri: 3.2.0 '@vscode/l10n@0.0.18': {} - acorn-jsx@5.3.2(acorn@8.11.3): + '@yuku-core/binding-android-arm64@0.19.0': + optional: true + + '@yuku-core/binding-darwin-arm64@0.19.0': + optional: true + + '@yuku-core/binding-darwin-x64@0.19.0': + optional: true + + '@yuku-core/binding-freebsd-x64@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm-gnu@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm-musl@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm64-musl@0.19.0': + optional: true + + '@yuku-core/binding-linux-x64-gnu@0.19.0': + optional: true + + '@yuku-core/binding-linux-x64-musl@0.19.0': + optional: true + + '@yuku-core/binding-win32-arm64@0.19.0': + optional: true + + '@yuku-core/binding-win32-x64@0.19.0': + optional: true + + '@yuku-toolchain/types@0.19.0': {} + + acorn-jsx@5.3.2(acorn@8.19.0): dependencies: - acorn: 8.11.3 + acorn: 8.19.0 acorn-walk@8.3.2: {} - acorn@8.11.3: {} + acorn@8.14.0: {} + + acorn@8.19.0: {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-i18n@4.2.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.9 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 ansi-align@3.0.1: dependencies: @@ -5792,24 +5968,18 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 + ansi-regex@6.4.0: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 arg@5.0.2: {} @@ -5819,174 +5989,154 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + aria-query@5.3.2: {} array-iterate@2.0.1: {} array-union@2.1.0: {} - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} - as-table@1.0.55: dependencies: printable-characters: 1.0.42 - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.7: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 - astring@1.8.6: {} + astring@1.9.0: {} - astro-expressive-code@0.35.3(astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5)): + astro-expressive-code@0.35.6(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)): dependencies: - astro: 4.9.2(@types/node@20.12.8)(typescript@5.4.5) - rehype-expressive-code: 0.35.3 + astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) + rehype-expressive-code: 0.35.6 - astro@4.9.2(@types/node@20.12.8)(typescript@5.4.5): + astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3): dependencies: - '@astrojs/compiler': 2.8.0 - '@astrojs/internal-helpers': 0.4.0 - '@astrojs/markdown-remark': 5.1.0 + '@astrojs/compiler': 2.13.1 + '@astrojs/internal-helpers': 0.4.1 + '@astrojs/markdown-remark': 5.3.0 '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.5) - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.11 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.5.1(rollup@4.66.0) '@types/babel__core': 7.20.5 '@types/cookie': 0.6.0 - acorn: 8.11.3 - aria-query: 5.3.0 - axobject-query: 4.0.0 - boxen: 7.1.1 - chokidar: 3.6.0 - ci-info: 4.0.0 + acorn: 8.19.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.4.0 clsx: 2.1.1 common-ancestor-path: 1.0.1 - cookie: 0.6.0 + cookie: 0.7.2 cssesc: 3.0.0 - debug: 4.3.4 + debug: 4.4.3 deterministic-object-hash: 2.0.2 - devalue: 5.0.0 - diff: 5.2.0 + devalue: 5.9.4 + diff: 5.2.2 dlv: 1.1.3 - dset: 3.1.3 - es-module-lexer: 1.5.2 - esbuild: 0.21.4 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.21.5 estree-walker: 3.0.3 - execa: 8.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 flattie: 1.1.1 github-slugger: 2.0.0 gray-matter: 4.0.3 html-escaper: 3.0.3 - http-cache-semantics: 4.1.1 - js-yaml: 4.1.0 + http-cache-semantics: 4.3.0 + js-yaml: 4.3.2 kleur: 4.1.5 - magic-string: 0.30.10 - mrmime: 2.0.0 - ora: 8.0.1 - p-limit: 5.0.0 - p-queue: 8.0.1 - path-to-regexp: 6.2.2 - preferred-pm: 3.1.3 + magic-string: 0.30.21 + magicast: 0.3.5 + micromatch: 4.0.8 + mrmime: 2.0.1 + neotraverse: 0.6.18 + ora: 8.2.0 + p-limit: 6.2.0 + p-queue: 8.1.1 + preferred-pm: 4.1.1 prompts: 2.4.2 - rehype: 13.0.1 - resolve: 1.22.8 - semver: 7.6.2 - shiki: 1.6.1 - string-width: 7.1.0 - strip-ansi: 7.1.0 - tsconfck: 3.1.0(typescript@5.4.5) - unist-util-visit: 5.0.0 - vfile: 6.0.1 - vite: 5.2.11(@types/node@20.12.8) - vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.8)) - which-pm: 2.2.0 + rehype: 13.0.2 + semver: 7.8.5 + shiki: 1.29.2 + tinyexec: 0.3.2 + tsconfck: 3.1.6(typescript@5.9.3) + unist-util-visit: 5.2.0 + vfile: 6.0.3 + vite: 5.4.21(@types/node@24.19.2)(lightningcss@1.33.0) + vitefu: 1.1.3(vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)) + which-pm: 3.0.1 + xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 - zod: 3.23.8 - zod-to-json-schema: 3.23.0(zod@3.23.8) + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) optionalDependencies: - sharp: 0.33.4 + sharp: 0.33.5 transitivePeerDependencies: - '@types/node' - less - lightningcss + - rollup - sass + - sass-embedded - stylus - sugarss - supports-color - terser - typescript - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axobject-query@4.0.0: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} - b4a@1.6.6: {} + b4a@1.9.0: {} bail@2.0.2: {} - balanced-match@1.0.2: {} - - bare-events@2.3.1: - optional: true + bare-events@2.9.2: {} - bare-fs@2.3.0: + bare-fs@4.8.4: dependencies: - bare-events: 2.3.1 - bare-path: 2.1.3 - bare-stream: 1.0.0 - optional: true + bare-events: 2.9.2 + bare-path: 3.1.2 + bare-stream: 2.13.4(bare-events@2.9.2) + bare-url: 2.5.5 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a - bare-os@2.3.0: - optional: true + bare-path@3.1.2: {} - bare-path@2.1.3: + bare-stream@2.13.4(bare-events@2.9.2): dependencies: - bare-os: 2.3.0 - optional: true + b4a: 1.9.0 + streamx: 2.28.1 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.2 + transitivePeerDependencies: + - react-native-b4a - bare-stream@1.0.0: + bare-url@2.5.5: dependencies: - streamx: 2.18.0 - optional: true + bare-path: 3.1.2 base-64@1.0.0: {} base64-js@1.5.1: {} + baseline-browser-mapping@2.11.34: {} + bcp-47-match@2.0.3: {} - bcp-47@2.1.0: + bcp-47@2.1.2: dependencies: is-alphabetical: 2.0.1 is-alphanumerical: 2.0.1 @@ -6011,36 +6161,28 @@ snapshots: boolean@3.2.0: optional: true - boxen@7.1.1: + boxen@8.0.1: dependencies: ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 + camelcase: 8.0.0 + chalk: 5.6.2 cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 - brace-expansion@1.1.11: + braces@3.0.3: dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + fill-range: 7.1.1 - braces@3.0.2: + browserslist@4.29.5: dependencies: - fill-range: 7.0.1 - - breakword@1.0.6: - dependencies: - wcwidth: 1.0.1 - - browserslist@4.23.0: - dependencies: - caniuse-lite: 1.0.30001615 - electron-to-chromium: 1.4.756 - node-releases: 2.0.14 - update-browserslist-db: 1.0.14(browserslist@4.23.0) + baseline-browser-mapping: 2.11.34 + caniuse-lite: 1.0.30001819 + electron-to-chromium: 1.5.467 + node-releases: 2.0.60 + update-browserslist-db: 1.3.4(browserslist@4.29.5) buffer-crc32@0.2.13: {} @@ -6049,9 +6191,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@4.0.0: {} - - cac@6.7.14: {} + cac@7.1.0: {} cacheable-lookup@5.0.4: {} @@ -6059,63 +6199,21 @@ snapshots: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.2 + http-cache-semantics: 4.3.0 + keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - - camelcase@7.0.1: {} - - caniuse-lite@1.0.30001615: {} + camelcase@8.0.0: {} - capnp-ts@0.7.0: - dependencies: - debug: 4.3.4 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color + caniuse-lite@1.0.30001819: {} ccount@2.0.1: {} - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + chai@6.3.0: {} - chalk@5.3.0: {} + chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -6125,16 +6223,12 @@ snapshots: character-reference-invalid@2.0.1: {} - chardet@0.7.0: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + chardet@2.2.0: {} chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -6145,24 +6239,16 @@ snapshots: chownr@1.1.4: {} - ci-info@3.9.0: {} - - ci-info@4.0.0: {} + ci-info@4.4.0: {} cli-boxes@3.0.0: {} - cli-cursor@4.0.0: + cli-cursor@5.0.0: dependencies: - restore-cursor: 4.0.0 + restore-cursor: 5.1.0 cli-spinners@2.9.2: {} - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -6173,28 +6259,20 @@ snapshots: dependencies: mimic-response: 1.0.1 - clone@1.0.4: {} - clsx@2.1.1: {} collapse-white-space@2.1.0: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 + simple-swizzle: 0.2.4 color@4.2.3: dependencies: @@ -6205,85 +6283,37 @@ snapshots: common-ancestor-path@1.0.1: {} - concat-map@0.0.1: {} - - confbox@0.1.7: {} - convert-source-map@2.0.0: {} - cookie@0.5.0: {} - - cookie@0.6.0: {} + cookie@0.7.2: {} copy-anything@3.0.5: dependencies: - is-what: 4.1.15 + is-what: 4.1.16 - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + copy-anything@4.1.5: {} - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css-selector-parser@3.0.5: {} + css-selector-parser@3.3.0: {} cssesc@3.0.0: {} - csstype@3.1.3: {} - - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} - - csv-stringify@5.6.5: {} - - csv@5.5.3: - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 + csstype@3.2.3: {} data-uri-to-buffer@2.0.2: {} - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dataloader@1.4.0: {} - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decamelize-keys@1.1.1: + debug@4.4.3: dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 + ms: 2.1.3 - decamelize@1.2.0: {} - - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -6291,28 +6321,15 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - deep-extend@0.6.0: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 - defer-to-connect@2.0.1: {} define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.0: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 + gopd: 1.2.0 optional: true define-properties@1.2.1: @@ -6320,12 +6337,15 @@ snapshots: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + optional: true + + defu@6.1.7: {} dequal@2.0.3: {} detect-indent@6.1.0: {} - detect-libc@2.0.3: {} + detect-libc@2.1.2: {} detect-node@2.1.0: optional: true @@ -6334,15 +6354,13 @@ snapshots: dependencies: base-64: 1.0.0 - devalue@5.0.0: {} + devalue@5.9.4: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - diff-sequences@29.6.3: {} - - diff@5.2.0: {} + diff@5.2.2: {} dir-glob@3.0.1: dependencies: @@ -6354,37 +6372,42 @@ snapshots: dotenv@8.6.0: {} - dset@3.1.3: {} - - dts-bundle-generator@9.5.1: - dependencies: - typescript: 5.4.5 - yargs: 17.7.2 + dset@3.1.4: {} - eastasianwidth@0.2.0: {} + dts-resolver@3.0.0: {} - electron-to-chromium@1.4.756: {} + electron-to-chromium@1.5.467: {} electron@29.3.2: dependencies: - '@electron/get': 2.0.2 - '@types/node': 20.12.8 + '@electron/get': 2.0.3 + '@types/node': 20.19.43 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color - emmet@2.4.7: + electron@45.1.0: + dependencies: + '@electron-internal/extract-zip': 1.0.7 + '@electron/get': 5.1.0 + '@types/node': 24.19.2 + transitivePeerDependencies: + - supports-color + + emmet@2.4.11: dependencies: '@emmetio/abbreviation': 2.3.3 '@emmetio/css-abbreviation': 2.1.8 - emoji-regex@10.3.0: {} + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} + empathic@2.1.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -6393,93 +6416,38 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@4.5.0: {} + entities@6.0.1: {} env-paths@2.2.1: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + env-paths@3.0.0: {} - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: + optional: true - es-errors@1.3.0: {} + es-errors@1.3.0: + optional: true - es-module-lexer@1.5.2: {} + es-module-lexer@1.7.0: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 + es-module-lexer@2.3.2: {} - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + es6-error@4.1.1: + optional: true - es-shim-unscopables@1.0.2: + esast-util-from-estree@2.0.0: dependencies: - hasown: 2.0.2 + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 - es-to-primitive@1.2.1: + esast-util-from-js@2.0.1: dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - es6-error@4.1.1: - optional: true + '@types/estree-jsx': 1.0.5 + acorn: 8.19.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 esbuild@0.17.19: optionalDependencies: @@ -6506,61 +6474,33 @@ snapshots: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - esbuild@0.20.2: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - - esbuild@0.21.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.4 - '@esbuild/android-arm': 0.21.4 - '@esbuild/android-arm64': 0.21.4 - '@esbuild/android-x64': 0.21.4 - '@esbuild/darwin-arm64': 0.21.4 - '@esbuild/darwin-x64': 0.21.4 - '@esbuild/freebsd-arm64': 0.21.4 - '@esbuild/freebsd-x64': 0.21.4 - '@esbuild/linux-arm': 0.21.4 - '@esbuild/linux-arm64': 0.21.4 - '@esbuild/linux-ia32': 0.21.4 - '@esbuild/linux-loong64': 0.21.4 - '@esbuild/linux-mips64el': 0.21.4 - '@esbuild/linux-ppc64': 0.21.4 - '@esbuild/linux-riscv64': 0.21.4 - '@esbuild/linux-s390x': 0.21.4 - '@esbuild/linux-x64': 0.21.4 - '@esbuild/netbsd-x64': 0.21.4 - '@esbuild/openbsd-x64': 0.21.4 - '@esbuild/sunos-x64': 0.21.4 - '@esbuild/win32-arm64': 0.21.4 - '@esbuild/win32-ia32': 0.21.4 - '@esbuild/win32-x64': 0.21.4 - - escalade@3.1.2: {} - - escape-string-regexp@1.0.5: {} + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -6570,7 +6510,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -6581,47 +6521,52 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-util-scope@1.0.1: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 - astring: 1.8.6 - source-map: 0.7.4 + astring: 1.9.0 + source-map: 0.7.6 estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 estree-walker@0.6.1: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 - eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} - execa@8.0.1: + events-universal@1.0.1: dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + bare-events: 2.9.2 + transitivePeerDependencies: + - bare-abort-controller exit-hook@2.2.1: {} expand-template@2.0.3: {} - expressive-code@0.35.3: + expect-type@1.4.0: {} + + expressive-code@0.35.6: dependencies: - '@expressive-code/core': 0.35.3 - '@expressive-code/plugin-frames': 0.35.3 - '@expressive-code/plugin-shiki': 0.35.3 - '@expressive-code/plugin-text-markers': 0.35.3 + '@expressive-code/core': 0.35.6 + '@expressive-code/plugin-frames': 0.35.6 + '@expressive-code/plugin-shiki': 0.35.6 + '@expressive-code/plugin-text-markers': 0.35.6 + + exsolve@1.2.0: {} extend-shallow@2.0.1: dependencies: @@ -6631,15 +6576,9 @@ snapshots: extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - extract-zip@2.0.1: dependencies: - debug: 4.3.4 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -6647,49 +6586,50 @@ snapshots: transitivePeerDependencies: - supports-color + fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 - fastq@1.17.1: + fast-uri@3.1.9: {} + + fastq@1.20.3: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fd-slicer@1.1.0: dependencies: pend: 1.2.0 - fill-range@7.0.1: + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-up-simple@1.0.1: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - find-yarn-workspace-root2@1.2.16: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.8 pkg-dir: 4.2.0 flattie@1.1.1: {} - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - fs-constants@1.0.0: {} fs-extra@7.0.1: @@ -6704,51 +6644,14 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs.realpath@1.0.0: {} - - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true - function-bind@1.1.1: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-east-asian-width@1.2.0: {} - - 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 - optional: true - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 + get-east-asian-width@1.7.0: {} get-source@2.0.12: dependencies: @@ -6757,15 +6660,11 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.4 - get-stream@8.0.1: {} - - get-symbol-description@1.0.2: + get-tsconfig@5.0.0-beta.6: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + resolve-pkg-maps: 1.0.0 github-from-package@0.0.0: {} @@ -6777,56 +6676,40 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - global-agent@3.0.0: dependencies: boolean: 3.2.0 es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.6.0 + semver: 7.8.5 serialize-error: 7.0.1 optional: true - globals@11.12.0: {} - - globalthis@1.0.3: - dependencies: - define-properties: 1.2.0 - optional: true - globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 + optional: true globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: + optional: true got@11.8.6: dependencies: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 + '@types/responselike': 1.0.3 cacheable-lookup: 5.0.4 cacheable-request: 7.0.4 decompress-response: 6.0.0 @@ -6837,284 +6720,246 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - gray-matter@4.0.3: dependencies: - js-yaml: 3.14.1 + js-yaml: 3.15.2 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - hard-rejection@2.1.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 - optional: true - has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.1: - optional: true - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - has@1.0.3: - dependencies: - function-bind: 1.1.1 + es-define-property: 1.0.1 optional: true - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hast-util-embedded@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-is-element: 3.0.0 - hast-util-from-html@2.0.1: + hast-util-format@1.1.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-minify-whitespace: 1.0.1 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.1 + unist-util-visit-parents: 6.1.0 + + hast-util-from-html@2.0.3: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.1 - vfile-message: 4.0.2 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 - hast-util-from-parse5@8.0.1: + hast-util-from-parse5@8.0.3: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.5.0 - vfile: 6.0.1 - vfile-location: 5.0.2 + hastscript: 9.0.1 + property-information: 7.2.0 + vfile: 6.0.3 + vfile-location: 5.0.3 web-namespaces: 2.0.1 hast-util-has-property@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 - hast-util-is-body-ok-link@3.0.0: + hast-util-is-body-ok-link@3.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-is-element@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.5 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.1 hast-util-parse-selector@4.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-phrasing@3.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hast-util-embedded: 3.0.0 hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 hast-util-is-element: 3.0.0 - hast-util-raw@9.0.3: + hast-util-raw@9.1.0: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.4.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + unist-util-visit: 5.2.0 + vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-select@6.0.2: + hast-util-select@6.0.4: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 bcp-47-match: 2.0.3 comma-separated-tokens: 2.0.3 - css-selector-parser: 3.0.5 + css-selector-parser: 3.3.0 devlop: 1.1.0 direction: 2.0.1 hast-util-has-property: 3.0.0 - hast-util-to-string: 3.0.0 + hast-util-to-string: 3.0.1 hast-util-whitespace: 3.0.0 - not: 0.1.0 nth-check: 2.1.1 - property-information: 6.5.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 + unist-util-visit: 5.2.0 zwitch: 2.0.4 - hast-util-to-estree@3.1.0: + hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-attach-comments: 3.0.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 + style-to-js: 1.1.21 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: - supports-color - hast-util-to-html@9.0.1: + hast-util-to-html@9.0.5: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 6.5.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.0: + hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.5 - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.5.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.6 + style-to-js: 1.1.21 unist-util-position: 5.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color - hast-util-to-parse5@8.0.0: + hast-util-to-parse5@8.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.5.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-string@3.0.0: + hast-util-to-string@3.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 - hast-util-to-text@4.0.2: + hast-util-to-text@4.0.3: dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 + '@types/hast': 3.0.5 hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 hastscript@8.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.5.0 space-separated-tokens: 2.0.2 - hastscript@9.0.0: + hastscript@9.0.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.5.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 - hosted-git-info@2.8.9: {} - - html-escaper@2.0.2: {} + hookable@6.1.2: {} html-escaper@3.0.3: {} html-void-elements@3.0.0: {} - html-whitespace-sensitive-tag-names@3.0.0: {} + html-whitespace-sensitive-tag-names@3.0.1: {} - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.3.0: {} http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - human-id@1.0.2: {} - - human-signals@5.0.0: {} + human-id@4.2.2: {} - iconv-lite@0.4.24: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} - import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 + import-without-cache@0.4.1: {} inherits@2.0.4: {} ini@1.3.8: {} - inline-style-parser@0.1.1: {} - - inline-style-parser@0.2.3: {} - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 + inline-style-parser@0.2.7: {} is-alphabetical@2.0.1: {} @@ -7123,44 +6968,12 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: {} - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 + is-arrayish@0.3.4: {} is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-buffer@2.0.5: {} - - is-callable@1.2.7: {} - - is-core-module@2.13.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-decimal@2.0.1: {} is-docker@3.0.0: {} @@ -7183,108 +6996,46 @@ snapshots: is-interactive@2.0.0: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} - is-plain-obj@1.1.0: {} - is-plain-obj@4.1.0: {} - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.5 - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - - is-stream@3.0.0: {} - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-unicode-supported@1.3.0: {} - is-unicode-supported@2.0.0: {} + is-unicode-supported@2.1.0: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - is-what@4.1.15: {} + is-what@4.1.16: {} is-windows@1.0.2: {} - is-wsl@3.1.0: + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 - isarray@2.0.5: {} - isexe@2.0.0: {} - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.4: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.4 - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 + js-tokens@10.0.0: {} js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - - js-yaml@3.14.1: + js-yaml@3.15.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@1.0.0: {} json-stringify-safe@5.0.1: optional: true @@ -7293,11 +7044,13 @@ snapshots: jsonc-parser@2.3.1: {} + jsonc-parser@3.3.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - keyv@4.5.2: + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -7307,33 +7060,71 @@ snapshots: kleur@4.1.5: {} - lines-and-columns@1.2.4: {} + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.15.2 pify: 4.0.1 strip-bom: 3.0.0 - local-pkg@0.5.0: - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash.startcase@4.4.0: {} log-symbols@6.0.0: dependencies: - chalk: 5.3.0 + chalk: 5.6.2 is-unicode-supported: 1.3.0 longest-streak@3.1.0: {} @@ -7342,50 +7133,39 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - lowercase-keys@2.0.0: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.10: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.6.0 - magicast@0.3.4: + magic-string@1.4.5: dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - source-map-js: 1.2.0 + '@jridgewell/sourcemap-codec': 1.6.0 - make-dir@4.0.0: + magicast@0.3.5: dependencies: - semver: 7.6.0 - - map-obj@1.0.1: {} + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 + source-map-js: 1.2.2 - map-obj@4.3.0: {} + magicast@0.5.5: + dependencies: + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 + source-map-js: 1.2.2 markdown-extensions@2.0.0: {} - markdown-table@3.0.3: {} + markdown-table@3.0.4: {} matcher@3.0.0: dependencies: @@ -7395,69 +7175,71 @@ snapshots: mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 + '@types/unist': 3.0.3 + unist-util-visit: 5.2.0 - mdast-util-directive@3.0.0: + mdast-util-directive@3.1.1: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 + ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 + micromark-util-character: 2.1.1 + parse-entities: 4.0.2 stringify-entities: 4.0.4 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.1.0 transitivePeerDependencies: - supports-color - mdast-util-find-and-replace@3.0.1: + mdast-util-find-and-replace@3.0.4: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.1.0 - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.1.0: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark: 4.0.3 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@2.0.0: + mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 + mdast-util-find-and-replace: 3.0.4 + micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.0.0: + mdast-util-gfm-footnote@2.1.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color @@ -7465,9 +7247,9 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color @@ -7475,479 +7257,446 @@ snapshots: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.0.0: + mdast-util-gfm@3.1.0: dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.1 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.0: + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 + parse-entities: 4.0.2 stringify-entities: 4.0.4 - unist-util-remove-position: 5.0.0 unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color mdast-util-mdx@3.0.0: dependencies: - mdast-util-from-markdown: 2.0.1 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 + mdast-util-from-markdown: 2.1.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0 + mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 - mdast-util-to-hast@13.1.0: + mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.4.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + unist-util-visit: 5.2.0 + vfile: 6.0.3 - mdast-util-to-markdown@2.1.0: + mdast-util-to-markdown@2.2.1: dependencies: '@types/mdast': 4.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 + micromark-util-character: 2.1.1 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + unist-util-visit: 5.2.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - - merge-stream@2.0.0: {} - merge2@1.4.1: {} - micromark-core-commonmark@2.0.1: + micromark-core-commonmark@2.0.4: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-directive@3.0.0: + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.1.0 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-edit-map: 1.0.0 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + + micromark-extension-directive@3.0.2: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 + micromark-factory-space: 2.1.0 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + parse-entities: 4.0.2 - micromark-extension-gfm-autolink-literal@2.0.0: + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-extension-gfm-footnote@2.0.0: + micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-extension-gfm-strikethrough@2.0.0: + micromark-extension-gfm-strikethrough@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-extension-gfm-table@2.0.0: + micromark-extension-gfm-table@2.1.2: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 micromark-extension-gfm-tagfilter@2.0.0: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.3 - micromark-extension-gfm-task-list-item@2.0.1: + micromark-extension-gfm-task-list-item@2.1.0: dependencies: devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 micromark-extension-gfm@3.0.0: dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.2 micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.3 - micromark-extension-mdx-expression@3.0.0: + micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-extension-mdx-jsx@3.0.0: + micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + vfile-message: 4.0.3 micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.3 micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.4 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.0 + acorn: 8.19.0 + acorn-jsx: 5.3.2(acorn@8.19.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.3 - micromark-factory-destination@2.0.0: + micromark-factory-destination@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-factory-label@2.0.0: + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-factory-mdx-expression@2.0.1: + micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 + + micromark-factory-space@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.3 - micromark-factory-space@2.0.0: + micromark-factory-title@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-factory-title@2.0.0: + micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-factory-whitespace@2.0.0: + micromark-util-character@2.1.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-util-character@2.1.0: + micromark-util-chunked@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-chunked@2.0.0: + micromark-util-classify-character@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-util-classify-character@2.0.0: + micromark-util-combine-extensions@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.3 - micromark-util-combine-extensions@2.0.0: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-decode-numeric-character-reference@2.0.1: + micromark-util-decode-string@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - micromark-util-decode-string@2.0.0: + micromark-util-edit-map@1.0.0: dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.3 - micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} - micromark-util-events-to-acorn@2.0.2: + micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - '@types/unist': 3.0.2 + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 + vfile-message: 4.0.3 - micromark-util-html-tag-name@2.0.0: {} + micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@2.0.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@2.0.0: + micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.3 - micromark-util-sanitize-uri@2.0.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.1: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 - micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} + micromark-util-types@2.0.3: {} - micromark@4.0.0: + micromark@4.0.3: dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.4 + micromark-factory-space: 2.1.0 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-edit-map: 1.0.0 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.3 transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + braces: 3.0.3 + picomatch: 2.3.2 mime@3.0.0: {} - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} mimic-response@1.0.1: {} mimic-response@3.1.0: {} - min-indent@1.0.1: {} - - miniflare@3.20240524.1: + miniflare@3.20250718.3: dependencies: '@cspotcode/source-map-support': 0.8.1 - acorn: 8.11.3 + acorn: 8.14.0 acorn-walk: 8.3.2 - capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 - undici: 5.28.4 - workerd: 1.20240524.0 - ws: 8.17.0 - youch: 3.3.3 - zod: 3.23.8 + undici: 5.29.0 + workerd: 1.20250718.0 + ws: 8.18.0 + youch: 3.3.4 + zod: 3.22.3 transitivePeerDependencies: - bufferutil - - supports-color - utf-8-validate - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - minimist@1.2.8: {} - mixme@0.5.10: {} - mkdirp-classic@0.5.3: {} - mlly@1.7.0: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 + mri@1.2.0: {} - mrmime@2.0.0: {} + mrmime@2.0.1: {} - ms@2.1.2: {} + ms@2.1.3: {} muggle-string@0.4.1: {} mustache@4.2.0: {} - nanoid@3.3.7: {} + nanoid@3.3.20: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} - nlcst-to-string@3.1.1: - dependencies: - '@types/nlcst': 1.0.4 + neotraverse@0.6.18: {} nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 - node-abi@3.63.0: + node-abi@3.101.0: dependencies: - semver: 7.6.0 + semver: 7.8.5 node-addon-api@6.1.0: {} @@ -7955,67 +7704,48 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-forge@1.3.1: {} - - node-releases@2.0.14: {} - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + node-releases@2.0.60: {} normalize-path@3.0.0: {} normalize-url@6.1.0: {} - not@0.1.0: {} - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - object-inspect@1.13.1: {} + object-keys@1.1.1: + optional: true - object-keys@1.1.1: {} + obug@3.0.0: {} - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 + ohash@2.0.12: {} once@1.4.0: dependencies: wrappy: 1.0.2 - onetime@5.1.2: + onetime@7.0.0: dependencies: - mimic-fn: 2.1.0 + mimic-function: 5.0.1 - onetime@6.0.0: + oniguruma-to-es@2.3.0: dependencies: - mimic-fn: 4.0.0 + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 - ora@8.0.1: + ora@8.2.0: dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 + chalk: 5.6.2 + cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 - is-unicode-supported: 2.0.0 + is-unicode-supported: 2.1.0 log-symbols: 6.0.0 stdin-discarder: 0.2.2 - string-width: 7.1.0 - strip-ansi: 7.1.0 - - os-tmpdir@1.0.2: {} + string-width: 7.2.0 + strip-ansi: 7.2.0 outdent@0.5.0: {} @@ -8029,109 +7759,81 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-limit@5.0.0: + p-limit@6.2.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.2.2 p-locate@4.1.0: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@2.1.0: {} - p-queue@8.0.1: + p-queue@8.1.1: dependencies: - eventemitter3: 5.0.1 - p-timeout: 6.1.2 + eventemitter3: 5.0.4 + p-timeout: 6.1.4 - p-timeout@6.1.2: {} + p-timeout@6.1.4: {} p-try@2.2.0: {} - pagefind@1.1.0: + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + pagefind@1.5.2: optionalDependencies: - '@pagefind/darwin-arm64': 1.1.0 - '@pagefind/darwin-x64': 1.1.0 - '@pagefind/linux-arm64': 1.1.0 - '@pagefind/linux-x64': 1.1.0 - '@pagefind/windows-x64': 1.1.0 + '@pagefind/darwin-arm64': 1.5.2 + '@pagefind/darwin-x64': 1.5.2 + '@pagefind/freebsd-x64': 1.5.2 + '@pagefind/linux-arm64': 1.5.2 + '@pagefind/linux-x64': 1.5.2 + '@pagefind/windows-arm64': 1.5.2 + '@pagefind/windows-x64': 1.5.2 - parse-entities@4.0.1: + parse-entities@4.0.2: dependencies: - '@types/unist': 2.0.10 - character-entities: 2.0.2 + '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.3.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-latin@5.0.1: - dependencies: - nlcst-to-string: 3.1.1 - unist-util-modify-children: 3.1.1 - unist-util-visit-children: 2.0.2 - parse-latin@7.0.0: dependencies: '@types/nlcst': 2.0.3 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 nlcst-to-string: 4.0.0 unist-util-modify-children: 4.0.0 unist-util-visit-children: 3.0.0 - vfile: 6.0.1 + vfile: 6.0.3 - parse5@7.1.2: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 path-browserify@1.0.1: {} path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-to-regexp@6.2.2: {} + path-to-regexp@6.3.0: {} path-type@4.0.0: {} - pathe@1.1.2: {} - - pathval@1.1.1: {} + pathe@2.0.3: {} pend@1.2.0: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.5 - estree-walker: 3.0.3 - is-reference: 3.0.2 + picocolors@1.1.1: {} - picocolors@1.0.0: {} + picomatch@2.3.2: {} - picomatch@2.3.1: {} + picomatch@4.0.7: {} pify@4.0.1: {} @@ -8139,73 +7841,56 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-types@1.1.0: - dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 - - playwright-core@1.43.1: {} + playwright-core@1.64.1: {} - playwright@1.43.1: + playwright@1.64.1: dependencies: - playwright-core: 1.43.1 - optionalDependencies: - fsevents: 2.3.2 - - possible-typed-array-names@1.0.0: {} + playwright-core: 1.64.1 - postcss-nested@6.0.1(postcss@8.4.38): + postcss-nested@6.2.0(postcss@8.5.32): dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.1.0 + postcss: 8.5.32 + postcss-selector-parser: 6.1.5 - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.5: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.38: + postcss@8.5.32: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 - prebuild-install@7.1.2: + prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.3 + detect-libc: 2.1.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.63.0 - pump: 3.0.0 + napi-build-utils: 2.0.0 + node-abi: 3.101.0 + pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.5 tunnel-agent: 0.6.0 - preferred-pm@3.1.3: + preferred-pm@4.1.1: dependencies: - find-up: 5.0.0 + find-up-simple: 1.0.1 find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 + which-pm: 3.0.1 prettier@2.8.8: {} - prettier@3.2.5: {} - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 + prettier@3.9.10: {} printable-characters@1.0.42: {} - prismjs@1.29.0: {} + prismjs@1.30.0: {} progress@2.0.3: {} @@ -8216,18 +7901,18 @@ snapshots: property-information@6.5.0: {} - pseudomap@1.0.2: {} + property-information@7.2.0: {} - pump@3.0.0: + pump@3.0.4: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - queue-microtask@1.2.3: {} + quansync@0.2.11: {} - queue-tick@1.0.1: {} + quansync@1.0.0: {} - quick-lru@4.0.1: {} + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} @@ -8238,47 +7923,22 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@18.2.0(react@18.2.0): - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - react-is@18.3.1: {} - - react-refresh@0.14.2: {} - - react@18.2.0: - dependencies: - loose-envify: 1.4.0 + react-refresh@0.17.0: {} react@18.3.1: dependencies: loose-envify: 1.4.0 - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.15.2 pify: 4.0.1 strip-bom: 3.0.0 @@ -8288,93 +7948,113 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readdirp@3.6.0: + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.19.0): + dependencies: + acorn: 8.19.0 + acorn-jsx: 5.3.2(acorn@8.19.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: dependencies: - picomatch: 2.3.1 + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 - redent@3.0.0: + regex-recursion@5.1.1: dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 + regex: 5.1.1 + regex-utilities: 2.3.0 - regenerator-runtime@0.14.1: {} + regex-utilities@2.3.0: {} - regexp.prototype.flags@1.5.2: + regex@5.1.1: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 + regex-utilities: 2.3.0 - rehype-expressive-code@0.35.3: + rehype-expressive-code@0.35.6: dependencies: - expressive-code: 0.35.3 + expressive-code: 0.35.6 - rehype-format@5.0.0: + rehype-format@5.0.1: dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.0 - rehype-minify-whitespace: 6.0.0 - unist-util-visit-parents: 6.0.1 + '@types/hast': 3.0.5 + hast-util-format: 1.1.0 - rehype-minify-whitespace@6.0.0: + rehype-parse@9.0.1: dependencies: - '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 + '@types/hast': 3.0.5 + hast-util-from-html: 2.0.3 + unified: 11.0.5 - rehype-parse@9.0.0: + rehype-raw@7.0.0: dependencies: - '@types/hast': 3.0.4 - hast-util-from-html: 2.0.1 - unified: 11.0.4 + '@types/hast': 3.0.5 + hast-util-raw: 9.1.0 + vfile: 6.0.3 - rehype-raw@7.0.0: + rehype-recma@1.0.0: dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.0.3 - vfile: 6.0.1 + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color - rehype-stringify@10.0.0: + rehype-stringify@10.0.1: dependencies: - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.1 - unified: 11.0.4 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + unified: 11.0.5 - rehype@13.0.1: + rehype@13.0.2: dependencies: - '@types/hast': 3.0.4 - rehype-parse: 9.0.0 - rehype-stringify: 10.0.0 - unified: 11.0.4 + '@types/hast': 3.0.5 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 - remark-directive@3.0.0: + remark-directive@3.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-directive: 3.0.0 - micromark-extension-directive: 3.0.0 - unified: 11.0.4 + mdast-util-directive: 3.1.1 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-gfm@4.0.0: + remark-gfm@4.0.1: dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.0.0 + mdast-util-gfm: 3.1.0 micromark-extension-gfm: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-mdx@3.0.1: + remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 @@ -8384,130 +8064,128 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - micromark-util-types: 2.0.0 - unified: 11.0.4 + mdast-util-from-markdown: 2.1.0 + micromark-util-types: 2.0.3 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.0: + remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 - - remark-smartypants@2.1.0: - dependencies: - retext: 8.1.0 - retext-smartypants: 5.2.0 - unist-util-visit: 5.0.0 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 - remark-smartypants@3.0.1: + remark-smartypants@3.0.3: dependencies: retext: 9.0.0 - retext-smartypants: 6.1.0 - unified: 11.0.4 - unist-util-visit: 5.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.2.0 remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + mdast-util-to-markdown: 2.2.1 + unified: 11.0.5 + + request-light@0.5.8: {} request-light@0.7.0: {} require-directory@2.1.1: {} - require-main-filename@2.0.0: {} + require-from-string@2.0.2: {} resolve-alpn@1.2.1: {} resolve-from@5.0.0: {} - resolve.exports@2.0.2: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + resolve-pkg-maps@1.0.0: {} responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 - restore-cursor@4.0.0: + restore-cursor@5.1.0: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - retext-latin@3.1.0: - dependencies: - '@types/nlcst': 1.0.4 - parse-latin: 5.0.1 - unherit: 3.0.1 - unified: 10.1.2 + onetime: 7.0.0 + signal-exit: 4.1.0 retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 parse-latin: 7.0.0 - unified: 11.0.4 - - retext-smartypants@5.2.0: - dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 - unist-util-visit: 4.1.2 + unified: 11.0.5 - retext-smartypants@6.1.0: + retext-smartypants@6.2.0: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 - unist-util-visit: 5.0.0 - - retext-stringify@3.1.0: - dependencies: - '@types/nlcst': 1.0.4 - nlcst-to-string: 3.1.1 - unified: 10.1.2 + unist-util-visit: 5.2.0 retext-stringify@4.0.0: dependencies: '@types/nlcst': 2.0.3 nlcst-to-string: 4.0.0 - unified: 11.0.4 - - retext@8.1.0: - dependencies: - '@types/nlcst': 1.0.4 - retext-latin: 3.1.0 - retext-stringify: 3.1.0 - unified: 10.1.2 + unified: 11.0.5 retext@9.0.0: dependencies: '@types/nlcst': 2.0.3 retext-latin: 4.0.0 retext-stringify: 4.0.0 - unified: 11.0.4 + unified: 11.0.5 - reusify@1.0.4: {} + reusify@1.1.0: {} roarr@2.15.4: dependencies: boolean: 3.2.0 detect-node: 2.1.0 - globalthis: 1.0.3 + globalthis: 1.0.4 json-stringify-safe: 5.0.1 semver-compare: 1.0.0 - sprintf-js: 1.1.2 + sprintf-js: 1.1.3 optional: true + rolldown-plugin-dts@0.28.8(rolldown@1.2.15)(typescript@7.0.2): + dependencies: + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.6 + obug: 3.0.0 + rolldown: 1.2.15 + yuku-ast: 0.19.0 + yuku-codegen: 0.19.0 + yuku-parser: 0.19.0 + optionalDependencies: + typescript: 7.0.2 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.2.15: + dependencies: + '@oxc-project/types': 0.155.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.15 + '@rolldown/binding-android-arm64': 1.2.15 + '@rolldown/binding-darwin-arm64': 1.2.15 + '@rolldown/binding-darwin-x64': 1.2.15 + '@rolldown/binding-freebsd-x64': 1.2.15 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.15 + '@rolldown/binding-linux-arm64-gnu': 1.2.15 + '@rolldown/binding-linux-arm64-musl': 1.2.15 + '@rolldown/binding-linux-ppc64-gnu': 1.2.15 + '@rolldown/binding-linux-s390x-gnu': 1.2.15 + '@rolldown/binding-linux-x64-gnu': 1.2.15 + '@rolldown/binding-linux-x64-musl': 1.2.15 + '@rolldown/binding-openharmony-arm64': 1.2.15 + '@rolldown/binding-win32-arm64-msvc': 1.2.15 + '@rolldown/binding-win32-x64-msvc': 1.2.15 + rollup-plugin-inject@3.0.2: dependencies: estree-walker: 0.6.1 @@ -8522,54 +8200,47 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.17.2: + rollup@4.66.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.66.0 + '@rollup/rollup-android-arm64': 4.66.0 + '@rollup/rollup-darwin-arm64': 4.66.0 + '@rollup/rollup-darwin-x64': 4.66.0 + '@rollup/rollup-freebsd-arm64': 4.66.0 + '@rollup/rollup-freebsd-x64': 4.66.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.66.0 + '@rollup/rollup-linux-arm-musleabihf': 4.66.0 + '@rollup/rollup-linux-arm64-gnu': 4.66.0 + '@rollup/rollup-linux-arm64-musl': 4.66.0 + '@rollup/rollup-linux-loong64-gnu': 4.66.0 + '@rollup/rollup-linux-loong64-musl': 4.66.0 + '@rollup/rollup-linux-ppc64-gnu': 4.66.0 + '@rollup/rollup-linux-ppc64-musl': 4.66.0 + '@rollup/rollup-linux-riscv64-gnu': 4.66.0 + '@rollup/rollup-linux-riscv64-musl': 4.66.0 + '@rollup/rollup-linux-s390x-gnu': 4.66.0 + '@rollup/rollup-linux-x64-gnu': 4.66.0 + '@rollup/rollup-linux-x64-musl': 4.66.0 + '@rollup/rollup-openbsd-x64': 4.66.0 + '@rollup/rollup-openharmony-arm64': 4.66.0 + '@rollup/rollup-win32-arm64-msvc': 4.66.0 + '@rollup/rollup-win32-ia32-msvc': 4.66.0 + '@rollup/rollup-win32-x64-gnu': 4.66.0 + '@rollup/rollup-win32-x64-msvc': 4.66.0 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safer-buffer@2.1.2: {} - sax@1.4.1: {} - - scheduler@0.23.0: - dependencies: - loose-envify: 1.4.0 + sax@1.6.1: {} scheduler@0.23.2: dependencies: @@ -8580,113 +8251,76 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - semver-compare@1.0.0: optional: true - semver@5.7.2: {} - - semver@6.3.0: {} - semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 - - semver@7.6.2: {} + semver@7.8.5: {} serialize-error@7.0.1: dependencies: type-fest: 0.13.1 optional: true - set-blocking@2.0.0: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - sharp@0.32.6: dependencies: color: 4.2.3 - detect-libc: 2.0.3 + detect-libc: 2.1.2 node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.0 + prebuild-install: 7.1.3 + semver: 7.8.5 simple-get: 4.0.1 - tar-fs: 3.0.6 + tar-fs: 3.1.3 tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a - sharp@0.33.4: + sharp@0.33.5: dependencies: color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.2 + detect-libc: 2.1.2 + semver: 7.8.5 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.4 - '@img/sharp-darwin-x64': 0.33.4 - '@img/sharp-libvips-darwin-arm64': 1.0.2 - '@img/sharp-libvips-darwin-x64': 1.0.2 - '@img/sharp-libvips-linux-arm': 1.0.2 - '@img/sharp-libvips-linux-arm64': 1.0.2 - '@img/sharp-libvips-linux-s390x': 1.0.2 - '@img/sharp-libvips-linux-x64': 1.0.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.4 - '@img/sharp-linux-arm64': 0.33.4 - '@img/sharp-linux-s390x': 0.33.4 - '@img/sharp-linux-x64': 0.33.4 - '@img/sharp-linuxmusl-arm64': 0.33.4 - '@img/sharp-linuxmusl-x64': 0.33.4 - '@img/sharp-wasm32': 0.33.4 - '@img/sharp-win32-ia32': 0.33.4 - '@img/sharp-win32-x64': 0.33.4 - optional: true - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} - shiki@1.6.1: - dependencies: - '@shikijs/core': 1.6.1 - - side-channel@1.0.6: + shiki@1.29.2: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - - siginfo@2.0.0: {} - - signal-exit@3.0.7: {} + '@shikijs/core': 1.29.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/langs': 1.29.2 + '@shikijs/themes': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.1.0 + '@types/hast': 3.0.5 signal-exit@4.1.0: {} @@ -8698,90 +8332,60 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 sisteransi@1.0.5: {} - sitemap@7.1.2: + sitemap@9.0.1: dependencies: - '@types/node': 17.0.45 + '@types/node': 24.19.2 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.1 + sax: 1.6.1 slash@3.0.0: {} - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - - source-map-js@1.2.0: {} + source-map-js@1.2.2: {} source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} sourcemap-codec@1.4.8: {} space-separated-tokens@2.0.2: {} - spawndamnit@2.0.0: - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: + spawndamnit@3.0.1: dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - - spdx-license-ids@3.0.17: {} + cross-spawn: 7.0.6 + signal-exit: 4.1.0 sprintf-js@1.0.3: {} - sprintf-js@1.1.2: + sprintf-js@1.1.3: optional: true - stackback@0.0.2: {} - - stacktracey@2.1.8: + stacktracey@2.2.0: dependencies: as-table: 1.0.55 get-source: 2.0.12 - std-env@3.7.0: {} + std-env@4.3.0: {} stdin-discarder@0.2.2: {} stoppable@1.1.0: {} - stream-replace-string@2.0.0: {} - - stream-transform@2.1.3: - dependencies: - mixme: 0.5.10 - - streamx@2.18.0: + streamx@2.28.1: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.1.0 - optionalDependencies: - bare-events: 2.3.1 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-width@4.2.3: dependencies: @@ -8789,36 +8393,11 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string-width@7.1.0: - dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: + string-width@7.2.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + emoji-regex: 10.6.0 + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 string_decoder@1.3.0: dependencies: @@ -8833,110 +8412,103 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.2.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.4.0 strip-bom-string@1.0.0: {} strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@2.0.1: {} - strip-literal@2.1.0: + style-to-js@1.1.21: dependencies: - js-tokens: 9.0.0 + style-to-object: 1.0.14 - style-to-object@0.4.4: + style-to-object@1.0.14: dependencies: - inline-style-parser: 0.1.1 - - style-to-object@1.0.6: - dependencies: - inline-style-parser: 0.2.3 + inline-style-parser: 0.2.7 sumchecker@3.0.1: dependencies: - debug: 4.3.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - superjson@1.12.3: - dependencies: - copy-anything: 3.0.5 - - superjson@2.2.1: + superjson@1.13.3: dependencies: copy-anything: 3.0.5 - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: + superjson@2.2.6: dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} + copy-anything: 4.1.5 - tar-fs@2.1.1: + tar-fs@2.1.5: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.4 tar-stream: 2.2.0 - tar-fs@3.0.6: + tar-fs@3.1.3: dependencies: - pump: 3.0.0 - tar-stream: 3.1.7 + pump: 3.0.4 + tar-stream: 3.2.2 optionalDependencies: - bare-fs: 2.3.0 - bare-path: 2.1.3 + bare-fs: 4.8.4 + bare-path: 3.1.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a tar-stream@2.2.0: dependencies: bl: 4.1.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - tar-stream@3.1.7: + tar-stream@3.2.2: dependencies: - b4a: 1.6.6 + b4a: 1.9.0 + bare-fs: 4.8.4 fast-fifo: 1.3.2 - streamx: 2.18.0 - - term-size@2.2.1: {} + streamx: 2.28.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a - test-exclude@6.0.0: + teex@1.0.1: dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + streamx: 2.28.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + term-size@2.2.1: {} - text-decoder@1.1.0: + text-decoder@1.2.7: dependencies: - b4a: 1.6.6 + b4a: 1.9.0 + transitivePeerDependencies: + - react-native-b4a - tinybench@2.8.0: {} + tinybench@6.2.2: {} - tinypool@0.8.4: {} + tinyexec@0.3.2: {} - tinyspy@2.2.1: {} + tinyexec@1.3.1: {} - tmp@0.0.33: + tinyglobby@0.2.17: dependencies: - os-tmpdir: 1.0.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 - to-fast-properties@2.0.0: {} + tinyrainbow@3.2.0: {} to-regex-range@5.0.1: dependencies: @@ -8944,374 +8516,332 @@ snapshots: tr46@0.0.3: {} - trim-lines@3.0.1: {} + tree-kill@1.2.2: {} - trim-newlines@3.0.1: {} + trim-lines@3.0.1: {} trough@2.2.0: {} - tsconfck@3.1.0(typescript@5.4.5): + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: - typescript: 5.4.5 - - tslib@2.6.2: {} + typescript: 5.9.3 + + tsdown@0.23.3(typescript@7.0.2): + dependencies: + cac: 7.1.0 + defu: 6.1.7 + empathic: 2.1.0 + hookable: 6.1.2 + import-without-cache: 0.4.1 + obug: 3.0.0 + picomatch: 4.0.7 + rolldown: 1.2.15 + rolldown-plugin-dts: 0.28.8(rolldown@1.2.15)(typescript@7.0.2) + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + verkit: 0.5.0 + optionalDependencies: + typescript: 7.0.2 + transitivePeerDependencies: + - '@typescript/native-preview' + - '@volar/typescript' + - '@vue/language-core' + - oxc-resolver + - vue-tsc - tty-table@4.2.3: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 + tslib@2.8.1: {} tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - type-detect@4.0.8: {} - - type-fest@0.13.1: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - - type-fest@2.19.0: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + type-fest@0.13.1: + optional: true - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + type-fest@4.41.0: {} typesafe-path@0.2.2: {} - typescript-auto-import-cache@0.3.2: - dependencies: - semver: 7.6.0 - - typescript@5.4.5: {} - - ufo@1.5.3: {} - - unbox-primitive@1.0.2: + typescript-auto-import-cache@0.3.6: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + semver: 7.8.5 - undici-types@5.26.5: {} + typescript@5.9.3: {} - undici@5.28.4: + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + ufo@1.6.4: {} + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.1.0 + quansync: 1.0.0 + + undici-types@6.21.0: {} + + undici-types@7.24.6: {} + + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 - unherit@3.0.1: {} + undici@7.30.1: + optional: true - unified@10.1.2: + unenv@2.0.0-rc.14: dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 + defu: 6.1.7 + exsolve: 1.2.0 + ohash: 2.0.12 + pathe: 2.0.3 + ufo: 1.6.4 - unified@11.0.4: + unified@11.0.5: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 - - unist-util-find-after@5.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - - unist-util-is@5.2.1: - dependencies: - '@types/unist': 2.0.10 + vfile: 6.0.3 - unist-util-is@6.0.0: + unist-util-is@6.0.1: dependencies: - '@types/unist': 3.0.2 - - unist-util-modify-children@3.1.1: - dependencies: - '@types/unist': 2.0.10 - array-iterate: 2.0.1 + '@types/unist': 3.0.3 unist-util-modify-children@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 array-iterate: 2.0.1 unist-util-position-from-estree@2.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-remove-position@5.0.0: dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 - - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.3 + unist-util-visit: 5.2.0 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 - - unist-util-visit-children@2.0.2: - dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.3 unist-util-visit-children@3.0.0: dependencies: - '@types/unist': 3.0.2 - - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 + '@types/unist': 3.0.3 - unist-util-visit@4.1.2: + unist-util-visit-parents@6.1.0: dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 - unist-util-visit@5.0.0: + unist-util-visit@5.2.0: dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.1.0 universalify@0.1.2: {} - update-browserslist-db@1.0.14(browserslist@4.23.0): - dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 - - use-sync-external-store@1.2.0(react@18.2.0): + update-browserslist-db@1.3.4(browserslist@4.29.5): dependencies: - react: 18.2.0 + browserslist: 4.29.5 + escalade: 3.2.0 + picocolors: 1.1.1 - use-sync-external-store@1.2.0(react@18.3.1): + use-sync-external-store@1.7.0(react@18.3.1): dependencies: react: 18.3.1 util-deprecate@1.0.2: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - vfile-location@5.0.2: - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 + verkit@0.5.0: {} - vfile-message@3.1.4: + vfile-location@5.0.3: dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 + '@types/unist': 3.0.3 + vfile: 6.0.3 - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vfile@5.3.7: + vfile@6.0.3: dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + '@types/unist': 3.0.3 + vfile-message: 4.0.3 - vfile@6.0.1: - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + vite-plugin-electron@0.28.8: {} - vite-node@1.6.0(@types/node@20.12.8): + vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0): dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.2.11(@types/node@20.12.8) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser + esbuild: 0.21.5 + postcss: 8.5.32 + rollup: 4.66.0 + optionalDependencies: + '@types/node': 20.19.43 + fsevents: 2.3.3 + lightningcss: 1.33.0 - vite-plugin-commonjs-externals@0.1.4(vite@5.2.11(@types/node@20.12.8)): + vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0): dependencies: - acorn: 8.11.3 - es-module-lexer: 1.5.2 - magic-string: 0.30.10 - vite: 5.2.11(@types/node@20.12.8) - - vite-plugin-electron@0.28.7: {} + esbuild: 0.21.5 + postcss: 8.5.32 + rollup: 4.66.0 + optionalDependencies: + '@types/node': 24.19.2 + fsevents: 2.3.3 + lightningcss: 1.33.0 - vite@5.2.11(@types/node@20.12.8): + vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.32 + rolldown: 1.2.15 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.12.8 + '@types/node': 24.19.2 fsevents: 2.3.3 + yaml: 2.9.1 - vitefu@0.2.5(vite@5.2.11(@types/node@20.12.8)): + vitefu@1.1.3(vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)): optionalDependencies: - vite: 5.2.11(@types/node@20.12.8) - - vitest@1.6.0(@types/node@20.12.8): - 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.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.10 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.2.11(@types/node@20.12.8) - vite-node: 1.6.0(@types/node@20.12.8) - why-is-node-running: 2.2.2 + vite: 5.4.21(@types/node@24.19.2)(lightningcss@1.33.0) + + vitest@5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)): + dependencies: + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + chai: 6.3.0 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 1.4.5 + obug: 3.0.0 + picomatch: 4.0.7 + std-env: 4.3.0 + tinybench: 6.2.2 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + why-is-node-running: 3.2.1 optionalDependencies: - '@types/node': 20.12.8 + '@types/node': 24.19.2 + '@vitest/coverage-v8': 5.0.5(vitest@5.0.5) transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser + - msw - volar-service-css@0.0.45(@volar/language-service@2.2.5): + volar-service-css@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)): dependencies: - vscode-css-languageservice: 6.2.14 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 + vscode-css-languageservice: 6.3.10 + vscode-languageserver-textdocument: 1.0.16 + vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) - volar-service-emmet@0.0.45(@volar/language-service@2.2.5): + volar-service-emmet@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)): dependencies: - '@emmetio/css-parser': 0.4.0 + '@emmetio/css-parser': 0.4.1 '@emmetio/html-matcher': 1.3.0 - '@vscode/emmet-helper': 2.9.3 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) - volar-service-html@0.0.45(@volar/language-service@2.2.5): + volar-service-html@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)): dependencies: - vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 + vscode-html-languageservice: 5.6.2 + vscode-languageserver-textdocument: 1.0.16 + vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) - volar-service-prettier@0.0.45(@volar/language-service@2.2.5)(prettier@3.2.5): + volar-service-prettier@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3))(prettier@3.9.10): dependencies: - vscode-uri: 3.0.8 + vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.2.5 - prettier: 3.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) + prettier: 3.9.10 - volar-service-typescript-twoslash-queries@0.0.45(@volar/language-service@2.2.5): + volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3))(typescript@5.9.3): + dependencies: + vscode-uri: 3.2.0 optionalDependencies: - '@volar/language-service': 2.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) + typescript: 5.9.3 - volar-service-typescript@0.0.45(@volar/language-service@2.2.5): + volar-service-typescript@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3))(typescript@5.9.3): dependencies: path-browserify: 1.0.1 - semver: 7.6.0 - typescript-auto-import-cache: 0.3.2 - vscode-languageserver-textdocument: 1.0.11 + semver: 7.8.5 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.16 vscode-nls: 5.2.0 + vscode-uri: 3.2.0 + optionalDependencies: + '@volar/language-service': 2.4.30(typescript@5.9.3) + typescript: 5.9.3 + + volar-service-yaml@0.0.71(@volar/language-service@2.4.30(typescript@5.9.3)): + dependencies: + vscode-uri: 3.2.0 + yaml-language-server: 1.23.0 optionalDependencies: - '@volar/language-service': 2.2.5 + '@volar/language-service': 2.4.30(typescript@5.9.3) - vscode-css-languageservice@6.2.14: + vscode-css-languageservice@6.3.10: dependencies: '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-textdocument: 1.0.16 vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 + vscode-uri: 3.2.0 - vscode-html-languageservice@5.2.0: + vscode-html-languageservice@5.6.2: dependencies: '@vscode/l10n': 0.0.18 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-uri: 3.0.8 + vscode-languageserver-textdocument: 1.0.16 + vscode-languageserver-types: 3.18.5 + vscode-uri: 3.2.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.16 + vscode-languageserver-types: 3.18.5 + vscode-nls: 5.2.0 + vscode-uri: 3.2.0 + + vscode-jsonrpc@10.0.0: {} vscode-jsonrpc@8.2.0: {} @@ -9320,23 +8850,24 @@ snapshots: vscode-jsonrpc: 8.2.0 vscode-languageserver-types: 3.17.5 - vscode-languageserver-textdocument@1.0.11: {} + vscode-languageserver-protocol@3.18.5: + dependencies: + vscode-jsonrpc: 10.0.0 + vscode-languageserver-types: 3.18.5 + + vscode-languageserver-textdocument@1.0.16: {} vscode-languageserver-types@3.17.5: {} + vscode-languageserver-types@3.18.5: {} + vscode-languageserver@9.0.1: dependencies: vscode-languageserver-protocol: 3.17.5 vscode-nls@5.2.0: {} - vscode-uri@2.1.2: {} - - vscode-uri@3.0.8: {} - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 + vscode-uri@3.2.0: {} web-namespaces@2.0.1: {} @@ -9347,143 +8878,96 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - 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-module@2.0.1: {} - which-pm-runs@1.1.0: {} - which-pm@2.0.0: - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-pm@2.2.0: + which-pm@3.0.1: dependencies: load-yaml-file: 0.2.0 - path-exists: 4.0.0 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 which@2.0.2: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 + why-is-node-running@3.2.1: {} - widest-line@4.0.1: + widest-line@5.0.0: dependencies: - string-width: 5.1.2 + string-width: 7.2.0 - workerd@1.20240524.0: + workerd@1.20250718.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240524.0 - '@cloudflare/workerd-darwin-arm64': 1.20240524.0 - '@cloudflare/workerd-linux-64': 1.20240524.0 - '@cloudflare/workerd-linux-arm64': 1.20240524.0 - '@cloudflare/workerd-windows-64': 1.20240524.0 + '@cloudflare/workerd-darwin-64': 1.20250718.0 + '@cloudflare/workerd-darwin-arm64': 1.20250718.0 + '@cloudflare/workerd-linux-64': 1.20250718.0 + '@cloudflare/workerd-linux-arm64': 1.20250718.0 + '@cloudflare/workerd-windows-64': 1.20250718.0 - wrangler@3.58.0: + wrangler@3.114.17: dependencies: - '@cloudflare/kv-asset-handler': 0.3.2 + '@cloudflare/kv-asset-handler': 0.3.4 + '@cloudflare/unenv-preset': 2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250718.0) '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 - chokidar: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20240524.1 - nanoid: 3.3.7 - path-to-regexp: 6.2.2 - resolve: 1.22.8 - resolve.exports: 2.0.2 - selfsigned: 2.4.1 - source-map: 0.6.1 - xxhash-wasm: 1.0.2 + miniflare: 3.20250718.3 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.14 + workerd: 1.20250718.0 optionalDependencies: fsevents: 2.3.3 + sharp: 0.33.5 transitivePeerDependencies: - bufferutil - - supports-color - utf-8-validate - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 wrappy@1.0.2: {} - ws@8.17.0: {} - - xxhash-wasm@1.0.2: {} + ws@8.18.0: {} - y18n@4.0.3: {} + xxhash-wasm@1.1.0: {} y18n@5.0.8: {} - yallist@2.1.2: {} - yallist@3.1.1: {} - yallist@4.0.0: {} - - yargs-parser@18.1.3: + yaml-language-server@1.23.0: dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 + '@vscode/l10n': 0.0.18 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + ajv-i18n: 4.2.0(ajv@8.20.0) + prettier: 3.9.10 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.16 + vscode-languageserver-types: 3.18.5 + vscode-uri: 3.2.0 + yaml: 2.8.3 - yargs-parser@21.1.1: {} + yaml@2.8.3: {} - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 + yaml@2.9.1: {} + + yargs-parser@21.1.1: {} - yargs@17.7.2: + yargs@17.7.3: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -9495,24 +8979,57 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} - yocto-queue@1.0.0: {} - - youch@3.3.3: + youch@3.3.4: dependencies: - cookie: 0.5.0 + cookie: 0.7.2 mustache: 4.2.0 - stacktracey: 2.1.8 + stacktracey: 2.2.0 + + yuku-ast@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + + yuku-codegen@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + + yuku-core@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + optionalDependencies: + '@yuku-core/binding-android-arm64': 0.19.0 + '@yuku-core/binding-darwin-arm64': 0.19.0 + '@yuku-core/binding-darwin-x64': 0.19.0 + '@yuku-core/binding-freebsd-x64': 0.19.0 + '@yuku-core/binding-linux-arm-gnu': 0.19.0 + '@yuku-core/binding-linux-arm-musl': 0.19.0 + '@yuku-core/binding-linux-arm64-gnu': 0.19.0 + '@yuku-core/binding-linux-arm64-musl': 0.19.0 + '@yuku-core/binding-linux-x64-gnu': 0.19.0 + '@yuku-core/binding-linux-x64-musl': 0.19.0 + '@yuku-core/binding-win32-arm64': 0.19.0 + '@yuku-core/binding-win32-x64': 0.19.0 + + yuku-parser@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + yuku-core: 0.19.0 + + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 - zod-to-json-schema@3.23.0(zod@3.23.8): + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): dependencies: - zod: 3.23.8 + typescript: 5.9.3 + zod: 3.25.76 - zod@3.21.4: {} + zod@3.22.3: {} - zod@3.23.6: {} + zod@3.25.76: {} - zod@3.23.8: {} + zod@4.6.7: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 180af479..b98e0c39 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,11 @@ packages: - 'examples/*' - 'packages/*' - 'www' + +allowBuilds: + electron: true + esbuild: true + sharp: true + workerd: true +linkWorkspacePackages: true +strictPeerDependencies: false diff --git a/shell.nix b/shell.nix deleted file mode 100644 index e8000d6c..00000000 --- a/shell.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ pkgs ? import (fetchTarball - "https://github.com/NixOS/nixpkgs/archive/8e65989a9972ce1da033f445d2598683590dfb8a.tar.gz") - { } }: - -let - nodejs = pkgs.nodejs_20; - electron = pkgs.electron_30; - pnpm = pkgs.nodePackages.pnpm.overrideAttrs (oldAttrs: rec { - version = "9.15.0"; - src = pkgs.fetchurl { - url = "https://registry.npmjs.org/pnpm/-/pnpm-${version}.tgz"; - sha512 = - "sha512-duI3l2CkMo7EQVgVvNZije5yevN3mqpMkU45RBVsQpmSGon5djge4QfUHxLPpLZmgcqccY8GaPoIMe1MbYulbA=="; - }; - }); -in pkgs.mkShell { - buildInputs = [ - nodejs - electron - pkgs.git - pkgs.xvfb-run - pnpm - ]; - - PLAYWRIGHT_ELECTRON_PATH = "${electron}/bin/electron"; - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = 1; -} From f26321c88bdb6875b0a1a3a85f4cb1089ae5d25e Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 18:06:31 -0400 Subject: [PATCH 13/20] Run e2e tests against Electron from npm. Electron 45 no longer downloads its binary on install, so fetch it with `pnpm install:electron` before running e2e tests or configuring its sandbox in CI, instead of letting parallel test workers race to download it. The dev shell gives nix-ld the libraries that binary loads, along with a matching dynamic linker, so e2e tests run the same Electron locally as in CI. --- .github/workflows/test.yml | 2 ++ flake.nix | 30 ++++++++++++++++++++++++++++++ package.json | 3 ++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2aa58304..c583a011 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,6 +33,8 @@ jobs: cache: 'pnpm' - run: pnpm install --frozen-lockfile - run: pnpm build:code + # Electron downloads its binary on first use, so fetch it before configuring its sandbox. + - run: pnpm install:electron - name: Set up Electron sandbox run: | for sandbox in examples/*/node_modules/electron/dist/chrome-sandbox; do diff --git a/flake.nix b/flake.nix index e4caff20..3b9222fd 100644 --- a/flake.nix +++ b/flake.nix @@ -17,6 +17,34 @@ let pkgs = import nixpkgs { inherit system; }; requiredNodejs = pkgs.nodejs_24; + # Prebuilt Electron from npm runs through nix-ld. It loads these libraries at runtime, with + # the dynamic linker from the same nixpkgs so their glibc versions match. + electronLibraries = with pkgs; [ + alsa-lib + at-spi2-atk + at-spi2-core + atk + cairo + cups + dbus + expat + glib + gtk3 + libdrm + libgbm + libxkbcommon + nspr + nss + pango + systemd + libx11 + libxcomposite + libxdamage + libxext + libxfixes + libxrandr + libxcb + ]; in { devShells.default = @@ -29,6 +57,8 @@ xvfb-run ]; + NIX_LD = pkgs.lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker"; + NIX_LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath electronLibraries; # Playwright only drives Electron, it never needs its own browsers. PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = 1; }; diff --git a/package.json b/package.json index 0b23f74c..3af5f681 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "build": "pnpm -r build", "build:code": "pnpm --filter=!www build", "test": "pnpm -r test", - "test:e2e": "DEBUG=pw:browser* playwright test", + "install:electron": "pnpm --filter \"./examples/*\" --workspace-concurrency=1 exec install-electron", + "test:e2e": "pnpm install:electron && DEBUG=pw:browser* playwright test", "test:ci": "pnpm -r test:ci", "typecheck": "pnpm -r typecheck", "lint": "prettier --check .", From 16bf0aae0be0e986b790c2428a9f39265aae527b Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 18:06:31 -0400 Subject: [PATCH 14/20] Rebuild on tRPC 11 around disposable scopes. The main process tracks everything a renderer has in flight in a tree of disposable scopes: the handler, each webContents, each renderer-side client and each operation. Disposing a scope aborts what is below it, so requests end when their page navigates away, reloads, crashes or closes, or when the handler itself is disposed. - Support tRPC 11, including async generator subscriptions, tracked events and cancellation through the procedure's signal, and require Electron 35. - Identify renderer-side clients, so pages with several clients get the right responses (#201). - Register operations before creating context, so a request stopped early can't leave a subscription running. - Clean up on committed cross-document navigations only, matching frames by frame tree node instead of by a routing id prefix. - Only listen for responses in the renderer while requests are in flight. - Register the preload script with `registerPreloadScript`, on configurable sessions, and unregister it when the handler is disposed. - Typecheck main, renderer and tests separately, and test both halves against each other through a fake Electron. - Update the examples to tRPC 11, React 19 and Vite 8. --- .changeset/disposable-ipc-handler.md | 5 + .changeset/ipc-fixes.md | 5 + .changeset/trpc-11-support.md | 5 + README.md | 72 +- .../basic-react-superjson/electron/api.ts | 31 +- .../basic-react-superjson/electron/index.ts | 15 +- examples/basic-react-superjson/index.e2e.ts | 18 + examples/basic-react-superjson/package.json | 30 +- .../basic-react-superjson/preload/preload.ts | 5 - examples/basic-react-superjson/src/index.tsx | 49 +- examples/basic-react-superjson/tsconfig.json | 4 +- .../vite.config.mts} | 0 examples/basic-react/electron/api.ts | 32 +- examples/basic-react/electron/index.ts | 15 +- examples/basic-react/index.e2e.ts | 14 +- examples/basic-react/package.json | 28 +- examples/basic-react/src/index.tsx | 63 +- examples/basic-react/tsconfig.json | 4 +- .../vite.config.mts} | 6 - examples/basic-vanilla-esm/electron/api.mjs | 31 +- examples/basic-vanilla-esm/electron/index.mjs | 12 +- examples/basic-vanilla-esm/index.e2e.js | 1 - examples/basic-vanilla-esm/package.json | 12 +- .../basic-vanilla-esm/preload/preload.mjs | 3 - examples/basic-vanilla-esm/src/index.mjs | 16 +- examples/manual-preload-react/electron/api.ts | 32 +- .../manual-preload-react/electron/index.ts | 20 +- examples/manual-preload-react/index.e2e.ts | 1 - examples/manual-preload-react/package.json | 28 +- .../manual-preload-react/preload/preload.ts | 8 +- examples/manual-preload-react/src/index.tsx | 63 +- examples/manual-preload-react/tsconfig.json | 4 +- .../vite.config.mts} | 0 packages/electron-trpc/package.json | 12 +- .../src/__tests__/fakeElectron.ts | 236 +++++ .../electron-trpc/src/__tests__/ipc.test.ts | 560 +++++++++++ .../electron-trpc/src/main/ClientScope.ts | 87 ++ .../src/main/WebContentsScope.ts | 94 ++ .../main/__tests__/createIPCHandler.test.ts | 558 ----------- .../main/__tests__/handleIPCMessage.test.ts | 218 ---- .../src/main/__tests__/utils.test.ts | 62 -- .../src/main/createIPCHandler.ts | 203 ++-- .../src/main/handleIPCMessage.ts | 129 --- .../electron-trpc/src/main/handleRequest.ts | 129 +++ packages/electron-trpc/src/main/index.ts | 5 +- .../electron-trpc/src/main/registerPreload.ts | 32 + packages/electron-trpc/src/main/types.ts | 14 +- packages/electron-trpc/src/main/utils.ts | 33 - .../__tests__/exposeElectronTRPC.test.ts | 42 + .../src/preload/exposeElectronTRPC.ts | 16 +- .../src/renderer/__tests__/ipcLink.test.ts | 318 ------ .../electron-trpc/src/renderer/ipcLink.ts | 192 ++-- packages/electron-trpc/src/renderer/utils.ts | 35 - packages/electron-trpc/src/types.ts | 24 +- packages/electron-trpc/tsconfig.json | 16 +- packages/electron-trpc/tsconfig.node.json | 12 + packages/electron-trpc/tsconfig.spec.json | 13 + packages/electron-trpc/tsconfig.web.json | 12 + packages/electron-trpc/tsdown.config.ts | 9 +- packages/electron-trpc/vitest.config.ts | 1 + pnpm-lock.yaml | 939 +++++------------- 61 files changed, 2014 insertions(+), 2619 deletions(-) create mode 100644 .changeset/disposable-ipc-handler.md create mode 100644 .changeset/ipc-fixes.md create mode 100644 .changeset/trpc-11-support.md create mode 100644 examples/basic-react-superjson/index.e2e.ts delete mode 100644 examples/basic-react-superjson/preload/preload.ts rename examples/{basic-react/vite.config.ts => basic-react-superjson/vite.config.mts} (100%) rename examples/{manual-preload-react/vite.config.ts => basic-react/vite.config.mts} (70%) delete mode 100644 examples/basic-vanilla-esm/preload/preload.mjs rename examples/{basic-react-superjson/vite.config.ts => manual-preload-react/vite.config.mts} (100%) create mode 100644 packages/electron-trpc/src/__tests__/fakeElectron.ts create mode 100644 packages/electron-trpc/src/__tests__/ipc.test.ts create mode 100644 packages/electron-trpc/src/main/ClientScope.ts create mode 100644 packages/electron-trpc/src/main/WebContentsScope.ts delete mode 100644 packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts delete mode 100644 packages/electron-trpc/src/main/__tests__/handleIPCMessage.test.ts delete mode 100644 packages/electron-trpc/src/main/__tests__/utils.test.ts delete mode 100644 packages/electron-trpc/src/main/handleIPCMessage.ts create mode 100644 packages/electron-trpc/src/main/handleRequest.ts create mode 100644 packages/electron-trpc/src/main/registerPreload.ts delete mode 100644 packages/electron-trpc/src/main/utils.ts create mode 100644 packages/electron-trpc/src/preload/__tests__/exposeElectronTRPC.test.ts delete mode 100644 packages/electron-trpc/src/renderer/__tests__/ipcLink.test.ts delete mode 100644 packages/electron-trpc/src/renderer/utils.ts create mode 100644 packages/electron-trpc/tsconfig.node.json create mode 100644 packages/electron-trpc/tsconfig.spec.json create mode 100644 packages/electron-trpc/tsconfig.web.json diff --git a/.changeset/disposable-ipc-handler.md b/.changeset/disposable-ipc-handler.md new file mode 100644 index 00000000..8c7c01f9 --- /dev/null +++ b/.changeset/disposable-ipc-handler.md @@ -0,0 +1,5 @@ +--- +'electron-trpc': major +--- + +Breaking change: `createIPCHandler` returns a `Disposable` handler that serves every window, replacing the `windows` option and `attachWindow`/`detachWindow`. `autoRegisterPreload: false` is now `preload: false`, and `preload: { sessions }` registers the preload script on sessions other than the default. Requests are cancelled when their page navigates away, reloads, crashes or closes. diff --git a/.changeset/ipc-fixes.md b/.changeset/ipc-fixes.md new file mode 100644 index 00000000..6585b2ed --- /dev/null +++ b/.changeset/ipc-fixes.md @@ -0,0 +1,5 @@ +--- +'electron-trpc': patch +--- + +Fix responses reaching the wrong client when a page has several (#201), types not resolving with `moduleResolution: bundler` (#229), and `instanceof TRPCClientError` failing in the renderer (#209). diff --git a/.changeset/trpc-11-support.md b/.changeset/trpc-11-support.md new file mode 100644 index 00000000..3b04ffd0 --- /dev/null +++ b/.changeset/trpc-11-support.md @@ -0,0 +1,5 @@ +--- +'electron-trpc': major +--- + +Breaking change: Requires tRPC 11 and Electron 35 or later. Transformers are now passed to `ipcLink`, as with tRPC 11's other links. diff --git a/README.md b/README.md index 1c7b6456..d58e4a07 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ ## Installation +electron-trpc requires Electron 35 or later and tRPC 11. + ```sh # Using pnpm pnpm add electron-trpc @@ -36,68 +38,56 @@ npm install --save electron-trpc ## Basic Setup -1. Add your tRPC router to the Electron main process using `createIPCHandler`: +1. Add your tRPC router to the Electron main process using `createIPCHandler`. It also registers a preload script that exposes electron-trpc to your pages, so create it before loading any: ```ts - import { app } from 'electron'; + import { app, BrowserWindow } from 'electron'; import { createIPCHandler } from 'electron-trpc/main'; import { router } from './api'; app.on('ready', () => { - const win = new BrowserWindow({ - webPreferences: { - contextIsolation: true, // Required for electron-trpc - }, - }); + createIPCHandler({ router }); - createIPCHandler({ router, windows: [win] }); + const win = new BrowserWindow(); + win.loadFile('index.html'); }); ``` - > Note: The preload script is now automatically registered by default. No manual preload configuration needed! + The handler serves every window and cleans up after pages that navigate away or close. It is `Disposable`, so `handler[Symbol.dispose]()` stops it and ends any running subscriptions. -2. If you need to use a custom preload script, you can disable automatic registration: +2. When creating the client in the render process, use `ipcLink` instead of the HTTP or WebSocket links. If your router uses a transformer, pass it to the link: ```ts - createIPCHandler({ - router, - windows: [win], - autoRegisterPreload: false, // Disable automatic preload registration + import { createTRPCClient } from '@trpc/client'; + import { ipcLink } from 'electron-trpc/renderer'; + import superjson from 'superjson'; + import type { AppRouter } from './api'; + + export const client = createTRPCClient({ + links: [ipcLink({ transformer: superjson })], }); ``` - Then manually create a preload file: - - ```ts - import { exposeElectronTRPC } from 'electron-trpc/preload'; +3. Now you can use the client in your render process as you normally would, for example with `@trpc/tanstack-react-query`. - process.once('loaded', async () => { - exposeElectronTRPC(); - }); - ``` +## Preload Script - And specify it in your BrowserWindow: +The preload script is registered on Electron's default session. If your windows use other sessions, pass them instead: - ```ts - const win = new BrowserWindow({ - webPreferences: { - preload: 'path/to/preload.js', - contextIsolation: true, - }, - }); - ``` +```ts +createIPCHandler({ router, preload: { sessions: [session.fromPartition('persist:app')] } }); +``` - > Note: `electron-trpc` depends on `contextIsolation` being enabled, which is the default. +To expose electron-trpc from your own preload script instead, pass `preload: false` and call `exposeElectronTRPC` there: -3. When creating the client in the render process, use the `ipcLink` (instead of the HTTP or batch HTTP links): +```ts +// main process +createIPCHandler({ router, preload: false }); - ```ts - import { createTRPCProxyClient } from '@trpc/client'; - import { ipcLink } from 'electron-trpc/renderer'; +// preload script +import { exposeElectronTRPC } from 'electron-trpc/preload'; - export const client = createTRPCProxyClient({ - links: [ipcLink()], - }); - ``` +exposeElectronTRPC(); +``` -4. Now you can use the client in your render process as you normally would (e.g. using `@trpc/react`). +> Note: `electron-trpc` depends on `contextIsolation` being enabled, which is the default. diff --git a/examples/basic-react-superjson/electron/api.ts b/examples/basic-react-superjson/electron/api.ts index 3a6b6edf..39d8f275 100644 --- a/examples/basic-react-superjson/electron/api.ts +++ b/examples/basic-react-superjson/electron/api.ts @@ -1,34 +1,23 @@ -import z from 'zod'; +import { EventEmitter, on } from 'node:events'; import { initTRPC } from '@trpc/server'; -import { observable } from '@trpc/server/observable'; -import { EventEmitter } from 'events'; import superjson from 'superjson'; +import z from 'zod'; const ee = new EventEmitter(); const t = initTRPC.create({ isServer: true, transformer: superjson }); export const router = t.router({ - greeting: t.procedure.input(z.object({ name: z.string() })).query((req) => { - const { input } = req; - + greeting: t.procedure + .input(z.object({ name: z.string() })) + .query(({ input }) => ({ text: `Hello ${input.name}` as const, greetedAt: new Date() })), + greet: t.procedure.input(z.object({ name: z.string() })).mutation(({ input }) => { ee.emit('greeting', `Greeted ${input.name}`); - return { - text: `Hello ${input.name}` as const, - }; }), - subscription: t.procedure.subscription(() => { - return observable((emit) => { - function onGreet(text: string) { - emit.next({ text }); - } - - ee.on('greeting', onGreet); - - return () => { - ee.off('greeting', onGreet); - }; - }); + greetings: t.procedure.subscription(async function* ({ signal }) { + for await (const [text] of on(ee, 'greeting', { signal })) { + yield { text: text as string, at: new Date() }; + } }), }); diff --git a/examples/basic-react-superjson/electron/index.ts b/examples/basic-react-superjson/electron/index.ts index 62973aff..d23e1a96 100644 --- a/examples/basic-react-superjson/electron/index.ts +++ b/examples/basic-react-superjson/electron/index.ts @@ -3,25 +3,18 @@ import { app, BrowserWindow } from 'electron'; import { createIPCHandler } from 'electron-trpc/main'; import { router } from './api'; -process.env.DIST = path.join(__dirname, '../dist'); -process.env.PUBLIC = app.isPackaged ? process.env.DIST : path.join(process.env.DIST, '../public'); - -const preload = path.join(__dirname, './preload.js'); const url = process.env['VITE_DEV_SERVER_URL']; app.on('ready', () => { - const win = new BrowserWindow({ - webPreferences: { - preload, - }, - }); + // Registers the electron-trpc preload script, so it has to happen before any page loads. + createIPCHandler({ router }); - createIPCHandler({ router, windows: [win] }); + const win = new BrowserWindow(); if (url) { win.loadURL(url); } else { - win.loadFile(path.join(process.env.DIST, 'index.html')); + win.loadFile(path.join(__dirname, '../dist/index.html')); } win.show(); diff --git a/examples/basic-react-superjson/index.e2e.ts b/examples/basic-react-superjson/index.e2e.ts new file mode 100644 index 00000000..0aad96d9 --- /dev/null +++ b/examples/basic-react-superjson/index.e2e.ts @@ -0,0 +1,18 @@ +import { _electron as electron, test, expect } from '@playwright/test'; + +test('Hello Electron with superjson', async () => { + const electronApp = await electron.launch({ + args: [`${__dirname}`], + env: { + ...process.env, + NODE_ENV: 'development', + }, + }); + + const window = await electronApp.firstWindow(); + await window.waitForLoadState('load'); + await expect(window.getByTestId('greeting')).toHaveText('Hello Electron'); + await expect(window.getByTestId('greeted-year')).toHaveText(String(new Date().getFullYear())); + + await electronApp.close(); +}); diff --git a/examples/basic-react-superjson/package.json b/examples/basic-react-superjson/package.json index c4031631..d343ad67 100644 --- a/examples/basic-react-superjson/package.json +++ b/examples/basic-react-superjson/package.json @@ -10,23 +10,23 @@ "typecheck": "tsc" }, "dependencies": { - "@tanstack/react-query": "^4.29.14", - "@trpc/client": "10.33.1", - "@trpc/react-query": "10.33.1", - "@trpc/server": "10.33.1", - "electron": "29.3.2", + "@tanstack/react-query": "^5.105.0", + "@trpc/client": "11.19.0", + "@trpc/server": "11.19.0", + "@trpc/tanstack-react-query": "11.19.0", + "electron": "^45.1.0", "electron-trpc": "workspace:*", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "superjson": "^1.12.3", - "zod": "^3.21.4" + "react": "^19.3.1", + "react-dom": "^19.3.1", + "zod": "^4.6.7", + "superjson": "^2.2.6" }, "devDependencies": { - "@types/node": "^20.12.8", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.2.11", - "vite-plugin-electron": "^0.28.7" + "@types/node": "^24.9.0", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.2", + "vite": "^8.3.5", + "vite-plugin-electron": "^1.1.2" } } diff --git a/examples/basic-react-superjson/preload/preload.ts b/examples/basic-react-superjson/preload/preload.ts deleted file mode 100644 index 5e5f754c..00000000 --- a/examples/basic-react-superjson/preload/preload.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { exposeElectronTRPC } from 'electron-trpc/preload'; - -process.once('loaded', async () => { - exposeElectronTRPC(); -}); diff --git a/examples/basic-react-superjson/src/index.tsx b/examples/basic-react-superjson/src/index.tsx index 4a226100..a7e94438 100644 --- a/examples/basic-react-superjson/src/index.tsx +++ b/examples/basic-react-superjson/src/index.tsx @@ -1,44 +1,49 @@ -import React, { useState } from 'react'; -import ReactDom from 'react-dom'; +import { useState } from 'react'; +import { createRoot } from 'react-dom/client'; +import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query'; +import { createTRPCClient } from '@trpc/client'; +import { createTRPCContext, useSubscription } from '@trpc/tanstack-react-query'; import { ipcLink } from 'electron-trpc/renderer'; import superjson from 'superjson'; -import { createTRPCReact } from '@trpc/react-query'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { AppRouter } from '../electron/api'; -const trpcReact = createTRPCReact(); +const { TRPCProvider, useTRPC } = createTRPCContext(); function App() { const [queryClient] = useState(() => new QueryClient()); const [trpcClient] = useState(() => - trpcReact.createClient({ - links: [ipcLink()], - transformer: superjson, - }) + createTRPCClient({ links: [ipcLink({ transformer: superjson })] }) ); return ( - - + + - - + + ); } function HelloElectron() { - const { data } = trpcReact.greeting.useQuery({ name: 'Electron' }); - trpcReact.subscription.useSubscription(undefined, { - onData: (data) => { - console.log(data); - }, - }); + const trpc = useTRPC(); + const greeting = useQuery(trpc.greeting.queryOptions({ name: 'Electron' })); + useSubscription( + trpc.greetings.subscriptionOptions(undefined, { + onData: ({ text, at }) => console.log(text, at.toISOString()), + }) + ); - if (!data) { + if (!greeting.data) { return null; } - return
{data.text}
; + return ( + <> +
{greeting.data.text}
+ {/* superjson turns this back into a `Date`, so it has `getFullYear`. */} +
{greeting.data.greetedAt.getFullYear()}
+ + ); } -ReactDom.render(, document.getElementById('react-root')); +createRoot(document.getElementById('react-root')!).render(); diff --git a/examples/basic-react-superjson/tsconfig.json b/examples/basic-react-superjson/tsconfig.json index 64311e42..8e19f453 100644 --- a/examples/basic-react-superjson/tsconfig.json +++ b/examples/basic-react-superjson/tsconfig.json @@ -3,7 +3,7 @@ "alwaysStrict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "jsx": "react", + "jsx": "react-jsx", "lib": ["dom", "esnext"], "module": "esnext", "moduleResolution": "bundler", @@ -17,6 +17,6 @@ "strict": true, "target": "esnext" }, - "include": ["./*.ts", "./*.tsx"], + "include": ["./*.ts", "./*.mts", "./*.tsx"], "exclude": ["node_modules"] } diff --git a/examples/basic-react/vite.config.ts b/examples/basic-react-superjson/vite.config.mts similarity index 100% rename from examples/basic-react/vite.config.ts rename to examples/basic-react-superjson/vite.config.mts diff --git a/examples/basic-react/electron/api.ts b/examples/basic-react/electron/api.ts index 1e3e6d92..c33c516f 100644 --- a/examples/basic-react/electron/api.ts +++ b/examples/basic-react/electron/api.ts @@ -1,33 +1,23 @@ -import z from 'zod'; +import { EventEmitter, on } from 'node:events'; import { initTRPC } from '@trpc/server'; -import { observable } from '@trpc/server/observable'; -import { EventEmitter } from 'events'; +import z from 'zod'; const ee = new EventEmitter(); const t = initTRPC.create({ isServer: true }); export const router = t.router({ - greeting: t.procedure.input(z.object({ name: z.string() })).query((req) => { - const { input } = req; - + greeting: t.procedure + .input(z.object({ name: z.string() })) + .query(({ input }) => ({ text: `Hello ${input.name}` as const })), + greet: t.procedure.input(z.object({ name: z.string() })).mutation(({ input }) => { ee.emit('greeting', `Greeted ${input.name}`); - return { - text: `Hello ${input.name}` as const, - }; + return { subscribers: ee.listenerCount('greeting') }; }), - subscription: t.procedure.subscription(() => { - return observable((emit) => { - function onGreet(text: string) { - emit.next({ text }); - } - - ee.on('greeting', onGreet); - - return () => { - ee.off('greeting', onGreet); - }; - }); + greetings: t.procedure.subscription(async function* ({ signal }) { + for await (const [text] of on(ee, 'greeting', { signal })) { + yield { text: text as string }; + } }), }); diff --git a/examples/basic-react/electron/index.ts b/examples/basic-react/electron/index.ts index 66069f78..d23e1a96 100644 --- a/examples/basic-react/electron/index.ts +++ b/examples/basic-react/electron/index.ts @@ -3,25 +3,18 @@ import { app, BrowserWindow } from 'electron'; import { createIPCHandler } from 'electron-trpc/main'; import { router } from './api'; -process.env.DIST = path.join(__dirname, '../dist'); -process.env.PUBLIC = app.isPackaged ? process.env.DIST : path.join(process.env.DIST, '../public'); - const url = process.env['VITE_DEV_SERVER_URL']; app.on('ready', () => { - const win = new BrowserWindow({ - webPreferences: { - // Context isolation is required for electron-trpc - contextIsolation: true, - }, - }); + // Registers the electron-trpc preload script, so it has to happen before any page loads. + createIPCHandler({ router }); - createIPCHandler({ router, windows: [win] }); + const win = new BrowserWindow(); if (url) { win.loadURL(url); } else { - win.loadFile(path.join(process.env.DIST!, 'index.html')); + win.loadFile(path.join(__dirname, '../dist/index.html')); } win.show(); diff --git a/examples/basic-react/index.e2e.ts b/examples/basic-react/index.e2e.ts index 44250bee..c96e7d96 100644 --- a/examples/basic-react/index.e2e.ts +++ b/examples/basic-react/index.e2e.ts @@ -3,7 +3,6 @@ import { _electron as electron, test, expect } from '@playwright/test'; test('Hello Electron', async () => { const electronApp = await electron.launch({ args: [`${__dirname}`], - executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH || undefined, env: { ...process.env, NODE_ENV: 'development', @@ -13,9 +12,18 @@ test('Hello Electron', async () => { const window = await electronApp.firstWindow(); await window.waitForLoadState('load'); expect(await window.title()).toBe('Hello from Electron renderer!'); + await expect(window.getByTestId('greeting')).toHaveText('Hello Electron'); - const response = await window.textContent('[data-testid="greeting"]'); - expect(response).toBe('Hello Electron'); + // Subscribe, then trigger an event from the main process. + await window.getByTestId('greet').click(); + await expect(window.getByTestId('greetings')).toHaveText('Greeted Electron'); + await expect(window.getByTestId('subscribers')).toHaveText('Subscribers: 1'); + + // Reloading replaces the document, which has to end its subscription in the main process. + await window.reload(); + await window.getByTestId('greet').click(); + await expect(window.getByTestId('greetings')).toHaveText('Greeted Electron'); + await expect(window.getByTestId('subscribers')).toHaveText('Subscribers: 1'); await electronApp.close(); }); diff --git a/examples/basic-react/package.json b/examples/basic-react/package.json index 44e55ac1..42f6284b 100644 --- a/examples/basic-react/package.json +++ b/examples/basic-react/package.json @@ -10,22 +10,22 @@ "typecheck": "tsc" }, "dependencies": { - "@tanstack/react-query": "^4.29.14", - "@trpc/client": "10.33.1", - "@trpc/react-query": "10.33.1", - "@trpc/server": "10.33.1", - "electron": "29.3.2", + "@tanstack/react-query": "^5.105.0", + "@trpc/client": "11.19.0", + "@trpc/server": "11.19.0", + "@trpc/tanstack-react-query": "11.19.0", + "electron": "^45.1.0", "electron-trpc": "workspace:*", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "zod": "^3.21.4" + "react": "^19.3.1", + "react-dom": "^19.3.1", + "zod": "^4.6.7" }, "devDependencies": { - "@types/node": "^20.12.8", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.2.11", - "vite-plugin-electron": "^0.28.7" + "@types/node": "^24.9.0", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.2", + "vite": "^8.3.5", + "vite-plugin-electron": "^1.1.2" } } diff --git a/examples/basic-react/src/index.tsx b/examples/basic-react/src/index.tsx index 4efe1a86..2029e063 100644 --- a/examples/basic-react/src/index.tsx +++ b/examples/basic-react/src/index.tsx @@ -1,42 +1,59 @@ -import React, { useState } from 'react'; -import ReactDom from 'react-dom'; +import { useState } from 'react'; +import { createRoot } from 'react-dom/client'; +import { QueryClient, QueryClientProvider, useMutation, useQuery } from '@tanstack/react-query'; +import { createTRPCClient } from '@trpc/client'; +import { createTRPCContext, useSubscription } from '@trpc/tanstack-react-query'; import { ipcLink } from 'electron-trpc/renderer'; -import { createTRPCReact } from '@trpc/react-query'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { AppRouter } from '../electron/api'; -const trpcReact = createTRPCReact(); +const { TRPCProvider, useTRPC } = createTRPCContext(); function App() { const [queryClient] = useState(() => new QueryClient()); - const [trpcClient] = useState(() => - trpcReact.createClient({ - links: [ipcLink()], - }) - ); + const [trpcClient] = useState(() => createTRPCClient({ links: [ipcLink()] })); return ( - - + + - - + + ); } function HelloElectron() { - const { data } = trpcReact.greeting.useQuery({ name: 'Electron' }); - trpcReact.subscription.useSubscription(undefined, { - onData: (data) => { - console.log(data); - }, - }); + const trpc = useTRPC(); + const greeting = useQuery(trpc.greeting.queryOptions({ name: 'Electron' })); + const greet = useMutation(trpc.greet.mutationOptions()); + const [greetings, setGreetings] = useState([]); + const subscription = useSubscription( + trpc.greetings.subscriptionOptions(undefined, { + onData: ({ text }) => setGreetings((previous) => [...previous, text]), + }) + ); - if (!data) { + if (!greeting.data) { return null; } - return
{data.text}
; + return ( + <> +
{greeting.data.text}
+ + {greet.data &&
Subscribers: {greet.data.subscribers}
} +
    + {greetings.map((text, index) => ( +
  • {text}
  • + ))} +
+ + ); } -ReactDom.render(, document.getElementById('react-root')); +createRoot(document.getElementById('react-root')!).render(); diff --git a/examples/basic-react/tsconfig.json b/examples/basic-react/tsconfig.json index 64311e42..8e19f453 100644 --- a/examples/basic-react/tsconfig.json +++ b/examples/basic-react/tsconfig.json @@ -3,7 +3,7 @@ "alwaysStrict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "jsx": "react", + "jsx": "react-jsx", "lib": ["dom", "esnext"], "module": "esnext", "moduleResolution": "bundler", @@ -17,6 +17,6 @@ "strict": true, "target": "esnext" }, - "include": ["./*.ts", "./*.tsx"], + "include": ["./*.ts", "./*.mts", "./*.tsx"], "exclude": ["node_modules"] } diff --git a/examples/manual-preload-react/vite.config.ts b/examples/basic-react/vite.config.mts similarity index 70% rename from examples/manual-preload-react/vite.config.ts rename to examples/basic-react/vite.config.mts index 03d72670..31d505cc 100644 --- a/examples/manual-preload-react/vite.config.ts +++ b/examples/basic-react/vite.config.mts @@ -10,12 +10,6 @@ export default defineConfig({ { entry: 'electron/index.ts', }, - { - entry: 'preload/preload.ts', - onstart(options) { - options.reload(); - }, - }, ]), ], }); diff --git a/examples/basic-vanilla-esm/electron/api.mjs b/examples/basic-vanilla-esm/electron/api.mjs index 3ea11c56..0faa153f 100644 --- a/examples/basic-vanilla-esm/electron/api.mjs +++ b/examples/basic-vanilla-esm/electron/api.mjs @@ -1,32 +1,21 @@ -import z from 'zod'; +import { EventEmitter, on } from 'node:events'; import { initTRPC } from '@trpc/server'; -import { observable } from '@trpc/server/observable'; -import { EventEmitter } from 'events'; +import z from 'zod'; const ee = new EventEmitter(); const t = initTRPC.create({ isServer: true }); export const router = t.router({ - greeting: t.procedure.input(z.object({ name: z.string() })).query((req) => { - const { input } = req; - + greeting: t.procedure + .input(z.object({ name: z.string() })) + .query(({ input }) => ({ text: `Hello ${input.name}` })), + greet: t.procedure.input(z.object({ name: z.string() })).mutation(({ input }) => { ee.emit('greeting', `Greeted ${input.name}`); - return { - text: `Hello ${input.name}`, - }; }), - subscription: t.procedure.subscription(() => { - return observable((emit) => { - function onGreet(text) { - emit.next({ text }); - } - - ee.on('greeting', onGreet); - - return () => { - ee.off('greeting', onGreet); - }; - }); + greetings: t.procedure.subscription(async function* ({ signal }) { + for await (const [text] of on(ee, 'greeting', { signal })) { + yield { text }; + } }), }); diff --git a/examples/basic-vanilla-esm/electron/index.mjs b/examples/basic-vanilla-esm/electron/index.mjs index fe39737f..ec33d16c 100644 --- a/examples/basic-vanilla-esm/electron/index.mjs +++ b/examples/basic-vanilla-esm/electron/index.mjs @@ -9,16 +9,10 @@ const dirname = path.dirname(fileURLToPath(import.meta.url)); const html = path.join(dirname, '../dist/index.html'); app.on('ready', () => { - const win = new BrowserWindow({ - webPreferences: { - // Context isolation is required for electron-trpc - contextIsolation: true, - // No preload script needed - it will be auto-registered! - }, - }); + // Registers the electron-trpc preload script, so it has to happen before any page loads. + createIPCHandler({ router }); - // The autoRegisterPreload option defaults to true now - createIPCHandler({ router, windows: [win] }); + const win = new BrowserWindow(); win.loadFile(html); diff --git a/examples/basic-vanilla-esm/index.e2e.js b/examples/basic-vanilla-esm/index.e2e.js index 2cfb1e90..49ea33a7 100644 --- a/examples/basic-vanilla-esm/index.e2e.js +++ b/examples/basic-vanilla-esm/index.e2e.js @@ -7,7 +7,6 @@ const dirname = path.dirname(fileURLToPath(import.meta.url)); test('Hello Electron', async () => { const electronApp = await electron.launch({ args: [dirname], - executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH || undefined, env: { ...process.env, NODE_ENV: 'development', diff --git a/examples/basic-vanilla-esm/package.json b/examples/basic-vanilla-esm/package.json index 710b503b..3516e614 100644 --- a/examples/basic-vanilla-esm/package.json +++ b/examples/basic-vanilla-esm/package.json @@ -10,14 +10,14 @@ "build": "vite build" }, "dependencies": { - "@trpc/client": "10.33.1", - "@trpc/server": "10.33.1", - "electron": "29.3.2", + "@trpc/client": "11.19.0", + "@trpc/server": "11.19.0", + "electron": "^45.1.0", "electron-trpc": "workspace:*", - "vite": "^5.2.11", - "zod": "^3.21.4" + "vite": "^8.3.5", + "zod": "^4.6.7" }, "devDependencies": { - "@types/node": "^20.12.8" + "@types/node": "^24.9.0" } } diff --git a/examples/basic-vanilla-esm/preload/preload.mjs b/examples/basic-vanilla-esm/preload/preload.mjs deleted file mode 100644 index 73cd474c..00000000 --- a/examples/basic-vanilla-esm/preload/preload.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import { exposeElectronTRPC } from 'electron-trpc/preload'; - -exposeElectronTRPC(); diff --git a/examples/basic-vanilla-esm/src/index.mjs b/examples/basic-vanilla-esm/src/index.mjs index 06d95ed1..7a681499 100644 --- a/examples/basic-vanilla-esm/src/index.mjs +++ b/examples/basic-vanilla-esm/src/index.mjs @@ -1,15 +1,13 @@ +import { createTRPCClient } from '@trpc/client'; import { ipcLink } from 'electron-trpc/renderer'; -import { createTRPCProxyClient } from '@trpc/client'; -const trpc = createTRPCProxyClient({ +const trpc = createTRPCClient({ links: [ipcLink()], }); async function writeGreeting() { const greeting = await trpc.greeting.query({ name: 'Electron' }); - console.log('greeting', greeting); - const div = document.createElement('div'); div.innerText = greeting.text; div.setAttribute('data-testid', 'greeting'); @@ -17,13 +15,13 @@ async function writeGreeting() { document.body.appendChild(div); } -async function listenForSubscription() { - trpc.subscription.subscribe(undefined, { - onData: (data) => { - console.log(data); +function listenForGreetings() { + trpc.greetings.subscribe(undefined, { + onData: ({ text }) => { + console.log(text); }, }); } writeGreeting(); -listenForSubscription(); +listenForGreetings(); diff --git a/examples/manual-preload-react/electron/api.ts b/examples/manual-preload-react/electron/api.ts index 1e3e6d92..c33c516f 100644 --- a/examples/manual-preload-react/electron/api.ts +++ b/examples/manual-preload-react/electron/api.ts @@ -1,33 +1,23 @@ -import z from 'zod'; +import { EventEmitter, on } from 'node:events'; import { initTRPC } from '@trpc/server'; -import { observable } from '@trpc/server/observable'; -import { EventEmitter } from 'events'; +import z from 'zod'; const ee = new EventEmitter(); const t = initTRPC.create({ isServer: true }); export const router = t.router({ - greeting: t.procedure.input(z.object({ name: z.string() })).query((req) => { - const { input } = req; - + greeting: t.procedure + .input(z.object({ name: z.string() })) + .query(({ input }) => ({ text: `Hello ${input.name}` as const })), + greet: t.procedure.input(z.object({ name: z.string() })).mutation(({ input }) => { ee.emit('greeting', `Greeted ${input.name}`); - return { - text: `Hello ${input.name}` as const, - }; + return { subscribers: ee.listenerCount('greeting') }; }), - subscription: t.procedure.subscription(() => { - return observable((emit) => { - function onGreet(text: string) { - emit.next({ text }); - } - - ee.on('greeting', onGreet); - - return () => { - ee.off('greeting', onGreet); - }; - }); + greetings: t.procedure.subscription(async function* ({ signal }) { + for await (const [text] of on(ee, 'greeting', { signal })) { + yield { text: text as string }; + } }), }); diff --git a/examples/manual-preload-react/electron/index.ts b/examples/manual-preload-react/electron/index.ts index 6c033cb0..eec65b17 100644 --- a/examples/manual-preload-react/electron/index.ts +++ b/examples/manual-preload-react/electron/index.ts @@ -3,32 +3,22 @@ import { app, BrowserWindow } from 'electron'; import { createIPCHandler } from 'electron-trpc/main'; import { router } from './api'; -process.env.DIST = path.join(__dirname, '../dist'); -process.env.PUBLIC = app.isPackaged ? process.env.DIST : path.join(process.env.DIST, '../public'); - -const preload = path.join(__dirname, './preload.js'); const url = process.env['VITE_DEV_SERVER_URL']; app.on('ready', () => { + // This app exposes electron-trpc from its own preload script instead. + createIPCHandler({ router, preload: false }); + const win = new BrowserWindow({ webPreferences: { - preload, - // Context isolation is required for electron-trpc - contextIsolation: true, + preload: path.join(__dirname, './preload.js'), }, }); - // Explicitly disable automatic preload registration - createIPCHandler({ - router, - windows: [win], - autoRegisterPreload: false, - }); - if (url) { win.loadURL(url); } else { - win.loadFile(path.join(process.env.DIST!, 'index.html')); + win.loadFile(path.join(__dirname, '../dist/index.html')); } win.show(); diff --git a/examples/manual-preload-react/index.e2e.ts b/examples/manual-preload-react/index.e2e.ts index 44250bee..f583c5d6 100644 --- a/examples/manual-preload-react/index.e2e.ts +++ b/examples/manual-preload-react/index.e2e.ts @@ -3,7 +3,6 @@ import { _electron as electron, test, expect } from '@playwright/test'; test('Hello Electron', async () => { const electronApp = await electron.launch({ args: [`${__dirname}`], - executablePath: process.env.PLAYWRIGHT_ELECTRON_PATH || undefined, env: { ...process.env, NODE_ENV: 'development', diff --git a/examples/manual-preload-react/package.json b/examples/manual-preload-react/package.json index ed1b8abb..d3548151 100644 --- a/examples/manual-preload-react/package.json +++ b/examples/manual-preload-react/package.json @@ -10,22 +10,22 @@ "typecheck": "tsc" }, "dependencies": { - "@tanstack/react-query": "^4.29.14", - "@trpc/client": "10.33.1", - "@trpc/react-query": "10.33.1", - "@trpc/server": "10.33.1", - "electron": "29.3.2", + "@tanstack/react-query": "^5.105.0", + "@trpc/client": "11.19.0", + "@trpc/server": "11.19.0", + "@trpc/tanstack-react-query": "11.19.0", + "electron": "^45.1.0", "electron-trpc": "workspace:*", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "zod": "^3.21.4" + "react": "^19.3.1", + "react-dom": "^19.3.1", + "zod": "^4.6.7" }, "devDependencies": { - "@types/node": "^20.12.8", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.2.11", - "vite-plugin-electron": "^0.28.7" + "@types/node": "^24.9.0", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.2", + "vite": "^8.3.5", + "vite-plugin-electron": "^1.1.2" } } diff --git a/examples/manual-preload-react/preload/preload.ts b/examples/manual-preload-react/preload/preload.ts index 10e82efa..12bbcc34 100644 --- a/examples/manual-preload-react/preload/preload.ts +++ b/examples/manual-preload-react/preload/preload.ts @@ -1,7 +1,5 @@ -// This example demonstrates manual preload script configuration -// The automatic preload registration is disabled in electron/index.ts +// With `preload: false`, the app's own preload script exposes electron-trpc, alongside anything +// else it exposes to the renderer. import { exposeElectronTRPC } from 'electron-trpc/preload'; -process.once('loaded', async () => { - exposeElectronTRPC(); -}); +exposeElectronTRPC(); diff --git a/examples/manual-preload-react/src/index.tsx b/examples/manual-preload-react/src/index.tsx index 4efe1a86..2029e063 100644 --- a/examples/manual-preload-react/src/index.tsx +++ b/examples/manual-preload-react/src/index.tsx @@ -1,42 +1,59 @@ -import React, { useState } from 'react'; -import ReactDom from 'react-dom'; +import { useState } from 'react'; +import { createRoot } from 'react-dom/client'; +import { QueryClient, QueryClientProvider, useMutation, useQuery } from '@tanstack/react-query'; +import { createTRPCClient } from '@trpc/client'; +import { createTRPCContext, useSubscription } from '@trpc/tanstack-react-query'; import { ipcLink } from 'electron-trpc/renderer'; -import { createTRPCReact } from '@trpc/react-query'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { AppRouter } from '../electron/api'; -const trpcReact = createTRPCReact(); +const { TRPCProvider, useTRPC } = createTRPCContext(); function App() { const [queryClient] = useState(() => new QueryClient()); - const [trpcClient] = useState(() => - trpcReact.createClient({ - links: [ipcLink()], - }) - ); + const [trpcClient] = useState(() => createTRPCClient({ links: [ipcLink()] })); return ( - - + + - - + + ); } function HelloElectron() { - const { data } = trpcReact.greeting.useQuery({ name: 'Electron' }); - trpcReact.subscription.useSubscription(undefined, { - onData: (data) => { - console.log(data); - }, - }); + const trpc = useTRPC(); + const greeting = useQuery(trpc.greeting.queryOptions({ name: 'Electron' })); + const greet = useMutation(trpc.greet.mutationOptions()); + const [greetings, setGreetings] = useState([]); + const subscription = useSubscription( + trpc.greetings.subscriptionOptions(undefined, { + onData: ({ text }) => setGreetings((previous) => [...previous, text]), + }) + ); - if (!data) { + if (!greeting.data) { return null; } - return
{data.text}
; + return ( + <> +
{greeting.data.text}
+ + {greet.data &&
Subscribers: {greet.data.subscribers}
} +
    + {greetings.map((text, index) => ( +
  • {text}
  • + ))} +
+ + ); } -ReactDom.render(, document.getElementById('react-root')); +createRoot(document.getElementById('react-root')!).render(); diff --git a/examples/manual-preload-react/tsconfig.json b/examples/manual-preload-react/tsconfig.json index 64311e42..8e19f453 100644 --- a/examples/manual-preload-react/tsconfig.json +++ b/examples/manual-preload-react/tsconfig.json @@ -3,7 +3,7 @@ "alwaysStrict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "jsx": "react", + "jsx": "react-jsx", "lib": ["dom", "esnext"], "module": "esnext", "moduleResolution": "bundler", @@ -17,6 +17,6 @@ "strict": true, "target": "esnext" }, - "include": ["./*.ts", "./*.tsx"], + "include": ["./*.ts", "./*.mts", "./*.tsx"], "exclude": ["node_modules"] } diff --git a/examples/basic-react-superjson/vite.config.ts b/examples/manual-preload-react/vite.config.mts similarity index 100% rename from examples/basic-react-superjson/vite.config.ts rename to examples/manual-preload-react/vite.config.mts diff --git a/packages/electron-trpc/package.json b/packages/electron-trpc/package.json index 82739258..4bc5f7fd 100644 --- a/packages/electron-trpc/package.json +++ b/packages/electron-trpc/package.json @@ -63,13 +63,13 @@ "build": "tsdown", "test": "vitest", "test:ci": "vitest run --coverage", - "typecheck": "tsc", + "typecheck": "tsc -b", "copy:readme": "cp ../../README.md ./", "prepublishOnly": "pnpm copy:readme && pnpm build" }, "devDependencies": { - "@trpc/client": "10.45.2", - "@trpc/server": "10.45.2", + "@trpc/client": "11.19.0", + "@trpc/server": "11.19.0", "@types/debug": "^4.1.13", "@types/node": "^24.9.0", "@vitest/coverage-v8": "^5.0.5", @@ -81,9 +81,9 @@ "zod": "^4.6.7" }, "peerDependencies": { - "@trpc/client": ">10.0.0", - "@trpc/server": ">10.0.0", - "electron": ">19.0.0" + "@trpc/client": "^11.10.0", + "@trpc/server": "^11.10.0", + "electron": ">=35.0.0" }, "dependencies": { "debug": "^4.4.3" diff --git a/packages/electron-trpc/src/__tests__/fakeElectron.ts b/packages/electron-trpc/src/__tests__/fakeElectron.ts new file mode 100644 index 00000000..ec873990 --- /dev/null +++ b/packages/electron-trpc/src/__tests__/fakeElectron.ts @@ -0,0 +1,236 @@ +/** + * Just enough of Electron to run the main and renderer halves of electron-trpc against each other. + * Messages are structured-cloned and delivered on a later task, like real IPC. + */ +import { EventEmitter } from 'node:events'; +import { vi } from 'vitest'; +import type { Mock } from 'vitest'; +import { ELECTRON_TRPC_CHANNEL } from '../constants'; +import type { ETRPCRequest, ETRPCResponse, RendererGlobalElectronTRPC } from '../types'; + +let nextId = 1; +const framesByRoutingId = new Map(); + +const deliver = (fn: () => void) => setTimeout(fn, 0); + +/** Waits for every message sent so far, and the work it triggers, to be delivered. */ +export const flush = async (rounds = 5) => { + for (let i = 0; i < rounds; i++) await new Promise((resolve) => setTimeout(resolve, 0)); +}; + +export const ipcMain = new EventEmitter(); + +export class FakeSession { + readonly preloads = new Map(); + readonly registerPreloadScript = vi.fn(({ filePath }: { filePath: string }) => { + const id = `preload-${nextId++}`; + this.preloads.set(id, filePath); + return id; + }); + readonly unregisterPreloadScript = vi.fn((id: string) => { + this.preloads.delete(id); + }); +} + +export const session = { defaultSession: new FakeSession() }; + +export const webFrameMain = { + fromId: (processId: number, routingId: number) => + framesByRoutingId.get(`${processId}:${routingId}`), +}; + +export const ipcRenderer: EventEmitter & { send: Mock } = Object.assign(new EventEmitter(), { + send: vi.fn(), +}); +export const contextBridge: { exposeInMainWorld: Mock } = { exposeInMainWorld: vi.fn() }; + +/** One page loaded in a frame, with the `electronTRPC` global the preload script would expose. */ +export class FakeDocument { + readonly #listeners = new Set<(response: ETRPCResponse) => void>(); + readonly electronTRPC: RendererGlobalElectronTRPC; + alive = true; + + constructor(readonly frame: FakeFrame) { + this.electronTRPC = { + sendMessage: (request: ETRPCRequest) => { + if (!this.alive) return; + const message = structuredClone(request); + deliver(() => frame.receiveFromDocument(this, message)); + }, + onMessage: (callback) => { + this.#listeners.add(callback); + return () => { + this.#listeners.delete(callback); + }; + }, + }; + } + + get listenerCount(): number { + return this.#listeners.size; + } + + receive(response: ETRPCResponse) { + if (!this.alive) return; + for (const listener of [...this.#listeners]) listener(response); + } + + /** Runs `fn` with this document's `electronTRPC` as the global, e.g. to create a client. */ + run(fn: () => T): T { + const global = globalThis as { electronTRPC?: RendererGlobalElectronTRPC }; + const previous = global.electronTRPC; + global.electronTRPC = this.electronTRPC; + try { + return fn(); + } finally { + global.electronTRPC = previous; + } + } +} + +export class FakeFrame { + readonly frameToken = `frame-token-${nextId++}`; + document: FakeDocument = new FakeDocument(this); + detached = false; + destroyed = false; + + constructor( + readonly webContents: FakeWebContents, + readonly processId: number, + readonly routingId: number, + readonly frameTreeNodeId: number + ) { + framesByRoutingId.set(`${processId}:${routingId}`, this); + } + + isDestroyed() { + return this.destroyed; + } + + send(channel: string, response: ETRPCResponse) { + if (channel !== ELECTRON_TRPC_CHANNEL || this.detached || this.destroyed) return; + const message = structuredClone(response); + const document = this.document; + deliver(() => document.receive(message)); + } + + receiveFromDocument(document: FakeDocument, request: ETRPCRequest) { + const gone = this.detached || this.destroyed || this.document !== document; + const event = { sender: this.webContents, senderFrame: gone ? null : this }; + ipcMain.emit(ELECTRON_TRPC_CHANNEL, event, request); + } + + replaceDocument() { + this.document.alive = false; + this.document = new FakeDocument(this); + } + + remove() { + this.document.alive = false; + this.detached = true; + this.destroyed = true; + } +} + +export class FakeWebContents extends EventEmitter { + readonly id = nextId++; + readonly processId = nextId++; + mainFrame: FakeFrame; + subframes: FakeFrame[] = []; + destroyed = false; + + constructor() { + super(); + this.mainFrame = new FakeFrame(this, this.processId, nextId++, nextId++); + } + + isDestroyed() { + return this.destroyed; + } + + addSubframe(routingId: number = nextId++): FakeFrame { + const frame = new FakeFrame(this, this.processId, routingId, nextId++); + this.subframes.push(frame); + return frame; + } + + /** + * Commits a cross-document navigation in `frame`. With `newHost`, the new document gets a new + * frame host, as with a cross-process navigation, and the old one is detached. + */ + navigate(frame: FakeFrame, { newHost = false } = {}): FakeFrame { + const isMainFrame = frame === this.mainFrame; + let target = frame; + + if (newHost) { + frame.remove(); + target = new FakeFrame(this, nextId++, nextId++, frame.frameTreeNodeId); + } else { + frame.replaceDocument(); + } + + if (isMainFrame) { + this.mainFrame = target; + for (const subframe of this.subframes) subframe.remove(); + this.subframes = []; + } else if (newHost) { + this.subframes = this.subframes.map((subframe) => (subframe === frame ? target : subframe)); + } + + this.emit( + 'did-frame-navigate', + {}, + 'app://next', + 200, + 'OK', + isMainFrame, + target.processId, + target.routingId + ); + return target; + } + + /** A navigation that starts but never commits, such as a download or a 204 response. */ + startNavigation(frame: FakeFrame) { + this.emit('did-start-navigation', { + isSameDocument: false, + isMainFrame: frame === this.mainFrame, + frame, + }); + } + + navigateInPage(frame: FakeFrame) { + this.emit('did-start-navigation', { + isSameDocument: true, + isMainFrame: frame === this.mainFrame, + frame, + }); + this.emit( + 'did-navigate-in-page', + {}, + 'app://same#hash', + frame === this.mainFrame, + frame.processId, + frame.routingId + ); + } + + crash() { + for (const frame of [this.mainFrame, ...this.subframes]) frame.document.alive = false; + this.emit('render-process-gone', {}, { reason: 'crashed', exitCode: 1 }); + } + + destroy() { + for (const frame of [this.mainFrame, ...this.subframes]) frame.remove(); + this.destroyed = true; + this.emit('destroyed'); + } +} + +export const reset = () => { + ipcMain.removeAllListeners(); + ipcRenderer.removeAllListeners(); + framesByRoutingId.clear(); + session.defaultSession = new FakeSession(); + vi.clearAllMocks(); +}; diff --git a/packages/electron-trpc/src/__tests__/ipc.test.ts b/packages/electron-trpc/src/__tests__/ipc.test.ts new file mode 100644 index 00000000..e637565f --- /dev/null +++ b/packages/electron-trpc/src/__tests__/ipc.test.ts @@ -0,0 +1,560 @@ +import { EventEmitter, on } from 'node:events'; +import { createTRPCClient, TRPCClientError } from '@trpc/client'; +import { initTRPC, tracked, TRPCError } from '@trpc/server'; +import { observable } from '@trpc/server/observable'; +import superjson from 'superjson'; +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import z from 'zod'; +import { createIPCHandler } from '../main'; +import type { CreateIPCHandlerOptions, IPCHandler } from '../main'; +import { ipcLink } from '../renderer'; +import { ELECTRON_TRPC_CHANNEL } from '../constants'; +import type { ETRPCRequest } from '../types'; +import { + FakeDocument, + FakeSession, + FakeWebContents, + flush, + ipcMain, + reset, + session, +} from './fakeElectron'; + +vi.mock('electron', () => import('./fakeElectron')); + +const createRouter = () => { + const t = initTRPC.context<{ webContentsId: number }>().create(); + const ee = new EventEmitter(); + const probe = { + aborted: [] as string[], + finished: [] as string[], + contextRequested: Promise.withResolvers(), + releaseContext: Promise.withResolvers(), + }; + + const router = t.router({ + echo: t.procedure.input(z.string()).query(({ input }) => input), + whoami: t.procedure.query(({ ctx }) => ctx.webContentsId), + add: t.procedure + .input(z.object({ a: z.number(), b: z.number() })) + .mutation(({ input }) => input.a + input.b), + forbidden: t.procedure.query(() => { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Not allowed' }); + }), + hang: t.procedure.input(z.string()).query( + ({ input, signal }) => + new Promise((resolve) => { + signal?.addEventListener('abort', () => { + probe.aborted.push(input); + resolve(null); + }); + }) + ), + streamedQuery: t.procedure.query(async function* () { + yield 1; + }), + events: t.procedure.input(z.string()).subscription(async function* ({ input, signal }) { + try { + for await (const [value] of on(ee, 'event', { signal })) yield value as string; + } catch (cause) { + if (!signal?.aborted) throw cause; + } finally { + probe.finished.push(input); + } + }), + count: t.procedure.input(z.number()).subscription(async function* ({ input }) { + for (let i = 1; i <= input; i++) yield i; + }), + trackedCount: t.procedure.input(z.number()).subscription(async function* ({ input }) { + for (let i = 1; i <= input; i++) yield tracked(`event-${i}`, i); + }), + failing: t.procedure.subscription(async function* () { + yield 'first'; + throw new TRPCError({ code: 'CONFLICT', message: 'Stream broke' }); + }), + observed: t.procedure.subscription(() => + observable((emit) => { + emit.next(1); + emit.next(2); + return () => probe.finished.push('observed'); + }) + ), + }); + + return { router, ee, probe }; +}; + +type AppRouter = ReturnType['router']; + +const createClient = (document: FakeDocument) => + document.run(() => createTRPCClient({ links: [ipcLink()] })); + +let handler: IPCHandler | undefined; +const startHandler = (options: Partial> = {}) => { + const app = createRouter(); + handler = createIPCHandler({ + router: app.router, + createContext: ({ event }) => ({ webContentsId: event.sender.id }), + ...options, + }); + return app; +}; + +beforeEach(() => reset()); +afterEach(() => { + handler?.[Symbol.dispose](); + handler = undefined; +}); + +describe('procedures', () => { + test('runs queries and mutations', async () => { + startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + await expect(client.echo.query('hello')).resolves.toBe('hello'); + await expect(client.add.mutate({ a: 2, b: 3 })).resolves.toBe(5); + }); + + test('creates context from the IPC event', async () => { + startHandler(); + const contents = new FakeWebContents(); + + await expect(createClient(contents.mainFrame.document).whoami.query()).resolves.toBe( + contents.id + ); + }); + + test('rejects with a TRPCClientError carrying the error shape', async () => { + const onError = vi.fn(); + startHandler({ onError }); + const client = createClient(new FakeWebContents().mainFrame.document); + + const error = await client.forbidden.query().catch((cause) => cause); + + expect(error).toBeInstanceOf(TRPCClientError); + expect(error.message).toBe('Not allowed'); + expect(error.data).toMatchObject({ code: 'FORBIDDEN', path: 'forbidden' }); + expect(onError).toHaveBeenCalledWith( + expect.objectContaining({ path: 'forbidden', type: 'query', error: expect.any(TRPCError) }) + ); + }); + + test('reports input validation errors', async () => { + startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + // @ts-expect-error -- deliberately invalid input + const error = await client.echo.query(42).catch((cause) => cause); + + expect(error).toBeInstanceOf(TRPCClientError); + expect(error.data).toMatchObject({ code: 'BAD_REQUEST' }); + }); + + test('rejects queries that return an async iterable', async () => { + startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + const error = await client.streamedQuery.query().catch((cause) => cause); + + expect(error.data).toMatchObject({ code: 'UNSUPPORTED_MEDIA_TYPE' }); + }); + + test('aborts the procedure when the caller aborts', async () => { + const { probe } = startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + const controller = new AbortController(); + + const result = client.hang.query('aborted query', { signal: controller.signal }); + await flush(); + controller.abort(); + + await expect(result).rejects.toThrow(); + await vi.waitFor(() => expect(probe.aborted).toEqual(['aborted query'])); + }); +}); + +describe('transformers', () => { + test('round-trips inputs and outputs through superjson', async () => { + const t = initTRPC.create({ transformer: superjson }); + const router = t.router({ + roundTrip: t.procedure + .input(z.object({ date: z.date(), big: z.bigint(), set: z.set(z.string()) })) + .query(({ input }) => input), + }); + handler = createIPCHandler({ router }); + const document = new FakeWebContents().mainFrame.document; + const client = document.run(() => + createTRPCClient({ links: [ipcLink({ transformer: superjson })] }) + ); + + const input = { date: new Date('2000-01-01T01:23:45Z'), big: 12345n, set: new Set(['a']) }; + + await expect(client.roundTrip.query(input)).resolves.toEqual(input); + }); + + test('requires the transformer when the router has one', () => { + const t = initTRPC.create({ transformer: superjson }); + const router = t.router({}); + + // @ts-expect-error -- the router has a transformer, so the link needs it too + ipcLink(); + // @ts-expect-error -- and a router without one doesn't accept it + ipcLink({ transformer: superjson }); + }); +}); + +describe('subscriptions', () => { + const collect = ( + subscribe: (handlers: { + onStarted: () => void; + onData: (value: T) => void; + onError: (error: unknown) => void; + onComplete: () => void; + }) => { unsubscribe: () => void } + ) => { + const state = { + started: false, + values: [] as T[], + error: undefined as unknown, + complete: false, + }; + const subscription = subscribe({ + onStarted: () => (state.started = true), + onData: (value) => state.values.push(value), + onError: (error) => (state.error = error), + onComplete: () => (state.complete = true), + }); + return Object.assign(state, { unsubscribe: () => subscription.unsubscribe() }); + }; + + test('streams values from an async generator until it returns', async () => { + startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + const sub = collect((handlers) => client.count.subscribe(3, handlers)); + + await vi.waitFor(() => expect(sub.complete).toBe(true)); + expect(sub.started).toBe(true); + expect(sub.values).toEqual([1, 2, 3]); + }); + + test('passes tracked event ids through', async () => { + startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + const sub = collect<{ id: string; data: number }>((handlers) => + client.trackedCount.subscribe(2, handlers) + ); + + await vi.waitFor(() => expect(sub.complete).toBe(true)); + expect(sub.values).toEqual([ + { id: 'event-1', data: 1 }, + { id: 'event-2', data: 2 }, + ]); + }); + + test('supports observables', async () => { + const { probe } = startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + const sub = collect((handlers) => client.observed.subscribe(undefined, handlers)); + await vi.waitFor(() => expect(sub.values).toEqual([1, 2])); + sub.unsubscribe(); + + await vi.waitFor(() => expect(probe.finished).toEqual(['observed'])); + }); + + test('delivers an error thrown mid-stream', async () => { + startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + const sub = collect((handlers) => client.failing.subscribe(undefined, handlers)); + + await vi.waitFor(() => expect(sub.error).toBeInstanceOf(TRPCClientError)); + expect(sub.values).toEqual(['first']); + expect((sub.error as TRPCClientError).data).toMatchObject({ code: 'CONFLICT' }); + }); + + test('stops the generator when the renderer unsubscribes', async () => { + const { ee, probe } = startHandler(); + const client = createClient(new FakeWebContents().mainFrame.document); + + const sub = collect((handlers) => client.events.subscribe('sub', handlers)); + await vi.waitFor(() => expect(sub.started).toBe(true)); + ee.emit('event', 'one'); + await vi.waitFor(() => expect(sub.values).toEqual(['one'])); + + sub.unsubscribe(); + await vi.waitFor(() => expect(probe.finished).toEqual(['sub'])); + + ee.emit('event', 'two'); + await flush(); + expect(sub.values).toEqual(['one']); + }); + + test('stops a subscription that is cancelled while its context is still being created', async () => { + const app = createRouter(); + handler = createIPCHandler({ + router: app.router, + createContext: async ({ event }) => { + app.probe.contextRequested.resolve(); + await app.probe.releaseContext.promise; + return { webContentsId: event.sender.id }; + }, + }); + const client = createClient(new FakeWebContents().mainFrame.document); + + const sub = collect((handlers) => client.events.subscribe('early stop', handlers)); + await app.probe.contextRequested.promise; + sub.unsubscribe(); + await flush(); + app.probe.releaseContext.resolve(); + await flush(); + + app.ee.emit('event', 'too late'); + await flush(); + expect(sub.values).toEqual([]); + expect(app.ee.listenerCount('event')).toBe(0); + }); +}); + +describe('clients', () => { + test('routes responses to the client that made the request', async () => { + startHandler(); + const document = new FakeWebContents().mainFrame.document; + const first = createClient(document); + const second = createClient(document); + + // Both clients number their operations from the same starting id. + const results = await Promise.all([first.echo.query('first'), second.echo.query('second')]); + + expect(results).toEqual(['first', 'second']); + }); + + test('only listens for responses while requests are in flight', async () => { + const { ee } = startHandler(); + const document = new FakeWebContents().mainFrame.document; + const client = createClient(document); + expect(document.listenerCount).toBe(0); + + await client.echo.query('hello'); + expect(document.listenerCount).toBe(0); + + const subscription = client.events.subscribe('sub', {}); + expect(document.listenerCount).toBe(1); + await flush(); + ee.emit('event', 'value'); + subscription.unsubscribe(); + expect(document.listenerCount).toBe(0); + }); +}); + +describe('protocol', () => { + const hang = (id: number, input: string, clientId = 'client'): ETRPCRequest => ({ + method: 'request', + clientId, + operation: { id, type: 'query', path: 'hang', input }, + }); + + // Operations still running when the handler is disposed get aborted, so this lists them. + const runningOperations = async (probe: { aborted: string[] }) => { + handler![Symbol.dispose](); + handler = undefined; + await flush(); + return probe.aborted; + }; + + test('ignores requests that reuse a client id from another frame', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + const subframe = contents.addSubframe(); + + contents.mainFrame.document.electronTRPC.sendMessage(hang(1, 'main frame')); + await flush(); + subframe.document.electronTRPC.sendMessage(hang(2, 'subframe')); + await flush(); + + expect(await runningOperations(probe)).toEqual(['main frame']); + }); + + test('ignores a request that reuses an operation id still in flight', async () => { + const { probe } = startHandler(); + const { electronTRPC } = new FakeWebContents().mainFrame.document; + + electronTRPC.sendMessage(hang(1, 'first')); + electronTRPC.sendMessage(hang(1, 'duplicate')); + await flush(); + + expect(await runningOperations(probe)).toEqual(['first']); + }); +}); + +describe('document lifetimes', () => { + const subscribe = (document: FakeDocument, name: string) => + createClient(document).events.subscribe(name, {}); + + test('stops subscriptions when the main frame navigates to a new document', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + subscribe(contents.mainFrame.document, 'main'); + subscribe(contents.addSubframe().document, 'subframe'); + await flush(); + + contents.navigate(contents.mainFrame); + + await vi.waitFor(() => expect(probe.finished.sort()).toEqual(['main', 'subframe'])); + }); + + test('stops subscriptions when the new document gets a new frame host', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + subscribe(contents.mainFrame.document, 'main'); + await flush(); + + contents.navigate(contents.mainFrame, { newHost: true }); + + await vi.waitFor(() => expect(probe.finished).toEqual(['main'])); + }); + + test('only stops subscriptions in the subframe that navigated', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + // Routing ids 2 and 23 share a prefix, which used to stop both. + const navigating = contents.addSubframe(2); + subscribe(navigating.document, 'navigating'); + subscribe(contents.addSubframe(23).document, 'sibling'); + subscribe(contents.mainFrame.document, 'main'); + await flush(); + + contents.navigate(navigating); + + await vi.waitFor(() => expect(probe.finished).toEqual(['navigating'])); + await flush(); + expect(probe.finished).toEqual(['navigating']); + }); + + test('keeps subscriptions through same-document and uncommitted navigations', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + subscribe(contents.mainFrame.document, 'main'); + await flush(); + + contents.navigateInPage(contents.mainFrame); + contents.startNavigation(contents.mainFrame); + await flush(); + + expect(probe.finished).toEqual([]); + }); + + test('does not deliver responses to the next document in the frame', async () => { + const { ee } = startHandler(); + const contents = new FakeWebContents(); + const values: string[] = []; + createClient(contents.mainFrame.document).events.subscribe('old', { + onData: (value) => values.push(value), + }); + await flush(); + + contents.navigate(contents.mainFrame); + const next = contents.mainFrame.document; + createClient(next).events.subscribe('new', {}); + await flush(); + ee.emit('event', 'after navigation'); + await flush(); + + expect(values).toEqual([]); + }); + + test('stops subscriptions when the renderer process crashes', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + subscribe(contents.mainFrame.document, 'main'); + await flush(); + + contents.crash(); + + await vi.waitFor(() => expect(probe.finished).toEqual(['main'])); + }); + + test('stops subscriptions and stops listening when the webContents is destroyed', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + subscribe(contents.mainFrame.document, 'main'); + await flush(); + + contents.destroy(); + + await vi.waitFor(() => expect(probe.finished).toEqual(['main'])); + expect(contents.listenerCount('did-frame-navigate')).toBe(0); + expect(contents.listenerCount('render-process-gone')).toBe(0); + }); + + test('ignores requests from a frame that is already gone', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + const frame = contents.addSubframe(); + const client = createClient(frame.document); + + void client.hang.query('from a removed frame').catch(() => {}); + frame.detached = true; + frame.destroyed = true; + await flush(); + + expect(probe.aborted).toEqual([]); + }); +}); + +describe('handler lifetime', () => { + test('stops everything and stops listening when disposed', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + createClient(contents.mainFrame.document).events.subscribe('main', {}); + await flush(); + + handler![Symbol.dispose](); + handler = undefined; + + await vi.waitFor(() => expect(probe.finished).toEqual(['main'])); + expect(ipcMain.listenerCount(ELECTRON_TRPC_CHANNEL)).toBe(0); + expect(contents.listenerCount('did-frame-navigate')).toBe(0); + }); + + test('allows only one active handler', () => { + startHandler(); + const { router } = createRouter(); + + expect(() => createIPCHandler({ router })).toThrow(/already active/); + + handler![Symbol.dispose](); + handler = createIPCHandler({ router }); + }); + + test('registers the preload script on the default session until disposed', () => { + startHandler(); + const { defaultSession } = session; + + expect(defaultSession.registerPreloadScript).toHaveBeenCalledWith({ + type: 'frame', + filePath: expect.stringMatching(/preload-auto\.cjs$/), + }); + expect(defaultSession.preloads.size).toBe(1); + + handler![Symbol.dispose](); + handler = undefined; + expect(defaultSession.preloads.size).toBe(0); + }); + + test('registers the preload script on the given sessions instead', () => { + const sessions = [new FakeSession(), new FakeSession()]; + startHandler({ preload: { sessions: sessions as unknown as Electron.Session[] } }); + + expect(session.defaultSession.registerPreloadScript).not.toHaveBeenCalled(); + expect(sessions.map((s) => s.preloads.size)).toEqual([1, 1]); + }); + + test('does not register the preload script with `preload: false`', () => { + startHandler({ preload: false }); + + expect(session.defaultSession.registerPreloadScript).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/electron-trpc/src/main/ClientScope.ts b/packages/electron-trpc/src/main/ClientScope.ts new file mode 100644 index 00000000..7e815623 --- /dev/null +++ b/packages/electron-trpc/src/main/ClientScope.ts @@ -0,0 +1,87 @@ +import type { WebFrameMain } from 'electron'; +import type { TRPCResponseMessage } from '@trpc/server/rpc'; +import debugFactory from 'debug'; +import { ELECTRON_TRPC_CHANNEL } from '../constants'; +import type { ETRPCResponse } from '../types'; + +const debug = debugFactory('electron-trpc:main:ClientScope'); + +/** + * A single in-flight procedure call. Disposing it aborts its signal, which is passed to the + * procedure, and stops any further responses from reaching the renderer. + */ +export class Operation implements Disposable { + readonly #controller = new AbortController(); + + constructor( + readonly id: number, + private readonly client: ClientScope + ) {} + + get signal(): AbortSignal { + return this.#controller.signal; + } + + send(message: TRPCResponseMessage) { + if (this.signal.aborted) return; + this.client.send(message); + } + + [Symbol.dispose]() { + this.#controller.abort(); + this.client.release(this); + } +} + +/** + * Everything one renderer-side client has in flight. A client lives in a single frame, so it is + * disposed when that frame navigates away or is destroyed. + */ +export class ClientScope implements Disposable { + readonly #operations = new Map(); + + constructor( + readonly frame: WebFrameMain, + readonly clientId: string, + private readonly onEmpty: (client: ClientScope) => void + ) {} + + /** Whether the frame this client lives in still exists in the frame tree. */ + get isLive(): boolean { + return !this.frame.isDestroyed() && !this.frame.detached; + } + + /** Starts tracking an operation, or returns `undefined` if its id is already in flight. */ + start(id: number): Operation | undefined { + if (this.#operations.has(id)) { + debug('Ignoring duplicate operation id', this.clientId, id); + return undefined; + } + + const operation = new Operation(id, this); + this.#operations.set(id, operation); + return operation; + } + + stop(id: number) { + this.#operations.get(id)?.[Symbol.dispose](); + } + + send(message: TRPCResponseMessage) { + if (!this.isLive) return; + const response: ETRPCResponse = { clientId: this.clientId, message }; + this.frame.send(ELECTRON_TRPC_CHANNEL, response); + } + + release(operation: Operation) { + if (this.#operations.get(operation.id) !== operation) return; + this.#operations.delete(operation.id); + if (this.#operations.size === 0) this.onEmpty(this); + } + + [Symbol.dispose]() { + for (const operation of [...this.#operations.values()]) { + operation[Symbol.dispose](); + } + } +} diff --git a/packages/electron-trpc/src/main/WebContentsScope.ts b/packages/electron-trpc/src/main/WebContentsScope.ts new file mode 100644 index 00000000..5e127c02 --- /dev/null +++ b/packages/electron-trpc/src/main/WebContentsScope.ts @@ -0,0 +1,94 @@ +import { webFrameMain } from 'electron'; +import type { WebContents, WebFrameMain } from 'electron'; +import debugFactory from 'debug'; +import { ClientScope } from './ClientScope'; + +const debug = debugFactory('electron-trpc:main:WebContentsScope'); + +const isSameFrame = (a: WebFrameMain, b: WebFrameMain) => + a.processId === b.processId && a.frameToken === b.frameToken; + +/** + * The clients of every document in one `WebContents`. Clients are disposed when the document they + * belong to goes away: a cross-document navigation in their frame or the main frame, a crashed + * renderer, or the `WebContents` being destroyed. + */ +export class WebContentsScope implements Disposable { + readonly #clients = new Map(); + readonly #stack = new DisposableStack(); + + constructor( + readonly webContents: WebContents, + onDestroyed: () => void + ) { + const onFrameNavigate = ( + _event: Electron.Event, + _url: string, + _httpResponseCode: number, + _httpStatusText: string, + isMainFrame: boolean, + frameProcessId: number, + frameRoutingId: number + ) => { + if (isMainFrame) { + debug('Main frame navigated', webContents.id); + this.#disposeClients(() => true); + return; + } + + const frameTreeNodeId = webFrameMain.fromId(frameProcessId, frameRoutingId)?.frameTreeNodeId; + debug('Subframe navigated', webContents.id, frameTreeNodeId); + // Subframes of the navigated frame are gone too, and show up as detached or destroyed. + this.#disposeClients( + (client) => !client.isLive || client.frame.frameTreeNodeId === frameTreeNodeId + ); + }; + const onRenderProcessGone = () => { + debug('Render process gone', webContents.id); + this.#disposeClients(() => true); + }; + + webContents.on('did-frame-navigate', onFrameNavigate); + webContents.on('render-process-gone', onRenderProcessGone); + webContents.once('destroyed', onDestroyed); + this.#stack.defer(() => { + webContents.off('did-frame-navigate', onFrameNavigate); + webContents.off('render-process-gone', onRenderProcessGone); + webContents.off('destroyed', onDestroyed); + }); + this.#stack.defer(() => this.#disposeClients(() => true)); + } + + /** Returns the client for a message, or `undefined` if the id belongs to another frame. */ + findClient(frame: WebFrameMain, clientId: string): ClientScope | undefined { + const client = this.#clients.get(clientId); + if (client && !isSameFrame(client.frame, frame)) { + debug('Ignoring message for a client in another frame', clientId); + return undefined; + } + return client; + } + + /** Like `findClient`, but creates the client the first time it sends a request. */ + client(frame: WebFrameMain, clientId: string): ClientScope | undefined { + if (this.#clients.has(clientId)) return this.findClient(frame, clientId); + + const client = new ClientScope(frame, clientId, (empty) => { + if (this.#clients.get(clientId) === empty) this.#clients.delete(clientId); + }); + this.#clients.set(clientId, client); + return client; + } + + #disposeClients(predicate: (client: ClientScope) => boolean) { + for (const [clientId, client] of [...this.#clients]) { + if (!predicate(client)) continue; + this.#clients.delete(clientId); + client[Symbol.dispose](); + } + } + + [Symbol.dispose]() { + this.#stack.dispose(); + } +} diff --git a/packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts b/packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts deleted file mode 100644 index 06174b2f..00000000 --- a/packages/electron-trpc/src/main/__tests__/createIPCHandler.test.ts +++ /dev/null @@ -1,558 +0,0 @@ -import { describe, it, expect, vi, beforeEach, MockedFunction } from 'vitest'; -import { BrowserWindow, ipcMain, IpcMainEvent, WebContents, WebFrameMain, session } from 'electron'; -import { createIPCHandler } from '../createIPCHandler'; -import { ELECTRON_TRPC_CHANNEL } from '../../constants'; -import { ETRPCRequest } from '../../types'; -import { handleIPCMessage } from '../handleIPCMessage'; -import { initTRPC } from '@trpc/server'; - -vi.mock('../handleIPCMessage', () => ({ - handleIPCMessage: vi.fn(), -})); - -vi.mock('electron', () => ({ - ipcMain: { - on: vi.fn(), - }, - session: { - defaultSession: { - getPreloads: vi.fn(() => []), - setPreloads: vi.fn(), - }, - }, -})); - -interface MockWebContents { - id: number; - on: MockedFunction<(event: string, handler: any) => void>; - isDestroyed: () => boolean; -} - -interface MockWebFrameMain { - routingId: number; -} - -interface MockBrowserWindow { - id: number; - webContents: MockWebContents; - isDestroyed: () => boolean; -} - -interface MockIpcMainEvent { - sender: MockWebContents & { id: number }; - senderFrame: MockWebFrameMain; - reply: MockedFunction<(channel: string, ...args: any[]) => void>; -} - -const makeBrowserWindow = (window: MockBrowserWindow) => window as unknown as BrowserWindow; -const makeIpcMainEvent = (event: MockIpcMainEvent) => event as unknown as IpcMainEvent; - -describe('IPCHandler', () => { - let mockHandleIPCMessage: MockedFunction; - let ipcMainHandler: ((event: IpcMainEvent, request: ETRPCRequest) => void) | undefined; - - beforeEach(() => { - vi.clearAllMocks(); - mockHandleIPCMessage = vi.mocked(handleIPCMessage); - ipcMainHandler = undefined; - - vi.mocked(ipcMain.on).mockImplementation((channel, handler) => { - if (channel === ELECTRON_TRPC_CHANNEL) { - ipcMainHandler = handler; - } - return ipcMain; - }); - }); - - describe('constructor', () => { - it('should register ipcMain handler', () => { - const t = initTRPC.create(); - const router = t.router({}); - - createIPCHandler({ router }); - - expect(ipcMain.on).toHaveBeenCalledWith(ELECTRON_TRPC_CHANNEL, expect.any(Function)); - }); - - it('should attach initial windows', () => { - const t = initTRPC.create(); - const router = t.router({}); - - const mockWindow1: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - const mockWindow2: MockBrowserWindow = { - id: 2, - webContents: { - id: 102, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - createIPCHandler({ - router, - windows: [makeBrowserWindow(mockWindow1), makeBrowserWindow(mockWindow2)], - }); - - expect(mockWindow1.webContents.on).toHaveBeenCalledWith( - 'did-start-navigation', - expect.any(Function) - ); - expect(mockWindow1.webContents.on).toHaveBeenCalledWith('destroyed', expect.any(Function)); - expect(mockWindow2.webContents.on).toHaveBeenCalledWith( - 'did-start-navigation', - expect.any(Function) - ); - expect(mockWindow2.webContents.on).toHaveBeenCalledWith('destroyed', expect.any(Function)); - }); - - it('should pass createContext to handleIPCMessage', () => { - const t = initTRPC.create(); - const router = t.router({}); - const createContext = vi.fn().mockResolvedValue({ user: 'test' }); - - createIPCHandler({ router, createContext }); - - const mockEvent: MockIpcMainEvent = { - sender: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - senderFrame: { - routingId: 1, - }, - reply: vi.fn(), - }; - - const request: ETRPCRequest = { - method: 'request', - operation: { - id: 1, - type: 'query', - path: 'test.query', - input: undefined, - context: {}, - }, - }; - - ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); - - expect(mockHandleIPCMessage).toHaveBeenCalledWith({ - router, - createContext, - internalId: '101-1:1', - event: expect.any(Object), - message: request, - subscriptions: expect.any(Map), - }); - }); - }); - - describe('attachWindow', () => { - it('should attach a new window', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - handler.attachWindow(makeBrowserWindow(mockWindow)); - - expect(mockWindow.webContents.on).toHaveBeenCalledWith( - 'did-start-navigation', - expect.any(Function) - ); - expect(mockWindow.webContents.on).toHaveBeenCalledWith('destroyed', expect.any(Function)); - }); - - it('should not attach the same window twice', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - const browserWindow = makeBrowserWindow(mockWindow); - handler.attachWindow(browserWindow); - handler.attachWindow(browserWindow); - - expect(mockWindow.webContents.on).toHaveBeenCalledTimes(2); - }); - }); - - describe('detachWindow', () => { - it('should detach a window and clean up subscriptions', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - const browserWindow = makeBrowserWindow(mockWindow); - handler.attachWindow(browserWindow); - - const subscriptions = (handler as any)['subscriptions'] as Map; - const mockUnsubscribe = vi.fn(); - subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe }); - subscriptions.set('102-1:subscription2', { unsubscribe: vi.fn() }); - - handler.detachWindow(browserWindow); - - expect(mockUnsubscribe).toHaveBeenCalled(); - expect(subscriptions.has('101-1:subscription1')).toBe(false); - expect(subscriptions.has('102-1:subscription2')).toBe(true); - }); - - it('should throw error when detaching destroyed window without webContentsId', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => true, - }; - - const browserWindow = makeBrowserWindow(mockWindow); - - expect(() => handler.detachWindow(browserWindow)).toThrow( - 'webContentsId is required when calling detachWindow on a destroyed window' - ); - }); - - it('should allow detaching destroyed window with webContentsId', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - isDestroyed: () => true, - }; - - const browserWindow = makeBrowserWindow(mockWindow); - handler.attachWindow(browserWindow); - - expect(() => handler.detachWindow(browserWindow, 101)).not.toThrow(); - }); - }); - - describe('subscription cleanup handlers', () => { - it('should clean up subscriptions on hard navigation', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - let navigationHandler: ((event: any) => void) | undefined; - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn().mockImplementation((event, handler) => { - if (event === 'did-start-navigation') { - navigationHandler = handler; - } - }), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - handler.attachWindow(makeBrowserWindow(mockWindow)); - - const subscriptions = (handler as any)['subscriptions'] as Map; - const mockUnsubscribe1 = vi.fn(); - const mockUnsubscribe2 = vi.fn(); - const mockUnsubscribe3 = vi.fn(); - - subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe1 }); - subscriptions.set('101-2:subscription2', { unsubscribe: mockUnsubscribe2 }); - subscriptions.set('102-1:subscription3', { unsubscribe: mockUnsubscribe3 }); - - navigationHandler?.({ - isSameDocument: false, - frame: { routingId: 1 }, - }); - - expect(mockUnsubscribe1).toHaveBeenCalled(); - expect(mockUnsubscribe2).not.toHaveBeenCalled(); - expect(mockUnsubscribe3).not.toHaveBeenCalled(); - expect(subscriptions.has('101-1:subscription1')).toBe(false); - expect(subscriptions.has('101-2:subscription2')).toBe(true); - expect(subscriptions.has('102-1:subscription3')).toBe(true); - }); - - it('should not clean up subscriptions on soft navigation', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - let navigationHandler: ((event: any) => void) | undefined; - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn().mockImplementation((event, handler) => { - if (event === 'did-start-navigation') { - navigationHandler = handler; - } - }), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - handler.attachWindow(makeBrowserWindow(mockWindow)); - - const subscriptions = (handler as any)['subscriptions'] as Map; - const mockUnsubscribe = vi.fn(); - subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe }); - - navigationHandler?.({ - isSameDocument: true, - frame: { routingId: 1 }, - }); - - expect(mockUnsubscribe).not.toHaveBeenCalled(); - expect(subscriptions.has('101-1:subscription1')).toBe(true); - }); - - it('should detach window on webContents destroyed event', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const eventHandlers: { [key: string]: (() => void)[] } = { - destroyed: [], - 'did-start-navigation': [], - }; - - const mockWindow: MockBrowserWindow = { - id: 1, - webContents: { - id: 101, - on: vi.fn().mockImplementation((event, handler) => { - eventHandlers[event].push(handler); - }), - isDestroyed: () => false, - }, - isDestroyed: () => false, - }; - - const browserWindow = makeBrowserWindow(mockWindow); - handler.attachWindow(browserWindow); - - const subscriptions = (handler as any)['subscriptions'] as Map; - const mockUnsubscribe1 = vi.fn(); - const mockUnsubscribe2 = vi.fn(); - const mockUnsubscribe3 = vi.fn(); - - subscriptions.set('101-1:subscription1', { unsubscribe: mockUnsubscribe1 }); - subscriptions.set('101-2:subscription2', { unsubscribe: mockUnsubscribe2 }); - subscriptions.set('102-1:subscription3', { unsubscribe: mockUnsubscribe3 }); - - expect((handler as any)['windows']).toHaveLength(1); - - mockWindow.isDestroyed = () => true; - - expect(eventHandlers.destroyed).toHaveLength(1); - eventHandlers.destroyed.forEach((handler) => handler()); - - expect((handler as any)['windows']).toHaveLength(0); - - expect(mockUnsubscribe1).toHaveBeenCalled(); - expect(mockUnsubscribe2).toHaveBeenCalled(); - expect(mockUnsubscribe3).not.toHaveBeenCalled(); // Different webContentsId - expect(subscriptions.has('101-1:subscription1')).toBe(false); - expect(subscriptions.has('101-2:subscription2')).toBe(false); - expect(subscriptions.has('102-1:subscription3')).toBe(true); - }); - }); - - describe('IPC message handling', () => { - it('should handle request messages', () => { - const t = initTRPC.create(); - const router = t.router({}); - createIPCHandler({ router }); - - const mockEvent: MockIpcMainEvent = { - sender: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - senderFrame: { - routingId: 1, - }, - reply: vi.fn(), - }; - - const request: ETRPCRequest = { - method: 'request', - operation: { - id: 1, - type: 'query', - path: 'test.query', - input: undefined, - context: {}, - }, - }; - - ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); - - expect(mockHandleIPCMessage).toHaveBeenCalledOnce(); - expect(mockHandleIPCMessage).toHaveBeenCalledWith({ - router, - createContext: undefined, - internalId: '101-1:1', - event: expect.any(Object), - message: request, - subscriptions: expect.any(Map), - }); - }); - - it('should handle subscription.stop messages', () => { - const t = initTRPC.create(); - const router = t.router({}); - createIPCHandler({ router }); - - const mockEvent: MockIpcMainEvent = { - sender: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - senderFrame: { - routingId: 1, - }, - reply: vi.fn(), - }; - - const request: ETRPCRequest = { - method: 'subscription.stop', - id: 1, - }; - - ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); - - expect(mockHandleIPCMessage).toHaveBeenCalledWith({ - router, - createContext: undefined, - internalId: '101-1:1', - event: expect.any(Object), - message: request, - subscriptions: expect.any(Map), - }); - }); - - it('should share subscriptions map across all IPC messages', () => { - const t = initTRPC.create(); - const router = t.router({}); - const handler = createIPCHandler({ router }); - - const subscriptions = (handler as any)['subscriptions'] as Map; - subscriptions.set('test-subscription', { unsubscribe: vi.fn() }); - - const mockEvent: MockIpcMainEvent = { - sender: { - id: 101, - on: vi.fn(), - isDestroyed: () => false, - }, - senderFrame: { - routingId: 1, - }, - reply: vi.fn(), - }; - - const request: ETRPCRequest = { - method: 'request', - operation: { - id: 1, - type: 'query', - path: 'test.query', - input: undefined, - context: {}, - }, - }; - - ipcMainHandler?.(makeIpcMainEvent(mockEvent), request); - - const passedSubscriptions = mockHandleIPCMessage.mock.calls[0][0].subscriptions; - expect(passedSubscriptions.has('test-subscription')).toBe(true); - }); - }); - - describe('autoRegisterPreload', () => { - it('should auto-register preload script by default', () => { - const t = initTRPC.create(); - const router = t.router({}); - - // Mock existing preloads - const existingPreloads = ['/path/to/existing/preload.js']; - vi.mocked(session.defaultSession.getPreloads).mockReturnValue(existingPreloads); - - createIPCHandler({ router }); - - expect(vi.mocked(session.defaultSession.getPreloads)).toHaveBeenCalled(); - expect(vi.mocked(session.defaultSession.setPreloads)).toHaveBeenCalledWith([ - ...existingPreloads, - expect.stringContaining('electron-trpc/dist/preload-auto'), - ]); - }); - - it('should not register preload script when autoRegisterPreload is false', () => { - const t = initTRPC.create(); - const router = t.router({}); - - createIPCHandler({ router, autoRegisterPreload: false }); - - expect(vi.mocked(session.defaultSession.getPreloads)).not.toHaveBeenCalled(); - expect(vi.mocked(session.defaultSession.setPreloads)).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/electron-trpc/src/main/__tests__/handleIPCMessage.test.ts b/packages/electron-trpc/src/main/__tests__/handleIPCMessage.test.ts deleted file mode 100644 index a6b02e82..00000000 --- a/packages/electron-trpc/src/main/__tests__/handleIPCMessage.test.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { describe, expect, MockedFunction, test, vi } from 'vitest'; -import { z } from 'zod'; -import * as trpc from '@trpc/server'; -import { observable } from '@trpc/server/observable'; -import { EventEmitter } from 'events'; -import { handleIPCMessage } from '../handleIPCMessage'; -import { IpcMainEvent } from 'electron'; - -interface MockEvent { - reply: MockedFunction; - sender: { - isDestroyed: () => boolean; - on: (event: string, cb: () => void) => void; - }; -} -const makeEvent = (event: MockEvent) => event as unknown as IpcMainEvent & Pick; - -const ee = new EventEmitter(); - -const t = trpc.initTRPC.create(); -const testRouter = t.router({ - testQuery: t.procedure - .input( - z.object({ - id: z.string(), - }) - ) - .query(({ input }) => { - return { id: input.id, isTest: true }; - }), - testSubscription: t.procedure.subscription(() => { - return observable((emit) => { - function testResponse() { - emit.next('test response'); - } - - ee.on('test', testResponse); - return () => ee.off('test', testResponse); - }); - }), -}); - -describe('api', () => { - test('handles queries', async () => { - const event = makeEvent({ - reply: vi.fn(), - sender: { - isDestroyed: () => false, - on: () => {}, - }, - }); - - await handleIPCMessage({ - createContext: async () => ({}), - event, - internalId: '1-1:1', - message: { - method: 'request', - operation: { - context: {}, - id: 1, - input: { id: 'test-id' }, - path: 'testQuery', - type: 'query', - }, - }, - router: testRouter, - subscriptions: new Map(), - }); - - expect(event.reply).toHaveBeenCalledOnce(); - expect(event.reply.mock.lastCall![1]).toMatchObject({ - id: 1, - result: { - data: { - id: 'test-id', - isTest: true, - }, - }, - }); - }); - - test('does not respond if sender is gone', async () => { - const event = makeEvent({ - reply: vi.fn(), - sender: { - isDestroyed: () => true, - on: () => {}, - }, - }); - - await handleIPCMessage({ - createContext: async () => ({}), - event, - internalId: '1-1:1', - message: { - method: 'request', - operation: { - context: {}, - id: 1, - input: { id: 'test-id' }, - path: 'testQuery', - type: 'query', - }, - }, - router: testRouter, - subscriptions: new Map(), - }); - - expect(event.reply).not.toHaveBeenCalled(); - }); - - test('handles subscriptions', async () => { - const event = makeEvent({ - reply: vi.fn(), - sender: { - isDestroyed: () => false, - on: () => {}, - }, - }); - - await handleIPCMessage({ - createContext: async () => ({}), - message: { - method: 'request', - operation: { - context: {}, - id: 1, - input: undefined, - path: 'testSubscription', - type: 'subscription', - }, - }, - internalId: '1-1:1', - subscriptions: new Map(), - router: testRouter, - event, - }); - - expect(event.reply).not.toHaveBeenCalled(); - - ee.emit('test'); - - expect(event.reply).toHaveBeenCalledOnce(); - expect(event.reply.mock.lastCall![1]).toMatchObject({ - id: 1, - result: { - data: 'test response', - }, - }); - }); - - test('subscription responds using custom serializer', async () => { - const event = makeEvent({ - reply: vi.fn(), - sender: { - isDestroyed: () => false, - on: () => {}, - }, - }); - - const t = trpc.initTRPC.create({ - transformer: { - deserialize: (input: unknown) => { - const serialized = (input as string).replace(/^serialized:/, ''); - return JSON.parse(serialized); - }, - serialize: (input) => { - return `serialized:${JSON.stringify(input)}`; - }, - }, - }); - - const testRouter = t.router({ - testSubscription: t.procedure.subscription(() => { - return observable((emit) => { - function testResponse() { - emit.next('test response'); - } - - ee.on('test', testResponse); - return () => ee.off('test', testResponse); - }); - }), - }); - - await handleIPCMessage({ - createContext: async () => ({}), - message: { - method: 'request', - operation: { - context: {}, - id: 1, - input: undefined, - path: 'testSubscription', - type: 'subscription', - }, - }, - internalId: '1-1:1', - subscriptions: new Map(), - router: testRouter, - event, - }); - - expect(event.reply).not.toHaveBeenCalled(); - - ee.emit('test'); - - expect(event.reply).toHaveBeenCalledOnce(); - expect(event.reply.mock.lastCall![1]).toMatchObject({ - id: 1, - result: { - type: 'data', - data: 'serialized:"test response"', - }, - }); - }); -}); diff --git a/packages/electron-trpc/src/main/__tests__/utils.test.ts b/packages/electron-trpc/src/main/__tests__/utils.test.ts deleted file mode 100644 index e68d6acc..00000000 --- a/packages/electron-trpc/src/main/__tests__/utils.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { describe, test, expect } from 'vitest'; -import { getTRPCErrorFromUnknown } from '../utils'; -import { TRPCError } from '@trpc/server'; - -describe('getTRPCErrorFromUnknown', () => { - test('should return a TRPCError when given a TRPCError', () => { - const error = new TRPCError({ - code: 'TIMEOUT', - cause: new Error('test'), - message: 'test', - }); - const result = getTRPCErrorFromUnknown(error); - - expect(result).toBe(error); - }); - - test('should return a TRPCError when given an Error', () => { - const error = new Error('test'); - const result = getTRPCErrorFromUnknown(error); - - expect(result).toBeInstanceOf(TRPCError); - expect(result).toMatchObject({ - code: 'INTERNAL_SERVER_ERROR', - cause: error, - message: error.message, - }); - }); - - test('should return a TRPCError when given a string', () => { - const error = 'test'; - const result = getTRPCErrorFromUnknown(error); - - expect(result).toBeInstanceOf(TRPCError); - expect(result).toMatchObject({ - code: 'INTERNAL_SERVER_ERROR', - cause: new Error(error), - message: error, - }); - }); - - test('should use the stack from the given error', () => { - const error = new Error('test'); - error.stack = 'test stack'; - const result = getTRPCErrorFromUnknown(error); - - expect(result.stack).toBe(error.stack); - }); - - test.each([{ test: 'test' }, undefined, null])( - 'should fallback to "Unknown error" when given an unknown type', - (error: unknown) => { - const result = getTRPCErrorFromUnknown(error); - - expect(result).toBeInstanceOf(TRPCError); - expect(result).toMatchObject({ - code: 'INTERNAL_SERVER_ERROR', - cause: new Error('Unknown error'), - message: 'Unknown error', - }); - } - ); -}); diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 5d321d73..9278cd64 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -1,151 +1,106 @@ -import type { AnyRouter, inferRouterContext } from '@trpc/server'; +import type { AnyTRPCRouter, inferRouterContext } from '@trpc/server'; import { ipcMain, session } from 'electron'; -import type { BrowserWindow, IpcMainEvent, WebFrameMain } from 'electron'; -import { handleIPCMessage } from './handleIPCMessage'; -import { CreateContextOptions } from './types'; -import { ELECTRON_TRPC_CHANNEL } from '../constants'; -import { ETRPCRequest } from '../types'; -import { Unsubscribable } from '@trpc/server/observable'; +import type { IpcMainEvent, Session, WebContents } from 'electron'; import debugFactory from 'debug'; -import path from 'path'; -import { fileURLToPath } from 'url'; +import { handleRequest } from './handleRequest'; +import { registerPreload } from './registerPreload'; +import type { CreateContextOptions, IPCHandlerErrorOptions } from './types'; +import { WebContentsScope } from './WebContentsScope'; +import { ELECTRON_TRPC_CHANNEL } from '../constants'; +import type { ETRPCRequest } from '../types'; const debug = debugFactory('electron-trpc:main:IPCHandler'); -type Awaitable = T | Promise; +export interface CreateIPCHandlerOptions { + router: TRouter; + createContext?: ( + opts: CreateContextOptions + ) => inferRouterContext | Promise>; + onError?: (opts: IPCHandlerErrorOptions) => void; + /** + * Sessions to register the electron-trpc preload script on, which exposes electron-trpc to every + * page in them. Defaults to the default session. Pass `false` to call `exposeElectronTRPC` from + * your own preload script instead. + */ + preload?: false | { sessions: Session[] }; +} -const getInternalId = (event: IpcMainEvent, frame: WebFrameMain, request: ETRPCRequest) => { - const messageId = request.method === 'request' ? request.operation.id : request.id; - return `${event.sender.id}-${frame.routingId}:${messageId}`; -}; +/** Handles electron-trpc requests from every renderer until disposed. */ +export interface IPCHandler extends Disposable {} -class IPCHandler { - private windows: BrowserWindow[] = []; - private subscriptions: Map = new Map(); +class IPCHandlerImpl implements IPCHandler { + readonly #stack = new DisposableStack(); + readonly #contents = new Map(); - constructor({ - createContext, - router, - windows = [], - }: { - createContext?: (opts: CreateContextOptions) => Awaitable>; - router: TRouter; - windows?: BrowserWindow[]; - }) { - windows.forEach((win) => this.attachWindow(win)); + constructor(private readonly options: CreateIPCHandlerOptions) { + const listener = (event: IpcMainEvent, request: ETRPCRequest) => { + this.#handleMessage(event, request); + }; + ipcMain.on(ELECTRON_TRPC_CHANNEL, listener); + this.#stack.defer(() => ipcMain.off(ELECTRON_TRPC_CHANNEL, listener)); - ipcMain.on(ELECTRON_TRPC_CHANNEL, (event: IpcMainEvent, request: ETRPCRequest) => { - // The sending frame has already navigated or been destroyed, so there is no one to reply to. - if (!event.senderFrame) return; + if (options.preload !== false) { + this.#stack.use(registerPreload(options.preload?.sessions ?? [session.defaultSession])); + } - handleIPCMessage({ - router, - createContext, - internalId: getInternalId(event, event.senderFrame, request), - event, - message: request, - subscriptions: this.subscriptions, - }); + this.#stack.defer(() => { + for (const scope of this.#contents.values()) scope[Symbol.dispose](); + this.#contents.clear(); }); } - attachWindow(win: BrowserWindow) { - if (this.windows.includes(win)) { - return; + #contentsScope(webContents: WebContents) { + const id = webContents.id; + let scope = this.#contents.get(id); + if (!scope) { + debug('Tracking webContents', id); + scope = new WebContentsScope(webContents, () => { + debug('webContents destroyed', id); + this.#contents.get(id)?.[Symbol.dispose](); + this.#contents.delete(id); + }); + this.#contents.set(id, scope); } - - debug('Attaching window', win.id); - - this.windows.push(win); - this.attachSubscriptionCleanupHandlers(win); + return scope; } - detachWindow(win: BrowserWindow, webContentsId?: number) { - debug('Detaching window', win.id); + #handleMessage(event: IpcMainEvent, request: ETRPCRequest) { + // The sending frame has already navigated or been destroyed, so there is no one to reply to. + const frame = event.senderFrame; + if (!frame || event.sender.isDestroyed()) return; + + const contents = this.#contentsScope(event.sender); - if (win.isDestroyed() && webContentsId === undefined) { - throw new Error('webContentsId is required when calling detachWindow on a destroyed window'); + if (request.method === 'stop') { + contents.findClient(frame, request.clientId)?.stop(request.id); + return; } - this.windows = this.windows.filter((w) => w !== win); - this.cleanUpSubscriptions({ webContentsId: webContentsId ?? win.webContents.id }); - } + const operation = contents.client(frame, request.clientId)?.start(request.operation.id); + if (!operation) return; - private cleanUpSubscriptions({ - webContentsId, - frameRoutingId, - }: { - webContentsId: number; - frameRoutingId?: number; - }) { - for (const [key, sub] of this.subscriptions.entries()) { - if (key.startsWith(`${webContentsId}-${frameRoutingId ?? ''}`)) { - debug('Closing subscription', key); - sub.unsubscribe(); - this.subscriptions.delete(key); - } - } + void handleRequest({ + router: this.options.router, + createContext: this.options.createContext, + onError: this.options.onError, + event, + request: request.operation, + operation, + }); } - private attachSubscriptionCleanupHandlers(win: BrowserWindow) { - const webContentsId = win.webContents.id; - win.webContents.on('did-start-navigation', ({ isSameDocument, frame }) => { - // Check if it's a hard navigation - if (!isSameDocument && frame) { - debug( - 'Handling hard navigation event', - `webContentsId: ${webContentsId}`, - `frameRoutingId: ${frame.routingId}` - ); - this.cleanUpSubscriptions({ - webContentsId: webContentsId, - frameRoutingId: frame.routingId, - }); - } - }); - win.webContents.on('destroyed', () => { - debug('Handling webContents `destroyed` event'); - this.detachWindow(win, webContentsId); - }); + [Symbol.dispose]() { + this.#stack.dispose(); } } -export const createIPCHandler = ({ - createContext, - router, - windows = [], - autoRegisterPreload = true, -}: { - createContext?: (opts: CreateContextOptions) => Promise>; - router: TRouter; - windows?: Electron.BrowserWindow[]; - autoRegisterPreload?: boolean; -}) => { - if (autoRegisterPreload) { - // Register the preload script automatically - let preloadPath: string; - - // Determine the preload script path - if (typeof require !== 'undefined' && typeof require.resolve === 'function') { - // CommonJS - use require.resolve for better compatibility with bundlers - preloadPath = require.resolve('electron-trpc/preload-auto'); - } else if (typeof import.meta.url !== 'undefined') { - // ESM - import.meta.url will be in the dist directory - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - preloadPath = path.join(__dirname, 'preload-auto.cjs'); - } else { - throw new Error( - 'Failed to resolve electron-trpc preload script path. ' + - 'Unable to determine current module directory.' - ); - } - - debug('Auto-registering preload script at:', preloadPath); - - // Use setPreloads to automatically inject the preload script - session.defaultSession.setPreloads([...session.defaultSession.getPreloads(), preloadPath]); +export const createIPCHandler = ( + options: CreateIPCHandlerOptions +): IPCHandler => { + if (ipcMain.listenerCount(ELECTRON_TRPC_CHANNEL) > 0) { + throw new Error( + 'An electron-trpc IPC handler is already active. Dispose it before creating another.' + ); } - - return new IPCHandler({ createContext, router, windows }); + return new IPCHandlerImpl(options); }; diff --git a/packages/electron-trpc/src/main/handleIPCMessage.ts b/packages/electron-trpc/src/main/handleIPCMessage.ts deleted file mode 100644 index bce69a57..00000000 --- a/packages/electron-trpc/src/main/handleIPCMessage.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { callProcedure, TRPCError } from '@trpc/server'; -import type { AnyRouter, inferRouterContext } from '@trpc/server'; -import type { TRPCResponseMessage } from '@trpc/server/rpc'; -import type { IpcMainEvent } from 'electron'; -import { isObservable, Unsubscribable } from '@trpc/server/observable'; -import { transformTRPCResponse } from '@trpc/server/shared'; -import { getTRPCErrorFromUnknown } from './utils'; -import { CreateContextOptions } from './types'; -import { ELECTRON_TRPC_CHANNEL } from '../constants'; -import { ETRPCRequest } from '../types'; -import debugFactory from 'debug'; - -const debug = debugFactory('electron-trpc:main:handleIPCMessage'); - -export async function handleIPCMessage({ - router, - createContext, - internalId, - message, - event, - subscriptions, -}: { - router: TRouter; - createContext?: (opts: CreateContextOptions) => Promise>; - internalId: string; - message: ETRPCRequest; - event: IpcMainEvent; - subscriptions: Map; -}) { - if (message.method === 'subscription.stop') { - const subscription = subscriptions.get(internalId); - if (!subscription) { - return; - } - - subscription.unsubscribe(); - subscriptions.delete(internalId); - return; - } - - const { type, input: serializedInput, path, id } = message.operation; - const input = serializedInput - ? router._def._config.transformer.input.deserialize(serializedInput) - : undefined; - - const ctx = (await createContext?.({ event })) ?? {}; - - const respond = (response: TRPCResponseMessage) => { - if (event.sender.isDestroyed()) return; - event.reply(ELECTRON_TRPC_CHANNEL, transformTRPCResponse(router._def._config, response)); - }; - - try { - const result = await callProcedure({ - ctx, - path, - procedures: router._def.procedures, - rawInput: input, - type, - }); - - if (type !== 'subscription') { - respond({ - id, - result: { - type: 'data', - data: result, - }, - }); - return; - } else { - if (!isObservable(result)) { - throw new TRPCError({ - message: `Subscription ${path} did not return an observable`, - code: 'INTERNAL_SERVER_ERROR', - }); - } - } - - const subscription = result.subscribe({ - next(data) { - respond({ - id, - result: { - type: 'data', - data, - }, - }); - }, - error(err) { - const error = getTRPCErrorFromUnknown(err); - respond({ - id, - error: router.getErrorShape({ - error, - type, - path, - input, - ctx, - }), - }); - }, - complete() { - respond({ - id, - result: { - type: 'stopped', - }, - }); - }, - }); - - debug('Creating subscription', internalId); - subscriptions.set(internalId, subscription); - } catch (cause) { - const error: TRPCError = getTRPCErrorFromUnknown(cause); - - return respond({ - id, - error: router.getErrorShape({ - error, - type, - path, - input, - ctx, - }), - }); - } -} diff --git a/packages/electron-trpc/src/main/handleRequest.ts b/packages/electron-trpc/src/main/handleRequest.ts new file mode 100644 index 00000000..7a91ed17 --- /dev/null +++ b/packages/electron-trpc/src/main/handleRequest.ts @@ -0,0 +1,129 @@ +import { + callTRPCProcedure, + getTRPCErrorFromUnknown, + getTRPCErrorShape, + isTrackedEnvelope, + transformTRPCResponse, + TRPCError, +} from '@trpc/server'; +import type { AnyTRPCRouter, inferRouterContext } from '@trpc/server'; +import { isObservable, observableToAsyncIterable } from '@trpc/server/observable'; +import type { TRPCResponseMessage, TRPCResultMessage } from '@trpc/server/rpc'; +import type { IpcMainEvent } from 'electron'; +import type { Operation } from './ClientScope'; +import type { CreateContextOptions, IPCHandlerErrorOptions } from './types'; +import type { ETRPCRequest } from '../types'; + +type MaybePromise = T | Promise; + +export interface HandleRequestOptions { + router: TRouter; + createContext?: (opts: CreateContextOptions) => MaybePromise>; + onError?: (opts: IPCHandlerErrorOptions) => void; + event: IpcMainEvent; + request: Extract['operation']; + operation: Operation; +} + +const isAsyncIterable = (value: unknown): value is AsyncIterable => + value != null && typeof value === 'object' && Symbol.asyncIterator in value; + +/** + * Resolves with the iterator's next result, or with `'aborted'` once `signal` aborts. Listening for + * the abort per call, rather than racing one long-lived promise, keeps a long subscription from + * accumulating a promise reaction for every value it yields. + */ +const nextOrAbort = (iterator: AsyncIterator, signal: AbortSignal) => + new Promise | 'aborted'>((resolve, reject) => { + if (signal.aborted) return resolve('aborted'); + const onAbort = () => resolve('aborted'); + signal.addEventListener('abort', onAbort, { once: true }); + iterator + .next() + .then(resolve, reject) + .finally(() => signal.removeEventListener('abort', onAbort)); + }); + +export async function handleRequest({ + router, + createContext, + onError, + event, + request: { id, type, path, input: serializedInput }, + operation, +}: HandleRequestOptions) { + using _operation = operation; + const { signal } = operation; + const config = router._def._config; + let input: unknown = undefined; + let ctx: inferRouterContext | undefined = undefined; + + const respond = (message: TRPCResponseMessage) => { + // Transforming a single message yields a single message; the return type covers batches too. + operation.send(transformTRPCResponse(config, message) as TRPCResponseMessage); + }; + + try { + input = + serializedInput === undefined + ? undefined + : config.transformer.input.deserialize(serializedInput); + ctx = await createContext?.({ event }); + + const result = await callTRPCProcedure({ + router, + path, + getRawInput: async () => input, + ctx, + type, + signal, + batchIndex: 0, + }); + + if (type !== 'subscription') { + if (isAsyncIterable(result) || isObservable(result)) { + throw new TRPCError({ + code: 'UNSUPPORTED_MEDIA_TYPE', + message: `Cannot return an async iterable or observable from a ${type} procedure over IPC`, + }); + } + respond({ id, result: { type: 'data', data: result } }); + return; + } + + if (!isAsyncIterable(result) && !isObservable(result)) { + throw new TRPCError({ + code: 'INTERNAL_SERVER_ERROR', + message: `Subscription ${path} did not return an observable or an async iterable`, + }); + } + + const iterable = isObservable(result) ? observableToAsyncIterable(result, signal) : result; + const iterator = iterable[Symbol.asyncIterator](); + respond({ id, result: { type: 'started' } }); + + try { + while (true) { + const next = await nextOrAbort(iterator, signal); + if (next === 'aborted' || next.done) break; + + const result: TRPCResultMessage['result'] = isTrackedEnvelope(next.value) + ? { type: 'data', id: next.value[0], data: { id: next.value[0], data: next.value[1] } } + : { type: 'data', data: next.value }; + respond({ id, result }); + } + } finally { + // Don't wait: a generator suspended on something other than `signal` only returns once that + // settles, and nothing is listening for this operation anymore. + Promise.resolve(iterator.return?.()).catch(() => {}); + } + + respond({ id, result: { type: 'stopped' } }); + } catch (cause) { + if (signal.aborted) return; + + const error = getTRPCErrorFromUnknown(cause); + onError?.({ error, type, path, input, ctx, event }); + respond({ id, error: getTRPCErrorShape({ config, error, type, path, input, ctx }) }); + } +} diff --git a/packages/electron-trpc/src/main/index.ts b/packages/electron-trpc/src/main/index.ts index 60e78048..4b33aff6 100644 --- a/packages/electron-trpc/src/main/index.ts +++ b/packages/electron-trpc/src/main/index.ts @@ -1,3 +1,4 @@ export * from '../constants'; -export * from './createIPCHandler'; -export * from './types'; +export { createIPCHandler } from './createIPCHandler'; +export type { CreateIPCHandlerOptions, IPCHandler } from './createIPCHandler'; +export type { CreateContextOptions, IPCHandlerErrorOptions } from './types'; diff --git a/packages/electron-trpc/src/main/registerPreload.ts b/packages/electron-trpc/src/main/registerPreload.ts new file mode 100644 index 00000000..8063b302 --- /dev/null +++ b/packages/electron-trpc/src/main/registerPreload.ts @@ -0,0 +1,32 @@ +import type { Session } from 'electron'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import debugFactory from 'debug'; + +const debug = debugFactory('electron-trpc:main:registerPreload'); + +const resolvePreloadPath = () => { + if (typeof require !== 'undefined' && typeof require.resolve === 'function') { + // CommonJS: resolve through the package so this still works when bundled into the app. + return require.resolve('electron-trpc/preload-auto'); + } + if (typeof import.meta.url !== 'undefined') { + // ESM: the preload script sits next to this module in `dist`. + return path.join(path.dirname(fileURLToPath(import.meta.url)), 'preload-auto.cjs'); + } + throw new Error('Failed to resolve the electron-trpc preload script path.'); +}; + +/** Registers the electron-trpc preload script on each session until disposed. */ +export function registerPreload(sessions: Session[]): Disposable { + const stack = new DisposableStack(); + const filePath = resolvePreloadPath(); + + for (const session of sessions) { + debug('Registering preload script', filePath); + const id = session.registerPreloadScript({ type: 'frame', filePath }); + stack.defer(() => session.unregisterPreloadScript(id)); + } + + return stack; +} diff --git a/packages/electron-trpc/src/main/types.ts b/packages/electron-trpc/src/main/types.ts index 878734f7..684b1417 100644 --- a/packages/electron-trpc/src/main/types.ts +++ b/packages/electron-trpc/src/main/types.ts @@ -1,5 +1,15 @@ -import type { IpcMainInvokeEvent } from 'electron'; +import type { AnyTRPCRouter, inferRouterContext, TRPCError, TRPCProcedureType } from '@trpc/server'; +import type { IpcMainEvent } from 'electron'; export interface CreateContextOptions { - event: IpcMainInvokeEvent; + event: IpcMainEvent; +} + +export interface IPCHandlerErrorOptions { + error: TRPCError; + type: TRPCProcedureType; + path: string; + input: unknown; + ctx: inferRouterContext | undefined; + event: IpcMainEvent; } diff --git a/packages/electron-trpc/src/main/utils.ts b/packages/electron-trpc/src/main/utils.ts deleted file mode 100644 index 395c4dff..00000000 --- a/packages/electron-trpc/src/main/utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { TRPCError } from '@trpc/server'; - -// modified from @trpc/server/src/error/utils -export function getTRPCErrorFromUnknown(cause: unknown): TRPCError { - if (cause instanceof TRPCError) { - return cause; - } - - const error = getErrorFromUnknown(cause); - const trpcError = new TRPCError({ - code: 'INTERNAL_SERVER_ERROR', - cause: error, - message: error.message, - }); - - // Inherit stack from error - trpcError.stack = error.stack; - - return trpcError; -} - -// modified from @trpc/server/src/error/utils -function getErrorFromUnknown(cause: unknown): Error { - if (cause instanceof Error) { - return cause; - } - - if (typeof cause === 'string') { - return new Error(cause); - } - - return new Error('Unknown error'); -} diff --git a/packages/electron-trpc/src/preload/__tests__/exposeElectronTRPC.test.ts b/packages/electron-trpc/src/preload/__tests__/exposeElectronTRPC.test.ts new file mode 100644 index 00000000..424f8ee8 --- /dev/null +++ b/packages/electron-trpc/src/preload/__tests__/exposeElectronTRPC.test.ts @@ -0,0 +1,42 @@ +import { beforeEach, expect, test, vi } from 'vitest'; +import { exposeElectronTRPC } from '../exposeElectronTRPC'; +import { ELECTRON_TRPC_CHANNEL } from '../../constants'; +import type { ETRPCResponse, RendererGlobalElectronTRPC } from '../../types'; +import { contextBridge, ipcRenderer, reset } from '../../__tests__/fakeElectron'; + +vi.mock('electron', () => import('../../__tests__/fakeElectron')); + +const expose = () => { + exposeElectronTRPC(); + expect(contextBridge.exposeInMainWorld).toHaveBeenCalledWith('electronTRPC', expect.any(Object)); + return contextBridge.exposeInMainWorld.mock.calls[0][1] as RendererGlobalElectronTRPC; +}; + +beforeEach(() => reset()); + +test('sends requests on the electron-trpc channel', () => { + const electronTRPC = expose(); + const request = { method: 'stop', clientId: 'client', id: 1 } as const; + + electronTRPC.sendMessage(request); + + expect(ipcRenderer.send).toHaveBeenCalledWith(ELECTRON_TRPC_CHANNEL, request); +}); + +test('forwards responses until the listener is removed', () => { + const electronTRPC = expose(); + const callback = vi.fn(); + const response: ETRPCResponse = { + clientId: 'client', + message: { id: 1, result: { type: 'started' } }, + }; + + const removeListener = electronTRPC.onMessage(callback); + ipcRenderer.emit(ELECTRON_TRPC_CHANNEL, {}, response); + removeListener(); + ipcRenderer.emit(ELECTRON_TRPC_CHANNEL, {}, response); + + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith(response); + expect(ipcRenderer.listenerCount(ELECTRON_TRPC_CHANNEL)).toBe(0); +}); diff --git a/packages/electron-trpc/src/preload/exposeElectronTRPC.ts b/packages/electron-trpc/src/preload/exposeElectronTRPC.ts index 32cd7896..43a3b5f9 100644 --- a/packages/electron-trpc/src/preload/exposeElectronTRPC.ts +++ b/packages/electron-trpc/src/preload/exposeElectronTRPC.ts @@ -1,12 +1,18 @@ import { ipcRenderer, contextBridge } from 'electron'; +import type { IpcRendererEvent } from 'electron'; import { ELECTRON_TRPC_CHANNEL } from '../constants'; -import type { RendererGlobalElectronTRPC } from '../types'; +import type { ETRPCResponse, RendererGlobalElectronTRPC } from '../types'; -export const exposeElectronTRPC = () => { +export const exposeElectronTRPC = (): void => { const electronTRPC: RendererGlobalElectronTRPC = { - sendMessage: (operation) => ipcRenderer.send(ELECTRON_TRPC_CHANNEL, operation), - onMessage: (callback) => - ipcRenderer.on(ELECTRON_TRPC_CHANNEL, (_event, args) => callback(args)), + sendMessage: (request) => ipcRenderer.send(ELECTRON_TRPC_CHANNEL, request), + onMessage: (callback) => { + const listener = (_event: IpcRendererEvent, response: ETRPCResponse) => callback(response); + ipcRenderer.on(ELECTRON_TRPC_CHANNEL, listener); + return () => { + ipcRenderer.removeListener(ELECTRON_TRPC_CHANNEL, listener); + }; + }, }; contextBridge.exposeInMainWorld('electronTRPC', electronTRPC); }; diff --git a/packages/electron-trpc/src/renderer/__tests__/ipcLink.test.ts b/packages/electron-trpc/src/renderer/__tests__/ipcLink.test.ts deleted file mode 100644 index 5aaf4b4e..00000000 --- a/packages/electron-trpc/src/renderer/__tests__/ipcLink.test.ts +++ /dev/null @@ -1,318 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { createTRPCProxyClient } from '@trpc/client'; -import { initTRPC } from '@trpc/server'; -import type { TRPCResponseMessage } from '@trpc/server/rpc'; -import z from 'zod'; -import type { RendererGlobalElectronTRPC } from '../../types'; -import { ipcLink } from '../ipcLink'; -import superjson from 'superjson'; - -const t = initTRPC.create(); -const router = t.router({ - testQuery: t.procedure.query(() => 'query success'), - testMutation: t.procedure.input(z.string()).mutation(() => 'mutation success'), - testSubscription: t.procedure.subscription(() => { - return { - next: () => {}, - complete: () => {}, - }; - }), - testInputs: t.procedure - .input(z.object({ str: z.string(), date: z.date(), bigint: z.bigint() })) - .query((input) => { - return input; - }), -}); - -type Router = typeof router; - -const electronTRPC: RendererGlobalElectronTRPC = {} as any; -let handlers: ((message: TRPCResponseMessage) => void)[] = []; -beforeEach(() => { - handlers = []; - electronTRPC.sendMessage = vi.fn(); - electronTRPC.onMessage = vi.fn().mockImplementation((handler) => { - handlers.push(handler); - }); -}); - -vi.stubGlobal('electronTRPC', electronTRPC); - -describe('ipcLink', () => { - test('can create ipcLink', () => { - expect(() => createTRPCProxyClient({ links: [ipcLink()] })).not.toThrow(); - }); - - describe('operations', () => { - let client: ReturnType>; - const mock = vi.mocked(electronTRPC); - - beforeEach(() => { - client = createTRPCProxyClient({ links: [ipcLink()] }); - }); - - test('routes query to/from', async () => { - const queryResponse = vi.fn(); - - const query = client.testQuery.query().then(queryResponse); - - expect(mock.sendMessage).toHaveBeenCalledTimes(1); - expect(mock.sendMessage).toHaveBeenCalledWith({ - method: 'request', - operation: { - context: {}, - id: 1, - input: undefined, - path: 'testQuery', - type: 'query', - }, - }); - - expect(queryResponse).not.toHaveBeenCalled(); - - handlers[0]({ - id: 1, - result: { - type: 'data', - data: 'query success', - }, - }); - - await query; - - expect(queryResponse).toHaveBeenCalledTimes(1); - expect(queryResponse).toHaveBeenCalledWith('query success'); - }); - - test('routes mutation to/from', async () => { - const mutationResponse = vi.fn(); - - const mutation = client.testMutation.mutate('test input').then(mutationResponse); - - expect(mock.sendMessage).toHaveBeenCalledTimes(1); - expect(mock.sendMessage).toHaveBeenCalledWith({ - method: 'request', - operation: { - context: {}, - id: 1, - input: 'test input', - path: 'testMutation', - type: 'mutation', - }, - }); - - mock.sendMessage.mockClear(); - - handlers[0]({ - id: 1, - result: { - type: 'data', - data: 'mutation success', - }, - }); - - await mutation; - - expect(mutationResponse).toHaveBeenCalledTimes(1); - expect(mutationResponse).toHaveBeenCalledWith('mutation success'); - }); - - test('routes subscription to/from', async () => { - /* - * Subscription is routed to the server - */ - const subscriptionResponse = vi.fn(); - const subscriptionComplete = vi.fn(); - - const subscription = client.testSubscription.subscribe(undefined, { - onData: subscriptionResponse, - onComplete: subscriptionComplete, - }); - - expect(mock.sendMessage).toHaveBeenCalledTimes(1); - expect(mock.sendMessage).toHaveBeenCalledWith({ - method: 'request', - operation: { - context: {}, - id: 1, - input: undefined, - path: 'testSubscription', - type: 'subscription', - }, - }); - - /* - * Multiple responses from the server - */ - const respond = (str: string) => - handlers[0]({ - id: 1, - result: { - type: 'data', - data: str, - }, - }); - - respond('test 1'); - respond('test 2'); - respond('test 3'); - - expect(subscriptionResponse).toHaveBeenCalledTimes(3); - expect(subscriptionComplete).not.toHaveBeenCalled(); - - /* - * Unsubscribe informs the server - */ - subscription.unsubscribe(); - - expect(mock.sendMessage).toHaveBeenCalledTimes(2); - expect(mock.sendMessage.mock.calls[1]).toEqual([ - { - id: 1, - method: 'subscription.stop', - }, - ]); - - expect(subscriptionComplete).toHaveBeenCalledTimes(1); - - /* - * Should not receive any more messages after unsubscribing - */ - respond('test 4'); - - expect(subscriptionResponse).toHaveBeenCalledTimes(3); - }); - - test('interlaces responses', async () => { - const queryResponse1 = vi.fn(); - const queryResponse2 = vi.fn(); - const queryResponse3 = vi.fn(); - - const query1 = client.testQuery.query().then(queryResponse1); - /* const query2 = */ client.testQuery.query().then(queryResponse2); - const query3 = client.testQuery.query().then(queryResponse3); - - expect(mock.sendMessage).toHaveBeenCalledTimes(3); - - expect(queryResponse1).not.toHaveBeenCalled(); - expect(queryResponse2).not.toHaveBeenCalled(); - expect(queryResponse3).not.toHaveBeenCalled(); - - // Respond to queries in a different order - handlers[0]({ - id: 1, - result: { - type: 'data', - data: 'query success 1', - }, - }); - handlers[0]({ - id: 3, - result: { - type: 'data', - data: 'query success 3', - }, - }); - - await Promise.all([query1, query3]); - - expect(queryResponse1).toHaveBeenCalledTimes(1); - expect(queryResponse1).toHaveBeenCalledWith('query success 1'); - expect(queryResponse2).not.toHaveBeenCalled(); - expect(queryResponse3).toHaveBeenCalledTimes(1); - expect(queryResponse3).toHaveBeenCalledWith('query success 3'); - }); - }); - - test('serializes inputs/outputs', async () => { - const client = createTRPCProxyClient({ - transformer: superjson, - links: [ipcLink()], - }); - - const mock = vi.mocked(electronTRPC); - const queryResponse = vi.fn(); - - const input = { - str: 'my string', - date: new Date('January 1, 2000 01:23:45'), - bigint: BigInt(12345), - }; - - const query = client.testInputs.query(input).then(queryResponse); - - expect(mock.sendMessage).toHaveBeenCalledTimes(1); - expect(mock.sendMessage).toHaveBeenCalledWith({ - method: 'request', - operation: { - context: {}, - id: 1, - input: superjson.serialize(input), - path: 'testInputs', - type: 'query', - }, - }); - - expect(queryResponse).not.toHaveBeenCalled(); - - handlers[0]({ - id: 1, - result: { - type: 'data', - data: superjson.serialize(input), - }, - }); - - await query; - - expect(queryResponse).toHaveBeenCalledTimes(1); - expect(queryResponse).toHaveBeenCalledWith(input); - }); - - test('serializes inputs with custom transformer', async () => { - const client = createTRPCProxyClient({ - transformer: { - serialize: (input) => JSON.stringify(input), - deserialize: (input) => JSON.parse(input), - }, - links: [ipcLink()], - }); - - const mock = vi.mocked(electronTRPC); - const queryResponse = vi.fn(); - - const input = { - str: 'my string', - date: new Date('January 1, 2000 01:23:45'), - }; - - const query = client.testInputs.query(input).then(queryResponse); - - expect(mock.sendMessage).toHaveBeenCalledTimes(1); - expect(mock.sendMessage).toHaveBeenCalledWith({ - method: 'request', - operation: { - id: 1, - context: {}, - input: JSON.stringify(input), - path: 'testInputs', - type: 'query', - }, - }); - - expect(queryResponse).not.toHaveBeenCalled(); - - handlers[0]({ - id: 1, - result: { - type: 'data', - data: JSON.stringify(input), - }, - }); - - await query; - - expect(queryResponse).toHaveBeenCalledTimes(1); - expect(queryResponse).toHaveBeenCalledWith({ ...input, date: input.date.toISOString() }); - }); -}); diff --git a/packages/electron-trpc/src/renderer/ipcLink.ts b/packages/electron-trpc/src/renderer/ipcLink.ts index 0f983f52..41ec0649 100644 --- a/packages/electron-trpc/src/renderer/ipcLink.ts +++ b/packages/electron-trpc/src/renderer/ipcLink.ts @@ -1,111 +1,132 @@ -import { Operation, TRPCClientError, TRPCLink } from '@trpc/client'; -import type { AnyRouter, inferRouterContext, ProcedureType } from '@trpc/server'; +import { TRPCClientError } from '@trpc/client'; +import type { Operation, TRPCLink } from '@trpc/client'; +import { getTransformer } from '@trpc/client/unstable-internals'; +import type { TransformerOptions } from '@trpc/client/unstable-internals'; +import type { AnyTRPCRouter, inferTRPCClientTypes } from '@trpc/server'; +import { observable } from '@trpc/server/observable'; import type { TRPCResponseMessage } from '@trpc/server/rpc'; -import type { RendererGlobalElectronTRPC } from '../types'; -import { observable, Observer } from '@trpc/server/observable'; -import { transformResult } from './utils'; +import { transformResult } from '@trpc/server/unstable-core-do-not-import'; import debugFactory from 'debug'; +import type { ETRPCRequest, ETRPCResponse, RendererGlobalElectronTRPC } from '../types'; const debug = debugFactory('electron-trpc:renderer:ipcLink'); -type IPCCallbackResult = TRPCResponseMessage< - unknown, - inferRouterContext ->; - -type IPCCallbacks = Observer< - IPCCallbackResult, - TRPCClientError ->; - -type IPCRequest = { - type: ProcedureType; - callbacks: IPCCallbacks; - op: Operation; -}; - const getElectronTRPC = () => { - const electronTRPC: RendererGlobalElectronTRPC = (globalThis as any).electronTRPC; + const electronTRPC: RendererGlobalElectronTRPC | undefined = (globalThis as any).electronTRPC; if (!electronTRPC) { throw new Error( - 'Could not find `electronTRPC` global. Check that `exposeElectronTRPC` has been called in your preload file.' + 'Could not find `electronTRPC` global. `createIPCHandler` registers a preload script that ' + + 'exposes it, unless it was created with `preload: false`, in which case your own preload ' + + 'script needs to call `exposeElectronTRPC`.' ); } return electronTRPC; }; -class IPCClient { - #pendingRequests = new Map(); - #electronTRPC = getElectronTRPC(); +// Ids only need to tell this page's clients apart, so fall back to Math.random on insecure origins. +const createClientId = () => + globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`; - constructor() { - this.#electronTRPC.onMessage((response: TRPCResponseMessage) => { - this.#handleResponse(response); - }); - } +interface PendingRequest { + type: Operation['type']; + onMessage: (message: TRPCResponseMessage) => void; +} - #handleResponse(response: TRPCResponseMessage) { - debug('handling response', response); - const request = response.id && this.#pendingRequests.get(response.id); - if (!request) { - return; - } +const isFinalMessage = (type: Operation['type'], message: TRPCResponseMessage) => + 'error' in message || type !== 'subscription' || message.result.type === 'stopped'; - request.callbacks.next(response); +/** + * The renderer side of one tRPC client. It only listens for responses while it has requests in + * flight, so a client that is no longer used doesn't leave a listener behind. + */ +class IPCClient { + readonly #id = createClientId(); + readonly #electronTRPC = getElectronTRPC(); + readonly #pending = new Map(); + #removeListener: (() => void) | undefined; + + request( + { id, type, path, input }: Pick, + onMessage: PendingRequest['onMessage'] + ): Disposable { + this.#removeListener ??= this.#electronTRPC.onMessage((response) => + this.#handleResponse(response) + ); + this.#pending.set(id, { type, onMessage }); + this.#send({ method: 'request', clientId: this.#id, operation: { id, type, path, input } }); + + return { + [Symbol.dispose]: () => { + // Already finished, so the main process has nothing left to stop. + if (!this.#settle(id)) return; + this.#send({ method: 'stop', clientId: this.#id, id }); + }, + }; + } - if ('result' in response && response.result.type === 'stopped') { - request.callbacks.complete(); - } + #send(request: ETRPCRequest) { + this.#electronTRPC.sendMessage(request); } - request(op: Operation, callbacks: IPCCallbacks) { - const { type, id } = op; + #handleResponse({ clientId, message }: ETRPCResponse) { + if (clientId !== this.#id) return; + debug('Handling response', message); - this.#pendingRequests.set(id, { - type, - callbacks, - op, - }); + const request = message.id == null ? undefined : this.#pending.get(Number(message.id)); + if (!request) return; - this.#electronTRPC.sendMessage({ method: 'request', operation: op }); + if (isFinalMessage(request.type, message)) this.#settle(Number(message.id)); + request.onMessage(message); + } - return () => { - const callbacks = this.#pendingRequests.get(id)?.callbacks; + /** Stops tracking a request. Returns whether it was still pending. */ + #settle(id: number) { + if (!this.#pending.delete(id)) return false; + if (this.#pending.size === 0) { + this.#removeListener?.(); + this.#removeListener = undefined; + } + return true; + } +} - this.#pendingRequests.delete(id); +export type IPCLinkOptions = TransformerOptions< + inferTRPCClientTypes +>; - callbacks?.complete(); +/** Options are only required when the router has a transformer, which then has to be passed. */ +type IPCLinkArgs = + inferTRPCClientTypes['transformer'] extends true + ? [opts: IPCLinkOptions] + : [opts?: IPCLinkOptions]; - if (type === 'subscription') { - this.#electronTRPC.sendMessage({ - id, - method: 'subscription.stop', - }); - } - }; - } -} +export function ipcLink( + ...[opts]: IPCLinkArgs +): TRPCLink { + const transformer = getTransformer(opts?.transformer); -export function ipcLink(): TRPCLink { - return (runtime) => { + return () => { const client = new IPCClient(); - return ({ op }) => { - return observable((observer) => { - op.input = runtime.transformer.serialize(op.input); - - const unsubscribe = client.request(op, { - error(err) { - observer.error(err as TRPCClientError); - unsubscribe(); - }, - complete() { - observer.complete(); - }, - next(response) { - const transformed = transformResult(response, runtime); + return ({ op }) => + observable((observer) => { + if (op.signal?.aborted) { + observer.complete(); + return; + } + + const request = client.request( + { ...op, input: transformer.input.serialize(op.input) }, + (message) => { + let transformed: ReturnType; + try { + transformed = transformResult(message, transformer.output); + } catch (cause) { + observer.error(TRPCClientError.from(cause as Error)); + return; + } if (!transformed.ok) { observer.error(TRPCClientError.from(transformed.error)); @@ -113,18 +134,17 @@ export function ipcLink(): TRPCLink { } observer.next({ result: transformed.result }); + if (isFinalMessage(op.type, message)) observer.complete(); + } + ); - if (op.type !== 'subscription') { - unsubscribe(); - observer.complete(); - } - }, - }); + const onAbort = () => observer.complete(); + op.signal?.addEventListener('abort', onAbort, { once: true }); return () => { - unsubscribe(); + op.signal?.removeEventListener('abort', onAbort); + request[Symbol.dispose](); }; }); - }; }; } diff --git a/packages/electron-trpc/src/renderer/utils.ts b/packages/electron-trpc/src/renderer/utils.ts deleted file mode 100644 index 73c2f353..00000000 --- a/packages/electron-trpc/src/renderer/utils.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { AnyRouter, inferRouterError } from '@trpc/server'; -import type { TRPCResponse, TRPCResponseMessage, TRPCResultMessage } from '@trpc/server/rpc'; -import type { TRPCClientRuntime } from '@trpc/client'; - -// from @trpc/client/src/links/internals/transformResult -// FIXME: -// - the generics here are probably unnecessary -// - the RPC-spec could probably be simplified to combine HTTP + WS -/** @internal */ -export function transformResult( - response: - | TRPCResponseMessage> - | TRPCResponse>, - runtime: TRPCClientRuntime -) { - if ('error' in response) { - const error = runtime.transformer.deserialize(response.error) as inferRouterError; - return { - ok: false, - error: { - ...response, - error, - }, - } as const; - } - - const result = { - ...response.result, - ...((!response.result.type || response.result.type === 'data') && { - type: 'data', - data: runtime.transformer.deserialize(response.result.data) as unknown, - }), - } as TRPCResultMessage['result']; - return { ok: true, result } as const; -} diff --git a/packages/electron-trpc/src/types.ts b/packages/electron-trpc/src/types.ts index 66278c90..e25e4ca6 100644 --- a/packages/electron-trpc/src/types.ts +++ b/packages/electron-trpc/src/types.ts @@ -1,10 +1,26 @@ -import type { Operation } from '@trpc/client'; +import type { TRPCProcedureType } from '@trpc/server'; import type { TRPCResponseMessage } from '@trpc/server/rpc'; +/** + * A message from a renderer to the main process. `clientId` identifies the renderer-side client, + * since operation ids are only unique within a single client. + */ export type ETRPCRequest = - { method: 'request'; operation: Operation } | { method: 'subscription.stop'; id: number }; + | { + method: 'request'; + clientId: string; + operation: { id: number; type: TRPCProcedureType; path: string; input: unknown }; + } + | { method: 'stop'; clientId: string; id: number }; + +/** A message from the main process to the renderer-side client identified by `clientId`. */ +export interface ETRPCResponse { + clientId: string; + message: TRPCResponseMessage; +} export interface RendererGlobalElectronTRPC { - sendMessage: (args: ETRPCRequest) => void; - onMessage: (callback: (args: TRPCResponseMessage) => void) => void; + sendMessage: (request: ETRPCRequest) => void; + /** Returns a function that removes the listener. */ + onMessage: (callback: (response: ETRPCResponse) => void) => () => void; } diff --git a/packages/electron-trpc/tsconfig.json b/packages/electron-trpc/tsconfig.json index 9334314e..18bc2f1a 100644 --- a/packages/electron-trpc/tsconfig.json +++ b/packages/electron-trpc/tsconfig.json @@ -1,17 +1,21 @@ { "compilerOptions": { + "composite": true, + "emitDeclarationOnly": true, "isolatedModules": true, - "lib": ["dom", "esnext"], "module": "esnext", "moduleResolution": "bundler", - "noEmit": true, "noFallthroughCasesInSwitch": true, "noUnusedLocals": true, "noUnusedParameters": true, + "skipLibCheck": true, "strict": true, - "target": "esnext", - "types": ["node"] + "target": "esnext" }, - "include": ["src"], - "exclude": ["src/**/__tests__"] + "files": [], + "references": [ + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.web.json" }, + { "path": "./tsconfig.spec.json" } + ] } diff --git a/packages/electron-trpc/tsconfig.node.json b/packages/electron-trpc/tsconfig.node.json new file mode 100644 index 00000000..d663e48b --- /dev/null +++ b/packages/electron-trpc/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "lib": ["esnext"], + "types": ["node"], + "outDir": "node_modules/.tsc/node" + }, + "files": [], + "include": ["src/main", "src/preload", "src/*.ts"], + "exclude": ["src/**/__tests__"], + "references": [] +} diff --git a/packages/electron-trpc/tsconfig.spec.json b/packages/electron-trpc/tsconfig.spec.json new file mode 100644 index 00000000..c8567e5b --- /dev/null +++ b/packages/electron-trpc/tsconfig.spec.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "lib": ["dom", "esnext"], + "types": ["node"], + "emitDeclarationOnly": false, + "noEmit": true, + "tsBuildInfoFile": "node_modules/.tsc/spec.tsbuildinfo" + }, + "files": [], + "include": ["src", "*.config.ts"], + "references": [] +} diff --git a/packages/electron-trpc/tsconfig.web.json b/packages/electron-trpc/tsconfig.web.json new file mode 100644 index 00000000..74f8c530 --- /dev/null +++ b/packages/electron-trpc/tsconfig.web.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "lib": ["dom", "esnext"], + "types": [], + "outDir": "node_modules/.tsc/web" + }, + "files": [], + "include": ["src/renderer", "src/*.ts"], + "exclude": ["src/**/__tests__"], + "references": [] +} diff --git a/packages/electron-trpc/tsdown.config.ts b/packages/electron-trpc/tsdown.config.ts index 9b5c28ce..937dc846 100644 --- a/packages/electron-trpc/tsdown.config.ts +++ b/packages/electron-trpc/tsdown.config.ts @@ -1,5 +1,8 @@ import { defineConfig } from 'tsdown'; +// Lower newer syntax such as `using` declarations, so consumers bundling this don't have to parse it. +const target = 'es2022'; + export default defineConfig([ { entry: { @@ -9,7 +12,10 @@ export default defineConfig([ }, format: ['esm', 'cjs'], platform: 'node', - dts: true, + target, + dts: { generator: 'oxc' }, + // Our types use `Disposable`, which consumers only have with `esnext.disposable` in their `lib`. + banner: { dts: '/// ' }, clean: true, }, { @@ -18,6 +24,7 @@ export default defineConfig([ entry: { 'preload-auto': 'src/preload/autoPreload.ts' }, format: 'cjs', platform: 'node', + target, dts: false, clean: false, deps: { onlyImport: ['electron'] }, diff --git a/packages/electron-trpc/vitest.config.ts b/packages/electron-trpc/vitest.config.ts index 46e7d5e9..d15623f7 100644 --- a/packages/electron-trpc/vitest.config.ts +++ b/packages/electron-trpc/vitest.config.ts @@ -4,6 +4,7 @@ export default defineConfig({ test: { coverage: { include: ['src/**/*'], + exclude: ['src/**/__tests__/**'], reporter: ['text', 'cobertura', 'html'], }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e87433c..9675f8a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -185,177 +185,177 @@ importers: examples/basic-react: dependencies: '@tanstack/react-query': - specifier: ^4.29.14 - version: 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.105.0 + version: 5.105.0(@types/react@19.3.0)(react@19.3.1) '@trpc/client': - specifier: 10.33.1 - version: 10.33.1(@trpc/server@10.33.1) - '@trpc/react-query': - specifier: 10.33.1 - version: 10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 11.19.0 + version: 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) '@trpc/server': - specifier: 10.33.1 - version: 10.33.1 + specifier: 11.19.0 + version: 11.19.0(typescript@7.0.2) + '@trpc/tanstack-react-query': + specifier: 11.19.0 + version: 11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2) electron: - specifier: 29.3.2 - version: 29.3.2 + specifier: ^45.1.0 + version: 45.1.0 electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: ^19.3.1 + version: 19.3.1 react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + specifier: ^19.3.1 + version: 19.3.1(react@19.3.1) zod: - specifier: ^3.21.4 - version: 3.25.76 + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@types/node': - specifier: ^20.12.8 - version: 20.19.43 + specifier: ^24.9.0 + version: 24.19.2 '@types/react': - specifier: ^18.3.1 - version: 18.3.31 + specifier: ^19.2.0 + version: 19.3.0 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.31) + specifier: ^19.2.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0)) + specifier: ^6.1.2 + version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) vite: - specifier: ^5.2.11 - version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) + specifier: ^8.3.5 + version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) vite-plugin-electron: - specifier: ^0.28.7 - version: 0.28.8 + specifier: ^1.1.2 + version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) examples/basic-react-superjson: dependencies: '@tanstack/react-query': - specifier: ^4.29.14 - version: 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.105.0 + version: 5.105.0(@types/react@19.3.0)(react@19.3.1) '@trpc/client': - specifier: 10.33.1 - version: 10.33.1(@trpc/server@10.33.1) - '@trpc/react-query': - specifier: 10.33.1 - version: 10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 11.19.0 + version: 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) '@trpc/server': - specifier: 10.33.1 - version: 10.33.1 + specifier: 11.19.0 + version: 11.19.0(typescript@7.0.2) + '@trpc/tanstack-react-query': + specifier: 11.19.0 + version: 11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2) electron: - specifier: 29.3.2 - version: 29.3.2 + specifier: ^45.1.0 + version: 45.1.0 electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: ^19.3.1 + version: 19.3.1 react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + specifier: ^19.3.1 + version: 19.3.1(react@19.3.1) superjson: - specifier: ^1.12.3 - version: 1.13.3 + specifier: ^2.2.6 + version: 2.2.6 zod: - specifier: ^3.21.4 - version: 3.25.76 + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@types/node': - specifier: ^20.12.8 - version: 20.19.43 + specifier: ^24.9.0 + version: 24.19.2 '@types/react': - specifier: ^18.3.1 - version: 18.3.31 + specifier: ^19.2.0 + version: 19.3.0 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.31) + specifier: ^19.2.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0)) + specifier: ^6.1.2 + version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) vite: - specifier: ^5.2.11 - version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) + specifier: ^8.3.5 + version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) vite-plugin-electron: - specifier: ^0.28.7 - version: 0.28.8 + specifier: ^1.1.2 + version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) examples/basic-vanilla-esm: dependencies: '@trpc/client': - specifier: 10.33.1 - version: 10.33.1(@trpc/server@10.33.1) + specifier: 11.19.0 + version: 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) '@trpc/server': - specifier: 10.33.1 - version: 10.33.1 + specifier: 11.19.0 + version: 11.19.0(typescript@7.0.2) electron: - specifier: 29.3.2 - version: 29.3.2 + specifier: ^45.1.0 + version: 45.1.0 electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc vite: - specifier: ^5.2.11 - version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) + specifier: ^8.3.5 + version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) zod: - specifier: ^3.21.4 - version: 3.25.76 + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@types/node': - specifier: ^20.12.8 - version: 20.19.43 + specifier: ^24.9.0 + version: 24.19.2 examples/manual-preload-react: dependencies: '@tanstack/react-query': - specifier: ^4.29.14 - version: 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.105.0 + version: 5.105.0(@types/react@19.3.0)(react@19.3.1) '@trpc/client': - specifier: 10.33.1 - version: 10.33.1(@trpc/server@10.33.1) - '@trpc/react-query': - specifier: 10.33.1 - version: 10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 11.19.0 + version: 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) '@trpc/server': - specifier: 10.33.1 - version: 10.33.1 + specifier: 11.19.0 + version: 11.19.0(typescript@7.0.2) + '@trpc/tanstack-react-query': + specifier: 11.19.0 + version: 11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2) electron: - specifier: 29.3.2 - version: 29.3.2 + specifier: ^45.1.0 + version: 45.1.0 electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc react: - specifier: ^18.2.0 - version: 18.3.1 + specifier: ^19.3.1 + version: 19.3.1 react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) + specifier: ^19.3.1 + version: 19.3.1(react@19.3.1) zod: - specifier: ^3.21.4 - version: 3.25.76 + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@types/node': - specifier: ^20.12.8 - version: 20.19.43 + specifier: ^24.9.0 + version: 24.19.2 '@types/react': - specifier: ^18.3.1 - version: 18.3.31 + specifier: ^19.2.0 + version: 19.3.0 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.7(@types/react@18.3.31) + specifier: ^19.2.0 + version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0)) + specifier: ^6.1.2 + version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) vite: - specifier: ^5.2.11 - version: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) + specifier: ^8.3.5 + version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) vite-plugin-electron: - specifier: ^0.28.7 - version: 0.28.8 + specifier: ^1.1.2 + version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) packages/electron-trpc: dependencies: @@ -364,11 +364,11 @@ importers: version: 4.4.3 devDependencies: '@trpc/client': - specifier: 10.45.2 - version: 10.45.2(@trpc/server@10.45.2) + specifier: 11.19.0 + version: 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) '@trpc/server': - specifier: 10.45.2 - version: 10.45.2 + specifier: 11.19.0 + version: 11.19.0(typescript@7.0.2) '@types/debug': specifier: ^4.1.13 version: 4.1.13 @@ -546,18 +546,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.29.7': - resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.29.7': - resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.29.7': resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} engines: {node: '>=6.9.0'} @@ -700,10 +688,6 @@ packages: resolution: {integrity: sha512-+ZdkmRVBonPJwpZBFQr9y4pY8DP6lgbm+Pj5pQzSFrnDGiBAi3Pee1jivAsgK61Ct4W8SGUHVtl7FNbm5c6rgg==} engines: {node: '>=22.12.0'} - '@electron/get@2.0.3': - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} - '@electron/get@5.1.0': resolution: {integrity: sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==} engines: {node: '>=22.12.0'} @@ -1362,9 +1346,6 @@ packages: cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} @@ -1536,53 +1517,40 @@ packages: '@shikijs/vscode-textmate@10.1.0': resolution: {integrity: sha512-cVBuhDQjBZaNMTwBquYfPydrUP+E3hE6oYGasx8h6ZrODIM7/r+gxLDXdd66oszbrggZHEntdE6j+5gYIVyMWQ==} - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - - '@tanstack/query-core@4.44.0': - resolution: {integrity: sha512-swSgb7OiPRR3UuIL7NuDrZNSMGmQD+wdtHxPD7j60SvBEnxbXurl5XOirtGEX2gm2hbK6mC8kMV1I+uO3l0UOw==} + '@tanstack/query-core@5.105.0': + resolution: {integrity: sha512-7p56vRmT/z4UJ6sctGIdl5WRUQyUv53IUpUwEKi2g97zMbO7zh8ZsCLffGAvCPBR4xD72e3VXsDyLwXHhoNTMQ==} - '@tanstack/react-query@4.44.0': - resolution: {integrity: sha512-RuIqHYrS98LrK/8kJJOJMMSQ/BCpojwsXDh7p0fBmp38ZOz6dlk+uyFRRusH+V+t3POoCsDOQ2zhomEYOeReXw==} + '@tanstack/react-query@5.105.0': + resolution: {integrity: sha512-y+hMuDERvgg6ay1da0V1a6ZC0ZONt7dELxSFkqRZuwm7p1TTZs0MoXrPlBRflIpRoYjvzQVYxycnLImpFLhWrw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-native: '*' + '@types/react': ^18 || ^19 + react: ^18 || ^19 peerDependenciesMeta: - react-dom: - optional: true - react-native: + '@types/react': optional: true - '@trpc/client@10.33.1': - resolution: {integrity: sha512-j1YKBl/VtjCK3nUQFacsouGpsk/DFVNiekp4sZf8Lryb6f1OIChlLJZNEipl+DUuHxsPVuaCQis4PGkrIb2ieg==} + '@trpc/client@11.19.0': + resolution: {integrity: sha512-0MKkPq6MejsKB5Opca1Rl22KVIaqo2+A1EiXyZ8EGUsl9TLrPdpGn+Usux20TZKFwnSC2+wI/WilqNJaP4ODfw==} + hasBin: true peerDependencies: - '@trpc/server': 10.33.1 + '@trpc/server': 11.19.0 + typescript: '>=5.7.2' - '@trpc/client@10.45.2': - resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} + '@trpc/server@11.19.0': + resolution: {integrity: sha512-7C1goiDurz82yFKtZUbEzjXd0Rg/jyisaIZQhdvus+1l7E6mwcEYZXjZ1US/HF8kOyz1LERL8UN3bcboJtjcyQ==} + hasBin: true peerDependencies: - '@trpc/server': 10.45.2 + typescript: '>=5.7.2' - '@trpc/react-query@10.33.1': - resolution: {integrity: sha512-Jpdg9xOyVJ4k+0wg28CxEEU1KcUVP+nMzpPbhISWOKaP1WZTGaQxphsCwx8KEFVaRiutKGBxhC24D+WhX7tMpA==} + '@trpc/tanstack-react-query@11.19.0': + resolution: {integrity: sha512-KYmZBRyqZqm9oY66a3tXxBlT9PLLG+YiH//4VRzrY7jCekeusYwzMkz9GAmyqnmAlc+n/9nbfzTmtIA0IordRw==} + hasBin: true peerDependencies: - '@tanstack/react-query': ^4.18.0 - '@trpc/client': 10.33.1 - '@trpc/server': 10.33.1 - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@trpc/server@10.33.1': - resolution: {integrity: sha512-ObMzyEALXhQ7QTVQdSJ+IL1wYB7UdLLoIhqHraYzqKb9sTTsL3+U64kK084KPsRd4b8R3yH/bzBOnCn8Hbrxkw==} - - '@trpc/server@10.45.2': - resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + '@tanstack/react-query': ^5.80.3 + '@trpc/client': 11.19.0 + '@trpc/server': 11.19.0 + react: '>=18.2.0' + typescript: '>=5.7.2' '@tybys/wasm-util@0.10.4': resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} @@ -1599,9 +1567,6 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1623,12 +1588,6 @@ packages: '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} - '@types/http-cache-semantics@4.2.0': - resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} - - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1644,25 +1603,16 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.19.43': - resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} - '@types/node@24.19.2': resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + '@types/react-dom@19.3.0': + resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} peerDependencies: - '@types/react': ^18.0.0 - - '@types/react@18.3.31': - resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + '@types/react': ^19.3.0 - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/react@19.3.0': + resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -1673,9 +1623,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} @@ -1799,11 +1746,21 @@ packages: '@ungap/structured-clone@1.4.0': resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@6.1.2': + resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + oxc-transform-react: ^0.152.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + oxc-transform-react: + optional: true '@vitest/coverage-v8@5.0.5': resolution: {integrity: sha512-4KpkGdIrSqBihx/JyP/e+S+IKB98etg1XDQiLAxksLfcShnwi1VReGeOT9NI43hLHbknosKp/1CCLn9Zgcs8mg==} @@ -2138,10 +2095,6 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} @@ -2155,9 +2108,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -2165,14 +2115,6 @@ packages: resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} engines: {node: '>=20.19.0'} - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -2233,9 +2175,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2263,6 +2202,12 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.3.1: + resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2270,10 +2215,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - copy-anything@4.1.5: resolution: {integrity: sha512-vePst2VLTSqPglW7Q98VwFpGiGpOHTyXIo81MO5VyLecA5zMbZw/P/V1vmwD1jksa2iJpn/YkDrJ3XhTfzUyhQ==} engines: {node: '>=18'} @@ -2319,18 +2260,6 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -2346,9 +2275,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - deterministic-object-hash@2.0.2: resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} engines: {node: '>=18'} @@ -2394,11 +2320,6 @@ packages: electron-to-chromium@1.5.467: resolution: {integrity: sha512-Nw9X371rtZmYcBSnEijnCDONILjs93biCZO34juC7MBOmK8E+GFnyD4T/WvyrlJkppul7oxg6TwvtKst9SODTw==} - electron@29.3.2: - resolution: {integrity: sha512-pRWsaFtbd78kEHR0lg5aMhZDY6b5JykIEhZRtyTCaJpGFObB2NFIJDzR7mTia0cZp3pPq60n/SS4gRxvSM5WFQ==} - engines: {node: '>= 12.20.55'} - hasBin: true - electron@45.1.0: resolution: {integrity: sha512-i7qKVAh/KR5v1pf56NhGGX2QYHcdjvLgS7koL6ui50c+zUDGLRunR95nXcTpHPURKOQ4GDBG8BmXiDgOQ8DD0A==} engines: {node: '>= 22.12.0'} @@ -2431,31 +2352,16 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -2550,11 +2456,6 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2571,9 +2472,6 @@ packages: fastq@1.20.3: resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2633,10 +2531,6 @@ packages: get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-tsconfig@5.0.0-beta.6: resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} engines: {node: '>=20.20.0'} @@ -2654,26 +2548,10 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - global-agent@3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2681,9 +2559,6 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} @@ -2762,10 +2637,6 @@ packages: http-cache-semantics@4.3.0: resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - human-id@4.2.2: resolution: {integrity: sha512-Z+8unD6em/MJwyrkWQ2M3wygRGI1+MztbutiNwk1DCuEPXOZRWGjtcMPZYP1exY9iNZMhd7ZOSMQSo9WYtiQRw==} hasBin: true @@ -2866,10 +2737,6 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -2900,15 +2767,9 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2923,9 +2784,6 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -3016,6 +2874,10 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -3030,14 +2892,6 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3063,10 +2917,6 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} - mdast-util-definitions@6.0.0: resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} @@ -3249,10 +3099,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -3268,6 +3114,9 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -3325,17 +3174,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - obug@3.0.0: resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} engines: {node: '>=12.20.0'} @@ -3360,10 +3201,6 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -3433,9 +3270,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3455,6 +3289,12 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.4.0: + resolution: {integrity: sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==} + playwright-core@1.64.1: resolution: {integrity: sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==} engines: {node: '>=20'} @@ -3532,25 +3372,17 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.3.1: + resolution: {integrity: sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==} peerDependencies: - react: ^18.3.1 + react: ^19.3.1 - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.3.1: + resolution: {integrity: sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==} engines: {node: '>=0.10.0'} read-yaml-file@1.1.0: @@ -3645,9 +3477,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -3655,9 +3484,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -3678,10 +3504,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - rolldown-plugin-dts@0.28.8: resolution: {integrity: sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} @@ -3737,16 +3559,13 @@ packages: resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.28.0: + resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3756,10 +3575,6 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -3829,9 +3644,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - stacktracey@2.2.0: resolution: {integrity: sha512-ETyQEz+CzXiLjEbyJqpbp+/T79RQD/6wqFucRBIlVNZfYq2Ay7wbretD4cxpbymZlaPWx58aIhPEY1Cr8DlVvg==} @@ -3893,10 +3705,6 @@ packages: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} - superjson@1.13.3: - resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} - engines: {node: '>=10'} - superjson@2.2.6: resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} engines: {node: '>=16'} @@ -4011,10 +3819,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -4041,9 +3845,6 @@ packages: unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} @@ -4098,11 +3899,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - use-sync-external-store@1.7.0: - resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4119,9 +3915,10 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-electron@0.28.8: - resolution: {integrity: sha512-ir+B21oSGK9j23OEvt4EXyco9xDCaF6OGFe0V/8Zc0yL2+HMyQ6mmNQEIhXsEsZCSfIowBpwQBeHH4wVsfraeg==} + vite-plugin-electron@1.1.2: + resolution: {integrity: sha512-EAHs3zhK+33FhdasevCRVMMOFIHT+MDg5EcD47CCwxDcJ1REYqb7EeR0RHOjCKS7P2ip/q1ISzzMpK3H+p8uTA==} peerDependencies: + vite: '>=6' vite-plugin-electron-renderer: '*' peerDependenciesMeta: vite-plugin-electron-renderer: @@ -4459,9 +4256,6 @@ packages: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -4741,16 +4535,6 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -4980,20 +4764,6 @@ snapshots: '@electron-internal/extract-zip@1.0.7': {} - '@electron/get@2.0.3': - dependencies: - debug: 4.4.3 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.1 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - '@electron/get@5.1.0': dependencies: debug: 4.4.3 @@ -5468,8 +5238,6 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.2.15': optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.1': {} '@rollup/pluginutils@5.5.1(rollup@4.66.0)': @@ -5590,41 +5358,31 @@ snapshots: '@shikijs/vscode-textmate@10.1.0': {} - '@sindresorhus/is@4.6.0': {} - - '@szmarczak/http-timer@4.0.6': - dependencies: - defer-to-connect: 2.0.1 - - '@tanstack/query-core@4.44.0': {} + '@tanstack/query-core@5.105.0': {} - '@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1)': dependencies: - '@tanstack/query-core': 4.44.0 - react: 18.3.1 - use-sync-external-store: 1.7.0(react@18.3.1) + '@tanstack/query-core': 5.105.0 + react: 19.3.1 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + '@types/react': 19.3.0 - '@trpc/client@10.33.1(@trpc/server@10.33.1)': + '@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2)': dependencies: - '@trpc/server': 10.33.1 + '@trpc/server': 11.19.0(typescript@7.0.2) + typescript: 7.0.2 - '@trpc/client@10.45.2(@trpc/server@10.45.2)': + '@trpc/server@11.19.0(typescript@7.0.2)': dependencies: - '@trpc/server': 10.45.2 + typescript: 7.0.2 - '@trpc/react-query@10.33.1(@tanstack/react-query@4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.33.1(@trpc/server@10.33.1))(@trpc/server@10.33.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/tanstack-react-query@11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2)': dependencies: - '@tanstack/react-query': 4.44.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/client': 10.33.1(@trpc/server@10.33.1) - '@trpc/server': 10.33.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@trpc/server@10.33.1': {} - - '@trpc/server@10.45.2': {} + '@tanstack/react-query': 5.105.0(@types/react@19.3.0)(react@19.3.1) + '@trpc/client': 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) + '@trpc/server': 11.19.0(typescript@7.0.2) + react: 19.3.1 + typescript: 7.0.2 '@tybys/wasm-util@0.10.4': dependencies: @@ -5651,13 +5409,6 @@ snapshots: dependencies: '@babel/types': 7.29.11 - '@types/cacheable-request@6.0.3': - dependencies: - '@types/http-cache-semantics': 4.2.0 - '@types/keyv': 3.1.4 - '@types/node': 20.19.43 - '@types/responselike': 1.0.3 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -5681,12 +5432,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/http-cache-semantics@4.2.0': {} - - '@types/keyv@3.1.4': - dependencies: - '@types/node': 20.19.43 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5701,29 +5446,18 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.19.43': - dependencies: - undici-types: 6.21.0 - '@types/node@24.19.2': dependencies: undici-types: 7.24.6 - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.7(@types/react@18.3.31)': + '@types/react-dom@19.3.0(@types/react@19.3.0)': dependencies: - '@types/react': 18.3.31 + '@types/react': 19.3.0 - '@types/react@18.3.31': + '@types/react@19.3.0': dependencies: - '@types/prop-types': 15.7.15 csstype: 3.2.3 - '@types/responselike@1.0.3': - dependencies: - '@types/node': 20.19.43 - '@types/sax@1.2.7': dependencies: '@types/node': 24.19.2 @@ -5732,11 +5466,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 20.19.43 - optional: true - '@typescript/typescript-aix-ppc64@7.0.2': optional: true @@ -5799,17 +5528,10 @@ snapshots: '@ungap/structured-clone@1.4.0': {} - '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0))': + '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1))': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 5.4.21(@types/node@20.19.43)(lightningcss@1.33.0) - transitivePeerDependencies: - - supports-color + '@rolldown/pluginutils': 1.0.1 + vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) '@vitest/coverage-v8@5.0.5(vitest@5.0.5)': dependencies: @@ -6158,9 +5880,6 @@ snapshots: boolbase@1.0.0: {} - boolean@3.2.0: - optional: true - boxen@8.0.1: dependencies: ansi-align: 3.0.1 @@ -6184,8 +5903,6 @@ snapshots: node-releases: 2.0.60 update-browserslist-db: 1.3.4(browserslist@4.29.5) - buffer-crc32@0.2.13: {} - buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -6193,18 +5910,6 @@ snapshots: cac@7.1.0: {} - cacheable-lookup@5.0.4: {} - - cacheable-request@7.0.4: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.3.0 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - camelcase@8.0.0: {} caniuse-lite@1.0.30001819: {} @@ -6255,10 +5960,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-response@1.0.3: - dependencies: - mimic-response: 1.0.1 - clsx@2.1.1: {} collapse-white-space@2.1.0: {} @@ -6283,14 +5984,14 @@ snapshots: common-ancestor-path@1.0.1: {} + confbox@0.1.8: {} + + confbox@0.3.1: {} + convert-source-map@2.0.0: {} cookie@0.7.2: {} - copy-anything@3.0.5: - dependencies: - is-what: 4.1.16 - copy-anything@4.1.5: {} cross-spawn@7.0.6: @@ -6323,22 +6024,6 @@ snapshots: deep-extend@0.6.0: {} - defer-to-connect@2.0.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - optional: true - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - optional: true - defu@6.1.7: {} dequal@2.0.3: {} @@ -6347,9 +6032,6 @@ snapshots: detect-libc@2.1.2: {} - detect-node@2.1.0: - optional: true - deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 @@ -6378,14 +6060,6 @@ snapshots: electron-to-chromium@1.5.467: {} - electron@29.3.2: - dependencies: - '@electron/get': 2.0.3 - '@types/node': 20.19.43 - extract-zip: 2.0.1 - transitivePeerDependencies: - - supports-color - electron@45.1.0: dependencies: '@electron-internal/extract-zip': 1.0.7 @@ -6418,23 +6092,12 @@ snapshots: entities@6.0.1: {} - env-paths@2.2.1: {} - env-paths@3.0.0: {} - es-define-property@1.0.1: - optional: true - - es-errors@1.3.0: - optional: true - es-module-lexer@1.7.0: {} es-module-lexer@2.3.2: {} - es6-error@4.1.1: - optional: true - esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -6576,16 +6239,6 @@ snapshots: extendable-error@0.1.7: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -6604,10 +6257,6 @@ snapshots: dependencies: reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 @@ -6658,10 +6307,6 @@ snapshots: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - get-tsconfig@5.0.0-beta.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -6676,22 +6321,6 @@ snapshots: glob-to-regexp@0.4.1: {} - global-agent@3.0.0: - dependencies: - boolean: 3.2.0 - es6-error: 4.1.1 - matcher: 3.0.0 - roarr: 2.15.4 - semver: 7.8.5 - serialize-error: 7.0.1 - optional: true - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - optional: true - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -6701,23 +6330,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.2.0: - optional: true - - got@11.8.6: - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - graceful-fs@4.2.11: {} gray-matter@4.0.3: @@ -6727,11 +6339,6 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - optional: true - hast-util-embedded@3.0.0: dependencies: '@types/hast': 3.0.5 @@ -6936,11 +6543,6 @@ snapshots: http-cache-semantics@4.3.0: {} - http2-wrapper@1.0.3: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - human-id@4.2.2: {} iconv-lite@0.7.3: @@ -7008,8 +6610,6 @@ snapshots: is-unicode-supported@2.1.0: {} - is-what@4.1.16: {} - is-windows@1.0.2: {} is-wsl@3.1.1: @@ -7033,13 +6633,8 @@ snapshots: jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-schema-traverse@1.0.0: {} - json-stringify-safe@5.0.1: - optional: true - json5@2.2.3: {} jsonc-parser@2.3.1: {} @@ -7050,10 +6645,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - kind-of@6.0.3: {} kleur@3.0.3: {} @@ -7116,6 +6707,12 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.4.0 + quansync: 0.2.11 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -7129,12 +6726,6 @@ snapshots: longest-streak@3.1.0: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lowercase-keys@2.0.0: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -7167,11 +6758,6 @@ snapshots: markdown-table@3.0.4: {} - matcher@3.0.0: - dependencies: - escape-string-regexp: 4.0.0 - optional: true - mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.4 @@ -7649,8 +7235,6 @@ snapshots: mimic-function@5.0.1: {} - mimic-response@1.0.1: {} - mimic-response@3.1.0: {} miniflare@3.20250718.3: @@ -7674,6 +7258,13 @@ snapshots: mkdirp-classic@0.5.3: {} + mlly@1.8.2: + dependencies: + acorn: 8.19.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + mri@1.2.0: {} mrmime@2.0.1: {} @@ -7708,15 +7299,10 @@ snapshots: normalize-path@3.0.0: {} - normalize-url@6.1.0: {} - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - object-keys@1.1.1: - optional: true - obug@3.0.0: {} ohash@2.0.12: {} @@ -7749,8 +7335,6 @@ snapshots: outdent@0.5.0: {} - p-cancelable@2.1.1: {} - p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -7827,8 +7411,6 @@ snapshots: pathe@2.0.3: {} - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -7841,6 +7423,18 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.4.0: + dependencies: + confbox: 0.3.1 + exsolve: 1.2.0 + pathe: 2.0.3 + playwright-core@1.64.1: {} playwright@1.64.1: @@ -7914,8 +7508,6 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -7923,17 +7515,12 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@18.3.1(react@18.3.1): + react-dom@19.3.1(react@19.3.1): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-refresh@0.17.0: {} + react: 19.3.1 + scheduler: 0.28.0 - react@18.3.1: - dependencies: - loose-envify: 1.4.0 + react@19.3.1: {} read-yaml-file@1.1.0: dependencies: @@ -8099,16 +7686,10 @@ snapshots: require-from-string@2.0.2: {} - resolve-alpn@1.2.1: {} - resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} - responselike@2.0.1: - dependencies: - lowercase-keys: 2.0.0 - restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -8141,16 +7722,6 @@ snapshots: reusify@1.1.0: {} - roarr@2.15.4: - dependencies: - boolean: 3.2.0 - detect-node: 2.1.0 - globalthis: 1.0.4 - json-stringify-safe: 5.0.1 - semver-compare: 1.0.0 - sprintf-js: 1.1.3 - optional: true - rolldown-plugin-dts@0.28.8(rolldown@1.2.15)(typescript@7.0.2): dependencies: dts-resolver: 3.0.0 @@ -8242,27 +7813,17 @@ snapshots: sax@1.6.1: {} - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.28.0: {} section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver-compare@1.0.0: - optional: true - semver@6.3.1: {} semver@7.8.5: {} - serialize-error@7.0.1: - dependencies: - type-fest: 0.13.1 - optional: true - sharp@0.32.6: dependencies: color: 4.2.3 @@ -8364,9 +7925,6 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: - optional: true - stacktracey@2.2.0: dependencies: as-table: 1.0.55 @@ -8436,10 +7994,6 @@ snapshots: transitivePeerDependencies: - supports-color - superjson@1.13.3: - dependencies: - copy-anything: 3.0.5 - superjson@2.2.6: dependencies: copy-anything: 4.1.5 @@ -8557,9 +8111,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - type-fest@0.13.1: - optional: true - type-fest@4.41.0: {} typesafe-path@0.2.2: {} @@ -8600,8 +8151,6 @@ snapshots: '@quansync/fs': 1.1.0 quansync: 1.0.0 - undici-types@6.21.0: {} - undici-types@7.24.6: {} undici@5.29.0: @@ -8678,10 +8227,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - use-sync-external-store@1.7.0(react@18.3.1): - dependencies: - react: 18.3.1 - util-deprecate@1.0.2: {} verkit@0.5.0: {} @@ -8701,17 +8246,10 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-electron@0.28.8: {} - - vite@5.4.21(@types/node@20.19.43)(lightningcss@1.33.0): + vite-plugin-electron@1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)): dependencies: - esbuild: 0.21.5 - postcss: 8.5.32 - rollup: 4.66.0 - optionalDependencies: - '@types/node': 20.19.43 - fsevents: 2.3.3 - lightningcss: 1.33.0 + local-pkg: 1.2.1 + vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0): dependencies: @@ -8974,11 +8512,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@1.2.2: {} youch@3.3.4: From e6c94f981a49909c3ccfeb282a5f44ba38dd404d Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 18:18:06 -0400 Subject: [PATCH 15/20] Add an `allow` option to reject requests by sender. The preload script exposes electron-trpc to every page in its sessions, so apps that load content they don't trust need a way to refuse its requests. `allow` is checked for every request, and rejected requests fail with a `FORBIDDEN` error rather than never settling. --- .changeset/allow-requests.md | 5 +++ README.md | 11 +++++++ .../electron-trpc/src/__tests__/ipc.test.ts | 31 +++++++++++++++++++ .../src/main/createIPCHandler.ts | 7 +++++ .../electron-trpc/src/main/handleRequest.ts | 6 ++++ 5 files changed, 60 insertions(+) create mode 100644 .changeset/allow-requests.md diff --git a/.changeset/allow-requests.md b/.changeset/allow-requests.md new file mode 100644 index 00000000..167529be --- /dev/null +++ b/.changeset/allow-requests.md @@ -0,0 +1,5 @@ +--- +'electron-trpc': minor +--- + +Add an `allow` option to `createIPCHandler`, which decides whether to handle each request, e.g. based on `event.senderFrame.url`. Rejected requests fail with a `FORBIDDEN` error. diff --git a/README.md b/README.md index d58e4a07..68db44f7 100644 --- a/README.md +++ b/README.md @@ -91,3 +91,14 @@ exposeElectronTRPC(); ``` > Note: `electron-trpc` depends on `contextIsolation` being enabled, which is the default. + +## Restricting Access + +The preload script exposes electron-trpc to every page in its sessions, including any remote content your app loads. To only handle requests from pages you trust, check the sender with `allow`. Requests it rejects fail with a `FORBIDDEN` error: + +```ts +createIPCHandler({ + router, + allow: (event) => new URL(event.senderFrame?.url ?? '').protocol === 'app:', +}); +``` diff --git a/packages/electron-trpc/src/__tests__/ipc.test.ts b/packages/electron-trpc/src/__tests__/ipc.test.ts index e637565f..0da36bd9 100644 --- a/packages/electron-trpc/src/__tests__/ipc.test.ts +++ b/packages/electron-trpc/src/__tests__/ipc.test.ts @@ -173,6 +173,37 @@ describe('procedures', () => { }); }); +describe('access', () => { + test('rejects requests that `allow` denies, without running them', async () => { + const contents = new FakeWebContents(); + const subframe = contents.addSubframe(); + const createContext = vi.fn(() => ({ webContentsId: contents.id })); + const onError = vi.fn(); + startHandler({ + allow: (event) => event.senderFrame === (contents.mainFrame as unknown), + createContext, + onError, + }); + + await expect(createClient(contents.mainFrame.document).echo.query('allowed')).resolves.toBe( + 'allowed' + ); + const error = await createClient(subframe.document) + .echo.query('denied') + .catch((cause) => cause); + + expect(error).toBeInstanceOf(TRPCClientError); + expect(error.data).toMatchObject({ code: 'FORBIDDEN' }); + expect(createContext).toHaveBeenCalledTimes(1); + expect(onError).toHaveBeenCalledWith( + expect.objectContaining({ + path: 'echo', + error: expect.objectContaining({ code: 'FORBIDDEN' }), + }) + ); + }); +}); + describe('transformers', () => { test('round-trips inputs and outputs through superjson', async () => { const t = initTRPC.create({ transformer: superjson }); diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 9278cd64..8df1f91c 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -13,6 +13,12 @@ const debug = debugFactory('electron-trpc:main:IPCHandler'); export interface CreateIPCHandlerOptions { router: TRouter; + /** + * Decides whether to handle a request, e.g. by checking `event.senderFrame.url`. Requests it + * rejects fail with a `FORBIDDEN` error. Every request is allowed by default, so set this when + * your app loads content you don't trust, which electron-trpc is exposed to like any other page. + */ + allow?: (event: IpcMainEvent) => boolean; createContext?: ( opts: CreateContextOptions ) => inferRouterContext | Promise>; @@ -81,6 +87,7 @@ class IPCHandlerImpl implements IPCHandler { void handleRequest({ router: this.options.router, + allow: this.options.allow, createContext: this.options.createContext, onError: this.options.onError, event, diff --git a/packages/electron-trpc/src/main/handleRequest.ts b/packages/electron-trpc/src/main/handleRequest.ts index 7a91ed17..9d70b138 100644 --- a/packages/electron-trpc/src/main/handleRequest.ts +++ b/packages/electron-trpc/src/main/handleRequest.ts @@ -18,6 +18,7 @@ type MaybePromise = T | Promise; export interface HandleRequestOptions { router: TRouter; + allow?: (event: IpcMainEvent) => boolean; createContext?: (opts: CreateContextOptions) => MaybePromise>; onError?: (opts: IPCHandlerErrorOptions) => void; event: IpcMainEvent; @@ -46,6 +47,7 @@ const nextOrAbort = (iterator: AsyncIterator, signal: AbortSignal) => export async function handleRequest({ router, + allow, createContext, onError, event, @@ -64,6 +66,10 @@ export async function handleRequest({ }; try { + if (allow && !allow(event)) { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Request was not allowed' }); + } + input = serializedInput === undefined ? undefined From 4c4c95c6ad76464fce0e95fe9b10c2c5457b65b4 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 18:39:04 -0400 Subject: [PATCH 16/20] Release 1.0.0 directly instead of another alpha. Exit pre-release mode, and rewrite the changesets for people upgrading from 0.7.1, who never had the alpha's `autoRegisterPreload` option. --- .changeset/automatic-preload.md | 5 +++++ .changeset/disposable-ipc-handler.md | 2 +- .changeset/ipc-fixes.md | 2 +- .changeset/modern-pumpkins-collect.md | 5 ----- .changeset/pre.json | 2 +- .changeset/seven-carrots-live.md | 5 ----- .changeset/trpc-11-support.md | 2 +- 7 files changed, 9 insertions(+), 14 deletions(-) create mode 100644 .changeset/automatic-preload.md delete mode 100644 .changeset/modern-pumpkins-collect.md delete mode 100644 .changeset/seven-carrots-live.md diff --git a/.changeset/automatic-preload.md b/.changeset/automatic-preload.md new file mode 100644 index 00000000..4dc5cc91 --- /dev/null +++ b/.changeset/automatic-preload.md @@ -0,0 +1,5 @@ +--- +'electron-trpc': major +--- + +Breaking change: `createIPCHandler` registers electron-trpc's preload script itself, on the default session or the sessions passed as `preload: { sessions }`, so apps no longer need one. Apps that expose electron-trpc from their own preload script pass `preload: false` and import `exposeElectronTRPC` from `electron-trpc/preload` instead of `electron-trpc/main`. diff --git a/.changeset/disposable-ipc-handler.md b/.changeset/disposable-ipc-handler.md index 8c7c01f9..765f1615 100644 --- a/.changeset/disposable-ipc-handler.md +++ b/.changeset/disposable-ipc-handler.md @@ -2,4 +2,4 @@ 'electron-trpc': major --- -Breaking change: `createIPCHandler` returns a `Disposable` handler that serves every window, replacing the `windows` option and `attachWindow`/`detachWindow`. `autoRegisterPreload: false` is now `preload: false`, and `preload: { sessions }` registers the preload script on sessions other than the default. Requests are cancelled when their page navigates away, reloads, crashes or closes. +Breaking change: `createIPCHandler` returns a `Disposable` handler that serves every window, replacing the `windows` option and `attachWindow`/`detachWindow`. Requests are cancelled when their page navigates away, reloads, crashes or closes, and disposing the handler cancels everything still running. diff --git a/.changeset/ipc-fixes.md b/.changeset/ipc-fixes.md index 6585b2ed..91befb5f 100644 --- a/.changeset/ipc-fixes.md +++ b/.changeset/ipc-fixes.md @@ -2,4 +2,4 @@ 'electron-trpc': patch --- -Fix responses reaching the wrong client when a page has several (#201), types not resolving with `moduleResolution: bundler` (#229), and `instanceof TRPCClientError` failing in the renderer (#209). +Fix responses reaching the wrong client when a page has several (#201), types not resolving with `moduleResolution: bundler` (#229), `instanceof TRPCClientError` failing in the renderer (#209), and electron-trpc not working in sandboxed renderers (#116). diff --git a/.changeset/modern-pumpkins-collect.md b/.changeset/modern-pumpkins-collect.md deleted file mode 100644 index b3757a04..00000000 --- a/.changeset/modern-pumpkins-collect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'electron-trpc': major ---- - -Breaking change: Preload is automatically registered by default in CJS or ESM contexts. diff --git a/.changeset/pre.json b/.changeset/pre.json index 63fed6d7..b8e81757 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "alpha", "initialVersions": { "examples/basic-react": "0.0.16", diff --git a/.changeset/seven-carrots-live.md b/.changeset/seven-carrots-live.md deleted file mode 100644 index 37aa84da..00000000 --- a/.changeset/seven-carrots-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'electron-trpc': major ---- - -Breaking change: exposeElectronTRPC is now imported from 'electron-trpc/preload' diff --git a/.changeset/trpc-11-support.md b/.changeset/trpc-11-support.md index 3b04ffd0..8564a62d 100644 --- a/.changeset/trpc-11-support.md +++ b/.changeset/trpc-11-support.md @@ -2,4 +2,4 @@ 'electron-trpc': major --- -Breaking change: Requires tRPC 11 and Electron 35 or later. Transformers are now passed to `ipcLink`, as with tRPC 11's other links. +Breaking change: Requires tRPC 11 and Electron 35 or later. Pass transformers to `ipcLink` instead of the client, as with tRPC 11's other links. From d9912d52aaad57d494bb9bbe972a7b2639988b0c Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 20:56:01 -0400 Subject: [PATCH 17/20] Find the preload script in webpack builds, and fail clearly when it's missing. Packaged webpack apps, like electron-forge's, ship only the webpack output, so the preload script was never found and renderers silently had no `electronTRPC`. A `webpack` export condition gives webpack the ES module build, whose `new URL(..., import.meta.url)` reference makes webpack copy the script into its output. `createIPCHandler` now uses the first location where the script exists, and otherwise throws an error explaining how to expose electron-trpc from the app's own preload script, which the README documents along with when it's needed. The basic-webpack example runs its e2e test from a copy of only the webpack output, as a packaged app would. --- .changeset/automatic-preload.md | 2 +- .gitignore | 1 + .prettierignore | 1 + README.md | 11 +- examples/basic-webpack/electron/api.js | 10 + examples/basic-webpack/electron/index.js | 13 + examples/basic-webpack/index.e2e.ts | 27 + examples/basic-webpack/index.html | 12 + examples/basic-webpack/package.json | 22 + examples/basic-webpack/src/index.js | 18 + examples/basic-webpack/webpack.config.js | 16 + packages/electron-trpc/package.json | 1 + .../main/__tests__/registerPreload.test.ts | 30 + .../src/main/createIPCHandler.ts | 13 +- .../electron-trpc/src/main/registerPreload.ts | 48 +- pnpm-lock.yaml | 904 +++++++++++++++--- 16 files changed, 972 insertions(+), 157 deletions(-) create mode 100644 examples/basic-webpack/electron/api.js create mode 100644 examples/basic-webpack/electron/index.js create mode 100644 examples/basic-webpack/index.e2e.ts create mode 100644 examples/basic-webpack/index.html create mode 100644 examples/basic-webpack/package.json create mode 100644 examples/basic-webpack/src/index.js create mode 100644 examples/basic-webpack/webpack.config.js create mode 100644 packages/electron-trpc/src/main/__tests__/registerPreload.test.ts diff --git a/.changeset/automatic-preload.md b/.changeset/automatic-preload.md index 4dc5cc91..2a81608f 100644 --- a/.changeset/automatic-preload.md +++ b/.changeset/automatic-preload.md @@ -2,4 +2,4 @@ 'electron-trpc': major --- -Breaking change: `createIPCHandler` registers electron-trpc's preload script itself, on the default session or the sessions passed as `preload: { sessions }`, so apps no longer need one. Apps that expose electron-trpc from their own preload script pass `preload: false` and import `exposeElectronTRPC` from `electron-trpc/preload` instead of `electron-trpc/main`. +Breaking change: `createIPCHandler` registers electron-trpc's preload script itself, on the default session or the sessions passed as `preload: { sessions }`, so apps no longer need one. Apps that expose electron-trpc from their own preload script pass `preload: false` and import `exposeElectronTRPC` from `electron-trpc/preload` instead of `electron-trpc/main`. If a build bundles electron-trpc without its preload script, `createIPCHandler` throws an error explaining how to expose it from your own preload script instead. diff --git a/.gitignore b/.gitignore index a7dcefe1..36c413fc 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ dist-electron/ docs/.vitepress/cache/ coverage/ test-results/ +.webpack/ diff --git a/.prettierignore b/.prettierignore index 0979ddb4..381c3adf 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,6 @@ **/dist/ **/dist-electron/ +**/.webpack/ **/coverage/ pnpm-lock.yaml diff --git a/README.md b/README.md index 68db44f7..234ba6ca 100644 --- a/README.md +++ b/README.md @@ -72,13 +72,20 @@ npm install --save electron-trpc ## Preload Script -The preload script is registered on Electron's default session. If your windows use other sessions, pass them instead: +`createIPCHandler` registers electron-trpc's preload script on Electron's default session, so your app doesn't need one. If your windows use other sessions, pass them instead: ```ts createIPCHandler({ router, preload: { sessions: [session.fromPartition('persist:app')] } }); ``` -To expose electron-trpc from your own preload script instead, pass `preload: false` and call `exposeElectronTRPC` there: +The preload script is a file in the electron-trpc package, so your packaged app has to include it. That works without any setup when: + +- Your app ships electron-trpc in `node_modules`, for example as a `dependency` packaged by electron-builder, whether or not your main process is bundled. +- Your main process is bundled with webpack, including electron-forge's webpack template. webpack copies the preload script into its output. + +If your build bundles electron-trpc into the main process without including its preload script, `createIPCHandler` throws an error saying it couldn't find the preload script. This usually happens when electron-trpc is a `devDependency`, or when your packager only ships your bundled code. It usually only shows up in packaged apps, so test a packaged build of your app. + +To fix it, expose electron-trpc from your own preload script. Pass `preload: false` and call `exposeElectronTRPC` there: ```ts // main process diff --git a/examples/basic-webpack/electron/api.js b/examples/basic-webpack/electron/api.js new file mode 100644 index 00000000..205b2035 --- /dev/null +++ b/examples/basic-webpack/electron/api.js @@ -0,0 +1,10 @@ +const { initTRPC } = require('@trpc/server'); +const z = require('zod'); + +const t = initTRPC.create({ isServer: true }); + +exports.router = t.router({ + greeting: t.procedure + .input(z.object({ name: z.string() })) + .query(({ input }) => ({ text: `Hello ${input.name}` })), +}); diff --git a/examples/basic-webpack/electron/index.js b/examples/basic-webpack/electron/index.js new file mode 100644 index 00000000..7d8e3413 --- /dev/null +++ b/examples/basic-webpack/electron/index.js @@ -0,0 +1,13 @@ +const path = require('node:path'); +const { app, BrowserWindow } = require('electron'); +const { createIPCHandler } = require('electron-trpc/main'); +const { router } = require('./api'); + +app.on('ready', () => { + // webpack copies electron-trpc's preload script into its output, so this works once packaged. + createIPCHandler({ router }); + + const win = new BrowserWindow(); + win.loadFile(path.join(app.getAppPath(), '.webpack/renderer/index.html')); + win.show(); +}); diff --git a/examples/basic-webpack/index.e2e.ts b/examples/basic-webpack/index.e2e.ts new file mode 100644 index 00000000..17cb09a4 --- /dev/null +++ b/examples/basic-webpack/index.e2e.ts @@ -0,0 +1,27 @@ +import { cpSync, mkdtempSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { _electron as electron, test, expect } from '@playwright/test'; + +test('Hello Electron, packaged with webpack', async () => { + // Packaged webpack apps, like electron-forge's, ship only the webpack output. + const app = mkdtempSync(path.join(tmpdir(), 'electron-trpc-webpack-')); + cpSync(path.join(__dirname, '.webpack'), path.join(app, '.webpack'), { recursive: true }); + cpSync(path.join(__dirname, 'package.json'), path.join(app, 'package.json')); + + const electronApp = await electron.launch({ + args: [app], + executablePath: require('electron') as unknown as string, + env: { + ...process.env, + NODE_ENV: 'development', + }, + }); + + const window = await electronApp.firstWindow(); + await window.waitForLoadState('load'); + expect(await window.title()).toBe('Hello from Electron renderer!'); + await expect(window.getByTestId('greeting')).toHaveText('Hello Electron'); + + await electronApp.close(); +}); diff --git a/examples/basic-webpack/index.html b/examples/basic-webpack/index.html new file mode 100644 index 00000000..8695dc67 --- /dev/null +++ b/examples/basic-webpack/index.html @@ -0,0 +1,12 @@ + + + + + + + + Hello from Electron renderer! + + + + diff --git a/examples/basic-webpack/package.json b/examples/basic-webpack/package.json new file mode 100644 index 00000000..78687cb9 --- /dev/null +++ b/examples/basic-webpack/package.json @@ -0,0 +1,22 @@ +{ + "name": "examples/basic-webpack", + "version": "0.0.0", + "private": true, + "main": ".webpack/main/index.js", + "license": "MIT", + "scripts": { + "start": "pnpm build && electron .", + "build": "webpack && cp index.html .webpack/renderer/" + }, + "dependencies": { + "@trpc/client": "11.19.0", + "@trpc/server": "11.19.0", + "electron": "^45.1.0", + "electron-trpc": "workspace:*", + "zod": "^4.6.7" + }, + "devDependencies": { + "webpack": "^5.112.2", + "webpack-cli": "^7.2.3" + } +} diff --git a/examples/basic-webpack/src/index.js b/examples/basic-webpack/src/index.js new file mode 100644 index 00000000..944f913c --- /dev/null +++ b/examples/basic-webpack/src/index.js @@ -0,0 +1,18 @@ +import { createTRPCClient } from '@trpc/client'; +import { ipcLink } from 'electron-trpc/renderer'; + +const trpc = createTRPCClient({ + links: [ipcLink()], +}); + +async function writeGreeting() { + const greeting = await trpc.greeting.query({ name: 'Electron' }); + + const div = document.createElement('div'); + div.innerText = greeting.text; + div.setAttribute('data-testid', 'greeting'); + + document.body.appendChild(div); +} + +writeGreeting(); diff --git a/examples/basic-webpack/webpack.config.js b/examples/basic-webpack/webpack.config.js new file mode 100644 index 00000000..b532c832 --- /dev/null +++ b/examples/basic-webpack/webpack.config.js @@ -0,0 +1,16 @@ +const path = require('node:path'); + +module.exports = [ + { + mode: 'production', + target: 'electron-main', + entry: './electron/index.js', + output: { path: path.resolve(__dirname, '.webpack/main'), filename: 'index.js' }, + }, + { + mode: 'production', + target: 'web', + entry: './src/index.js', + output: { path: path.resolve(__dirname, '.webpack/renderer'), filename: 'index.js' }, + }, +]; diff --git a/packages/electron-trpc/package.json b/packages/electron-trpc/package.json index 4bc5f7fd..58ad16c5 100644 --- a/packages/electron-trpc/package.json +++ b/packages/electron-trpc/package.json @@ -20,6 +20,7 @@ ], "exports": { "./main": { + "webpack": "./dist/main.mjs", "import": { "types": "./dist/main.d.mts", "default": "./dist/main.mjs" diff --git a/packages/electron-trpc/src/main/__tests__/registerPreload.test.ts b/packages/electron-trpc/src/main/__tests__/registerPreload.test.ts new file mode 100644 index 00000000..6573f286 --- /dev/null +++ b/packages/electron-trpc/src/main/__tests__/registerPreload.test.ts @@ -0,0 +1,30 @@ +import { initTRPC } from '@trpc/server'; +import { beforeEach, expect, test, vi } from 'vitest'; +import { createIPCHandler } from '..'; +import { ELECTRON_TRPC_CHANNEL } from '../../constants'; +import { ipcMain, reset, session } from '../../__tests__/fakeElectron'; + +vi.mock('electron', () => import('../../__tests__/fakeElectron')); +// As in a packaged app whose build bundled electron-trpc without its preload script. +vi.mock('fs', async (importOriginal) => ({ + ...(await importOriginal()), + existsSync: () => false, +})); + +const router = initTRPC.create().router({}); + +beforeEach(() => reset()); + +test('fails clearly, leaving nothing behind, when the preload script is missing', () => { + expect(() => createIPCHandler({ router })).toThrow(/couldn't find its preload script/); + + expect(ipcMain.listenerCount(ELECTRON_TRPC_CHANNEL)).toBe(0); + expect(session.defaultSession.registerPreloadScript).not.toHaveBeenCalled(); +}); + +test('does not need the preload script with `preload: false`', () => { + using handler = createIPCHandler({ router, preload: false }); + + expect(handler).toBeDefined(); + expect(ipcMain.listenerCount(ELECTRON_TRPC_CHANNEL)).toBe(1); +}); diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 8df1f91c..9c9b4432 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -35,24 +35,29 @@ export interface CreateIPCHandlerOptions { export interface IPCHandler extends Disposable {} class IPCHandlerImpl implements IPCHandler { - readonly #stack = new DisposableStack(); + readonly #stack: DisposableStack; readonly #contents = new Map(); constructor(private readonly options: CreateIPCHandlerOptions) { + // Undoes whatever was already set up if anything below throws. + using stack = new DisposableStack(); + const listener = (event: IpcMainEvent, request: ETRPCRequest) => { this.#handleMessage(event, request); }; ipcMain.on(ELECTRON_TRPC_CHANNEL, listener); - this.#stack.defer(() => ipcMain.off(ELECTRON_TRPC_CHANNEL, listener)); + stack.defer(() => ipcMain.off(ELECTRON_TRPC_CHANNEL, listener)); if (options.preload !== false) { - this.#stack.use(registerPreload(options.preload?.sessions ?? [session.defaultSession])); + stack.use(registerPreload(options.preload?.sessions ?? [session.defaultSession])); } - this.#stack.defer(() => { + stack.defer(() => { for (const scope of this.#contents.values()) scope[Symbol.dispose](); this.#contents.clear(); }); + + this.#stack = stack.move(); } #contentsScope(webContents: WebContents) { diff --git a/packages/electron-trpc/src/main/registerPreload.ts b/packages/electron-trpc/src/main/registerPreload.ts index 8063b302..9587c218 100644 --- a/packages/electron-trpc/src/main/registerPreload.ts +++ b/packages/electron-trpc/src/main/registerPreload.ts @@ -1,26 +1,54 @@ import type { Session } from 'electron'; -import path from 'path'; +import { existsSync } from 'fs'; +import { createRequire } from 'module'; import { fileURLToPath } from 'url'; import debugFactory from 'debug'; const debug = debugFactory('electron-trpc:main:registerPreload'); -const resolvePreloadPath = () => { - if (typeof require !== 'undefined' && typeof require.resolve === 'function') { - // CommonJS: resolve through the package so this still works when bundled into the app. - return require.resolve('electron-trpc/preload-auto'); +/** + * Where the preload script may be, in order of preference. Bundlers that understand + * `new URL(..., import.meta.url)`, like webpack, copy the script into their output and point the + * first location at the copy. Resolving through the package finds it wherever electron-trpc is still + * in `node_modules` at runtime. + */ +const preloadLocations = [ + () => fileURLToPath(new URL('./preload-auto.cjs', import.meta.url)), + () => createRequire(import.meta.url).resolve('electron-trpc/preload-auto'), +]; + +const findPreloadScript = () => { + const candidates: string[] = []; + for (const location of preloadLocations) { + try { + const candidate = location(); + // Bundlers may replace these with something that isn't a path at all. + if (typeof candidate === 'string') candidates.push(candidate); + } catch { + // The location can't be resolved in this build, so try the next one. + } } - if (typeof import.meta.url !== 'undefined') { - // ESM: the preload script sits next to this module in `dist`. - return path.join(path.dirname(fileURLToPath(import.meta.url)), 'preload-auto.cjs'); + + const filePath = candidates.find((candidate) => existsSync(candidate)); + if (!filePath) { + throw new Error( + [ + "electron-trpc couldn't find its preload script. This happens when your build bundles " + + 'electron-trpc into the main process without including the script, and usually only ' + + 'shows up in packaged apps.', + 'Pass `preload: false` to `createIPCHandler` and call `exposeElectronTRPC()` from your own ' + + 'preload script instead. See https://github.com/jsonnull/electron-trpc#preload-script', + `Looked in: ${candidates.join(', ') || 'nowhere'}`, + ].join('\n\n') + ); } - throw new Error('Failed to resolve the electron-trpc preload script path.'); + return filePath; }; /** Registers the electron-trpc preload script on each session until disposed. */ export function registerPreload(sessions: Session[]): Disposable { const stack = new DisposableStack(); - const filePath = resolvePreloadPath(); + const filePath = findPreloadScript(); for (const session of sessions) { debug('Registering preload script', filePath); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9675f8a3..4291c58e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -198,7 +198,7 @@ importers: version: 11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2) electron: specifier: ^45.1.0 - version: 45.1.0 + version: 45.1.0(supports-color@8.1.1) electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc @@ -223,13 +223,13 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.2 - version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^8.3.5 - version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + version: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) vite-plugin-electron: specifier: ^1.1.2 - version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) examples/basic-react-superjson: dependencies: @@ -247,7 +247,7 @@ importers: version: 11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2) electron: specifier: ^45.1.0 - version: 45.1.0 + version: 45.1.0(supports-color@8.1.1) electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc @@ -275,13 +275,13 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.2 - version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^8.3.5 - version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + version: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) vite-plugin-electron: specifier: ^1.1.2 - version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) examples/basic-vanilla-esm: dependencies: @@ -293,13 +293,13 @@ importers: version: 11.19.0(typescript@7.0.2) electron: specifier: ^45.1.0 - version: 45.1.0 + version: 45.1.0(supports-color@8.1.1) electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc vite: specifier: ^8.3.5 - version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + version: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) zod: specifier: ^4.6.7 version: 4.6.7 @@ -308,6 +308,31 @@ importers: specifier: ^24.9.0 version: 24.19.2 + examples/basic-webpack: + dependencies: + '@trpc/client': + specifier: 11.19.0 + version: 11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2) + '@trpc/server': + specifier: 11.19.0 + version: 11.19.0(typescript@7.0.2) + electron: + specifier: ^45.1.0 + version: 45.1.0(supports-color@8.1.1) + electron-trpc: + specifier: workspace:* + version: link:../../packages/electron-trpc + zod: + specifier: ^4.6.7 + version: 4.6.7 + devDependencies: + webpack: + specifier: ^5.112.2 + version: 5.112.2(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack-cli@7.2.3) + webpack-cli: + specifier: ^7.2.3 + version: 7.2.3(js-yaml@4.3.2)(json5@2.2.3)(webpack@5.112.2) + examples/manual-preload-react: dependencies: '@tanstack/react-query': @@ -324,7 +349,7 @@ importers: version: 11.19.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.1))(@trpc/client@11.19.0(@trpc/server@11.19.0(typescript@7.0.2))(typescript@7.0.2))(@trpc/server@11.19.0(typescript@7.0.2))(react@19.3.1)(typescript@7.0.2) electron: specifier: ^45.1.0 - version: 45.1.0 + version: 45.1.0(supports-color@8.1.1) electron-trpc: specifier: workspace:* version: link:../../packages/electron-trpc @@ -349,19 +374,19 @@ importers: version: 19.3.0(@types/react@19.3.0) '@vitejs/plugin-react': specifier: ^6.1.2 - version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 6.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) vite: specifier: ^8.3.5 - version: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + version: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) vite-plugin-electron: specifier: ^1.1.2 - version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 1.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) packages/electron-trpc: dependencies: debug: specifier: ^4.4.3 - version: 4.4.3 + version: 4.4.3(supports-color@8.1.1) devDependencies: '@trpc/client': specifier: 11.19.0 @@ -380,7 +405,7 @@ importers: version: 5.0.5(vitest@5.0.5) electron: specifier: ^45.1.0 - version: 45.1.0 + version: 45.1.0(supports-color@8.1.1) superjson: specifier: ^2.2.6 version: 2.2.6 @@ -392,7 +417,7 @@ importers: version: 7.0.2 vitest: specifier: ^5.0.5 - version: 5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + version: 5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) zod: specifier: ^4.6.7 version: 4.6.7 @@ -404,10 +429,10 @@ importers: version: 0.7.0(@emnapi/runtime@1.11.3)(prettier@3.9.10)(typescript@5.9.3) '@astrojs/starlight': specifier: ^0.23.2 - version: 0.23.4(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)) + version: 0.23.4(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3))(supports-color@8.1.1) astro: specifier: ^4.8.6 - version: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) + version: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3) sharp: specifier: ^0.32.5 version: 0.32.6 @@ -684,6 +709,10 @@ packages: resolution: {integrity: sha512-9rQHijqB2Rq6qOEC/xHaA6aPlsKGi5kmCQW50O1asn9g63XFeD5NmBwysriistW5Xx0JPafyD/TA7yk2S3pXGQ==} engines: {node: '>=14'} + '@discoveryjs/json-ext@1.1.0': + resolution: {integrity: sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==} + engines: {node: '>=14.17.0'} + '@electron-internal/extract-zip@1.0.7': resolution: {integrity: sha512-+ZdkmRVBonPJwpZBFQr9y4pY8DP6lgbm+Pj5pQzSFrnDGiBAi3Pee1jivAsgK61Ct4W8SGUHVtl7FNbm5c6rgg==} engines: {node: '>=22.12.0'} @@ -1154,6 +1183,9 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.6.0': resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} @@ -1588,6 +1620,9 @@ packages: '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1834,6 +1869,57 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@yuku-core/binding-android-arm64@0.19.0': resolution: {integrity: sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==} cpu: [arm64] @@ -1930,11 +2016,19 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + ajv-i18n@4.2.0: resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==} peerDependencies: ajv: ^8.0.0-beta.0 + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -2108,6 +2202,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -2155,6 +2252,10 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -2175,6 +2276,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2199,6 +2304,13 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -2344,6 +2456,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.26.0: + resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -2356,6 +2472,15 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + envinfo@7.21.0: + resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} + engines: {node: '>=4'} + hasBin: true + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -2428,6 +2553,10 @@ packages: events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} @@ -2496,6 +2625,10 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -2516,6 +2649,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2559,6 +2695,14 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} @@ -2652,6 +2796,11 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -2668,6 +2817,10 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2681,6 +2834,10 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-core-module@2.17.0: + resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -2725,6 +2882,10 @@ packages: 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'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -2748,6 +2909,14 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -2971,6 +3140,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3090,6 +3262,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -3111,6 +3287,61 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimizer-webpack-plugin@5.13.1: + resolution: {integrity: sha512-1mhAfvachWYYOm8tpmany5NLuvP+F2wxZWBSX8DC0uFS2wJpM9q3rWgN9wBooAH9d5V12wX0BjyJe4fMjHMarQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@napi-rs/image': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + imagemin: '*' + lightningcss: '*' + postcss: '*' + sharp: '*' + svgo: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@napi-rs/image': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + imagemin: + optional: true + lightningcss: + optional: true + postcss: + optional: true + sharp: + optional: true + svgo: + optional: true + uglify-js: + optional: true + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -3260,6 +3491,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -3397,6 +3631,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -3477,6 +3715,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -3484,6 +3726,11 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.13: + resolution: {integrity: sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==} + engines: {node: '>= 0.4'} + hasBin: true + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -3562,6 +3809,16 @@ packages: scheduler@0.28.0: resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} + schema-utils@4.8.1: + resolution: {integrity: sha512-x39pYlJPyH7Uge5QO64B9XGP9zLDc9WNmiQZc+CE3IzZPvMu3lHOuAMGpYNoPixEL7MSWlGhYTg5UlLSL8G6iw==} + engines: {node: '>= 10.13.0'} + hasBin: true + peerDependencies: + webpack: ^5.112.0 + peerDependenciesMeta: + webpack: + optional: true + section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -3575,6 +3832,10 @@ packages: engines: {node: '>=10'} hasBin: true + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -3623,6 +3884,9 @@ packages: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3709,6 +3973,18 @@ packages: resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} engines: {node: '>=16'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar-fs@2.1.5: resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} @@ -3729,6 +4005,11 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + terser@5.51.2: + resolution: {integrity: sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==} + engines: {node: '>=10'} + hasBin: true + text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} @@ -4155,12 +4436,57 @@ packages: vscode-uri@3.2.0: resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==} + watchpack@2.6.3: + resolution: {integrity: sha512-s3NZy0QpTY9qGqzc0wtz4qI28z3+5qKbbAec4MV4G9N3CfgZ9wgvQRr0cl2jh/tqkWG1NWHkmVMHZpCamev5Wg==} + engines: {node: '>=10.13.0'} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-cli@7.2.3: + resolution: {integrity: sha512-vDFU7jrfCctnN7jJQWPl+V26B51GLp11prVZXg50oeonsgeBzSTJEWmXkjHsOjTgMjlPOQM8GWLh33X9RN/0ow==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + js-yaml: ^4.0.0 || ^5.0.0 + json5: ^2.2.3 + toml: ^3.0.0 || ^4.0.0 || ^5.0.0 + webpack: ^5.101.0 + webpack-bundle-analyzer: ^4.0.0 || ^5.0.0 + webpack-dev-server: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + js-yaml: + optional: true + json5: + optional: true + toml: + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.6.0: + resolution: {integrity: sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==} + engines: {node: '>=10.13.0'} + + webpack@5.112.2: + resolution: {integrity: sha512-B2tp1LI9D8GVpPDqprdt12ukTkXXahj9MzqSWJq4faSPgOUM7CdZaGAB6HrL/8E6UwbBpdj4vzWDbKoFnVoU6g==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -4186,6 +4512,9 @@ packages: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + workerd@1.20250718.0: resolution: {integrity: sha512-kqkIJP/eOfDlUyBzU7joBg+tl8aB25gEAGqDap+nFWb+WHhnooxjGHgxPBy3ipw2hnShPFNOQt5lFRxbwALirg==} engines: {node: '>=16'} @@ -4353,7 +4682,7 @@ snapshots: - '@emnapi/runtime' - typescript - '@astrojs/markdown-remark@5.3.0': + '@astrojs/markdown-remark@5.3.0(supports-color@8.1.1)': dependencies: '@astrojs/prism': 3.1.0 github-slugger: 2.0.0 @@ -4363,8 +4692,8 @@ snapshots: mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 rehype-stringify: 10.0.1 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 + remark-gfm: 4.0.1(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.2 remark-smartypants: 3.0.3 shiki: 1.29.2 @@ -4376,19 +4705,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@3.1.9(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3))': + '@astrojs/mdx@3.1.9(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3))(supports-color@8.1.1)': dependencies: - '@astrojs/markdown-remark': 5.3.0 - '@mdx-js/mdx': 3.1.1 + '@astrojs/markdown-remark': 5.3.0(supports-color@8.1.1) + '@mdx-js/mdx': 3.1.1(supports-color@8.1.1) acorn: 8.19.0 - astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) + astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 gray-matter: 4.0.3 hast-util-to-html: 9.0.5 kleur: 4.1.5 rehype-raw: 7.0.0 - remark-gfm: 4.0.1 + remark-gfm: 4.0.1(supports-color@8.1.1) remark-smartypants: 3.0.3 source-map: 0.7.6 unist-util-visit: 5.2.0 @@ -4405,36 +4734,36 @@ snapshots: sitemap: 9.0.1 zod: 4.6.7 - '@astrojs/starlight@0.23.4(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3))': + '@astrojs/starlight@0.23.4(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3))(supports-color@8.1.1)': dependencies: - '@astrojs/mdx': 3.1.9(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)) + '@astrojs/mdx': 3.1.9(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3))(supports-color@8.1.1) '@astrojs/sitemap': 3.7.4 '@pagefind/default-ui': 1.5.2 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) - astro-expressive-code: 0.35.6(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)) + astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3) + astro-expressive-code: 0.35.6(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3)) bcp-47: 2.1.2 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 hast-util-to-string: 3.0.1 hastscript: 8.0.0 - mdast-util-directive: 3.1.1 + mdast-util-directive: 3.1.1(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 pagefind: 1.5.2 rehype: 13.0.2 rehype-format: 5.0.1 - remark-directive: 3.0.1 + remark-directive: 3.0.1(supports-color@8.1.1) unified: 11.0.5 unist-util-visit: 5.2.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@astrojs/telemetry@3.1.0': + '@astrojs/telemetry@3.1.0(supports-color@8.1.1)': dependencies: ci-info: 4.4.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) dlv: 1.1.3 dset: 3.1.4 is-docker: 3.0.0 @@ -4455,20 +4784,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.10 '@babel/parser': 7.29.11 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.10(supports-color@8.1.1) '@babel/types': 7.29.11 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4497,19 +4826,19 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.10(supports-color@8.1.1) '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.10 + '@babel/traverse': 7.29.10(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -4530,18 +4859,18 @@ snapshots: dependencies: '@babel/types': 7.29.11 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/types': 7.29.11 transitivePeerDependencies: - supports-color @@ -4554,7 +4883,7 @@ snapshots: '@babel/parser': 7.29.11 '@babel/types': 7.29.11 - '@babel/traverse@7.29.10': + '@babel/traverse@7.29.10(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 @@ -4562,7 +4891,7 @@ snapshots: '@babel/parser': 7.29.11 '@babel/template': 7.29.7 '@babel/types': 7.29.11 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -4762,16 +5091,18 @@ snapshots: '@ctrl/tinycolor@4.2.2': {} + '@discoveryjs/json-ext@1.1.0': {} + '@electron-internal/extract-zip@1.0.7': {} - '@electron/get@5.1.0': + '@electron/get@5.1.0(supports-color@8.1.1)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) env-paths: 3.0.0 graceful-fs: 4.2.11 progress: 2.0.3 semver: 7.8.5 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@8.1.1) optionalDependencies: undici: 7.30.1 transitivePeerDependencies: @@ -5079,6 +5410,11 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': @@ -5107,7 +5443,7 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@mdx-js/mdx@3.1.1': + '@mdx-js/mdx@3.1.1(supports-color@8.1.1)': dependencies: '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 @@ -5119,14 +5455,14 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-util-scope: 1.0.1 estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.6 + hast-util-to-jsx-runtime: 2.3.6(supports-color@8.1.1) markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 recma-jsx: 1.0.1(acorn@8.19.0) recma-stringify: 1.0.0 - rehype-recma: 1.0.0 - remark-mdx: 3.1.1 - remark-parse: 11.0.0 + rehype-recma: 1.0.0(supports-color@8.1.1) + remark-mdx: 3.1.1(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.2 source-map: 0.7.6 unified: 11.0.5 @@ -5432,6 +5768,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5528,10 +5866,10 @@ snapshots: '@ungap/structured-clone@1.4.0': {} - '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1))': + '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + vite: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) '@vitest/coverage-v8@5.0.5(vitest@5.0.5)': dependencies: @@ -5543,7 +5881,7 @@ snapshots: obug: 3.0.0 std-env: 4.3.0 tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + vitest: 5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) '@vitest/istanbul-lib-coverage@1.0.2': {} @@ -5551,14 +5889,14 @@ snapshots: dependencies: '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1))': + '@vitest/mocker@5.0.5(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.5 estree-walker: 3.0.3 magic-string: 1.4.5 optionalDependencies: - vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + vite: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) '@vitest/spy@5.0.5': {} @@ -5619,6 +5957,86 @@ snapshots: '@vscode/l10n@0.0.18': {} + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@yuku-core/binding-android-arm64@0.19.0': optional: true @@ -5671,10 +6089,19 @@ snapshots: optionalDependencies: ajv: 8.20.0 + ajv-formats@3.0.1: + dependencies: + ajv: 8.20.0 + ajv-i18n@4.2.0(ajv@8.20.0): dependencies: ajv: 8.20.0 + ajv-keywords@5.1.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + fast-deep-equal: 3.1.3 + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 @@ -5731,19 +6158,19 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.35.6(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3)): + astro-expressive-code@0.35.6(astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3)): dependencies: - astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3) + astro: 4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3) rehype-expressive-code: 0.35.6 - astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(typescript@5.9.3): + astro@4.16.19(@types/node@24.19.2)(lightningcss@1.33.0)(rollup@4.66.0)(supports-color@8.1.1)(terser@5.51.2)(typescript@5.9.3): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.4.1 - '@astrojs/markdown-remark': 5.3.0 - '@astrojs/telemetry': 3.1.0 - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@astrojs/markdown-remark': 5.3.0(supports-color@8.1.1) + '@astrojs/telemetry': 3.1.0(supports-color@8.1.1) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/types': 7.29.11 '@oslojs/encoding': 1.1.0 '@rollup/pluginutils': 5.5.1(rollup@4.66.0) @@ -5758,7 +6185,7 @@ snapshots: common-ancestor-path: 1.0.1 cookie: 0.7.2 cssesc: 3.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) deterministic-object-hash: 2.0.2 devalue: 5.9.4 diff: 5.2.2 @@ -5792,8 +6219,8 @@ snapshots: tsconfck: 3.1.6(typescript@5.9.3) unist-util-visit: 5.2.0 vfile: 6.0.3 - vite: 5.4.21(@types/node@24.19.2)(lightningcss@1.33.0) - vitefu: 1.1.3(vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)) + vite: 5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)(terser@5.51.2) + vitefu: 1.1.3(vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)(terser@5.51.2)) which-pm: 3.0.1 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 @@ -5903,6 +6330,8 @@ snapshots: node-releases: 2.0.60 update-browserslist-db: 1.3.4(browserslist@4.29.5) + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -5944,6 +6373,8 @@ snapshots: chownr@1.1.4: {} + chrome-trace-event@1.0.4: {} + ci-info@4.4.0: {} cli-boxes@3.0.0: {} @@ -5960,6 +6391,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + clsx@2.1.1: {} collapse-white-space@2.1.0: {} @@ -5982,6 +6419,10 @@ snapshots: comma-separated-tokens@2.0.3: {} + commander@14.0.3: {} + + commander@2.20.3: {} + common-ancestor-path@1.0.1: {} confbox@0.1.8: {} @@ -6010,9 +6451,11 @@ snapshots: dataloader@1.4.0: {} - debug@4.4.3: + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decode-named-character-reference@1.3.0: dependencies: @@ -6060,10 +6503,10 @@ snapshots: electron-to-chromium@1.5.467: {} - electron@45.1.0: + electron@45.1.0(supports-color@8.1.1): dependencies: '@electron-internal/extract-zip': 1.0.7 - '@electron/get': 5.1.0 + '@electron/get': 5.1.0(supports-color@8.1.1) '@types/node': 24.19.2 transitivePeerDependencies: - supports-color @@ -6085,6 +6528,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.26.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -6094,6 +6542,10 @@ snapshots: env-paths@3.0.0: {} + envinfo@7.21.0: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} es-module-lexer@2.3.2: {} @@ -6216,6 +6668,8 @@ snapshots: transitivePeerDependencies: - bare-abort-controller + events@3.3.0: {} + exit-hook@2.2.1: {} expand-template@2.0.3: {} @@ -6277,6 +6731,8 @@ snapshots: micromatch: 4.0.8 pkg-dir: 4.2.0 + flat@5.0.2: {} + flattie@1.1.1: {} fs-constants@1.0.0: {} @@ -6296,6 +6752,8 @@ snapshots: fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -6339,6 +6797,12 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 + has-flag@4.0.0: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + hast-util-embedded@3.0.0: dependencies: '@types/hast': 3.0.5 @@ -6440,7 +6904,7 @@ snapshots: unist-util-visit: 5.2.0 zwitch: 2.0.4 - hast-util-to-estree@3.1.3: + hast-util-to-estree@3.1.3(supports-color@8.1.1): dependencies: '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 @@ -6450,9 +6914,9 @@ snapshots: estree-util-attach-comments: 3.0.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.1(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.2.0(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 @@ -6475,7 +6939,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.6: + hast-util-to-jsx-runtime@2.3.6(supports-color@8.1.1): dependencies: '@types/estree': 1.0.9 '@types/hast': 3.0.5 @@ -6484,9 +6948,9 @@ snapshots: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.1(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.2.0(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 @@ -6553,6 +7017,11 @@ snapshots: ignore@5.3.2: {} + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} import-without-cache@0.4.1: {} @@ -6563,6 +7032,8 @@ snapshots: inline-style-parser@0.2.7: {} + interpret@3.1.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -6576,6 +7047,10 @@ snapshots: dependencies: binary-extensions: 2.3.0 + is-core-module@2.17.0: + dependencies: + hasown: 2.0.4 + is-decimal@2.0.1: {} is-docker@3.0.0: {} @@ -6602,6 +7077,10 @@ snapshots: is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -6618,6 +7097,14 @@ snapshots: isexe@2.0.0: {} + isobject@3.0.1: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 24.19.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -6764,13 +7251,13 @@ snapshots: '@types/unist': 3.0.3 unist-util-visit: 5.2.0 - mdast-util-directive@3.1.1: + mdast-util-directive@3.1.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 micromark-util-character: 2.1.1 parse-entities: 4.0.2 @@ -6786,14 +7273,14 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.1.0 - mdast-util-from-markdown@2.1.0: + mdast-util-from-markdown@2.1.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.3 + micromark: 4.0.3(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 @@ -6811,67 +7298,67 @@ snapshots: mdast-util-find-and-replace: 3.0.4 micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.1.0: + mdast-util-gfm-footnote@2.1.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.1: + mdast-util-gfm-strikethrough@2.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@2.0.0: + mdast-util-gfm-table@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-gfm-task-list-item@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.1.0: + mdast-util-gfm@3.1.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.1 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-gfm-footnote: 2.1.0(supports-color@8.1.1) + mdast-util-gfm-strikethrough: 2.0.1(supports-color@8.1.1) + mdast-util-gfm-table: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-task-list-item: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.1: + mdast-util-mdx-expression@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.2.0: + mdast-util-mdx-jsx@3.2.0(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 @@ -6879,7 +7366,7 @@ snapshots: '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 parse-entities: 4.0.2 stringify-entities: 4.0.4 @@ -6888,23 +7375,23 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx@3.0.0: + mdast-util-mdx@3.0.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.1.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) + mdast-util-mdx-expression: 2.0.1(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.2.0(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@2.0.1: + mdast-util-mdxjs-esm@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) mdast-util-to-markdown: 2.2.1 transitivePeerDependencies: - supports-color @@ -6944,6 +7431,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + merge-stream@2.0.0: {} + merge2@1.4.1: {} micromark-core-commonmark@2.0.4: @@ -7203,10 +7692,10 @@ snapshots: micromark-util-types@2.0.3: {} - micromark@4.0.3: + micromark@4.0.3(supports-color@8.1.1): dependencies: '@types/debug': 4.1.13 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.4 @@ -7231,6 +7720,8 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + mime-db@1.54.0: {} + mime@3.0.0: {} mimic-function@5.0.1: {} @@ -7256,6 +7747,19 @@ snapshots: minimist@1.2.8: {} + minimizer-webpack-plugin@5.13.1(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack@5.112.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.8.1(webpack@5.112.2) + terser: 5.51.2 + webpack: 5.112.2(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack-cli@7.2.3) + optionalDependencies: + esbuild: 0.17.19 + lightningcss: 1.33.0 + postcss: 8.5.32 + sharp: 0.33.5 + mkdirp-classic@0.5.3: {} mlly@1.8.2: @@ -7405,6 +7909,8 @@ snapshots: path-key@3.1.1: {} + path-parse@1.0.7: {} + path-to-regexp@6.3.0: {} path-type@4.0.0: {} @@ -7539,6 +8045,10 @@ snapshots: dependencies: picomatch: 2.3.2 + rechoir@0.8.0: + dependencies: + resolve: 1.22.13 + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.9 @@ -7600,11 +8110,11 @@ snapshots: hast-util-raw: 9.1.0 vfile: 6.0.3 - rehype-recma@1.0.0: + rehype-recma@1.0.0(supports-color@8.1.1): dependencies: '@types/estree': 1.0.9 '@types/hast': 3.0.5 - hast-util-to-estree: 3.1.3 + hast-util-to-estree: 3.1.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7621,37 +8131,37 @@ snapshots: rehype-stringify: 10.0.1 unified: 11.0.5 - remark-directive@3.0.1: + remark-directive@3.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-directive: 3.1.1 + mdast-util-directive: 3.1.1(supports-color@8.1.1) micromark-extension-directive: 3.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-gfm@4.0.1: + remark-gfm@4.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 + mdast-util-gfm: 3.1.0(supports-color@8.1.1) micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-stringify: 11.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-mdx@3.1.1: + remark-mdx@3.1.1(supports-color@8.1.1): dependencies: - mdast-util-mdx: 3.0.0 + mdast-util-mdx: 3.0.0(supports-color@8.1.1) micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + remark-parse@11.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.1.0 + mdast-util-from-markdown: 2.1.0(supports-color@8.1.1) micromark-util-types: 2.0.3 unified: 11.0.5 transitivePeerDependencies: @@ -7686,10 +8196,21 @@ snapshots: require-from-string@2.0.2: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} + resolve@1.22.13: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.17.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -7815,6 +8336,15 @@ snapshots: scheduler@0.28.0: {} + schema-utils@4.8.1(webpack@5.112.2): + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.20.0 + ajv-formats: 3.0.1 + ajv-keywords: 5.1.0(ajv@8.20.0) + optionalDependencies: + webpack: 5.112.2(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack-cli@7.2.3) + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 @@ -7824,6 +8354,10 @@ snapshots: semver@7.8.5: {} + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + sharp@0.32.6: dependencies: color: 4.2.3 @@ -7910,6 +8444,11 @@ snapshots: source-map-js@1.2.2: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.6.1: {} source-map@0.7.6: {} @@ -7988,9 +8527,9 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - sumchecker@3.0.1: + sumchecker@3.0.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7998,6 +8537,14 @@ snapshots: dependencies: copy-anything: 4.1.5 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@2.3.3: {} + tar-fs@2.1.5: dependencies: chownr: 1.1.4 @@ -8045,6 +8592,13 @@ snapshots: term-size@2.2.1: {} + terser@5.51.2: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.19.0 + commander: 2.20.3 + source-map-support: 0.5.21 + text-decoder@1.2.7: dependencies: b4a: 1.9.0 @@ -8246,12 +8800,12 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-electron@1.1.2(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)): + vite-plugin-electron@1.1.2(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)): dependencies: local-pkg: 1.2.1 - vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + vite: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) - vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0): + vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)(terser@5.51.2): dependencies: esbuild: 0.21.5 postcss: 8.5.32 @@ -8260,8 +8814,9 @@ snapshots: '@types/node': 24.19.2 fsevents: 2.3.3 lightningcss: 1.33.0 + terser: 5.51.2 - vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1): + vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -8271,16 +8826,17 @@ snapshots: optionalDependencies: '@types/node': 24.19.2 fsevents: 2.3.3 + terser: 5.51.2 yaml: 2.9.1 - vitefu@1.1.3(vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)): + vitefu@1.1.3(vite@5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)(terser@5.51.2)): optionalDependencies: - vite: 5.4.21(@types/node@24.19.2)(lightningcss@1.33.0) + vite: 5.4.21(@types/node@24.19.2)(lightningcss@1.33.0)(terser@5.51.2) - vitest@5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)): + vitest@5.0.5(@types/node@24.19.2)(@vitest/coverage-v8@5.0.5)(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@24.19.2)(yaml@2.9.1)) + '@vitest/mocker': 5.0.5(vite@8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -8291,7 +8847,7 @@ snapshots: tinybench: 6.2.2 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: 8.3.5(@types/node@24.19.2)(yaml@2.9.1) + vite: 8.3.5(@types/node@24.19.2)(terser@5.51.2)(yaml@2.9.1) why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 24.19.2 @@ -8407,10 +8963,76 @@ snapshots: vscode-uri@3.2.0: {} + watchpack@2.6.3: + dependencies: + graceful-fs: 4.2.11 + web-namespaces@2.0.1: {} webidl-conversions@3.0.1: {} + webpack-cli@7.2.3(js-yaml@4.3.2)(json5@2.2.3)(webpack@5.112.2): + dependencies: + '@discoveryjs/json-ext': 1.1.0 + commander: 14.0.3 + cross-spawn: 7.0.6 + envinfo: 7.21.0 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.112.2(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack-cli@7.2.3) + webpack-merge: 6.0.1 + optionalDependencies: + js-yaml: 4.3.2 + json5: 2.2.3 + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.6.0: {} + + webpack@5.112.2(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack-cli@7.2.3): + dependencies: + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + browserslist: 4.29.5 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.26.0 + es-module-lexer: 2.3.2 + events: 3.3.0 + graceful-fs: 4.2.11 + mime-db: 1.54.0 + minimizer-webpack-plugin: 5.13.1(esbuild@0.17.19)(lightningcss@1.33.0)(postcss@8.5.32)(sharp@0.33.5)(webpack@5.112.2) + schema-utils: 4.8.1(webpack@5.112.2) + tapable: 2.3.3 + watchpack: 2.6.3 + webpack-sources: 3.6.0 + optionalDependencies: + webpack-cli: 7.2.3(js-yaml@4.3.2)(json5@2.2.3)(webpack@5.112.2) + transitivePeerDependencies: + - '@minify-html/node' + - '@napi-rs/image' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - imagemin + - lightningcss + - postcss + - sharp + - svgo + - uglify-js + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -8432,6 +9054,8 @@ snapshots: dependencies: string-width: 7.2.0 + wildcard@2.0.1: {} + workerd@1.20250718.0: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20250718.0 From 5580c502161226526254e44f095229a51c544ee2 Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 21:52:25 -0400 Subject: [PATCH 18/20] Ignore malformed messages from renderers. A page could send anything over the electron-trpc channel, and reading fields off a message like `null` threw in the main process, before `allow` could reject the sender. Check a message's shape before handling it. --- .../electron-trpc/src/__tests__/ipc.test.ts | 22 ++++++++++++++++ .../src/main/createIPCHandler.ts | 26 ++++++++++++++++--- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/electron-trpc/src/__tests__/ipc.test.ts b/packages/electron-trpc/src/__tests__/ipc.test.ts index 0da36bd9..75240bec 100644 --- a/packages/electron-trpc/src/__tests__/ipc.test.ts +++ b/packages/electron-trpc/src/__tests__/ipc.test.ts @@ -395,6 +395,28 @@ describe('protocol', () => { return probe.aborted; }; + test('ignores malformed messages, even with `allow` rejecting everything', async () => { + startHandler({ allow: () => false }); + const document = new FakeWebContents().mainFrame.document; + const send = (message: unknown) => document.electronTRPC.sendMessage(message as ETRPCRequest); + + send(null); + send('request'); + send({ method: 'request', clientId: 'client' }); + send({ + method: 'request', + clientId: 'client', + operation: { id: 1, type: 'delete', path: 'echo' }, + }); + send({ method: 'stop', clientId: 42, id: 1 }); + await flush(); + + const error = await createClient(document) + .echo.query('still handled') + .catch((cause) => cause); + expect(error.data).toMatchObject({ code: 'FORBIDDEN' }); + }); + test('ignores requests that reuse a client id from another frame', async () => { const { probe } = startHandler(); const contents = new FakeWebContents(); diff --git a/packages/electron-trpc/src/main/createIPCHandler.ts b/packages/electron-trpc/src/main/createIPCHandler.ts index 9c9b4432..4a325aca 100644 --- a/packages/electron-trpc/src/main/createIPCHandler.ts +++ b/packages/electron-trpc/src/main/createIPCHandler.ts @@ -11,6 +11,21 @@ import type { ETRPCRequest } from '../types'; const debug = debugFactory('electron-trpc:main:IPCHandler'); +const isObject = (value: unknown): value is Record => + typeof value === 'object' && value !== null; + +const procedureTypes: unknown[] = ['query', 'mutation', 'subscription']; + +/** Renderers can send anything, so a message has to be checked before reading from it. */ +const isETRPCRequest = (message: unknown): message is ETRPCRequest => { + if (!isObject(message) || typeof message.clientId !== 'string') return false; + if (message.method === 'stop') return Number.isInteger(message.id); + if (message.method !== 'request' || !isObject(message.operation)) return false; + + const { id, type, path } = message.operation; + return Number.isInteger(id) && procedureTypes.includes(type) && typeof path === 'string'; +}; + export interface CreateIPCHandlerOptions { router: TRouter; /** @@ -42,8 +57,8 @@ class IPCHandlerImpl implements IPCHandler { // Undoes whatever was already set up if anything below throws. using stack = new DisposableStack(); - const listener = (event: IpcMainEvent, request: ETRPCRequest) => { - this.#handleMessage(event, request); + const listener = (event: IpcMainEvent, message: unknown) => { + this.#handleMessage(event, message); }; ipcMain.on(ELECTRON_TRPC_CHANNEL, listener); stack.defer(() => ipcMain.off(ELECTRON_TRPC_CHANNEL, listener)); @@ -75,7 +90,12 @@ class IPCHandlerImpl implements IPCHandler { return scope; } - #handleMessage(event: IpcMainEvent, request: ETRPCRequest) { + #handleMessage(event: IpcMainEvent, request: unknown) { + if (!isETRPCRequest(request)) { + debug('Ignoring malformed message', request); + return; + } + // The sending frame has already navigated or been destroyed, so there is no one to reply to. const frame = event.senderFrame; if (!frame || event.sender.isDestroyed()) return; From 7a9b8e59a4b1ce29cf97de7585c4f12780bdd8cb Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 21:53:32 -0400 Subject: [PATCH 19/20] Stop requests from iframes that were removed. Electron has no event for an iframe being removed, so its requests kept running. Stop a client once it has something to send to a frame that's gone, and sweep up clients of gone frames whenever their window sends a message or creates a frame. --- .../src/__tests__/fakeElectron.ts | 7 +++++ .../electron-trpc/src/__tests__/ipc.test.ts | 26 +++++++++++++++++++ .../electron-trpc/src/main/ClientScope.ts | 7 ++++- .../src/main/WebContentsScope.ts | 11 ++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/packages/electron-trpc/src/__tests__/fakeElectron.ts b/packages/electron-trpc/src/__tests__/fakeElectron.ts index ec873990..a405c526 100644 --- a/packages/electron-trpc/src/__tests__/fakeElectron.ts +++ b/packages/electron-trpc/src/__tests__/fakeElectron.ts @@ -151,9 +151,16 @@ export class FakeWebContents extends EventEmitter { addSubframe(routingId: number = nextId++): FakeFrame { const frame = new FakeFrame(this, this.processId, routingId, nextId++); this.subframes.push(frame); + this.emit('frame-created', {}, { frame }); return frame; } + /** Removes an iframe from the page, which Electron doesn't emit any event for. */ + removeSubframe(frame: FakeFrame) { + frame.remove(); + this.subframes = this.subframes.filter((subframe) => subframe !== frame); + } + /** * Commits a cross-document navigation in `frame`. With `newHost`, the new document gets a new * frame host, as with a cross-process navigation, and the old one is detached. diff --git a/packages/electron-trpc/src/__tests__/ipc.test.ts b/packages/electron-trpc/src/__tests__/ipc.test.ts index 75240bec..51ce8b3a 100644 --- a/packages/electron-trpc/src/__tests__/ipc.test.ts +++ b/packages/electron-trpc/src/__tests__/ipc.test.ts @@ -518,6 +518,32 @@ describe('document lifetimes', () => { expect(values).toEqual([]); }); + test("stops a removed iframe's subscription when it next has something to send", async () => { + const { ee, probe } = startHandler(); + const contents = new FakeWebContents(); + const iframe = contents.addSubframe(); + subscribe(iframe.document, 'removed'); + await flush(); + + contents.removeSubframe(iframe); + ee.emit('event', 'after removal'); + + await vi.waitFor(() => expect(probe.finished).toEqual(['removed'])); + }); + + test("stops a removed iframe's idle subscriptions when another frame sends a request", async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + const iframe = contents.addSubframe(); + subscribe(iframe.document, 'removed'); + await flush(); + + contents.removeSubframe(iframe); + await createClient(contents.mainFrame.document).echo.query('hello'); + + await vi.waitFor(() => expect(probe.finished).toEqual(['removed'])); + }); + test('stops subscriptions when the renderer process crashes', async () => { const { probe } = startHandler(); const contents = new FakeWebContents(); diff --git a/packages/electron-trpc/src/main/ClientScope.ts b/packages/electron-trpc/src/main/ClientScope.ts index 7e815623..0a5559e6 100644 --- a/packages/electron-trpc/src/main/ClientScope.ts +++ b/packages/electron-trpc/src/main/ClientScope.ts @@ -68,7 +68,12 @@ export class ClientScope implements Disposable { } send(message: TRPCResponseMessage) { - if (!this.isLive) return; + // Electron has no event for a removed iframe, so this may be the first sign its frame is gone. + if (!this.isLive) { + debug('Frame is gone, stopping client', this.clientId); + this[Symbol.dispose](); + return; + } const response: ETRPCResponse = { clientId: this.clientId, message }; this.frame.send(ELECTRON_TRPC_CHANNEL, response); } diff --git a/packages/electron-trpc/src/main/WebContentsScope.ts b/packages/electron-trpc/src/main/WebContentsScope.ts index 5e127c02..a7baf01b 100644 --- a/packages/electron-trpc/src/main/WebContentsScope.ts +++ b/packages/electron-trpc/src/main/WebContentsScope.ts @@ -43,16 +43,20 @@ export class WebContentsScope implements Disposable { (client) => !client.isLive || client.frame.frameTreeNodeId === frameTreeNodeId ); }; + // A good moment to notice removed iframes, which Electron has no event for. + const onFrameCreated = () => this.#disposeDeadClients(); const onRenderProcessGone = () => { debug('Render process gone', webContents.id); this.#disposeClients(() => true); }; webContents.on('did-frame-navigate', onFrameNavigate); + webContents.on('frame-created', onFrameCreated); webContents.on('render-process-gone', onRenderProcessGone); webContents.once('destroyed', onDestroyed); this.#stack.defer(() => { webContents.off('did-frame-navigate', onFrameNavigate); + webContents.off('frame-created', onFrameCreated); webContents.off('render-process-gone', onRenderProcessGone); webContents.off('destroyed', onDestroyed); }); @@ -61,6 +65,7 @@ export class WebContentsScope implements Disposable { /** Returns the client for a message, or `undefined` if the id belongs to another frame. */ findClient(frame: WebFrameMain, clientId: string): ClientScope | undefined { + this.#disposeDeadClients(); const client = this.#clients.get(clientId); if (client && !isSameFrame(client.frame, frame)) { debug('Ignoring message for a client in another frame', clientId); @@ -71,6 +76,7 @@ export class WebContentsScope implements Disposable { /** Like `findClient`, but creates the client the first time it sends a request. */ client(frame: WebFrameMain, clientId: string): ClientScope | undefined { + this.#disposeDeadClients(); if (this.#clients.has(clientId)) return this.findClient(frame, clientId); const client = new ClientScope(frame, clientId, (empty) => { @@ -80,6 +86,11 @@ export class WebContentsScope implements Disposable { return client; } + /** Disposes clients whose frame is gone, such as one in an iframe that was removed. */ + #disposeDeadClients() { + this.#disposeClients((client) => !client.isLive); + } + #disposeClients(predicate: (client: ClientScope) => boolean) { for (const [clientId, client] of [...this.#clients]) { if (!predicate(client)) continue; From 1a977e92863dc534e4eb7b23c75527bd5538af3a Mon Sep 17 00:00:00 2001 From: Jason Nall Date: Thu, 29 Oct 2026 22:00:46 -0400 Subject: [PATCH 20/20] Tell frames apart by frame tree node id. `frameToken` only exists from Electron 38, so on 35-37 every frame in a process compared equal, and a frame could stop a request from another frame that used the same client id. A frame tree node id identifies one frame on every supported version, so compare that instead. --- .../electron-trpc/src/__tests__/fakeElectron.ts | 2 +- packages/electron-trpc/src/__tests__/ipc.test.ts | 14 ++++++++++++++ .../electron-trpc/src/main/WebContentsScope.ts | 5 +++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/electron-trpc/src/__tests__/fakeElectron.ts b/packages/electron-trpc/src/__tests__/fakeElectron.ts index a405c526..9882c9a1 100644 --- a/packages/electron-trpc/src/__tests__/fakeElectron.ts +++ b/packages/electron-trpc/src/__tests__/fakeElectron.ts @@ -88,8 +88,8 @@ export class FakeDocument { } } +/** Has no `frameToken`, which Electron only added in 38. */ export class FakeFrame { - readonly frameToken = `frame-token-${nextId++}`; document: FakeDocument = new FakeDocument(this); detached = false; destroyed = false; diff --git a/packages/electron-trpc/src/__tests__/ipc.test.ts b/packages/electron-trpc/src/__tests__/ipc.test.ts index 51ce8b3a..5bfe0a0b 100644 --- a/packages/electron-trpc/src/__tests__/ipc.test.ts +++ b/packages/electron-trpc/src/__tests__/ipc.test.ts @@ -430,6 +430,20 @@ describe('protocol', () => { expect(await runningOperations(probe)).toEqual(['main frame']); }); + test('ignores a stop that reuses a client id from another frame in the same process', async () => { + const { probe } = startHandler(); + const contents = new FakeWebContents(); + const subframe = contents.addSubframe(); + + contents.mainFrame.document.electronTRPC.sendMessage(hang(1, 'main frame')); + await flush(); + subframe.document.electronTRPC.sendMessage({ method: 'stop', clientId: 'client', id: 1 }); + await flush(); + + expect(probe.aborted).toEqual([]); + expect(await runningOperations(probe)).toEqual(['main frame']); + }); + test('ignores a request that reuses an operation id still in flight', async () => { const { probe } = startHandler(); const { electronTRPC } = new FakeWebContents().mainFrame.document; diff --git a/packages/electron-trpc/src/main/WebContentsScope.ts b/packages/electron-trpc/src/main/WebContentsScope.ts index a7baf01b..c5ecbfaa 100644 --- a/packages/electron-trpc/src/main/WebContentsScope.ts +++ b/packages/electron-trpc/src/main/WebContentsScope.ts @@ -5,8 +5,9 @@ import { ClientScope } from './ClientScope'; const debug = debugFactory('electron-trpc:main:WebContentsScope'); -const isSameFrame = (a: WebFrameMain, b: WebFrameMain) => - a.processId === b.processId && a.frameToken === b.frameToken; +// A frame tree node id is unique to one frame and never reused, unlike `frameToken`, which only +// identifies a frame within its renderer process and doesn't exist before Electron 38. +const isSameFrame = (a: WebFrameMain, b: WebFrameMain) => a.frameTreeNodeId === b.frameTreeNodeId; /** * The clients of every document in one `WebContents`. Clients are disposed when the document they