diff --git a/packages/webamp/.babelrc b/packages/webamp/.babelrc deleted file mode 100644 index 69421e24f3..0000000000 --- a/packages/webamp/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["@babel/preset-typescript"], - "plugins": ["@babel/plugin-transform-modules-commonjs"] -} diff --git a/packages/webamp/config/jest.integration.js b/packages/webamp/config/jest.integration.js deleted file mode 100644 index e947737575..0000000000 --- a/packages/webamp/config/jest.integration.js +++ /dev/null @@ -1,7 +0,0 @@ -// See jest-puppeteer.config.js for the config that setups the web server. -module.exports = { - displayName: "integration-test", - rootDir: "../", - preset: "jest-puppeteer", - testRegex: "\\.integration-test\\.js$", -}; diff --git a/packages/webamp/config/jest.unit.js b/packages/webamp/config/jest.unit.js deleted file mode 100644 index ece5eb96fc..0000000000 --- a/packages/webamp/config/jest.unit.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - displayName: "test", - rootDir: "../", - testRegex: "\\.test\\.(js|ts|tsx)$", - globals: { - SENTRY_DSN: null, - }, - moduleFileExtensions: ["js", "tsx", "ts", "json"], - moduleNameMapper: { - "\\.css$": "/js/__mocks__/styleMock.js", - "\\.wsz$": "/js/__mocks__/fileMock.js", - "\\.mp3$": "/js/__mocks__/fileMock.js", - "^winamp-eqf$": "/../winamp-eqf/built/index.js", - }, - transform: { - "^.+\\.(t|j)sx?$": ["@swc/jest"], - }, - extensionsToTreatAsEsm: [".ts", ".tsx"], - testPathIgnorePatterns: ["/node_modules/"], - testEnvironment: "jsdom", -}; diff --git a/packages/webamp/jest-puppeteer.config.js b/packages/webamp/jest-puppeteer.config.js deleted file mode 100644 index 42994f7568..0000000000 --- a/packages/webamp/jest-puppeteer.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - launch: { - dumpio: true, - }, - server: { - // Note: We require the the build be run before these tests. - // TODO: Figure out how to get this command to run the build. - command: "PORT=8080 pnpm serve", - port: 8080, // Jest Puppeteer will wait 5000ms for this port to come online. - launchTimeout: 10000, // Jest Puppeteer will wait 10000ms for the server to start. - debug: true, - usedPortAction: "ask", // Note: "kill" will kill the process running on the port. - waitOnScheme: { - verbose: true, - }, - }, -}; diff --git a/packages/webamp/js/__mocks__/mediaMock.js b/packages/webamp/js/__mocks__/mediaMock.js index ccec2a2ce4..5675e00294 100644 --- a/packages/webamp/js/__mocks__/mediaMock.js +++ b/packages/webamp/js/__mocks__/mediaMock.js @@ -1,9 +1,11 @@ +import { vi } from "vitest"; + const media = { - addEventListener: jest.fn(), - setVolume: jest.fn(), - setBalance: jest.fn(), - setPreamp: jest.fn(), + addEventListener: vi.fn(), + setVolume: vi.fn(), + setBalance: vi.fn(), + setPreamp: vi.fn(), getAnalyser: () => null, - on: jest.fn(), + on: vi.fn(), }; export default media; diff --git a/packages/webamp/js/__snapshots__/regionParser.test.js.snap b/packages/webamp/js/__snapshots__/regionParser.test.js.snap index d649d9ad89..6a29f37287 100644 --- a/packages/webamp/js/__snapshots__/regionParser.test.js.snap +++ b/packages/webamp/js/__snapshots__/regionParser.test.js.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`regionParser parses Satellite M's region.txt 1`] = ` +exports[`regionParser > parses Satellite M's region.txt 1`] = ` { "normal": [ "4,0 271,0 271,116 4,116", @@ -11,7 +11,7 @@ exports[`regionParser parses Satellite M's region.txt 1`] = ` } `; -exports[`regionParser parses a complex file 1`] = ` +exports[`regionParser > parses a complex file 1`] = ` { "equalizer": [ "2,0 9,0 9,2 2,2", @@ -409,7 +409,7 @@ exports[`regionParser parses a complex file 1`] = ` } `; -exports[`regionParser parses a file with section headers but no info 1`] = ` +exports[`regionParser > parses a file with section headers but no info 1`] = ` { "equalizer": [ "0,0 0,115 20,20 274,115 274,0", @@ -420,7 +420,7 @@ exports[`regionParser parses a file with section headers but no info 1`] = ` } `; -exports[`regionParser parses a region.txt where the points have leading commas 1`] = ` +exports[`regionParser > parses a region.txt where the points have leading commas 1`] = ` { "equalizer": [ "5,0 3,1 2,2 1,3 0,5 0,116 275,116 275,6 274,3 273,2 272,1 270,0", @@ -437,7 +437,7 @@ exports[`regionParser parses a region.txt where the points have leading commas 1 } `; -exports[`regionParser parses the EVAunit region.txt 1`] = ` +exports[`regionParser > parses the EVAunit region.txt 1`] = ` { "equalizer": [ "4,0 4,3 2,3 0,5 0,116 275,116 275,5 273,3 270,3 270,0 237,0 237,3 183,3 183,0 129,0 129,3 17,3 17,0", @@ -451,7 +451,7 @@ exports[`regionParser parses the EVAunit region.txt 1`] = ` } `; -exports[`regionParser parses the iTuned region.txt 1`] = ` +exports[`regionParser > parses the iTuned region.txt 1`] = ` { "equalizer": [ "5,0 269,0 269,116 5,116", diff --git a/packages/webamp/js/__snapshots__/serialization.test.ts.snap b/packages/webamp/js/__snapshots__/serialization.test.ts.snap index 4c409b7084..7fb6fdc9c4 100644 --- a/packages/webamp/js/__snapshots__/serialization.test.ts.snap +++ b/packages/webamp/js/__snapshots__/serialization.test.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`can serialize the initial state 1`] = ` +exports[`can serialize > the initial state 1`] = ` { "display": { "doubled": false, diff --git a/packages/webamp/js/__tests__/.eslintrc b/packages/webamp/js/__tests__/.eslintrc deleted file mode 100644 index 55f121d152..0000000000 --- a/packages/webamp/js/__tests__/.eslintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "env": { - "jest": true - } -} diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-load-a-skin-via-the-query-params-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-load-a-skin-via-the-query-params-1-snap.png deleted file mode 100644 index a2910d7886..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-load-a-skin-via-the-query-params-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-pose-for-a-screenshot-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-pose-for-a-screenshot-1-snap.png deleted file mode 100644 index d43d8646c3..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-pose-for-a-screenshot-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-render-skins-that-have-forward-slash-in-filename-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-render-skins-that-have-forward-slash-in-filename-1-snap.png deleted file mode 100644 index fba6712e65..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-render-skins-that-have-forward-slash-in-filename-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-set-a-background-color-via-the-query-params-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-set-a-background-color-via-the-query-params-1-snap.png deleted file mode 100644 index 57beaf322a..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-can-set-a-background-color-via-the-query-params-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-closing-winamp-shows-the-icon-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-closing-winamp-shows-the-icon-1-snap.png deleted file mode 100644 index 517e84dcd7..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-closing-winamp-shows-the-icon-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-desktop-icons-are-hidden-from-screenshots-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-desktop-icons-are-hidden-from-screenshots-1-snap.png deleted file mode 100644 index 24889d6f7e..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-desktop-icons-are-hidden-from-screenshots-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-pads-empty-space-in-the-marquee-with-the-space-character-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-pads-empty-space-in-the-marquee-with-the-space-character-1-snap.png deleted file mode 100644 index 4bc1eaaf20..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-pads-empty-space-in-the-marquee-with-the-space-character-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-a-skin-that-defines-transparent-regions-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-a-skin-that-defines-transparent-regions-1-snap.png deleted file mode 100644 index cbdd2c01d9..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-a-skin-that-defines-transparent-regions-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-a-skin-that-has-files-that-only-differ-by-case-main-bmp-and-main-bmp-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-a-skin-that-has-files-that-only-differ-by-case-main-bmp-and-main-bmp-1-snap.png deleted file mode 100644 index 6f6152d60e..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-a-skin-that-has-files-that-only-differ-by-case-main-bmp-and-main-bmp-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-the-default-skin-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-the-default-skin-1-snap.png deleted file mode 100644 index e1b3c3c215..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-the-default-skin-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-the-topaz-skin-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-the-topaz-skin-1-snap.png deleted file mode 100644 index 1b8f4ddb84..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-should-render-the-topaz-skin-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-uses-the-volume-spirtes-as-a-fallback-when-balance-spirtes-are-missing-1-snap.png b/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-uses-the-volume-spirtes-as-a-fallback-when-balance-spirtes-are-missing-1-snap.png deleted file mode 100644 index bb78e17a78..0000000000 Binary files a/packages/webamp/js/__tests__/__image_snapshots__/baseline-integration-test-js-uses-the-volume-spirtes-as-a-fallback-when-balance-spirtes-are-missing-1-snap.png and /dev/null differ diff --git a/packages/webamp/js/__tests__/baseline.integration-test.js b/packages/webamp/js/__tests__/baseline.integration-test.js deleted file mode 100644 index 7df8e97fad..0000000000 --- a/packages/webamp/js/__tests__/baseline.integration-test.js +++ /dev/null @@ -1,159 +0,0 @@ -// See jest.integration.js for the config for this test file. - -/* global page */ -const { toMatchImageSnapshot } = require("jest-image-snapshot"); -const path = require("path"); - -expect.extend({ toMatchImageSnapshot }); - -const DOMAIN = "http://localhost:8080"; -const snapshotOptions = { - // There are some font rendering issues which prevent us from pushing this lower right now. - // We could setup some tests which don't render text and set the threshold lower. - // Ideally we can resolve the font rendering issue. - failureThreshold: "0.00", - failureThresholdType: "percent", -}; - -// Hack to ensure changing the hash causes a page reload -beforeEach(async () => page.goto(`http://example.com`)); - -test("should render the default skin", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("can 'pose' for a screenshot", async () => { - await page.goto(`${DOMAIN}/?screenshot=1`); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -// *************** IMPORTANT *************** -// If this test starts to fail, check that the cache-bust location of the skin has not changed. -test.skip("can load a skin via the query params", async () => { - await page.goto( - `${DOMAIN}/?skinUrl=/MacOSXAqua1-5.698dd4ab.wsz#{"disableMarquee":true}` - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("can set a background color via the query params", async () => { - await page.goto(`${DOMAIN}/?bg=%23ff0000#{"disableMarquee":true}`); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -// This seems to fail hard for some other reason. Disable for now. -test.skip("can set soundcloud playlist via the query params", async () => { - // If this test starts to fail, it might be flakyiness coming from the SoundCloud API, or that Poolside FM has changed their playlist. - await page.goto(`${DOMAIN}/?scPlaylist=1040356177#{"disableMarquee":true}`); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("should render the Topaz skin", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await expect(page).toUploadFile( - "#webamp-file-input", - path.join(__dirname, "../../demo/skins/TopazAmp1-2.wsz") - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("should render a skin that defines transparent regions", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await expect(page).toUploadFile( - "#webamp-file-input", - path.join(__dirname, "../../demo/skins/Green-Dimension-V2.wsz") - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("should render a skin that has files that only differ by case: main.bmp and main.BMP", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await expect(page).toUploadFile( - "#webamp-file-input", - path.join(__dirname, "../../demo/skins/My_Funny_Valentine.wsz") - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("uses the volume spirtes as a fallback when balance spirtes are missing", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await expect(page).toUploadFile( - "#webamp-file-input", - path.join(__dirname, "../../demo/skins/AmigaPPC-dark.wsz") - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("pads empty space in the marquee with the space character", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - // This skin has noticeable light blue where it expects the marquee to always cover. - await expect(page).toUploadFile( - "#webamp-file-input", - path.join(__dirname, "../../demo/skins/Sonic_Attitude.wsz") - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - await page.evaluate(() => - window.__webamp.store.dispatch({ type: "SET_FOCUS", input: "balance" }) - ); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("can render skins that have forward slash in filename", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await expect(page).toUploadFile( - "#webamp-file-input", - path.join(__dirname, "../../demo/skins/rei_1.wsz") - ); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); - -test("closing winamp shows the icon", async () => { - await page.goto(`${DOMAIN}/#{"disableMarquee":true}`); - await page.evaluate(() => window.__webamp.skinIsLoaded()); - await page.evaluate( - () => document.getElementsByClassName("loaded-icon").length > 0 - ); - await page.evaluate(() => - window.__webamp.store.dispatch({ type: "CLOSE_WINAMP" }) - ); - expect(await page.screenshot()).toMatchImageSnapshot(snapshotOptions); -}); diff --git a/packages/webamp/js/actionCreators/index.test.js b/packages/webamp/js/actionCreators/index.test.js index f588298c68..1b1ce4e83f 100644 --- a/packages/webamp/js/actionCreators/index.test.js +++ b/packages/webamp/js/actionCreators/index.test.js @@ -88,7 +88,7 @@ test("setEqBand", () => { }); test("setEqToMax", () => { - const mockDispatch = jest.fn(); + const mockDispatch = vi.fn(); const dispatcher = setEqToMax(); dispatcher(mockDispatch); const expectedCalls = BANDS.map((band) => [ @@ -98,7 +98,7 @@ test("setEqToMax", () => { }); test("setEqToMin", () => { - const mockDispatch = jest.fn(); + const mockDispatch = vi.fn(); const dispatcher = setEqToMin(); dispatcher(mockDispatch); const expectedCalls = BANDS.map((band) => [ @@ -108,7 +108,7 @@ test("setEqToMin", () => { }); test("setEqToMid", () => { - const mockDispatch = jest.fn(); + const mockDispatch = vi.fn(); const dispatcher = setEqToMid(); dispatcher(mockDispatch); const expectedCalls = BANDS.map((band) => [ diff --git a/packages/webamp/js/emitter.test.js b/packages/webamp/js/emitter.test.js index 5cb9170be6..3d2138f8c7 100644 --- a/packages/webamp/js/emitter.test.js +++ b/packages/webamp/js/emitter.test.js @@ -2,15 +2,15 @@ import Emitter from "./emitter"; describe("Emitter", () => { it("calls a callback", () => { - const mock = jest.fn(); + const mock = vi.fn(); const emitter = new Emitter(); emitter.on("some-event", mock); emitter.trigger("some-event"); expect(mock).toHaveBeenCalled(); }); it("calls multiple callbacks", () => { - const mock1 = jest.fn(); - const mock2 = jest.fn(); + const mock1 = vi.fn(); + const mock2 = vi.fn(); const emitter = new Emitter(); emitter.on("some-event", mock1); emitter.on("some-event", mock2); @@ -19,7 +19,7 @@ describe("Emitter", () => { expect(mock2).toHaveBeenCalled(); }); it("returns an unsubscribe function", () => { - const mock = jest.fn(); + const mock = vi.fn(); const emitter = new Emitter(); const unsubscribe = emitter.on("some-event", mock); emitter.trigger("some-event"); @@ -32,7 +32,7 @@ describe("Emitter", () => { expect(mock).toHaveBeenCalledTimes(1); }); it("subscriptions do not take effent until the next event", () => { - const mock = jest.fn(); + const mock = vi.fn(); const emitter = new Emitter(); emitter.on("some-event", () => { emitter.on("some-event", mock); @@ -41,7 +41,7 @@ describe("Emitter", () => { expect(mock).not.toHaveBeenCalled(); }); it("unsubscribe does not take effect until the next event", () => { - const mock = jest.fn(); + const mock = vi.fn(); const emitter = new Emitter(); emitter.on("some-event", () => { unsubscribe(); // eslint-disable-line no-use-before-define diff --git a/packages/webamp/js/reducers/milkdrop.test.js b/packages/webamp/js/reducers/milkdrop.test.js index 486c7f20df..152cdb7c99 100644 --- a/packages/webamp/js/reducers/milkdrop.test.js +++ b/packages/webamp/js/reducers/milkdrop.test.js @@ -5,12 +5,12 @@ import * as Selectors from "../selectors"; // Actually tests action creators too const media = { - addEventListener: jest.fn(), - setVolume: jest.fn(), - setBalance: jest.fn(), - setPreamp: jest.fn(), + addEventListener: vi.fn(), + setVolume: vi.fn(), + setBalance: vi.fn(), + setPreamp: vi.fn(), getAnalyser: () => null, - on: jest.fn(), + on: vi.fn(), }; test("The first tack is picked at random", () => { diff --git a/packages/webamp/package.json b/packages/webamp/package.json index 20a6213703..1bfbdfd7b4 100644 --- a/packages/webamp/package.json +++ b/packages/webamp/package.json @@ -45,10 +45,9 @@ "prepublishOnly": "npm run build-library && npm run type-check", "serve": "http-server ./dist/demo-site", "start": "vite", - "test": "jest --config=config/jest.unit.js", - "tdd": "jest --config=config/jest.unit.js --watch", + "test": "vitest run", + "tdd": "vitest", "format": "prettier --write \"**/*.{js,ts,tsx,d.ts,css}\"", - "integration-tests": "jest --config=config/jest.integration.js --runInBand", "build-skin": "rm assets/skins/base-2.91.wsz && cd assets/skins/base-2.91 && zip -x .* -x 'Skining Updates.txt' -r ../base-2.91.wsz .", "compile-skin": "npx tsx scripts/compileSkin.ts > css/base-skin.css", "skin-info": "unzip -vl assets/skins/base-2.91.wsz", @@ -83,7 +82,6 @@ "@rollup/plugin-typescript": "^11.1.6", "@types/classnames": "^2.2.6", "@types/invariant": "^2.2.29", - "@types/jest": "^30.0.0", "@types/jszip": "^3.1.5", "@types/lodash": "^4.14.116", "@types/lodash-es": "^4.17.1", @@ -99,14 +97,11 @@ "http-server": "^0.11.1", "imagemin": "^6.1.0", "imagemin-optipng": "^6.0.0", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.7.0", - "jest-image-snapshot": "^2.12.0", - "jest-puppeteer": "^10.0.1", "postcss": "^8.4.21", "postcss-import": "^16.1.0", "puppeteer": "^22.2.0", "react-test-renderer": "^17.0.1", + "vitest": "^3.2.0", "rollup": "^4.18.0", "rollup-plugin-polyfill-node": "^0.13.0", "rollup-plugin-postcss": "^4.0.2", @@ -116,13 +111,6 @@ "url-loader": "^1.1.2", "vite": "^5.2.12" }, - "jest": { - "globalSetup": "jest-environment-puppeteer/setup", - "globalTeardown": "jest-environment-puppeteer/teardown", - "projects": [ - "config/jest.*.js" - ] - }, "prettier": { "trailingComma": "es5" }, diff --git a/packages/webamp/vitest.config.ts b/packages/webamp/vitest.config.ts new file mode 100644 index 0000000000..06fa9662bc --- /dev/null +++ b/packages/webamp/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + environment: "jsdom", + include: ["**/*.test.{js,ts,tsx}"], + exclude: ["node_modules"], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce84040079..c9eb76082c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -405,9 +405,6 @@ importers: '@types/invariant': specifier: ^2.2.29 version: 2.2.37 - '@types/jest': - specifier: ^30.0.0 - version: 30.0.0 '@types/jszip': specifier: ^3.1.5 version: 3.4.1 @@ -456,18 +453,6 @@ importers: imagemin-optipng: specifier: ^6.0.0 version: 6.0.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@24.0.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.12(@swc/helpers@0.5.15))(@types/node@24.0.10)(typescript@5.6.3)) - jest-environment-jsdom: - specifier: ^29.7.0 - version: 29.7.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - jest-image-snapshot: - specifier: ^2.12.0 - version: 2.12.0(jest@29.7.0(@types/node@24.0.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.12(@swc/helpers@0.5.15))(@types/node@24.0.10)(typescript@5.6.3))) - jest-puppeteer: - specifier: ^10.0.1 - version: 10.0.1(puppeteer@22.6.2(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(typescript@5.6.3) milkdrop-preset-converter-aws: specifier: ^0.1.6 version: 0.1.6 @@ -507,6 +492,9 @@ importers: vite: specifier: ^5.2.12 version: 5.2.12(@types/node@24.0.10)(lightningcss@1.24.1)(terser@5.43.0) + vitest: + specifier: ^3.2.0 + version: 3.2.6(@edge-runtime/vm@2.1.2)(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@1.21.7)(jsdom@20.0.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(lightningcss@1.24.1)(terser@5.43.0) winamp-eqf: specifier: workspace:* version: link:../winamp-eqf @@ -2837,6 +2825,9 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -3744,6 +3735,9 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/classnames@2.3.1': resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==} deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. @@ -3763,6 +3757,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -4163,6 +4160,35 @@ packages: '@vercel/static-config@2.0.16': resolution: {integrity: sha512-lULo+NWBMpTJb9kR4AwYYK/2e7wknTJO2iFxgYYOkG5i12WHgPhMnXDKrEOcotxctd0yPKx3TsWVGEXniNm63g==} + '@vitest/expect@3.2.6': + resolution: {integrity: sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==} + + '@vitest/mocker@3.2.6': + resolution: {integrity: sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==} + 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.6': + resolution: {integrity: sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==} + + '@vitest/runner@3.2.6': + resolution: {integrity: sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==} + + '@vitest/snapshot@3.2.6': + resolution: {integrity: sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==} + + '@vitest/spy@3.2.6': + resolution: {integrity: sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==} + + '@vitest/utils@3.2.6': + resolution: {integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==} + '@web3-storage/multipart-parser@1.0.0': resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} @@ -4569,6 +4595,10 @@ packages: assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} @@ -4640,9 +4670,6 @@ packages: aws4@1.12.0: resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} - b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} @@ -5028,6 +5055,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + chainsaw@0.0.9: resolution: {integrity: sha512-nG8PYH+/4xB+8zkV4G844EtfvZ5tTiLFoX3dZ4nhF4t3OCKIb9UvaFyNmeZO2zOSmRWzBoTD+napN6hiL+EgcA==} @@ -5065,6 +5096,10 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + cheerio-select@1.6.0: resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} @@ -5661,10 +5696,6 @@ packages: resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} engines: {node: '>=0.10.0'} - cwd@0.10.0: - resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} - engines: {node: '>=0.8'} - d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -5810,6 +5841,10 @@ packages: babel-plugin-macros: optional: true + 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==} engines: {node: '>=4.0.0'} @@ -6155,6 +6190,9 @@ packages: es-module-lexer@1.5.0: resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -6646,17 +6684,13 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expand-tilde@1.2.2: - resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} - engines: {node: '>=0.10.0'} - expand-tilde@2.0.2: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} - expect-puppeteer@10.0.0: - resolution: {integrity: sha512-E7sE6nVdEbrnpDOBMmcLgyqLJKt876AlBg1A+gsu5R8cWx+SLafreOgJAgzXg5Qko7Tk0cW5oZdRbHQLU738dg==} - engines: {node: '>=16'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} @@ -6893,18 +6927,6 @@ packages: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} engines: {node: '>=14.16'} - find-file-up@0.1.3: - resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} - engines: {node: '>=0.10.0'} - - find-pkg@0.1.2: - resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} - engines: {node: '>=0.10.0'} - - find-process@1.4.7: - resolution: {integrity: sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==} - hasBin: true - find-up@1.1.2: resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} engines: {node: '>=0.10.0'} @@ -7030,10 +7052,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-exists-sync@0.1.0: - resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} - engines: {node: '>=0.10.0'} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -7141,10 +7159,6 @@ packages: resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} engines: {node: '>=0.10.0'} - get-stdin@5.0.1: - resolution: {integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==} - engines: {node: '>=0.12.0'} - get-stream@2.3.1: resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} engines: {node: '>=0.10.0'} @@ -7231,18 +7245,10 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - global-modules@0.2.3: - resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} - engines: {node: '>=0.10.0'} - global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} - global-prefix@0.1.5: - resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} - engines: {node: '>=0.10.0'} - global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} @@ -7290,9 +7296,6 @@ packages: glsl-optimizer-js@0.0.2: resolution: {integrity: sha512-SMkVILyc1LeBEBgiHOe+4Bh8MEqxLNyAns0NfgmxJTxZZdj7oCoZt+n846rbdB8OLGsg16f5C9nmhi9XEuM8SQ==} - glur@1.1.2: - resolution: {integrity: sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA==} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -8142,10 +8145,6 @@ packages: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} - is-windows@0.2.0: - resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} - engines: {node: '>=0.10.0'} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -8256,10 +8255,6 @@ packages: ts-node: optional: true - jest-dev-server@10.0.0: - resolution: {integrity: sha512-FtyBBDxrAIfTX3hyKSOwj5KU6Z7fFLew5pQYOFpwyf+qpPpULL8aYxtsFkbkAwcs+Mb7qhcNbVLeiWsLOd7CKw==} - engines: {node: '>=16'} - jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8289,10 +8284,6 @@ packages: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-environment-puppeteer@10.0.1: - resolution: {integrity: sha512-FxMzVRyqieQqSy5CPWiwdK5t9dkRHid5eoRTVa8RtYeXLlpW6lU0dAmxEfPkdnDVCiPUhC2APeKOXq0J72bgag==} - engines: {node: '>=16'} - jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8305,12 +8296,6 @@ packages: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-image-snapshot@2.12.0: - resolution: {integrity: sha512-hRiy+1Ygv1Of0As9R8M2Q8eTawT9wmmezJKAGfeciZrYllQW5bGL0n6Wgk/J2OG70t5zJr3ZXDx2faui1uGw0g==} - engines: {node: '>=6.0.0'} - peerDependencies: - jest: '>=20 <=24' - jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8348,12 +8333,6 @@ packages: jest-resolve: optional: true - jest-puppeteer@10.0.1: - resolution: {integrity: sha512-FzC35XbqeuQEt1smXh1EOqhJaRkWqJkyWDMfGkcZ8C59QHXeJ7F/iOmiNqYi6l/OsycUuOPCk+IkjfGfS9YbrQ==} - engines: {node: '>=16'} - peerDependencies: - puppeteer: '>=19' - jest-regex-util@28.0.2: resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -8449,6 +8428,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 @@ -8849,6 +8831,9 @@ packages: resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} engines: {node: '>=0.10.0'} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -8904,6 +8889,9 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -10176,6 +10164,13 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + 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'} + peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} @@ -10236,10 +10231,6 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pixelmatch@4.0.2: - resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} - hasBin: true - pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -10254,10 +10245,6 @@ packages: pluralize@1.2.1: resolution: {integrity: sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==} - pngjs@3.4.0: - resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} - engines: {node: '>=4.0.0'} - polygon-clipping@0.15.7: resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==} @@ -11479,10 +11466,6 @@ packages: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} - resolve-dir@0.1.1: - resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} - engines: {node: '>=0.10.0'} - resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -11868,6 +11851,9 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -12033,10 +12019,6 @@ packages: resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} engines: {node: '>= 0.10'} - spawnd@10.0.0: - resolution: {integrity: sha512-6GKcakMTryb5b1SWCvdubCDHEsR2k+5VZUD5G19umZRarkvj1RyCGyizcqhjewI7cqZo8fTVD8HpnDZbVOLMtg==} - engines: {node: '>=16'} - spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -12100,6 +12082,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} @@ -12257,6 +12242,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -12484,6 +12472,12 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + 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.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -12495,6 +12489,14 @@ packages: tinyqueue@1.2.3: resolution: {integrity: sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + tlds@1.260.0: resolution: {integrity: sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ==} hasBin: true @@ -13131,6 +13133,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + 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@5.2.12: resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -13199,6 +13206,34 @@ packages: yaml: optional: true + vitest@3.2.6: + resolution: {integrity: sha512-xejya+bT/j/+R/AGa1XOfRxLmNUlLtlwjRsFUILF+xHfzElmGcmFydy2gqqIrd62ptIEfwVMofd19uNWD9L7Nw==} + 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.6 + '@vitest/ui': 3.2.6 + 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 + vm2@3.9.19: resolution: {integrity: sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==} engines: {node: '>=6.0'} @@ -13209,11 +13244,6 @@ packages: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} - wait-on@7.2.0: - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} - hasBin: true - walk-up-path@1.0.0: resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} @@ -13352,6 +13382,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} @@ -16411,6 +16446,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -17330,6 +17367,11 @@ snapshots: '@types/node': 24.0.10 '@types/responselike': 1.0.3 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/classnames@2.3.1': dependencies: classnames: 2.5.1 @@ -17354,6 +17396,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.7 @@ -17996,6 +18040,48 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 + '@vitest/expect@3.2.6': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.6(vite@7.0.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0))': + dependencies: + '@vitest/spy': 3.2.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.0.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0) + + '@vitest/pretty-format@3.2.6': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.6': + dependencies: + '@vitest/utils': 3.2.6 + pathe: 2.0.3 + strip-literal: 3.1.0 + + '@vitest/snapshot@3.2.6': + dependencies: + '@vitest/pretty-format': 3.2.6 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@3.2.6': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.6': + dependencies: + '@vitest/pretty-format': 3.2.6 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + '@web3-storage/multipart-parser@1.0.0': {} '@webassemblyjs/ast@1.14.1': @@ -18455,6 +18541,8 @@ snapshots: object.assign: 4.1.5 util: 0.12.5 + assertion-error@2.0.1: {} + assign-symbols@1.0.0: {} ast-types@0.13.4: @@ -18520,14 +18608,6 @@ snapshots: aws4@1.12.0: {} - axios@1.6.8: - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - b4a@1.6.6: {} babel-code-frame@6.26.0: @@ -19077,6 +19157,14 @@ snapshots: ccount@2.0.1: {} + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + chainsaw@0.0.9: dependencies: traverse: 0.3.9 @@ -19110,6 +19198,8 @@ snapshots: charenc@0.0.2: {} + check-error@2.1.3: {} + cheerio-select@1.6.0: dependencies: css-select: 4.3.0 @@ -19753,11 +19843,6 @@ snapshots: dependencies: array-find-index: 1.0.2 - cwd@0.10.0: - dependencies: - find-pkg: 0.1.2 - fs-exists-sync: 0.1.0 - d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -19891,6 +19976,8 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 + deep-eql@5.0.2: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -20305,6 +20392,8 @@ snapshots: es-module-lexer@1.5.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -21000,15 +21089,11 @@ snapshots: expand-template@2.0.3: {} - expand-tilde@1.2.2: - dependencies: - os-homedir: 1.0.2 - expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - expect-puppeteer@10.0.0: {} + expect-type@1.3.0: {} expect@29.7.0: dependencies: @@ -21307,23 +21392,6 @@ snapshots: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 - find-file-up@0.1.3: - dependencies: - fs-exists-sync: 0.1.0 - resolve-dir: 0.1.1 - - find-pkg@0.1.2: - dependencies: - find-file-up: 0.1.3 - - find-process@1.4.7: - dependencies: - chalk: 4.1.2 - commander: 5.1.0 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - find-up@1.1.2: dependencies: path-exists: 2.1.0 @@ -21449,8 +21517,6 @@ snapshots: fs-constants@1.0.0: {} - fs-exists-sync@0.1.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -21578,8 +21644,6 @@ snapshots: get-stdin@4.0.1: {} - get-stdin@5.0.1: {} - get-stream@2.3.1: dependencies: object-assign: 4.1.1 @@ -21683,24 +21747,12 @@ snapshots: dependencies: ini: 2.0.0 - global-modules@0.2.3: - dependencies: - global-prefix: 0.1.5 - is-windows: 0.2.0 - global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - global-prefix@0.1.5: - dependencies: - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 0.2.0 - which: 1.3.1 - global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 @@ -21778,8 +21830,6 @@ snapshots: glsl-optimizer-js@0.0.2: {} - glur@1.1.2: {} - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -22799,8 +22849,6 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.2.4 - is-windows@0.2.0: {} - is-windows@1.0.2: {} is-wsl@2.2.0: @@ -22973,19 +23021,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-dev-server@10.0.0: - dependencies: - chalk: 4.1.2 - cwd: 0.10.0 - find-process: 1.4.7 - prompts: 2.4.2 - spawnd: 10.0.0 - tree-kill: 1.2.2 - wait-on: 7.2.0 - transitivePeerDependencies: - - debug - - supports-color - jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -23036,18 +23071,6 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-environment-puppeteer@10.0.1(typescript@5.6.3): - dependencies: - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.6.3) - deepmerge: 4.3.1 - jest-dev-server: 10.0.0 - jest-environment-node: 29.7.0 - transitivePeerDependencies: - - debug - - supports-color - - typescript - jest-get-type@29.6.3: {} jest-haste-map@28.1.3: @@ -23082,18 +23105,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-image-snapshot@2.12.0(jest@29.7.0(@types/node@24.0.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.12(@swc/helpers@0.5.15))(@types/node@24.0.10)(typescript@5.6.3))): - dependencies: - chalk: 1.1.3 - get-stdin: 5.0.1 - glur: 1.1.2 - jest: 29.7.0(@types/node@24.0.10)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.4.12(@swc/helpers@0.5.15))(@types/node@24.0.10)(typescript@5.6.3)) - lodash: 4.17.21 - mkdirp: 0.5.6 - pixelmatch: 4.0.2 - pngjs: 3.4.0 - rimraf: 2.7.1 - jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 @@ -23153,16 +23164,6 @@ snapshots: optionalDependencies: jest-resolve: 29.7.0 - jest-puppeteer@10.0.1(puppeteer@22.6.2(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10))(typescript@5.6.3): - dependencies: - expect-puppeteer: 10.0.0 - jest-environment-puppeteer: 10.0.1(typescript@5.6.3) - puppeteer: 22.6.2(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - debug - - supports-color - - typescript - jest-regex-util@28.0.2: {} jest-regex-util@29.6.3: {} @@ -23362,6 +23363,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -23764,6 +23767,8 @@ snapshots: currently-unhandled: 0.4.1 signal-exit: 3.0.7 + loupe@3.2.1: {} + lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -23814,6 +23819,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@1.3.0: dependencies: pify: 3.0.0 @@ -25705,6 +25714,10 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + + pathval@2.0.1: {} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 @@ -25752,10 +25765,6 @@ snapshots: pirates@4.0.6: {} - pixelmatch@4.0.2: - dependencies: - pngjs: 3.4.0 - pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -25772,8 +25781,6 @@ snapshots: pluralize@1.2.1: {} - pngjs@3.4.0: {} - polygon-clipping@0.15.7: dependencies: robust-predicates: 3.0.2 @@ -27156,11 +27163,6 @@ snapshots: dependencies: resolve-from: 5.0.0 - resolve-dir@0.1.1: - dependencies: - expand-tilde: 1.2.2 - global-modules: 0.2.3 - resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 @@ -27658,6 +27660,8 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.1 + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -27907,11 +27911,6 @@ snapshots: sparkles@1.0.1: {} - spawnd@10.0.0: - dependencies: - signal-exit: 4.1.0 - tree-kill: 1.2.2 - spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -28001,6 +28000,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + static-extend@0.1.2: dependencies: define-property: 0.2.5 @@ -28171,6 +28172,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 @@ -28418,6 +28423,10 @@ snapshots: tiny-warning@1.0.3: {} + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.2) @@ -28427,6 +28436,10 @@ snapshots: tinyqueue@1.2.3: {} + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + tlds@1.260.0: {} tmp@0.0.33: @@ -29157,6 +29170,27 @@ snapshots: - supports-color - terser + vite-node@3.2.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0): + dependencies: + cac: 6.7.14 + debug: 4.4.1 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.0.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite@5.2.12(@types/node@14.18.33)(lightningcss@1.24.1)(terser@5.43.0): dependencies: esbuild: 0.20.2 @@ -29194,6 +29228,50 @@ snapshots: lightningcss: 1.24.1 terser: 5.43.0 + vitest@3.2.6(@edge-runtime/vm@2.1.2)(@types/debug@4.1.12)(@types/node@24.0.10)(jiti@1.21.7)(jsdom@20.0.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(lightningcss@1.24.1)(terser@5.43.0): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.6 + '@vitest/mocker': 3.2.6(vite@7.0.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0)) + '@vitest/pretty-format': 3.2.6 + '@vitest/runner': 3.2.6 + '@vitest/snapshot': 3.2.6 + '@vitest/spy': 3.2.6 + '@vitest/utils': 3.2.6 + chai: 5.3.3 + debug: 4.4.1 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.0.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0) + vite-node: 3.2.4(@types/node@24.0.10)(jiti@1.21.7)(lightningcss@1.24.1)(terser@5.43.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@edge-runtime/vm': 2.1.2 + '@types/debug': 4.1.12 + '@types/node': 24.0.10 + jsdom: 20.0.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vm2@3.9.19: dependencies: acorn: 8.15.0 @@ -29203,16 +29281,6 @@ snapshots: dependencies: xml-name-validator: 4.0.0 - wait-on@7.2.0: - dependencies: - axios: 1.6.8 - joi: 17.12.3 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.1 - transitivePeerDependencies: - - debug - walk-up-path@1.0.0: {} walker@1.0.8: @@ -29469,6 +29537,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wide-align@1.1.5: dependencies: string-width: 4.2.3