diff --git a/.eslintrc.cjs b/.eslintrc.cjs index c8b462f5..94c1c711 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -33,6 +33,7 @@ module.exports = { next: 'multiline-block-like', }, ], + // It's common for scripts to access `process.env` 'node/no-process-env': 'off', }, @@ -46,6 +47,18 @@ module.exports = { { files: ['*.test.ts'], extends: ['@metamask/eslint-config-jest'], + + settings: { + jest: { + // This package uses Vitest, but `@metamask/eslint-config-vitest` is + // only available for ESLint 9+. The Jest rules are similar enough, + // but we need to explicitly set the Jest version since we're not + // using the `jest` package directly. + // TODO: Remove this when migrating to + // `@metamask/eslint-config-vitest`. + version: 29, + }, + }, }, ], diff --git a/babel.config.cjs b/babel.config.cjs deleted file mode 100644 index e0d092a6..00000000 --- a/babel.config.cjs +++ /dev/null @@ -1,10 +0,0 @@ -// We use Babel to transpile down ESM dependencies to CommonJS for our tests -// using babel-jest. -module.exports = { - env: { - test: { - presets: ['@babel/preset-env', '@babel/preset-typescript'], - plugins: ['@babel/plugin-transform-modules-commonjs'] - } - } -}; diff --git a/jest.config.cjs b/jest.config.cjs deleted file mode 100644 index 44fbec75..00000000 --- a/jest.config.cjs +++ /dev/null @@ -1,237 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property and type check, visit: - * https://jestjs.io/docs/configuration - */ - -/** - * Dependencies that are ESM-only, and need to be transpiled by Babel. - * This list is used in the `transformIgnorePatterns` option below. - * - * You probably need to add a dependency to this list if the tests fail with something like: - * - `SyntaxError: Cannot use import statement outside a module` - * - `SyntaxError: Unexpected token 'export'` - * If so, identify the dependency that's causing the error via the stack trace, and add it - * to this list. - * - * No, we do not live in the best of all possible worlds. Why do you ask? - * - * For details on Jest's currently experimental ESM support see: https://github.com/jestjs/jest/issues/9430 - */ -const ESM_DEPENDENCIES = [ - 'execa', - 'strip-final-newline', - 'npm-run-path', - 'path-key', - 'onetime', - 'mimic-fn', - 'human-signals', - 'is-stream', - 'get-stream', -]; - -// This file needs to be .cjs for compatibility with jest-it-up. -module.exports = { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/private/var/folders/fk/c3y07g0576j8_2s9m01pk4qw0000gn/T/jest_dx", - - // Automatically clear mock calls, instances and results before every test. - // This does not remove any mock implementation that may have been provided, - // so we disable it. - // clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: true, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: ['./src/**/*.ts'], - - // The directory where Jest should output its coverage files - coverageDirectory: 'coverage', - - // An array of regexp pattern strings used to skip coverage collection - coveragePathIgnorePatterns: [ - '/node_modules/', - '/src/cli.ts', - '/src/command-line-arguments.ts', - ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: 'babel', - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: ['html', 'json-summary', 'text'], - - // An object that configures minimum threshold enforcement for coverage results - coverageThreshold: { - global: { - branches: 100, - functions: 100, - lines: 100, - statements: 100, - }, - }, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: { - // Strip the file extension from imports, so that e.g. `import { foo } from './foo.js'` - // becomes `import { foo } from './foo'`. This is for compatibility with ESM. - '^(\\.\\.?\\/.+)\\.js$': '$1', - }, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // Disabled in favor of babel-jest, configured via "transform" below. - // // A preset that is used as a base for Jest's configuration - // preset: 'ts-jest', - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // "resetMocks" resets all mocks, including mocked modules, to jest.fn(), - // between each test case. - resetMocks: true, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // "restoreMocks" restores all mocks created using jest.spyOn to their - // original implementations, between each test. It does not affect mocked - // modules. - restoreMocks: true, - - // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - setupFilesAfterEnv: ['./tests/setupAfterEnv.ts'], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // Reduce the default test timeout from 5s to 2.5s - testTimeout: 2500, - - // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href - // testURL: "http://localhost", - - // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", - - // A map from regular expressions to paths to transformers - transform: { - "\\.[jt]sx?$": "babel-jest" - }, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - transformIgnorePatterns: [`node_modules/(?!(${ESM_DEPENDENCIES.join('|')}))`], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -}; diff --git a/package.json b/package.json index caf575d9..ec159127 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ "lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write", "lint:misc": "prettier '**/*.json' '**/*.md' '!CHANGELOG.md' '**/*.yml' '!.yarnrc.yml' --ignore-path .gitignore --no-error-on-unmatched-pattern", "prepack": "./scripts/prepack.sh", - "test": "jest && jest-it-up --config jest.config.cjs", - "test:watch": "jest --watch" + "test": "vitest", + "test:watch": "vitest --watch" }, "dependencies": { "@metamask/action-utils": "^1.0.0", @@ -48,8 +48,6 @@ "@metamask/eslint-config-nodejs": "^10.0.0", "@metamask/eslint-config-typescript": "^10.0.0", "@types/debug": "^4.1.7", - "@types/jest": "^29.5.10", - "@types/jest-when": "^3.5.2", "@types/node": "^17.0.23", "@types/prettier": "^2.7.3", "@types/rimraf": "^4.0.5", @@ -58,6 +56,7 @@ "@types/yargs": "^17.0.10", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", + "@vitest/coverage-istanbul": "^3.0.7", "babel-jest": "^29.7.0", "deepmerge": "^4.2.2", "eslint": "^8.27.0", @@ -67,16 +66,17 @@ "eslint-plugin-jsdoc": "^39.6.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.2.1", - "jest": "^29.7.0", "jest-it-up": "^3.0.0", - "jest-when": "^3.5.2", "nanoid": "^3.3.4", "prettier": "^3.3.3", "prettier-plugin-packagejson": "^2.5.2", "rimraf": "^4.0.5", "stdio-mock": "^1.2.0", "tsx": "^4.6.1", - "typescript": "~5.1.6" + "typescript": "~5.1.6", + "vite": "^6.2.0", + "vitest": "^3.0.7", + "vitest-when": "^0.6.0" }, "peerDependencies": { "prettier": ">=3.0.0" @@ -92,7 +92,8 @@ "lavamoat": { "allowScripts": { "@lavamoat/preinstall-always-fail": false, - "tsx>esbuild": false + "tsx>esbuild": false, + "vite>esbuild": true } } } diff --git a/src/editor.test.ts b/src/editor.test.ts index 70b8a957..e0c2d37f 100644 --- a/src/editor.test.ts +++ b/src/editor.test.ts @@ -1,20 +1,20 @@ -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import { determineEditor } from './editor.js'; import * as envModule from './env.js'; import * as miscUtils from './misc-utils.js'; -jest.mock('./env'); -jest.mock('./misc-utils'); +vitest.mock('./env'); +vitest.mock('./misc-utils'); describe('editor', () => { describe('determineEditor', () => { it('returns information about the editor from EDITOR if it resolves to an executable', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: 'editor' }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) + when(vitest.spyOn(miscUtils, 'resolveExecutable')) .calledWith('editor') - .mockResolvedValue('/path/to/resolved-editor'); + .thenResolve('/path/to/resolved-editor'); expect(await determineEditor()).toStrictEqual({ path: '/path/to/resolved-editor', @@ -23,14 +23,14 @@ describe('editor', () => { }); it('falls back to VSCode if it exists and if EDITOR does not point to an executable', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: 'editor' }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) - .calledWith('editor') - .mockResolvedValue(null) + const resolveExecutableSpy = vitest.spyOn(miscUtils, 'resolveExecutable'); + when(resolveExecutableSpy).calledWith('editor').thenResolve(null); + when(resolveExecutableSpy) .calledWith('code') - .mockResolvedValue('/path/to/code'); + .thenResolve('/path/to/code'); expect(await determineEditor()).toStrictEqual({ path: '/path/to/code', @@ -39,75 +39,75 @@ describe('editor', () => { }); it('returns null if resolving EDITOR returns null and resolving VSCode returns null', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: 'editor' }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) - .calledWith('editor') - .mockResolvedValue(null) - .calledWith('code') - .mockResolvedValue(null); + const resolveExecutableSpy = vitest.spyOn(miscUtils, 'resolveExecutable'); + when(resolveExecutableSpy).calledWith('editor').thenResolve(null); + when(resolveExecutableSpy).calledWith('code').thenResolve(null); expect(await determineEditor()).toBeNull(); }); it('returns null if resolving EDITOR returns null and resolving VSCode throws', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: 'editor' }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) - .calledWith('editor') - .mockResolvedValue(null) + const resolveExecutableSpy = vitest.spyOn(miscUtils, 'resolveExecutable'); + when(resolveExecutableSpy).calledWith('editor').thenResolve(null); + when(resolveExecutableSpy) .calledWith('code') - .mockRejectedValue(new Error('some error')); + .thenReject(new Error('some error')); expect(await determineEditor()).toBeNull(); }); it('returns null if resolving EDITOR throws and resolving VSCode returns null', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: 'editor' }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) + const resolveExecutableSpy = vitest.spyOn(miscUtils, 'resolveExecutable'); + when(resolveExecutableSpy) .calledWith('editor') - .mockRejectedValue(new Error('some error')) - .calledWith('code') - .mockResolvedValue(null); + .thenReject(new Error('some error')); + when(resolveExecutableSpy).calledWith('code').thenResolve(null); expect(await determineEditor()).toBeNull(); }); it('returns null if resolving EDITOR throws and resolving VSCode throws', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: 'editor' }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) + const resolveExecutableSpy = vitest.spyOn(miscUtils, 'resolveExecutable'); + when(resolveExecutableSpy) .calledWith('editor') - .mockRejectedValue(new Error('some error')) + .thenReject(new Error('some error')); + when(resolveExecutableSpy) .calledWith('code') - .mockRejectedValue(new Error('some error')); + .thenReject(new Error('some error')); expect(await determineEditor()).toBeNull(); }); it('returns null if EDITOR is unset and resolving VSCode returns null', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) + when(vitest.spyOn(miscUtils, 'resolveExecutable')) .calledWith('code') - .mockResolvedValue(null); + .thenResolve(null); expect(await determineEditor()).toBeNull(); }); it('returns null if EDITOR is unset and resolving VSCode throws', async () => { - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(miscUtils, 'resolveExecutable')) + when(vitest.spyOn(miscUtils, 'resolveExecutable')) .calledWith('code') - .mockRejectedValue(new Error('some error')); + .thenReject(new Error('some error')); expect(await determineEditor()).toBeNull(); }); diff --git a/src/fs.test.ts b/src/fs.test.ts index 474a6039..cdcb8fc2 100644 --- a/src/fs.test.ts +++ b/src/fs.test.ts @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import { rimraf } from 'rimraf'; -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import * as actionUtils from '@metamask/action-utils'; import { withSandbox } from '../tests/helpers.js'; import { @@ -14,7 +14,7 @@ import { removeFile, } from './fs.js'; -jest.mock('@metamask/action-utils'); +vitest.mock('@metamask/action-utils'); describe('fs', () => { describe('readFile', () => { @@ -77,9 +77,9 @@ describe('fs', () => { describe('readJsonObjectFile', () => { it('uses readJsonObjectFile from @metamask/action-utils to parse the contents of the given JSON file as an object', async () => { const filePath = '/some/file'; - when(jest.spyOn(actionUtils, 'readJsonObjectFile')) + when(vitest.spyOn(actionUtils, 'readJsonObjectFile')) .calledWith(filePath) - .mockResolvedValue({ some: 'object' }); + .thenResolve({ some: 'object' }); expect(await readJsonObjectFile(filePath)).toStrictEqual({ some: 'object', @@ -89,9 +89,9 @@ describe('fs', () => { it('re-throws any error that occurs as a new error that points to the original', async () => { const filePath = '/some/file'; const error = new Error('oops'); - when(jest.spyOn(actionUtils, 'readJsonObjectFile')) + when(vitest.spyOn(actionUtils, 'readJsonObjectFile')) .calledWith(filePath) - .mockRejectedValue(error); + .thenReject(error); await expect(readJsonObjectFile(filePath)).rejects.toThrow( expect.objectContaining({ @@ -105,9 +105,9 @@ describe('fs', () => { describe('writeJsonFile', () => { it('uses writeJsonFile from @metamask/action-utils to write the given object to the given file as JSON', async () => { const filePath = '/some/file'; - when(jest.spyOn(actionUtils, 'writeJsonFile')) + when(vitest.spyOn(actionUtils, 'writeJsonFile')) .calledWith(filePath, { some: 'object' }) - .mockResolvedValue(undefined); + .thenResolve(undefined); expect(await writeJsonFile(filePath, { some: 'object' })).toBeUndefined(); }); @@ -115,9 +115,9 @@ describe('fs', () => { it('re-throws any error that occurs as a new error that points to the original', async () => { const filePath = '/some/file'; const error = new Error('oops'); - when(jest.spyOn(actionUtils, 'writeJsonFile')) + when(vitest.spyOn(actionUtils, 'writeJsonFile')) .calledWith(filePath, { some: 'object' }) - .mockRejectedValue(error); + .thenReject(error); await expect(writeJsonFile(filePath, { some: 'object' })).rejects.toThrow( expect.objectContaining({ @@ -160,9 +160,9 @@ describe('fs', () => { const error: any = new Error('oops'); error.code = 'ESOMETHING'; error.stack = 'some stack'; - when(jest.spyOn(fs.promises, 'stat')) + when(vitest.spyOn(fs.promises, 'stat')) .calledWith(entryPath) - .mockRejectedValue(error); + .thenReject(error); await expect(fileExists(entryPath)).rejects.toThrow( expect.objectContaining({ @@ -175,9 +175,9 @@ describe('fs', () => { it('re-throws any error that occurs as a new error that points to the original', async () => { const entryPath = '/some/file'; const error = new Error('oops'); - when(jest.spyOn(fs.promises, 'stat')) + when(vitest.spyOn(fs.promises, 'stat')) .calledWith(entryPath) - .mockRejectedValue(error); + .thenReject(error); await expect(fileExists(entryPath)).rejects.toThrow( expect.objectContaining({ @@ -202,15 +202,15 @@ describe('fs', () => { await expect( fs.promises.readdir(path.join(sandbox.directoryPath, 'foo')), - ).toResolve(); + ).toBeDefined(); await expect( fs.promises.readdir(path.join(sandbox.directoryPath, 'foo', 'bar')), - ).toResolve(); + ).toBeDefined(); await expect( fs.promises.readdir( path.join(sandbox.directoryPath, 'foo', 'bar', 'baz'), ), - ).toResolve(); + ).toBeDefined(); }); }); @@ -228,16 +228,16 @@ describe('fs', () => { path.join(sandbox.directoryPath, 'foo', 'bar', 'baz'), ); - await expect(ensureDirectoryPathExists(directoryPath)).toResolve(); + await expect(ensureDirectoryPathExists(directoryPath)).toBeDefined(); }); }); it('re-throws any error that occurs, assigning it the same code, a wrapped message, and a new stack', async () => { const directoryPath = '/some/directory'; const error = new Error('oops'); - when(jest.spyOn(fs.promises, 'mkdir')) + when(vitest.spyOn(fs.promises, 'mkdir')) .calledWith(directoryPath, { recursive: true }) - .mockRejectedValue(error); + .thenReject(error); await expect(ensureDirectoryPathExists(directoryPath)).rejects.toThrow( expect.objectContaining({ @@ -268,9 +268,9 @@ describe('fs', () => { it('re-throws any error that occurs, assigning it the same code, a wrapped message, and a new stack', async () => { const filePath = '/some/file'; const error = new Error('oops'); - when(jest.spyOn(fs.promises, 'rm')) + when(vitest.spyOn(fs.promises, 'rm')) .calledWith(filePath, { force: true }) - .mockRejectedValue(error); + .thenReject(error); await expect(removeFile(filePath)).rejects.toThrow( expect.objectContaining({ diff --git a/src/functional.test.ts b/src/functional.test.ts index 7e6d85fe..cb3345d3 100644 --- a/src/functional.test.ts +++ b/src/functional.test.ts @@ -1,306 +1,316 @@ import { withMonorepoProjectEnvironment } from '../tests/functional/helpers/with.js'; import { buildChangelog } from '../tests/helpers.js'; -jest.setTimeout(10_000); - -describe('create-release-branch (functional)', () => { - describe('against a monorepo with independent versions', () => { - it('bumps the ordinary part of the root package and updates the versions of the specified packages according to the release spec', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { - name: '@scope/a', - version: '0.1.2', - directoryPath: 'packages/a', - }, - b: { - name: '@scope/b', - version: '1.1.4', - directoryPath: 'packages/b', - }, - c: { - name: '@scope/c', - version: '2.0.13', - directoryPath: 'packages/c', +describe( + // This is valid with Vitest. + // TODO: Remove this when migrating to `@metamask/eslint-config-vitest`. + // eslint-disable-next-line jest/valid-describe-callback + 'create-release-branch (functional)', + { + timeout: 10_000, + }, + () => { + describe('against a monorepo with independent versions', () => { + it('bumps the ordinary part of the root package and updates the versions of the specified packages according to the release spec', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '0.1.2', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.1.4', + directoryPath: 'packages/b', + }, + c: { + name: '@scope/c', + version: '2.0.13', + directoryPath: 'packages/c', + }, + d: { + name: '@scope/d', + version: '1.2.3', + directoryPath: 'packages/d', + }, }, - d: { - name: '@scope/d', - version: '1.2.3', - directoryPath: 'packages/d', + workspaces: { + '.': ['packages/*'], }, }, - workspaces: { - '.': ['packages/*'], - }, - }, - async (environment) => { - await environment.updateJsonFile('package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('a', 'package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('b', 'package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('c', 'package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('d', 'package.json', { - scripts: { - foo: 'bar', - }, - }); - - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', - b: 'minor', - c: 'patch', - d: '1.2.4', + async (environment) => { + await environment.updateJsonFile('package.json', { + scripts: { + foo: 'bar', }, - }, - }); - - expect(await environment.readJsonFile('package.json')).toStrictEqual({ - name: '@scope/monorepo', - version: '2.0.0', - private: true, - workspaces: ['packages/*'], - scripts: { foo: 'bar' }, - packageManager: 'yarn@3.2.1', - }); - expect( - await environment.readJsonFileWithinPackage('a', 'package.json'), - ).toStrictEqual({ - name: '@scope/a', - version: '1.0.0', - scripts: { foo: 'bar' }, - }); - expect( - await environment.readJsonFileWithinPackage('b', 'package.json'), - ).toStrictEqual({ - name: '@scope/b', - version: '1.2.0', - scripts: { foo: 'bar' }, - }); - expect( - await environment.readJsonFileWithinPackage('c', 'package.json'), - ).toStrictEqual({ - name: '@scope/c', - version: '2.0.14', - scripts: { foo: 'bar' }, - }); - expect( - await environment.readJsonFileWithinPackage('d', 'package.json'), - ).toStrictEqual({ - name: '@scope/d', - version: '1.2.4', - scripts: { foo: 'bar' }, - }); - }, - ); - }); + }); + await environment.updateJsonFileWithinPackage('a', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + await environment.updateJsonFileWithinPackage('b', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + await environment.updateJsonFileWithinPackage('c', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + await environment.updateJsonFileWithinPackage('d', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + b: 'minor', + c: 'patch', + d: '1.2.4', + }, + }, + }); - it('bumps the backport part of the root package and updates the versions of the specified packages according to the release spec if --backport is provided', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { + expect( + await environment.readJsonFile('package.json'), + ).toStrictEqual({ name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { + version: '2.0.0', + private: true, + workspaces: ['packages/*'], + scripts: { foo: 'bar' }, + packageManager: 'yarn@3.2.1', + }); + expect( + await environment.readJsonFileWithinPackage('a', 'package.json'), + ).toStrictEqual({ name: '@scope/a', - version: '0.1.2', - directoryPath: 'packages/a', - }, - b: { + version: '1.0.0', + scripts: { foo: 'bar' }, + }); + expect( + await environment.readJsonFileWithinPackage('b', 'package.json'), + ).toStrictEqual({ name: '@scope/b', - version: '1.1.4', - directoryPath: 'packages/b', - }, - c: { + version: '1.2.0', + scripts: { foo: 'bar' }, + }); + expect( + await environment.readJsonFileWithinPackage('c', 'package.json'), + ).toStrictEqual({ name: '@scope/c', - version: '2.0.13', - directoryPath: 'packages/c', - }, - d: { + version: '2.0.14', + scripts: { foo: 'bar' }, + }); + expect( + await environment.readJsonFileWithinPackage('d', 'package.json'), + ).toStrictEqual({ name: '@scope/d', - version: '1.2.3', - directoryPath: 'packages/d', - }, - }, - workspaces: { - '.': ['packages/*'], + version: '1.2.4', + scripts: { foo: 'bar' }, + }); }, - }, - async (environment) => { - await environment.updateJsonFile('package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('a', 'package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('b', 'package.json', { - scripts: { - foo: 'bar', - }, - }); - await environment.updateJsonFileWithinPackage('c', 'package.json', { - scripts: { - foo: 'bar', + ); + }); + + it('bumps the backport part of the root package and updates the versions of the specified packages according to the release spec if --backport is provided', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '0.1.2', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.1.4', + directoryPath: 'packages/b', + }, + c: { + name: '@scope/c', + version: '2.0.13', + directoryPath: 'packages/c', + }, + d: { + name: '@scope/d', + version: '1.2.3', + directoryPath: 'packages/d', + }, }, - }); - await environment.updateJsonFileWithinPackage('d', 'package.json', { - scripts: { - foo: 'bar', + workspaces: { + '.': ['packages/*'], }, - }); - - await environment.runTool({ - args: ['--backport'], - releaseSpecification: { - packages: { - a: 'major', - b: 'minor', - c: 'patch', - d: '1.2.4', + }, + async (environment) => { + await environment.updateJsonFile('package.json', { + scripts: { + foo: 'bar', }, - }, - }); - - expect(await environment.readJsonFile('package.json')).toStrictEqual({ - name: '@scope/monorepo', - version: '1.1.0', - private: true, - workspaces: ['packages/*'], - scripts: { foo: 'bar' }, - packageManager: 'yarn@3.2.1', - }); - expect( - await environment.readJsonFileWithinPackage('a', 'package.json'), - ).toStrictEqual({ - name: '@scope/a', - version: '1.0.0', - scripts: { foo: 'bar' }, - }); - expect( - await environment.readJsonFileWithinPackage('b', 'package.json'), - ).toStrictEqual({ - name: '@scope/b', - version: '1.2.0', - scripts: { foo: 'bar' }, - }); - expect( - await environment.readJsonFileWithinPackage('c', 'package.json'), - ).toStrictEqual({ - name: '@scope/c', - version: '2.0.14', - scripts: { foo: 'bar' }, - }); - expect( - await environment.readJsonFileWithinPackage('d', 'package.json'), - ).toStrictEqual({ - name: '@scope/d', - version: '1.2.4', - scripts: { foo: 'bar' }, - }); - }, - ); - }); + }); + await environment.updateJsonFileWithinPackage('a', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + await environment.updateJsonFileWithinPackage('b', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + await environment.updateJsonFileWithinPackage('c', 'package.json', { + scripts: { + foo: 'bar', + }, + }); + await environment.updateJsonFileWithinPackage('d', 'package.json', { + scripts: { + foo: 'bar', + }, + }); - it("updates each of the specified packages' changelogs by adding a new section which lists all commits concerning the package over the entire history of the repo", async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { + await environment.runTool({ + args: ['--backport'], + releaseSpecification: { + packages: { + a: 'major', + b: 'minor', + c: 'patch', + d: '1.2.4', + }, + }, + }); + + expect( + await environment.readJsonFile('package.json'), + ).toStrictEqual({ name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { + version: '1.1.0', + private: true, + workspaces: ['packages/*'], + scripts: { foo: 'bar' }, + packageManager: 'yarn@3.2.1', + }); + expect( + await environment.readJsonFileWithinPackage('a', 'package.json'), + ).toStrictEqual({ name: '@scope/a', version: '1.0.0', - directoryPath: 'packages/a', - }, - b: { + scripts: { foo: 'bar' }, + }); + expect( + await environment.readJsonFileWithinPackage('b', 'package.json'), + ).toStrictEqual({ name: '@scope/b', - version: '1.0.0', - directoryPath: 'packages/b', - }, + version: '1.2.0', + scripts: { foo: 'bar' }, + }); + expect( + await environment.readJsonFileWithinPackage('c', 'package.json'), + ).toStrictEqual({ + name: '@scope/c', + version: '2.0.14', + scripts: { foo: 'bar' }, + }); + expect( + await environment.readJsonFileWithinPackage('d', 'package.json'), + ).toStrictEqual({ + name: '@scope/d', + version: '1.2.4', + scripts: { foo: 'bar' }, + }); }, - workspaces: { - '.': ['packages/*'], + ); + }); + + it("updates each of the specified packages' changelogs by adding a new section which lists all commits concerning the package over the entire history of the repo", async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '1.0.0', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.0.0', + directoryPath: 'packages/b', + }, + }, + workspaces: { + '.': ['packages/*'], + }, + createInitialCommit: false, }, - createInitialCommit: false, - }, - async (environment) => { - // Create an initial commit - await environment.writeFileWithinPackage( - 'a', - 'CHANGELOG.md', - buildChangelog(` + async (environment) => { + // Create an initial commit + await environment.writeFileWithinPackage( + 'a', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] [Unreleased]: https://github.com/example-org/example-repo `), - ); - await environment.writeFileWithinPackage( - 'b', - 'CHANGELOG.md', - buildChangelog(` + ); + await environment.writeFileWithinPackage( + 'b', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] [Unreleased]: https://github.com/example-org/example-repo `), - ); - await environment.createCommit('Initial commit'); - - // Create another commit that only changes "a" - await environment.writeFileWithinPackage( - 'a', - 'dummy.txt', - 'Some content', - ); - await environment.createCommit('Update "a"'); - - // Run the tool - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', - b: 'major', + ); + await environment.createCommit('Initial commit'); + + // Create another commit that only changes "a" + await environment.writeFileWithinPackage( + 'a', + 'dummy.txt', + 'Some content', + ); + await environment.createCommit('Update "a"'); + + // Run the tool + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + b: 'major', + }, }, - }, - }); - - // Both changelogs should get updated, with an additional - // commit listed for "a" - expect( - await environment.readFileWithinPackage('a', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + }); + + // Both changelogs should get updated, with an additional + // commit listed for "a" + expect( + await environment.readFileWithinPackage('a', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [2.0.0] @@ -313,11 +323,11 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/a@2.0.0...HEAD [2.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/a@2.0.0 `), - ); - expect( - await environment.readFileWithinPackage('b', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + ); + expect( + await environment.readFileWithinPackage('b', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [2.0.0] @@ -329,42 +339,42 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/b@2.0.0...HEAD [2.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/b@2.0.0 `), - ); - }, - ); - }); - - it('updates package changelogs with package changes since the last package release', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { - name: '@scope/a', - version: '1.0.0', - directoryPath: 'packages/a', + ); + }, + ); + }); + + it('updates package changelogs with package changes since the last package release', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '1.0.0', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.0.0', + directoryPath: 'packages/b', + }, }, - b: { - name: '@scope/b', - version: '1.0.0', - directoryPath: 'packages/b', + workspaces: { + '.': ['packages/*'], }, + createInitialCommit: false, }, - workspaces: { - '.': ['packages/*'], - }, - createInitialCommit: false, - }, - async (environment) => { - // Create an initial commit - await environment.writeFileWithinPackage( - 'a', - 'CHANGELOG.md', - buildChangelog(` + async (environment) => { + // Create an initial commit + await environment.writeFileWithinPackage( + 'a', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] ## [1.0.0] @@ -376,11 +386,11 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/a@1.0.0...HEAD [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/a@1.0.0 `), - ); - await environment.writeFileWithinPackage( - 'b', - 'CHANGELOG.md', - buildChangelog(` + ); + await environment.writeFileWithinPackage( + 'b', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] ## [1.0.0] @@ -392,34 +402,34 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/b@1.0.0...HEAD [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/b@1.0.0 `), - ); - await environment.createCommit('Initial commit'); - await environment.runCommand('git', ['tag', '@scope/a@1.0.0']); - await environment.runCommand('git', ['tag', '@scope/b@1.0.0']); - await environment.runCommand('git', ['tag', 'v1.0.0']); - - // Create another commit that only changes "a" - await environment.writeFileWithinPackage( - 'a', - 'dummy.txt', - 'Some content', - ); - await environment.createCommit('Update "a"'); - - // Run the tool - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', + ); + await environment.createCommit('Initial commit'); + await environment.runCommand('git', ['tag', '@scope/a@1.0.0']); + await environment.runCommand('git', ['tag', '@scope/b@1.0.0']); + await environment.runCommand('git', ['tag', 'v1.0.0']); + + // Create another commit that only changes "a" + await environment.writeFileWithinPackage( + 'a', + 'dummy.txt', + 'Some content', + ); + await environment.createCommit('Update "a"'); + + // Run the tool + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + }, }, - }, - }); + }); - // Only "a" should be updated - expect( - await environment.readFileWithinPackage('a', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + // Only "a" should be updated + expect( + await environment.readFileWithinPackage('a', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [2.0.0] @@ -438,11 +448,11 @@ describe('create-release-branch (functional)', () => { [2.0.0]: https://github.com/example-org/example-repo/compare/@scope/a@1.0.0...@scope/a@2.0.0 [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/a@1.0.0 `), - ); - expect( - await environment.readFileWithinPackage('b', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + ); + expect( + await environment.readFileWithinPackage('b', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [1.0.0] @@ -454,51 +464,51 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/b@1.0.0...HEAD [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/b@1.0.0 `), - ); - }, - ); - }); - - it('updates package changelogs with package changes since the last root release if this is the first package release', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { - name: '@scope/a', - version: '0.0.0', - directoryPath: 'packages/a', + ); + }, + ); + }); + + it('updates package changelogs with package changes since the last root release if this is the first package release', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '0.0.0', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.0.0', + directoryPath: 'packages/b', + }, }, - b: { - name: '@scope/b', - version: '1.0.0', - directoryPath: 'packages/b', + workspaces: { + '.': ['packages/*'], }, + createInitialCommit: false, }, - workspaces: { - '.': ['packages/*'], - }, - createInitialCommit: false, - }, - async (environment) => { - // Create an initial commit - await environment.writeFileWithinPackage( - 'a', - 'CHANGELOG.md', - buildChangelog(` + async (environment) => { + // Create an initial commit + await environment.writeFileWithinPackage( + 'a', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] [Unreleased]: https://github.com/example-org/example-repo `), - ); - await environment.writeFileWithinPackage( - 'b', - 'CHANGELOG.md', - buildChangelog(` + ); + await environment.writeFileWithinPackage( + 'b', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] ## [1.0.0] @@ -510,33 +520,33 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/b@1.0.0...HEAD [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/b@1.0.0 `), - ); - await environment.createCommit('Initial commit'); - await environment.runCommand('git', ['tag', '@scope/b@1.0.0']); - await environment.runCommand('git', ['tag', 'v1.0.0']); - - // Create another commit that only changes "a" - await environment.writeFileWithinPackage( - 'a', - 'dummy.txt', - 'Some content', - ); - await environment.createCommit('Update "a"'); - - // Run the tool - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', + ); + await environment.createCommit('Initial commit'); + await environment.runCommand('git', ['tag', '@scope/b@1.0.0']); + await environment.runCommand('git', ['tag', 'v1.0.0']); + + // Create another commit that only changes "a" + await environment.writeFileWithinPackage( + 'a', + 'dummy.txt', + 'Some content', + ); + await environment.createCommit('Update "a"'); + + // Run the tool + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + }, }, - }, - }); + }); - // Only "a" should be updated - expect( - await environment.readFileWithinPackage('a', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + // Only "a" should be updated + expect( + await environment.readFileWithinPackage('a', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [1.0.0] @@ -548,11 +558,11 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/a@1.0.0...HEAD [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/a@1.0.0 `), - ); - expect( - await environment.readFileWithinPackage('b', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + ); + expect( + await environment.readFileWithinPackage('b', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [1.0.0] @@ -564,115 +574,115 @@ describe('create-release-branch (functional)', () => { [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/b@1.0.0...HEAD [1.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/b@1.0.0 `), - ); - }, - ); - }); - - it('switches to a new release branch and commits the changes', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', + ); + }, + ); + }); + + it('switches to a new release branch and commits the changes', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '1.0.0', + directoryPath: 'packages/a', + }, }, - a: { - name: '@scope/a', - version: '1.0.0', - directoryPath: 'packages/a', + workspaces: { + '.': ['packages/*'], }, }, - workspaces: { - '.': ['packages/*'], - }, - }, - async (environment) => { - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', + async (environment) => { + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + }, }, - }, - }); - - // Tests five things: - // * The latest commit should be called "Update Release 2.0.0" - // * The before latest commit should be called "Initialize Release 2.0.0" - // * The latest commit should be the current commit (HEAD) - // * The latest branch should be called "release/2.0.0" - // * The latest branch should point to the latest commit - const latestCommitsInReverse = ( - await environment.runCommand('git', [ - 'log', - '--pretty=%s%x09%H%x09%D', - '--date-order', - '--max-count=2', - ]) - ).stdout - .split('\n') - .map((line) => { - const [subject, commitId, revsMarker] = line.split('\x09'); - const revs = revsMarker.split(' -> '); - return { subject, commitId, revs }; }); - const latestBranchCommitId = ( - await environment.runCommand('git', [ - 'rev-list', - '--branches', - '--date-order', - '--max-count=1', - ]) - ).stdout; - expect(latestCommitsInReverse[0].subject).toBe( - 'Update Release 2.0.0', - ); - expect(latestCommitsInReverse[1].subject).toBe( - 'Initialize Release 2.0.0', - ); - - expect(latestCommitsInReverse[0].revs).toContain('HEAD'); - expect(latestCommitsInReverse[0].revs).toContain('release/2.0.0'); - - expect(latestBranchCommitId).toStrictEqual( - latestCommitsInReverse[0].commitId, - ); - }, - ); - }); - it('updates the dependency version in package "b" when package "a" version is bumped', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { - name: '@scope/a', - version: '1.0.0', - directoryPath: 'packages/a', + // Tests five things: + // * The latest commit should be called "Update Release 2.0.0" + // * The before latest commit should be called "Initialize Release 2.0.0" + // * The latest commit should be the current commit (HEAD) + // * The latest branch should be called "release/2.0.0" + // * The latest branch should point to the latest commit + const latestCommitsInReverse = ( + await environment.runCommand('git', [ + 'log', + '--pretty=%s%x09%H%x09%D', + '--date-order', + '--max-count=2', + ]) + ).stdout + .split('\n') + .map((line) => { + const [subject, commitId, revsMarker] = line.split('\x09'); + const revs = revsMarker.split(' -> '); + return { subject, commitId, revs }; + }); + const latestBranchCommitId = ( + await environment.runCommand('git', [ + 'rev-list', + '--branches', + '--date-order', + '--max-count=1', + ]) + ).stdout; + expect(latestCommitsInReverse[0].subject).toBe( + 'Update Release 2.0.0', + ); + expect(latestCommitsInReverse[1].subject).toBe( + 'Initialize Release 2.0.0', + ); + + expect(latestCommitsInReverse[0].revs).toContain('HEAD'); + expect(latestCommitsInReverse[0].revs).toContain('release/2.0.0'); + + expect(latestBranchCommitId).toStrictEqual( + latestCommitsInReverse[0].commitId, + ); + }, + ); + }); + + it('updates the dependency version in package "b" when package "a" version is bumped', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '1.0.0', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '2.0.0', + directoryPath: 'packages/b', + }, }, - b: { - name: '@scope/b', - version: '2.0.0', - directoryPath: 'packages/b', + workspaces: { + '.': ['packages/*'], }, }, - workspaces: { - '.': ['packages/*'], - }, - }, - async (environment) => { - await environment.updateJsonFileWithinPackage('b', 'package.json', { - dependencies: { - '@scope/a': '1.0.0', - }, - }); - const constraintsProContent = ` + async (environment) => { + await environment.updateJsonFileWithinPackage('b', 'package.json', { + dependencies: { + '@scope/a': '1.0.0', + }, + }); + const constraintsProContent = ` % All packages must have a name and version defined. \\+ gen_enforced_field(_, 'name', null). \\+ gen_enforced_field(_, 'version', null). @@ -722,64 +732,67 @@ describe('create-release-branch (functional)', () => { set_package_json(Pkg, 'dependencies', DepPkg, DepVersion). `; - await environment.writeFile('constraints.pro', constraintsProContent); - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', - b: 'intentionally-skip', + await environment.writeFile( + 'constraints.pro', + constraintsProContent, + ); + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + b: 'intentionally-skip', + }, }, - }, - }); - - expect( - await environment.readJsonFileWithinPackage('a', 'package.json'), - ).toStrictEqual({ - name: '@scope/a', - version: '2.0.0', - }); - expect( - await environment.readJsonFileWithinPackage('b', 'package.json'), - ).toStrictEqual({ - name: '@scope/b', - version: '2.0.0', - dependencies: { '@scope/a': '^2.0.0' }, - }); - }, - ); - }); + }); - it('updates the yarn lock file', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { + expect( + await environment.readJsonFileWithinPackage('a', 'package.json'), + ).toStrictEqual({ name: '@scope/a', - version: '1.0.0', - directoryPath: 'packages/a', - }, - b: { + version: '2.0.0', + }); + expect( + await environment.readJsonFileWithinPackage('b', 'package.json'), + ).toStrictEqual({ name: '@scope/b', version: '2.0.0', - directoryPath: 'packages/b', - }, - }, - workspaces: { - '.': ['packages/*'], + dependencies: { '@scope/a': '^2.0.0' }, + }); }, - }, - async (environment) => { - await environment.updateJsonFileWithinPackage('b', 'package.json', { - dependencies: { - '@scope/a': '1.0.0', + ); + }); + + it('updates the yarn lock file', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '1.0.0', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '2.0.0', + directoryPath: 'packages/b', + }, + }, + workspaces: { + '.': ['packages/*'], }, - }); - const constraintsProContent = ` + }, + async (environment) => { + await environment.updateJsonFileWithinPackage('b', 'package.json', { + dependencies: { + '@scope/a': '1.0.0', + }, + }); + const constraintsProContent = ` % All packages must have a name and version defined. \\+ gen_enforced_field(_, 'name', null). \\+ gen_enforced_field(_, 'version', null). @@ -828,8 +841,11 @@ describe('create-release-branch (functional)', () => { Pkg \\= DepPkg, % Ensure we do not add self-dependency set_package_json(Pkg, 'dependencies', DepPkg, DepVersion). `; - await environment.writeFile('constraints.pro', constraintsProContent); - const outdatedLockfile = ` + await environment.writeFile( + 'constraints.pro', + constraintsProContent, + ); + const outdatedLockfile = ` # This file is generated by running "yarn install" inside your project. # Manual changes might be lost - proceed with caution! @@ -855,17 +871,17 @@ describe('create-release-branch (functional)', () => { resolution: "@scope/monorepo@workspace:." languageName: unknown linkType: soft`; - await environment.writeFile('yarn.lock', outdatedLockfile); - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', - b: 'intentionally-skip', + await environment.writeFile('yarn.lock', outdatedLockfile); + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + b: 'intentionally-skip', + }, }, - }, - }); + }); - const updatedLockfile = `# This file is generated by running "yarn install" inside your project. + const updatedLockfile = `# This file is generated by running "yarn install" inside your project. # Manual changes might be lost - proceed with caution! __metadata: @@ -892,164 +908,166 @@ __metadata: linkType: soft `; - expect(await environment.readFile('yarn.lock')).toStrictEqual( - updatedLockfile, - ); - }, - ); - }); + expect(await environment.readFile('yarn.lock')).toStrictEqual( + updatedLockfile, + ); + }, + ); + }); + + it('does not update the versions of any packages that have been tagged with intentionally-skip', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '0.1.2', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.1.4', + directoryPath: 'packages/b', + }, + c: { + name: '@scope/c', + version: '2.0.13', + directoryPath: 'packages/c', + }, + d: { + name: '@scope/d', + version: '1.2.3', + directoryPath: 'packages/d', + }, + }, + workspaces: { + '.': ['packages/*'], + }, + }, + async (environment) => { + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + b: 'intentionally-skip', + c: 'patch', + d: 'intentionally-skip', + }, + }, + }); - it('does not update the versions of any packages that have been tagged with intentionally-skip', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { + expect( + await environment.readJsonFile('package.json'), + ).toStrictEqual({ name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { + version: '2.0.0', + private: true, + workspaces: ['packages/*'], + packageManager: 'yarn@3.2.1', + }); + expect( + await environment.readJsonFileWithinPackage('a', 'package.json'), + ).toStrictEqual({ name: '@scope/a', - version: '0.1.2', - directoryPath: 'packages/a', - }, - b: { + version: '1.0.0', + }); + expect( + await environment.readJsonFileWithinPackage('b', 'package.json'), + ).toStrictEqual({ name: '@scope/b', version: '1.1.4', - directoryPath: 'packages/b', - }, - c: { + }); + expect( + await environment.readJsonFileWithinPackage('c', 'package.json'), + ).toStrictEqual({ name: '@scope/c', - version: '2.0.13', - directoryPath: 'packages/c', - }, - d: { + version: '2.0.14', + }); + expect( + await environment.readJsonFileWithinPackage('d', 'package.json'), + ).toStrictEqual({ name: '@scope/d', version: '1.2.3', - directoryPath: 'packages/d', - }, - }, - workspaces: { - '.': ['packages/*'], + }); }, - }, - async (environment) => { - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', - b: 'intentionally-skip', - c: 'patch', - d: 'intentionally-skip', + ); + }); + + it('does not update the changelogs of any packages that have been tagged with intentionally-skip', async () => { + await withMonorepoProjectEnvironment( + { + packages: { + $root$: { + name: '@scope/monorepo', + version: '1.0.0', + directoryPath: '.', + }, + a: { + name: '@scope/a', + version: '1.0.0', + directoryPath: 'packages/a', + }, + b: { + name: '@scope/b', + version: '1.0.0', + directoryPath: 'packages/b', }, }, - }); - - expect(await environment.readJsonFile('package.json')).toStrictEqual({ - name: '@scope/monorepo', - version: '2.0.0', - private: true, - workspaces: ['packages/*'], - packageManager: 'yarn@3.2.1', - }); - expect( - await environment.readJsonFileWithinPackage('a', 'package.json'), - ).toStrictEqual({ - name: '@scope/a', - version: '1.0.0', - }); - expect( - await environment.readJsonFileWithinPackage('b', 'package.json'), - ).toStrictEqual({ - name: '@scope/b', - version: '1.1.4', - }); - expect( - await environment.readJsonFileWithinPackage('c', 'package.json'), - ).toStrictEqual({ - name: '@scope/c', - version: '2.0.14', - }); - expect( - await environment.readJsonFileWithinPackage('d', 'package.json'), - ).toStrictEqual({ - name: '@scope/d', - version: '1.2.3', - }); - }, - ); - }); - - it('does not update the changelogs of any packages that have been tagged with intentionally-skip', async () => { - await withMonorepoProjectEnvironment( - { - packages: { - $root$: { - name: '@scope/monorepo', - version: '1.0.0', - directoryPath: '.', - }, - a: { - name: '@scope/a', - version: '1.0.0', - directoryPath: 'packages/a', + workspaces: { + '.': ['packages/*'], }, - b: { - name: '@scope/b', - version: '1.0.0', - directoryPath: 'packages/b', - }, - }, - workspaces: { - '.': ['packages/*'], + createInitialCommit: false, }, - createInitialCommit: false, - }, - async (environment) => { - // Create an initial commit - await environment.writeFileWithinPackage( - 'a', - 'CHANGELOG.md', - buildChangelog(` + async (environment) => { + // Create an initial commit + await environment.writeFileWithinPackage( + 'a', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] [Unreleased]: https://github.com/example-org/example-repo `), - ); - await environment.writeFileWithinPackage( - 'b', - 'CHANGELOG.md', - buildChangelog(` + ); + await environment.writeFileWithinPackage( + 'b', + 'CHANGELOG.md', + buildChangelog(` ## [Unreleased] [Unreleased]: https://github.com/example-org/example-repo `), - ); - await environment.createCommit('Initial commit'); - - // Create another commit that only changes "a" - await environment.writeFileWithinPackage( - 'a', - 'dummy.txt', - 'Some content', - ); - await environment.createCommit('Update "a"'); - - // Run the tool - await environment.runTool({ - releaseSpecification: { - packages: { - a: 'major', - b: 'intentionally-skip', + ); + await environment.createCommit('Initial commit'); + + // Create another commit that only changes "a" + await environment.writeFileWithinPackage( + 'a', + 'dummy.txt', + 'Some content', + ); + await environment.createCommit('Update "a"'); + + // Run the tool + await environment.runTool({ + releaseSpecification: { + packages: { + a: 'major', + b: 'intentionally-skip', + }, }, - }, - }); + }); - // Only "a" should get updated - expect( - await environment.readFileWithinPackage('a', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + // Only "a" should get updated + expect( + await environment.readFileWithinPackage('a', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] ## [2.0.0] @@ -1062,18 +1080,19 @@ __metadata: [Unreleased]: https://github.com/example-org/example-repo/compare/@scope/a@2.0.0...HEAD [2.0.0]: https://github.com/example-org/example-repo/releases/tag/@scope/a@2.0.0 `), - ); - expect( - await environment.readFileWithinPackage('b', 'CHANGELOG.md'), - ).toStrictEqual( - buildChangelog(` + ); + expect( + await environment.readFileWithinPackage('b', 'CHANGELOG.md'), + ).toStrictEqual( + buildChangelog(` ## [Unreleased] [Unreleased]: https://github.com/example-org/example-repo `), - ); - }, - ); + ); + }, + ); + }); }); - }); -}); + }, +); diff --git a/src/initial-parameters.test.ts b/src/initial-parameters.test.ts index 9f4299c7..353c6dfa 100644 --- a/src/initial-parameters.test.ts +++ b/src/initial-parameters.test.ts @@ -1,6 +1,6 @@ import os from 'os'; import path from 'path'; -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import { buildMockProject, buildMockPackage, @@ -11,38 +11,38 @@ import * as commandLineArgumentsModule from './command-line-arguments.js'; import * as envModule from './env.js'; import * as projectModule from './project.js'; -jest.mock('./command-line-arguments'); -jest.mock('./env'); -jest.mock('./project'); +vitest.mock('./command-line-arguments'); +vitest.mock('./env'); +vitest.mock('./project'); describe('initial-parameters', () => { describe('determineInitialParameters', () => { beforeEach(() => { - jest.useFakeTimers(); + vitest.useFakeTimers(); }); afterEach(() => { - jest.useRealTimers(); + vitest.useRealTimers(); }); it('returns an object derived from command-line arguments and environment variables that contains data necessary to run the workflow', async () => { const project = buildMockProject(); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: '/path/to/temp', reset: true, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], @@ -64,19 +64,19 @@ describe('initial-parameters', () => { rootPackage: buildMockPackage(), }); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: 'project', tempDirectory: undefined, reset: true, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - const readProjectSpy = jest + const readProjectSpy = vitest .spyOn(projectModule, 'readProject') .mockResolvedValue(project); @@ -94,21 +94,21 @@ describe('initial-parameters', () => { it('resolves the given temporary directory relative to the current working directory', async () => { const project = buildMockProject(); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: 'tmp', reset: true, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], @@ -124,21 +124,21 @@ describe('initial-parameters', () => { rootPackage: buildMockPackage('@foo/bar'), }); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: undefined, reset: true, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], @@ -154,21 +154,21 @@ describe('initial-parameters', () => { it('returns initial parameters including reset: true, derived from a command-line argument of "--reset true"', async () => { const project = buildMockProject(); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: '/path/to/temp', reset: true, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], @@ -182,21 +182,21 @@ describe('initial-parameters', () => { it('returns initial parameters including reset: false, derived from a command-line argument of "--reset false"', async () => { const project = buildMockProject(); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: '/path/to/temp', reset: false, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], @@ -210,21 +210,21 @@ describe('initial-parameters', () => { it('returns initial parameters including a releaseType of "backport", derived from a command-line argument of "--backport true"', async () => { const project = buildMockProject(); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: '/path/to/temp', reset: false, backport: true, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], @@ -238,21 +238,21 @@ describe('initial-parameters', () => { it('returns initial parameters including a releaseType of "ordinary", derived from a command-line argument of "--backport false"', async () => { const project = buildMockProject(); const stderr = createNoopWriteStream(); - when(jest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) + when(vitest.spyOn(commandLineArgumentsModule, 'readCommandLineArguments')) .calledWith(['arg1', 'arg2']) - .mockResolvedValue({ + .thenResolve({ projectDirectory: '/path/to/project', tempDirectory: '/path/to/temp', reset: false, backport: false, defaultBranch: 'main', }); - jest + vitest .spyOn(envModule, 'getEnvironmentVariables') .mockReturnValue({ EDITOR: undefined }); - when(jest.spyOn(projectModule, 'readProject')) + when(vitest.spyOn(projectModule, 'readProject')) .calledWith('/path/to/project', { stderr }) - .mockResolvedValue(project); + .thenResolve(project); const initialParameters = await determineInitialParameters({ argv: ['arg1', 'arg2'], diff --git a/src/main.test.ts b/src/main.test.ts index 485b8ecc..37310a85 100644 --- a/src/main.test.ts +++ b/src/main.test.ts @@ -4,15 +4,15 @@ import { main } from './main.js'; import * as initialParametersModule from './initial-parameters.js'; import * as monorepoWorkflowOperations from './monorepo-workflow-operations.js'; -jest.mock('./initial-parameters'); -jest.mock('./monorepo-workflow-operations'); +vitest.mock('./initial-parameters'); +vitest.mock('./monorepo-workflow-operations'); describe('main', () => { it('executes the monorepo workflow if the project is a monorepo', async () => { const project = buildMockProject({ isMonorepo: true }); const stdout = fs.createWriteStream('/dev/null'); const stderr = fs.createWriteStream('/dev/null'); - jest + vitest .spyOn(initialParametersModule, 'determineInitialParameters') .mockResolvedValue({ project, @@ -21,7 +21,7 @@ describe('main', () => { defaultBranch: 'main', releaseType: 'backport', }); - const followMonorepoWorkflowSpy = jest + const followMonorepoWorkflowSpy = vitest .spyOn(monorepoWorkflowOperations, 'followMonorepoWorkflow') .mockResolvedValue(); @@ -47,7 +47,7 @@ describe('main', () => { const project = buildMockProject({ isMonorepo: false }); const stdout = fs.createWriteStream('/dev/null'); const stderr = fs.createWriteStream('/dev/null'); - jest + vitest .spyOn(initialParametersModule, 'determineInitialParameters') .mockResolvedValue({ project, @@ -56,7 +56,7 @@ describe('main', () => { defaultBranch: 'main', releaseType: 'backport', }); - const followMonorepoWorkflowSpy = jest + const followMonorepoWorkflowSpy = vitest .spyOn(monorepoWorkflowOperations, 'followMonorepoWorkflow') .mockResolvedValue(); diff --git a/src/misc-utils.test.ts b/src/misc-utils.test.ts index be297b80..c1a0d2cb 100644 --- a/src/misc-utils.test.ts +++ b/src/misc-utils.test.ts @@ -11,8 +11,8 @@ import { getLinesFromCommand, } from './misc-utils.js'; -jest.mock('which'); -jest.mock('execa'); +vitest.mock('which'); +vitest.mock('execa'); describe('misc-utils', () => { describe('isErrorWithCode', () => { @@ -108,7 +108,7 @@ describe('misc-utils', () => { describe('resolveExecutable', () => { it('returns the fullpath of the given executable as returned by "which"', async () => { - jest + vitest .spyOn(whichModule, 'default') .mockResolvedValue('/path/to/executable'); @@ -116,7 +116,7 @@ describe('misc-utils', () => { }); it('returns null if the given executable cannot be found', async () => { - jest + vitest .spyOn(whichModule, 'default') .mockRejectedValue(new Error('not found: executable')); @@ -124,7 +124,7 @@ describe('misc-utils', () => { }); it('throws the error that "which" throws if it is not a "not found" error', async () => { - jest + vitest .spyOn(whichModule, 'default') .mockRejectedValue(new Error('something else')); @@ -136,7 +136,7 @@ describe('misc-utils', () => { describe('runCommand', () => { it('runs the command, discarding its output', async () => { - const execaSpy = jest + const execaSpy = vitest .spyOn(execaModule, 'execa') // Typecast: It's difficult to provide a full return value for execa .mockResolvedValue({ stdout: ' some output ' } as any); @@ -154,7 +154,7 @@ describe('misc-utils', () => { describe('getStdoutFromCommand', () => { it('executes the given command and returns a version of the standard out from the command with whitespace trimmed', async () => { - const execaSpy = jest + const execaSpy = vitest .spyOn(execaModule, 'execa') // Typecast: It's difficult to provide a full return value for execa .mockResolvedValue({ stdout: ' some output ' } as any); @@ -174,7 +174,7 @@ describe('misc-utils', () => { describe('getLinesFromCommand', () => { it('executes the given command and returns the standard out from the command split into lines', async () => { - const execaSpy = jest + const execaSpy = vitest .spyOn(execaModule, 'execa') // Typecast: It's difficult to provide a full return value for execa .mockResolvedValue({ stdout: 'line 1\nline 2\nline 3' } as any); @@ -192,7 +192,7 @@ describe('misc-utils', () => { }); it('does not strip leading and trailing whitespace from the output, but does remove empty lines', async () => { - const execaSpy = jest + const execaSpy = vitest .spyOn(execaModule, 'execa') // Typecast: It's difficult to provide a full return value for execa .mockResolvedValue({ diff --git a/src/monorepo-workflow-operations.test.ts b/src/monorepo-workflow-operations.test.ts index f63691d8..66c85b62 100644 --- a/src/monorepo-workflow-operations.test.ts +++ b/src/monorepo-workflow-operations.test.ts @@ -1,9 +1,9 @@ import fs from 'fs'; import path from 'path'; -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import { MockWritable } from 'stdio-mock'; -import { withSandbox, Sandbox, isErrorWithCode } from '../tests/helpers'; -import { buildMockProject, Require } from '../tests/unit/helpers'; +import { withSandbox, Sandbox, isErrorWithCode } from '../tests/helpers.js'; +import { buildMockProject, Require } from '../tests/unit/helpers.js'; import { followMonorepoWorkflow } from './monorepo-workflow-operations.js'; import * as editorModule from './editor.js'; import type { Editor } from './editor.js'; @@ -15,11 +15,11 @@ import * as repoModule from './repo.js'; import * as yarnCommands from './yarn-commands.js'; import * as workflowOperations from './workflow-operations.js'; -jest.mock('./editor'); -jest.mock('./release-plan'); -jest.mock('./release-specification'); -jest.mock('./repo'); -jest.mock('./yarn-commands.js'); +vitest.mock('./editor'); +vitest.mock('./release-plan'); +vitest.mock('./release-specification'); +vitest.mock('./repo'); +vitest.mock('./yarn-commands.js'); /** * Tests the given path to determine whether it represents a file. @@ -47,29 +47,32 @@ async function fileExists(entryPath: string): Promise { */ function getDependencySpies() { return { - determineEditorSpy: jest.spyOn(editorModule, 'determineEditor'), - createReleaseBranchSpy: jest.spyOn( + determineEditorSpy: vitest.spyOn(editorModule, 'determineEditor'), + createReleaseBranchSpy: vitest.spyOn( workflowOperations, 'createReleaseBranch', ), - generateReleaseSpecificationTemplateForMonorepoSpy: jest.spyOn( + generateReleaseSpecificationTemplateForMonorepoSpy: vitest.spyOn( releaseSpecificationModule, 'generateReleaseSpecificationTemplateForMonorepo', ), - waitForUserToEditReleaseSpecificationSpy: jest.spyOn( + waitForUserToEditReleaseSpecificationSpy: vitest.spyOn( releaseSpecificationModule, 'waitForUserToEditReleaseSpecification', ), - validateReleaseSpecificationSpy: jest.spyOn( + validateReleaseSpecificationSpy: vitest.spyOn( releaseSpecificationModule, 'validateReleaseSpecification', ), - planReleaseSpy: jest.spyOn(releasePlanModule, 'planRelease'), - executeReleasePlanSpy: jest.spyOn(releasePlanModule, 'executeReleasePlan'), - commitAllChangesSpy: jest.spyOn(repoModule, 'commitAllChanges'), - fixConstraintsSpy: jest.spyOn(yarnCommands, 'fixConstraints'), - updateYarnLockfileSpy: jest.spyOn(yarnCommands, 'updateYarnLockfile'), - deduplicateDependenciesSpy: jest.spyOn( + planReleaseSpy: vitest.spyOn(releasePlanModule, 'planRelease'), + executeReleasePlanSpy: vitest.spyOn( + releasePlanModule, + 'executeReleasePlan', + ), + commitAllChangesSpy: vitest.spyOn(repoModule, 'commitAllChanges'), + fixConstraintsSpy: vitest.spyOn(yarnCommands, 'fixConstraints'), + updateYarnLockfileSpy: vitest.spyOn(yarnCommands, 'updateYarnLockfile'), + deduplicateDependenciesSpy: vitest.spyOn( yarnCommands, 'deduplicateDependencies', ), @@ -208,26 +211,26 @@ async function setupFollowMonorepoWorkflow({ determineEditorSpy.mockResolvedValue(isEditorAvailable ? editor : null); when(generateReleaseSpecificationTemplateForMonorepoSpy) .calledWith({ project, isEditorAvailable }) - .mockResolvedValue(''); + .thenResolve(''); if (errorUponEditingReleaseSpec) { when(waitForUserToEditReleaseSpecificationSpy) .calledWith(releaseSpecificationPath, editor) - .mockRejectedValue(errorUponEditingReleaseSpec); + .thenReject(errorUponEditingReleaseSpec); } else { when(waitForUserToEditReleaseSpecificationSpy) .calledWith(releaseSpecificationPath, editor) - .mockResolvedValue(); + .thenResolve(); } if (errorUponValidatingReleaseSpec) { when(validateReleaseSpecificationSpy) .calledWith(project, releaseSpecificationPath) - .mockRejectedValue(errorUponValidatingReleaseSpec); + .thenReject(errorUponValidatingReleaseSpec); } else { when(validateReleaseSpecificationSpy) .calledWith(project, releaseSpecificationPath) - .mockResolvedValue(releaseSpecification); + .thenResolve(releaseSpecification); } if (errorUponPlanningRelease) { @@ -237,7 +240,7 @@ async function setupFollowMonorepoWorkflow({ releaseSpecification, newReleaseVersion: releaseVersion, }) - .mockRejectedValue(errorUponPlanningRelease); + .thenReject(errorUponPlanningRelease); } else { when(planReleaseSpy) .calledWith({ @@ -245,22 +248,20 @@ async function setupFollowMonorepoWorkflow({ releaseSpecification, newReleaseVersion: releaseVersion, }) - .mockResolvedValue(releasePlan); + .thenResolve(releasePlan); } if (errorUponExecutingReleasePlan) { when(executeReleasePlanSpy) .calledWith(project, releasePlan, stderr) - .mockRejectedValue(errorUponExecutingReleasePlan); + .thenReject(errorUponExecutingReleasePlan); } else { when(executeReleasePlanSpy) .calledWith(project, releasePlan, stderr) - .mockResolvedValue(undefined); + .thenResolve(undefined); } - when(commitAllChangesSpy) - .calledWith(projectDirectoryPath, '') - .mockResolvedValue(); + when(commitAllChangesSpy).calledWith(projectDirectoryPath, '').thenResolve(); if (doesReleaseSpecFileExist) { await fs.promises.writeFile( diff --git a/src/package.test.ts b/src/package.test.ts index 6e972da6..75e83df8 100644 --- a/src/package.test.ts +++ b/src/package.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import * as autoChangelog from '@metamask/auto-changelog'; import { SemVer } from 'semver'; import { MockWritable } from 'stdio-mock'; @@ -22,13 +22,13 @@ import * as fsModule from './fs.js'; import * as packageManifestModule from './package-manifest.js'; import * as repoModule from './repo.js'; -jest.mock('./package-manifest'); -jest.mock('./repo'); +vitest.mock('./package-manifest'); +vitest.mock('./repo'); describe('package', () => { describe('readMonorepoRootPackage', () => { it('returns information about the file structure of the package located at the given directory', async () => { - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -51,9 +51,9 @@ describe('package', () => { it('returns information about the manifest (in both unvalidated and validated forms)', async () => { const unvalidatedManifest = {}; const validatedManifest = buildMockManifest(); - when(jest.spyOn(packageManifestModule, 'readPackageManifest')) + when(vitest.spyOn(packageManifestModule, 'readPackageManifest')) .calledWith('/path/to/package/package.json') - .mockResolvedValue({ + .thenResolve({ unvalidated: unvalidatedManifest, validated: validatedManifest, }); @@ -71,7 +71,7 @@ describe('package', () => { }); it("flags the package as having been changed since its latest release if a tag matching the current version exists and changes have been made to the package's directory since the tag", async () => { - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -79,9 +79,9 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith('/path/to/project', '/path/to/package', 'v1.0.0') - .mockResolvedValue(true); + .thenResolve(true); const pkg = await readMonorepoRootPackage({ packageDirectoryPath: '/path/to/package', @@ -95,7 +95,7 @@ describe('package', () => { }); it("does not flag the package as having been changed since its latest release if a tag matching the current version exists, but changes have not been made to the package's directory since the tag", async () => { - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -103,9 +103,9 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith('/path/to/project', '/path/to/package', 'v1.0.0') - .mockResolvedValue(false); + .thenResolve(false); const pkg = await readMonorepoRootPackage({ packageDirectoryPath: '/path/to/package', @@ -119,7 +119,7 @@ describe('package', () => { }); it('flags the package as having been changed since its latest release if a tag matching the current version does not exist', async () => { - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -140,7 +140,7 @@ describe('package', () => { }); it('throws if a tag matching the current version does not exist', async () => { - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -149,9 +149,9 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith('/path/to/project', '/path/to/package', 'v1.0.0') - .mockResolvedValue(true); + .thenResolve(true); const promiseForPkg = readMonorepoRootPackage({ packageDirectoryPath: '/path/to/package', @@ -170,7 +170,7 @@ describe('package', () => { describe('readMonorepoWorkspacePackage', () => { it('returns information about the file structure of the package located at the given directory', async () => { const stderr = createNoopWriteStream(); - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -197,9 +197,9 @@ describe('package', () => { const unvalidatedManifest = {}; const validatedManifest = buildMockManifest(); const stderr = createNoopWriteStream(); - when(jest.spyOn(packageManifestModule, 'readPackageManifest')) + when(vitest.spyOn(packageManifestModule, 'readPackageManifest')) .calledWith('/path/to/package/package.json') - .mockResolvedValue({ + .thenResolve({ unvalidated: unvalidatedManifest, validated: validatedManifest, }); @@ -221,7 +221,7 @@ describe('package', () => { it("flags the package as having been changed since its latest release if a tag matching the package name + version exists and changes have been made to the package's directory since the tag", async () => { const stderr = createNoopWriteStream(); - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -230,13 +230,13 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith( '/path/to/project', '/path/to/package', '@scope/workspace-package@1.0.0', ) - .mockResolvedValue(true); + .thenResolve(true); const pkg = await readMonorepoWorkspacePackage({ packageDirectoryPath: '/path/to/package', @@ -254,7 +254,7 @@ describe('package', () => { it("does not flag the package as having been changed since its latest release if a tag matching the package name + version exists, but changes have not been made to the package's directory since the tag", async () => { const stderr = createNoopWriteStream(); - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -263,13 +263,13 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith( '/path/to/project', '/path/to/package', '@scope/workspace-package@1.0.0', ) - .mockResolvedValue(false); + .thenResolve(false); const pkg = await readMonorepoWorkspacePackage({ packageDirectoryPath: '/path/to/package', @@ -287,7 +287,7 @@ describe('package', () => { it("flags the package as having been changed since its latest release if a tag matching 'v' + the root package version exists instead of the package name + version, and changes have been made to the package's directory since the tag", async () => { const stderr = createNoopWriteStream(); - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -296,9 +296,9 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith('/path/to/project', '/path/to/package', 'v5.0.0') - .mockResolvedValue(true); + .thenResolve(true); const pkg = await readMonorepoWorkspacePackage({ packageDirectoryPath: '/path/to/package', @@ -316,7 +316,7 @@ describe('package', () => { it("does not flag the package as having been changed since its latest release if a tag matching 'v' + the root package version exists instead of the package name + version, but changes have not been made to the package's directory since the tag", async () => { const stderr = createNoopWriteStream(); - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -324,9 +324,9 @@ describe('package', () => { version: new SemVer('1.0.0'), }), }); - when(jest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) + when(vitest.spyOn(repoModule, 'hasChangesInDirectorySinceGitTag')) .calledWith('/path/to/project', '/path/to/package', 'v5.0.0') - .mockResolvedValue(false); + .thenResolve(false); const pkg = await readMonorepoWorkspacePackage({ packageDirectoryPath: '/path/to/package', @@ -344,7 +344,7 @@ describe('package', () => { it('flags the package as having been changed since its latest release if the project has no tags', async () => { const stderr = createNoopWriteStream(); - jest + vitest .spyOn(packageManifestModule, 'readPackageManifest') .mockResolvedValue({ unvalidated: {}, @@ -369,9 +369,9 @@ describe('package', () => { it("prints a warning if a tag matching 'v' + the root package version exists instead of the package name + version", async () => { const stderr = new MockWritable(); - when(jest.spyOn(packageManifestModule, 'readPackageManifest')) + when(vitest.spyOn(packageManifestModule, 'readPackageManifest')) .calledWith('/path/to/package/package.json') - .mockResolvedValue({ + .thenResolve({ unvalidated: {}, validated: buildMockManifest({ name: '@scope/workspace-package', @@ -395,9 +395,9 @@ describe('package', () => { it("throws if the project has tags, but neither a tag matching the package name + version nor 'v' + the root package version exists", async () => { const stderr = createNoopWriteStream(); - when(jest.spyOn(packageManifestModule, 'readPackageManifest')) + when(vitest.spyOn(packageManifestModule, 'readPackageManifest')) .calledWith('/path/to/package/package.json') - .mockResolvedValue({ + .thenResolve({ unvalidated: {}, validated: buildMockManifest({ name: '@scope/workspace-package', @@ -527,7 +527,7 @@ describe('package', () => { }), newVersion: '2.0.0', }; - jest.spyOn(fsModule, 'readFile').mockRejectedValue(new Error('oops')); + vitest.spyOn(fsModule, 'readFile').mockRejectedValue(new Error('oops')); await expect( updatePackage({ project, packageReleasePlan }), @@ -570,7 +570,7 @@ describe('package', () => { validatedManifest: buildMockManifest(), changelogPath, }); - when(jest.spyOn(autoChangelog, 'updateChangelog')) + when(vitest.spyOn(autoChangelog, 'updateChangelog')) .calledWith({ changelogContent: 'existing changelog', isReleaseCandidate: false, @@ -579,7 +579,7 @@ describe('package', () => { tagPrefixes: ['package@', 'v'], formatter: formatChangelog, }) - .mockResolvedValue('new changelog'); + .thenResolve('new changelog'); await fs.promises.writeFile(changelogPath, 'existing changelog'); await updatePackageChangelog({ @@ -609,7 +609,7 @@ describe('package', () => { validatedManifest: buildMockManifest(), changelogPath, }); - when(jest.spyOn(autoChangelog, 'updateChangelog')) + when(vitest.spyOn(autoChangelog, 'updateChangelog')) .calledWith({ changelogContent: 'existing changelog', isReleaseCandidate: false, @@ -618,7 +618,7 @@ describe('package', () => { tagPrefixes: ['package@', 'v'], formatter: formatChangelog, }) - .mockResolvedValue(undefined); + .thenResolve(undefined); await fs.promises.writeFile(changelogPath, 'existing changelog'); await updatePackageChangelog({ @@ -672,7 +672,7 @@ describe('package', () => { validatedManifest: buildMockManifest(), changelogPath, }); - jest.spyOn(fsModule, 'readFile').mockRejectedValue(new Error('oops')); + vitest.spyOn(fsModule, 'readFile').mockRejectedValue(new Error('oops')); await expect( updatePackageChangelog({ project, package: pkg, stderr }), diff --git a/src/project.test.ts b/src/project.test.ts index 517a8ea5..c0ce0b8d 100644 --- a/src/project.test.ts +++ b/src/project.test.ts @@ -1,6 +1,6 @@ import { mkdir } from 'fs/promises'; import path from 'path'; -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import { SemVer } from 'semver'; import * as actionUtils from '@metamask/action-utils'; import { withSandbox } from '../tests/helpers.js'; @@ -19,11 +19,11 @@ import * as repoModule from './repo.js'; import * as fs from './fs.js'; import { IncrementableVersionParts } from './release-specification.js'; -jest.mock('./package'); -jest.mock('./repo'); -jest.mock('@metamask/action-utils', () => ({ - ...jest.requireActual('@metamask/action-utils'), - getWorkspaceLocations: jest.fn(), +vitest.mock('./package'); +vitest.mock('./repo'); +vitest.mock('@metamask/action-utils', async (importOriginal) => ({ + ...(await importOriginal()), + getWorkspaceLocations: vitest.fn(), })); describe('project', () => { @@ -59,23 +59,27 @@ describe('project', () => { }; const projectTagNames = ['tag1', 'tag2', 'tag3']; const stderr = createNoopWriteStream(); - when(jest.spyOn(repoModule, 'getRepositoryHttpsUrl')) + when(vitest.spyOn(repoModule, 'getRepositoryHttpsUrl')) .calledWith(projectDirectoryPath) - .mockResolvedValue(projectRepositoryUrl); - when(jest.spyOn(repoModule, 'getTagNames')) + .thenResolve(projectRepositoryUrl); + when(vitest.spyOn(repoModule, 'getTagNames')) .calledWith(projectDirectoryPath) - .mockResolvedValue(projectTagNames); - when(jest.spyOn(packageModule, 'readMonorepoRootPackage')) + .thenResolve(projectTagNames); + when(vitest.spyOn(packageModule, 'readMonorepoRootPackage')) .calledWith({ packageDirectoryPath: projectDirectoryPath, projectDirectoryPath, projectTagNames, }) - .mockResolvedValue(rootPackage); - when( - jest.spyOn(actionUtils, 'getWorkspaceLocations'), - ).mockResolvedValue(['packages/a', 'packages/subpackages/b']); - when(jest.spyOn(packageModule, 'readMonorepoWorkspacePackage')) + .thenResolve(rootPackage); + vitest + .spyOn(actionUtils, 'getWorkspaceLocations') + .mockResolvedValue(['packages/a', 'packages/subpackages/b']); + const readMonorepoWorkspacePackageSpy = vitest.spyOn( + packageModule, + 'readMonorepoWorkspacePackage', + ); + when(readMonorepoWorkspacePackageSpy) .calledWith({ packageDirectoryPath: path.join( projectDirectoryPath, @@ -88,7 +92,8 @@ describe('project', () => { projectTagNames, stderr, }) - .mockResolvedValue(workspacePackages.a) + .thenResolve(workspacePackages.a); + when(readMonorepoWorkspacePackageSpy) .calledWith({ packageDirectoryPath: path.join( projectDirectoryPath, @@ -102,7 +107,7 @@ describe('project', () => { projectTagNames, stderr, }) - .mockResolvedValue(workspacePackages.b); + .thenResolve(workspacePackages.b); await mkdir(path.join(projectDirectoryPath, 'packages')); await mkdir(path.join(projectDirectoryPath, 'packages', 'a')); await mkdir(path.join(projectDirectoryPath, 'packages', 'subpackages')); @@ -126,6 +131,7 @@ describe('project', () => { }); }); }); + describe('restoreChangelogsForSkippedPackages', () => { it('should reset changelog for packages with changes not included in release', async () => { const project = buildMockProject({ @@ -143,15 +149,17 @@ describe('project', () => { }, }); - const restoreFilesSpy = jest.spyOn(repoModule, 'restoreFiles'); + const restoreFilesSpy = vitest.spyOn(repoModule, 'restoreFiles'); + + const fileExistsSpy = vitest.spyOn(fs, 'fileExists'); - when(jest.spyOn(fs, 'fileExists')) + when(fileExistsSpy) .calledWith(project.workspacePackages.b.changelogPath) - .mockResolvedValue(true); + .thenResolve(true); - when(jest.spyOn(fs, 'fileExists')) + when(fileExistsSpy) .calledWith(project.workspacePackages.c.changelogPath) - .mockResolvedValue(true); + .thenResolve(true); await restoreChangelogsForSkippedPackages({ project, @@ -187,7 +195,7 @@ describe('project', () => { }, }); - const restoreFilesSpy = jest.spyOn(repoModule, 'restoreFiles'); + const restoreFilesSpy = vitest.spyOn(repoModule, 'restoreFiles'); await restoreChangelogsForSkippedPackages({ project, @@ -220,11 +228,11 @@ describe('project', () => { }, }); - when(jest.spyOn(fs, 'fileExists')) + when(vitest.spyOn(fs, 'fileExists')) .calledWith(project.workspacePackages.a.changelogPath) - .mockResolvedValue(false); + .thenResolve(false); - const restoreFilesSpy = jest.spyOn(repoModule, 'restoreFiles'); + const restoreFilesSpy = vitest.spyOn(repoModule, 'restoreFiles'); await restoreChangelogsForSkippedPackages({ project, @@ -260,7 +268,7 @@ describe('project', () => { }, }); - const updatePackageChangelogSpy = jest.spyOn( + const updatePackageChangelogSpy = vitest.spyOn( packageModule, 'updatePackageChangelog', ); @@ -294,7 +302,7 @@ describe('project', () => { }, }); - const updatePackageChangelogSpy = jest.spyOn( + const updatePackageChangelogSpy = vitest.spyOn( packageModule, 'updatePackageChangelog', ); diff --git a/src/release-plan.test.ts b/src/release-plan.test.ts index 2c4c02e5..509b2748 100644 --- a/src/release-plan.test.ts +++ b/src/release-plan.test.ts @@ -1,11 +1,12 @@ import fs from 'fs'; import { SemVer } from 'semver'; +import { vitest } from 'vitest'; import { buildMockProject, buildMockPackage } from '../tests/unit/helpers.js'; import { planRelease, executeReleasePlan } from './release-plan.js'; import { IncrementableVersionParts } from './release-specification.js'; import * as packageUtils from './package.js'; -jest.mock('./package'); +vitest.mock('./package'); describe('release-plan-utils', () => { describe('planRelease', () => { @@ -179,7 +180,7 @@ describe('release-plan-utils', () => { ], }; const stderr = fs.createWriteStream('/dev/null'); - const updatePackageSpy = jest.spyOn(packageUtils, 'updatePackage'); + const updatePackageSpy = vitest.spyOn(packageUtils, 'updatePackage'); await executeReleasePlan(project, releasePlan, stderr); diff --git a/src/release-specification.test.ts b/src/release-specification.test.ts index 54f60c6b..a6c25715 100644 --- a/src/release-specification.test.ts +++ b/src/release-specification.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import { MockWritable } from 'stdio-mock'; import YAML from 'yaml'; import { SemVer } from 'semver'; @@ -13,10 +13,10 @@ import { } from './release-specification.js'; import * as miscUtils from './misc-utils.js'; -jest.mock('./misc-utils', () => { +vitest.mock('./misc-utils', async (importOriginal) => { return { - ...jest.requireActual('./misc-utils'), - runCommand: jest.fn(), + ...(await importOriginal()), + runCommand: vitest.fn(), }; }); @@ -166,7 +166,7 @@ packages: path: '/path/to/editor', args: ['arg1', 'arg2'], }; - when(jest.spyOn(miscUtils, 'runCommand')) + when(vitest.spyOn(miscUtils, 'runCommand')) .calledWith( '/path/to/editor', ['arg1', 'arg2', releaseSpecificationPath], @@ -175,7 +175,7 @@ packages: shell: true, }, ) - .mockResolvedValue(); + .thenResolve(); expect( await waitForUserToEditReleaseSpecification( @@ -189,7 +189,7 @@ packages: const releaseSpecificationPath = '/path/to/release-spec'; const editor = { path: '/path/to/editor', args: [] }; const stdout = new MockWritable(); - when(jest.spyOn(miscUtils, 'runCommand')).mockResolvedValue(); + vitest.spyOn(miscUtils, 'runCommand').mockResolvedValue(); await waitForUserToEditReleaseSpecification( releaseSpecificationPath, @@ -210,7 +210,7 @@ packages: args: ['arg1', 'arg2'], }; const stdout = new MockWritable(); - when(jest.spyOn(miscUtils, 'runCommand')) + when(vitest.spyOn(miscUtils, 'runCommand')) .calledWith( '/path/to/editor', ['arg1', 'arg2', releaseSpecificationPath], @@ -219,7 +219,7 @@ packages: shell: true, }, ) - .mockRejectedValue(new Error('oops')); + .thenReject(new Error('oops')); try { await waitForUserToEditReleaseSpecification( @@ -244,7 +244,7 @@ packages: args: ['arg1', 'arg2'], }; const error = new Error('oops'); - when(jest.spyOn(miscUtils, 'runCommand')) + when(vitest.spyOn(miscUtils, 'runCommand')) .calledWith( '/path/to/editor', ['arg1', 'arg2', releaseSpecificationPath], @@ -253,7 +253,7 @@ packages: shell: true, }, ) - .mockRejectedValue(error); + .thenReject(error); await expect( waitForUserToEditReleaseSpecification(releaseSpecificationPath, editor), diff --git a/src/repo.test.ts b/src/repo.test.ts index 67546464..9398da73 100644 --- a/src/repo.test.ts +++ b/src/repo.test.ts @@ -1,4 +1,4 @@ -import { when } from 'jest-when'; +import { when } from 'vitest-when'; import { getRepositoryHttpsUrl, commitAllChanges, @@ -10,17 +10,17 @@ import { } from './repo.js'; import * as miscUtils from './misc-utils.js'; -jest.mock('./misc-utils'); +vitest.mock('./misc-utils'); describe('repo', () => { describe('getRepositoryHttpsUrl', () => { it('returns the URL of the "origin" remote of the given repo if it looks like a HTTPS public GitHub repo URL', async () => { const repositoryDirectoryPath = '/path/to/project'; - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) .calledWith('git', ['config', '--get', 'remote.origin.url'], { cwd: repositoryDirectoryPath, }) - .mockResolvedValue('https://github.com/foo'); + .thenResolve('https://github.com/foo'); expect(await getRepositoryHttpsUrl(repositoryDirectoryPath)).toBe( 'https://github.com/foo', @@ -29,58 +29,45 @@ describe('repo', () => { it('converts an SSH GitHub repo URL into an HTTPS URL', async () => { const repositoryDirectoryPath = '/path/to/project'; - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) .calledWith('git', ['config', '--get', 'remote.origin.url'], { cwd: repositoryDirectoryPath, }) - .mockResolvedValue('git@github.com:Foo/Bar.git'); + .thenResolve('git@github.com:Foo/Bar.git'); expect(await getRepositoryHttpsUrl(repositoryDirectoryPath)).toBe( 'https://github.com/Foo/Bar', ); }); - it('throws if the URL of the "origin" remote is in an invalid format', async () => { - const repositoryDirectoryPath = '/path/to/project'; - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) - .calledWith('git', ['config', '--get', 'remote.origin.url'], { - cwd: repositoryDirectoryPath, - }) - .mockResolvedValueOnce('foo') - .mockResolvedValueOnce('http://github.com/Foo/Bar') - .mockResolvedValueOnce('https://gitbar.foo/Foo/Bar') - .mockResolvedValueOnce('git@gitbar.foo:Foo/Bar.git') - .mockResolvedValueOnce('git@github.com:Foo/Bar.foo'); - - await expect( - getRepositoryHttpsUrl(repositoryDirectoryPath), - ).rejects.toThrow('Unrecognized URL for git remote "origin": foo'); - await expect( - getRepositoryHttpsUrl(repositoryDirectoryPath), - ).rejects.toThrow( - 'Unrecognized URL for git remote "origin": http://github.com/Foo/Bar', - ); - await expect( - getRepositoryHttpsUrl(repositoryDirectoryPath), - ).rejects.toThrow( - 'Unrecognized URL for git remote "origin": https://gitbar.foo/Foo/Bar', - ); - await expect( - getRepositoryHttpsUrl(repositoryDirectoryPath), - ).rejects.toThrow( - 'Unrecognized URL for git remote "origin": git@gitbar.foo:Foo/Bar.git', - ); - await expect( - getRepositoryHttpsUrl(repositoryDirectoryPath), - ).rejects.toThrow( - 'Unrecognized URL for git remote "origin": git@github.com:Foo/Bar.foo', - ); - }); + it.each([ + 'foo', + 'http://github.com/Foo/Bar', + 'https://gitbar.foo/Foo/Bar', + 'git@gitbar.foo:Foo/Bar.git', + 'git@github.com:Foo/Bar.foo', + ])( + 'throws if the URL of the "origin" remote is in the invalid format "%s"', + async (originUrl) => { + const repositoryDirectoryPath = '/path/to/project'; + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) + .calledWith('git', ['config', '--get', 'remote.origin.url'], { + cwd: repositoryDirectoryPath, + }) + .thenResolve(originUrl); + + await expect( + getRepositoryHttpsUrl(repositoryDirectoryPath), + ).rejects.toThrow( + `Unrecognized URL for git remote "origin": ${originUrl}`, + ); + }, + ); }); describe('commitAllChanges', () => { it('stages all files, and creates a new commit', async () => { - const getStdoutFromCommandSpy = jest.spyOn( + const getStdoutFromCommandSpy = vitest.spyOn( miscUtils, 'getStdoutFromCommand', ); @@ -102,11 +89,11 @@ describe('repo', () => { describe('getTagNames', () => { it('returns all of the tag names that match a known format, sorted by ascending semantic version order', async () => { - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['tag', '--sort=version:refname', '--merged'], { cwd: '/path/to/repo', }) - .mockResolvedValue(['tag1', 'tag2', 'tag3']); + .thenResolve(['tag1', 'tag2', 'tag3']); expect(await getTagNames('/path/to/repo')).toStrictEqual([ 'tag1', @@ -116,31 +103,31 @@ describe('repo', () => { }); it('returns an empty array if the repo has no tags as long as it was not cloned shallowly', async () => { - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['tag', '--sort=version:refname', '--merged'], { cwd: '/path/to/repo', }) - .mockResolvedValue([]); - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) + .thenResolve([]); + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) .calledWith('git', ['rev-parse', '--is-shallow-repository'], { cwd: '/path/to/repo', }) - .mockResolvedValue('false'); + .thenResolve('false'); expect(await getTagNames('/path/to/repo')).toStrictEqual([]); }); it('throws if the repo has no tags but it was cloned shallowly', async () => { - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['tag', '--sort=version:refname', '--merged'], { cwd: '/path/to/repo', }) - .mockResolvedValue([]); - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) + .thenResolve([]); + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) .calledWith('git', ['rev-parse', '--is-shallow-repository'], { cwd: '/path/to/repo', }) - .mockResolvedValue('true'); + .thenResolve('true'); await expect(getTagNames('/path/to/repo')).rejects.toThrow( '"git tag" returned no tags. Increase your git fetch depth.', @@ -148,16 +135,16 @@ describe('repo', () => { }); it('throws if "git rev-parse --is-shallow-repository" returns neither "true" nor "false"', async () => { - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['tag', '--sort=version:refname', '--merged'], { cwd: '/path/to/repo', }) - .mockResolvedValue([]); - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) + .thenResolve([]); + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) .calledWith('git', ['rev-parse', '--is-shallow-repository'], { cwd: '/path/to/repo', }) - .mockResolvedValue('something-else'); + .thenResolve('something-else'); await expect(getTagNames('/path/to/repo')).rejects.toThrow( '"git rev-parse --is-shallow-repository" returned unrecognized value: "something-else"', @@ -167,11 +154,11 @@ describe('repo', () => { describe('hasChangesInDirectorySinceGitTag', () => { it('returns true if "git diff" includes any files within the given directory, for the first call', async () => { - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['diff', 'v1.0.0', 'HEAD', '--name-only'], { cwd: '/path/to/repo', }) - .mockResolvedValue(['file1', 'subdirectory/file1']); + .thenResolve(['file1', 'subdirectory/file1']); const hasChanges = await hasChangesInDirectorySinceGitTag( '/path/to/repo', @@ -183,11 +170,11 @@ describe('repo', () => { }); it('returns false if "git diff" does not include any files within the given directory, for the first call', async () => { - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['diff', 'v2.0.0', 'HEAD', '--name-only'], { cwd: '/path/to/repo', }) - .mockResolvedValue(['file1', 'file2']); + .thenResolve(['file1', 'file2']); const hasChanges = await hasChangesInDirectorySinceGitTag( '/path/to/repo', @@ -199,7 +186,7 @@ describe('repo', () => { }); it('only runs "git diff" once when called more than once for the same tag name (even for a different subdirectory)', async () => { - const getLinesFromCommandSpy = jest + const getLinesFromCommandSpy = vitest .spyOn(miscUtils, 'getLinesFromCommand') .mockResolvedValue([]); @@ -220,7 +207,7 @@ describe('repo', () => { describe('getCurrentBranchName', () => { it('gets the current branch name', async () => { - const getStdoutFromCommandSpy = jest.spyOn( + const getStdoutFromCommandSpy = vitest.spyOn( miscUtils, 'getStdoutFromCommand', ); @@ -229,7 +216,7 @@ describe('repo', () => { .calledWith('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: '/path/to/project', }) - .mockResolvedValue('release/1.1.1'); + .thenResolve('release/1.1.1'); const branchName = await getCurrentBranchName('/path/to/project'); @@ -246,22 +233,22 @@ describe('repo', () => { describe('branchExists', () => { it('returns true when specified branch name exists', async () => { const releaseBranchName = 'release/1.0.0'; - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['branch', '--list', releaseBranchName], { cwd: '/path/to/repo', }) - .mockResolvedValue([releaseBranchName]); + .thenResolve([releaseBranchName]); expect(await branchExists('/path/to/repo', releaseBranchName)).toBe(true); }); it("returns false when specified branch name doesn't exist", async () => { const releaseBranchName = 'release/1.0.0'; - when(jest.spyOn(miscUtils, 'getLinesFromCommand')) + when(vitest.spyOn(miscUtils, 'getLinesFromCommand')) .calledWith('git', ['branch', '--list', releaseBranchName], { cwd: '/path/to/repo', }) - .mockResolvedValue([]); + .thenResolve([]); expect(await branchExists('/path/to/repo', releaseBranchName)).toBe( false, @@ -271,7 +258,7 @@ describe('repo', () => { describe('restoreFiles', () => { it('should call runCommand with the correct arguments', async () => { - const getStdoutFromCommandSpy = jest.spyOn( + const getStdoutFromCommandSpy = vitest.spyOn( miscUtils, 'getStdoutFromCommand', ); @@ -280,8 +267,8 @@ describe('repo', () => { .calledWith('git', ['merge-base', defaultBranch, 'HEAD'], { cwd: '/path/to', }) - .mockResolvedValue('COMMIT_SH'); - const runCommandSpy = jest.spyOn(miscUtils, 'runCommand'); + .thenResolve('COMMIT_SH'); + const runCommandSpy = vitest.spyOn(miscUtils, 'runCommand'); await restoreFiles('/path/to', defaultBranch, ['packages/filename.ts']); expect(getStdoutFromCommandSpy).toHaveBeenCalledWith( 'git', diff --git a/src/workflow-operations.test.ts b/src/workflow-operations.test.ts index 76b4cf9d..76e3264e 100644 --- a/src/workflow-operations.test.ts +++ b/src/workflow-operations.test.ts @@ -1,10 +1,10 @@ -import { when } from 'jest-when'; -import { buildMockProject } from '../tests/unit/helpers'; +import { when } from 'vitest-when'; +import { buildMockProject } from '../tests/unit/helpers.js'; import { createReleaseBranch } from './workflow-operations.js'; import * as repoModule from './repo.js'; -jest.mock('./repo'); +vitest.mock('./repo'); describe('workflow-operations', () => { describe('createReleaseBranch', () => { @@ -14,13 +14,16 @@ describe('workflow-operations', () => { project.releaseVersion.ordinaryNumber + 1 }.0.0`; const newReleaseBranchName = `release/${newReleaseVersion}`; - when(jest.spyOn(repoModule, 'getCurrentBranchName')) + when(vitest.spyOn(repoModule, 'getCurrentBranchName')) .calledWith(project.directoryPath) - .mockResolvedValue('main'); - when(jest.spyOn(repoModule, 'branchExists')) + .thenResolve('main'); + when(vitest.spyOn(repoModule, 'branchExists')) .calledWith(project.directoryPath, newReleaseBranchName) - .mockResolvedValue(false); - const runGitCommandWithin = jest.spyOn(repoModule, 'runGitCommandWithin'); + .thenResolve(false); + const runGitCommandWithin = vitest.spyOn( + repoModule, + 'runGitCommandWithin', + ); const result = await createReleaseBranch({ project, @@ -44,13 +47,16 @@ describe('workflow-operations', () => { project.releaseVersion.backportNumber + 1 }.0`; const newReleaseBranchName = `release/${newReleaseVersion}`; - when(jest.spyOn(repoModule, 'getCurrentBranchName')) + when(vitest.spyOn(repoModule, 'getCurrentBranchName')) .calledWith(project.directoryPath) - .mockResolvedValue('main'); - when(jest.spyOn(repoModule, 'branchExists')) + .thenResolve('main'); + when(vitest.spyOn(repoModule, 'branchExists')) .calledWith(project.directoryPath, newReleaseBranchName) - .mockResolvedValue(false); - const runGitCommandWithin = jest.spyOn(repoModule, 'runGitCommandWithin'); + .thenResolve(false); + const runGitCommandWithin = vitest.spyOn( + repoModule, + 'runGitCommandWithin', + ); const result = await createReleaseBranch({ project, @@ -74,9 +80,9 @@ describe('workflow-operations', () => { project.releaseVersion.ordinaryNumber + 1 }.0.0`; const newReleaseBranchName = `release/${newReleaseVersion}`; - when(jest.spyOn(repoModule, 'getCurrentBranchName')) + when(vitest.spyOn(repoModule, 'getCurrentBranchName')) .calledWith(project.directoryPath) - .mockResolvedValue(newReleaseBranchName); + .thenResolve(newReleaseBranchName); const result = await createReleaseBranch({ project, @@ -95,9 +101,9 @@ describe('workflow-operations', () => { project.releaseVersion.backportNumber + 1 }.0`; const newReleaseBranchName = `release/${newReleaseVersion}`; - when(jest.spyOn(repoModule, 'getCurrentBranchName')) + when(vitest.spyOn(repoModule, 'getCurrentBranchName')) .calledWith(project.directoryPath) - .mockResolvedValue(newReleaseBranchName); + .thenResolve(newReleaseBranchName); const result = await createReleaseBranch({ project, @@ -116,12 +122,12 @@ describe('workflow-operations', () => { project.releaseVersion.ordinaryNumber + 1 }.0.0`; const newReleaseBranchName = `release/${newReleaseVersion}`; - when(jest.spyOn(repoModule, 'getCurrentBranchName')) + when(vitest.spyOn(repoModule, 'getCurrentBranchName')) .calledWith(project.directoryPath) - .mockResolvedValue('main'); - when(jest.spyOn(repoModule, 'branchExists')) + .thenResolve('main'); + when(vitest.spyOn(repoModule, 'branchExists')) .calledWith(project.directoryPath, newReleaseBranchName) - .mockResolvedValue(true); + .thenResolve(true); const result = await createReleaseBranch({ project, @@ -140,12 +146,12 @@ describe('workflow-operations', () => { project.releaseVersion.backportNumber + 1 }.0`; const newReleaseBranchName = `release/${newReleaseVersion}`; - when(jest.spyOn(repoModule, 'getCurrentBranchName')) + when(vitest.spyOn(repoModule, 'getCurrentBranchName')) .calledWith(project.directoryPath) - .mockResolvedValue('main'); - when(jest.spyOn(repoModule, 'branchExists')) + .thenResolve('main'); + when(vitest.spyOn(repoModule, 'branchExists')) .calledWith(project.directoryPath, newReleaseBranchName) - .mockResolvedValue(true); + .thenResolve(true); const result = await createReleaseBranch({ project, diff --git a/src/yarn-commands.test.ts b/src/yarn-commands.test.ts index 355b857f..518fe49d 100644 --- a/src/yarn-commands.test.ts +++ b/src/yarn-commands.test.ts @@ -1,4 +1,5 @@ -import { when } from 'jest-when'; +import { when } from 'vitest-when'; +import { vitest } from 'vitest'; import { deduplicateDependencies, fixConstraints, @@ -6,15 +7,15 @@ import { } from './yarn-commands.js'; import * as miscUtils from './misc-utils.js'; -jest.mock('./misc-utils'); +vitest.mock('./misc-utils'); describe('yarn-commands', () => { describe('fixConstraints', () => { it('runs "yarn constraints --fix" with the correct parameters', async () => { const repositoryDirectoryPath = '/path/to/repo'; - when(jest.spyOn(miscUtils, 'getStdoutFromCommand')) + when(vitest.spyOn(miscUtils, 'getStdoutFromCommand')) .calledWith('yarn', ['--version']) - .mockResolvedValue('2.0.0'); + .thenResolve('2.0.0'); await fixConstraints(repositoryDirectoryPath); diff --git a/tsconfig.json b/tsconfig.json index 3ea98918..beae757c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,8 @@ "noErrorTruncation": true, "skipLibCheck": true, "strict": true, - "target": "ES2017" + "target": "ES2017", + "types": ["vitest/globals"] }, "exclude": ["./dist/**/*", "node_modules"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..723874d2 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,58 @@ +import { coverageConfigDefaults, defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + + // Only include source files in the `src` directory. + include: ['src/**/*.test.ts'], + + // Exclude certain files from the coverage. + exclude: [ + ...coverageConfigDefaults.exclude, + 'src/cli.ts', + 'src/command-line-arguments.ts', + ], + + // Configure the coverage provider. We use `istanbul` here, because it + // is more stable than `v8`. + provider: 'istanbul', + + // Hide files with 100% coverage. + skipFull: true, + + // Coverage thresholds. If the coverage is below these thresholds, the + // test will fail. + thresholds: { + // Auto-update the coverage thresholds. + autoUpdate: true, + + // These should be set to 100 at all times. + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, + + // Vitest doesn't inject the globals by default. We enable this option to + // inject the globals like `describe`, `it`, `expect`, etc. + globals: true, + + // Ensure all mock functions are reset before each test. + mockReset: true, + + // Ensure all mock functions are restored before each test. + restoreMocks: true, + + // Ensure environment variable stubs are removed before each test. + unstubEnvs: true, + + // Ensure global variable stubs are removed before each test. + unstubGlobals: true, + + // Don't watch files unless requested to do so. + watch: false, + }, +}); diff --git a/yarn.lock b/yarn.lock index 69462c5b..39ac9cc1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,55 +15,57 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.26.5": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 1bb04c6860c8c9555b933cb9c3caf5ef1dac331a37a351efb67956fc679f695d487aea76e792dd43823702c1300f7906f2a298e50b4a8d7ec199ada9c340c365 languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/core@npm:7.23.5" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9": + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.5 - "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.23.5 - "@babel/parser": ^7.23.5 - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.5 - "@babel/types": ^7.23.5 + "@babel/code-frame": ^7.26.2 + "@babel/generator": ^7.26.9 + "@babel/helper-compilation-targets": ^7.26.5 + "@babel/helper-module-transforms": ^7.26.0 + "@babel/helpers": ^7.26.9 + "@babel/parser": ^7.26.9 + "@babel/template": ^7.26.9 + "@babel/traverse": ^7.26.9 + "@babel/types": ^7.26.9 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 5e5dfb1e61f298676f1fca18c646dbf6fb164ca1056b0169b8d42b7f5c35e026d81823582ccb2358e93a61b035e22b3ad37e2abaae4bf43f1ffb93b6ce19466e + checksum: b6e33bdcbb8a5c929760548be400d18cbde1f07922a784586752fd544fbf13c71331406ffdb4fcfe53f79c69ceae602efdca654ad4e9ac0c2af47efe87e7fccd languageName: node linkType: hard -"@babel/generator@npm:^7.23.5, @babel/generator@npm:^7.7.2": - version: 7.23.5 - resolution: "@babel/generator@npm:7.23.5" +"@babel/generator@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" dependencies: - "@babel/types": ^7.23.5 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 + "@babel/parser": ^7.26.9 + "@babel/types": ^7.26.9 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^3.0.2 + checksum: 57d034fb6c77dfd5e0c8ef368ff544e19cb6a27cb70d6ed5ff0552c618153dc6692d31e7d0f3a408e0fec3a519514b846c909316c3078290f3a3c1e463372eae languageName: node linkType: hard @@ -85,16 +87,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" +"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: - "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.15 - browserslist: ^4.21.9 + "@babel/compat-data": ^7.26.5 + "@babel/helper-validator-option": ^7.25.9 + browserslist: ^4.24.0 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 + checksum: 6bc0107613bf1d4d21913606e8e517194e5099a24db2a8374568e56ef4626e8140f9b8f8a4aabc35479f5904459a0aead2a91ee0dc63aae110ccbc2bc4b4fda1 languageName: node linkType: hard @@ -180,27 +182,26 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 1b411ce4ca825422ef7065dffae7d8acef52023e51ad096351e3e2c05837e9bf9fca2af9ca7f28dc26d596a588863d0fedd40711a88e350b736c619a80e704e6 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-module-imports": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + "@babel/traverse": ^7.25.9 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + checksum: 942eee3adf2b387443c247a2c190c17c4fd45ba92a23087abab4c804f40541790d51ad5277e4b5b1ed8d5ba5b62de73857446b7742f835c18ebd350384e63917 languageName: node linkType: hard @@ -273,24 +274,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc +"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e +"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5, @babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d languageName: node linkType: hard @@ -305,34 +306,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helpers@npm:7.23.5" +"@babel/helpers@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/helpers@npm:7.26.9" dependencies: - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.5 - "@babel/types": ^7.23.5 - checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 + "@babel/template": ^7.26.9 + "@babel/types": ^7.26.9 + checksum: 06363f8288a24c1cfda03eccd775ac22f79cba319b533cb0e5d0f2a04a33512881cc3f227a4c46324935504fb92999cc4758b69b5e7b3846107eadcb5ee0abca languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/parser@npm:7.23.5" + "@babel/types": ^7.26.9 bin: parser: ./bin/babel-parser.js - checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 + checksum: 2df965dbf3c67d19dc437412ceef23033b4d39b0dbd7cb498d8ab9ad9e1738338656ee72676199773b37d658edf9f4161cf255515234fed30695d74e73be5514 languageName: node linkType: hard @@ -491,7 +482,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.23.3, @babel/plugin-syntax-jsx@npm:^7.7.2": +"@babel/plugin-syntax-jsx@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" dependencies: @@ -590,7 +581,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.23.3, @babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" dependencies: @@ -1341,50 +1332,39 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd + "@babel/code-frame": ^7.26.2 + "@babel/parser": ^7.26.9 + "@babel/types": ^7.26.9 + checksum: 32259298c775e543ab994daff0c758b3d6a184349b146d6497aa46cec5907bc47a6bc09e7295a81a5eccfbd023d4811a9777cb5d698d582d09a87cabf5b576e7 languageName: node linkType: hard -"@babel/traverse@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/traverse@npm:7.23.5" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.5 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.5 - "@babel/types": ^7.23.5 - debug: ^4.1.0 + "@babel/code-frame": ^7.26.2 + "@babel/generator": ^7.26.9 + "@babel/parser": ^7.26.9 + "@babel/template": ^7.26.9 + "@babel/types": ^7.26.9 + debug: ^4.3.1 globals: ^11.1.0 - checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d + checksum: d42d3a5e61422d96467f517447b5e254edbd64e4dbf3e13b630704d1f49beaa5209246dc6f45ba53522293bd4760ff720496d2c1ef189ecce52e9e63d9a59aa8 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.5, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.5 - resolution: "@babel/types@npm:7.23.5" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 - languageName: node - linkType: hard - -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + "@babel/helper-string-parser": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + checksum: cc124c149615deb30343a4c81ac5b0e3a68bdb4b1bd61a91a2859ee8e5e5f400f6ff65be4740f407c17bfc09baa9c777e7f8f765dccf3284963956b67ac95a38 languageName: node linkType: hard @@ -1399,6 +1379,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/aix-ppc64@npm:0.25.0" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-arm64@npm:0.18.20" @@ -1406,6 +1393,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/android-arm64@npm:0.25.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-arm@npm:0.18.20" @@ -1413,6 +1407,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/android-arm@npm:0.25.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-x64@npm:0.18.20" @@ -1420,6 +1421,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/android-x64@npm:0.25.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/darwin-arm64@npm:0.18.20" @@ -1427,6 +1435,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/darwin-arm64@npm:0.25.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/darwin-x64@npm:0.18.20" @@ -1434,6 +1449,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/darwin-x64@npm:0.25.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/freebsd-arm64@npm:0.18.20" @@ -1441,6 +1463,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/freebsd-arm64@npm:0.25.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/freebsd-x64@npm:0.18.20" @@ -1448,6 +1477,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/freebsd-x64@npm:0.25.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-arm64@npm:0.18.20" @@ -1455,6 +1491,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-arm64@npm:0.25.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-arm@npm:0.18.20" @@ -1462,6 +1505,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-arm@npm:0.25.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-ia32@npm:0.18.20" @@ -1469,6 +1519,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-ia32@npm:0.25.0" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-loong64@npm:0.18.20" @@ -1476,6 +1533,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-loong64@npm:0.25.0" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-mips64el@npm:0.18.20" @@ -1483,6 +1547,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-mips64el@npm:0.25.0" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-ppc64@npm:0.18.20" @@ -1490,6 +1561,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-ppc64@npm:0.25.0" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-riscv64@npm:0.18.20" @@ -1497,6 +1575,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-riscv64@npm:0.25.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-s390x@npm:0.18.20" @@ -1504,6 +1589,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-s390x@npm:0.25.0" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-x64@npm:0.18.20" @@ -1511,6 +1603,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/linux-x64@npm:0.25.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/netbsd-arm64@npm:0.25.0" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/netbsd-x64@npm:0.18.20" @@ -1518,6 +1624,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/netbsd-x64@npm:0.25.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/openbsd-arm64@npm:0.25.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/openbsd-x64@npm:0.18.20" @@ -1525,6 +1645,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/openbsd-x64@npm:0.25.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/sunos-x64@npm:0.18.20" @@ -1532,6 +1659,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/sunos-x64@npm:0.25.0" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-arm64@npm:0.18.20" @@ -1539,6 +1673,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/win32-arm64@npm:0.25.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-ia32@npm:0.18.20" @@ -1546,6 +1687,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/win32-ia32@npm:0.25.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-x64@npm:0.18.20" @@ -1553,6 +1701,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.25.0": + version: 0.25.0 + resolution: "@esbuild/win32-x64@npm:0.25.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -1736,162 +1891,13 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2": +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 languageName: node linkType: hard -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - slash: ^3.0.0 - checksum: 0e3624e32c5a8e7361e889db70b170876401b7d70f509a2538c31d5cd50deb0c1ae4b92dc63fe18a0902e0a48c590c21d53787a0df41a52b34fa7cab96c384d6 - languageName: node - linkType: hard - -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" - dependencies: - "@jest/console": ^29.7.0 - "@jest/reporters": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - ci-info: ^3.2.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-changed-files: ^29.7.0 - jest-config: ^29.7.0 - jest-haste-map: ^29.7.0 - jest-message-util: ^29.7.0 - jest-regex-util: ^29.6.3 - jest-resolve: ^29.7.0 - jest-resolve-dependencies: ^29.7.0 - jest-runner: ^29.7.0 - jest-runtime: ^29.7.0 - jest-snapshot: ^29.7.0 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - jest-watcher: ^29.7.0 - micromatch: ^4.0.4 - pretty-format: ^29.7.0 - slash: ^3.0.0 - strip-ansi: ^6.0.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: af759c9781cfc914553320446ce4e47775ae42779e73621c438feb1e4231a5d4862f84b1d8565926f2d1aab29b3ec3dcfdc84db28608bdf5f29867124ebcfc0d - languageName: node - linkType: hard - -"@jest/environment@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/environment@npm:29.7.0" - dependencies: - "@jest/fake-timers": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - jest-mock: ^29.7.0 - checksum: 6fb398143b2543d4b9b8d1c6dbce83fa5247f84f550330604be744e24c2bd2178bb893657d62d1b97cf2f24baf85c450223f8237cccb71192c36a38ea2272934 - languageName: node - linkType: hard - -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" - dependencies: - jest-get-type: ^29.6.3 - checksum: 75eb177f3d00b6331bcaa057e07c0ccb0733a1d0a1943e1d8db346779039cb7f103789f16e502f888a3096fb58c2300c38d1f3748b36a7fa762eb6f6d1b160ed - languageName: node - linkType: hard - -"@jest/expect@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect@npm:29.7.0" - dependencies: - expect: ^29.7.0 - jest-snapshot: ^29.7.0 - checksum: a01cb85fd9401bab3370618f4b9013b90c93536562222d920e702a0b575d239d74cecfe98010aaec7ad464f67cf534a353d92d181646a4b792acaa7e912ae55e - languageName: node - linkType: hard - -"@jest/fake-timers@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/fake-timers@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@sinonjs/fake-timers": ^10.0.2 - "@types/node": "*" - jest-message-util: ^29.7.0 - jest-mock: ^29.7.0 - jest-util: ^29.7.0 - checksum: caf2bbd11f71c9241b458d1b5a66cbe95debc5a15d96442444b5d5c7ba774f523c76627c6931cca5e10e76f0d08761f6f1f01a608898f4751a0eee54fc3d8d00 - languageName: node - linkType: hard - -"@jest/globals@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/globals@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/expect": ^29.7.0 - "@jest/types": ^29.6.3 - jest-mock: ^29.7.0 - checksum: 97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 - languageName: node - linkType: hard - -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@jridgewell/trace-mapping": ^0.3.18 - "@types/node": "*" - chalk: ^4.0.0 - collect-v8-coverage: ^1.0.0 - exit: ^0.1.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^6.0.0 - istanbul-lib-report: ^3.0.0 - istanbul-lib-source-maps: ^4.0.0 - istanbul-reports: ^3.1.3 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - jest-worker: ^29.7.0 - slash: ^3.0.0 - string-length: ^4.0.1 - strip-ansi: ^6.0.0 - v8-to-istanbul: ^9.0.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 7eadabd62cc344f629024b8a268ecc8367dba756152b761bdcb7b7e570a3864fc51b2a9810cd310d85e0a0173ef002ba4528d5ea0329fbf66ee2a3ada9c40455 - languageName: node - linkType: hard - "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -1901,41 +1907,6 @@ __metadata: languageName: node linkType: hard -"@jest/source-map@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/source-map@npm:29.6.3" - dependencies: - "@jridgewell/trace-mapping": ^0.3.18 - callsites: ^3.0.0 - graceful-fs: ^4.2.9 - checksum: bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb - languageName: node - linkType: hard - -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" - dependencies: - "@jest/console": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/istanbul-lib-coverage": ^2.0.0 - collect-v8-coverage: ^1.0.0 - checksum: 67b6317d526e335212e5da0e768e3b8ab8a53df110361b80761353ad23b6aea4432b7c5665bdeb87658ea373b90fb1afe02ed3611ef6c858c7fba377505057fa - languageName: node - linkType: hard - -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" - dependencies: - "@jest/test-result": ^29.7.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - slash: ^3.0.0 - checksum: 73f43599017946be85c0b6357993b038f875b796e2f0950487a82f4ebcb115fa12131932dd9904026b4ad8be131fe6e28bd8d0aa93b1563705185f9804bff8bd - languageName: node - linkType: hard - "@jest/transform@npm:^29.7.0": version: 29.7.0 resolution: "@jest/transform@npm:29.7.0" @@ -1973,14 +1944,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: - "@jridgewell/set-array": ^1.0.1 + "@jridgewell/set-array": ^1.2.1 "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + "@jridgewell/trace-mapping": ^0.3.24 + checksum: c0687b5227461717aa537fe71a42e356bcd1c43293b3353796a148bf3b0d6f59109def46c22f05b60e29a46f19b2e4676d027959a7c53a6c92b9d5b0d87d0420 languageName: node linkType: hard @@ -1991,27 +1962,27 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 languageName: node linkType: hard @@ -2085,8 +2056,6 @@ __metadata: "@metamask/eslint-config-typescript": ^10.0.0 "@metamask/utils": ^9.0.0 "@types/debug": ^4.1.7 - "@types/jest": ^29.5.10 - "@types/jest-when": ^3.5.2 "@types/node": ^17.0.23 "@types/prettier": ^2.7.3 "@types/rimraf": ^4.0.5 @@ -2095,6 +2064,7 @@ __metadata: "@types/yargs": ^17.0.10 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 + "@vitest/coverage-istanbul": ^3.0.7 babel-jest: ^29.7.0 debug: ^4.3.4 deepmerge: ^4.2.2 @@ -2106,9 +2076,7 @@ __metadata: eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^5.2.1 execa: ^8.0.1 - jest: ^29.7.0 jest-it-up: ^3.0.0 - jest-when: ^3.5.2 nanoid: ^3.3.4 pony-cause: ^2.1.9 prettier: ^3.3.3 @@ -2119,6 +2087,9 @@ __metadata: tsx: ^4.6.1 typescript: ~5.1.6 validate-npm-package-name: ^5.0.0 + vite: ^6.2.0 + vitest: ^3.0.7 + vitest-when: ^0.6.0 which: ^3.0.0 yaml: ^2.2.2 yargs: ^17.7.1 @@ -2369,10 +2340,143 @@ __metadata: languageName: node linkType: hard -"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0": - version: 1.1.3 - resolution: "@scure/base@npm:1.1.3" - checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c +"@rollup/rollup-android-arm-eabi@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.8" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm64@npm:4.34.8" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-arm64@npm:4.34.8" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-x64@npm:4.34.8" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.8" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-x64@npm:4.34.8" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.8" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.8" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.8" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.8" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.8" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.8" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.8" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.8" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.8" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0": + version: 1.1.3 + resolution: "@scure/base@npm:1.1.3" + checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c languageName: node linkType: hard @@ -2404,24 +2508,6 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^2.0.0": - version: 2.0.0 - resolution: "@sinonjs/commons@npm:2.0.0" - dependencies: - type-detect: 4.0.8 - checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.0.2 - resolution: "@sinonjs/fake-timers@npm:10.0.2" - dependencies: - "@sinonjs/commons": ^2.0.0 - checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 - languageName: node - linkType: hard - "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -2479,6 +2565,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.5 resolution: "@types/graceful-fs@npm:4.1.5" @@ -2488,7 +2581,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 @@ -2513,25 +2606,6 @@ __metadata: languageName: node linkType: hard -"@types/jest-when@npm:^3.5.2": - version: 3.5.2 - resolution: "@types/jest-when@npm:3.5.2" - dependencies: - "@types/jest": "*" - checksum: 106230dd71ee266bbd7620ab339a7305054e56ba7638f0eff9f222e67a959df0ad68a7f0108156c50f7005881bae59cd5c38b3760c101d060cdb3dac9cd77ee2 - languageName: node - linkType: hard - -"@types/jest@npm:*, @types/jest@npm:^29.5.10": - version: 29.5.10 - resolution: "@types/jest@npm:29.5.10" - dependencies: - expect: ^29.0.0 - pretty-format: ^29.0.0 - checksum: ef385905787db528de9b6beb2688865c0bb276e64256ed60b9a1a6ffc0b75737456cb5e27e952a3241c5845b6a1da487470010dd30f3ca59c8581624c564a823 - languageName: node - linkType: hard - "@types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -2601,13 +2675,6 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 - languageName: node - linkType: hard - "@types/validate-npm-package-name@npm:^4.0.2": version: 4.0.2 resolution: "@types/validate-npm-package-name@npm:4.0.2" @@ -2766,6 +2833,107 @@ __metadata: languageName: node linkType: hard +"@vitest/coverage-istanbul@npm:^3.0.7": + version: 3.0.7 + resolution: "@vitest/coverage-istanbul@npm:3.0.7" + dependencies: + "@istanbuljs/schema": ^0.1.3 + debug: ^4.4.0 + istanbul-lib-coverage: ^3.2.2 + istanbul-lib-instrument: ^6.0.3 + istanbul-lib-report: ^3.0.1 + istanbul-lib-source-maps: ^5.0.6 + istanbul-reports: ^3.1.7 + magicast: ^0.3.5 + test-exclude: ^7.0.1 + tinyrainbow: ^2.0.0 + peerDependencies: + vitest: 3.0.7 + checksum: 1aeee6382ef57ab4e786bf2ecd8753d724546fb425a3c1871c4be704f9b4aef39cd0eb055212eff1b88e3657b1daa77539252ebf5fe9a58a05b5491ca51c7175 + languageName: node + linkType: hard + +"@vitest/expect@npm:3.0.7": + version: 3.0.7 + resolution: "@vitest/expect@npm:3.0.7" + dependencies: + "@vitest/spy": 3.0.7 + "@vitest/utils": 3.0.7 + chai: ^5.2.0 + tinyrainbow: ^2.0.0 + checksum: 788ead8ec0876a15bcd51eba8b5e0bc4c95e07205192096c0e33328992c351a7569b32ea2f948dbfc7b5482f301e6d505cde639ead2e80ffc9f0d683714b1bfa + languageName: node + linkType: hard + +"@vitest/mocker@npm:3.0.7": + version: 3.0.7 + resolution: "@vitest/mocker@npm:3.0.7" + dependencies: + "@vitest/spy": 3.0.7 + estree-walker: ^3.0.3 + magic-string: ^0.30.17 + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 057fe03ab4f9ef40f5431a375dc812da8face4f6c6045c817402bcd0739992ff1d31de080d8ac8c4122f792b2d27c4c04a4e4e872a04c3ba2b1517bc78430130 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:3.0.7, @vitest/pretty-format@npm:^3.0.7": + version: 3.0.7 + resolution: "@vitest/pretty-format@npm:3.0.7" + dependencies: + tinyrainbow: ^2.0.0 + checksum: 5209282b26f57fa4bd918cba2265c34e161120f2fabc2987b0b77fb9a402a12cc5591d4e42689fcbdde5e2e1804cafc96e4e338d5b9d8b35ccbabd4cee7c8e81 + languageName: node + linkType: hard + +"@vitest/runner@npm:3.0.7": + version: 3.0.7 + resolution: "@vitest/runner@npm:3.0.7" + dependencies: + "@vitest/utils": 3.0.7 + pathe: ^2.0.3 + checksum: 980dd31c54b5b83e8ddc27d416999f3a8170abf3d836b2fb34a6730f942c53ad819399904bd46ea4bb89b4b0f3d0a793c135b3b83d70852859cbcad10111ae22 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:3.0.7": + version: 3.0.7 + resolution: "@vitest/snapshot@npm:3.0.7" + dependencies: + "@vitest/pretty-format": 3.0.7 + magic-string: ^0.30.17 + pathe: ^2.0.3 + checksum: d516bd7b04ba34726c57f1da7779165dbd376260f856a43254a4220ea6d040606440433583234de7282e0ec24fb7f6025d2a4f7688e2daebe75ed0afcd77d44c + languageName: node + linkType: hard + +"@vitest/spy@npm:3.0.7": + version: 3.0.7 + resolution: "@vitest/spy@npm:3.0.7" + dependencies: + tinyspy: ^3.0.2 + checksum: f62537dc2632ed20464c017ca2feeb18bf2edd653bb1f6cd69ec5e6b52bb3803b1a601ca56777b0c463ce8d960294a0db9198c106dd6048d48ee5e7d09eaba59 + languageName: node + linkType: hard + +"@vitest/utils@npm:3.0.7": + version: 3.0.7 + resolution: "@vitest/utils@npm:3.0.7" + dependencies: + "@vitest/pretty-format": 3.0.7 + loupe: ^3.1.3 + tinyrainbow: ^2.0.0 + checksum: 1a90d3444f9990484e6196d7cc1ceb0fcd8ca587319c0307d2e838f038ec45b7a711f8a76cbfb512fe13c6c3691e1d39d1d69158e27432724ec62b308e17f6e9 + languageName: node + linkType: hard + "abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -2856,7 +3024,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": +"ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -2879,15 +3047,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -2986,6 +3145,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 + languageName: node + linkType: hard + "babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" @@ -3145,17 +3311,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.9, browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" +"browserslist@npm:^4.22.2, browserslist@npm:^4.24.0": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" dependencies: - caniuse-lite: ^1.0.30001565 - electron-to-chromium: ^1.4.601 - node-releases: ^2.0.14 - update-browserslist-db: ^1.0.13 + caniuse-lite: ^1.0.30001688 + electron-to-chromium: ^1.5.73 + node-releases: ^2.0.19 + update-browserslist-db: ^1.1.1 bin: browserslist: cli.js - checksum: 33ddfcd9145220099a7a1ac533cecfe5b7548ffeb29b313e1b57be6459000a1f8fa67e781cf4abee97268ac594d44134fcc4a6b2b4750ceddc9796e3a22076d9 + checksum: 64074bf6cf0a9ae3094d753270e3eae9cf925149db45d646f0bc67bacc2e46d7ded64a4e835b95f5fdcf0350f63a83c3755b32f80831f643a47f0886deb8a065 languageName: node linkType: hard @@ -3168,10 +3334,10 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a languageName: node linkType: hard @@ -3245,28 +3411,23 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001701 + resolution: "caniuse-lite@npm:1.0.30001701" + checksum: 1abcb27ea3296dacdaa669cfe8e094432165f0541bf49ef7a88c2758d0cec5f9a839ea948f7f48c0c63c633d98f6f6c55ccf97ffebea2caaf465389500df5422 languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001566 - resolution: "caniuse-lite@npm:1.0.30001566" - checksum: 0f9084bf9f7d5c0a9ddb200c2baddb25dd2ad5a2f205f01e7b971f3e98e9a7bb23c2d86bae48237e9bc9782b682cffaaf3406d936937ab9844987dbe2a6401f2 - languageName: node - linkType: hard - -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" +"chai@npm:^5.2.0": + version: 5.2.0 + resolution: "chai@npm:5.2.0" dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + assertion-error: ^2.0.1 + check-error: ^2.1.1 + deep-eql: ^5.0.1 + loupe: ^3.1.0 + pathval: ^2.0.0 + checksum: 15e4ba12d02df3620fd59b4a6e8efe43b47872ce61f1c0ca77ac1205a2a5898f3b6f1f52408fd1a708b8d07fdfb5e65b97af40bad9fd94a69ed8d4264c7a69f1 languageName: node linkType: hard @@ -3280,10 +3441,10 @@ __metadata: languageName: node linkType: hard -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: d785ed17b1d4a4796b6e75c765a9a290098cf52ff9728ce0756e8ffd4293d2e419dd30c67200aee34202463b474306913f2fcfaf1890641026d9fc6966fea27a languageName: node linkType: hard @@ -3301,13 +3462,6 @@ __metadata: languageName: node linkType: hard -"cjs-module-lexer@npm:^1.0.0": - version: 1.2.2 - resolution: "cjs-module-lexer@npm:1.2.2" - checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -3347,29 +3501,6 @@ __metadata: languageName: node linkType: hard -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.1 - resolution: "collect-v8-coverage@npm:1.0.1" - checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -3379,13 +3510,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -3430,15 +3554,6 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.6.0": - version: 1.8.0 - resolution: "convert-source-map@npm:1.8.0" - dependencies: - safe-buffer: ~5.1.1 - checksum: 985d974a2d33e1a2543ada51c93e1ba2f73eaed608dc39f229afc78f71dcc4c8b7d7c684aa647e3c6a3a204027444d69e53e169ce94e8d1fa8d7dee80c9c8fed - languageName: node - linkType: hard - "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -3464,23 +3579,6 @@ __metadata: languageName: node linkType: hard -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - chalk: ^4.0.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-config: ^29.7.0 - jest-util: ^29.7.0 - prompts: ^2.0.1 - bin: - create-jest: bin/create-jest.js - checksum: 1427d49458adcd88547ef6fa39041e1fe9033a661293aa8d2c3aa1b4967cb5bf4f0c00436c7a61816558f28ba2ba81a94d5c962e8022ea9a883978fc8e1f2945 - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -3492,15 +3590,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: - ms: 2.1.2 + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 languageName: node linkType: hard @@ -3522,15 +3620,10 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 6aaaadb4c19cbce42e26b2bbe5bd92875f599d2602635dc97f0294bae48da79e89470aedee05f449e0ca8c65e9fd7e7872624d1933a1db02713d99c2ca8d1f24 languageName: node linkType: hard @@ -3579,13 +3672,6 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 - languageName: node - linkType: hard - "detect-newline@npm:^4.0.0": version: 4.0.1 resolution: "detect-newline@npm:4.0.1" @@ -3593,13 +3679,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: f4914158e1f2276343d98ff5b31fc004e7304f5470bf0f1adb2ac6955d85a531a6458d33e87667f98f6ae52ebd3891bb47d420bb48a5bd8b7a27ee25b20e33aa - languageName: node - linkType: hard - "diff@npm:^5.0.0": version: 5.1.0 resolution: "diff@npm:5.1.0" @@ -3641,17 +3720,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.605 - resolution: "electron-to-chromium@npm:1.4.605" - checksum: 2d42afd5d8cfc053d68944891f02fb007931fae85c0a19bc4f458bb3430e793b8a76664b058e1b06ab99e784f73e4c6b56493eaede2ff6012dbcaf8781fec4a7 - languageName: node - linkType: hard - -"emittery@npm:^0.13.1": - version: 0.13.1 - resolution: "emittery@npm:0.13.1" - checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 +"electron-to-chromium@npm:^1.5.73": + version: 1.5.105 + resolution: "electron-to-chromium@npm:1.5.105" + checksum: 21a7a080140567b347d97fcc6c7f96c0d9e7effe6b9f8b395126a54f556732e08feb74b3aca8c65bb600b4160c9d9b6c1e1ac024f850645994d3cf3cdf81e01f languageName: node linkType: hard @@ -3692,15 +3764,6 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - "es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": version: 1.20.1 resolution: "es-abstract@npm:1.20.1" @@ -3732,6 +3795,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.6.0": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 4413a9aed9bf581de62b98174f3eea3f23ce2994fb6832df64bdd6504f6977da1a3b5ebd3c10f75e3c2f214dcf1a1d8b54be5e62c71b7110e6ccedbf975d2b7d + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.0 resolution: "es-shim-unscopables@npm:1.0.0" @@ -3752,6 +3822,92 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.25.0": + version: 0.25.0 + resolution: "esbuild@npm:0.25.0" + dependencies: + "@esbuild/aix-ppc64": 0.25.0 + "@esbuild/android-arm": 0.25.0 + "@esbuild/android-arm64": 0.25.0 + "@esbuild/android-x64": 0.25.0 + "@esbuild/darwin-arm64": 0.25.0 + "@esbuild/darwin-x64": 0.25.0 + "@esbuild/freebsd-arm64": 0.25.0 + "@esbuild/freebsd-x64": 0.25.0 + "@esbuild/linux-arm": 0.25.0 + "@esbuild/linux-arm64": 0.25.0 + "@esbuild/linux-ia32": 0.25.0 + "@esbuild/linux-loong64": 0.25.0 + "@esbuild/linux-mips64el": 0.25.0 + "@esbuild/linux-ppc64": 0.25.0 + "@esbuild/linux-riscv64": 0.25.0 + "@esbuild/linux-s390x": 0.25.0 + "@esbuild/linux-x64": 0.25.0 + "@esbuild/netbsd-arm64": 0.25.0 + "@esbuild/netbsd-x64": 0.25.0 + "@esbuild/openbsd-arm64": 0.25.0 + "@esbuild/openbsd-x64": 0.25.0 + "@esbuild/sunos-x64": 0.25.0 + "@esbuild/win32-arm64": 0.25.0 + "@esbuild/win32-ia32": 0.25.0 + "@esbuild/win32-x64": 0.25.0 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 4d1e0cb7c059a373ea3edb20ca5efcea29efada03e4ea82b2b8ab1f2f062e4791e9744213308775d26e07a0225a7d8250da93da5c8e07ef61bb93d58caab8cf9 + languageName: node + linkType: hard + "esbuild@npm:~0.18.20": version: 0.18.20 resolution: "esbuild@npm:0.18.20" @@ -3829,10 +3985,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard @@ -3843,13 +3999,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -4139,6 +4288,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -4158,7 +4316,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0, execa@npm:^5.1.1": +"execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -4192,23 +4350,10 @@ __metadata: languageName: node linkType: hard -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 - languageName: node - linkType: hard - -"expect@npm:^29.0.0, expect@npm:^29.7.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" - dependencies: - "@jest/expect-utils": ^29.7.0 - jest-get-type: ^29.6.3 - jest-matcher-utils: ^29.7.0 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - checksum: 9257f10288e149b81254a0fda8ffe8d54a7061cd61d7515779998b012579d2b8c22354b0eb901daf0145f347403da582f75f359f4810c007182ad3fb318b5c0c +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 65d25ec10bca32bcf650dcfe734532acc4b7a73677c656f299a7cbed273b5c4d6a3dab11af76f452645d54a95c4ef39fc73772f2c8eb6684ba35672958d6f3b3 languageName: node linkType: hard @@ -4314,7 +4459,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": +"find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: @@ -4386,7 +4531,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4396,7 +4541,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" dependencies: @@ -4544,7 +4689,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -4670,13 +4815,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -4847,18 +4985,6 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" - dependencies: - pkg-dir: ^4.2.0 - resolve-cwd: ^3.0.0 - bin: - import-local-fixture: fixtures/cli.js - checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd - languageName: node - linkType: hard - "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -4925,13 +5051,6 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -4990,13 +5109,6 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 - languageName: node - linkType: hard - "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -5124,10 +5236,10 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0, istanbul-lib-coverage@npm:^3.2.2": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 2367407a8d13982d8f7a859a35e7f8dd5d8f75aae4bb5484ede3a9ea1b426dc245aff28b976a2af48ee759fdd9be374ce2bd2669b644f31e76c5f46a2e29a831 languageName: node linkType: hard @@ -5144,48 +5256,48 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.1 - resolution: "istanbul-lib-instrument@npm:6.0.1" +"istanbul-lib-instrument@npm:^6.0.3": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 + "@babel/core": ^7.23.9 + "@babel/parser": ^7.23.9 + "@istanbuljs/schema": ^0.1.3 istanbul-lib-coverage: ^3.2.0 semver: ^7.5.4 - checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 + checksum: 74104c60c65c4fa0e97cc76f039226c356123893929f067bfad5f86fe839e08f5d680354a68fead3bc9c1e2f3fa6f3f53cded70778e821d911e851d349f3545a languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-report@npm:3.0.0" +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" dependencies: istanbul-lib-coverage: ^3.0.0 - make-dir: ^3.0.0 + make-dir: ^4.0.0 supports-color: ^7.1.0 - checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b + checksum: fd17a1b879e7faf9bb1dc8f80b2a16e9f5b7b8498fe6ed580a618c34df0bfe53d2abd35bf8a0a00e628fb7405462576427c7df20bbe4148d19c14b431c974b21 languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" +"istanbul-lib-source-maps@npm:^5.0.6": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" dependencies: + "@jridgewell/trace-mapping": ^0.3.23 debug: ^4.1.1 istanbul-lib-coverage: ^3.0.0 - source-map: ^0.6.1 - checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 + checksum: 8dd6f2c1e2ecaacabeef8dc9ab52c4ed0a6036310002cf7f46ea6f3a5fb041da8076f5350e6a6be4c60cd4f231c51c73e042044afaf44820d857d92ecfb8ab6c languageName: node linkType: hard -"istanbul-reports@npm:^3.1.3": - version: 3.1.4 - resolution: "istanbul-reports@npm:3.1.4" +"istanbul-reports@npm:^3.1.7": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 2132983355710c522f6b26808015cab9a0ee8b9f5ae0db0d3edeff40b886dd83cb670fb123cb7b32dbe59473d7c00cdde2ba6136bc0acdb20a865fccea64dfe1 + checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 languageName: node linkType: hard @@ -5202,164 +5314,6 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" - dependencies: - execa: ^5.0.0 - jest-util: ^29.7.0 - p-limit: ^3.1.0 - checksum: 963e203893c396c5dfc75e00a49426688efea7361b0f0e040035809cecd2d46b3c01c02be2d9e8d38b1138357d2de7719ea5b5be21f66c10f2e9685a5a73bb99 - languageName: node - linkType: hard - -"jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/expect": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - co: ^4.6.0 - dedent: ^1.0.0 - is-generator-fn: ^2.0.0 - jest-each: ^29.7.0 - jest-matcher-utils: ^29.7.0 - jest-message-util: ^29.7.0 - jest-runtime: ^29.7.0 - jest-snapshot: ^29.7.0 - jest-util: ^29.7.0 - p-limit: ^3.1.0 - pretty-format: ^29.7.0 - pure-rand: ^6.0.0 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 349437148924a5a109c9b8aad6d393a9591b4dac1918fc97d81b7fc515bc905af9918495055071404af1fab4e48e4b04ac3593477b1d5dcf48c4e71b527c70a7 - languageName: node - linkType: hard - -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" - dependencies: - "@jest/core": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/types": ^29.6.3 - chalk: ^4.0.0 - create-jest: ^29.7.0 - exit: ^0.1.2 - import-local: ^3.0.2 - jest-config: ^29.7.0 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - yargs: ^17.3.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 664901277a3f5007ea4870632ed6e7889db9da35b2434e7cb488443e6bf5513889b344b7fddf15112135495b9875892b156faeb2d7391ddb9e2a849dcb7b6c36 - languageName: node - linkType: hard - -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" - dependencies: - "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.7.0 - "@jest/types": ^29.6.3 - babel-jest: ^29.7.0 - chalk: ^4.0.0 - ci-info: ^3.2.0 - deepmerge: ^4.2.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-circus: ^29.7.0 - jest-environment-node: ^29.7.0 - jest-get-type: ^29.6.3 - jest-regex-util: ^29.6.3 - jest-resolve: ^29.7.0 - jest-runner: ^29.7.0 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - micromatch: ^4.0.4 - parse-json: ^5.2.0 - pretty-format: ^29.7.0 - slash: ^3.0.0 - strip-json-comments: ^3.1.1 - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: 4cabf8f894c180cac80b7df1038912a3fc88f96f2622de33832f4b3314f83e22b08fb751da570c0ab2b7988f21604bdabade95e3c0c041068ac578c085cf7dff - languageName: node - linkType: hard - -"jest-diff@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-diff@npm:29.7.0" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^29.6.3 - jest-get-type: ^29.6.3 - pretty-format: ^29.7.0 - checksum: 08e24a9dd43bfba1ef07a6374e5af138f53137b79ec3d5cc71a2303515335898888fa5409959172e1e05de966c9e714368d15e8994b0af7441f0721ee8e1bb77 - languageName: node - linkType: hard - -"jest-docblock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-docblock@npm:29.7.0" - dependencies: - detect-newline: ^3.0.0 - checksum: 66390c3e9451f8d96c5da62f577a1dad701180cfa9b071c5025acab2f94d7a3efc2515cfa1654ebe707213241541ce9c5530232cdc8017c91ed64eea1bd3b192 - languageName: node - linkType: hard - -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - chalk: ^4.0.0 - jest-get-type: ^29.6.3 - jest-util: ^29.7.0 - pretty-format: ^29.7.0 - checksum: e88f99f0184000fc8813f2a0aa79e29deeb63700a3b9b7928b8a418d7d93cd24933608591dbbdea732b473eb2021c72991b5cc51a17966842841c6e28e6f691c - languageName: node - linkType: hard - -"jest-environment-node@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-environment-node@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/fake-timers": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - jest-mock: ^29.7.0 - jest-util: ^29.7.0 - checksum: 501a9966292cbe0ca3f40057a37587cb6def25e1e0c5e39ac6c650fe78d3c70a2428304341d084ac0cced5041483acef41c477abac47e9a290d5545fd2f15646 - languageName: node - linkType: hard - -"jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 - languageName: node - linkType: hard - "jest-haste-map@npm:^29.7.0": version: 29.7.0 resolution: "jest-haste-map@npm:29.7.0" @@ -5396,68 +5350,6 @@ __metadata: languageName: node linkType: hard -"jest-leak-detector@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-leak-detector@npm:29.7.0" - dependencies: - jest-get-type: ^29.6.3 - pretty-format: ^29.7.0 - checksum: e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-matcher-utils@npm:29.7.0" - dependencies: - chalk: ^4.0.0 - jest-diff: ^29.7.0 - jest-get-type: ^29.6.3 - pretty-format: ^29.7.0 - checksum: d7259e5f995d915e8a37a8fd494cb7d6af24cd2a287b200f831717ba0d015190375f9f5dc35393b8ba2aae9b2ebd60984635269c7f8cff7d85b077543b7744cd - languageName: node - linkType: hard - -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.6.3 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^29.7.0 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: a9d025b1c6726a2ff17d54cc694de088b0489456c69106be6b615db7a51b7beb66788bea7a59991a019d924fbf20f67d085a445aedb9a4d6760363f4d7d09930 - languageName: node - linkType: hard - -"jest-mock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-mock@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/node": "*" - jest-util: ^29.7.0 - checksum: 81ba9b68689a60be1482212878973700347cb72833c5e5af09895882b9eb5c4e02843a1bbdf23f94c52d42708bab53a30c45a3482952c9eec173d1eaac5b86c5 - languageName: node - linkType: hard - -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.2 - resolution: "jest-pnp-resolver@npm:1.2.2" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: bd85dcc0e76e0eb0c3d56382ec140f08d25ff4068cda9d0e360bb78fb176cb726d0beab82dc0e8694cafd09f55fee7622b8bcb240afa5fad301f4ed3eebb4f47 - languageName: node - linkType: hard - "jest-regex-util@npm:^29.6.3": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" @@ -5465,120 +5357,6 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" - dependencies: - jest-regex-util: ^29.6.3 - jest-snapshot: ^29.7.0 - checksum: aeb75d8150aaae60ca2bb345a0d198f23496494677cd6aefa26fc005faf354061f073982175daaf32b4b9d86b26ca928586344516e3e6969aa614cb13b883984 - languageName: node - linkType: hard - -"jest-resolve@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve@npm:29.7.0" - dependencies: - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - jest-pnp-resolver: ^1.2.2 - jest-util: ^29.7.0 - jest-validate: ^29.7.0 - resolve: ^1.20.0 - resolve.exports: ^2.0.0 - slash: ^3.0.0 - checksum: 0ca218e10731aa17920526ec39deaec59ab9b966237905ffc4545444481112cd422f01581230eceb7e82d86f44a543d520a71391ec66e1b4ef1a578bd5c73487 - languageName: node - linkType: hard - -"jest-runner@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runner@npm:29.7.0" - dependencies: - "@jest/console": ^29.7.0 - "@jest/environment": ^29.7.0 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - emittery: ^0.13.1 - graceful-fs: ^4.2.9 - jest-docblock: ^29.7.0 - jest-environment-node: ^29.7.0 - jest-haste-map: ^29.7.0 - jest-leak-detector: ^29.7.0 - jest-message-util: ^29.7.0 - jest-resolve: ^29.7.0 - jest-runtime: ^29.7.0 - jest-util: ^29.7.0 - jest-watcher: ^29.7.0 - jest-worker: ^29.7.0 - p-limit: ^3.1.0 - source-map-support: 0.5.13 - checksum: f0405778ea64812bf9b5c50b598850d94ccf95d7ba21f090c64827b41decd680ee19fcbb494007cdd7f5d0d8906bfc9eceddd8fa583e753e736ecd462d4682fb - languageName: node - linkType: hard - -"jest-runtime@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runtime@npm:29.7.0" - dependencies: - "@jest/environment": ^29.7.0 - "@jest/fake-timers": ^29.7.0 - "@jest/globals": ^29.7.0 - "@jest/source-map": ^29.6.3 - "@jest/test-result": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - chalk: ^4.0.0 - cjs-module-lexer: ^1.0.0 - collect-v8-coverage: ^1.0.0 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - jest-message-util: ^29.7.0 - jest-mock: ^29.7.0 - jest-regex-util: ^29.6.3 - jest-resolve: ^29.7.0 - jest-snapshot: ^29.7.0 - jest-util: ^29.7.0 - slash: ^3.0.0 - strip-bom: ^4.0.0 - checksum: d19f113d013e80691e07047f68e1e3448ef024ff2c6b586ce4f90cd7d4c62a2cd1d460110491019719f3c59bfebe16f0e201ed005ef9f80e2cf798c374eed54e - languageName: node - linkType: hard - -"jest-snapshot@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-snapshot@npm:29.7.0" - dependencies: - "@babel/core": ^7.11.6 - "@babel/generator": ^7.7.2 - "@babel/plugin-syntax-jsx": ^7.7.2 - "@babel/plugin-syntax-typescript": ^7.7.2 - "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.7.0 - "@jest/transform": ^29.7.0 - "@jest/types": ^29.6.3 - babel-preset-current-node-syntax: ^1.0.0 - chalk: ^4.0.0 - expect: ^29.7.0 - graceful-fs: ^4.2.9 - jest-diff: ^29.7.0 - jest-get-type: ^29.6.3 - jest-matcher-utils: ^29.7.0 - jest-message-util: ^29.7.0 - jest-util: ^29.7.0 - natural-compare: ^1.4.0 - pretty-format: ^29.7.0 - semver: ^7.5.3 - checksum: 86821c3ad0b6899521ce75ee1ae7b01b17e6dfeff9166f2cf17f012e0c5d8c798f30f9e4f8f7f5bed01ea7b55a6bc159f5eda778311162cbfa48785447c237ad - languageName: node - linkType: hard - "jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" @@ -5586,49 +5364,10 @@ __metadata: "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca - languageName: node - linkType: hard - -"jest-validate@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-validate@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - camelcase: ^6.2.0 - chalk: ^4.0.0 - jest-get-type: ^29.6.3 - leven: ^3.1.0 - pretty-format: ^29.7.0 - checksum: 191fcdc980f8a0de4dbdd879fa276435d00eb157a48683af7b3b1b98b0f7d9de7ffe12689b617779097ff1ed77601b9f7126b0871bba4f776e222c40f62e9dae - languageName: node - linkType: hard - -"jest-watcher@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" - dependencies: - "@jest/test-result": ^29.7.0 - "@jest/types": ^29.6.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - emittery: ^0.13.1 - jest-util: ^29.7.0 - string-length: ^4.0.1 - checksum: 67e6e7fe695416deff96b93a14a561a6db69389a0667e9489f24485bb85e5b54e12f3b2ba511ec0b777eca1e727235b073e3ebcdd473d68888650489f88df92f - languageName: node - linkType: hard - -"jest-when@npm:^3.5.2": - version: 3.5.2 - resolution: "jest-when@npm:3.5.2" - peerDependencies: - jest: ">= 25" - checksum: 9ad95552d377ef4d517c96a14c38bd8626d6856f518e7efc8a01d76a45a39d3c52281392c98da781c302114c78cd1ea17556c7f638d49d15971fcce9d58306e8 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca languageName: node linkType: hard @@ -5644,25 +5383,6 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.7.0": - version: 29.7.0 - resolution: "jest@npm:29.7.0" - dependencies: - "@jest/core": ^29.7.0 - "@jest/types": ^29.6.3 - import-local: ^3.0.2 - jest-cli: ^29.7.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 17ca8d67504a7dbb1998cf3c3077ec9031ba3eb512da8d71cb91bcabb2b8995c4e4b292b740cb9bf1cbff5ce3e110b3f7c777b0cefb6f41ab05445f248d0ee0b - languageName: node - linkType: hard - "js-sdsl@npm:^4.1.4": version: 4.1.5 resolution: "js-sdsl@npm:4.1.5" @@ -5714,12 +5434,12 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f languageName: node linkType: hard @@ -5732,13 +5452,6 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - "json-parse-even-better-errors@npm:^3.0.0": version: 3.0.0 resolution: "json-parse-even-better-errors@npm:3.0.0" @@ -5780,20 +5493,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 - languageName: node - linkType: hard - "levn@npm:^0.4.1": version: 0.4.1 resolution: "levn@npm:0.4.1" @@ -5804,13 +5503,6 @@ __metadata: languageName: node linkType: hard -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" @@ -5853,6 +5545,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.3": + version: 3.1.3 + resolution: "loupe@npm:3.1.3" + checksum: 9b2530b1d5a44d2c9fc5241f97ea00296dca257173c535b4832bc31f9516e10387991feb5b3fff23df116c8fcf907ce3980f82b215dcc5d19cde17ce9b9ec3e1 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -5876,12 +5575,32 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + checksum: f4b4ed17c5ada64f77fc98491847302ebad64894a905c417c943840c0384662118c9b37f9f68bb86add159fa4749ff6f118c4627d69a470121b46731f8debc6d + languageName: node + linkType: hard + +"magicast@npm:^0.3.5": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" + dependencies: + "@babel/parser": ^7.25.4 + "@babel/types": ^7.25.4 + source-map-js: ^1.2.0 + checksum: 668f07ade907a44bccfc9a9321588473f6d5fa25329aa26b9ad9a3bf87cc2e6f9c482cbdd3e33c0b9ab9b79c065630c599cc055a12f881c8c924ee0d7282cdce + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" dependencies: - semver: ^6.0.0 - checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 + semver: ^7.5.3 + checksum: bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a languageName: node linkType: hard @@ -6157,14 +5876,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -6178,12 +5890,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.4": - version: 3.3.4 - resolution: "nanoid@npm:3.3.4" +"nanoid@npm:^3.3.4, nanoid@npm:^3.3.8": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: nanoid: bin/nanoid.cjs - checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c + checksum: dfe0adbc0c77e9655b550c333075f51bb28cfc7568afbf3237249904f9c86c9aaaed1f113f0fddddba75673ee31c758c30c43d4414f014a52a7a626efc5958c9 languageName: node linkType: hard @@ -6255,10 +5967,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 917dbced519f48c6289a44830a0ca6dc944c3ee9243c468ebd8515a41c97c8b2c256edb7f3f750416bc37952cc9608684e6483c7b6c6f39f6bd8d86c52cfe658 languageName: node linkType: hard @@ -6468,7 +6180,7 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -6543,18 +6255,6 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -6614,10 +6314,24 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 0602bdd4acb54d91044e0c56f1fb63467ae7d44ab3afea1f797947b0eb2b4d1d91cf0d58d065fdb0a8ab0c4acbbd8d3a5b424983eaf10dd5285d37a16f6e3ee9 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 682b6a6289de7990909effef7dae9aa7bb6218c0426727bccf66a35b34e7bfbc65615270c5e44e3c9557a5cb44b1b9ef47fc3cb18bce6ad3ba92bcd28467ed7d + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard @@ -6635,15 +6349,6 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: ^4.0.0 - checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - "pony-cause@npm:^2.1.10, pony-cause@npm:^2.1.9": version: 2.1.10 resolution: "pony-cause@npm:2.1.10" @@ -6651,6 +6356,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.5.3": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" + dependencies: + nanoid: ^3.3.8 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: da574620eb84ff60e65e1d8fc6bd5ad87a19101a23d0aba113c653434161543918229a0f673d89efb3b6d4906287eb04b957310dbcf4cbebacad9d1312711461 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -6691,7 +6407,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": +"pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" dependencies: @@ -6726,16 +6442,6 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: ^3.0.3 - sisteransi: ^1.0.5 - checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d - languageName: node - linkType: hard - "punycode@npm:^2.1.0": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -6743,13 +6449,6 @@ __metadata: languageName: node linkType: hard -"pure-rand@npm:^6.0.0": - version: 6.0.2 - resolution: "pure-rand@npm:6.0.2" - checksum: 79de33876a4f515d759c48e98d00756bbd916b4ea260cc572d7adfa4b62cace9952e89f0241d0410214554503d25061140fe325c66f845213d2b1728ba8d413e - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -6758,9 +6457,9 @@ __metadata: linkType: hard "react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard @@ -6864,15 +6563,6 @@ __metadata: languageName: node linkType: hard -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: ^5.0.0 - checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -6894,13 +6584,6 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 1c7778ca1b86a94f8ab4055d196c7d87d1874b96df4d7c3e67bbf793140f0717fd506dcafd62785b079cd6086b9264424ad634fb904409764c3509c3df1653f2 - languageName: node - linkType: hard - "resolve@npm:1.22.8, resolve@npm:^1.10.1, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" @@ -6974,6 +6657,78 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.30.1": + version: 4.34.8 + resolution: "rollup@npm:4.34.8" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.34.8 + "@rollup/rollup-android-arm64": 4.34.8 + "@rollup/rollup-darwin-arm64": 4.34.8 + "@rollup/rollup-darwin-x64": 4.34.8 + "@rollup/rollup-freebsd-arm64": 4.34.8 + "@rollup/rollup-freebsd-x64": 4.34.8 + "@rollup/rollup-linux-arm-gnueabihf": 4.34.8 + "@rollup/rollup-linux-arm-musleabihf": 4.34.8 + "@rollup/rollup-linux-arm64-gnu": 4.34.8 + "@rollup/rollup-linux-arm64-musl": 4.34.8 + "@rollup/rollup-linux-loongarch64-gnu": 4.34.8 + "@rollup/rollup-linux-powerpc64le-gnu": 4.34.8 + "@rollup/rollup-linux-riscv64-gnu": 4.34.8 + "@rollup/rollup-linux-s390x-gnu": 4.34.8 + "@rollup/rollup-linux-x64-gnu": 4.34.8 + "@rollup/rollup-linux-x64-musl": 4.34.8 + "@rollup/rollup-win32-arm64-msvc": 4.34.8 + "@rollup/rollup-win32-ia32-msvc": 4.34.8 + "@rollup/rollup-win32-x64-msvc": 4.34.8 + "@types/estree": 1.0.6 + fsevents: ~2.3.2 + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 8c4abc97c16d4e80e4d803544ad004ba00f769aee460ff04200716f526fdcc3dd7ef6b71ae36aa5779bed410ef7244e15ffa0e3370711065dd15e2bd27d0cef5 + languageName: node + linkType: hard + "run-async@npm:^3.0.0": version: 3.0.0 resolution: "run-async@npm:3.0.0" @@ -6990,13 +6745,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c - languageName: node - linkType: hard - "safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -7011,7 +6759,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.3.0, semver@npm:^6.3.1": +"semver@npm:^6.1.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -7063,6 +6811,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 8aa5a98640ca09fe00d74416eca97551b3e42991614a3d1b824b115fc1401543650914f651ab1311518177e4d297e80b953f4cd4cd7ea1eabe824e8f2091de01 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -7077,13 +6832,6 @@ __metadata: languageName: node linkType: hard -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 - languageName: node - linkType: hard - "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -7162,20 +6910,10 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b languageName: node linkType: hard @@ -7245,12 +6983,17 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3": - version: 2.0.5 - resolution: "stack-utils@npm:2.0.5" - dependencies: - escape-string-regexp: ^2.0.0 - checksum: 76b69da0f5b48a34a0f93c98ee2a96544d2c4ca2557f7eef5ddb961d3bdc33870b46f498a84a7c4f4ffb781df639840e7ebf6639164ed4da5e1aeb659615b9c7 +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + +"std-env@npm:^3.8.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: ad4554485c2d09138a1d0f03944245e169510e6f5200b7d30fcdd4536e27a2a9a2fd934caff7ef58ebbe21993fa0e2b9e5b1979f431743c925305863b7ff36d5 languageName: node linkType: hard @@ -7261,16 +7004,6 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: ^1.0.2 - strip-ansi: ^6.0.0 - checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 - languageName: node - linkType: hard - "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -7349,13 +7082,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 - languageName: node - linkType: hard - "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -7377,15 +7103,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -7446,6 +7163,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^7.0.1": + version: 7.0.1 + resolution: "test-exclude@npm:7.0.1" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^10.4.1 + minimatch: ^9.0.4 + checksum: e5a49a054bf2da74467dd8149b202166e36275c0dc2c9585f7d34de99c6d055d2287ac8d2a8e4c27c59b893acbc671af3fa869e8069a58ad117250e9c01c726b + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -7453,17 +7181,45 @@ __metadata: languageName: node linkType: hard -"tmpl@npm:1.0.5": - version: 1.0.5 - resolution: "tmpl@npm:1.0.5" - checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 1ab00d7dfe0d1f127cbf00822bacd9024f7a50a3ecd1f354a8168e0b7d2b53a639a24414e707c27879d1adc0f5153141d51d76ebd7b4d37fe245e742e5d91fe8 + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: bd491923020610bdeadb0d8cf5d70e7cbad5a3201620fd01048c9bf3b31ffaa75c33254e1540e13b993ce4e8187852b0b5a93057bb598e7a57afa2ca2048a35c + languageName: node + linkType: hard + +"tinypool@npm:^1.0.2": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 752f23114d8fc95a9497fc812231d6d0a63728376aa11e6e8499c10423a91112e760e388887ea7854f1b16977c321f07c0eab061ec2f60f6761e58b184aac880 languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": +"tinyrainbow@npm:^2.0.0": version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 26360631d97e43955a07cfb70fe40a154ce4e2bcd14fa3d37ce8e2ed8f4fa9e5ba00783e4906bbfefe6dcabef5d3510f5bee207cb693bee4e4e7553f5454bef1 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 languageName: node linkType: hard @@ -7538,13 +7294,6 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 - languageName: node - linkType: hard - "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" @@ -7665,17 +7414,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 + escalade: ^3.2.0 + picocolors: ^1.1.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + checksum: 088d2bad8ddeaeccd82d87d3f6d736d5256d697b725ffaa2b601dfd0ec16ba5fad20db8dcdccf55396e1a36194236feb69e3f5cce772e5be15a5e4261ff2815d languageName: node linkType: hard @@ -7704,17 +7453,6 @@ __metadata: languageName: node linkType: hard -"v8-to-istanbul@npm:^9.0.1": - version: 9.0.1 - resolution: "v8-to-istanbul@npm:9.0.1" - dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^1.6.0 - checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 - languageName: node - linkType: hard - "validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -7732,6 +7470,141 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:3.0.7": + version: 3.0.7 + resolution: "vite-node@npm:3.0.7" + dependencies: + cac: ^6.7.14 + debug: ^4.4.0 + es-module-lexer: ^1.6.0 + pathe: ^2.0.3 + vite: ^5.0.0 || ^6.0.0 + bin: + vite-node: vite-node.mjs + checksum: 90a3dd0e1b620cdf0c20272739cd1035af20c9b7606c1a093b3368b2c7c59cfd2327c27faabfbc9b293ae5d9a3318aeb40a2a974fe42807167e4cec625d9759e + languageName: node + linkType: hard + +"vite@npm:^5.0.0 || ^6.0.0, vite@npm:^6.2.0": + version: 6.2.0 + resolution: "vite@npm:6.2.0" + dependencies: + esbuild: ^0.25.0 + fsevents: ~2.3.3 + postcss: ^8.5.3 + rollup: ^4.30.1 + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 0f2b6232fe94184885dd025609995874ac75279a85596a4053a283bd8bd0391f8ed3e7efb3e8f94073811a2b237c626e850990b04d2c7a1dc33f05d150f36bcd + languageName: node + linkType: hard + +"vitest-when@npm:^0.6.0": + version: 0.6.0 + resolution: "vitest-when@npm:0.6.0" + dependencies: + pretty-format: ^29.7.0 + peerDependencies: + "@vitest/expect": ">=0.31.0 <4" + vitest: ">=0.31.0 <4" + peerDependenciesMeta: + "@vitest/expect": + optional: true + checksum: a50221f153ee851b450a9edb368b2fba8db2e6c71034cdcbc11a2c8c4bd82282bb567ea837ef3ac575e32a781b9564ad63b5c470cbcbbdca84dfe20b334e3bf5 + languageName: node + linkType: hard + +"vitest@npm:^3.0.7": + version: 3.0.7 + resolution: "vitest@npm:3.0.7" + dependencies: + "@vitest/expect": 3.0.7 + "@vitest/mocker": 3.0.7 + "@vitest/pretty-format": ^3.0.7 + "@vitest/runner": 3.0.7 + "@vitest/snapshot": 3.0.7 + "@vitest/spy": 3.0.7 + "@vitest/utils": 3.0.7 + chai: ^5.2.0 + debug: ^4.4.0 + expect-type: ^1.1.0 + magic-string: ^0.30.17 + pathe: ^2.0.3 + std-env: ^3.8.0 + tinybench: ^2.9.0 + tinyexec: ^0.3.2 + tinypool: ^1.0.2 + tinyrainbow: ^2.0.0 + vite: ^5.0.0 || ^6.0.0 + vite-node: 3.0.7 + why-is-node-running: ^2.3.0 + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.0.7 + "@vitest/ui": 3.0.7 + 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 + bin: + vitest: vitest.mjs + checksum: f384103ce5fdd5f0e4e3fbbb8e015ce887f1af6399a31a4fb8906407a6f4925b2e1708caba014c81f1c4a59627e944a65c7dc4de2819e7fe0b044796c57630ae + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -7787,6 +7660,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: ^2.0.0 + stackback: 0.0.2 + bin: + why-is-node-running: cli.js + checksum: 58ebbf406e243ace97083027f0df7ff4c2108baf2595bb29317718ef207cc7a8104e41b711ff65d6fa354f25daa8756b67f2f04931a4fd6ba9d13ae8197496fb + languageName: node + linkType: hard + "wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -7898,7 +7783,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2, yargs@npm:^17.0.1, yargs@npm:^17.3.1, yargs@npm:^17.7.1": +"yargs@npm:17.7.2, yargs@npm:^17.0.1, yargs@npm:^17.7.1": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: