diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c26096792..54f499173 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -46,6 +46,11 @@ jobs: - name: Test react production build run: pnpm test:prod + - name: Prepare runtime with React 16 + working-directory: packages/react/runtime + run: | + pnpm i react@16 react-dom@16 react-router-dom@5 + - name: Test React 16 working-directory: packages/react run: | diff --git a/extension/package.json b/extension/package.json index 0671b901b..451164fb4 100644 --- a/extension/package.json +++ b/extension/package.json @@ -20,7 +20,7 @@ "@preact/preset-vite": "^2.3.0", "@types/chrome": "^0.0.270", "typescript": "^5.8.3", - "vite": "^7.0.0", + "vite": "^6.3.5", "web-ext": "^7.0.0" }, "keywords": [ diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 526f4c9fa..000000000 --- a/karma.conf.js +++ /dev/null @@ -1,374 +0,0 @@ -/*eslint no-var:0, object-shorthand:0 */ - -var coverage = String(process.env.COVERAGE) === "true", - minify = String(process.env.MINIFY) === "true", - ci = String(process.env.CI).match(/^(1|true)$/gi), - sauceLabs = ci && String(process.env.RUN_SAUCE_LABS) === "true", - // always downlevel to ES5 for saucelabs: - downlevel = sauceLabs || String(process.env.DOWNLEVEL) === "true", - path = require("path"), - errorstacks = require("errorstacks"), - kl = require("kolorist"); - -const babel = require("@babel/core"); -const fs = require("fs").promises; - -var localLaunchers = { - ChromeNoSandboxHeadless: { - base: "Chrome", - flags: [ - "--no-sandbox", - "--disable-setuid-sandbox", - // See https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md - "--headless", - "--disable-gpu", - "--no-gpu", - // Without a remote debugging port, Google Chrome exits immediately. - "--remote-debugging-port=9333", - "--js-flags=--expose-gc", - ], - }, -}; - -const subPkgPath = pkgName => { - if (!minify) { - if (pkgName.includes("preact/utils") || pkgName.includes("react/utils")) { - return path.join(__dirname, pkgName, "src", "index.tsx"); - } - return path.join(__dirname, pkgName, "src", "index.ts"); - } - - // Resolve from package.exports field - const pkgJson = path.join(__dirname, pkgName, "package.json"); - const pkgExports = require(pkgJson).exports; - const file = pkgExports["."].browser ?? pkgExports["."].import; - return path.join(__dirname, pkgName, file); -}; - -// Esbuild plugin for aliasing + babel pass -function createEsbuildPlugin(filteredPkgList) { - const pending = new Map(); - const cache = new Map(); - - const rename = {}; - const mangle = require("./mangle.json"); - for (let prop in mangle.props.props) { - let name = prop; - if (name[0] === "$") { - name = name.slice(1); - } - - rename[name] = mangle.props.props[prop]; - } - - const alias = filteredPkgList.reduce((obj, key) => { - obj[pkgList[key]] = subPkgPath(`./packages/${key}`); - return obj; - }, {}); - - let signalsTransformPath; - if (filteredPkgList.includes("react-transform")) { - signalsTransformPath = require.resolve("./packages/react-transform"); - /* eslint-disable-next-line no-console */ - console.log( - `Transforming tests using ${signalsTransformPath}.\nManually re-compile & re-run tests to validate changes to react-transform` - ); - } - - return { - name: "custom", - setup(build) { - // .d.ts resolution - build.onResolve({ filter: /\/[^.]+$/ }, async args => { - // only intercept static imports from .ts files: - if (args.kind !== "import-statement") return; - if (!/\.tsx?/.test(args.importer)) return; - const abs = path.resolve(args.resolveDir, args.path + ".d.ts"); - try { - await fs.access(abs); - return { path: abs }; - } catch (e) { - // not a .d.ts import - } - }); - - // Aliasing: If "MINIFY" is set to "true" we use the dist/ - // files instead of those from src/ - build.onResolve({ filter: /^@preact\/.*/ }, args => { - const pkg = alias[args.path]; - return { - path: pkg, - }; - }); - - // Mock fs module to run babel in a browser environment - build.onResolve({ filter: /^fs$/ }, () => { - return { path: path.join(__dirname, "test/browser/mockFs.js") }; - }); - - // Apply babel pass whenever we load a TS or JS file - build.onLoad({ filter: /\.[mc]?[jt]sx?$/ }, async args => { - // But skip any file from node_modules if we aren't down-leveling - if (!downlevel && args.path.includes("node_modules")) return; - - const contents = await fs.readFile(args.path, "utf-8"); - - // Using a cache is crucial as babel is 30x slower than esbuild - const cached = cache.get(args.path); - if (cached && cached.input === contents) { - return { - contents: cached.result, - resolveDir: path.dirname(args.path), - loader: "js", - }; - } - - let result = contents; - - // Check if somebody already requested the current file. If they - // did than we push a listener instead of doing a duplicate - // transform of the same file. This is crucial for build perf. - if (!pending.has(args.path)) { - pending.set(args.path, []); - - const jsx = [ - "@babel/preset-react", - { - runtime: "classic", - pragma: "createElement", - pragmaFrag: "Fragment", - }, - ]; - - const ts = [ - "@babel/preset-typescript", - { - jsxPragma: "createElement", - jsxPragmaFrag: "Fragment", - }, - ]; - - const renamePlugin = [ - "babel-plugin-transform-rename-properties", - { - rename, - }, - ]; - - /** @type {any} */ - let signalsTransform = false; - if ( - args.path.includes("packages/react/test/shared") || - args.path.includes("packages/react/runtime/test") - ) { - signalsTransform = [ - signalsTransformPath, - { - mode: "auto", - }, - ]; - } - - const downlevelPlugin = [ - "@babel/preset-env", - { - loose: true, - modules: false, - targets: { - browsers: ["last 2 versions", "IE >= 11"], - }, - }, - ]; - - const coveragePlugin = [ - "istanbul", - { - include: minify ? "**/dist/**/*.js" : "**/src/**/*.{ts,js}", - }, - ]; - - const explicitResourceManagement = [ - "@babel/plugin-transform-explicit-resource-management", - ]; - - const tmp = await babel.transformAsync(result, { - filename: args.path, - sourceMaps: "inline", - presets: downlevel ? [ts, jsx, downlevelPlugin] : [ts, jsx], - plugins: [ - explicitResourceManagement, - signalsTransform, - coverage && coveragePlugin, - minify && renamePlugin, - ].filter(Boolean), - }); - result = (tmp && tmp.code) || result; - cache.set(args.path, { input: contents, result }); - - // Fire all pending listeners that are waiting on the same - // file transformation - const waited = pending.get(args.path); - pending.delete(args.path); - waited.forEach(fn => fn()); - } else { - // Subscribe to the existing transformation completion call - await new Promise(r => { - pending.get(args.path).push(r); - }); - result = cache.get(args.path).result; - } - - return { - contents: result, - resolveDir: path.dirname(args.path), - loader: "js", - }; - }); - }, - }; -} - -const pkgList = { - core: "@preact/signals-core", - debug: "@preact/signals-debug", - preact: "@preact/signals", - react: "@preact/signals-react", - "react/utils": "@preact/signals-react/utils", - "react/runtime": "@preact/signals-react/runtime", - "react-transform": "@preact/signals-react-transform", - "preact/utils": "@preact/signals/utils", -}; - -module.exports = function (config) { - let filteredPkgList = Object.keys(pkgList), - filteredPkgPattern = `{${Object.keys(pkgList).join(",")}}`; - - // Doesn't quite adhere to Karma's `--grep` flag, but should be good enough to filter by package. - // E.g., `--grep=preact,core` - if (config.grep) { - filteredPkgList = config.grep.split(","); - filteredPkgPattern = filteredPkgList[1] - ? `{${filteredPkgList.join(",")}}` - : filteredPkgList[0]; - } - - config.set({ - browsers: Object.keys(localLaunchers), - - frameworks: ["mocha", "chai-sinon"], - - reporters: ["mocha"].concat(coverage ? "coverage" : []), - - formatError(msg) { - let stack = msg; - // Karma prints error twice if it's an infinite loop - if (/^\s*Uncaught/.test(msg)) { - const lines = msg.split(/\n/g); - const emptyIdx = lines.findIndex(line => /^\s*$/.test(line)); - stack = lines.slice(emptyIdx).join("\n"); - } - - const frames = errorstacks.parseStackTrace(stack); - if (!frames.length || frames[0].column === -1) return "\n" + msg + "\n"; - - let out = ""; - for (let i = 0; i < frames.length; i++) { - const frame = frames[i]; - const filePath = kl.lightCyan( - frame.fileName.replace(__dirname + "/", "") - ); - - const indentMatch = msg.match(/^(\s*)/); - const indent = indentMatch ? indentMatch[1] : " "; - const location = kl.yellow(`:${frame.line}:${frame.column}`); - - out += `${indent}at ${frame.name} (${filePath}${location})\n`; - } - - return out; - }, - - coverageReporter: { - dir: path.join(__dirname, "coverage"), - reporters: [ - { type: "text-summary" }, - { type: "html" }, - { type: "lcovonly", subdir: ".", file: "lcov.info" }, - ], - }, - - mochaReporter: { - showDiff: true, - }, - - browserLogOptions: { terminal: true }, - browserConsoleLogOptions: { terminal: true }, - - browserNoActivityTimeout: 5 * 60 * 1000, - - // Use only two browsers concurrently, works better with open source Sauce Labs remote testing - concurrency: 2, - - captureTimeout: 0, - - customLaunchers: localLaunchers, - - files: [ - ...(filteredPkgList.some(i => /^react/.test(i)) - ? [ - { - // Provide some NodeJS globals to run babel in a browser environment - pattern: "test/browser/nodeGlobals.js", - watched: false, - type: "js", - }, - { - pattern: "test/browser/babel.js", - watched: false, - type: "js", - }, - ] - : []), - { - pattern: - process.env.TESTS || - `packages/${filteredPkgPattern}/test/{,browser,shared}/*.test.tsx`, - watched: false, - type: "js", - }, - ], - - mime: { - "text/javascript": ["js", "jsx"], - }, - - preprocessors: { - [`packages/${filteredPkgPattern}/test/**/*`]: ["esbuild"], - [`test/browser/babel.js`]: ["esbuild"], - [`test/browser/nodeGlobals.js`]: ["esbuild"], - }, - - plugins: [ - "karma-esbuild", - "karma-chrome-launcher", - "karma-mocha", - "karma-mocha-reporter", - "karma-chai-sinon", - "karma-coverage", - ], - - esbuild: { - // karma-esbuild options - singleBundle: false, - jsx: "preserve", - - // esbuild options - target: downlevel ? "es5" : "es2015", - define: { - COVERAGE: coverage, - "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV || ""), - }, - plugins: [createEsbuildPlugin(filteredPkgList)], - }, - }); -}; diff --git a/package.json b/package.json index ff31b524d..dc4758b94 100644 --- a/package.json +++ b/package.json @@ -25,22 +25,17 @@ "lint:oxlint": "oxlint 'packages/**/*.{ts,tsx,js,jsx}'", "lint:tsc": "tsc -p tsconfig.json --noEmit", "lint-staged": "lint-staged", - "test": "pnpm test:karma && pnpm test:mocha", - "test:minify": "pnpm test:karma:minify && pnpm test:mocha", - "test:prod": "pnpm test:karma:prod && pnpm test:mocha:prod", - "test:karma": "cross-env COVERAGE=true karma start karma.conf.js --single-run", - "test:karma:minify": "cross-env COVERAGE=true MINIFY=true karma start karma.conf.js --single-run", - "test:karma:watch": "karma start karma.conf.js --no-single-run", - "test:karma:prod": "cross-env MINIFY=true NODE_ENV=production karma start karma.conf.js --single-run", - "test:karma:prod:watch": "cross-env NODE_ENV=production karma start karma.conf.js --no-single-run", - "test:mocha": "cross-env COVERAGE=true mocha --require test/node/setup.js --recursive packages/*/test/node/**.test.tsx", - "test:mocha:prod": "cross-env COVERAGE=true NODE_ENV=production mocha --require test/node/setup.js --recursive packages/*/test/node/**.test.tsx", + "test": "pnpm test:vitest", + "test:minify": "pnpm test:vitest:prod", + "test:prod": "pnpm test:vitest:prod", + "test:vitest": "cross-env COVERAGE=true vitest run", + "test:vitest:prod": "cross-env COVERAGE=true MINIFY=true vitest run", "docs:start": "cd docs && pnpm start", "docs:build": "cd docs && pnpm build", "docs:preview": "cd docs && pnpm preview", "ci:build": "pnpm build && pnpm docs:build", "ci:test": "pnpm lint && pnpm test", - "prepare": "husky install", + "prepare": "husky install && playwright install chromium", "format": "prettier --ignore-path .gitignore --write '**/*.{js,jsx,ts,tsx,yml,json,md}'", "version": "pnpm changeset version && pnpm i --lockfile-only" }, @@ -62,38 +57,28 @@ "@babel/standalone": "^7.28.4", "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.1", - "@types/babel__traverse": "^7.28.0", - "@types/chai": "^4.3.3", - "@types/mocha": "^9.1.1", + "@preact/signals-react-transform": "workspace:*", + "@types/babel__traverse": "^7.18.5", "@types/node": "^18.19.103", - "@types/sinon": "^10.0.13", - "@types/sinon-chai": "^3.2.8", + "@vitest/browser": "^3.2.4", + "@vitest/coverage-v8": "^3.2.4", "babel-plugin-istanbul": "^6.1.1", "babel-plugin-transform-rename-properties": "^0.1.0", "buffer": "^6.0.3", - "chai": "^4.3.6", "cross-env": "^7.0.3", "errorstacks": "^2.4.0", "esbuild": "^0.14.54", "husky": "^8.0.1", - "karma": "6.4.2", - "karma-chai-sinon": "^0.1.5", - "karma-chrome-launcher": "^3.1.1", - "karma-coverage": "^2.2.0", - "karma-esbuild": "^2.2.5", - "karma-mocha": "^2.0.1", - "karma-mocha-reporter": "^2.2.5", - "karma-sinon": "^1.0.5", "kolorist": "^1.5.1", "lint-staged": "^14.0.1", "microbundle": "^0.15.1", - "mocha": "^10.0.0", "oxlint": "^1.3.0", + "playwright": "^1.53.1", "prettier": "^3.6.2", "shx": "^0.3.4", - "sinon": "^14.0.0", - "sinon-chai": "^3.7.0", - "typescript": "~5.8.3" + "typescript": "~5.8.3", + "vitest": "^3.2.4", + "vite": "^6.3.5" }, "lint-staged": { "**/*.{js,jsx,ts,tsx,yml,json,md}": [ diff --git a/packages/core/test/signal.test.tsx b/packages/core/test/signal.test.tsx index f3e850504..982d3a7dd 100644 --- a/packages/core/test/signal.test.tsx +++ b/packages/core/test/signal.test.tsx @@ -1,3 +1,4 @@ +import { describe, it, vi, expect } from "vitest"; import { signal, computed, @@ -49,13 +50,13 @@ describe("signal", () => { it("should notify other listeners of changes after one listener is disposed", () => { const s = signal(0); - const spy1 = sinon.spy(() => { + const spy1 = vi.fn(() => { s.value; }); - const spy2 = sinon.spy(() => { + const spy2 = vi.fn(() => { s.value; }); - const spy3 = sinon.spy(() => { + const spy3 = vi.fn(() => { s.value; }); @@ -63,16 +64,16 @@ describe("signal", () => { const dispose = effect(spy2); effect(spy3); - expect(spy1).to.be.calledOnce; - expect(spy2).to.be.calledOnce; - expect(spy3).to.be.calledOnce; + expect(spy1).toHaveBeenCalledOnce(); + expect(spy2).toHaveBeenCalledOnce(); + expect(spy3).toHaveBeenCalledOnce(); dispose(); s.value = 1; - expect(spy1).to.be.calledTwice; - expect(spy2).to.be.calledOnce; - expect(spy3).to.be.calledTwice; + expect(spy1).toHaveBeenCalledTimes(2); + expect(spy2).toHaveBeenCalledOnce(); + expect(spy3).toHaveBeenCalledTimes(2); }); describe(".peek()", () => { @@ -89,66 +90,66 @@ describe("signal", () => { it("should not make surrounding effect depend on the signal", () => { const s = signal(1); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { s.peek(); }); effect(spy); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); s.value = 2; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not make surrounding computed depend on the signal", () => { const s = signal(1); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { s.peek(); }); const d = computed(spy); d.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); s.value = 2; d.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); }); describe(".subscribe()", () => { it("should subscribe to a signal", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(1); a.subscribe(spy); - expect(spy).to.be.calledWith(1); + expect(spy).toHaveBeenCalledWith(1); }); it("should run the callback when the signal value changes", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(1); a.subscribe(spy); a.value = 2; - expect(spy).to.be.calledWith(2); + expect(spy).toHaveBeenCalledWith(2); }); it("should unsubscribe from a signal", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(1); const dispose = a.subscribe(spy); dispose(); - spy.resetHistory(); + spy.mockClear(); a.value = 2; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should not start triggering on when a signal accessed in the callback changes", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(0); const b = signal(0); @@ -156,15 +157,15 @@ describe("signal", () => { b.value; spy(); }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); b.value++; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should not cause surrounding effect to subscribe to changes to a signal accessed in the callback", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(0); const b = signal(0); @@ -174,49 +175,49 @@ describe("signal", () => { }); spy(); }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); b.value++; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); }); describe(".(un)watched()", () => { it("should call watched when first subscription occurs", () => { - const watched = sinon.spy(); - const unwatched = sinon.spy(); + const watched = vi.fn(); + const unwatched = vi.fn(); const s = signal(1, { watched, unwatched }); - expect(watched).to.not.be.called; + expect(watched).not.toHaveBeenCalled(); const unsubscribe = s.subscribe(() => {}); - expect(watched).to.be.calledOnce; + expect(watched).toHaveBeenCalledOnce(); const unsubscribe2 = s.subscribe(() => {}); - expect(watched).to.be.calledOnce; + expect(watched).toHaveBeenCalledOnce(); unsubscribe(); unsubscribe2(); - expect(unwatched).to.be.calledOnce; + expect(unwatched).toHaveBeenCalledOnce(); }); it("should allow updating the signal from watched", async () => { const calls: number[] = []; - const watched = sinon.spy(() => { + const watched = vi.fn(() => { setTimeout(() => { s.value = 2; }); }); - const unwatched = sinon.spy(); + const unwatched = vi.fn(); const s = signal(1, { watched, unwatched }); - expect(watched).to.not.be.called; + expect(watched).not.toHaveBeenCalled(); const unsubscribe = s.subscribe(() => { calls.push(s.value); }); - expect(watched).to.be.calledOnce; + expect(watched).toHaveBeenCalledOnce(); const unsubscribe2 = s.subscribe(() => {}); - expect(watched).to.be.calledOnce; + expect(watched).toHaveBeenCalledOnce(); await new Promise(resolve => setTimeout(resolve)); unsubscribe(); unsubscribe2(); - expect(unwatched).to.be.calledOnce; + expect(unwatched).toHaveBeenCalledOnce(); expect(calls).to.deep.equal([1, 2]); }); }); @@ -235,61 +236,61 @@ describe("signal", () => { describe("effect()", () => { it("should run the callback immediately", () => { const s = signal(123); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { s.value; }); effect(spy); - expect(spy).to.be.called; + expect(spy).toHaveBeenCalled(); }); it("should subscribe to signals", () => { const s = signal(123); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { s.value; }); effect(spy); - spy.resetHistory(); + spy.mockClear(); s.value = 42; - expect(spy).to.be.called; + expect(spy).toHaveBeenCalled(); }); it("should subscribe to multiple signals", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value; b.value; }); effect(spy); - spy.resetHistory(); + spy.mockClear(); a.value = "aa"; b.value = "bb"; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should dispose of subscriptions", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); const dispose = effect(spy); - spy.resetHistory(); + spy.mockClear(); dispose(); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); a.value = "aa"; b.value = "bb"; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should dispose of subscriptions", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); effect(function () { @@ -299,19 +300,19 @@ describe("effect()", () => { } }); - expect(spy).to.be.called; + expect(spy).toHaveBeenCalled(); a.value = "aa"; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); a.value = "aaa"; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should dispose of subscriptions immediately", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); effect(function () { @@ -319,19 +320,19 @@ describe("effect()", () => { this.dispose(); }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aa"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aaa"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should dispose of subscriptions when called twice", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); const dispose = effect(function () { @@ -341,20 +342,20 @@ describe("effect()", () => { } }); - expect(spy).to.be.called; + expect(spy).toHaveBeenCalled(); a.value = "aa"; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); dispose(); a.value = "aaa"; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should dispose of subscriptions immediately and signals are read after disposing", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); effect(function () { @@ -362,19 +363,19 @@ describe("effect()", () => { spy(); }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aa"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aaa"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should dispose of subscriptions immediately when called twice (deferred)", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); const dispose = effect(function () { @@ -382,27 +383,27 @@ describe("effect()", () => { this.dispose(); }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aa"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); dispose(); a.value = "aaa"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should unsubscribe from signal", () => { const s = signal(123); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { s.value; }); const unsub = effect(spy); - spy.resetHistory(); + spy.mockClear(); unsub(); s.value = 42; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should conditionally unsubscribe from signals", () => { @@ -410,90 +411,90 @@ describe("effect()", () => { const b = signal("b"); const cond = signal(true); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { cond.value ? a.value : b.value; }); effect(spy); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); b.value = "bb"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); cond.value = false; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); - spy.resetHistory(); + spy.mockClear(); a.value = "aaa"; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should batch writes", () => { const a = signal("a"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value; }); effect(spy); - spy.resetHistory(); + spy.mockClear(); effect(() => { a.value = "aa"; a.value = "aaa"; }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should call the cleanup callback before the next run", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); effect(() => { a.value; return spy; }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); a.value = 1; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 2; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should call only the callback from the previous run", () => { - const spy1 = sinon.spy(); - const spy2 = sinon.spy(); - const spy3 = sinon.spy(); + const spy1 = vi.fn(); + const spy2 = vi.fn(); + const spy3 = vi.fn(); const a = signal(spy1); effect(() => { return a.value; }); - expect(spy1).not.to.be.called; - expect(spy2).not.to.be.called; - expect(spy3).not.to.be.called; + expect(spy1).not.toHaveBeenCalled(); + expect(spy2).not.toHaveBeenCalled(); + expect(spy3).not.toHaveBeenCalled(); a.value = spy2; - expect(spy1).to.be.calledOnce; - expect(spy2).not.to.be.called; - expect(spy3).not.to.be.called; + expect(spy1).toHaveBeenCalledOnce(); + expect(spy2).not.toHaveBeenCalled(); + expect(spy3).not.toHaveBeenCalled(); a.value = spy3; - expect(spy1).to.be.calledOnce; - expect(spy2).to.be.calledOnce; - expect(spy3).not.to.be.called; + expect(spy1).toHaveBeenCalledOnce(); + expect(spy2).toHaveBeenCalledOnce(); + expect(spy3).not.toHaveBeenCalled(); }); it("should call the cleanup callback function when disposed", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const dispose = effect(() => { return spy; }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); dispose(); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not recompute if the effect has been notified about changes, but no direct dependency has actually changed", () => { @@ -502,19 +503,19 @@ describe("effect()", () => { s.value; return 0; }); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { c.value; }); effect(spy); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); s.value = 1; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should not recompute dependencies unnecessarily", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(0); const b = signal(0); const c = computed(() => { @@ -526,13 +527,13 @@ describe("effect()", () => { c.value; } }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); batch(() => { b.value = 1; a.value = 1; }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not recompute dependencies out of order", () => { @@ -540,7 +541,7 @@ describe("effect()", () => { const b = signal(1); const c = signal(1); - const spy = sinon.spy(() => c.value); + const spy = vi.fn(() => c.value); const d = computed(spy); effect(() => { @@ -551,41 +552,41 @@ describe("effect()", () => { b.value; } }); - spy.resetHistory(); + spy.mockClear(); batch(() => { a.value = 2; b.value = 2; c.value = 2; }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); batch(() => { a.value = -1; b.value = -1; c.value = -1; }); - expect(spy).not.to.be.called; - spy.resetHistory(); + expect(spy).not.toHaveBeenCalled(); + spy.mockClear(); }); it("should recompute if a dependency changes during computation after becoming a dependency", () => { const a = signal(0); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { if (a.value === 0) { a.value++; } }); effect(spy); - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should run the cleanup in an implicit batch", () => { const a = signal(0); const b = signal("a"); const c = signal("b"); - const spy = sinon.spy(); + const spy = vi.fn(); effect(() => { b.value; @@ -601,17 +602,17 @@ describe("effect()", () => { }; }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = 1; - expect(spy).to.be.calledOnce; - expect(spy).to.be.calledWith("xy"); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("xy"); }); it("should not retrigger the effect if the cleanup modifies one of the dependencies", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); effect(() => { spy(a.value); @@ -619,17 +620,17 @@ describe("effect()", () => { a.value = 2; }; }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = 1; - expect(spy).to.be.calledOnce; - expect(spy).to.be.calledWith(2); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith(2); }); it("should run the cleanup if the effect disposes itself", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); const dispose = effect(() => { if (a.value > 0) { @@ -637,16 +638,16 @@ describe("effect()", () => { return spy; } }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); a.value = 1; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 2; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not run the effect if the cleanup function disposes it", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); const dispose = effect(() => { a.value; @@ -655,27 +656,27 @@ describe("effect()", () => { dispose(); }; }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 1; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not subscribe to anything if first run throws", () => { const s = signal(0); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { s.value; throw new Error("test"); }); expect(() => effect(spy)).to.throw("test"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); s.value++; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should reset the cleanup if the effect throws", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); effect(() => { if (a.value === 0) { @@ -684,16 +685,16 @@ describe("effect()", () => { throw new Error("hello"); } }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); expect(() => (a.value = 1)).to.throw("hello"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 0; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should dispose the effect if the cleanup callback throws", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); effect(() => { if (a.value === 0) { @@ -704,15 +705,15 @@ describe("effect()", () => { spy(); } }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); expect(() => a.value++).to.throw("hello"); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); a.value++; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should run cleanups outside any evaluation context", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(0); const b = signal(0); const c = computed(() => { @@ -730,15 +731,15 @@ describe("effect()", () => { spy(); c.value; }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = 1; - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); b.value = 1; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should throw on cycles", () => { @@ -788,7 +789,7 @@ describe("effect()", () => { it("should support resource management disposal", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); { // @ts-expect-error This is a test for the dispose API using _dispose = effect(() => { @@ -796,48 +797,48 @@ describe("effect()", () => { return spy; }); } - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should allow disposing a running effect", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); const dispose = effect(() => { if (a.value === 1) { dispose(); spy(); } }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); a.value = 1; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 2; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not run if it's first been triggered and then disposed in a batch", () => { const a = signal(0); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value; }); const dispose = effect(spy); - spy.resetHistory(); + spy.mockClear(); batch(() => { a.value = 1; dispose(); }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should not run if it's been triggered, disposed and then triggered again in a batch", () => { const a = signal(0); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value; }); const dispose = effect(spy); - spy.resetHistory(); + spy.mockClear(); batch(() => { a.value = 1; @@ -845,17 +846,17 @@ describe("effect()", () => { a.value = 2; }); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should not rerun parent effect if a nested child effect's signal's value changes", () => { const parentSignal = signal(0); const childSignal = signal(0); - const parentEffect = sinon.spy(() => { + const parentEffect = vi.fn(() => { parentSignal.value; }); - const childEffect = sinon.spy(() => { + const childEffect = vi.fn(() => { childSignal.value; }); @@ -864,18 +865,18 @@ describe("effect()", () => { effect(childEffect); }); - expect(parentEffect).to.be.calledOnce; - expect(childEffect).to.be.calledOnce; + expect(parentEffect).toHaveBeenCalledOnce(); + expect(childEffect).toHaveBeenCalledOnce(); childSignal.value = 1; - expect(parentEffect).to.be.calledOnce; - expect(childEffect).to.be.calledTwice; + expect(parentEffect).toHaveBeenCalledOnce(); + expect(childEffect).toHaveBeenCalledTimes(2); parentSignal.value = 1; - expect(parentEffect).to.be.calledTwice; - expect(childEffect).to.be.calledThrice; + expect(parentEffect).toHaveBeenCalledTimes(2); + expect(childEffect).toHaveBeenCalledTimes(3); }); // Test internal behavior depended on by Preact & React integrations @@ -891,8 +892,8 @@ describe("effect()", () => { it("should allow setting _callback that replaces the default functionality", () => { const a = signal(0); - const oldSpy = sinon.spy(); - const newSpy = sinon.spy(); + const oldSpy = vi.fn(); + const newSpy = vi.fn(); let e: any; effect(function (this: any) { @@ -900,13 +901,13 @@ describe("effect()", () => { a.value; oldSpy(); }); - oldSpy.resetHistory(); + oldSpy.mockClear(); e._callback = newSpy; a.value = 1; - expect(oldSpy).not.to.be.called; - expect(newSpy).to.be.called; + expect(oldSpy).not.toHaveBeenCalled(); + expect(newSpy).toHaveBeenCalled(); }); it("should return a function for closing the effect scope from _start", () => { @@ -917,23 +918,23 @@ describe("effect()", () => { e = this; }); - const spy = sinon.spy(); + const spy = vi.fn(); e._callback = spy; const done1 = e._start(); s.value; done1(); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); s.value = 2; - expect(spy).to.be.called; - spy.resetHistory(); + expect(spy).toHaveBeenCalled(); + spy.mockClear(); const done2 = e._start(); done2(); s.value = 3; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should throw on out-of-order start1-start2-end1 sequences", () => { @@ -979,7 +980,7 @@ describe("effect()", () => { e = this; }); - const spy = sinon.spy(); + const spy = vi.fn(); e._callback = spy; const done = e._start(); @@ -988,15 +989,15 @@ describe("effect()", () => { } finally { done(); } - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); s.value = 2; - expect(spy).to.be.called; - spy.resetHistory(); + expect(spy).toHaveBeenCalled(); + spy.mockClear(); e._dispose(); s.value = 3; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should allow reusing the effect after disposing it", () => { @@ -1007,7 +1008,7 @@ describe("effect()", () => { e = this; }); - const spy = sinon.spy(); + const spy = vi.fn(); e._callback = spy; e._dispose(); @@ -1018,7 +1019,7 @@ describe("effect()", () => { done(); } s.value = 2; - expect(spy).to.be.called; + expect(spy).toHaveBeenCalled(); }); it("should have property _sources that is undefined when and only when the effect has no sources", () => { @@ -1083,41 +1084,41 @@ describe("computed()", () => { it("should be lazily computed on demand", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => a.value + b.value); + const spy = vi.fn(() => a.value + b.value); const c = computed(spy); - expect(spy).to.not.be.called; + expect(spy).not.toHaveBeenCalled(); c.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "x"; b.value = "y"; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); c.value; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should be computed only when a dependency has changed at some point", () => { const a = signal("a"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { return a.value; }); const c = computed(spy); c.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "a"; c.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should recompute if a dependency changes during computation after becoming a dependency", () => { const a = signal(0); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value++; }); const c = computed(spy); c.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); c.value; - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should detect simple dependency cycles", () => { @@ -1134,7 +1135,7 @@ describe("computed()", () => { }); it("should not allow a computed signal to become a direct dependency of itself", () => { - const spy = sinon.spy(() => { + const spy = vi.fn(() => { try { a.value; } catch { @@ -1148,22 +1149,22 @@ describe("computed()", () => { it("should store thrown errors and recompute only after a dependency changes", () => { const a = signal(0); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value; throw new Error(); }); const c = computed(spy); expect(() => c.value).to.throw(); expect(() => c.value).to.throw(); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 1; expect(() => c.value).to.throw(); - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should store thrown non-errors and recompute only after a dependency changes", () => { const a = signal(0); - const spy = sinon.spy(); + const spy = vi.fn(); const c = computed(() => { a.value; spy(); @@ -1182,7 +1183,7 @@ describe("computed()", () => { } catch (err) { expect(err).to.be.undefined; } - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 1; try { @@ -1191,7 +1192,7 @@ describe("computed()", () => { } catch (err) { expect(err).to.be.undefined; } - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should conditionally unsubscribe from signals", () => { @@ -1199,69 +1200,69 @@ describe("computed()", () => { const b = signal("b"); const cond = signal(true); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { return cond.value ? a.value : b.value; }); const c = computed(spy); expect(c.value).to.equal("a"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); b.value = "bb"; expect(c.value).to.equal("a"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); cond.value = false; expect(c.value).to.equal("bb"); - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); - spy.resetHistory(); + spy.mockClear(); a.value = "aaa"; expect(c.value).to.equal("bb"); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); describe(".(un)watched()", () => { it("should call watched when first subscription occurs", () => { - const watched = sinon.spy(); - const unwatched = sinon.spy(); + const watched = vi.fn(); + const unwatched = vi.fn(); const s = computed(() => 1, { watched, unwatched }); - expect(watched).to.not.be.called; + expect(watched).not.toHaveBeenCalled(); const unsubscribe = s.subscribe(() => {}); - expect(watched).to.be.calledOnce; + expect(watched).toHaveBeenCalledOnce(); const unsubscribe2 = s.subscribe(() => {}); - expect(watched).to.be.calledOnce; + expect(watched).toHaveBeenCalledOnce(); unsubscribe(); unsubscribe2(); - expect(unwatched).to.be.calledOnce; + expect(unwatched).toHaveBeenCalledOnce(); }); it("should call watched when first subscription occurs w/ nested signal", () => { - const watched = sinon.spy(); - const unwatched = sinon.spy(); + const watched = vi.fn(); + const unwatched = vi.fn(); const s = signal(1, { watched, unwatched }); const c = computed(() => s.value + 1, { watched, unwatched }); - expect(watched).to.not.be.called; + expect(watched).not.toHaveBeenCalled(); const unsubscribe = c.subscribe(() => {}); - expect(watched).to.be.calledTwice; + expect(watched).toHaveBeenCalledTimes(2); const unsubscribe2 = s.subscribe(() => {}); - expect(watched).to.be.calledTwice; + expect(watched).toHaveBeenCalledTimes(2); unsubscribe2(); unsubscribe(); - expect(unwatched).to.be.calledTwice; + expect(unwatched).toHaveBeenCalledTimes(2); }); }); it("should consider undefined value separate from uninitialized value", () => { const a = signal(0); - const spy = sinon.spy(() => undefined); + const spy = vi.fn(() => undefined); const c = computed(spy); expect(c.value).to.be.undefined; a.value = 1; expect(c.value).to.be.undefined; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not leak errors raised by dependencies", () => { @@ -1288,16 +1289,16 @@ describe("computed()", () => { const c = computed(() => b.value); c.value; - const spy = sinon.spy(() => { + const spy = vi.fn(() => { c.value; }); effect(spy); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = 1; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should get marked as outdated right after first subscription", () => { @@ -1316,13 +1317,13 @@ describe("computed()", () => { const s = signal(0); const c = computed(() => s.value); - const spy1 = sinon.spy(() => { + const spy1 = vi.fn(() => { c.value; }); - const spy2 = sinon.spy(() => { + const spy2 = vi.fn(() => { c.value; }); - const spy3 = sinon.spy(() => { + const spy3 = vi.fn(() => { c.value; }); @@ -1330,16 +1331,16 @@ describe("computed()", () => { const dispose = effect(spy2); effect(spy3); - expect(spy1).to.be.calledOnce; - expect(spy2).to.be.calledOnce; - expect(spy3).to.be.calledOnce; + expect(spy1).toHaveBeenCalledOnce(); + expect(spy2).toHaveBeenCalledOnce(); + expect(spy3).toHaveBeenCalledOnce(); dispose(); s.value = 1; - expect(spy1).to.be.calledTwice; - expect(spy2).to.be.calledOnce; - expect(spy3).to.be.calledTwice; + expect(spy1).toHaveBeenCalledTimes(2); + expect(spy2).toHaveBeenCalledOnce(); + expect(spy3).toHaveBeenCalledTimes(2); }); it("should not recompute dependencies out of order", () => { @@ -1347,7 +1348,7 @@ describe("computed()", () => { const b = signal(1); const c = signal(1); - const spy = sinon.spy(() => c.value); + const spy = vi.fn(() => c.value); const d = computed(spy); const e = computed(() => { @@ -1360,25 +1361,25 @@ describe("computed()", () => { }); e.value; - spy.resetHistory(); + spy.mockClear(); a.value = 2; b.value = 2; c.value = 2; e.value; - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = -1; b.value = -1; c.value = -1; e.value; - expect(spy).not.to.be.called; - spy.resetHistory(); + expect(spy).not.toHaveBeenCalled(); + spy.mockClear(); }); it("should not recompute dependencies unnecessarily", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(0); const b = signal(0); const c = computed(() => { @@ -1391,14 +1392,14 @@ describe("computed()", () => { } }); d.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); batch(() => { b.value = 1; a.value = 1; }); d.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); describe(".peek()", () => { @@ -1448,75 +1449,68 @@ describe("computed()", () => { it("should not make surrounding effect depend on the computed", () => { const s = signal(1); const c = computed(() => s.value); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { c.peek(); }); effect(spy); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); s.value = 2; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not make surrounding computed depend on the computed", () => { const s = signal(1); const c = computed(() => s.value); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { c.peek(); }); const d = computed(spy); d.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); s.value = 2; d.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not make surrounding effect depend on the peeked computed's dependencies", () => { const a = signal(1); const b = computed(() => a.value); - const spy = sinon.spy(); + const spy = vi.fn(); effect(() => { spy(); b.peek(); }); - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = 1; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should not make surrounding computed depend on peeked computed's dependencies", () => { const a = signal(1); const b = computed(() => a.value); - const spy = sinon.spy(); + const spy = vi.fn(); const d = computed(() => { spy(); b.peek(); }); d.value; - expect(spy).to.be.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); a.value = 1; d.value; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); }); - describe("garbage collection", function () { - // Skip GC tests if window.gc/global.gc is not defined. - before(function () { - if (typeof gc === "undefined") { - this.skip(); - } - }); - + describe.runIf(typeof gc !== "undefined")("garbage collection", function () { it("should be garbage collectable if nothing is listening to its changes", async () => { const s = signal(0); const ref = new WeakRef(computed(() => s.value)); @@ -1553,20 +1547,20 @@ describe("computed()", () => { const a = signal("a"); const b = signal("b"); - const compute = sinon.spy(() => { + const compute = vi.fn(() => { // debugger; return a.value + b.value; }); const c = computed(compute); expect(c.value).to.equal("ab"); - expect(compute).to.have.been.calledOnce; - compute.resetHistory(); + expect(compute).toHaveBeenCalledOnce(); + compute.mockClear(); a.value = "aa"; b.value = "bb"; c.value; - expect(compute).to.have.been.calledOnce; + expect(compute).toHaveBeenCalledOnce(); }); it("should drop A->B->A updates", async () => { @@ -1582,17 +1576,17 @@ describe("computed()", () => { const b = computed(() => a.value - 1); const c = computed(() => a.value + b.value); - const compute = sinon.spy(() => "d: " + c.value); + const compute = vi.fn(() => "d: " + c.value); const d = computed(compute); // Trigger read expect(d.value).to.equal("d: 3"); - expect(compute).to.have.been.calledOnce; - compute.resetHistory(); + expect(compute).toHaveBeenCalledOnce(); + compute.mockClear(); a.value = 4; d.value; - expect(compute).to.have.been.calledOnce; + expect(compute).toHaveBeenCalledOnce(); }); it("should only update every signal once (diamond graph)", () => { @@ -1607,15 +1601,15 @@ describe("computed()", () => { const b = computed(() => a.value); const c = computed(() => a.value); - const spy = sinon.spy(() => b.value + " " + c.value); + const spy = vi.fn(() => b.value + " " + c.value); const d = computed(spy); expect(d.value).to.equal("a a"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aa"; expect(d.value).to.equal("aa aa"); - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should only update every signal once (diamond graph + tail)", () => { @@ -1633,15 +1627,15 @@ describe("computed()", () => { const d = computed(() => b.value + " " + c.value); - const spy = sinon.spy(() => d.value); + const spy = vi.fn(() => d.value); const e = computed(spy); expect(e.value).to.equal("a a"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aa"; expect(e.value).to.equal("aa aa"); - expect(spy).to.be.calledTwice; + expect(spy).toHaveBeenCalledTimes(2); }); it("should bail out if result is the same", () => { @@ -1653,15 +1647,15 @@ describe("computed()", () => { return "foo"; }); - const spy = sinon.spy(() => b.value); + const spy = vi.fn(() => b.value); const c = computed(spy); expect(c.value).to.equal("foo"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = "aa"; expect(c.value).to.equal("foo"); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should only update every signal once (jagged diamond graph + tails)", () => { @@ -1682,54 +1676,54 @@ describe("computed()", () => { const d = computed(() => c.value); - const eSpy = sinon.spy(() => b.value + " " + d.value); + const eSpy = vi.fn(() => b.value + " " + d.value); const e = computed(eSpy); - const fSpy = sinon.spy(() => e.value); + const fSpy = vi.fn(() => e.value); const f = computed(fSpy); - const gSpy = sinon.spy(() => e.value); + const gSpy = vi.fn(() => e.value); const g = computed(gSpy); expect(f.value).to.equal("a a"); - expect(fSpy).to.be.calledOnce; + expect(fSpy).toHaveBeenCalledOnce(); expect(g.value).to.equal("a a"); - expect(gSpy).to.be.calledOnce; + expect(gSpy).toHaveBeenCalledOnce(); - eSpy.resetHistory(); - fSpy.resetHistory(); - gSpy.resetHistory(); + eSpy.mockClear(); + fSpy.mockClear(); + gSpy.mockClear(); a.value = "b"; expect(e.value).to.equal("b b"); - expect(eSpy).to.be.calledOnce; + expect(eSpy).toHaveBeenCalledOnce(); expect(f.value).to.equal("b b"); - expect(fSpy).to.be.calledOnce; + expect(fSpy).toHaveBeenCalledOnce(); expect(g.value).to.equal("b b"); - expect(gSpy).to.be.calledOnce; + expect(gSpy).toHaveBeenCalledOnce(); - eSpy.resetHistory(); - fSpy.resetHistory(); - gSpy.resetHistory(); + eSpy.mockClear(); + fSpy.mockClear(); + gSpy.mockClear(); a.value = "c"; expect(e.value).to.equal("c c"); - expect(eSpy).to.be.calledOnce; + expect(eSpy).toHaveBeenCalledOnce(); expect(f.value).to.equal("c c"); - expect(fSpy).to.be.calledOnce; + expect(fSpy).toHaveBeenCalledOnce(); expect(g.value).to.equal("c c"); - expect(gSpy).to.be.calledOnce; + expect(gSpy).toHaveBeenCalledOnce(); // top to bottom - expect(eSpy).to.have.been.calledBefore(fSpy); + expect(eSpy).toHaveBeenCalledBefore(fSpy); // left to right - expect(fSpy).to.have.been.calledBefore(gSpy); + expect(fSpy).toHaveBeenCalledBefore(gSpy); }); it("should only subscribe to signals listened to", () => { @@ -1739,15 +1733,15 @@ describe("computed()", () => { const a = signal("a"); const b = computed(() => a.value); - const spy = sinon.spy(() => a.value); + const spy = vi.fn(() => a.value); computed(spy); expect(b.value).to.equal("a"); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); a.value = "aa"; expect(b.value).to.equal("aa"); - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); it("should only subscribe to signals listened to", () => { @@ -1760,10 +1754,10 @@ describe("computed()", () => { // | // *C const a = signal("a"); - const spyB = sinon.spy(() => a.value); + const spyB = vi.fn(() => a.value); const b = computed(spyB); - const spyC = sinon.spy(() => b.value); + const spyC = vi.fn(() => b.value); const c = computed(spyC); const d = computed(() => a.value); @@ -1776,14 +1770,14 @@ describe("computed()", () => { expect(result).to.equal("a"); expect(d.value).to.equal("a"); - spyB.resetHistory(); - spyC.resetHistory(); + spyB.mockClear(); + spyC.mockClear(); unsub(); a.value = "aa"; - expect(spyB).not.to.be.called; - expect(spyC).not.to.be.called; + expect(spyB).not.toHaveBeenCalled(); + expect(spyC).not.toHaveBeenCalled(); expect(d.value).to.equal("aa"); }); @@ -1803,14 +1797,14 @@ describe("computed()", () => { a.value; return "c"; }); - const spy = sinon.spy(() => b.value + " " + c.value); + const spy = vi.fn(() => b.value + " " + c.value); const d = computed(spy); expect(d.value).to.equal("a c"); - spy.resetHistory(); + spy.mockClear(); a.value = "aa"; d.value; - expect(spy).to.returned("aa c"); + expect(spy).toReturnWith("aa c"); }); it("should ensure subs update even if two deps unmark it", () => { @@ -1832,14 +1826,14 @@ describe("computed()", () => { a.value; return "d"; }); - const spy = sinon.spy(() => b.value + " " + c.value + " " + d.value); + const spy = vi.fn(() => b.value + " " + c.value + " " + d.value); const e = computed(spy); expect(e.value).to.equal("a c d"); - spy.resetHistory(); + spy.mockClear(); a.value = "aa"; e.value; - expect(spy).to.returned("aa c d"); + expect(spy).toReturnWith("aa c d"); }); }); @@ -1909,13 +1903,13 @@ describe("computed()", () => { a.value; return "c"; }); - const spy = sinon.spy(() => b.value + " " + c.value); + const spy = vi.fn(() => b.value + " " + c.value); const d = computed(spy); expect(d.value).to.equal("b c"); - spy.resetHistory(); + spy.mockClear(); a.value = "aa"; - expect(spy).not.to.be.called; + expect(spy).not.toHaveBeenCalled(); }); }); }); @@ -1947,28 +1941,28 @@ describe("batch/transaction", () => { it("should delay writes", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + " " + b.value; }); effect(spy); - spy.resetHistory(); + spy.mockClear(); batch(() => { a.value = "aa"; b.value = "bb"; }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should delay writes until outermost batch is complete", () => { const a = signal("a"); const b = signal("b"); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + ", " + b.value; }); effect(spy); - spy.resetHistory(); + spy.mockClear(); batch(() => { batch(() => { @@ -1981,7 +1975,7 @@ describe("batch/transaction", () => { // If the inner batch() would have flushed the update // this spy would've been called twice. - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should read signals written to", () => { @@ -2001,18 +1995,18 @@ describe("batch/transaction", () => { const a = signal("a"); const b = computed(() => a.value); - const spyC = sinon.spy(() => b.value); + const spyC = vi.fn(() => b.value); const c = computed(spyC); - const spyD = sinon.spy(() => c.value); + const spyD = vi.fn(() => c.value); const d = computed(spyD); - const spyE = sinon.spy(() => d.value); + const spyE = vi.fn(() => d.value); const e = computed(spyE); - spyC.resetHistory(); - spyD.resetHistory(); - spyE.resetHistory(); + spyC.mockClear(); + spyD.mockClear(); + spyE.mockClear(); let result = ""; batch(() => { @@ -2021,15 +2015,15 @@ describe("batch/transaction", () => { // Since "D" isn't accessed during batching, we should not // update it, only after batching has completed - expect(spyD).not.to.be.called; + expect(spyD).not.toHaveBeenCalled(); }); expect(result).to.equal("aa"); expect(d.value).to.equal("aa"); expect(e.value).to.equal("aa"); - expect(spyC).to.be.calledOnce; - expect(spyD).to.be.calledOnce; - expect(spyE).to.be.calledOnce; + expect(spyC).toHaveBeenCalledOnce(); + expect(spyD).toHaveBeenCalledOnce(); + expect(spyE).toHaveBeenCalledOnce(); }); it("should not block writes after batching completed", () => { @@ -2097,16 +2091,16 @@ describe("batch/transaction", () => { it("should run pending effects even if the callback throws", () => { const a = signal(0); const b = signal(1); - const spy1 = sinon.spy(() => { + const spy1 = vi.fn(() => { a.value; }); - const spy2 = sinon.spy(() => { + const spy2 = vi.fn(() => { b.value; }); effect(spy1); effect(spy2); - spy1.resetHistory(); - spy2.resetHistory(); + spy1.mockClear(); + spy2.mockClear(); expect(() => batch(() => { @@ -2116,16 +2110,16 @@ describe("batch/transaction", () => { }) ).to.throw("hello"); - expect(spy1).to.be.calledOnce; - expect(spy2).to.be.calledOnce; + expect(spy1).toHaveBeenCalledOnce(); + expect(spy2).toHaveBeenCalledOnce(); }); it("should run pending effects even if some effects throw", () => { const a = signal(0); - const spy1 = sinon.spy(() => { + const spy1 = vi.fn(() => { a.value; }); - const spy2 = sinon.spy(() => { + const spy2 = vi.fn(() => { a.value; }); effect(() => { @@ -2145,8 +2139,8 @@ describe("batch/transaction", () => { throw new Error("hello"); } }); - spy1.resetHistory(); - spy2.resetHistory(); + spy1.mockClear(); + spy2.mockClear(); expect(() => batch(() => { @@ -2154,16 +2148,16 @@ describe("batch/transaction", () => { }) ).to.throw("hello"); - expect(spy1).to.be.calledOnce; - expect(spy2).to.be.calledOnce; + expect(spy1).toHaveBeenCalledOnce(); + expect(spy2).toHaveBeenCalledOnce(); }); it("should run effect's first run immediately even inside a batch", () => { let callCount = 0; - const spy = sinon.spy(); + const spy = vi.fn(); batch(() => { effect(spy); - callCount = spy.callCount; + callCount = spy.mock.calls.length; }); expect(callCount).to.equal(1); }); @@ -2173,30 +2167,30 @@ describe("untracked", () => { it("should block tracking inside effects", () => { const a = signal(1); const b = signal(2); - const spy = sinon.spy(() => { + const spy = vi.fn(() => { a.value + b.value; }); effect(() => untracked(spy)); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); a.value = 10; b.value = 20; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should block tracking even when run inside effect run inside untracked", () => { const s = signal(1); - const spy = sinon.spy(() => s.value); + const spy = vi.fn(() => s.value); untracked(() => effect(() => { untracked(spy); }) ); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); s.value = 2; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should not cause signal assignments throw", () => { @@ -2221,16 +2215,16 @@ describe("untracked", () => { it("should block tracking inside computed signals", () => { const a = signal(1); const b = signal(2); - const spy = sinon.spy(() => a.value + b.value); + const spy = vi.fn(() => a.value + b.value); const c = computed(() => untracked(spy)); - expect(spy).to.not.be.called; + expect(spy).not.toHaveBeenCalled(); expect(c.value).to.equal(3); a.value = 10; c.value; b.value = 20; c.value; - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); expect(c.value).to.equal(3); }); }); diff --git a/packages/debug/test/signal.test.tsx b/packages/debug/test/browser/signal.test.tsx similarity index 64% rename from packages/debug/test/signal.test.tsx rename to packages/debug/test/browser/signal.test.tsx index 26966a290..8c371a9e7 100644 --- a/packages/debug/test/signal.test.tsx +++ b/packages/debug/test/browser/signal.test.tsx @@ -1,3 +1,6 @@ +/// +import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; +import { cdp } from "@vitest/browser/context"; import { signal, computed, @@ -6,27 +9,23 @@ import { ReadonlySignal, } from "@preact/signals-core"; import { setDebugOptions } from "@preact/signals-debug"; -import { SinonSpy } from "sinon"; describe("Signal Debug", () => { - let consoleSpy: SinonSpy; - let groupSpy: SinonSpy; - let groupEndSpy: SinonSpy; - let groupCollapsedSpy: SinonSpy; + let consoleSpy: ReturnType; + let groupSpy: ReturnType; + let groupEndSpy: ReturnType; + let groupCollapsedSpy: ReturnType; beforeEach(() => { - consoleSpy = sinon.spy(console, "log"); - groupSpy = sinon.spy(console, "group"); - groupCollapsedSpy = sinon.spy(console, "groupCollapsed"); - groupEndSpy = sinon.spy(console, "groupEnd"); + consoleSpy = vi.spyOn(console, "log"); + groupSpy = vi.spyOn(console, "group"); + groupCollapsedSpy = vi.spyOn(console, "groupCollapsed"); + groupEndSpy = vi.spyOn(console, "groupEnd"); setDebugOptions({ grouped: true, enabled: true, spacing: 2 }); }); afterEach(() => { - consoleSpy.restore(); - groupSpy.restore(); - groupCollapsedSpy.restore(); - groupEndSpy.restore(); + vi.restoreAllMocks(); }); describe("Basic Signal Updates", () => { @@ -37,13 +36,13 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(consoleSpy).to.be.calledWith("From:", "0"); - expect(consoleSpy).to.be.calledWith("To:", "1"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(consoleSpy).toHaveBeenCalledWith("From:", "0"); + expect(consoleSpy).toHaveBeenCalledWith("To:", "1"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered effect: count-subscribe" ); - expect(groupEndSpy).to.be.calledTwice; + expect(groupEndSpy).toHaveBeenCalledTimes(2); }); it("should handle object values correctly", async () => { @@ -53,9 +52,9 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: user"); - expect(consoleSpy).to.be.calledWith("From:", '{"name":"John"}'); - expect(consoleSpy).to.be.calledWith("To:", '{"name":"Jane"}'); + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: user"); + expect(consoleSpy).toHaveBeenCalledWith("From:", '{"name":"John"}'); + expect(consoleSpy).toHaveBeenCalledWith("To:", '{"name":"Jane"}'); }); it("should handle undefined and null values", async () => { @@ -65,9 +64,9 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: nullable"); - expect(consoleSpy).to.be.calledWith("From:", "null"); - expect(consoleSpy).to.be.calledWith("To:", "test"); + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: nullable"); + expect(consoleSpy).toHaveBeenCalledWith("From:", "null"); + expect(consoleSpy).toHaveBeenCalledWith("To:", "test"); }); }); @@ -81,11 +80,11 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: doubled" ); - expect(consoleSpy).to.be.calledWith(" Type: Computed"); + expect(consoleSpy).toHaveBeenCalledWith(" Type: Computed"); }); it("should handle nested computed signals", async () => { @@ -100,11 +99,11 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: doubled" ); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: message" ); }); @@ -120,11 +119,11 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: tripled" ); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: doubled" ); }); @@ -139,8 +138,10 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count2"); - expect(groupCollapsedSpy).to.be.calledWith(" ↪️ Triggered update: sum"); + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count2"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( + " ↪️ Triggered update: sum" + ); }); }); @@ -158,9 +159,11 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith(" ↪️ Triggered update: sum"); - expect(consoleSpy).to.be.calledWith(" Type: Computed"); + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( + " ↪️ Triggered update: sum" + ); + expect(consoleSpy).toHaveBeenCalledWith(" Type: Computed"); }); it("should show batched signal updates w/ independent subscribers", async () => { @@ -179,13 +182,13 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); // Should have two groups - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: doubled2" ); - expect(consoleSpy).to.be.calledWith(" Type: Computed"); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count2"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(consoleSpy).toHaveBeenCalledWith(" Type: Computed"); + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count2"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: doubled" ); }); @@ -205,11 +208,11 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered effect: count-effect" ); - expect(groupEndSpy).to.be.calledTwice; + expect(groupEndSpy).toHaveBeenCalledTimes(2); }); it("should show effect deep updates", async () => { @@ -226,14 +229,14 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.be.calledWith("🎯 Signal Update: count"); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupSpy).toHaveBeenCalledWith("🎯 Signal Update: count"); + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered update: doubled" ); - expect(groupCollapsedSpy).to.be.calledWith( + expect(groupCollapsedSpy).toHaveBeenCalledWith( " ↪️ Triggered effect: logger" ); - expect(groupEndSpy).to.be.calledThrice; + expect(groupEndSpy).toHaveBeenCalledTimes(3); }); }); @@ -247,8 +250,8 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.not.be.called; - expect(consoleSpy).to.not.be.called; + expect(groupSpy).not.toHaveBeenCalled(); + expect(consoleSpy).not.toHaveBeenCalled(); }); it("should support flat logging mode", async () => { @@ -261,14 +264,14 @@ describe("Signal Debug", () => { await new Promise(resolve => setTimeout(resolve, 0)); - expect(groupSpy).to.not.be.called; - expect(consoleSpy).to.be.calledWith("🎯 count: 0 → 2"); - expect(consoleSpy).to.be.calledWith("↪️ doubled: 0 → 4"); + expect(groupSpy).not.toHaveBeenCalled(); + expect(consoleSpy).toHaveBeenCalledWith("🎯 count: 0 → 2"); + expect(consoleSpy).toHaveBeenCalledWith("↪️ doubled: 0 → 4"); }); }); it("should not recompute dependencies unnecessarily", () => { - const spy = sinon.spy(); + const spy = vi.fn(); const a = signal(0); const b = signal(0); const c = computed(() => { @@ -280,17 +283,20 @@ describe("Signal Debug", () => { c.value; } }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); batch(() => { b.value = 1; a.value = 1; }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should be garbage collectable after it has lost all of its listeners", async () => { const s = signal(0); + const cdpSession = cdp(); + + await cdpSession.send("HeapProfiler.enable"); let ref: WeakRef; let dispose: () => void; @@ -303,9 +309,9 @@ describe("Signal Debug", () => { })(); dispose(); - (gc as () => void)(); + await cdpSession.send("HeapProfiler.collectGarbage"); await new Promise(resolve => setTimeout(resolve, 0)); - (gc as () => void)(); + await cdpSession.send("HeapProfiler.collectGarbage"); expect(ref.deref()).to.be.undefined; }); @@ -319,10 +325,10 @@ describe("Signal Debug", () => { // | // *C const a = signal("a"); - const spyB = sinon.spy(() => a.value); + const spyB = vi.fn(() => a.value); const b = computed(spyB); - const spyC = sinon.spy(() => b.value); + const spyC = vi.fn(() => b.value); const c = computed(spyC); const d = computed(() => a.value); @@ -335,14 +341,14 @@ describe("Signal Debug", () => { expect(result).to.equal("a"); expect(d.value).to.equal("a"); - spyB.resetHistory(); - spyC.resetHistory(); + spyB.mockClear(); + spyC.mockClear(); unsub(); a.value = "aa"; - expect(spyB).not.to.be.called; - expect(spyC).not.to.be.called; + expect(spyB).not.toHaveBeenCalled(); + expect(spyC).not.toHaveBeenCalled(); expect(d.value).to.equal("aa"); }); }); diff --git a/packages/preact-transform/test/node/index.test.tsx b/packages/preact-transform/test/node/index.test.tsx index 882db0737..0c0b7e5f6 100644 --- a/packages/preact-transform/test/node/index.test.tsx +++ b/packages/preact-transform/test/node/index.test.tsx @@ -1,3 +1,4 @@ +import { describe, it, expect } from "vitest"; import { transform } from "@babel/core"; import prettier from "prettier"; import signalsTransform, { PluginOptions } from "../../src/index"; diff --git a/packages/preact/test/index.test.tsx b/packages/preact/test/browser/index.test.tsx similarity index 78% rename from packages/preact/test/index.test.tsx rename to packages/preact/test/browser/index.test.tsx index 6f57d91fa..08b0ad31d 100644 --- a/packages/preact/test/index.test.tsx +++ b/packages/preact/test/browser/index.test.tsx @@ -23,6 +23,7 @@ import { useCallback, } from "preact/hooks"; import { setupRerender, act } from "preact/test-utils"; +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; const sleep = (ms?: number) => new Promise(r => setTimeout(r, ms)); @@ -85,13 +86,13 @@ describe("@preact/signals", () => { it("should update Signal-based SignalValue (in a parent component)", async () => { const sig = signal("test"); - const spy = sinon.spy(); + const spy = vi.fn(); function App({ x }: { x: typeof sig }) { spy(); return {x}; } render(, scratch); - spy.resetHistory(); + spy.mockClear(); const text = scratch.firstChild!.firstChild!; expect(text).to.have.property("data", "test"); @@ -106,12 +107,12 @@ describe("@preact/signals", () => { expect(text).to.have.property("data", "changed"); await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); }); it("should support swapping Signals in SignalValue positions", async () => { const sig = signal("test"); - const spy = sinon.spy(); + const spy = vi.fn(); function App({ x }: { x: typeof sig }) { spy(); return {x}; @@ -120,7 +121,7 @@ describe("@preact/signals", () => { act(() => { render(, scratch); }); - spy.resetHistory(); + spy.mockClear(); const text = scratch.firstChild!.firstChild!; expect(text).to.have.property("data", "test"); @@ -129,8 +130,8 @@ describe("@preact/signals", () => { act(() => { render(, scratch); }); - expect(spy).to.have.been.called; - spy.resetHistory(); + expect(spy).toHaveBeenCalled(); + spy.mockClear(); // should not remount/replace SignalValue expect(scratch.firstChild!.firstChild!).to.equal(text); @@ -138,14 +139,14 @@ describe("@preact/signals", () => { expect(text).to.have.property("data", "different"); await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); act(() => { sig.value = "changed old signal"; }); await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); // the text should _not_ have changed: expect(text).to.have.property("data", "different"); @@ -157,7 +158,7 @@ describe("@preact/signals", () => { expect(text).to.have.property("data", "changed"); await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); }); it("should support rendering JSX in SignalValue positions", async () => { @@ -177,15 +178,15 @@ describe("@preact/signals", () => { it("JSX in SignalValue should be reactive", async () => { const sig = signal(test); - const spy = sinon.spy(); + const spy = vi.fn(); function App({ x }: { x: typeof sig }) { spy(); return {x}; } render(, scratch); - expect(spy).to.have.been.calledOnce; - spy.resetHistory(); + expect(spy).toHaveBeenCalledOnce(); + spy.mockClear(); const text = scratch.firstChild!.firstChild!; @@ -196,8 +197,8 @@ describe("@preact/signals", () => { act(() => { sig.value =
a
; }); - expect(spy).not.to.have.been.calledOnce; - scratch.firstChild!.firstChild!.textContent!.should.equal("a"); + expect(spy).not.toHaveBeenCalledOnce(); + expect(scratch.firstChild!.firstChild!.textContent!).to.equal("a"); }); it("should support swapping between JSX and string in SignalValue positions", async () => { @@ -245,60 +246,56 @@ describe("@preact/signals", () => { expect(text.textContent).to.equal("d"); }); - describe("garbage collection", function () { - // Skip GC tests if window.gc/global.gc is not defined. - before(function () { - if (typeof gc === "undefined") { - this.skip(); - } - }); - - it("should not hold on to references to signals and computeds after unmount", async () => { - const sig = signal("test"); - - let update: (content: VNode) => void; - function App() { - const [content, setContent] = useState(
{sig}
); - update = setContent; - return content; - } - - render(, scratch); - expect(scratch.firstChild!.firstChild!).to.have.property( - "data", - "test" - ); + describe.skipIf(typeof gc === "undefined")( + "garbage collection", + function () { + it("should not hold on to references to signals and computeds after unmount", async () => { + const sig = signal("test"); + + let update: (content: VNode) => void; + function App() { + const [content, setContent] = useState(
{sig}
); + update = setContent; + return content; + } + + render(, scratch); + expect(scratch.firstChild!.firstChild!).to.have.property( + "data", + "test" + ); - let ref: WeakRef; - (function () { - // Create a new computed inside a new IIFE scope, so that - // we can explicitly hold a _only_ weak reference to it. - const c = computed(() => sig.value + " computed"); - ref = new WeakRef(c); - - // Mount the new computed to App. Wrap it inside so that `c` - // will get unmounted when we replace the spans with divs later. - act(() => update({c})); - })(); - - expect(scratch.firstChild!.firstChild!).to.have.property( - "data", - "test computed" - ); + let ref: WeakRef; + (function () { + // Create a new computed inside a new IIFE scope, so that + // we can explicitly hold a _only_ weak reference to it. + const c = computed(() => sig.value + " computed"); + ref = new WeakRef(c); + + // Mount the new computed to App. Wrap it inside so that `c` + // will get unmounted when we replace the spans with divs later. + act(() => update({c})); + })(); + + expect(scratch.firstChild!.firstChild!).to.have.property( + "data", + "test computed" + ); - act(() => update(
{sig}
)); - expect(scratch.firstChild!.firstChild!).to.have.property( - "data", - "test" - ); + act(() => update(
{sig}
)); + expect(scratch.firstChild!.firstChild!).to.have.property( + "data", + "test" + ); - // Ensure that the computed has a chance to get GC'd. - (gc as () => void)(); - await sleep(0); - (gc as () => void)(); - expect(ref.deref()).to.be.undefined; - }); - }); + // Ensure that the computed has a chance to get GC'd. + (gc as () => void)(); + await sleep(0); + (gc as () => void)(); + expect(ref.deref()).to.be.undefined; + }); + } + ); }); describe("Component bindings", () => { @@ -377,7 +374,7 @@ describe("@preact/signals", () => { return

{value}

; } - const spy = sinon.spy(); + const spy = vi.fn(); function App() { spy(); return ; @@ -388,14 +385,14 @@ describe("@preact/signals", () => { sig.value = "bar"; rerender(); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should minimize rerenders when passing signals through context", () => { function spyOn

( c: FunctionComponent

) { - return sinon.spy(c); + return vi.fn(c); } // Manually read signal value below so we can watch whether components rerender @@ -480,25 +477,25 @@ describe("@preact/signals", () => { const url = scratch.querySelector("p")!; expect(url.textContent).to.equal("https://domain.com/test?a=1"); - expect(URLModelProvider).to.be.calledOnce; - expect(Origin).to.be.calledOnce; - expect(Pathname).to.be.calledOnce; - expect(Search).to.be.calledOnce; + expect(URLModelProvider).toHaveBeenCalledOnce(); + expect(Origin).toHaveBeenCalledOnce(); + expect(Pathname).toHaveBeenCalledOnce(); + expect(Search).toHaveBeenCalledOnce(); scratch.querySelector("button")!.click(); rerender(); expect(url.textContent).to.equal("https://domain.com/test?a=2"); - expect(URLModelProvider).to.be.calledOnce; - expect(Origin).to.be.calledOnce; - expect(Pathname).to.be.calledOnce; - expect(Search).to.be.calledTwice; + expect(URLModelProvider).toHaveBeenCalledOnce(); + expect(Origin).toHaveBeenCalledOnce(); + expect(Pathname).toHaveBeenCalledOnce(); + expect(Search).toHaveBeenCalledTimes(2); }); it("should not subscribe to computed signals only created and not used", () => { const sig = signal(0); - const childSpy = sinon.spy(); - const parentSpy = sinon.spy(); + const childSpy = vi.fn(); + const parentSpy = vi.fn(); function Child({ num }: { num: ReadonlySignal }) { childSpy(); @@ -513,21 +510,21 @@ describe("@preact/signals", () => { render(, scratch); expect(scratch.innerHTML).to.equal("

1

"); - expect(parentSpy).to.be.calledOnce; - expect(childSpy).to.be.calledOnce; + expect(parentSpy).toHaveBeenCalledOnce(); + expect(childSpy).toHaveBeenCalledOnce(); sig.value += 1; rerender(); expect(scratch.innerHTML).to.equal("

2

"); - expect(parentSpy).to.be.calledOnce; - expect(childSpy).to.be.calledTwice; + expect(parentSpy).toHaveBeenCalledOnce(); + expect(childSpy).toHaveBeenCalledTimes(2); }); it("should properly subscribe and unsubscribe to conditionally rendered computed signals ", () => { const computedDep = signal(0); const renderComputed = signal(true); - const renderSpy = sinon.spy(); - const computer = sinon.spy(() => computedDep.value + 1); + const renderSpy = vi.fn(); + const computer = vi.fn(() => computedDep.value + 1); function App() { renderSpy(); @@ -537,26 +534,26 @@ describe("@preact/signals", () => { render(, scratch); expect(scratch.innerHTML).to.equal("

1

"); - expect(renderSpy).to.be.calledOnce; - expect(computer).to.be.calledOnce; + expect(renderSpy).toHaveBeenCalledOnce(); + expect(computer).toHaveBeenCalledOnce(); computedDep.value += 1; rerender(); expect(scratch.innerHTML).to.equal("

2

"); - expect(renderSpy).to.be.calledTwice; - expect(computer).to.be.calledTwice; + expect(renderSpy).toHaveBeenCalledTimes(2); + expect(computer).toHaveBeenCalledTimes(2); renderComputed.value = false; rerender(); expect(scratch.innerHTML).to.equal(""); - expect(renderSpy).to.be.calledThrice; - expect(computer).to.be.calledTwice; + expect(renderSpy).toHaveBeenCalledTimes(3); + expect(computer).toHaveBeenCalledTimes(2); computedDep.value += 1; rerender(); expect(scratch.innerHTML).to.equal(""); - expect(renderSpy).to.be.calledThrice; // Should not be called again - expect(computer).to.be.calledTwice; // Should not be called again + expect(renderSpy).toHaveBeenCalledTimes(3); // Should not be called again + expect(computer).toHaveBeenCalledTimes(2); // Should not be called again }); }); @@ -586,14 +583,14 @@ describe("@preact/signals", () => { it("should update props without re-rendering", async () => { const s = signal("initial"); - const spy = sinon.spy(); + const spy = vi.fn(); function Wrap() { spy(); // @ts-ignore return ; } render(, scratch); - spy.resetHistory(); + spy.mockClear(); expect(scratch.firstChild).to.have.property("value", "initial"); @@ -605,7 +602,7 @@ describe("@preact/signals", () => { // ensure the component was never re-rendered: (even after a tick) await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); act(() => { s.value = "second update"; @@ -615,19 +612,19 @@ describe("@preact/signals", () => { // ensure the component was never re-rendered: (even after a tick) await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); }); it("should set and update string style property", async () => { const style = signal("left: 10px"); - const spy = sinon.spy(); + const spy = vi.fn(); function Wrap() { spy(); // @ts-ignore return
; } render(, scratch); - spy.resetHistory(); + spy.mockClear(); const div = scratch.firstChild as HTMLDivElement; @@ -635,7 +632,7 @@ describe("@preact/signals", () => { // ensure the component was never re-rendered: (even after a tick) await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); act(() => { style.value = "left: 20px;"; @@ -645,26 +642,26 @@ describe("@preact/signals", () => { // ensure the component was never re-rendered: (even after a tick) await sleep(); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); }); it("should set updated signal prop values at most once", async () => { const s = signal("initial"); - const spy = sinon.spy(); + const spy = vi.fn(); function Wrap() { spy(); // @ts-ignore return ; } render(, scratch); - spy.resetHistory(); + spy.mockClear(); const span = scratch.firstElementChild as HTMLSpanElement; - const ariaLabel = sinon.spy(); + const ariaLabel = vi.fn(); Object.defineProperty(span, "ariaLabel", { set: ariaLabel, }); - const ariaDescription = sinon.spy(); + const ariaDescription = vi.fn(); Object.defineProperty(span, "ariaDescription", { set: ariaDescription, }); @@ -673,39 +670,39 @@ describe("@preact/signals", () => { s.value = "updated"; }); - expect(spy).to.have.been.calledOnce; + expect(spy).toHaveBeenCalledOnce(); - expect(ariaLabel).to.have.been.calledOnce; - expect(ariaLabel).to.have.been.calledWith("updated"); - ariaLabel.resetHistory(); + expect(ariaLabel).toHaveBeenCalledOnce(); + expect(ariaLabel).toHaveBeenCalledWith("updated"); + ariaLabel.mockClear(); - expect(ariaDescription).to.have.been.calledOnce; - expect(ariaDescription).to.have.been.calledWith("updated"); - ariaDescription.resetHistory(); + expect(ariaDescription).toHaveBeenCalledOnce(); + expect(ariaDescription).toHaveBeenCalledWith("updated"); + ariaDescription.mockClear(); // ensure the component was never re-rendered: (even after a tick) await sleep(); - expect(ariaLabel).not.to.have.been.called; - expect(ariaDescription).not.to.have.been.called; + expect(ariaLabel).not.toHaveBeenCalled(); + expect(ariaDescription).not.toHaveBeenCalled(); act(() => { s.value = "second update"; }); - expect(ariaLabel).to.have.been.calledOnce; - expect(ariaLabel).to.have.been.calledWith("second update"); - ariaLabel.resetHistory(); + expect(ariaLabel).toHaveBeenCalledOnce(); + expect(ariaLabel).toHaveBeenCalledWith("second update"); + ariaLabel.mockClear(); - expect(ariaDescription).to.have.been.calledOnce; - expect(ariaDescription).to.have.been.calledWith("second update"); - ariaDescription.resetHistory(); + expect(ariaDescription).toHaveBeenCalledOnce(); + expect(ariaDescription).toHaveBeenCalledWith("second update"); + ariaDescription.mockClear(); // ensure the component was never re-rendered: (even after a tick) await sleep(); - expect(ariaLabel).not.to.have.been.called; - expect(ariaDescription).not.to.have.been.called; + expect(ariaLabel).not.toHaveBeenCalled(); + expect(ariaDescription).not.toHaveBeenCalled(); }); it("should set SVG values", async () => { @@ -732,7 +729,7 @@ describe("@preact/signals", () => { // https://github.com/preactjs/signals/issues/781 it("should handle empty string data-* attributes consistently", async () => { const s = signal(""); - const spy = sinon.spy(); + const spy = vi.fn(); function App() { spy(); @@ -741,7 +738,7 @@ describe("@preact/signals", () => { } render(, scratch); - spy.resetHistory(); + spy.mockReset(); const div = scratch.firstChild as HTMLDivElement; @@ -753,7 +750,7 @@ describe("@preact/signals", () => { }); expect(div.getAttribute("data-text")).to.equal("test"); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); act(() => { s.value = ""; @@ -761,12 +758,12 @@ describe("@preact/signals", () => { expect(div.hasAttribute("data-text")).to.equal(true); expect(div.getAttribute("data-text")).to.equal(""); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); }); it("should handle empty string on regular attributes consistently", async () => { const s = signal(""); - const spy = sinon.spy(); + const spy = vi.fn(); function App() { spy(); @@ -775,7 +772,7 @@ describe("@preact/signals", () => { } render(, scratch); - spy.resetHistory(); + spy.mockReset(); const div = scratch.firstChild as HTMLDivElement; @@ -787,7 +784,7 @@ describe("@preact/signals", () => { }); expect(div.getAttribute("title")).to.equal("test"); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); act(() => { s.value = ""; @@ -795,7 +792,7 @@ describe("@preact/signals", () => { expect(div.hasAttribute("title")).to.equal(true); expect(div.getAttribute("title")).to.equal(""); - expect(spy).not.to.have.been.called; + expect(spy).not.toHaveBeenCalled(); }); }); @@ -842,7 +839,7 @@ describe("@preact/signals", () => { it("should be invoked after commit", async () => { const ref = createRef(); const sig = signal("foo"); - const spy = sinon.spy(); + const spy = vi.fn(); let count = 0; function App() { @@ -864,14 +861,11 @@ describe("@preact/signals", () => { render(, scratch); }); expect(scratch.textContent).to.equal("foo"); - // expect(spy).not.to.have.been.called; - expect(spy).to.have.been.calledOnceWith( - "foo", - scratch.firstElementChild, - "0" - ); + // expect(spy).not.toHaveBeenCalled(); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("foo", scratch.firstElementChild, "0"); - spy.resetHistory(); + spy.mockClear(); act(() => { sig.value = "bar"; @@ -879,18 +873,15 @@ describe("@preact/signals", () => { expect(scratch.textContent).to.equal("bar"); - expect(spy).to.have.been.calledOnceWith( - "bar", - scratch.firstElementChild, - "1" - ); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("bar", scratch.firstElementChild, "1"); }); it("should invoke any returned cleanup function for updates", async () => { const ref = createRef(); const sig = signal("foo"); - const spy = sinon.spy(); - const cleanup = sinon.spy(); + const spy = vi.fn(); + const cleanup = vi.fn(); let count = 0; function App() { @@ -913,13 +904,10 @@ describe("@preact/signals", () => { render(, scratch); }); - expect(cleanup).not.to.have.been.called; - expect(spy).to.have.been.calledOnceWith( - "foo", - scratch.firstElementChild, - "0" - ); - spy.resetHistory(); + expect(cleanup).not.toHaveBeenCalled(); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("foo", scratch.firstElementChild, "0"); + spy.mockClear(); act(() => { sig.value = "bar"; @@ -928,15 +916,17 @@ describe("@preact/signals", () => { expect(scratch.textContent).to.equal("bar"); const child = scratch.firstElementChild; - expect(cleanup).to.have.been.calledOnceWith("foo", child, "0"); - expect(spy).to.have.been.calledOnceWith("bar", child, "1"); + expect(cleanup).toHaveBeenCalledOnce(); + expect(cleanup).toHaveBeenCalledWith("foo", child, "0"); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("bar", child, "1"); }); it("should invoke any returned cleanup function for unmounts", async () => { const ref = createRef(); const sig = signal("foo"); - const spy = sinon.spy(); - const cleanup = sinon.spy(); + const spy = vi.fn(); + const cleanup = vi.fn(); function App() { useSignalEffect(() => { @@ -953,22 +943,24 @@ describe("@preact/signals", () => { const child = scratch.firstElementChild; - expect(cleanup).not.to.have.been.called; - expect(spy).to.have.been.calledOnceWith("foo", child); - spy.resetHistory(); + expect(cleanup).not.toHaveBeenCalled(); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("foo", child); + spy.mockClear(); act(() => { render(null, scratch); }); - expect(spy).not.to.have.been.called; - expect(cleanup).to.have.been.calledOnceWith("foo", child); + expect(spy).not.toHaveBeenCalled(); + expect(cleanup).toHaveBeenCalledOnce(); + expect(cleanup).toHaveBeenCalledWith("foo", child); }); }); // TODO: add test when we upgrade lockfile and Preact to latest it.skip("Should take hooks-state settling in account", () => { - const renderSpy = sinon.spy(); + const renderSpy = vi.fn(); const Context = createContext({ addModal: () => {}, removeModal: () => {}, @@ -1019,7 +1011,7 @@ describe("@preact/signals", () => { render(, scratch); }); - expect(renderSpy).to.be.calledTwice; + expect(renderSpy).toHaveBeenCalledTimes(2); }); it("Array based signals should maintain reactivity", () => { @@ -1047,7 +1039,7 @@ describe("@preact/signals", () => { describe("Preact class Component", () => { it("should support reading signal in class component constructor", async () => { const count = signal(1); - const spy = sinon.spy(); + const spy = vi.fn(); class App extends Component<{ x: number }, unknown> { constructor(props: { x: number }) { @@ -1071,9 +1063,9 @@ describe("@preact/signals", () => { }) ).not.to.throw(); expect(scratch.innerHTML).to.equal("
2
"); - expect(spy).to.have.been.calledTwice; - expect(spy).to.have.been.calledWith("constructor:1"); - expect(spy).to.have.been.calledWith("willmount:1"); + expect(spy).toHaveBeenCalledTimes(2); + expect(spy).toHaveBeenCalledWith("constructor:1"); + expect(spy).toHaveBeenCalledWith("willmount:1"); }); }); @@ -1108,7 +1100,7 @@ describe("@preact/signals", () => { it("should not recompute when the compute function doesn't change and dependency values don't change", async () => { const s1 = signal(1); - const spy = sinon.spy(); + const spy = vi.fn(); function App({ x }: { x: Signal }) { const fn = useCallback(() => { @@ -1122,11 +1114,11 @@ describe("@preact/signals", () => { render(, scratch); expect(scratch.textContent).to.equal("1"); - expect(spy).to.have.been.calledOnce; + expect(spy).toHaveBeenCalledTimes(1); rerender(); expect(scratch.textContent).to.equal("1"); - expect(spy).to.have.been.calledOnce; + expect(spy).toHaveBeenCalledTimes(1); }); }); }); diff --git a/packages/preact/test/exports.test.tsx b/packages/preact/test/exports.test.tsx index 1da9ca307..fffb8ad26 100644 --- a/packages/preact/test/exports.test.tsx +++ b/packages/preact/test/exports.test.tsx @@ -1,5 +1,6 @@ import * as core from "@preact/signals-core"; import * as adapter from "@preact/signals"; +import { describe, it, expect } from "vitest"; describe("@preact/signals", () => { describe("exports", () => { diff --git a/packages/preact/test/ssr.test.tsx b/packages/preact/test/ssr.test.tsx index 13ed737cc..824081eb4 100644 --- a/packages/preact/test/ssr.test.tsx +++ b/packages/preact/test/ssr.test.tsx @@ -1,6 +1,7 @@ import { signal, useSignal, useComputed } from "@preact/signals"; import { createElement } from "preact"; import { renderToString } from "preact-render-to-string"; +import { describe, it, expect } from "vitest"; const sleep = (ms?: number) => new Promise(r => setTimeout(r, ms)); diff --git a/packages/preact/utils/test/browser/index.test.tsx b/packages/preact/utils/test/browser/index.test.tsx index 3a9c07cc4..687a347b9 100644 --- a/packages/preact/utils/test/browser/index.test.tsx +++ b/packages/preact/utils/test/browser/index.test.tsx @@ -2,6 +2,7 @@ import { computed, signal } from "@preact/signals"; import { For, Show, useSignalRef } from "@preact/signals/utils"; import { render, createElement } from "preact"; import { act } from "preact/test-utils"; +import { describe, beforeEach, afterEach, it, expect } from "vitest"; describe("@preact/signals-utils", () => { let scratch: HTMLDivElement; diff --git a/packages/react-transform/package.json b/packages/react-transform/package.json index 448914628..4b2573a38 100644 --- a/packages/react-transform/package.json +++ b/packages/react-transform/package.json @@ -57,6 +57,7 @@ }, "devDependencies": { "@babel/core": "^7.28.4", + "@preact/signals-core": "workspace:*", "@types/babel__core": "^7.20.5", "@types/babel__helper-module-imports": "^7.18.3", "@types/babel__helper-plugin-utils": "^7.10.3", diff --git a/packages/react-transform/test/browser/e2e.test.tsx b/packages/react-transform/test/browser/e2e.test.tsx index 0042403ae..f04699856 100644 --- a/packages/react-transform/test/browser/e2e.test.tsx +++ b/packages/react-transform/test/browser/e2e.test.tsx @@ -13,6 +13,8 @@ import { createRoot, getConsoleErrorSpy, } from "../../../react/test/shared/utils"; +import { describe, beforeEach, afterEach, expect, it } from "vitest"; +import "../../../../test/browser/babel.js"; const customSource = "useSignals-custom-source"; const modules: Record = { @@ -32,8 +34,6 @@ function testRequire(name: string) { } async function createComponent(code: string, options?: PluginOptions) { - // `transformSignalCode` is a global helper function added to the global - // namespace by a test helper we've included in the Karma config. const cjsCode = transformSignalCode(code, options); // console.log(cjsCode); // Useful when debugging tests. @@ -55,7 +55,7 @@ describe("React Signals babel transfrom - browser E2E tests", () => { scratch = document.createElement("div"); document.body.appendChild(scratch); root = await createRoot(scratch); - getConsoleErrorSpy().resetHistory(); + getConsoleErrorSpy().mockClear(); }); afterEach(async () => { diff --git a/packages/react-transform/test/node/index.test.tsx b/packages/react-transform/test/node/index.test.tsx index d2edcc3ff..b064140d5 100644 --- a/packages/react-transform/test/node/index.test.tsx +++ b/packages/react-transform/test/node/index.test.tsx @@ -19,6 +19,7 @@ import { objMethodComp, variableHooks, } from "./helpers"; +import { it, describe, expect } from "vitest"; // To help interactively debug a specific test case, add the test ids of the // test cases you want to debug to the `debugTestIds` array, e.g. (["258", diff --git a/packages/react/runtime/package.json b/packages/react/runtime/package.json index de98164a0..78e9360a3 100644 --- a/packages/react/runtime/package.json +++ b/packages/react/runtime/package.json @@ -21,6 +21,9 @@ "@preact/signals-core": "workspace:^1.3.0", "use-sync-external-store": "^1.2.0" }, + "devDependencies": { + "@preact/signals-react": "workspace:*" + }, "peerDependencies": { "react": "^16.14.0 || 17.x || 18.x" } diff --git a/packages/react/runtime/test/browser/mounts.test.tsx b/packages/react/runtime/test/browser/mounts.test.tsx index 76ff7aa9d..ff401244b 100644 --- a/packages/react/runtime/test/browser/mounts.test.tsx +++ b/packages/react/runtime/test/browser/mounts.test.tsx @@ -9,6 +9,7 @@ import { createRoot, type Root, } from "../../../test/shared/utils.js"; +import { describe, beforeEach, afterEach } from "vitest"; describe("@preact/signals-react/runtime", () => { describe("mounting", () => { @@ -25,7 +26,7 @@ describe("@preact/signals-react/runtime", () => { beforeEach(async () => { scratch = document.createElement("div"); document.body.appendChild(scratch); - getConsoleErrorSpy().resetHistory(); + getConsoleErrorSpy().mockClear(); root = await createRoot(scratch); }); diff --git a/packages/react/runtime/test/browser/suspense.test.tsx b/packages/react/runtime/test/browser/suspense.test.tsx index 5142ada70..458d5d26e 100644 --- a/packages/react/runtime/test/browser/suspense.test.tsx +++ b/packages/react/runtime/test/browser/suspense.test.tsx @@ -15,6 +15,7 @@ import { checkHangingAct, getConsoleErrorSpy, } from "../../../test/shared/utils"; +import { beforeEach, afterEach, describe, it, expect } from "vitest"; describe("Suspense", () => { let scratch: HTMLDivElement; @@ -28,7 +29,7 @@ describe("Suspense", () => { scratch = document.createElement("div"); document.body.appendChild(scratch); root = await createRoot(scratch); - getConsoleErrorSpy().resetHistory(); + getConsoleErrorSpy().mockClear(); }); afterEach(async () => { diff --git a/packages/react/runtime/test/browser/updates.test.tsx b/packages/react/runtime/test/browser/updates.test.tsx index 762081f7e..422a7f5ec 100644 --- a/packages/react/runtime/test/browser/updates.test.tsx +++ b/packages/react/runtime/test/browser/updates.test.tsx @@ -2,6 +2,7 @@ globalThis.IS_REACT_ACT_ENVIRONMENT = true; import { updateSignalsTests } from "../../../test/shared/updates"; +import { describe } from "vitest"; describe("@preact/signals-react/runtime", () => { describe("updating", () => { diff --git a/packages/react/runtime/test/browser/useSignals.test.tsx b/packages/react/runtime/test/browser/useSignals.test.tsx index 987faec9c..a720aa370 100644 --- a/packages/react/runtime/test/browser/useSignals.test.tsx +++ b/packages/react/runtime/test/browser/useSignals.test.tsx @@ -8,6 +8,7 @@ import { checkHangingAct, getConsoleErrorSpy, } from "../../../test/shared/utils"; +import { describe, expect, beforeEach, afterEach, vi, it } from "vitest"; const MANAGED_COMPONENT = 1; const MANAGED_HOOK = 2; @@ -52,7 +53,7 @@ describe("useSignals", () => { scratch = document.createElement("div"); document.body.appendChild(scratch); root = await createRoot(scratch); - getConsoleErrorSpy().resetHistory(); + getConsoleErrorSpy().mockClear(); }); afterEach(async () => { @@ -142,7 +143,7 @@ describe("useSignals", () => { }); it("should not rerender components when signals they use do not change", async () => { - const child1Spy = sinon.spy(); + const child1Spy = vi.fn(); const signal1 = signal(0); function Child1() { child1Spy(); @@ -150,7 +151,7 @@ describe("useSignals", () => { return

{signal1.value}

; } - const child2Spy = sinon.spy(); + const child2Spy = vi.fn(); const signal2 = signal(0); function Child2() { child2Spy(); @@ -158,7 +159,7 @@ describe("useSignals", () => { return

{signal2.value}

; } - const parentSpy = sinon.spy(); + const parentSpy = vi.fn(); function Parent() { parentSpy(); return ( @@ -170,39 +171,39 @@ describe("useSignals", () => { } function resetSpies() { - child1Spy.resetHistory(); - child2Spy.resetHistory(); - parentSpy.resetHistory(); + child1Spy.mockClear(); + child2Spy.mockClear(); + parentSpy.mockClear(); } resetSpies(); await render(); expect(scratch.innerHTML).to.equal("

0

0

"); - expect(child1Spy).to.have.been.calledOnce; - expect(child2Spy).to.have.been.calledOnce; - expect(parentSpy).to.have.been.calledOnce; + expect(child1Spy).toHaveBeenCalledOnce(); + expect(child2Spy).toHaveBeenCalledOnce(); + expect(parentSpy).toHaveBeenCalledOnce(); resetSpies(); await act(() => { signal1.value += 1; }); expect(scratch.innerHTML).to.equal("

1

0

"); - expect(child1Spy).to.have.been.calledOnce; - expect(child2Spy).to.not.have.been.called; - expect(parentSpy).to.not.have.been.called; + expect(child1Spy).toHaveBeenCalledOnce(); + expect(child2Spy).not.toHaveBeenCalled(); + expect(parentSpy).not.toHaveBeenCalled(); resetSpies(); await act(() => { signal2.value += 1; }); expect(scratch.innerHTML).to.equal("

1

1

"); - expect(child1Spy).to.not.have.been.called; - expect(child2Spy).to.have.been.calledOnce; - expect(parentSpy).to.not.have.been.called; + expect(child1Spy).not.toHaveBeenCalled(); + expect(child2Spy).toHaveBeenCalledOnce(); + expect(parentSpy).not.toHaveBeenCalled(); }); it("should not rerender components when signals they use change but they are not mounted", async () => { - const child1Spy = sinon.spy(); + const child1Spy = vi.fn(); const signal1 = signal(0); function Child() { child1Spy(); @@ -231,11 +232,11 @@ describe("useSignals", () => { await act(() => { signal1.value += 1; }); - expect(child1Spy).to.have.been.calledTwice; + expect(child1Spy).toHaveBeenCalledTimes(2); }); it("should not rerender components that only update signals in event handlers", async () => { - const buttonSpy = sinon.spy(); + const buttonSpy = vi.fn(); function AddOneButton({ num }: { num: Signal }) { useSignals(); buttonSpy(); @@ -250,7 +251,7 @@ describe("useSignals", () => { ); } - const displaySpy = sinon.spy(); + const displaySpy = vi.fn(); function DisplayNumber({ num }: { num: Signal }) { useSignals(); displaySpy(); @@ -269,20 +270,20 @@ describe("useSignals", () => { await render(); expect(scratch.innerHTML).to.equal("

0

"); - expect(buttonSpy).to.have.been.calledOnce; - expect(displaySpy).to.have.been.calledOnce; + expect(buttonSpy).toHaveBeenCalledOnce(); + expect(displaySpy).toHaveBeenCalledOnce(); await act(() => { scratch.querySelector("button")!.click(); }); expect(scratch.innerHTML).to.equal("

1

"); - expect(buttonSpy).to.have.been.calledOnce; - expect(displaySpy).to.have.been.calledTwice; + expect(buttonSpy).toHaveBeenCalledOnce(); + expect(displaySpy).toHaveBeenCalledTimes(2); }); it("should not rerender components that only read signals in event handlers", async () => { - const buttonSpy = sinon.spy(); + const buttonSpy = vi.fn(); function AddOneButton({ num }: { num: Signal }) { useSignals(); buttonSpy(); @@ -297,7 +298,7 @@ describe("useSignals", () => { ); } - const displaySpy = sinon.spy(); + const displaySpy = vi.fn(); function DisplayNumber({ num }: { num: Signal }) { useSignals(); displaySpy(); @@ -316,15 +317,15 @@ describe("useSignals", () => { } function resetSpies() { - buttonSpy.resetHistory(); - displaySpy.resetHistory(); + buttonSpy.mockClear(); + displaySpy.mockClear(); } resetSpies(); await render(); expect(scratch.innerHTML).to.equal("

0

"); - expect(buttonSpy).to.have.been.calledOnce; - expect(displaySpy).to.have.been.calledOnce; + expect(buttonSpy).toHaveBeenCalledOnce(); + expect(displaySpy).toHaveBeenCalledOnce(); resetSpies(); await act(() => { @@ -332,8 +333,8 @@ describe("useSignals", () => { }); expect(scratch.innerHTML).to.equal("

2

"); - expect(buttonSpy).to.not.have.been.called; - expect(displaySpy).to.have.been.calledOnce; + expect(buttonSpy).not.toHaveBeenCalled(); + expect(displaySpy).toHaveBeenCalledOnce(); resetSpies(); await act(() => { @@ -341,8 +342,8 @@ describe("useSignals", () => { }); expect(scratch.innerHTML).to.equal("

2

"); - expect(buttonSpy).to.not.have.been.called; - expect(displaySpy).to.not.have.been.called; + expect(buttonSpy).not.toHaveBeenCalled(); + expect(displaySpy).not.toHaveBeenCalled(); resetSpies(); await act(() => { @@ -350,8 +351,8 @@ describe("useSignals", () => { }); expect(scratch.innerHTML).to.equal("

5

"); - expect(buttonSpy).to.not.have.been.called; - expect(displaySpy).to.have.been.calledOnce; + expect(buttonSpy).not.toHaveBeenCalled(); + expect(displaySpy).toHaveBeenCalledOnce(); }); it("should properly rerender components that use custom hooks", async () => { diff --git a/packages/react/runtime/test/node/renderToStaticMarkup.test.tsx b/packages/react/runtime/test/node/renderToStaticMarkup.test.tsx index 25c86dc93..86bd09ea1 100644 --- a/packages/react/runtime/test/node/renderToStaticMarkup.test.tsx +++ b/packages/react/runtime/test/node/renderToStaticMarkup.test.tsx @@ -2,13 +2,14 @@ import { signal, useSignalEffect } from "@preact/signals-react"; import { createElement } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { mountSignalsTests } from "../../../test/shared/mounting"; +import { describe, it, expect, vi } from "vitest"; describe("@preact/signals-react/runtime", () => { describe("renderToStaticMarkup", () => { mountSignalsTests(el => Promise.resolve(renderToStaticMarkup(el))); it("should not invoke useSignalEffect", async () => { - const spy = sinon.spy(); + const spy = vi.fn(); const sig = signal("foo"); function App() { @@ -18,7 +19,7 @@ describe("@preact/signals-react/runtime", () => { const html = await renderToStaticMarkup(); expect(html).to.equal("

foo

"); - expect(spy.called).to.be.false; + expect(spy).not.toHaveBeenCalled(); }); }); }); diff --git a/packages/react/test/browser/exports.test.tsx b/packages/react/test/browser/exports.test.tsx index 6806a96ce..b80d00ad8 100644 --- a/packages/react/test/browser/exports.test.tsx +++ b/packages/react/test/browser/exports.test.tsx @@ -1,5 +1,6 @@ import * as core from "@preact/signals-core"; import * as adapter from "@preact/signals-react"; +import { describe, it, expect } from "vitest"; describe("@preact/signals-react", () => { describe("exports", () => { diff --git a/packages/react/test/browser/react-router.test.tsx b/packages/react/test/browser/react-router.test.tsx index fb6bc6622..0a4c02cb3 100644 --- a/packages/react/test/browser/react-router.test.tsx +++ b/packages/react/test/browser/react-router.test.tsx @@ -4,6 +4,7 @@ globalThis.IS_REACT_ACT_ENVIRONMENT = true; import { signal } from "@preact/signals-react"; import { createElement } from "react"; import * as ReactRouter from "react-router-dom"; +import { describe, it, beforeEach, afterEach, expect } from "vitest"; import { act, checkHangingAct, createRoot, Root } from "../shared/utils"; diff --git a/packages/react/test/node/renderToStaticMarkup.test.tsx b/packages/react/test/node/renderToStaticMarkup.test.tsx index 60ef93268..f1f352814 100644 --- a/packages/react/test/node/renderToStaticMarkup.test.tsx +++ b/packages/react/test/node/renderToStaticMarkup.test.tsx @@ -3,12 +3,13 @@ import { useSignals } from "@preact/signals-react/runtime"; import { createElement } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { mountSignalsTests } from "../shared/mounting"; +import { describe, it, expect, vi } from "vitest"; describe("renderToStaticMarkup", () => { mountSignalsTests(el => Promise.resolve(renderToStaticMarkup(el))); it("should not invoke useSignalEffect", async () => { - const spy = sinon.spy(); + const spy = vi.fn(); const sig = signal("foo"); function App() { @@ -18,7 +19,7 @@ describe("renderToStaticMarkup", () => { const html = await renderToStaticMarkup(); expect(html).to.equal("

foo

"); - expect(spy.called).to.be.false; + expect(spy).not.toHaveBeenCalled(); }); it("should clean up signal dependencies after executing", async () => { diff --git a/packages/react/test/shared/create-root-legacy.ts b/packages/react/test/shared/create-root-legacy.ts new file mode 100644 index 000000000..c377c7e56 --- /dev/null +++ b/packages/react/test/shared/create-root-legacy.ts @@ -0,0 +1,22 @@ +import { render, unmountComponentAtNode } from "react-dom"; + +export interface Root { + render(element: JSX.Element | null): void; + unmount(): void; +} + +let createRootCache: ((container: Element) => Root) | undefined; +export function createRoot(container: Element): Root { + if (!createRootCache) { + createRootCache = (container: Element) => ({ + render(element: JSX.Element) { + render(element, container); + }, + unmount() { + unmountComponentAtNode(container); + }, + }); + } + + return createRootCache(container); +} diff --git a/packages/react/test/shared/create-root.ts b/packages/react/test/shared/create-root.ts new file mode 100644 index 000000000..f615e8fe2 --- /dev/null +++ b/packages/react/test/shared/create-root.ts @@ -0,0 +1,3 @@ +import { createRoot } from "react-dom/client"; + +export { createRoot }; diff --git a/packages/react/test/shared/mounting.tsx b/packages/react/test/shared/mounting.tsx index 2ca9ad473..198bdce44 100644 --- a/packages/react/test/shared/mounting.tsx +++ b/packages/react/test/shared/mounting.tsx @@ -1,6 +1,6 @@ import { signal, computed } from "@preact/signals-core"; import { useComputed, useSignal } from "@preact/signals-react/runtime"; -import { expect } from "chai"; +import { describe, it, expect } from "vitest"; import { createElement, useReducer, StrictMode, useState } from "react"; export function mountSignalsTests( diff --git a/packages/react/test/shared/updates.tsx b/packages/react/test/shared/updates.tsx index ab8e74964..96fb58614 100644 --- a/packages/react/test/shared/updates.tsx +++ b/packages/react/test/shared/updates.tsx @@ -22,6 +22,15 @@ import { } from "react"; import type { FunctionComponent } from "react"; import { renderToStaticMarkup } from "react-dom/server"; +import { + beforeEach, + afterEach, + describe, + it, + expect, + vi, + MockInstance, +} from "vitest"; import { act, @@ -51,7 +60,7 @@ export function updateSignalsTests(usingTransform = false) { render = root.render.bind(root); - getConsoleErrorSpy().resetHistory(); + getConsoleErrorSpy().mockClear(); }); afterEach(async () => { @@ -250,7 +259,7 @@ export function updateSignalsTests(usingTransform = false) { return

{value}

; } - const spy = sinon.spy(); + const spy = vi.fn(); function App() { spy(); return ; @@ -262,7 +271,7 @@ export function updateSignalsTests(usingTransform = false) { await act(() => { sig.value = "bar"; }); - expect(spy).to.be.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); it("should update memo'ed component via signals", async () => { @@ -524,8 +533,8 @@ export function updateSignalsTests(usingTransform = false) { it("should minimize rerenders when passing signals through context", async () => { function spyOn

( c: FunctionComponent

- ) { - return sinon.spy(c); + ): FunctionComponent

& MockInstance> { + return vi.fn(c); } // Manually read signal value below so we can watch whether components rerender @@ -610,26 +619,26 @@ export function updateSignalsTests(usingTransform = false) { const url = scratch.querySelector("p")!; expect(url.textContent).to.equal("https://domain.com/test?a=1"); - expect(URLModelProvider).to.be.calledOnce; - expect(Origin).to.be.calledOnce; - expect(Pathname).to.be.calledOnce; - expect(Search).to.be.calledOnce; + expect(URLModelProvider).toHaveBeenCalledOnce(); + expect(Origin).toHaveBeenCalledOnce(); + expect(Pathname).toHaveBeenCalledOnce(); + expect(Search).toHaveBeenCalledOnce(); await act(() => { scratch.querySelector("button")!.click(); }); expect(url.textContent).to.equal("https://domain.com/test?a=2"); - expect(URLModelProvider).to.be.calledOnce; - expect(Origin).to.be.calledOnce; - expect(Pathname).to.be.calledOnce; - expect(Search).to.be.calledTwice; + expect(URLModelProvider).toHaveBeenCalledOnce(); + expect(Origin).toHaveBeenCalledOnce(); + expect(Pathname).toHaveBeenCalledOnce(); + expect(Search).toHaveBeenCalledTimes(2); }); it("should not subscribe to computed signals only created and not used", async () => { const sig = signal(0); - const childSpy = sinon.spy(); - const parentSpy = sinon.spy(); + const childSpy = vi.fn(); + const parentSpy = vi.fn(); function Child({ num }: { num: ReadonlySignal }) { childSpy(); @@ -644,21 +653,21 @@ export function updateSignalsTests(usingTransform = false) { await render(); expect(scratch.innerHTML).to.equal("

1

"); - expect(parentSpy).to.be.calledOnce; - expect(childSpy).to.be.calledOnce; + expect(parentSpy).toHaveBeenCalledOnce(); + expect(childSpy).toHaveBeenCalledOnce(); await act(() => { sig.value += 1; }); expect(scratch.innerHTML).to.equal("

2

"); - expect(parentSpy).to.be.calledOnce; - expect(childSpy).to.be.calledTwice; + expect(parentSpy).toHaveBeenCalledOnce(); + expect(childSpy).toHaveBeenCalledTimes(2); }); it("should properly subscribe and unsubscribe to conditionally rendered computed signals ", async () => { const computedDep = signal(0); const renderComputed = signal(true); - const renderSpy = sinon.spy(); + const renderSpy = vi.fn(); function App() { renderSpy(); @@ -668,25 +677,25 @@ export function updateSignalsTests(usingTransform = false) { await render(); expect(scratch.innerHTML).to.equal("

1

"); - expect(renderSpy).to.be.calledOnce; + expect(renderSpy).toHaveBeenCalledOnce(); await act(() => { computedDep.value += 1; }); expect(scratch.innerHTML).to.equal("

2

"); - expect(renderSpy).to.be.calledTwice; + expect(renderSpy).toHaveBeenCalledTimes(2); await act(() => { renderComputed.value = false; }); expect(scratch.innerHTML).to.equal(""); - expect(renderSpy).to.be.calledThrice; + expect(renderSpy).toHaveBeenCalledTimes(3); await act(() => { computedDep.value += 1; }); expect(scratch.innerHTML).to.equal(""); - expect(renderSpy).to.be.calledThrice; // Should not be called again + expect(renderSpy).toHaveBeenCalledTimes(3); // Should not be called again }); }); @@ -716,7 +725,7 @@ export function updateSignalsTests(usingTransform = false) { it("should be invoked after commit", async () => { const ref = createRef(); const sig = signal("foo"); - const spy = sinon.spy(); + const spy = vi.fn(); let count = 0; function App() { @@ -737,13 +746,10 @@ export function updateSignalsTests(usingTransform = false) { await render(); expect(scratch.textContent).to.equal("foo"); - expect(spy).to.have.been.calledOnceWith( - "foo", - scratch.firstElementChild, - "0" - ); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("foo", scratch.firstElementChild, "0"); - spy.resetHistory(); + spy.mockClear(); await act(() => { sig.value = "bar"; @@ -758,7 +764,8 @@ export function updateSignalsTests(usingTransform = false) { // when it coincides with a render? In React 16 when running in production // however, we do see "1" as expected, likely because we are using a fake // act() implementation which completes after the DOM has been updated. - expect(spy).to.have.been.calledOnceWith( + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith( "bar", scratch.firstElementChild, isReact16 && isProd ? "1" : "0" // ideally always "1" - update if we find a nice way to do so! @@ -768,8 +775,8 @@ export function updateSignalsTests(usingTransform = false) { it("should invoke any returned cleanup function for updates", async () => { const ref = createRef(); const sig = signal("foo"); - const spy = sinon.spy(); - const cleanup = sinon.spy(); + const spy = vi.fn(); + const cleanup = vi.fn(); let count = 0; function App() { @@ -788,13 +795,10 @@ export function updateSignalsTests(usingTransform = false) { await render(); - expect(cleanup).not.to.have.been.called; - expect(spy).to.have.been.calledOnceWith( - "foo", - scratch.firstElementChild, - "0" - ); - spy.resetHistory(); + expect(cleanup).not.toHaveBeenCalled(); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("foo", scratch.firstElementChild, "0"); + spy.mockClear(); await act(() => { sig.value = "bar"; @@ -804,9 +808,11 @@ export function updateSignalsTests(usingTransform = false) { const child = scratch.firstElementChild; - expect(cleanup).to.have.been.calledOnceWith("foo", child, "0"); + expect(cleanup).toHaveBeenCalledOnce(); + expect(cleanup).toHaveBeenCalledWith("foo", child, "0"); - expect(spy).to.have.been.calledOnceWith( + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith( "bar", child, isReact16 && isProd ? "1" : "0" // ideally always "1" - update if we find a nice way to do so! @@ -816,8 +822,8 @@ export function updateSignalsTests(usingTransform = false) { it("should invoke any returned cleanup function for unmounts", async () => { const ref = createRef(); const sig = signal("foo"); - const spy = sinon.spy(); - const cleanup = sinon.spy(); + const spy = vi.fn(); + const cleanup = vi.fn(); function App() { useSignalEffect(() => { @@ -833,20 +839,21 @@ export function updateSignalsTests(usingTransform = false) { const child = scratch.firstElementChild; expect(scratch.innerHTML).to.equal("

foo

"); - expect(cleanup).not.to.have.been.called; - expect(spy).to.have.been.calledOnceWith("foo", child); - spy.resetHistory(); + expect(cleanup).not.toHaveBeenCalled(); + expect(spy).toHaveBeenCalledOnce(); + expect(spy).toHaveBeenCalledWith("foo", child); + spy.mockClear(); await act(() => { root.unmount(); }); expect(scratch.innerHTML).to.equal(""); - expect(spy).not.to.have.been.called; - expect(cleanup).to.have.been.calledOnce; + expect(spy).not.toHaveBeenCalled(); + expect(cleanup).toHaveBeenCalledOnce(); // @note: React v18 cleans up the ref eagerly, so it's already null by the // time the callback runs. this is probably worth fixing at some point. - expect(cleanup).to.have.been.calledWith("foo", isReact16 ? child : null); + expect(cleanup).toHaveBeenCalledWith("foo", isReact16 ? child : null); }); }); @@ -883,7 +890,7 @@ export function updateSignalsTests(usingTransform = false) { it("should not recompute when the compute function doesn't change and dependency values don't change", async () => { const s1 = signal(1); - const spy = sinon.spy(); + const spy = vi.fn(); function App({ x }: { x: Signal }) { const fn = useCallback(() => { @@ -897,11 +904,11 @@ export function updateSignalsTests(usingTransform = false) { await render(); expect(scratch.textContent).to.equal("1"); - expect(spy).to.have.been.calledOnce; + expect(spy).toHaveBeenCalledOnce(); await render(); expect(scratch.textContent).to.equal("1"); - expect(spy).to.have.been.calledOnce; + expect(spy).toHaveBeenCalledOnce(); }); }); } diff --git a/packages/react/test/shared/utils.ts b/packages/react/test/shared/utils.ts index 9ad51d052..ff35e9629 100644 --- a/packages/react/test/shared/utils.ts +++ b/packages/react/test/shared/utils.ts @@ -1,5 +1,5 @@ import React from "react"; -import sinon from "sinon"; +import { vi, expect, type MockInstance } from "vitest"; import { act as realAct } from "react-dom/test-utils"; export interface Root { @@ -10,35 +10,7 @@ export interface Root { export const isProd = process.env.NODE_ENV === "production"; export const isReact16 = React.version.startsWith("16."); -// We need to use createRoot() if it's available, but it's only available in -// React 18. To enable local testing with React 16 & 17, we'll create a fake -// createRoot() that uses render() and unmountComponentAtNode() instead. -let createRootCache: ((container: Element) => Root) | undefined; -export async function createRoot(container: Element): Promise { - if (!createRootCache) { - try { - // @ts-expect-error ESBuild will replace this import with a require() call - // if it resolves react-dom/client. If it doesn't, it will leave the - // import untouched causing a runtime error we'll handle below. - const { createRoot } = await import("react-dom/client"); - createRootCache = createRoot; - } catch (e) { - // @ts-expect-error ESBuild will replace this import with a require() call - // if it resolves react-dom. - const { render, unmountComponentAtNode } = await import("react-dom"); - createRootCache = (container: Element) => ({ - render(element: JSX.Element) { - render(element, container); - }, - unmount() { - unmountComponentAtNode(container); - }, - }); - } - } - - return createRootCache(container); -} +export { createRoot } from "./create-root"; // When testing using react's production build, we can't use act (React // explicitly throws an error in this situation). So instead we'll fake act by @@ -96,15 +68,15 @@ export function consoleFormat(str: string, ...values: unknown[]): string { } declare global { - let errorSpy: sinon.SinonSpy | undefined; + let errorSpy: MockInstance | undefined; } // Only one spy can be active on an object at a time and since all tests share // the same console object we need to make sure we're only spying on it once. // We'll use this method to share the spy across all tests. -export function getConsoleErrorSpy(): sinon.SinonSpy { +export function getConsoleErrorSpy(): MockInstance { if (typeof errorSpy === "undefined") { - (globalThis as any).errorSpy = sinon.spy(console, "error"); + (globalThis as any).errorSpy = vi.spyOn(console, "error"); } return errorSpy!; @@ -127,13 +99,13 @@ if (isReact16) { export function checkConsoleErrorLogs(): void { const errorSpy = getConsoleErrorSpy(); - if (errorSpy.called) { + if (errorSpy.mock.calls.length > 0) { let message: string; - if (errorSpy.firstCall.args[0].toString().includes("%s")) { - const firstArg = errorSpy.firstCall.args[0]; - message = consoleFormat(firstArg, ...errorSpy.firstCall.args.slice(1)); + if (errorSpy.mock.calls[0][0].toString().includes("%s")) { + const firstArg = errorSpy.mock.calls[0][0]; + message = consoleFormat(firstArg, ...errorSpy.mock.calls[0].slice(1)); } else { - message = errorSpy.firstCall.args.join(" "); + message = errorSpy.mock.calls[0].join(" "); } if (messagesToIgnore.every(re => re.test(message) === false)) { diff --git a/packages/react/utils/test/browser/index.test.tsx b/packages/react/utils/test/browser/index.test.tsx index c110db8da..e0488167b 100644 --- a/packages/react/utils/test/browser/index.test.tsx +++ b/packages/react/utils/test/browser/index.test.tsx @@ -7,6 +7,7 @@ import { } from "../../../test/shared/utils"; import { computed, signal } from "@preact/signals-react"; import { createElement } from "react"; +import { describe, beforeEach, afterEach, it, expect } from "vitest"; describe("@preact/signals-react-utils", () => { let scratch: HTMLDivElement; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 529b16555..6c4b7d83c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,73 +18,67 @@ importers: devDependencies: '@babel/core': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@babel/plugin-syntax-jsx': specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.4) + version: 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-explicit-resource-management': specifier: ^7.28.0 - version: 7.28.0(@babel/core@7.28.4) + version: 7.28.0(@babel/core@7.28.5) '@babel/plugin-transform-modules-commonjs': specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.4) + version: 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx': specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.4) + version: 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': specifier: ^7.28.0 - version: 7.28.0(@babel/core@7.28.4) + version: 7.28.5(@babel/core@7.28.5) '@babel/preset-env': specifier: ^7.28.3 - version: 7.28.3(@babel/core@7.28.4) + version: 7.28.5(@babel/core@7.28.5) '@babel/preset-react': specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.4) + version: 7.27.1(@babel/core@7.28.5) '@babel/preset-typescript': specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.4) + version: 7.27.1(@babel/core@7.28.5) '@babel/register': specifier: ^7.28.3 - version: 7.28.3(@babel/core@7.28.4) + version: 7.28.3(@babel/core@7.28.5) '@babel/standalone': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@changesets/changelog-github': specifier: ^0.5.0 version: 0.5.0 '@changesets/cli': specifier: ^2.27.1 version: 2.27.1 + '@preact/signals-react-transform': + specifier: workspace:* + version: link:packages/react-transform '@types/babel__traverse': - specifier: ^7.28.0 + specifier: ^7.18.5 version: 7.28.0 - '@types/chai': - specifier: ^4.3.3 - version: 4.3.3 - '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 '@types/node': specifier: ^18.19.103 version: 18.19.103 - '@types/sinon': - specifier: ^10.0.13 - version: 10.0.13 - '@types/sinon-chai': - specifier: ^3.2.8 - version: 3.2.8 + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.53.1)(vite@6.3.5(@types/node@18.19.103))(vitest@3.2.4) + '@vitest/coverage-v8': + specifier: ^3.2.4 + version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) babel-plugin-istanbul: specifier: ^6.1.1 version: 6.1.1 babel-plugin-transform-rename-properties: specifier: ^0.1.0 - version: 0.1.0(@babel/core@7.28.4) + version: 0.1.0(@babel/core@7.28.5) buffer: specifier: ^6.0.3 version: 6.0.3 - chai: - specifier: ^4.3.6 - version: 4.3.6 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -97,30 +91,6 @@ importers: husky: specifier: ^8.0.1 version: 8.0.1 - karma: - specifier: 6.4.2 - version: 6.4.2 - karma-chai-sinon: - specifier: ^0.1.5 - version: 0.1.5(chai@4.3.6)(karma@6.4.2)(sinon-chai@3.7.0(chai@4.3.6)(sinon@14.0.0))(sinon@14.0.0) - karma-chrome-launcher: - specifier: ^3.1.1 - version: 3.1.1 - karma-coverage: - specifier: ^2.2.0 - version: 2.2.0 - karma-esbuild: - specifier: ^2.2.5 - version: 2.2.5(esbuild@0.14.54) - karma-mocha: - specifier: ^2.0.1 - version: 2.0.1 - karma-mocha-reporter: - specifier: ^2.2.5 - version: 2.2.5(karma@6.4.2) - karma-sinon: - specifier: ^1.0.5 - version: 1.0.5(karma@6.4.2)(sinon@14.0.0) kolorist: specifier: ^1.5.1 version: 1.5.1 @@ -130,27 +100,27 @@ importers: microbundle: specifier: ^0.15.1 version: 0.15.1(patch_hash=191ddb4c75616fbd059c0f22ba3000be648ce78c33a2f5286f6d1ff43f9ea6b8)(@types/babel__core@7.20.5) - mocha: - specifier: ^10.0.0 - version: 10.0.0 oxlint: specifier: ^1.3.0 version: 1.3.0 + playwright: + specifier: ^1.53.1 + version: 1.53.1 prettier: specifier: ^3.6.2 version: 3.6.2 shx: specifier: ^0.3.4 version: 0.3.4 - sinon: - specifier: ^14.0.0 - version: 14.0.0 - sinon-chai: - specifier: ^3.7.0 - version: 3.7.0(chai@4.3.6)(sinon@14.0.0) typescript: specifier: ~5.8.3 version: 5.8.3 + vite: + specifier: ^6.3.5 + version: 6.3.5(@types/node@18.19.103) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@18.19.103)(@vitest/browser@3.2.4) docs: dependencies: @@ -168,13 +138,13 @@ importers: version: link:../packages/react preact: specifier: ^10.25.0 - version: 10.26.9 + version: 10.27.2 preact-iso: specifier: ^2.3.0 - version: 2.3.0(preact-render-to-string@6.5.13(preact@10.26.9))(preact@10.26.9) + version: 2.3.0(preact-render-to-string@6.6.3(preact@10.27.2))(preact@10.27.2) preact-render-to-string: specifier: ^6.0.0 - version: 6.5.13(preact@10.26.9) + version: 6.6.3(preact@10.27.2) react: specifier: ^18.2.0 version: 18.2.0 @@ -184,10 +154,10 @@ importers: devDependencies: '@babel/core': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@preact/preset-vite': specifier: ^2.3.0 - version: 2.3.0(@babel/core@7.28.4)(preact@10.26.9)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2)) + version: 2.3.0(@babel/core@7.28.5)(preact@10.27.2)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2)) '@types/react': specifier: ^18.0.18 version: 18.0.18 @@ -217,11 +187,11 @@ importers: version: link:../packages/core preact: specifier: ^10.26.9 - version: 10.26.9 + version: 10.27.2 devDependencies: '@preact/preset-vite': specifier: ^2.3.0 - version: 2.3.0(@babel/core@7.28.4)(preact@10.26.9)(vite@7.0.6(@types/node@18.19.103)) + version: 2.3.0(@babel/core@7.28.5)(preact@10.27.2)(vite@6.3.5(@types/node@18.19.103)) '@types/chrome': specifier: ^0.0.270 version: 0.0.270 @@ -229,8 +199,8 @@ importers: specifier: ^5.8.3 version: 5.8.3 vite: - specifier: ^7.0.0 - version: 7.0.6(@types/node@18.19.103) + specifier: ^6.3.5 + version: 6.3.5(@types/node@18.19.103) web-ext: specifier: ^7.0.0 version: 7.12.0 @@ -251,10 +221,10 @@ importers: devDependencies: preact: specifier: ^10.26.6 - version: 10.26.9 + version: 10.27.2 preact-render-to-string: specifier: ^5.2.5 - version: 5.2.6(preact@10.26.9) + version: 5.2.6(preact@10.27.2) packages/preact-transform: dependencies: @@ -270,7 +240,7 @@ importers: devDependencies: '@babel/core': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 @@ -299,6 +269,18 @@ importers: specifier: ^2.7.1 version: 2.7.1 + packages/preact/utils: + dependencies: + '@preact/signals': + specifier: workspace:* + version: link:.. + '@preact/signals-core': + specifier: workspace:^1.3.0 + version: link:../../core + preact: + specifier: '>= 10.25.0' + version: 10.27.2 + packages/react: dependencies: '@preact/signals-core': @@ -347,7 +329,10 @@ importers: devDependencies: '@babel/core': specifier: ^7.28.4 - version: 7.28.4 + version: 7.28.5 + '@preact/signals-core': + specifier: workspace:* + version: link:../core '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 @@ -394,30 +379,54 @@ importers: specifier: ^6.9.0 version: 6.10.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + packages/react/runtime: + dependencies: + '@preact/signals-core': + specifier: workspace:^1.3.0 + version: link:../../core + react: + specifier: ^16.14.0 || 17.x || 18.x + version: 18.2.0 + use-sync-external-store: + specifier: ^1.2.0 + version: 1.2.0(react@18.2.0) + devDependencies: + '@preact/signals-react': + specifier: workspace:* + version: link:.. + + packages/react/utils: + dependencies: + '@preact/signals-core': + specifier: workspace:^1.3.0 + version: link:../../core + '@preact/signals-react': + specifier: workspace:* + version: link:.. + react: + specifier: ^16.14.0 || 17.x || 18.x || 19.x + version: 18.2.0 + packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.7': - resolution: {integrity: sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.4': - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -428,14 +437,8 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-class-features-plugin@7.28.3': - resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -455,20 +458,14 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.3': resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} @@ -503,8 +500,8 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': @@ -519,18 +516,13 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.7': - resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -636,8 +628,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.4': - resolution: {integrity: sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==} + '@babel/plugin-transform-block-scoping@7.28.5': + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -666,8 +658,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.0': - resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -702,8 +694,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + '@babel/plugin-transform-exponentiation-operator@7.28.5': + resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -744,8 +736,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -768,8 +760,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -822,8 +814,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-optional-chaining@7.28.5': + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -876,12 +868,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.5': - resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.4': resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} @@ -930,8 +916,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.0': - resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -960,8 +946,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.3': - resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} + '@babel/preset-env@7.28.5': + resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1003,29 +989,25 @@ packages: resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} engines: {node: '>=6.9.0'} - '@babel/standalone@7.28.4': - resolution: {integrity: sha512-Qc1BNCfuJZBKs2SC5lqRmSYOw7Ka0X7urZQ7oVsGIax4eGDUIHX+CDg752N4jDxC2rbBh3li098ReGOtjT0x4g==} + '@babel/standalone@7.28.5': + resolution: {integrity: sha512-1DViPYJpRU50irpGMfLBQ9B4kyfQuL6X7SS7pwTeWeZX0mNkjzPi0XFqxCjSdddZXUQy4AhnQnnesA/ZHnvAdw==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.7': - resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.7': - resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} + '@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==} @@ -1085,10 +1067,6 @@ packages: '@changesets/write@0.3.0': resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - '@csstools/selector-specificity@2.0.2': resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} engines: {node: ^12 || ^14 || >=16} @@ -1109,14 +1087,14 @@ packages: engines: {node: '>= 0.10.4'} hasBin: true - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1127,56 +1105,56 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1193,104 +1171,98 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -1333,10 +1305,6 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -1344,21 +1312,11 @@ packages: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.2': resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} - '@jridgewell/sourcemap-codec@1.4.14': - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -1440,6 +1398,9 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@preact/preset-vite@2.3.0': resolution: {integrity: sha512-0kOuz7wdrQLqrPlyI/Ypw9IWDF2++GGcOHMRBYO5T2w2+dheelaBH+XrIN/okqdsGIflzFIFNyIGubo5BC8wbQ==} peerDependencies: @@ -1511,103 +1472,103 @@ packages: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.44.1': + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.44.1': + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.44.1': + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.44.1': + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.44.1': + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.44.1': + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.44.1': + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.44.1': + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.44.1': + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.44.1': + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.44.1': + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.44.1': + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.44.1': + resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.44.1': + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-win32-arm64-msvc@4.44.1': + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.44.1': + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-msvc@4.44.1': + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} cpu: [x64] os: [win32] @@ -1615,21 +1576,6 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@sinonjs/commons@1.8.3': - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} - - '@sinonjs/fake-timers@9.1.2': - resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - - '@sinonjs/samsam@6.1.1': - resolution: {integrity: sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==} - - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - - '@socket.io/component-emitter@3.1.0': - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} @@ -1637,10 +1583,23 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1659,21 +1618,18 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/chai@4.3.3': - resolution: {integrity: sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} '@types/chrome@0.0.270': resolution: {integrity: sha512-ADvkowV7YnJfycZZxL2brluZ6STGW+9oKG37B422UePf2PCXuFA/XdERI0T18wtuWPx0tmFeZqq6MOXVk1IC+Q==} - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - - '@types/cors@2.8.12': - resolution: {integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -1698,9 +1654,6 @@ packages: '@types/minimist@1.2.2': resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -1737,35 +1690,72 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/sinon-chai@3.2.8': - resolution: {integrity: sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g==} - - '@types/sinon@10.0.13': - resolution: {integrity: sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==} - - '@types/sinonjs__fake-timers@8.1.2': - resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} - '@types/use-sync-external-store@0.0.3': resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitest/browser@3.2.4': + resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==} + peerDependencies: + playwright: '*' + safaridriver: '*' + vitest: 3.2.4 + webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + peerDependencies: + '@vitest/browser': 3.2.4 + vitest: 3.2.4 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1814,10 +1804,6 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1830,10 +1816,6 @@ packages: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1854,6 +1836,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.1.0: resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} engines: {node: '>=12'} @@ -1861,16 +1847,15 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + array-differ@4.0.0: resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1901,8 +1886,12 @@ packages: assert@2.0.0: resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} - 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@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} @@ -1985,10 +1974,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -1996,17 +1981,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - body-parser@1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2031,9 +2008,6 @@ packages: resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} engines: {node: '>= 10.16.0'} - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.25.1: resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2060,9 +2034,9 @@ packages: engines: {'0': node >=0.10.0} hasBin: true - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} @@ -2072,9 +2046,17 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2104,9 +2086,9 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@4.3.6: - resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==} - engines: {node: '>=4'} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} @@ -2127,8 +2109,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -2137,10 +2120,6 @@ packages: resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} engines: {node: '>= 6'} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - chrome-launcher@0.15.1: resolution: {integrity: sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==} engines: {node: '>=12.13.0'} @@ -2165,9 +2144,6 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2250,21 +2226,9 @@ packages: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} - connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - - content-type@1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - core-js-compat@3.43.0: resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} @@ -2277,10 +2241,6 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - cosmiconfig@7.0.1: resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} @@ -2364,9 +2324,6 @@ packages: resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} engines: {node: '>= 0.1.90'} - custom-event@1.0.1: - resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} - dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -2378,10 +2335,6 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - date-format@4.0.13: - resolution: {integrity: sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ==} - engines: {node: '>=4.0'} - debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} @@ -2419,10 +2372,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - decamelize@6.0.0: resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2431,9 +2380,9 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@3.0.1: - resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} - engines: {node: '>=0.12'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} @@ -2444,6 +2393,7 @@ packages: deepcopy@2.1.0: resolution: {integrity: sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==} + deprecated: No longer maintained. Use structuredClone instead. deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} @@ -2468,29 +2418,14 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - di@0.0.1: - resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2499,8 +2434,8 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-serialize@2.2.1: - resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -2537,6 +2472,10 @@ packages: resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} engines: {node: '>=0.10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer@0.1.1: resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} @@ -2552,9 +2491,6 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.8: resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} engines: {node: '>=0.10.0'} @@ -2569,28 +2505,13 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} - engines: {node: '>=10.2.0'} - enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} - ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} - entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -2612,6 +2533,21 @@ packages: resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} engines: {node: '>= 0.4'} + 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-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} @@ -2879,8 +2815,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -2892,9 +2828,6 @@ packages: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2960,6 +2893,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2986,6 +2922,10 @@ packages: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -3026,8 +2966,9 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3057,10 +2998,6 @@ packages: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} - finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -3096,22 +3033,9 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - follow-redirects@1.15.1: - resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -3160,6 +3084,11 @@ packages: 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} @@ -3190,16 +3119,18 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - 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.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -3231,14 +3162,14 @@ packages: engines: {node: '>=16 || 14 >=14.18'} hasBin: true + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} deprecated: Glob versions prior to v9 are no longer supported - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3247,10 +3178,6 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -3265,8 +3192,9 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} @@ -3326,12 +3254,8 @@ packages: has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.0: @@ -3350,10 +3274,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -3366,14 +3286,6 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -3493,10 +3405,6 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -3560,8 +3468,8 @@ packages: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - is-npm@6.0.0: - resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} is-number-object@1.0.7: @@ -3584,10 +3492,6 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -3633,10 +3537,6 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} @@ -3655,16 +3555,9 @@ packages: resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} engines: {node: '>=12'} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - isexe@1.1.2: resolution: {integrity: sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw==} @@ -3678,24 +3571,24 @@ packages: isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} istanbul-lib-instrument@5.2.0: resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} - istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} jackspeak@3.4.3: @@ -3719,6 +3612,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3786,56 +3682,12 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - just-extend@4.2.1: - resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} - jwa@1.4.2: resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - karma-chai-sinon@0.1.5: - resolution: {integrity: sha512-J/ecbp1h3Qr6cr+XgK1Q5LOf/JlqO44hbvILcdM8Md4jxnXClhA2jzOExhKaSezziNu1ue40Q6e1OC07epqVmA==} - engines: {node: '>=0.8'} - peerDependencies: - chai: '*' - karma: '>=0.6' - sinon: '*' - sinon-chai: '*' - - karma-chrome-launcher@3.1.1: - resolution: {integrity: sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==} - - karma-coverage@2.2.0: - resolution: {integrity: sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==} - engines: {node: '>=10.0.0'} - - karma-esbuild@2.2.5: - resolution: {integrity: sha512-+NiRmZhUm/MqOsL1cAu8+RmiOMvIxWDaeYDLBB5upxHF9Hh3Og8YH43EAmDan40pxt2FKDcOjupgqIe4Tx2szQ==} - peerDependencies: - esbuild: '>=0.8.45' - - karma-mocha-reporter@2.2.5: - resolution: {integrity: sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==} - peerDependencies: - karma: '>=0.13' - - karma-mocha@2.0.1: - resolution: {integrity: sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==} - - karma-sinon@1.0.5: - resolution: {integrity: sha512-wrkyAxJmJbn75Dqy17L/8aILJWFm7znd1CE8gkyxTBFnjMSOe2XTJ3P30T8SkxWZHmoHX0SCaUJTDBEoXs25Og==} - engines: {node: '>= 0.10.0'} - peerDependencies: - karma: '>=0.10' - sinon: '*' - - karma@6.4.2: - resolution: {integrity: sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==} - engines: {node: '>= 10'} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3919,10 +3771,6 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -3938,29 +3786,16 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - log4js@6.6.1: - resolution: {integrity: sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==} - engines: {node: '>=8.0'} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.4: - resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} - deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} @@ -3975,9 +3810,19 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -3986,6 +3831,10 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -4004,6 +3853,10 @@ packages: marky@1.3.0: resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + maxmin@2.1.0: resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} engines: {node: '>=0.12'} @@ -4011,10 +3864,6 @@ packages: mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - mem@5.1.1: resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} engines: {node: '>=8'} @@ -4046,11 +3895,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4074,12 +3918,8 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - - minimatch@5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} minimatch@9.0.5: @@ -4110,11 +3950,6 @@ packages: engines: {node: '>=10'} hasBin: true - mocha@10.0.0: - resolution: {integrity: sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==} - engines: {node: '>= 14.0.0'} - hasBin: true - moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -4122,6 +3957,10 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -4150,11 +3989,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4162,13 +3996,6 @@ packages: resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - nise@5.1.1: - resolution: {integrity: sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==} - node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -4200,10 +4027,6 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} @@ -4212,8 +4035,8 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - normalize-url@8.0.2: - resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} npm-run-path@4.0.1: @@ -4238,8 +4061,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} @@ -4257,14 +4081,6 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} - on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -4360,6 +4176,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@8.1.1: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} @@ -4385,10 +4204,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -4416,9 +4231,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4426,8 +4238,12 @@ packages: path@0.12.7: resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -4481,6 +4297,16 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + playwright-core@1.53.1: + resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.53.1: + resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} + engines: {node: '>=18'} + hasBin: true + postcss-calc@8.2.4: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: @@ -4711,13 +4537,13 @@ packages: peerDependencies: preact: '>=10' - preact-render-to-string@6.5.13: - resolution: {integrity: sha512-iGPd+hKPMFKsfpR2vL4kJ6ZPcFIoWZEcBf0Dpm3zOpdVvj77aY8RlLiQji5OMrngEyaxGogeakTb54uS2FvA6w==} + preact-render-to-string@6.6.3: + resolution: {integrity: sha512-7oHG7jzjriqsFPkSPiPnzrQ0GcxFm6wOkYWNdStK5Ks9YlWSQQXKGBRAX4nKDdqX7HAQuRvI4pZNZMycK4WwDw==} peerDependencies: - preact: '>=10' + preact: '>=10 || >= 11.0.0-0' - preact@10.26.9: - resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} preferred-pm@3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} @@ -4745,6 +4571,10 @@ packages: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} @@ -4782,18 +4612,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} engines: {node: '>=12.20'} - qjobs@1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} - - qs@6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -4818,14 +4640,6 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -4835,6 +4649,9 @@ packages: peerDependencies: react: ^18.2.0 + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-router-dom@6.10.0: resolution: {integrity: sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==} engines: {node: '>=14'} @@ -4871,10 +4688,6 @@ packages: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -4944,9 +4757,6 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -5024,8 +4834,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5081,18 +4891,12 @@ packages: serialize-javascript@4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true @@ -5133,8 +4937,24 @@ packages: engines: {node: '>=6'} hasBin: true - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} sign-addon@5.3.0: resolution: {integrity: sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==} @@ -5147,15 +4967,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sinon-chai@3.7.0: - resolution: {integrity: sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==} - peerDependencies: - chai: ^4.0.0 - sinon: '>=4.0.0' - - sinon@14.0.0: - resolution: {integrity: sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==} - deprecated: 16.1.1 + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -5170,17 +4984,6 @@ packages: engines: {node: '>=6'} hasBin: true - socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} - - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - - socket.io@4.7.2: - resolution: {integrity: sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==} - engines: {node: '>=10.2.0'} - sonic-boom@3.8.1: resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} @@ -5240,13 +5043,11 @@ packages: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} stream-to-array@2.3.0: resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} @@ -5258,10 +5059,6 @@ packages: stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - streamroller@3.1.2: - resolution: {integrity: sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==} - engines: {node: '>=8.0'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5296,10 +5093,6 @@ packages: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5348,6 +5141,9 @@ packages: resolution: {integrity: sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==} engines: {node: '>=14.16'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + style-inject@0.3.0: resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} @@ -5369,10 +5165,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - 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'} @@ -5395,6 +5187,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5414,10 +5210,28 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + engines: {node: '>=14.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5430,14 +5244,14 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - tosource@1.0.0: resolution: {integrity: sha512-N6g8eQ1eerw6Y1pBhdgkubWIiPFwXa2POSUrlL8jth5CyyEWNWzoGKRkO3CaO7Jx27hlJP54muB3btIAbx4MPg==} engines: {node: '>=0.4.0'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -5467,8 +5281,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} type-fest@0.13.1: @@ -5495,10 +5309,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -5515,9 +5325,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ua-parser-js@0.7.37: - resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} - unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -5556,10 +5363,6 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - upath@2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -5591,10 +5394,6 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -5607,14 +5406,15 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite@3.2.7: resolution: {integrity: sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5640,19 +5440,19 @@ packages: terser: optional: true - vite@7.0.6: - resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} - engines: {node: ^20.19.0 || >=22.12.0} + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: '>=1.21.0' - less: ^4.0.0 + less: '*' lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -5680,9 +5480,33 @@ packages: yaml: optional: true - void-elements@2.0.1: - resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} - engines: {node: '>=0.10.0'} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} @@ -5736,6 +5560,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} @@ -5747,9 +5576,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -5768,20 +5594,20 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -5829,30 +5655,14 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} @@ -5873,27 +5683,30 @@ packages: snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.7': {} + '@babel/compat-data@7.28.5': {} - '@babel/compat-data@7.28.4': {} - - '@babel/core@7.28.4': + '@babel/core@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.1 @@ -5903,70 +5716,49 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.27.5': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/generator@7.28.3': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.5 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.7 + '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.4)': + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.4)': + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.1 @@ -5977,679 +5769,661 @@ snapshots: '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.4)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} '@babel/helper-wrap-function@7.27.1': dependencies: '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - - '@babel/parser@7.27.7': - dependencies: - '@babel/types': 7.27.7 + '@babel/types': 7.28.5 - '@babel/parser@7.28.4': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.28.4)': + '@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 - '@babel/plugin-syntax-flow@7.18.6(@babel/core@7.28.4)': + '@babel/plugin-syntax-flow@7.18.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.28.4)': + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-flow-strip-types@7.18.9(@babel/core@7.28.4)': + '@babel/plugin-transform-flow-strip-types@7.18.9(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.28.4) + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)': + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.4)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/types': 7.27.7 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.4)': + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 - '@babel/preset-env@7.28.3(@babel/core@7.28.4)': + '@babel/preset-env@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/compat-data': 7.28.4 - '@babel/core': 7.28.4 + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.4) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.4) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.4) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.4) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.4) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.4) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) core-js-compat: 3.43.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.18.6(@babel/core@7.28.4)': + '@babel/preset-flow@7.18.6(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.18.9(@babel/core@7.28.4) + '@babel/plugin-transform-flow-strip-types': 7.18.9(@babel/core@7.28.5) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.4)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 esutils: 2.0.3 - '@babel/preset-react@7.27.1(@babel/core@7.28.4)': + '@babel/preset-react@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/register@7.28.3(@babel/core@7.28.4)': + '@babel/register@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -6664,47 +6438,32 @@ snapshots: dependencies: regenerator-runtime: 0.14.0 - '@babel/standalone@7.28.4': {} + '@babel/standalone@7.28.5': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.7 - '@babel/types': 7.27.7 - - '@babel/traverse@7.27.7': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.7 - '@babel/template': 7.27.2 - '@babel/types': 7.27.7 - debug: 4.4.1 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.28.4': + '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.27.7': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@1.0.2': {} '@changesets/apply-release-plan@7.0.0': dependencies: @@ -6869,8 +6628,6 @@ snapshots: human-id: 1.0.2 prettier: 2.7.1 - '@colors/colors@1.5.0': {} - '@csstools/selector-specificity@2.0.2(postcss-selector-parser@6.0.10)(postcss@8.5.6)': dependencies: postcss: 8.5.6 @@ -6886,46 +6643,46 @@ snapshots: '@devicefarmer/adbkit-monkey': 1.2.1 bluebird: 3.7.2 commander: 9.5.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 node-forge: 1.3.1 split: 1.0.1 transitivePeerDependencies: - supports-color - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.5': optional: true '@esbuild/android-arm@0.15.18': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.5': optional: true '@esbuild/linux-loong64@0.14.54': @@ -6934,57 +6691,54 @@ snapshots: '@esbuild/linux-loong64@0.15.18': optional: true - '@esbuild/linux-loong64@0.25.8': - optional: true - - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} '@eslint/eslintrc@2.1.4': dependencies: @@ -7037,15 +6791,9 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -7053,26 +6801,17 @@ snapshots: '@jridgewell/resolve-uri@3.1.0': {} - '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.2': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.4.14': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/sourcemap-codec': 1.5.0 '@manypkg/find-root@1.1.0': dependencies: @@ -7143,14 +6882,16 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@preact/preset-vite@2.3.0(@babel/core@7.28.4)(preact@10.26.9)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2))': + '@polka/url@1.0.0-next.29': {} + + '@preact/preset-vite@2.3.0(@babel/core@7.28.5)(preact@10.27.2)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.4) - '@prefresh/vite': 2.2.8(preact@10.26.9)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2)) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@prefresh/vite': 2.2.8(preact@10.27.2)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2)) '@rollup/pluginutils': 4.2.1 - babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.4) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5) debug: 4.4.1 kolorist: 1.5.1 resolve: 1.22.10 @@ -7159,51 +6900,51 @@ snapshots: - preact - supports-color - '@preact/preset-vite@2.3.0(@babel/core@7.28.4)(preact@10.26.9)(vite@7.0.6(@types/node@18.19.103))': + '@preact/preset-vite@2.3.0(@babel/core@7.28.5)(preact@10.27.2)(vite@6.3.5(@types/node@18.19.103))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.4) - '@prefresh/vite': 2.2.8(preact@10.26.9)(vite@7.0.6(@types/node@18.19.103)) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@prefresh/vite': 2.2.8(preact@10.27.2)(vite@6.3.5(@types/node@18.19.103)) '@rollup/pluginutils': 4.2.1 - babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.4) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.5) debug: 4.4.1 kolorist: 1.5.1 resolve: 1.22.10 - vite: 7.0.6(@types/node@18.19.103) + vite: 6.3.5(@types/node@18.19.103) transitivePeerDependencies: - preact - supports-color '@prefresh/babel-plugin@0.4.3': {} - '@prefresh/core@1.3.4(preact@10.26.9)': + '@prefresh/core@1.3.4(preact@10.27.2)': dependencies: - preact: 10.26.9 + preact: 10.27.2 '@prefresh/utils@1.1.3': {} - '@prefresh/vite@2.2.8(preact@10.26.9)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2))': + '@prefresh/vite@2.2.8(preact@10.27.2)(vite@3.2.7(@types/node@18.19.103)(terser@5.14.2))': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@prefresh/babel-plugin': 0.4.3 - '@prefresh/core': 1.3.4(preact@10.26.9) + '@prefresh/core': 1.3.4(preact@10.27.2) '@prefresh/utils': 1.1.3 '@rollup/pluginutils': 4.2.1 - preact: 10.26.9 + preact: 10.27.2 vite: 3.2.7(@types/node@18.19.103)(terser@5.14.2) transitivePeerDependencies: - supports-color - '@prefresh/vite@2.2.8(preact@10.26.9)(vite@7.0.6(@types/node@18.19.103))': + '@prefresh/vite@2.2.8(preact@10.27.2)(vite@6.3.5(@types/node@18.19.103))': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@prefresh/babel-plugin': 0.4.3 - '@prefresh/core': 1.3.4(preact@10.26.9) + '@prefresh/core': 1.3.4(preact@10.27.2) '@prefresh/utils': 1.1.3 '@rollup/pluginutils': 4.2.1 - preact: 10.26.9 - vite: 7.0.6(@types/node@18.19.103) + preact: 10.27.2 + vite: 6.3.5(@types/node@18.19.103) transitivePeerDependencies: - supports-color @@ -7214,9 +6955,9 @@ snapshots: rollup: 2.79.1 slash: 3.0.0 - '@rollup/plugin-babel@5.3.1(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@2.79.1)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.5)(@types/babel__core@7.20.5)(rollup@2.79.1)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -7263,86 +7004,68 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-android-arm-eabi@4.44.1': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-darwin-x64@4.44.1': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.44.1': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.44.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.44.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.44.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-linux-x64-musl@4.44.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.44.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.44.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true '@sindresorhus/is@5.6.0': {} - '@sinonjs/commons@1.8.3': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@9.1.2': - dependencies: - '@sinonjs/commons': 1.8.3 - - '@sinonjs/samsam@6.1.1': - dependencies: - '@sinonjs/commons': 1.8.3 - lodash.get: 4.4.2 - type-detect: 4.0.8 - - '@sinonjs/text-encoding@0.7.2': {} - - '@socket.io/component-emitter@3.1.0': {} - '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.8 @@ -7354,19 +7077,36 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@testing-library/dom@10.4.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.23.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': + dependencies: + '@testing-library/dom': 10.4.0 + '@trysound/sax@0.2.0': {} + '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.6.4': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/babel__helper-module-imports@7.18.3': dependencies: @@ -7379,28 +7119,28 @@ snapshots: '@types/babel__template@7.4.1': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 - '@types/chai@4.3.3': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 '@types/chrome@0.0.270': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 - '@types/cookie@0.4.1': {} - - '@types/cors@2.8.12': {} - '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} + '@types/estree@0.0.39': {} '@types/estree@1.0.8': {} @@ -7419,8 +7159,6 @@ snapshots: '@types/minimist@1.2.2': {} - '@types/mocha@9.1.1': {} - '@types/ms@0.7.34': {} '@types/node@12.20.55': {} @@ -7455,35 +7193,99 @@ snapshots: '@types/semver@7.5.8': {} - '@types/sinon-chai@3.2.8': + '@types/use-sync-external-store@0.0.3': {} + + '@types/yauzl@2.10.3': dependencies: - '@types/chai': 4.3.3 - '@types/sinon': 10.0.13 + '@types/node': 18.19.103 + + '@ungap/structured-clone@1.3.0': {} + + '@vitest/browser@3.2.4(playwright@1.53.1)(vite@6.3.5(@types/node@18.19.103))(vitest@3.2.4)': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@18.19.103)) + '@vitest/utils': 3.2.4 + magic-string: 0.30.17 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@18.19.103)(@vitest/browser@3.2.4) + ws: 8.18.3 + optionalDependencies: + playwright: 1.53.1 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite - '@types/sinon@10.0.13': + '@vitest/coverage-v8@3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4)': dependencies: - '@types/sinonjs__fake-timers': 8.1.2 + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@18.19.103)(@vitest/browser@3.2.4) + optionalDependencies: + '@vitest/browser': 3.2.4(playwright@1.53.1)(vite@6.3.5(@types/node@18.19.103))(vitest@3.2.4) + transitivePeerDependencies: + - supports-color - '@types/sinonjs__fake-timers@8.1.2': {} + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + tinyrainbow: 2.0.0 - '@types/use-sync-external-store@0.0.3': {} + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@18.19.103))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.3.5(@types/node@18.19.103) - '@types/yauzl@2.10.3': + '@vitest/pretty-format@3.2.4': dependencies: - '@types/node': 18.19.103 + tinyrainbow: 2.0.0 - '@ungap/promise-all-settled@1.1.2': {} + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 - '@ungap/structured-clone@1.3.0': {} + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.17 + pathe: 2.0.3 - abort-controller@3.0.0: + '@vitest/spy@3.2.4': dependencies: - event-target-shim: 5.0.1 + tinyspy: 4.0.3 - accepts@1.3.8: + '@vitest/utils@3.2.4': dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 + tinyrainbow: 2.0.0 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -7564,8 +7366,6 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-colors@4.1.1: {} - ansi-colors@4.1.3: {} ansi-escapes@5.0.0: @@ -7574,8 +7374,6 @@ snapshots: ansi-regex@2.1.1: {} - ansi-regex@3.0.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -7590,21 +7388,22 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.1.0: {} any-promise@1.3.0: {} - anymatch@3.1.2: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 argparse@2.0.1: {} + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + array-differ@4.0.0: {} array-union@2.1.0: {} @@ -7633,7 +7432,13 @@ snapshots: object-is: 1.1.5 util: 0.12.5 - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 async@3.2.4: {} @@ -7677,51 +7482,49 @@ snapshots: cosmiconfig: 7.0.1 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.4): + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: - '@babel/compat-data': 7.28.4 - '@babel/core': 7.28.4 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.4): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.4 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) core-js-compat: 3.43.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.4): + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.4 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color babel-plugin-transform-async-to-promises@0.8.18: {} - babel-plugin-transform-hook-names@1.0.2(@babel/core@7.28.4): + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 - babel-plugin-transform-rename-properties@0.1.0(@babel/core@7.28.4): + babel-plugin-transform-rename-properties@0.1.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 - babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.28.4): + babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 balanced-match@1.0.2: {} base64-js@1.5.1: {} - base64id@2.0.0: {} - bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -7730,27 +7533,8 @@ snapshots: dependencies: is-windows: 1.0.2 - binary-extensions@2.2.0: {} - bluebird@3.7.2: {} - body-parser@1.20.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.10.3 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - boolbase@1.0.0: {} boxen@7.1.1: @@ -7785,8 +7569,6 @@ snapshots: dependencies: duplexer: 0.1.1 - browser-stdout@1.3.1: {} - browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001726 @@ -7814,7 +7596,7 @@ snapshots: mv: 2.1.1 safe-json-stringify: 1.2.0 - bytes@3.1.2: {} + cac@6.7.14: {} cacheable-lookup@7.0.0: {} @@ -7825,13 +7607,23 @@ snapshots: http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.0.2 + normalize-url: 8.1.0 responselike: 3.0.0 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.2: dependencies: function-bind: 1.1.2 - get-intrinsic: 1.2.1 + get-intrinsic: 1.3.0 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} @@ -7858,15 +7650,13 @@ snapshots: caseless@0.12.0: {} - chai@4.3.6: + chai@5.2.0: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 3.0.1 - get-func-name: 2.0.2 - loupe: 2.3.4 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.4 + pathval: 2.0.1 chalk@1.1.3: dependencies: @@ -7891,7 +7681,7 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.2: {} + check-error@2.1.1: {} cheerio-select@2.1.0: dependencies: @@ -7912,19 +7702,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 - chokidar@3.5.3: - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chrome-launcher@0.15.1: + chrome-launcher@0.15.1: dependencies: '@types/node': 18.19.103 escape-string-regexp: 4.0.0 @@ -7952,12 +7730,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -8039,21 +7811,8 @@ snapshots: write-file-atomic: 3.0.3 xdg-basedir: 5.1.0 - connect@3.7.0: - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - - content-type@1.0.4: {} - convert-source-map@2.0.0: {} - cookie@0.4.2: {} - core-js-compat@3.43.0: dependencies: browserslist: 4.25.1 @@ -8064,11 +7823,6 @@ snapshots: core-util-is@1.0.3: {} - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cosmiconfig@7.0.1: dependencies: '@types/parse-json': 4.0.0 @@ -8189,8 +7943,6 @@ snapshots: csv-stringify: 5.6.5 stream-transform: 2.1.3 - custom-event@1.0.1: {} - dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -8199,19 +7951,15 @@ snapshots: dataloader@1.4.0: {} - date-format@4.0.13: {} - debounce@1.2.1: {} debug@2.6.9: dependencies: ms: 2.0.0 - debug@4.3.4(supports-color@8.1.1): + debug@4.3.4: dependencies: ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 debug@4.4.1: dependencies: @@ -8224,17 +7972,13 @@ snapshots: decamelize@1.2.0: {} - decamelize@4.0.0: {} - decamelize@6.0.0: {} decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-eql@3.0.1: - dependencies: - type-detect: 4.0.8 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -8242,7 +7986,7 @@ snapshots: deepcopy@2.1.0: dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 deepmerge@4.3.1: {} @@ -8261,18 +8005,10 @@ snapshots: delayed-stream@1.0.0: {} - depd@2.0.0: {} - - destroy@1.2.0: {} + dequal@2.0.3: {} detect-indent@6.1.0: {} - di@0.0.1: {} - - diff@5.0.0: {} - - diff@5.1.0: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -8281,12 +8017,7 @@ snapshots: dependencies: esutils: 2.0.3 - dom-serialize@2.2.1: - dependencies: - custom-event: 1.0.1 - ent: 2.2.0 - extend: 3.0.2 - void-elements: 2.0.1 + dom-accessibility-api@0.5.16: {} dom-serializer@1.4.1: dependencies: @@ -8333,6 +8064,12 @@ snapshots: nan: 2.23.0 optional: true + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer@0.1.1: {} duplexer@0.1.2: {} @@ -8348,8 +8085,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - ee-first@1.1.1: {} - ejs@3.1.8: dependencies: jake: 10.8.5 @@ -8360,37 +8095,14 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} - end-of-stream@1.4.5: dependencies: once: 1.4.0 - engine.io-parser@5.2.1: {} - - engine.io@6.5.4: - dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.12 - '@types/node': 18.19.103 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) - engine.io-parser: 5.2.1 - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - ent@2.2.0: {} - entities@2.2.0: {} entities@4.5.0: {} @@ -8409,11 +8121,11 @@ snapshots: es-to-primitive: 1.2.1 function-bind: 1.1.2 function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 + get-intrinsic: 1.3.0 get-symbol-description: 1.0.0 has: 1.0.3 has-property-descriptors: 1.0.0 - has-symbols: 1.0.3 + has-symbols: 1.1.0 internal-slot: 1.0.3 is-callable: 1.2.4 is-negative-zero: 2.0.2 @@ -8421,7 +8133,7 @@ snapshots: is-shared-array-buffer: 1.0.2 is-string: 1.0.7 is-weakref: 1.0.2 - object-inspect: 1.12.2 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.3 regexp.prototype.flags: 1.4.3 @@ -8429,6 +8141,16 @@ snapshots: string.prototype.trimstart: 1.0.5 unbox-primitive: 1.0.2 + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 @@ -8614,41 +8336,38 @@ snapshots: esbuild-windows-64: 0.15.18 esbuild-windows-arm64: 0.15.18 - esbuild@0.25.8: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} escape-goat@4.0.0: {} - escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -8668,8 +8387,8 @@ snapshots: eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -8739,6 +8458,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} event-target-shim@5.0.1: {} @@ -8773,6 +8496,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 3.0.0 + expect-type@1.2.1: {} + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -8811,7 +8536,7 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.6(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -8831,7 +8556,7 @@ snapshots: filelist@1.0.4: dependencies: - minimatch: 5.1.0 + minimatch: 5.1.6 filesize@6.4.0: {} @@ -8839,18 +8564,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.1.2: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 @@ -8898,12 +8611,8 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 - flat@5.0.2: {} - flatted@3.3.3: {} - follow-redirects@1.15.1: {} - for-each@0.3.3: dependencies: is-callable: 1.2.4 @@ -8962,6 +8671,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -8993,17 +8705,26 @@ snapshots: get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - - get-intrinsic@1.2.1: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 get-package-type@0.1.0: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@5.2.0: dependencies: pump: 3.0.3 @@ -9013,7 +8734,7 @@ snapshots: get-symbol-description@1.0.0: dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.1 + get-intrinsic: 1.3.0 getpass@0.1.7: dependencies: @@ -9037,23 +8758,23 @@ snapshots: minipass: 7.1.2 path-scurry: 1.11.1 - glob@6.0.4: + glob@10.4.5: dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - optional: true + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 - glob@7.2.0: + glob@6.0.4: 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 + optional: true glob@7.2.3: dependencies: @@ -9068,8 +8789,6 @@ snapshots: dependencies: ini: 2.0.0 - globals@11.12.0: {} - globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -9087,9 +8806,7 @@ snapshots: globrex@0.1.2: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.1 + gopd@1.2.0: {} got@12.6.1: dependencies: @@ -9144,15 +8861,13 @@ snapshots: has-property-descriptors@1.0.0: dependencies: - get-intrinsic: 1.2.1 - - has-proto@1.0.1: {} + get-intrinsic: 1.3.0 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.0: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-yarn@3.0.0: {} @@ -9164,8 +8879,6 @@ snapshots: dependencies: function-bind: 1.1.2 - he@1.2.0: {} - hosted-git-info@2.8.9: {} html-escaper@2.0.2: {} @@ -9179,22 +8892,6 @@ snapshots: http-cache-semantics@4.2.0: {} - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-proxy@1.18.1: - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.1 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - http-signature@1.2.0: dependencies: assert-plus: 1.0.0 @@ -9268,9 +8965,9 @@ snapshots: internal-slot@1.0.3: dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.3.0 has: 1.0.3 - side-channel: 1.0.4 + side-channel: 1.1.0 interpret@1.4.0: {} @@ -9291,10 +8988,6 @@ snapshots: dependencies: has-bigints: 1.0.2 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - is-boolean-object@1.1.2: dependencies: call-bind: 1.0.2 @@ -9346,7 +9039,7 @@ snapshots: is-negative-zero@2.0.2: {} - is-npm@6.0.0: {} + is-npm@6.1.0: {} is-number-object@1.0.7: dependencies: @@ -9360,8 +9053,6 @@ snapshots: is-plain-obj@1.1.0: {} - is-plain-obj@2.1.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -9395,20 +9086,18 @@ snapshots: is-symbol@1.0.4: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 is-typed-array@1.1.10: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.0 is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} - is-utf8@0.2.1: {} is-weakref@1.0.2: @@ -9423,12 +9112,8 @@ snapshots: is-yarn-global@0.4.1: {} - isarray@0.0.1: {} - isarray@1.0.0: {} - isbinaryfile@4.0.10: {} - isexe@1.1.2: {} isexe@2.0.0: {} @@ -9437,36 +9122,36 @@ snapshots: isstream@0.1.2: {} - istanbul-lib-coverage@3.2.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.0: dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.27.7 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - istanbul-lib-report@3.0.0: + istanbul-lib-report@3.0.1: dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@5.0.6: dependencies: + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.1 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 + istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.5: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 jackspeak@3.4.3: dependencies: @@ -9493,6 +9178,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -9559,8 +9246,6 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - just-extend@4.2.1: {} - jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 @@ -9572,82 +9257,6 @@ snapshots: jwa: 1.4.2 safe-buffer: 5.2.1 - karma-chai-sinon@0.1.5(chai@4.3.6)(karma@6.4.2)(sinon-chai@3.7.0(chai@4.3.6)(sinon@14.0.0))(sinon@14.0.0): - dependencies: - chai: 4.3.6 - karma: 6.4.2 - sinon: 14.0.0 - sinon-chai: 3.7.0(chai@4.3.6)(sinon@14.0.0) - - karma-chrome-launcher@3.1.1: - dependencies: - which: 1.3.1 - - karma-coverage@2.2.0: - dependencies: - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - karma-esbuild@2.2.5(esbuild@0.14.54): - dependencies: - chokidar: 3.5.3 - esbuild: 0.14.54 - source-map: 0.6.1 - - karma-mocha-reporter@2.2.5(karma@6.4.2): - dependencies: - chalk: 2.4.2 - karma: 6.4.2 - log-symbols: 2.2.0 - strip-ansi: 4.0.0 - - karma-mocha@2.0.1: - dependencies: - minimist: 1.2.6 - - karma-sinon@1.0.5(karma@6.4.2)(sinon@14.0.0): - dependencies: - karma: 6.4.2 - sinon: 14.0.0 - - karma@6.4.2: - dependencies: - '@colors/colors': 1.5.0 - body-parser: 1.20.0 - braces: 3.0.2 - chokidar: 3.5.3 - connect: 3.7.0 - di: 0.0.1 - dom-serialize: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - http-proxy: 1.18.1 - isbinaryfile: 4.0.10 - lodash: 4.17.21 - log4js: 6.6.1 - mime: 2.6.0 - minimatch: 3.1.2 - mkdirp: 0.5.6 - qjobs: 1.2.0 - range-parser: 1.2.1 - rimraf: 3.0.2 - socket.io: 4.7.2 - source-map: 0.6.1 - tmp: 0.2.1 - ua-parser-js: 0.7.37 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -9692,7 +9301,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 11.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 7.2.0 lilconfig: 2.1.0 listr2: 6.6.1(enquirer@2.3.6) @@ -9741,8 +9350,6 @@ snapshots: lodash.debounce@4.0.8: {} - lodash.get@4.4.2: {} - lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} @@ -9753,15 +9360,6 @@ snapshots: lodash@4.17.21: {} - log-symbols@2.2.0: - dependencies: - chalk: 2.4.2 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 @@ -9770,23 +9368,11 @@ snapshots: strip-ansi: 7.0.1 wrap-ansi: 8.1.0 - log4js@6.6.1: - dependencies: - date-format: 4.0.13 - debug: 4.4.1 - flatted: 3.3.3 - rfdc: 1.3.0 - streamroller: 3.1.2 - transitivePeerDependencies: - - supports-color - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - loupe@2.3.4: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.4: {} lowercase-keys@3.0.0: {} @@ -9801,10 +9387,22 @@ snapshots: dependencies: yallist: 3.1.1 + lz-string@1.5.0: {} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -9814,6 +9412,10 @@ snapshots: dependencies: semver: 6.3.1 + make-dir@4.0.0: + dependencies: + semver: 7.6.2 + make-error@1.3.6: {} map-age-cleaner@0.1.3: @@ -9826,6 +9428,8 @@ snapshots: marky@1.3.0: {} + math-intrinsics@1.1.0: {} + maxmin@2.1.0: dependencies: chalk: 1.1.3 @@ -9835,8 +9439,6 @@ snapshots: mdn-data@2.0.14: {} - media-typer@0.3.0: {} - mem@5.1.1: dependencies: map-age-cleaner: 0.1.3 @@ -9863,18 +9465,18 @@ snapshots: microbundle@0.15.1(patch_hash=191ddb4c75616fbd059c0f22ba3000be648ce78c33a2f5286f6d1ff43f9ea6b8)(@types/babel__core@7.20.5): dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.28.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-flow-strip-types': 7.18.9(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.28.4) - '@babel/preset-env': 7.28.3(@babel/core@7.28.4) - '@babel/preset-flow': 7.18.6(@babel/core@7.28.4) - '@babel/preset-react': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types': 7.18.9(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) + '@babel/preset-env': 7.28.5(@babel/core@7.28.5) + '@babel/preset-flow': 7.18.6(@babel/core@7.28.5) + '@babel/preset-react': 7.27.1(@babel/core@7.28.5) '@rollup/plugin-alias': 3.1.9(rollup@2.79.1) - '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.4)(@types/babel__core@7.20.5)(rollup@2.79.1) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.5)(@types/babel__core@7.20.5)(rollup@2.79.1) '@rollup/plugin-commonjs': 17.1.0(rollup@2.79.1) '@rollup/plugin-json': 4.1.0(rollup@2.79.1) '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) @@ -9883,7 +9485,7 @@ snapshots: autoprefixer: 10.4.8(postcss@8.5.6) babel-plugin-macros: 3.1.0 babel-plugin-transform-async-to-promises: 0.8.18 - babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.28.4) + babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.28.5) brotli-size: 4.0.0 builtin-modules: 3.3.0 camelcase: 6.3.0 @@ -9921,8 +9523,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@2.6.0: {} - mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -9937,11 +9537,7 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 - - minimatch@5.1.0: + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 @@ -9964,39 +9560,17 @@ snapshots: mkdirp@0.5.6: dependencies: minimist: 1.2.6 + optional: true mkdirp@1.0.4: {} - mocha@10.0.0: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - moment@2.30.1: optional: true mri@1.2.0: {} + mrmime@2.0.1: {} + ms@2.0.0: {} ms@2.1.2: {} @@ -10028,23 +9602,11 @@ snapshots: nanoid@3.3.11: {} - nanoid@3.3.3: {} - natural-compare@1.4.0: {} ncp@2.0.0: optional: true - negotiator@0.6.3: {} - - nise@5.1.1: - dependencies: - '@sinonjs/commons': 1.8.3 - '@sinonjs/fake-timers': 9.1.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 4.2.1 - path-to-regexp: 1.8.0 - node-domexception@1.0.0: {} node-fetch@2.6.7: @@ -10077,13 +9639,11 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - normalize-range@0.1.2: {} normalize-url@6.1.0: {} - normalize-url@8.0.2: {} + normalize-url@8.1.0: {} npm-run-path@4.0.1: dependencies: @@ -10103,7 +9663,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.12.2: {} + object-inspect@1.13.4: {} object-is@1.1.5: dependencies: @@ -10116,19 +9676,11 @@ snapshots: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - has-symbols: 1.0.3 + has-symbols: 1.1.0 object-keys: 1.1.1 on-exit-leak-free@2.1.2: {} - on-finished@2.3.0: - dependencies: - ee-first: 1.1.1 - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -10224,6 +9776,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-json@8.1.1: dependencies: got: 12.6.1 @@ -10260,8 +9814,6 @@ snapshots: dependencies: entities: 6.0.1 - parseurl@1.3.3: {} - path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -10279,10 +9831,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@1.8.0: - dependencies: - isarray: 0.0.1 - path-type@4.0.0: {} path@0.12.7: @@ -10290,7 +9838,9 @@ snapshots: process: 0.11.10 util: 0.10.4 - pathval@1.1.1: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} pend@1.2.0: {} @@ -10339,6 +9889,14 @@ snapshots: dependencies: find-up: 4.1.0 + playwright-core@1.53.1: {} + + playwright@1.53.1: + dependencies: + playwright-core: 1.53.1 + optionalDependencies: + fsevents: 2.3.2 + postcss-calc@8.2.4(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -10546,21 +10104,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact-iso@2.3.0(preact-render-to-string@6.5.13(preact@10.26.9))(preact@10.26.9): + preact-iso@2.3.0(preact-render-to-string@6.6.3(preact@10.27.2))(preact@10.27.2): dependencies: - preact: 10.26.9 - preact-render-to-string: 6.5.13(preact@10.26.9) + preact: 10.27.2 + preact-render-to-string: 6.6.3(preact@10.27.2) - preact-render-to-string@5.2.6(preact@10.26.9): + preact-render-to-string@5.2.6(preact@10.27.2): dependencies: - preact: 10.26.9 + preact: 10.27.2 pretty-format: 3.8.0 - preact-render-to-string@6.5.13(preact@10.26.9): + preact-render-to-string@6.6.3(preact@10.27.2): dependencies: - preact: 10.26.9 + preact: 10.27.2 - preact@10.26.9: {} + preact@10.27.2: {} preferred-pm@3.0.3: dependencies: @@ -10581,6 +10139,12 @@ snapshots: pretty-bytes@5.6.0: {} + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + pretty-format@3.8.0: {} process-nextick-args@2.0.1: {} @@ -10610,16 +10174,10 @@ snapshots: punycode@2.3.1: {} - pupa@3.1.0: + pupa@3.3.0: dependencies: escape-goat: 4.0.0 - qjobs@1.2.0: {} - - qs@6.10.3: - dependencies: - side-channel: 1.0.4 - qs@6.5.3: {} queue-microtask@1.2.3: {} @@ -10638,15 +10196,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - range-parser@1.2.1: {} - - raw-body@2.5.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -10660,6 +10209,8 @@ snapshots: react: 18.2.0 scheduler: 0.23.0 + react-is@17.0.2: {} + react-router-dom@6.10.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@remix-run/router': 1.5.0 @@ -10714,10 +10265,6 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - real-require@0.2.0: {} rechoir@0.6.2: @@ -10802,8 +10349,6 @@ snapshots: require-main-filename@2.0.0: {} - requires-port@1.0.0: {} - resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} @@ -10896,30 +10441,30 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.45.1: + rollup@4.44.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.44.1 + '@rollup/rollup-android-arm64': 4.44.1 + '@rollup/rollup-darwin-arm64': 4.44.1 + '@rollup/rollup-darwin-x64': 4.44.1 + '@rollup/rollup-freebsd-arm64': 4.44.1 + '@rollup/rollup-freebsd-x64': 4.44.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 + '@rollup/rollup-linux-arm-musleabihf': 4.44.1 + '@rollup/rollup-linux-arm64-gnu': 4.44.1 + '@rollup/rollup-linux-arm64-musl': 4.44.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-musl': 4.44.1 + '@rollup/rollup-linux-s390x-gnu': 4.44.1 + '@rollup/rollup-linux-x64-gnu': 4.44.1 + '@rollup/rollup-linux-x64-musl': 4.44.1 + '@rollup/rollup-win32-arm64-msvc': 4.44.1 + '@rollup/rollup-win32-ia32-msvc': 4.44.1 + '@rollup/rollup-win32-x64-msvc': 4.44.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -10963,16 +10508,10 @@ snapshots: dependencies: randombytes: 2.1.0 - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - set-blocking@2.0.0: {} setimmediate@1.0.5: {} - setprototypeof@1.2.0: {} - sha.js@2.4.11: dependencies: inherits: 2.0.4 @@ -11009,11 +10548,35 @@ snapshots: minimist: 1.2.6 shelljs: 0.8.5 - side-channel@1.0.4: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.2 + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} sign-addon@5.3.0: dependencies: @@ -11032,19 +10595,11 @@ snapshots: signal-exit@4.1.0: {} - sinon-chai@3.7.0(chai@4.3.6)(sinon@14.0.0): + sirv@3.0.1: dependencies: - chai: 4.3.6 - sinon: 14.0.0 - - sinon@14.0.0: - dependencies: - '@sinonjs/commons': 1.8.3 - '@sinonjs/fake-timers': 9.1.2 - '@sinonjs/samsam': 6.1.1 - diff: 5.1.0 - nise: 5.1.1 - supports-color: 7.2.0 + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 slash@3.0.0: {} @@ -11062,34 +10617,6 @@ snapshots: wcwidth: 1.0.1 yargs: 15.4.1 - socket.io-adapter@2.5.2: - dependencies: - ws: 8.11.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - socket.io-parser@4.2.4: - dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - socket.io@4.7.2: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) - engine.io: 6.5.4 - socket.io-adapter: 2.5.2 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - sonic-boom@3.8.1: dependencies: atomic-sleep: 1.0.0 @@ -11153,9 +10680,9 @@ snapshots: stable@0.1.8: {} - statuses@1.5.0: {} + stackback@0.0.2: {} - statuses@2.0.1: {} + std-env@3.9.0: {} stream-to-array@2.3.0: dependencies: @@ -11171,14 +10698,6 @@ snapshots: dependencies: mixme: 0.5.4 - streamroller@3.1.2: - dependencies: - date-format: 4.0.13 - debug: 4.4.1 - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - string-argv@0.3.2: {} string-hash@1.1.3: {} @@ -11200,11 +10719,11 @@ snapshots: call-bind: 1.0.2 define-properties: 1.1.4 es-abstract: 1.20.1 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 internal-slot: 1.0.3 regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 + side-channel: 1.1.0 string.prototype.trimend@1.0.5: dependencies: @@ -11230,10 +10749,6 @@ snapshots: dependencies: ansi-regex: 2.1.1 - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -11269,6 +10784,10 @@ snapshots: strip-json-comments@5.0.0: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + style-inject@0.3.0: {} stylehacks@5.1.0(postcss@8.5.6): @@ -11287,10 +10806,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} svgo@2.8.0: @@ -11318,6 +10833,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + text-table@0.2.0: {} thenify-all@1.6.0: @@ -11339,11 +10860,21 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 - tinyglobby@0.2.14: + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -11356,10 +10887,10 @@ snapshots: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - tosource@1.0.0: {} + totalist@3.0.1: {} + tough-cookie@2.5.0: dependencies: psl: 1.15.0 @@ -11391,7 +10922,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} + type-detect@4.1.0: {} type-fest@0.13.1: {} @@ -11405,11 +10936,6 @@ snapshots: type-fest@2.19.0: {} - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -11420,13 +10946,11 @@ snapshots: typescript@5.8.3: {} - ua-parser-js@0.7.37: {} - unbox-primitive@1.0.2: dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 - has-symbols: 1.0.3 + has-symbols: 1.1.0 which-boxed-primitive: 1.0.2 undici-types@5.26.5: {} @@ -11452,8 +10976,6 @@ snapshots: universalify@2.0.0: {} - unpipe@1.0.0: {} - upath@2.0.1: {} update-browserslist-db@1.1.3(browserslist@4.25.1): @@ -11471,10 +10993,10 @@ snapshots: import-lazy: 4.0.0 is-ci: 3.0.1 is-installed-globally: 0.4.0 - is-npm: 6.0.0 + is-npm: 6.1.0 is-yarn-global: 0.4.1 latest-version: 7.0.0 - pupa: 3.1.0 + pupa: 3.3.0 semver: 7.6.2 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -11501,8 +11023,6 @@ snapshots: is-typed-array: 1.1.10 which-typed-array: 1.1.9 - utils-merge@1.0.1: {} - uuid@3.4.0: {} uuid@8.3.2: {} @@ -11512,14 +11032,33 @@ snapshots: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 - vary@1.1.2: {} - verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 + vite-node@3.2.4(@types/node@18.19.103): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 6.3.5(@types/node@18.19.103) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite@3.2.7(@types/node@18.19.103)(terser@5.14.2): dependencies: esbuild: 0.15.18 @@ -11531,19 +11070,60 @@ snapshots: fsevents: 2.3.3 terser: 5.14.2 - vite@7.0.6(@types/node@18.19.103): + vite@6.3.5(@types/node@18.19.103): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) + esbuild: 0.25.5 + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 - tinyglobby: 0.2.14 + rollup: 4.44.1 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 18.19.103 fsevents: 2.3.3 - void-elements@2.0.1: {} + vitest@3.2.4(@types/debug@4.1.12)(@types/node@18.19.103)(@vitest/browser@3.2.4): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@18.19.103)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + debug: 4.4.1 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.3.5(@types/node@18.19.103) + vite-node: 3.2.4(@types/node@18.19.103) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 18.19.103 + '@vitest/browser': 3.2.4(playwright@1.53.1)(vite@6.3.5(@types/node@18.19.103))(vitest@3.2.4) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml watchpack@2.4.0: dependencies: @@ -11627,7 +11207,7 @@ snapshots: available-typed-arrays: 1.0.5 call-bind: 1.0.2 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.0 is-typed-array: 1.1.10 @@ -11644,6 +11224,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + widest-line@4.0.1: dependencies: string-width: 5.1.2 @@ -11652,8 +11237,6 @@ snapshots: word-wrap@1.2.5: {} - workerpool@6.2.1: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -11681,10 +11264,10 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - ws@8.11.0: {} - ws@8.13.0: {} + ws@8.18.3: {} + xdg-basedir@5.1.0: {} xml2js@0.5.0: @@ -11711,19 +11294,8 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.4: {} - - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -11738,16 +11310,6 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.1: dependencies: cliui: 8.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 01237ee47..c63abf7f5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,9 @@ packages: # all packages in direct subdirs of packages/ - "packages/*" + - "packages/preact/utils" + - "packages/react/utils" + - "packages/react/runtime" # all packages in subdirs of components/ - "docs/**" # extension package diff --git a/scripts/mangle-plugin.mjs b/scripts/mangle-plugin.mjs new file mode 100644 index 000000000..02315b5d2 --- /dev/null +++ b/scripts/mangle-plugin.mjs @@ -0,0 +1,39 @@ +import { readFileSync } from 'node:fs'; +import { transformAsync } from '@babel/core'; +const rename = {}; +const mangle = readFileSync('./mangle.json', 'utf8'); +const mangleJson = JSON.parse(mangle); +for (let prop in mangleJson.props.props) { + let name = prop; + if (name[0] === '$') { + name = name.slice(1); + } + + rename[name] = mangleJson.props.props[prop]; +} +export const manglePlugin = { + name: 'rename-mangle-properties', + async transform(code, id) { + if (id.includes('node_modules')) { + return null; + } + + const transformed = await transformAsync(code, { + filename: id, + configFile: false, + plugins: [ + [ + 'babel-plugin-transform-rename-properties', + { + rename + } + ] + ] + }); + + return { + code: transformed.code, + map: transformed.map + }; + } +}; diff --git a/scripts/transform-plugin.mjs b/scripts/transform-plugin.mjs new file mode 100644 index 000000000..20c3afde1 --- /dev/null +++ b/scripts/transform-plugin.mjs @@ -0,0 +1,95 @@ +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +import { transformAsync } from '@babel/core'; + +export function createEsbuildPlugin() { + const pending = new Map(); + const cache = new Map(); + const __dirname = path.dirname(fileURLToPath(import.meta.url)); + const projectRoot = path.resolve(__dirname, '..'); + + return { + name: 'react-transform', + enforce: 'pre', + async transform(code, id) { + if (id.includes("node_modules") || + (!id.includes("packages/react/test/shared") && + !id.includes("packages/react/runtime/test"))) { + return null; + } + + if (!id.endsWith('.js') && !id.endsWith('.ts') && !id.endsWith('.jsx') && !id.endsWith('.tsx')) { + return null; + } + + const cached = cache.get(id); + + if (cached && cached.input === code) { + return { + code: cached.result, + map: null, + }; + } + + let result = code; + let map = null; + + if (!pending.has(id)) { + pending.set(id, []); + + const jsx = [ + "@babel/preset-react", + { + runtime: "classic", + pragma: "createElement", + pragmaFrag: "Fragment", + }, + ]; + + const ts = [ + "@babel/preset-typescript", + { + jsxPragma: "createElement", + jsxPragmaFrag: "Fragment", + }, + ]; + + const transformPath = path.join(projectRoot, "packages/react-transform"); + const signalsTransform = [ + transformPath, + { + mode: "auto", + }, + ]; + + const tmp = await transformAsync(result, { + filename: id, + sourceMaps: true, + presets: [ts, jsx], + plugins: [ + signalsTransform, + ], + }); + result = (tmp && tmp.code) || result; + map = (tmp && tmp.map) || map; + cache.set(id, { input: code, result, map }); + + const waited = pending.get(id); + pending.delete(id); + waited.forEach(fn => fn()); + } else { + await new Promise(r => { + pending.get(id).push(r); + }); + const cached = cache.get(id); + result = cached.result; + map = cached.map; + } + + return { + code: result, + map, + }; + } + }; +} diff --git a/test/node/setup.js b/test/node/setup.js deleted file mode 100644 index 8c08f848c..000000000 --- a/test/node/setup.js +++ /dev/null @@ -1,60 +0,0 @@ -// import register from "@babel/register"; -const register = require("@babel/register").default; -const chai = require("chai"); -const sinon = require("sinon"); -const sinonChai = require("sinon-chai"); - -globalThis.expect = chai.expect; -// @ts-expect-error Not sure why TS isn't picking up the declared sinon global from karma-chai-sinon -globalThis.sinon = sinon; -chai.use(sinonChai); - -const coverage = String(process.env.COVERAGE) === "true"; - -// @babel/register doesn't hook into the experimental NodeJS ESM loader API so -// we need all test files to run as CommonJS modules in Node -const env = [ - "@babel/preset-env", - { - targets: { - node: "current", - }, - loose: true, - modules: "commonjs", - }, -]; - -const jsx = [ - "@babel/preset-react", - { - runtime: "classic", - pragma: "createElement", - pragmaFrag: "Fragment", - }, -]; - -const ts = [ - "@babel/preset-typescript", - { - jsxPragma: "createElement", - jsxPragmaFrag: "Fragment", - }, -]; - -register({ - extensions: [".js", ".mjs", ".ts", ".tsx", ".mts", ".mtsx"], - cache: true, - - sourceMaps: "inline", - presets: [ts, jsx, env], - plugins: [ - coverage && [ - "istanbul", - { - // TODO: Currently NodeJS tests always run against dist files. Should we - // change this? - // include: minify ? "**/dist/**/*.js" : "**/src/**/*.{js,jsx,ts,tsx}", - }, - ], - ].filter(Boolean), -}); diff --git a/vitest.config.mjs b/vitest.config.mjs new file mode 100644 index 000000000..2357a9912 --- /dev/null +++ b/vitest.config.mjs @@ -0,0 +1,120 @@ +import { defineConfig } from 'vitest/config'; +import { manglePlugin } from './scripts/mangle-plugin.mjs'; +import { createEsbuildPlugin } from './scripts/transform-plugin.mjs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const MINIFY = process.env.MINIFY === "true"; +const COVERAGE = process.env.COVERAGE === 'true'; +const dirname = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + resolve: { + alias: MINIFY ? { + '@preact/signals-core': path.join( + dirname, './packages/core/dist/signals-core.module.js' + ), + '@preact/signals/utils': path.join( + dirname, './packages/preact/utils/dist/utils.module.js' + ), + '@preact/signals': path.join( + dirname, './packages/preact/dist/signals.module.js' + ), + '@preact/signals-react/runtime': path.join( + dirname, './packages/react/runtime/dist/runtime.module.js' + ), + '@preact/signals-react/utils': path.join( + dirname, './packages/react/utils/dist/utils.module.js' + ), + '@preact/signals-react': path.join( + dirname, './packages/react/dist/signals.module.js' + ), + '@preact/signals-react-runtime': path.join( + dirname, './packages/react/runtime/dist/runtime.module.js' + ), + '@preact/signals-react-utils': path.join( + dirname, './packages/react/utils/dist/utils.module.js' + ), + '@preact/signals-react-transform': path.join( + dirname ,'./packages/react-transform/dist/signals-transform.mjs' + ), + '@preact/signals-utils': path.join( + dirname, './packages/preact/utils/dist/utils.module.js' + ), + } : {} + }, + plugins: [ + manglePlugin, + createEsbuildPlugin(), + { + name: 'react-create-root-legacy-fallback', + enforce: 'pre', + async resolveId(source, importer) { + if (!importer.startsWith(path.join(dirname, 'packages/react/'))) { + return null; + } + const resolved = await this.resolve(source, importer); + if (!resolved || resolved.id !== path.join(dirname, 'packages/react/test/shared/create-root.ts')) { + return null; + } + const hasClient = await this.resolve('react-dom/client', importer); + if (!hasClient) { + return this.resolve(path.join( + dirname, + 'packages/react/test/shared/create-root-legacy.ts' + ), importer); + } + return null; + }, + }, + + ], + // TODO (43081j): stop faking node globals and sort out the transform + // tests. Either run them in node, or somehow run babel in node but the + // tests in browser + define: { + IS_REACT_ACT_ENVIRONMENT: true, + process: { + env: {} + } + }, + test: { + coverage: { + enabled: COVERAGE, + include: [ + 'packages/**/dist/**/*.js', + 'packages/react-transform/src/**/*.ts' + ], + provider: 'v8', + reporter: ['text-summary', 'lcov'], + reportsDirectory: './coverage' + }, + projects: [ + { + extends: true, + test: { + include: [ + './packages/**/test/**/*.test.tsx', + ], + exclude: [ + './packages/**/test/browser/**/*.test.tsx', + '**/node_modules/**' + ] + } + }, + { + extends: true, + test: { + include: ['./packages/**/test/browser/**/*.test.tsx'], + browser: { + provider: 'playwright', + enabled: true, + screenshotFailures: false, + headless: true, + instances: [{ browser: 'chromium' }] + } + } + } + ] + } +});