From a6f42ea472cfbe7047a0fb89ab0cd728b4e04ae1 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Fri, 2 May 2025 14:42:58 +0200 Subject: [PATCH 01/10] Upgrade @ava/test to 6.3.0 --- package-lock.json | 114 ++++++---------------------------------------- 1 file changed, 14 insertions(+), 100 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39a0dde22..1cc7ecf5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -255,45 +255,45 @@ }, "node_modules/@ava/v6": { "name": "ava", - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-6.2.0.tgz", - "integrity": "sha512-+GZk5PbyepjiO/68hzCZCUepQOQauKfNnI7sA4JukBTg97jD7E+tDKEA7OhGOGr6EorNNMM9+jqvgHVOTOzG4w==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-6.3.0.tgz", + "integrity": "sha512-64K+xNmlgMo1D94evJlkBWmJ6CGrO6oEctGEjA3PIl5GrwZyMXM5OEycZWnKGduE1YdqMvYDl29SgnNk7kyx+A==", "dev": true, "license": "MIT", "dependencies": { - "@vercel/nft": "^0.27.5", - "acorn": "^8.13.0", + "@vercel/nft": "^0.29.2", + "acorn": "^8.14.1", "acorn-walk": "^8.3.4", "ansi-styles": "^6.2.1", "arrgv": "^1.0.2", "arrify": "^3.0.0", "callsites": "^4.2.0", - "cbor": "^9.0.2", - "chalk": "^5.3.0", + "cbor": "^10.0.3", + "chalk": "^5.4.1", "chunkd": "^2.0.1", - "ci-info": "^4.0.0", + "ci-info": "^4.2.0", "ci-parallel-vars": "^1.0.1", "cli-truncate": "^4.0.0", "code-excerpt": "^4.0.0", "common-path-prefix": "^3.0.0", "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.3.7", - "emittery": "^1.0.3", + "debug": "^4.4.0", + "emittery": "^1.1.0", "figures": "^6.1.0", - "globby": "^14.0.2", + "globby": "^14.1.0", "ignore-by-default": "^2.1.0", "indent-string": "^5.0.0", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", "matcher": "^5.0.0", - "memoize": "^10.0.0", + "memoize": "^10.1.0", "ms": "^2.1.3", - "p-map": "^7.0.2", + "p-map": "^7.0.3", "package-config": "^5.0.0", "picomatch": "^4.0.2", "plur": "^5.1.0", - "pretty-ms": "^9.1.0", + "pretty-ms": "^9.2.0", "resolve-cwd": "^3.0.0", "stack-utils": "^2.0.6", "strip-ansi": "^7.1.0", @@ -317,92 +317,6 @@ } } }, - "node_modules/@ava/v6/node_modules/@vercel/nft": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", - "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0-rc.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@ava/v6/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@ava/v6/node_modules/cbor": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", - "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@ava/v6/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@ava/v6/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", From 31a1262e6c5c1b1514453b7a90a6b871e444e50f Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Thu, 5 Jun 2025 21:37:45 +0200 Subject: [PATCH 02/10] Test with Node.js 24, remove v23 test runs * Stop testing Node.js 23 Leave allowed in engines for now. * Test with Node.js 24 --- .github/workflows/ci.yml | 2 +- package.json | 2 +- .../{default.edgecases.v23.log => default.edgecases.v24.log} | 0 .../{default.failfast.v23.log => default.failfast.v24.log} | 0 .../{default.failfast2.v23.log => default.failfast2.v24.log} | 0 .../reporters/{default.only.v23.log => default.only.v24.log} | 0 .../{default.regular.v23.log => default.regular.v24.log} | 0 ...utcontextlogs.v23.log => default.timeoutcontextlogs.v24.log} | 0 ...iplefiles.v23.log => default.timeoutinmultiplefiles.v24.log} | 0 ...insinglefile.v23.log => default.timeoutinsinglefile.v24.log} | 0 ...imeoutwithmatch.v23.log => default.timeoutwithmatch.v24.log} | 0 .../reporters/{default.watch.v23.log => default.watch.v24.log} | 0 .../reporters/{tap.edgecases.v23.log => tap.edgecases.v24.log} | 0 .../reporters/{tap.failfast.v23.log => tap.failfast.v24.log} | 0 .../reporters/{tap.failfast2.v23.log => tap.failfast2.v24.log} | 0 test-tap/reporters/{tap.only.v23.log => tap.only.v24.log} | 0 test-tap/reporters/{tap.regular.v23.log => tap.regular.v24.log} | 0 17 files changed, 2 insertions(+), 2 deletions(-) rename test-tap/reporters/{default.edgecases.v23.log => default.edgecases.v24.log} (100%) rename test-tap/reporters/{default.failfast.v23.log => default.failfast.v24.log} (100%) rename test-tap/reporters/{default.failfast2.v23.log => default.failfast2.v24.log} (100%) rename test-tap/reporters/{default.only.v23.log => default.only.v24.log} (100%) rename test-tap/reporters/{default.regular.v23.log => default.regular.v24.log} (100%) rename test-tap/reporters/{default.timeoutcontextlogs.v23.log => default.timeoutcontextlogs.v24.log} (100%) rename test-tap/reporters/{default.timeoutinmultiplefiles.v23.log => default.timeoutinmultiplefiles.v24.log} (100%) rename test-tap/reporters/{default.timeoutinsinglefile.v23.log => default.timeoutinsinglefile.v24.log} (100%) rename test-tap/reporters/{default.timeoutwithmatch.v23.log => default.timeoutwithmatch.v24.log} (100%) rename test-tap/reporters/{default.watch.v23.log => default.watch.v24.log} (100%) rename test-tap/reporters/{tap.edgecases.v23.log => tap.edgecases.v24.log} (100%) rename test-tap/reporters/{tap.failfast.v23.log => tap.failfast.v24.log} (100%) rename test-tap/reporters/{tap.failfast2.v23.log => tap.failfast2.v24.log} (100%) rename test-tap/reporters/{tap.only.v23.log => tap.only.v24.log} (100%) rename test-tap/reporters/{tap.regular.v23.log => tap.regular.v24.log} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02a037ef1..e11eaa93b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [^18.18, ^20.8, ^22, ^23] + node-version: [^18.18, ^20.8, ^22, ^24] os: [ubuntu-latest, windows-latest, macos-latest] steps: - uses: actions/checkout@v4 diff --git a/package.json b/package.json index 79fbeaf4e..6d8071ee8 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "type": "module", "engines": { - "node": "^18.18 || ^20.8 || ^22 || >=23" + "node": "^18.18 || ^20.8 || ^22 || ^23 || >=24" }, "scripts": { "test": "./scripts/test.sh" diff --git a/test-tap/reporters/default.edgecases.v23.log b/test-tap/reporters/default.edgecases.v24.log similarity index 100% rename from test-tap/reporters/default.edgecases.v23.log rename to test-tap/reporters/default.edgecases.v24.log diff --git a/test-tap/reporters/default.failfast.v23.log b/test-tap/reporters/default.failfast.v24.log similarity index 100% rename from test-tap/reporters/default.failfast.v23.log rename to test-tap/reporters/default.failfast.v24.log diff --git a/test-tap/reporters/default.failfast2.v23.log b/test-tap/reporters/default.failfast2.v24.log similarity index 100% rename from test-tap/reporters/default.failfast2.v23.log rename to test-tap/reporters/default.failfast2.v24.log diff --git a/test-tap/reporters/default.only.v23.log b/test-tap/reporters/default.only.v24.log similarity index 100% rename from test-tap/reporters/default.only.v23.log rename to test-tap/reporters/default.only.v24.log diff --git a/test-tap/reporters/default.regular.v23.log b/test-tap/reporters/default.regular.v24.log similarity index 100% rename from test-tap/reporters/default.regular.v23.log rename to test-tap/reporters/default.regular.v24.log diff --git a/test-tap/reporters/default.timeoutcontextlogs.v23.log b/test-tap/reporters/default.timeoutcontextlogs.v24.log similarity index 100% rename from test-tap/reporters/default.timeoutcontextlogs.v23.log rename to test-tap/reporters/default.timeoutcontextlogs.v24.log diff --git a/test-tap/reporters/default.timeoutinmultiplefiles.v23.log b/test-tap/reporters/default.timeoutinmultiplefiles.v24.log similarity index 100% rename from test-tap/reporters/default.timeoutinmultiplefiles.v23.log rename to test-tap/reporters/default.timeoutinmultiplefiles.v24.log diff --git a/test-tap/reporters/default.timeoutinsinglefile.v23.log b/test-tap/reporters/default.timeoutinsinglefile.v24.log similarity index 100% rename from test-tap/reporters/default.timeoutinsinglefile.v23.log rename to test-tap/reporters/default.timeoutinsinglefile.v24.log diff --git a/test-tap/reporters/default.timeoutwithmatch.v23.log b/test-tap/reporters/default.timeoutwithmatch.v24.log similarity index 100% rename from test-tap/reporters/default.timeoutwithmatch.v23.log rename to test-tap/reporters/default.timeoutwithmatch.v24.log diff --git a/test-tap/reporters/default.watch.v23.log b/test-tap/reporters/default.watch.v24.log similarity index 100% rename from test-tap/reporters/default.watch.v23.log rename to test-tap/reporters/default.watch.v24.log diff --git a/test-tap/reporters/tap.edgecases.v23.log b/test-tap/reporters/tap.edgecases.v24.log similarity index 100% rename from test-tap/reporters/tap.edgecases.v23.log rename to test-tap/reporters/tap.edgecases.v24.log diff --git a/test-tap/reporters/tap.failfast.v23.log b/test-tap/reporters/tap.failfast.v24.log similarity index 100% rename from test-tap/reporters/tap.failfast.v23.log rename to test-tap/reporters/tap.failfast.v24.log diff --git a/test-tap/reporters/tap.failfast2.v23.log b/test-tap/reporters/tap.failfast2.v24.log similarity index 100% rename from test-tap/reporters/tap.failfast2.v23.log rename to test-tap/reporters/tap.failfast2.v24.log diff --git a/test-tap/reporters/tap.only.v23.log b/test-tap/reporters/tap.only.v24.log similarity index 100% rename from test-tap/reporters/tap.only.v23.log rename to test-tap/reporters/tap.only.v24.log diff --git a/test-tap/reporters/tap.regular.v23.log b/test-tap/reporters/tap.regular.v24.log similarity index 100% rename from test-tap/reporters/tap.regular.v23.log rename to test-tap/reporters/tap.regular.v24.log From 36934b2371889735c8a9209fb41f63574b44e66f Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Fri, 4 Apr 2025 14:39:38 +0200 Subject: [PATCH 03/10] Fix error handling in watcher tests If the previous handler failed, perhaps due to an assertion, it wouldn't trigger the next run and the tests would hang. Fix by including a failure of the previous handler in the await condition for the next run. --- test/watch-mode/helpers/watch.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/watch-mode/helpers/watch.js b/test/watch-mode/helpers/watch.js index 32c00ced1..b42ce3d4e 100644 --- a/test/watch-mode/helpers/watch.js +++ b/test/watch-mode/helpers/watch.js @@ -12,6 +12,17 @@ import {cwd, exec} from '../../helpers/exec.js'; export const test = available(fileURLToPath(import.meta.url)) ? ava : ava.skip; export const serial = available(fileURLToPath(import.meta.url)) ? ava.serial : ava.serial.skip; +/** + * Races between `promises` and returns the result, unless `possiblyErroring` rejects first. + * + * `possiblyErroring` may be any value and is ignored, unless it rejects. + */ +const raceUnlessError = async (possiblyErroring, ...promises) => { + const race = Promise.race(promises); + const intermediate = await Promise.race([Promise.resolve(possiblyErroring).then(() => raceUnlessError), race]); + return intermediate === raceUnlessError ? race : intermediate; +}; + export const withFixture = fixture => async (t, task) => { let completedTask = false; await temporaryDirectoryTask(async dir => { @@ -124,7 +135,7 @@ export const withFixture = fixture => async (t, task) => { try { let nextResult = results.next(); while (!isDone) { // eslint-disable-line no-unmodified-loop-condition - const item = await Promise.race([nextResult, idlePromise, donePromise]); // eslint-disable-line no-await-in-loop + const item = await raceUnlessError(pendingState, nextResult, idlePromise, donePromise); // eslint-disable-line no-await-in-loop process ??= item.value?.process; if (item.value) { From 29cb29accbf82ad8eca4b97544f357e813708853 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Fri, 6 Jun 2025 19:57:12 +0200 Subject: [PATCH 04/10] Remove special .only() behavior in watch mode Remove special .only() behavior in watch mode. This is a historical feature back from when AVA tried to persist "runExclusive" during regular runs. This behavior conflicts with interactive mode, and in any case interactive mode makes it easier to focus on a specific test file or title. Implement --match using the selected flag. This is a newer flag, previously used for line number selection. It's a better choice than overloading the `exclusive` flag used with `.only()`. Together these changes simplify the runner logic, allowing for the change of behavior. --- docs/recipes/watch-mode.md | 4 --- lib/api.js | 3 -- lib/runner.js | 59 ++++++++++++++---------------------- lib/watcher.js | 31 ++----------------- lib/worker/base.js | 1 - test-tap/runner.js | 14 --------- test/watch-mode/scenarios.js | 18 ----------- 7 files changed, 26 insertions(+), 104 deletions(-) diff --git a/docs/recipes/watch-mode.md b/docs/recipes/watch-mode.md index 39d7c4bee..bab9220fc 100644 --- a/docs/recipes/watch-mode.md +++ b/docs/recipes/watch-mode.md @@ -42,10 +42,6 @@ Dependency tracking works for `require()` and `import` syntax, as supported by [ Files accessed using the `fs` module are not tracked. -## Watch mode and the `.only` modifier - -The [`.only` modifier] disables watch mode's dependency tracking algorithm. When a change is made, all `.only` tests will be rerun, regardless of whether the test depends on the changed file. - ## Watch mode and CI If you run AVA in your CI with watch mode, the execution will exit with an error (`Error : Watch mode is not available in CI, as it prevents AVA from terminating.`). AVA will not run with the `--watch` (`-w`) option in CI, because CI processes should terminate, and with the `--watch` option, AVA will never terminate. diff --git a/lib/api.js b/lib/api.js index f43fad799..77d8cef40 100644 --- a/lib/api.js +++ b/lib/api.js @@ -203,7 +203,6 @@ export default class Api extends Emittery { files: selectedFiles, matching: apiOptions.match.length > 0, previousFailures: runtimeOptions.previousFailures ?? 0, - runOnlyExclusive: runtimeOptions.runOnlyExclusive === true, firstRun: runtimeOptions.firstRun ?? true, status: runStatus, }); @@ -272,8 +271,6 @@ export default class Api extends Emittery { providerStates, lineNumbers, recordNewSnapshots: !isCi, - // If we're looking for matches, run every single test process in exclusive-only mode - runOnlyExclusive: apiOptions.match.length > 0 || runtimeOptions.runOnlyExclusive === true, }; if (runtimeOptions.updateSnapshots) { diff --git a/lib/runner.js b/lib/runner.js index fac04e344..2a9bb3bf3 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -2,7 +2,7 @@ import process from 'node:process'; import {pathToFileURL} from 'node:url'; import Emittery from 'emittery'; -import {matcher} from 'matcher'; +import * as matcher from 'matcher'; import ContextRef from './context-ref.js'; import createChain from './create-chain.js'; @@ -13,6 +13,15 @@ import Runnable from './test.js'; import {waitForReady} from './worker/state.cjs'; const makeFileURL = file => file.startsWith('file://') ? file : pathToFileURL(file).toString(); + +const isTitleMatch = (title, patterns) => { + if (patterns.length === 0) { + return true; + } + + return matcher.isMatch(title, patterns); +}; + export default class Runner extends Emittery { constructor(options = {}) { super(); @@ -22,10 +31,9 @@ export default class Runner extends Emittery { this.failWithoutAssertions = options.failWithoutAssertions !== false; this.file = options.file; this.checkSelectedByLineNumbers = options.checkSelectedByLineNumbers; - this.match = options.match ?? []; + this.matchPatterns = options.match ?? []; this.projectDir = options.projectDir; this.recordNewSnapshots = options.recordNewSnapshots === true; - this.runOnlyExclusive = options.runOnlyExclusive === true; this.serial = options.serial === true; this.snapshotDir = options.snapshotDir; this.updateSnapshots = options.updateSnapshots; @@ -34,6 +42,7 @@ export default class Runner extends Emittery { this.boundCompareTestSnapshot = this.compareTestSnapshot.bind(this); this.boundSkipSnapshot = this.skipSnapshot.bind(this); this.interrupted = false; + this.runOnlyExclusive = false; this.nextTaskIndex = 0; this.tasks = { @@ -92,9 +101,7 @@ export default class Runner extends Emittery { const {args, implementation, title} = parseTestArgs(testArgs); - if (this.checkSelectedByLineNumbers) { - metadata.selected = this.checkSelectedByLineNumbers(); - } + metadata.selected &&= this.checkSelectedByLineNumbers?.() ?? true; if (metadata.todo) { if (implementation) { @@ -110,10 +117,7 @@ export default class Runner extends Emittery { } // --match selects TODO tests. - if (this.match.length > 0 && matcher(title.value, this.match).length === 1) { - metadata.exclusive = true; - this.runOnlyExclusive = true; - } + metadata.selected &&= isTitleMatch(title.value, this.matchPatterns); this.tasks.todo.push({title: title.value, metadata}); this.emit('stateChange', { @@ -154,14 +158,10 @@ export default class Runner extends Emittery { }; if (metadata.type === 'test') { - if (this.match.length > 0) { - // --match overrides .only() - task.metadata.exclusive = matcher(title.value, this.match).length === 1; - } - - if (task.metadata.exclusive) { - this.runOnlyExclusive = true; - } + task.metadata.selected &&= isTitleMatch(title.value, this.matchPatterns); + // Unmatched .only() are not selected and won't run. However, runOnlyExclusive can only be true if no titles + // are being matched. + this.runOnlyExclusive ||= this.matchPatterns.length === 0 && task.metadata.exclusive && task.metadata.selected; this.tasks[metadata.serial ? 'serial' : 'concurrent'].push(task); @@ -181,6 +181,7 @@ export default class Runner extends Emittery { serial: false, exclusive: false, skipped: false, + selected: true, todo: false, failing: false, callback: false, @@ -402,16 +403,11 @@ export default class Runner extends Emittery { return alwaysOk && hooksOk && testOk; } - async start() { // eslint-disable-line complexity + async start() { const concurrentTests = []; const serialTests = []; for (const task of this.tasks.serial) { - if (this.runOnlyExclusive && !task.metadata.exclusive) { - this.snapshots.skipBlock(task.title, task.metadata.taskIndex); - continue; - } - - if (this.checkSelectedByLineNumbers && !task.metadata.selected) { + if (!task.metadata.selected || (this.runOnlyExclusive && !task.metadata.exclusive)) { this.snapshots.skipBlock(task.title, task.metadata.taskIndex); continue; } @@ -432,12 +428,7 @@ export default class Runner extends Emittery { } for (const task of this.tasks.concurrent) { - if (this.runOnlyExclusive && !task.metadata.exclusive) { - this.snapshots.skipBlock(task.title, task.metadata.taskIndex); - continue; - } - - if (this.checkSelectedByLineNumbers && !task.metadata.selected) { + if (!task.metadata.selected || (this.runOnlyExclusive && !task.metadata.exclusive)) { this.snapshots.skipBlock(task.title, task.metadata.taskIndex); continue; } @@ -460,11 +451,7 @@ export default class Runner extends Emittery { } for (const task of this.tasks.todo) { - if (this.runOnlyExclusive && !task.metadata.exclusive) { - continue; - } - - if (this.checkSelectedByLineNumbers && !task.metadata.selected) { + if (!task.metadata.selected || (this.runOnlyExclusive && !task.metadata.exclusive)) { continue; } diff --git a/lib/watcher.js b/lib/watcher.js index 2ee7d23b2..bae6c9e6c 100644 --- a/lib/watcher.js +++ b/lib/watcher.js @@ -79,7 +79,6 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi })))); // State tracked for test runs. - const filesWithExclusiveTests = new Set(); const touchedFiles = new Set(); const temporaryFiles = new Set(); const failureCounts = new Map(); @@ -117,17 +116,6 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi break; } - case 'worker-finished': { - const fileStats = status.stats.byFile.get(evt.testFile); - if (fileStats.selectedTests > 0 && fileStats.declaredTests > fileStats.selectedTests) { - filesWithExclusiveTests.add(nodePath.relative(projectDir, evt.testFile)); - } else { - filesWithExclusiveTests.delete(nodePath.relative(projectDir, evt.testFile)); - } - - break; - } - default: { break; } @@ -329,18 +317,6 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi // Select the test files to run, and how to run them. let testFiles = [...uniqueTestFiles]; - let runOnlyExclusive = false; - - if (testFiles.length > 0) { - const exclusiveFiles = testFiles.filter(path => filesWithExclusiveTests.has(path)); - runOnlyExclusive = exclusiveFiles.length !== filesWithExclusiveTests.size; - if (runOnlyExclusive) { - // The test files that previously contained exclusive tests are always - // run, together with the test files. - debug('Running exclusive tests in %o', [...filesWithExclusiveTests]); - testFiles = [...new Set([...filesWithExclusiveTests, ...testFiles])]; - } - } if (filter.length > 0) { testFiles = applyTestFileFilter({ @@ -355,14 +331,14 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi if (nonTestFiles.length > 0) { debug('Non-test files changed, running all tests'); failureCounts.clear(); // All tests are run, so clear previous failures. - signalChanged({runOnlyExclusive}); + signalChanged({}); } else if (testFiles.length > 0) { // Remove previous failures for tests that will run again. for (const path of testFiles) { failureCounts.delete(path); } - signalChanged({runOnlyExclusive, testFiles}); + signalChanged({testFiles}); } takeCoverageForSelfTests?.(); @@ -383,7 +359,7 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi // And finally, the watch loop. while (abortSignal?.aborted !== true) { - const {testFiles: files = [], runOnlyExclusive = false} = await changed; // eslint-disable-line no-await-in-loop + const {testFiles: files = []} = await changed; // eslint-disable-line no-await-in-loop if (abortSignal?.aborted) { break; @@ -398,7 +374,6 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi files: files.map(file => nodePath.join(projectDir, file)), firstRun, // Value is changed by refresh() so record now. previousFailures, - runOnlyExclusive, updateSnapshots, // Value is changed by refresh() so record now. }; reset(); // Make sure the next run can be triggered. diff --git a/lib/worker/base.js b/lib/worker/base.js index 28f174bb6..520107dd3 100644 --- a/lib/worker/base.js +++ b/lib/worker/base.js @@ -81,7 +81,6 @@ const run = async options => { match: options.match, projectDir: options.projectDir, recordNewSnapshots: options.recordNewSnapshots, - runOnlyExclusive: options.runOnlyExclusive, serial: options.serial, snapshotDir: options.snapshotDir, updateSnapshots: options.updateSnapshots, diff --git a/test-tap/runner.js b/test-tap/runner.js index d36137bdf..e8c1975e1 100644 --- a/test-tap/runner.js +++ b/test-tap/runner.js @@ -345,20 +345,6 @@ test('only test', t => { }); }); -test('options.runOnlyExclusive means only exclusive tests are run', t => { - t.plan(1); - - return promiseEnd(new Runner({file: import.meta.url, runOnlyExclusive: true}), runner => { - runner.chain('test', () => { - t.fail(); - }); - - runner.chain.only('test 2', () => { - t.pass(); - }); - }); -}); - test('options.serial forces all tests to be serial', t => { t.plan(1); diff --git a/test/watch-mode/scenarios.js b/test/watch-mode/scenarios.js index b9daa8113..59ca14117 100644 --- a/test/watch-mode/scenarios.js +++ b/test/watch-mode/scenarios.js @@ -95,24 +95,6 @@ test('runs test file when source it depends on is deleted', withFixture('basic') }); }); -test('once test files containing .only() tests are encountered, always run those, but exclusively the .only tests', withFixture('exclusive'), async (t, fixture) => { - await fixture.watch({ - async 1({stats}) { - t.is(stats.failed.length, 2); - t.is(stats.passed.length, 3); - const contents = await this.read('a.test.js'); - await this.write('a.test.js', contents.replace('test(\'pass', 'test.only(\'pass')); - return stats.passed.filter(({file}) => file !== 'c.test.js'); - }, - async 2({stats}, passed) { - t.is(stats.failed.length, 0); - t.is(stats.passed.length, 2); - t.deepEqual(stats.passed, passed); - this.done(); - }, - }); -}); - test('filters test files', withFixture('basic'), async (t, fixture) => { await fixture.watch({ async 1({stats}) { From 57a3bbe8d43ea71ce67a2971a90844ae667a93ef Mon Sep 17 00:00:00 2001 From: Michael Mulet Date: Fri, 6 Jun 2025 15:10:28 -0500 Subject: [PATCH 05/10] Implement file globbing and test matching within watch mode Make watch mode interactive by allowing users to specify an additional glob pattern to select specific files, and a `--match` pattern to select specific tests. This means you no longer have to exit watch mode to achieve the same. Co-authored-by: Michael Mulet Co-authored-by: Mark Wubben --- docs/recipes/watch-mode.md | 29 +- lib/api.js | 15 +- lib/reporters/default.js | 14 +- lib/watcher.js | 376 +++++++++++++++--- test-tap/helper/report.js | 6 +- test/watch-mode/basic-functionality.js | 6 +- .../fixtures/filter-files/ava.config.js | 1 + .../fixtures/filter-files/package.json | 3 + .../fixtures/filter-files/test1.test.js | 17 + .../fixtures/filter-files/test2.test.js | 17 + test/watch-mode/interactive-filters.js | 155 ++++++++ 11 files changed, 564 insertions(+), 75 deletions(-) create mode 100644 test/watch-mode/fixtures/filter-files/ava.config.js create mode 100644 test/watch-mode/fixtures/filter-files/package.json create mode 100644 test/watch-mode/fixtures/filter-files/test1.test.js create mode 100644 test/watch-mode/fixtures/filter-files/test2.test.js create mode 100644 test/watch-mode/interactive-filters.js diff --git a/docs/recipes/watch-mode.md b/docs/recipes/watch-mode.md index bab9220fc..fda3f8852 100644 --- a/docs/recipes/watch-mode.md +++ b/docs/recipes/watch-mode.md @@ -34,6 +34,34 @@ export default { If your tests write to disk they may trigger the watcher to rerun your tests. Configuring additional ignore patterns helps avoid this. +### Filter tests while watching + +You may also filter tests while watching by using the CLI. For example, after running + +```console +npx ava --watch +``` + +You will see a prompt like this: + +```console + Type `g` followed by enter to filter test files by a glob pattern + Type `m` followed by enter to filter tests by their title + Type `r` followed by enter to rerun tests + Type `u` followed by enter to update snapshots in selected tests +> +``` + +So, to run only tests numbered like + +- foo23434 +- foo4343 +- foo93823 + +You can type `m` and press enter, then type `foo*` and press enter. This will then run all tests that match that glob. + +Afterwards you can use the `r` command to run the matched tests again, or `a` command to run **all** tests. + ## Dependency tracking AVA tracks which source files your test files depend on. If you change such a dependency only the test file that depends on it will be rerun. AVA will rerun all tests if it cannot determine which test file depends on the changed source file. @@ -62,7 +90,6 @@ Sometimes watch mode does something surprising like rerunning all tests when you $ DEBUG=ava:watcher npx ava --watch ``` -[`chokidar`]: https://github.com/paulmillr/chokidar [Install Troubleshooting]: https://github.com/paulmillr/chokidar#install-troubleshooting [`ignore-by-default`]: https://github.com/novemberborn/ignore-by-default [`.only` modifier]: ../01-writing-tests.md#running-specific-tests diff --git a/lib/api.js b/lib/api.js index 77d8cef40..e525e9235 100644 --- a/lib/api.js +++ b/lib/api.js @@ -88,7 +88,7 @@ export default class Api extends Emittery { } } - async run({files: selectedFiles = [], filter = [], runtimeOptions = {}} = {}) { // eslint-disable-line complexity + async run({files: selectedFiles = [], filter = [], runtimeOptions = {}, testFileSelector} = {}) { // eslint-disable-line complexity let setupOrGlobError; const apiOptions = this.options; @@ -149,7 +149,9 @@ export default class Api extends Emittery { let testFiles; try { testFiles = await globs.findTests({cwd: this.options.projectDir, ...apiOptions.globs}); - if (selectedFiles.length === 0) { + if (typeof testFileSelector === 'function') { + selectedFiles = testFileSelector(testFiles, selectedFiles); + } else if (selectedFiles.length === 0) { selectedFiles = filter.length === 0 ? testFiles : globs.applyTestFileFilter({ cwd: this.options.projectDir, filter: filter.map(({pattern}) => pattern), @@ -163,7 +165,7 @@ export default class Api extends Emittery { } const selectionInsights = { - filter, + filter: selectedFiles.appliedFilters ?? filter, ignoredFilterPatternFiles: selectedFiles.ignoredFilterPatternFiles ?? [], testFileCount: testFiles.length, selectionCount: selectedFiles.length, @@ -201,8 +203,8 @@ export default class Api extends Emittery { failFastEnabled: failFast, filePathPrefix: getFilePathPrefix(selectedFiles), files: selectedFiles, - matching: apiOptions.match.length > 0, - previousFailures: runtimeOptions.previousFailures ?? 0, + matching: apiOptions.match.length > 0 || runtimeOptions.interactiveMatchPattern !== undefined, + previousFailures: runtimeOptions.countPreviousFailures?.() ?? 0, firstRun: runtimeOptions.firstRun ?? true, status: runStatus, }); @@ -265,12 +267,13 @@ export default class Api extends Emittery { const lineNumbers = getApplicableLineNumbers(globs.normalizeFileForMatching(apiOptions.projectDir, file), filter); // Removing `providers` and `sortTestFiles` fields because they cannot be transferred to the worker threads. - const {providers, sortTestFiles, ...forkOptions} = apiOptions; + const {providers, sortTestFiles, match, ...forkOptions} = apiOptions; const options = { ...forkOptions, providerStates, lineNumbers, recordNewSnapshots: !isCi, + match: runtimeOptions.interactiveMatchPattern === undefined ? match : [...match, runtimeOptions.interactiveMatchPattern], }; if (runtimeOptions.updateSnapshots) { diff --git a/lib/reporters/default.js b/lib/reporters/default.js index a70f24e4e..7da27c797 100644 --- a/lib/reporters/default.js +++ b/lib/reporters/default.js @@ -26,7 +26,7 @@ class LineWriter extends stream.Writable { this.dest = dest; this.columns = dest.columns ?? 80; - this.lastLineIsEmpty = false; + this.lastLineIsEmpty = true; } _write(chunk, _, callback) { @@ -34,9 +34,9 @@ class LineWriter extends stream.Writable { callback(); } - writeLine(string) { + writeLine(string, indent = true) { if (string) { - this.write(indentString(string, 2) + os.EOL); + this.write((indent ? indentString(string, 2) : string) + os.EOL); this.lastLineIsEmpty = false; } else { this.write(os.EOL); @@ -44,6 +44,11 @@ class LineWriter extends stream.Writable { } } + write(string) { + this.lastLineIsEmpty = false; + super.write(string); + } + ensureEmptyLine() { if (!this.lastLineIsEmpty) { this.writeLine(); @@ -120,7 +125,6 @@ export default class Reporter { this.previousFailures = 0; this.failFastEnabled = false; - this.lastLineIsEmpty = false; this.matching = false; this.removePreviousListener = null; @@ -628,7 +632,7 @@ export default class Reporter { this.lineWriter.writeLine(colors.error(`${figures.cross} Couldn’t find any files to test` + firstLinePostfix)); } else { const {testFileCount: count} = this.selectionInsights; - this.lineWriter.writeLine(colors.error(`${figures.cross} Based on your configuration, ${count} test ${plur('file was', 'files were', count)} found, but did not match the CLI arguments:` + firstLinePostfix)); + this.lineWriter.writeLine(colors.error(`${figures.cross} Based on your configuration, ${count} test ${plur('file was', 'files were', count)} found, but did not match the filters:` + firstLinePostfix)); this.lineWriter.writeLine(); for (const {pattern} of this.selectionInsights.filter) { this.lineWriter.writeLine(colors.error(`* ${pattern}`)); diff --git a/lib/watcher.js b/lib/watcher.js index bae6c9e6c..45708b24e 100644 --- a/lib/watcher.js +++ b/lib/watcher.js @@ -1,6 +1,7 @@ import fs from 'node:fs'; import nodePath from 'node:path'; import process from 'node:process'; +import * as readline from 'node:readline/promises'; import v8 from 'node:v8'; import {nodeFileTrace} from '@vercel/nft'; @@ -9,6 +10,7 @@ import createDebug from 'debug'; import {chalk} from './chalk.js'; import { applyTestFileFilter, classify, buildIgnoreMatcher, findTests, + normalizePattern, } from './globs.js'; import {levels as providerLevels} from './provider-manager.js'; @@ -18,8 +20,6 @@ const debug = createDebug('ava:watcher'); // to make Node.js write out interim reports in various places. const takeCoverageForSelfTests = process.env.TEST_AVA ? v8.takeCoverage : undefined; -const END_MESSAGE = chalk.gray('Type `r` and press enter to rerun tests\nType `u` and press enter to update snapshots\n'); - export function available(projectDir) { try { fs.watch(projectDir, {persistent: false, recursive: true, signal: AbortSignal.abort()}); @@ -34,18 +34,156 @@ export function available(projectDir) { return true; } +const cancel = Symbol('cancel'); +const close = Symbol('close'); + +const promiseWithResolvers = Promise.withResolvers?.bind(Promise) ?? (() => { // eslint-disable-line n/no-unsupported-features/es-syntax, no-use-extend-native/no-use-extend-native + let resolve; + let reject; + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }); + return {promise, resolve, reject}; +}); + +async function * readLines(stream) { + const rl = readline.createInterface({input: stream, output: process.stdout}); + let promise; + let resolve; + let values = []; + rl.addListener('close', () => { + values.push(close); + resolve?.(); + }); + rl.addListener('SIGINT', () => { + values.push(cancel); + resolve?.(); + }); + rl.addListener('line', line => { + values.push(line.trim()); + resolve?.(); + }); + + while (true) { + yield * values; + values = []; + await promise; // eslint-disable-line no-await-in-loop + // Immediately create a new promise to wait for the next line. + ({promise, resolve} = promiseWithResolvers()); + } +} + +const eachLine = async (lineReader, callback) => { + for await (const line of lineReader) { + await callback(line); + } +}; + +const writeCommandInstructions = (reporter, interactiveGlobPattern, interactiveMatchPattern) => { + reporter.lineWriter.writeLine(chalk.gray('Type `g` followed by enter to filter test files by a glob pattern')); + reporter.lineWriter.writeLine(chalk.gray('Type `m` followed by enter to filter tests by their title (similar to --match)')); + if (interactiveGlobPattern || interactiveMatchPattern) { + reporter.lineWriter.writeLine(chalk.gray('Type `a` followed by enter to rerun all tests (while preserving filters)')); + reporter.lineWriter.writeLine(chalk.gray('Type `r` followed by enter to rerun tests that match your filters')); + } else { + reporter.lineWriter.writeLine(chalk.gray('Type `r` followed by enter to rerun tests')); + } + + reporter.lineWriter.writeLine(chalk.gray('Type `u` followed by enter to update snapshots in selected tests')); + + if (interactiveGlobPattern || interactiveMatchPattern) { + reporter.lineWriter.writeLine(); + + if (interactiveGlobPattern) { + reporter.lineWriter.writeLine(chalk.gray(`Current test file glob pattern: ${chalk.italic(interactiveGlobPattern)}`)); + } + + if (interactiveMatchPattern) { + reporter.lineWriter.writeLine(chalk.gray(`Current test title match pattern: ${chalk.italic(interactiveMatchPattern)}`)); + } + } + + reporter.lineWriter.writeLine(); + reporter.lineWriter.write('> '); +}; + +const promptForGlobPattern = async (reporter, lineReader, currentPattern, projectDir) => { + reporter.lineWriter.ensureEmptyLine(); + reporter.lineWriter.writeLine('Type the glob pattern then press enter. Leave blank to clear.', false); + if (currentPattern === undefined) { + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine(chalk.italic('Tip: Start with `**/` to select files in any directory.'), false); + reporter.lineWriter.writeLine(chalk.italic('Tip: Start with `!` to exclude files.'), false); + } else { + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine(`Current glob pattern is: ${chalk.italic(currentPattern)}`, false); + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine(chalk.italic('Tip: Ctrl+C to exit without any changes.'), false); + } + + reporter.lineWriter.write('> '); + + const {value} = await lineReader.next(); + if (value === close || value === cancel) { + return value; + } + + if (value === '') { + return undefined; + } + + return normalizePattern(nodePath.relative(projectDir, nodePath.resolve(process.cwd(), value))); +}; + +const promptForMatchPattern = async (reporter, lineReader, currentPattern) => { + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine('Type the match pattern then press enter. Leave blank to clear.', false); + if (currentPattern === undefined) { + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine(chalk.italic('Tip: Start with `*` to match suffixes'), false); + reporter.lineWriter.writeLine(chalk.italic('Tip: End with `*` to match prefixes.'), false); + reporter.lineWriter.writeLine(chalk.italic('Tip: Start with `!` to exclude titles.'), false); + } else { + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine(`Current match pattern is: ${chalk.italic(currentPattern)}`, false); + reporter.lineWriter.writeLine(); + reporter.lineWriter.writeLine(chalk.italic('Tip: Ctrl+C to exit without any changes.'), false); + } + + reporter.lineWriter.write('> '); + + const {value} = await lineReader.next(); + return value === '' ? undefined : value; +}; + export async function start({api, filter, globs, projectDir, providers, reporter, stdin, signal}) { providers = providers.filter(({level}) => level >= providerLevels.ava6); - for await (const {files, ...runtimeOptions} of plan({ - api, filter, globs, projectDir, providers, stdin, abortSignal: signal, + for await (const {files, testFileSelector, ...runtimeOptions} of plan({ + api, + filter, + globs, + projectDir, + providers, + stdin, + abortSignal: signal, + reporter, })) { - await api.run({files, filter, runtimeOptions}); + await api.run({files, testFileSelector, runtimeOptions}); reporter.endRun(); - reporter.lineWriter.writeLine(END_MESSAGE); } } -async function * plan({api, filter, globs, projectDir, providers, stdin, abortSignal}) { +async function * plan({ + api, + filter, + globs, + projectDir, + providers, + stdin, + abortSignal, + reporter, +}) { const fileTracer = new FileTracer({base: projectDir}); const isIgnored = buildIgnoreMatcher(globs); const patternFilters = filter.map(({pattern}) => pattern); @@ -83,6 +221,15 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi const temporaryFiles = new Set(); const failureCounts = new Map(); + const countPreviousFailures = () => { + let previousFailures = 0; + for (const count of failureCounts.values()) { + previousFailures += count; + } + + return previousFailures; + }; + // Observe all test runs. api.on('run', ({status}) => { status.on('stateChange', evt => { @@ -139,21 +286,124 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi updateSnapshots = false; }; - // Support interactive commands. - stdin.setEncoding('utf8'); - stdin.on('data', data => { - data = data.trim().toLowerCase(); - runAll ||= data === 'r'; - updateSnapshots ||= data === 'u'; - if (runAll || updateSnapshots) { - signalChanged({}); + // Interactive filters. + let interactiveGlobPattern; + let interactiveMatchPattern; + const testFileSelector = (allTestFiles, selectedFiles = [], skipInteractive = runAll) => { + if (selectedFiles.length === 0) { + selectedFiles = allTestFiles; } - }); + + if (patternFilters.length > 0) { + selectedFiles = applyTestFileFilter({ + cwd: projectDir, + filter: patternFilters, + testFiles: selectedFiles, + treatFilterPatternsAsFiles: runAll, // This option is additive, so only select individual files on full runs. + }); + selectedFiles.appliedFilters = filter; // `filter` is the original input. + } + + if (!skipInteractive && interactiveGlobPattern !== undefined) { + const {appliedFilters = [], ignoredFilterPatternFiles} = selectedFiles; + selectedFiles = applyTestFileFilter({ + cwd: projectDir, + filter: [interactiveGlobPattern], + testFiles: selectedFiles, + treatFilterPatternsAsFiles: false, + }); + selectedFiles.appliedFilters = [...appliedFilters, {pattern: interactiveGlobPattern}]; + selectedFiles.ignoredFilterPatternFiles = ignoredFilterPatternFiles; + } + + // Remove previous failures for tests that will run again. + for (const file of selectedFiles) { + const path = nodePath.relative(projectDir, file); + failureCounts.delete(path); + } + + return selectedFiles; + }; + + const lineReader = readLines(stdin); + + // Don't let the reader keep the process alive. stdin.unref(); - // Whether tests are currently running. Used to control when the next run - // is prepared. - let testsAreRunning = false; + // Handle commands. + eachLine(lineReader, async line => { + if (line === cancel || line === close) { + process.exit(); // eslint-disable-line unicorn/no-process-exit + } + + switch (line.toLowerCase()) { + case 'r': { + signalChanged(); + break; + } + + case 'u': { + updateSnapshots = true; + signalChanged(); + break; + } + + case 'a': { + runAll = true; + signalChanged(); + break; + } + + case 'g': { + respondToChanges = false; + const oldGlobPattern = interactiveGlobPattern; + const promptValue = await promptForGlobPattern(reporter, lineReader, interactiveGlobPattern, projectDir); + respondToChanges = true; + reporter.lineWriter.writeLine(); + if (promptValue === close) { + process.exit(); // eslint-disable-line unicorn/no-process-exit + } + + if (promptValue === cancel || (promptValue === oldGlobPattern)) { + signalChanged(); + break; + } + + interactiveGlobPattern = promptValue; + signalChanged(); + + break; + } + + case 'm': { + respondToChanges = false; + const oldMatchPattern = interactiveMatchPattern; + const promptValue = await promptForMatchPattern(reporter, lineReader, interactiveMatchPattern); + respondToChanges = true; + reporter.lineWriter.writeLine(); + if (promptValue === close) { + process.exit(); // eslint-disable-line unicorn/no-process-exit + } + + if (promptValue === cancel || (promptValue === oldMatchPattern)) { + signalChanged(); + break; + } + + interactiveMatchPattern = promptValue; + signalChanged(); + + break; + } + + default: { + break; + } + } + }); + + // Whether to respond to file system changes. Used to control when the next run is prepared. + let respondToChanges = true; // Tracks file paths we know have changed since the previous test run. const dirtyPaths = new Set(); @@ -165,9 +415,9 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi return; } - // Equally, if tests are currently running, then keep accumulating changes. - // The timer is refreshed after tests finish running. - if (testsAreRunning) { + // Equally, if tests are currently running, or the user is being prompted, then keep accumulating changes. + // The timer is refreshed when we're ready to resume. + if (!respondToChanges) { takeCoverageForSelfTests?.(); return; } @@ -315,30 +565,12 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi fileTracer.update(changes); } - // Select the test files to run, and how to run them. - let testFiles = [...uniqueTestFiles]; - - if (filter.length > 0) { - testFiles = applyTestFileFilter({ - cwd: projectDir, - expandDirectories: false, - filter: patternFilters, - testFiles, - treatFilterPatternsAsFiles: false, - }); - } - if (nonTestFiles.length > 0) { debug('Non-test files changed, running all tests'); failureCounts.clear(); // All tests are run, so clear previous failures. - signalChanged({}); - } else if (testFiles.length > 0) { - // Remove previous failures for tests that will run again. - for (const path of testFiles) { - failureCounts.delete(path); - } - - signalChanged({testFiles}); + signalChanged(); + } else if (uniqueTestFiles.size > 0) { + signalChanged({testFiles: [...uniqueTestFiles]}); } takeCoverageForSelfTests?.(); @@ -354,33 +586,61 @@ async function * plan({api, filter, globs, projectDir, providers, stdin, abortSi }); abortSignal?.addEventListener('abort', () => { - signalChanged?.({}); + signalChanged?.(); }); // And finally, the watch loop. while (abortSignal?.aborted !== true) { - const {testFiles: files = []} = await changed; // eslint-disable-line no-await-in-loop + const {testFiles = []} = (await changed) ?? {}; // eslint-disable-line no-await-in-loop if (abortSignal?.aborted) { break; } - let previousFailures = 0; - for (const count of failureCounts.values()) { - previousFailures += count; + // Values are changed by refresh() so copy them now. + const instructFirstRun = firstRun; + const skipInteractive = runAll; + const instructUpdateSnapshots = updateSnapshots; + reset(); // Make sure the next run can be triggered. + + let files = testFiles.map(file => nodePath.join(projectDir, file)); + let instructTestFileSelector = testFileSelector; + if (files.length > 0) { + files = testFileSelector(files, [], skipInteractive); + if (files.length === 0) { + debug('Filters rejected all test files'); + continue; + } + + // Make a no-op for the API to avoid filtering `files` again. + instructTestFileSelector = () => files; + } else if (skipInteractive) { + instructTestFileSelector = (allTestFiles, selectedFiles = []) => testFileSelector(allTestFiles, selectedFiles, true); + } + + // Clear any prompt. + if (!reporter.lineWriter.lastLineIsEmpty && reporter.reportStream.isTTY) { + reporter.reportStream.clearLine(0); + reporter.lineWriter.writeLine(); } - const instructions = { - files: files.map(file => nodePath.join(projectDir, file)), - firstRun, // Value is changed by refresh() so record now. - previousFailures, - updateSnapshots, // Value is changed by refresh() so record now. + // Let the tests run. + respondToChanges = false; + yield { + countPreviousFailures, + files, + firstRun: instructFirstRun, + testFileSelector: instructTestFileSelector, + updateSnapshots: instructUpdateSnapshots, + interactiveMatchPattern: skipInteractive ? undefined : interactiveMatchPattern, }; - reset(); // Make sure the next run can be triggered. - testsAreRunning = true; - yield instructions; // Let the tests run. - testsAreRunning = false; - debounce.refresh(); // Trigger the callback, which if there were changes will run the tests again. + respondToChanges = true; + + // Write command instructions after the tests have run and been reported. + writeCommandInstructions(reporter, interactiveGlobPattern, interactiveMatchPattern); + + // Trigger the callback, which if there were changes will run the tests again. + debounce.refresh(); } } diff --git a/test-tap/helper/report.js b/test-tap/helper/report.js index e616e52a4..71cc54cf4 100644 --- a/test-tap/helper/report.js +++ b/test-tap/helper/report.js @@ -109,12 +109,12 @@ const run = async (type, reporter, {match = [], filter} = {}) => { } // Mimick watch mode - return api.run({files, filter, runtimeOptions: {previousFailures: 0, firstRun: true}}).then(() => { + return api.run({files, filter, runtimeOptions: {countPreviousFailures: () => 0, firstRun: true}}).then(() => { reporter.endRun(); - return api.run({files, filter, runtimeOptions: {previousFailures: 2, firstRun: false}}); + return api.run({files, filter, runtimeOptions: {countPreviousFailures: () => 2, firstRun: false}}); }).then(() => { reporter.endRun(); - return api.run({files, filter, runtimeOptions: {previousFailures: 0, firstRun: false}}); + return api.run({files, filter, runtimeOptions: {countPreviousFailures: () => 0, firstRun: false}}); }).then(() => { reporter.endRun(); }); diff --git a/test/watch-mode/basic-functionality.js b/test/watch-mode/basic-functionality.js index 33b28a6a7..e8eea0868 100644 --- a/test/watch-mode/basic-functionality.js +++ b/test/watch-mode/basic-functionality.js @@ -8,8 +8,10 @@ test('prints results and instructions', withFixture('basic'), async (t, fixture) process.send('abort-watcher'); const {stdout} = await process; t.regex(stdout, /\d+ tests? passed/); - t.regex(stdout, /Type `r` and press enter to rerun tests/); - t.regex(stdout, /Type `u` and press enter to update snapshots/); + t.regex(stdout, /Type `g` followed by enter to filter test files by a glob pattern/); + t.regex(stdout, /Type `m` followed by enter to filter tests by their title/); + t.regex(stdout, /Type `r` followed by enter to rerun tests/); + t.regex(stdout, /Type `u` followed by enter to update snapshots/); this.done(); }, }); diff --git a/test/watch-mode/fixtures/filter-files/ava.config.js b/test/watch-mode/fixtures/filter-files/ava.config.js new file mode 100644 index 000000000..ff8b4c563 --- /dev/null +++ b/test/watch-mode/fixtures/filter-files/ava.config.js @@ -0,0 +1 @@ +export default {}; diff --git a/test/watch-mode/fixtures/filter-files/package.json b/test/watch-mode/fixtures/filter-files/package.json new file mode 100644 index 000000000..bedb411a9 --- /dev/null +++ b/test/watch-mode/fixtures/filter-files/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/test/watch-mode/fixtures/filter-files/test1.test.js b/test/watch-mode/fixtures/filter-files/test1.test.js new file mode 100644 index 000000000..a5c70aedc --- /dev/null +++ b/test/watch-mode/fixtures/filter-files/test1.test.js @@ -0,0 +1,17 @@ +const {default: test} = await import(process.env.TEST_AVA_IMPORT_FROM); // This fixture is copied to a temporary directory, so import AVA through its configured path. + +test("alice", (t) => { + t.pass(); +}); + +test("bob", async (t) => { + t.pass(); +}); + +test("catherine", async (t) => { + t.pass(); +}); + +test("david", async (t) => { + t.fail(); +}); diff --git a/test/watch-mode/fixtures/filter-files/test2.test.js b/test/watch-mode/fixtures/filter-files/test2.test.js new file mode 100644 index 000000000..52927aeb5 --- /dev/null +++ b/test/watch-mode/fixtures/filter-files/test2.test.js @@ -0,0 +1,17 @@ +const {default: test} = await import(process.env.TEST_AVA_IMPORT_FROM); // This fixture is copied to a temporary directory, so import AVA through its configured path. + +test("emma", (t) => { + t.pass(); +}); + +test("frank", async (t) => { + t.pass(); +}); + +test("gina", async (t) => { + t.pass(); +}); + +test("harry", async (t) => { + t.fail(); +}); diff --git a/test/watch-mode/interactive-filters.js b/test/watch-mode/interactive-filters.js new file mode 100644 index 000000000..1ac675c99 --- /dev/null +++ b/test/watch-mode/interactive-filters.js @@ -0,0 +1,155 @@ +import {test, withFixture} from './helpers/watch.js'; + +test('can filter test files by glob pattern', withFixture('filter-files'), async (t, fixture) => { + await fixture.watch({ + async 1({process, stats}) { + // First run should run all tests + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + // Set a file filter to only run test1.test.js + process.stdin.write('g\n'); + process.stdin.write('**/test1.*\n'); + }, + + async 2({stats}) { + // Only tests from test1 should run + t.is(stats.selectedTestCount, 4); + + t.is(stats.passed.length, 3); + for (const skipped of stats.passed) { + t.regex(skipped.file, /test1\.test\.js/); + } + + t.is(stats.failed.length, 1); + for (const skipped of stats.failed) { + t.regex(skipped.file, /test1\.test\.js/); + } + + this.done(); + }, + }); +}); + +test('can filter test files by glob pattern and have no tests run', withFixture('filter-files'), async (t, fixture) => { + await fixture.watch({ + async 1({process, stats}) { + // First run should run all tests + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + // Set a file filter that doesn't match any files + process.stdin.write('g\n'); + process.stdin.write('kangarookanbankentuckykendoll\n'); + + process.send('abort-watcher'); + const {stdout} = await process; + t.regex(stdout, /2 test files were found, but did not match the filters/); + t.regex(stdout, /\* kangarookanbankentuckykendoll/); + + this.done(); + }, + }); +}); + +test('when filtering by glob pattern, run all tests with \'a', withFixture('filter-files'), async (t, fixture) => { + await fixture.watch({ + async 1({process, stats}) { + // First run should run all tests + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + // Set a file filter to only run test1.test.js + process.stdin.write('g\n'); + process.stdin.write('**/test1.*\n'); + }, + + async 2({process, stats}) { + t.is(stats.selectedTestCount, 4); + + process.stdin.write('a\n'); + }, + async 3({stats}) { + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + this.done(); + }, + }); +}); + +test('can filter tests by title', withFixture('filter-files'), async (t, fixture) => { + await fixture.watch({ + async 1({process, stats}) { + // First run should run all tests + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + // Set a title filter to only run bob from test1.test.js + process.stdin.write('m\n'); + process.stdin.write('bob\n'); + }, + + async 2({stats}) { + // Only tests that match the test title should run + t.is(stats.selectedTestCount, 1); + t.is(stats.passed.length, 1); + for (const ran of stats.passed) { + t.regex(ran.title, /bob/); + } + + this.done(); + }, + }); +}); + +test('can filter tests title and have no tests run', withFixture('filter-files'), async (t, fixture) => { + await fixture.watch({ + async 1({process, stats}) { + // First run should run all tests + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + // Set a title filter that doesn't match any tests + process.stdin.write('m\n'); + process.stdin.write('sirnotappearinginthisfilm\n'); + }, + + async 2({process, stats}) { + // No tests should run + t.is(stats.selectedTestCount, 0); + + process.send('abort-watcher'); + const {stdout} = await process; + t.regex(stdout, /Couldn’t find any matching tests/); + + this.done(); + }, + }); +}); + +test('when filtering by title, run all tests with \'a', withFixture('filter-files'), async (t, fixture) => { + await fixture.watch({ + async 1({process, stats}) { + // First run should run all tests + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + // Set a file filter to only run bob from test1.test.js + process.stdin.write('m\n'); + process.stdin.write('bob\n'); + }, + + async 2({process, stats}) { + t.is(stats.selectedTestCount, 1); + + process.stdin.write('a\n'); + }, + async 3({stats}) { + t.is(stats.selectedTestCount, 8); + t.is(stats.passed.length, 6); + + this.done(); + }, + }); +}); From 50e02d5cd64872f9cca7bb543e623a0da8c3acdb Mon Sep 17 00:00:00 2001 From: SK_21 <154612464+kebbell@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:44:50 +0100 Subject: [PATCH 06/10] Remove compiler option override needed for TypeScript 4.x --- tsconfig.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index d59b5984c..5c8401b8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,5 @@ { "extends": "@sindresorhus/tsconfig", - "compilerOptions": { - // See . This does not - // seem solved with 4.8.3. - "forceConsistentCasingInFileNames": false, - }, "include": [ "test", "test-tap", From eb2b48d3985bbfb9a4649e31a6e449d7e8f9278e Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Fri, 6 Jun 2025 22:45:31 +0200 Subject: [PATCH 07/10] Update XO & other dependencies --- .xo-config.cjs | 100 - ava.config.js | 2 +- entrypoints/main.d.cts | 8 +- entrypoints/main.d.mts | 8 +- lib/api.js | 16 +- lib/assert.js | 4 +- lib/chalk.js | 2 +- lib/cli.js | 15 +- lib/line-numbers.js | 34 +- lib/reporters/default.js | 5 +- lib/runner.js | 16 +- lib/snapshot-manager.js | 34 +- lib/test.js | 12 +- lib/watcher.js | 2 +- lib/worker/main.cjs | 2 +- lib/worker/plugin.cjs | 2 +- .../magic-assert-buffers.js | 8 +- .../magic-assert-exceptions.js | 7 +- .../magic-assert-objects.js | 8 +- package-lock.json | 3772 +++++++---------- package.json | 14 +- test-tap/assert.js | 32 +- test-tap/fixture/fail-fast/crash/crashes.cjs | 2 +- test-tap/fixture/no-tests.cjs | 2 +- .../ava-import-no-test-declaration.cjs | 2 +- .../fixture/with-dependencies/no-tests.cjs | 6 +- .../with-dependencies/test-failure.cjs | 6 +- .../test-uncaught-exception.cjs | 6 +- test-tap/fixture/with-dependencies/test.cjs | 6 +- test-tap/promise.js | 8 +- test-tap/reporters/default.js | 10 +- test-tap/reporters/tap.regular.v18.log | 2 +- test-tap/reporters/tap.regular.v20.log | 2 +- test-tap/reporters/tap.regular.v22.log | 2 +- test-tap/reporters/tap.regular.v24.log | 2 +- test-tap/test.js | 5 +- test-tap/try-snapshot.js | 2 +- test/assertions/snapshots/test.js.snap | Bin 627 -> 635 bytes .../fixtures/assert-failure.js | 2 +- test/completion-handlers/fixtures/exit0.js | 8 +- test/completion-handlers/fixtures/one.js | 10 +- test/completion-handlers/fixtures/two.js | 12 +- test/concurrency/snapshots/test.js.snap | Bin 266 -> 264 bytes .../fixtures/non-json/required.mjs | 2 +- .../fixtures/single-argument/required.js | 2 +- .../fixtures/with-arguments/required.mjs | 2 +- .../dir-a-wrapper/dir-a/dir-a-wrapper-3.js | 1 - .../dir-a-wrapper/dir-a/dir-a-wrapper-4.js | 1 - .../dir-a-wrapper/dir-a/dir-a-wrapper-3.js | 2 +- .../dir-a-wrapper/dir-a/dir-a-wrapper-4.js | 2 +- test/config/next-gen.js | 3 +- test/config/snapshots/integration.js.snap | Bin 565 -> 564 bytes test/config/snapshots/loader.js.md | 6 - test/config/snapshots/loader.js.snap | Bin 660 -> 638 bytes test/config/snapshots/next-gen.js.snap | Bin 368 -> 367 bytes .../fixtures/test.cts | 6 +- .../snapshots/invalid-configurations.js.snap | Bin 294 -> 293 bytes .../snapshots/test.js.snap | Bin 406 -> 409 bytes test/extensions/snapshots/test.js.snap | Bin 253 -> 253 bytes .../fixtures/assert-failure.js | 4 +- test/external-assertions/snapshots/test.js.md | 20 +- .../snapshots/test.js.snap | Bin 499 -> 503 bytes test/external-assertions/test.js | 2 +- .../treat-patterns-as-files/_helper.js | 1 - .../fixtures/treat-patterns-as-files/foo.js | 1 - .../fixtures/treat-patterns-as-files/foo.ts | 1 - test/globs/snapshots/test.js.snap | Bin 438 -> 442 bytes test/helpers/exec.js | 4 +- test/hook-restrictions/snapshots/test.js.snap | Bin 205 -> 205 bytes test/idle-timeouts/fixtures/console-output.js | 3 +- test/line-numbers/fixtures/README.md | 2 +- test/line-numbers/fixtures/line-numbers.js | 4 +- .../line-numbers/fixtures/line-numbers.js.map | 2 +- test/line-numbers/fixtures/line-numbers.ts | 7 +- test/line-numbers/snapshots/test.js.snap | Bin 599 -> 600 bytes test/line-numbers/test.js | 2 +- .../node-arguments-from-config.js | 2 +- .../node-arguments-from-config/setup.cjs | 2 +- test/node-arguments/snapshots/test.js.md | 22 - test/node-arguments/snapshots/test.js.snap | Bin 583 -> 556 bytes .../snapshots/test.js.snap | Bin 263 -> 261 bytes .../lifecycle/fixtures/teardown.js | 2 +- .../snapshots/test.js.snap | Bin 283 -> 281 bytes .../snapshots/test.js.snap | Bin 245 -> 244 bytes .../worker-protocol/fixtures/_declare.js | 1 - .../worker-protocol/snapshots/test.js.snap | Bin 509 -> 517 bytes .../snapshots/test.js.snap | Bin 208 -> 204 bytes .../snapshots/randomness.js.snap | Bin 452 -> 453 bytes test/snapshot-removal/snapshots/test.js.snap | Bin 432 -> 433 bytes test/snapshot-tests/formatting.js | 3 +- test/snapshot-tests/snapshots/corrupt.js.snap | Bin 308 -> 310 bytes .../snapshots/formatting.js.snap | Bin 565 -> 561 bytes .../snapshots/adding.js.snap | Bin 665 -> 661 bytes .../snapshots/changing-label.js.snap | Bin 326 -> 324 bytes .../snapshots/invalid-snapfile.js.snap | Bin 538 -> 543 bytes .../snapshots/removing-all-snapshots.js.snap | Bin 337 -> 337 bytes .../snapshots/removing-snapshots.js.snap | Bin 323 -> 323 bytes .../snapshots/removing-test.js.snap | Bin 323 -> 322 bytes .../snapshots/reorder.js.snap | Bin 345 -> 346 bytes .../snapshots/selection.js.snap | Bin 467 -> 468 bytes .../snapshots/try-skip.js.snap | Bin 333 -> 330 bytes .../test-timeouts/fixtures/invalid-message.js | 2 +- test/test-timeouts/snapshots/test.js.snap | Bin 302 -> 301 bytes .../fixtures/filter-files/test1.test.js | 16 +- .../fixtures/filter-files/test2.test.js | 16 +- test/watch-mode/helpers/watch.js | 261 +- types/assertions.d.cts | 2 +- types/shared-worker.d.cts | 2 +- xo.config.mjs | 107 + 109 files changed, 2070 insertions(+), 2646 deletions(-) delete mode 100644 .xo-config.cjs create mode 100644 xo.config.mjs diff --git a/.xo-config.cjs b/.xo-config.cjs deleted file mode 100644 index 815e53c6f..000000000 --- a/.xo-config.cjs +++ /dev/null @@ -1,100 +0,0 @@ -// XO's AVA plugin will use the checked out code to resolve AVA configuration, -// which causes all kinds of confusion when it finds our own ava.config.cjs file -// or other ava.config.* fixtures. -// Use the internal test flag to make XO behave like our own tests. -require('node:process').env.AVA_FAKE_SCM_ROOT = '.fake-root'; - -module.exports = { - ignores: [ - 'media/**', - 'test/config/fixtures/config-errors/test.js', - 'test/line-numbers/fixtures/line-numbers.js', - 'test/**/fixtures', - 'test-tap/fixture/snapshots/test-sourcemaps/build/**', - 'test-tap/fixture/report/edgecases/ast-syntax-error.cjs', - 'test-tap/fixture/**/*.ts', - 'test-types', - 'examples/typescript-*/**/*.ts', - ], - rules: { - 'import/order': [ - 'error', - { - alphabetize: { - order: 'asc', - }, - 'newlines-between': 'always', - }, - ], - 'import/newline-after-import': 'error', - 'unicorn/require-post-message-target-origin': 'off', - 'unicorn/prefer-event-target': 'off', - 'unicorn/prevent-abbreviations': 'off', - }, - overrides: [ - { - files: '**/*.d.*(c|m)ts', - rules: { - 'import/extensions': 'off', - 'n/file-extension-in-import': 'off', - }, - }, - { - files: 'examples/**', - rules: { - 'ava/no-ignored-test-files': 'off', - 'ava/no-only-test': 'off', - 'unicorn/prefer-module': 'off', - }, - }, - { - files: [ - 'test/**/fixtures/**', - 'test-tap/**fixture/**', - ], - rules: { - 'unicorn/no-empty-file': 'off', - }, - }, - { - files: 'test-types/**', - rules: { - 'ava/assertion-arguments': 'off', - 'ava/no-ignored-test-files': 'off', - 'ava/no-skip-assert': 'off', - 'ava/use-t': 'off', - }, - }, - { - // TODO: Update tests. - files: 'test/**', - rules: { - 'import/no-anonymous-default-export': 'off', - 'n/prefer-global/process': 'off', - }, - }, - { - files: 'test/**/fixtures/**', - rules: { - 'n/file-extension-in-import': 'off', - }, - }, - { - // TODO: Update tests. - files: 'test/snapshot-*/fixtures/**', - rules: { - 'unicorn/prefer-module': 'off', - }, - }, - { - // TODO: Update tests. - files: 'test-tap/**', - rules: { - 'import/no-anonymous-default-export': 'off', - 'n/prefer-global/process': 'off', - 'promise/prefer-await-to-then': 'off', - 'unicorn/error-message': 'off', - }, - }, - ], -}; diff --git a/ava.config.js b/ava.config.js index 940832901..de5d94884 100644 --- a/ava.config.js +++ b/ava.config.js @@ -2,7 +2,7 @@ import process from 'node:process'; const skipWatchMode = process.env.TEST_AVA_SKIP_WATCH_MODE ? ['!test/watch-mode/**'] : []; -export default { // eslint-disable-line import/no-anonymous-default-export +export default { // eslint-disable-line import-x/no-anonymous-default-export files: ['test/**', '!test/**/{fixtures,helpers}/**', ...skipWatchMode], watchMode: { ignoreChanges: ['{coverage,docs,media,test-types,test-tap}/**'], diff --git a/entrypoints/main.d.cts b/entrypoints/main.d.cts index d4fcdc160..a59c71ea2 100644 --- a/entrypoints/main.d.cts +++ b/entrypoints/main.d.cts @@ -1,9 +1,9 @@ import type {TestFn} from '../types/test-fn.cjs'; -export * from '../types/assertions.cjs'; -export * from '../types/try-fn.cjs'; -export * from '../types/test-fn.cjs'; -export * from '../types/subscribable.cjs'; +export type * from '../types/assertions.cjs'; +export type * from '../types/try-fn.cjs'; +export type * from '../types/test-fn.cjs'; +export type * from '../types/subscribable.cjs'; /** Call to declare a test, or chain to declare hooks or test modifiers */ declare const test: TestFn; diff --git a/entrypoints/main.d.mts b/entrypoints/main.d.mts index 6b4fb27ca..bfdbbbda1 100644 --- a/entrypoints/main.d.mts +++ b/entrypoints/main.d.mts @@ -1,9 +1,9 @@ import type {TestFn} from '../types/test-fn.cjs'; -export * from '../types/assertions.cjs'; -export * from '../types/try-fn.cjs'; -export * from '../types/test-fn.cjs'; -export * from '../types/subscribable.cjs'; +export type * from '../types/assertions.cjs'; +export type * from '../types/try-fn.cjs'; +export type * from '../types/test-fn.cjs'; +export type * from '../types/subscribable.cjs'; /** Call to declare a test, or chain to declare hooks or test modifiers */ declare const test: TestFn; diff --git a/lib/api.js b/lib/api.js index e525e9235..92eb7bb4f 100644 --- a/lib/api.js +++ b/lib/api.js @@ -152,12 +152,14 @@ export default class Api extends Emittery { if (typeof testFileSelector === 'function') { selectedFiles = testFileSelector(testFiles, selectedFiles); } else if (selectedFiles.length === 0) { - selectedFiles = filter.length === 0 ? testFiles : globs.applyTestFileFilter({ - cwd: this.options.projectDir, - filter: filter.map(({pattern}) => pattern), - providers, - testFiles, - }); + selectedFiles = filter.length === 0 + ? testFiles + : globs.applyTestFileFilter({ + cwd: this.options.projectDir, + filter: filter.map(({pattern}) => pattern), + providers, + testFiles, + }); } } catch (error) { selectedFiles = []; @@ -291,7 +293,7 @@ export default class Api extends Emittery { deregisteredSharedWorkers.push(observeWorkerProcess(worker, runStatus)); pendingWorkers.add(worker); - worker.promise.then(() => { + worker.promise.then(() => { // eslint-disable-line promise/prefer-await-to-then pendingWorkers.delete(worker); }); timeoutTrigger.debounce(); diff --git a/lib/assert.js b/lib/assert.js index 1a70a1e11..cc88e2d25 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -490,7 +490,7 @@ export class Assertions { // Record the stack before it gets lost in the promise chain. const assertionStack = getAssertionStack(); // Handle "promise like" objects by casting to a real Promise. - const intermediate = Promise.resolve(promise).then(value => { // eslint-disable-line promise/prefer-await-to-then + const intermediate = Promise.resolve(promise).then(value => { // eslint-disable-line promise/prefer-catch, promise/prefer-await-to-then throw failPending(new AssertionError(message, { assertion: 't.throwsAsync()', assertionStack, @@ -592,7 +592,7 @@ export class Assertions { // Create an error object to record the stack before it gets lost in the promise chain. const assertionStack = getAssertionStack(); // Handle "promise like" objects by casting to a real Promise. - const intermediate = Promise.resolve(promise).then(noop, error => { // eslint-disable-line promise/prefer-await-to-then + const intermediate = Promise.resolve(promise).then(noop, error => { // eslint-disable-line promise/prefer-catch, promise/prefer-await-to-then throw failPending(new AssertionError(message, { assertion: 't.notThrowsAsync()', assertionStack, diff --git a/lib/chalk.js b/lib/chalk.js index eca6d4267..3365e2f17 100644 --- a/lib/chalk.js +++ b/lib/chalk.js @@ -1,6 +1,6 @@ import {Chalk} from 'chalk'; // eslint-disable-line unicorn/import-style -let chalk = new Chalk(); // eslint-disable-line import/no-mutable-exports +let chalk = new Chalk(); // eslint-disable-line import-x/no-mutable-exports export {chalk}; diff --git a/lib/cli.js b/lib/cli.js index dd0c9feb2..4e13084d4 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -100,9 +100,7 @@ export default async function loadCli() { // eslint-disable-line complexity const {argv: {config: configFile}} = yargs(hideBin(process.argv)).help(false).version(false); const loaded = await loadConfig({configFile}); if (loaded.unsupportedFiles.length > 0) { - console.log(chalk.magenta( - ` ${figures.warning} AVA does not support JSON config, ignoring:\n\n ${loaded.unsupportedFiles.join('\n ')}`, - )); + console.log(chalk.magenta(` ${figures.warning} AVA does not support JSON config, ignoring:\n\n ${loaded.unsupportedFiles.join('\n ')}`)); } conf = loaded.config; @@ -130,7 +128,8 @@ export default async function loadCli() { // eslint-disable-line complexity files: [], host: undefined, port: undefined, - } : null; + } + : null; let resetCache = false; const {argv} = yargs(hideBin(process.argv)) @@ -165,6 +164,7 @@ export default async function loadCli() { // eslint-disable-line complexity }) .command('* [...]', 'Run tests', yargs => yargs.options(FLAGS).positional('pattern', { array: true, + // eslint-disable-next-line @stylistic/max-len describe: 'Select which test files to run. Leave empty if you want AVA to run all test files as per your configuration. Accepts glob patterns, directories that (recursively) contain test files, and file paths optionally suffixed with a colon and comma-separated numbers and/or ranges identifying the 1-based line(s) of specific tests to run', type: 'string', }), argv => { @@ -192,6 +192,7 @@ export default async function loadCli() { // eslint-disable-line complexity }, }).positional('pattern', { demand: true, + // eslint-disable-next-line @stylistic/max-len describe: 'Glob pattern to select a single test file to debug, optionally suffixed with a colon and comma-separated numbers and/or ranges identifying the 1-based line(s) of specific tests to run', type: 'string', }), @@ -203,14 +204,16 @@ export default async function loadCli() { // eslint-disable-line complexity host: argv.host, port: argv.port, }; - }) + }, + ) .command( 'reset-cache', 'Delete any temporary files and state kept by AVA, then exit', yargs => yargs, () => { resetCache = true; - }) + }, + ) .example('$0') .example('$0 test.js') .example('$0 test.js:4,7-9') diff --git a/lib/line-numbers.js b/lib/line-numbers.js index 22dfd92af..cc637b9d3 100644 --- a/lib/line-numbers.js +++ b/lib/line-numbers.js @@ -16,23 +16,21 @@ const parseNumber = string => Number.parseInt(string, 10); const removeAllWhitespace = string => string.replaceAll(/\s/g, ''); const range = (start, end) => Array.from({length: end - start + 1}).fill(start).map((element, index) => element + index); -const parseLineNumbers = suffix => sortNumbersAscending(distinctArray( - suffix.split(',').flatMap(part => { - if (NUMBER_REGEX.test(part)) { - return parseNumber(part); - } +const parseLineNumbers = suffix => sortNumbersAscending(distinctArray(suffix.split(',').flatMap(part => { + if (NUMBER_REGEX.test(part)) { + return parseNumber(part); + } - const {groups: {startGroup, endGroup}} = RANGE_REGEX.exec(part); - const start = parseNumber(startGroup); - const end = parseNumber(endGroup); + const {groups: {startGroup, endGroup}} = RANGE_REGEX.exec(part); + const start = parseNumber(startGroup); + const end = parseNumber(endGroup); - if (start > end) { - return range(end, start); - } + if (start > end) { + return range(end, start); + } - return range(start, end); - }), -)); + return range(start, end); +}))); export function splitPatternAndLineNumbers(pattern) { const parts = pattern.split(DELIMITER); @@ -49,9 +47,7 @@ export function splitPatternAndLineNumbers(pattern) { } export function getApplicableLineNumbers(normalizedFilePath, filter) { - return sortNumbersAscending(distinctArray( - filter - .filter(({pattern, lineNumbers}) => lineNumbers && picomatch.isMatch(normalizedFilePath, pattern)) - .flatMap(({lineNumbers}) => lineNumbers), - )); + return sortNumbersAscending(distinctArray(filter + .filter(({pattern, lineNumbers}) => lineNumbers && picomatch.isMatch(normalizedFilePath, pattern)) + .flatMap(({lineNumbers}) => lineNumbers))); } diff --git a/lib/reporters/default.js b/lib/reporters/default.js index 7da27c797..10ca84f65 100644 --- a/lib/reporters/default.js +++ b/lib/reporters/default.js @@ -327,6 +327,7 @@ export default class Reporter { this.lineWriter.writeLine(colors.error(`${figures.cross} Line numbers for ${this.relativeFile(event.testFile)} did not match any tests`)); } else if (!this.failFastEnabled && fileStats.remainingTests > 0) { + // eslint-disable-next-line @stylistic/max-len this.lineWriter.writeLine(colors.error(`${figures.cross} ${fileStats.remainingTests} ${plur('test', fileStats.remainingTests)} remaining in ${this.relativeFile(event.testFile)}`)); } } @@ -632,6 +633,7 @@ export default class Reporter { this.lineWriter.writeLine(colors.error(`${figures.cross} Couldn’t find any files to test` + firstLinePostfix)); } else { const {testFileCount: count} = this.selectionInsights; + // eslint-disable-next-line @stylistic/max-len this.lineWriter.writeLine(colors.error(`${figures.cross} Based on your configuration, ${count} test ${plur('file was', 'files were', count)} found, but did not match the filters:` + firstLinePostfix)); this.lineWriter.writeLine(); for (const {pattern} of this.selectionInsights.filter) { @@ -712,8 +714,7 @@ export default class Reporter { && this.stats.failedTests === 0 && this.stats.passedTests > 0 ) { - this.lineWriter.writeLine(colors.pass(`${this.stats.passedTests} ${plur('test', this.stats.passedTests)} passed`) + firstLinePostfix, - ); + this.lineWriter.writeLine(colors.pass(`${this.stats.passedTests} ${plur('test', this.stats.passedTests)} passed`) + firstLinePostfix); firstLinePostfix = ''; } diff --git a/lib/runner.js b/lib/runner.js index 2a9bb3bf3..1025bbdeb 100644 --- a/lib/runner.js +++ b/lib/runner.js @@ -254,23 +254,21 @@ export default class Runner extends Emittery { let waitForSerial = Promise.resolve(); await runnables.reduce((previous, runnable) => { // eslint-disable-line unicorn/no-array-reduce if (runnable.metadata.serial || this.serial) { - waitForSerial = previous.then(() => + waitForSerial = previous.then(() => // eslint-disable-line promise/prefer-await-to-then // Serial runnables run as long as there was no previous failure, unless // the runnable should always be run. - (allPassed || runnable.metadata.always) && runAndStoreResult(runnable), - ); + (allPassed || runnable.metadata.always) && runAndStoreResult(runnable)); return waitForSerial; } return Promise.all([ previous, - waitForSerial.then(() => + waitForSerial.then(() => // eslint-disable-line promise/prefer-await-to-then // Concurrent runnables are kicked off after the previous serial // runnables have completed, as long as there was no previous failure // (or if the runnable should always be run). One concurrent runnable's // failure does not prevent the next runnable from running. - (allPassed || runnable.metadata.always) && runAndStoreResult(runnable), - ), + (allPassed || runnable.metadata.always) && runAndStoreResult(runnable)), ]); }, waitForSerial); @@ -379,7 +377,8 @@ export default class Runner extends Emittery { { titleSuffix: hookSuffix, testPassed: testOk, - }); + }, + ); } else { this.emit('stateChange', { type: 'test-failed', @@ -399,7 +398,8 @@ export default class Runner extends Emittery { { titleSuffix: hookSuffix, testPassed: testOk, - }); + }, + ); return alwaysOk && hooksOk && testOk; } diff --git a/lib/snapshot-manager.js b/lib/snapshot-manager.js index 68d7f8af7..1be8a1c4d 100644 --- a/lib/snapshot-manager.js +++ b/lib/snapshot-manager.js @@ -160,26 +160,24 @@ class BufferBuilder { } function sortBlocks(blocksByTitle, blockIndices) { - return [...blocksByTitle].sort( - ([aTitle], [bTitle]) => { - const a = blockIndices.get(aTitle); - const b = blockIndices.get(bTitle); - - if (a === undefined) { - if (b === undefined) { - return 0; - } - - return 1; - } + return [...blocksByTitle].sort(([aTitle], [bTitle]) => { + const a = blockIndices.get(aTitle); + const b = blockIndices.get(bTitle); + if (a === undefined) { if (b === undefined) { - return -1; + return 0; } - return a - b; - }, - ); + return 1; + } + + if (b === undefined) { + return -1; + } + + return a - b; + }); } async function encodeSnapshots(snapshotData) { @@ -368,9 +366,7 @@ class Manager { } const snapshots = { - blocks: sortBlocks(this.newBlocksByTitle, this.blockIndices).map( - ([title, block]) => ({title, ...block}), - ), + blocks: sortBlocks(this.newBlocksByTitle, this.blockIndices).map(([title, block]) => ({title, ...block})), }; const buffer = await encodeSnapshots(snapshots); diff --git a/lib/test.js b/lib/test.js index 7d4d2c001..a14a7c505 100644 --- a/lib/test.js +++ b/lib/test.js @@ -630,11 +630,13 @@ export default class Test { if (this.metadata.failing) { passed = !passed; - error = passed ? null : new AssertionError('Test was expected to fail, but succeeded, you should stop marking the test as failing', { - // TODO: Provide an assertion stack that traces to the test declaration, - // rather than AVA internals. - assertionStack: '', - }); + error = passed + ? null + : new AssertionError('Test was expected to fail, but succeeded, you should stop marking the test as failing', { + // TODO: Provide an assertion stack that traces to the test declaration, + // rather than AVA internals. + assertionStack: '', + }); } return { diff --git a/lib/watcher.js b/lib/watcher.js index 45708b24e..df13e7cf0 100644 --- a/lib/watcher.js +++ b/lib/watcher.js @@ -37,7 +37,7 @@ export function available(projectDir) { const cancel = Symbol('cancel'); const close = Symbol('close'); -const promiseWithResolvers = Promise.withResolvers?.bind(Promise) ?? (() => { // eslint-disable-line n/no-unsupported-features/es-syntax, no-use-extend-native/no-use-extend-native +const promiseWithResolvers = Promise.withResolvers?.bind(Promise) ?? (() => { let resolve; let reject; const promise = new Promise((_resolve, _reject) => { diff --git a/lib/worker/main.cjs b/lib/worker/main.cjs index 4b8d6b4c4..50940fd61 100644 --- a/lib/worker/main.cjs +++ b/lib/worker/main.cjs @@ -1,5 +1,5 @@ 'use strict'; -require('./guard-environment.cjs'); // eslint-disable-line import/no-unassigned-import +require('./guard-environment.cjs'); // eslint-disable-line import-x/no-unassigned-import const assert = require('node:assert'); diff --git a/lib/worker/plugin.cjs b/lib/worker/plugin.cjs index 346d19527..dace29ca6 100644 --- a/lib/worker/plugin.cjs +++ b/lib/worker/plugin.cjs @@ -4,7 +4,7 @@ const {registerSharedWorker: register} = require('./channel.cjs'); const options = require('./options.cjs'); const {sharedWorkerTeardowns, waitForReady} = require('./state.cjs'); -require('./guard-environment.cjs'); // eslint-disable-line import/no-unassigned-import +require('./guard-environment.cjs'); // eslint-disable-line import-x/no-unassigned-import const workers = new Map(); const workerTeardownFns = new WeakMap(); diff --git a/media/screenshot-fixtures/magic-assert-buffers.js b/media/screenshot-fixtures/magic-assert-buffers.js index 33213930a..540456d93 100644 --- a/media/screenshot-fixtures/magic-assert-buffers.js +++ b/media/screenshot-fixtures/magic-assert-buffers.js @@ -1,7 +1,9 @@ +import {Buffer} from 'node:buffer'; + import test from 'ava'; test('buffers', t => { - const actual = Buffer.from('decafbadcab00d1e'.repeat(4), 'hex') - const expected = Buffer.from('cab00d1edecafbad' + 'decafbadcab00d1e'.repeat(3), 'hex') - t.deepEqual(actual, expected) + const actual = Buffer.from('decafbadcab00d1e'.repeat(4), 'hex'); + const expected = Buffer.from('cab00d1edecafbad' + 'decafbadcab00d1e'.repeat(3), 'hex'); + t.deepEqual(actual, expected); }); diff --git a/media/screenshot-fixtures/magic-assert-exceptions.js b/media/screenshot-fixtures/magic-assert-exceptions.js index a734b542d..2b1afe36e 100644 --- a/media/screenshot-fixtures/magic-assert-exceptions.js +++ b/media/screenshot-fixtures/magic-assert-exceptions.js @@ -1,6 +1,7 @@ -import fs from 'fs'; +import fs from 'node:fs'; + import test from 'ava'; -test('exception', t => { - fs.readFileSync('non-existent-file') +test('exception', () => { + fs.readFileSync('non-existent-file'); }); diff --git a/media/screenshot-fixtures/magic-assert-objects.js b/media/screenshot-fixtures/magic-assert-objects.js index 8f9277bf0..16697da23 100644 --- a/media/screenshot-fixtures/magic-assert-objects.js +++ b/media/screenshot-fixtures/magic-assert-objects.js @@ -4,15 +4,15 @@ test('objects', t => { const actual = { a: 1, b: { - c: 2 - } + c: 2, + }, }; const expected = { a: 1, b: { - c: 3 - } + c: 3, + }, }; t.deepEqual(actual, expected); diff --git a/package-lock.json b/package-lock.json index 1cc7ecf5a..449a96dff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "6.3.0", "license": "MIT", "dependencies": { - "@vercel/nft": "^0.29.2", + "@vercel/nft": "^0.29.4", "acorn": "^8.14.1", "acorn-walk": "^8.3.4", "ansi-styles": "^6.2.1", @@ -26,7 +26,7 @@ "common-path-prefix": "^3.0.0", "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.4.0", + "debug": "^4.4.1", "emittery": "^1.1.0", "figures": "^6.1.0", "globby": "^14.1.0", @@ -57,21 +57,21 @@ "@ava/test": "github:avajs/test", "@ava/typescript": "^5.0.0", "@sindresorhus/tsconfig": "^5.1.1", - "@types/node": "^22.14.1", + "@types/node": "^22.15.30", "ansi-escapes": "^7.0.0", "c8": "^10.1.3", - "execa": "^9.5.2", + "execa": "^9.6.0", "expect": "^29.7.0", "sinon": "^20.0.0", "tap": "^21.1.0", "tempy": "^3.1.0", "tsd": "^0.32.0", "typescript": "~5.8.3", - "xo": "^0.60.0", + "xo": "^1.0.5", "zen-observable": "^0.10.0" }, "engines": { - "node": "^18.18 || ^20.8 || ^22 || >=23" + "node": "^18.18 || ^20.8 || ^22 || ^23 || >=24" }, "peerDependencies": { "@ava/typescript": "*" @@ -318,24 +318,24 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -372,10 +372,87 @@ "node": ">=12" } }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz", + "integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz", - "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -391,6 +468,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -401,6 +491,68 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", @@ -443,6 +595,19 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -480,53 +645,78 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", + "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -543,13 +733,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -741,34 +937,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -779,41 +947,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -853,6 +986,19 @@ "node": ">=18" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz", + "integrity": "sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.9.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1115,16 +1261,16 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.2.tgz", - "integrity": "sha512-25L86MyPvnlQoX2MTIV2OiUcb6vJ6aRbFa9pbwByn95INKD5mFH2smgjDhq+fwJoqAgvgbdJLj6Tz7V9X5CFAQ==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", + "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@rollup/pluginutils": { @@ -1149,13 +1295,6 @@ } } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -1318,6 +1457,26 @@ "node": ">=4" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", + "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.32.1", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, "node_modules/@tapjs/after": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.0.1.tgz", @@ -1444,9 +1603,9 @@ } }, "node_modules/@tapjs/config/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1701,9 +1860,9 @@ } }, "node_modules/@tapjs/run/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1735,9 +1894,9 @@ } }, "node_modules/@tapjs/run/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1916,9 +2075,9 @@ } }, "node_modules/@tapjs/test/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1940,9 +2099,9 @@ } }, "node_modules/@tapjs/test/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -2049,9 +2208,9 @@ "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.3.tgz", - "integrity": "sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.4.tgz", + "integrity": "sha512-tkWPDtk18K2qJK/DhU010f03iDlw+C8qjXvhwZ4KKpJQC4QFOG3r8tIf2q6aWD0mz9N7RcZcaD9SPlrVLKiDoQ==", "dev": true, "license": "MIT" }, @@ -2103,6 +2262,17 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -2114,22 +2284,10 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { @@ -2166,13 +2324,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -2181,9 +2332,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "22.15.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", + "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", "dev": true, "license": "MIT", "dependencies": { @@ -2222,132 +2373,149 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz", + "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/type-utils": "8.33.1", + "@typescript-eslint/utils": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.33.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@typescript-eslint/parser": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz", + "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", + "debug": "^4.3.4" + }, "engines": { - "node": ">= 4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", + "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/tsconfig-utils": "^8.33.1", + "@typescript-eslint/types": "^8.33.1", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", + "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", + "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz", + "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/typescript-estree": "8.33.1", + "@typescript-eslint/utils": "8.33.1", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", + "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -2355,340 +2523,342 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", + "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/project-service": "8.33.1", + "@typescript-eslint/tsconfig-utils": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/visitor-keys": "8.33.1", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", + "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.33.1", + "@typescript-eslint/types": "8.33.1", + "@typescript-eslint/typescript-estree": "8.33.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", + "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.33.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.11.tgz", + "integrity": "sha512-i3/wlWjQJXMh1uiGtiv7k1EYvrrS3L1hdwmWJJiz1D8jWy726YFYPIxQWbEIVPVAgrfRR0XNlLrTQwq17cuCGw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC" - }, - "node_modules/@vercel/nft": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.29.2.tgz", - "integrity": "sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA==", "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^10.4.5", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=18" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.11.tgz", + "integrity": "sha512-8XXyFvc6w6kmMmi6VYchZhjd5CDcp+Lv6Cn1YmUme0ypsZ/0Kzd+9ESrWtDrWibKPTgSteDTxp75cvBOY64FQQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.11.tgz", + "integrity": "sha512-0qJBYzP8Qk24CZ05RSWDQUjdiQUeIJGfqMMzbtXgCKl/a5xa6thfC0MQkGIr55LCLd6YmMyO640ifYUa53lybQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.11.tgz", + "integrity": "sha512-1sGwpgvx+WZf0GFT6vkkOm6UJ+mlsVnjw+Yv9esK71idWeRAG3bbpkf3AoY8KIqKqmnzJExi0uKxXpakQ5Pcbg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.11.tgz", + "integrity": "sha512-D/1F/2lTe+XAl3ohkYj51NjniVly8sIqkA/n1aOND3ZMO418nl2JNU95iVa1/RtpzaKcWEsNTtHRogykrUflJg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.11.tgz", + "integrity": "sha512-7vFWHLCCNFLEQlmwKQfVy066ohLLArZl+AV/AdmrD1/pD1FlmqM+FKbtnONnIwbHtgetFUCV/SRi1q4D49aTlw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.11.tgz", + "integrity": "sha512-tYkGIx8hjWPh4zcn17jLEHU8YMmdP2obRTGkdaB3BguGHh31VCS3ywqC4QjTODjmhhNyZYkj/1Dz/+0kKvg9YA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.11.tgz", + "integrity": "sha512-6F328QIUev29vcZeRX6v6oqKxfUoGwIIAhWGD8wSysnBYFY0nivp25jdWmAb1GildbCCaQvOKEhCok7YfWkj4Q==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.11.tgz", + "integrity": "sha512-NqhWmiGJGdzbZbeucPZIG9Iav4lyYLCarEnxAceguMx9qlpeEF7ENqYKOwB8Zqk7/CeuYMEcLYMaW2li6HyDzQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.11.tgz", + "integrity": "sha512-J2RPIFKMdTrLtBdfR1cUMKl8Gcy05nlQ+bEs/6al7EdWLk9cs3tnDREHZ7mV9uGbeghpjo4i8neNZNx3PYUY9w==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.11.tgz", + "integrity": "sha512-bDpGRerHvvHdhun7MmFUNDpMiYcJSqWckwAVVRTJf8F+RyqYJOp/mx04PDc7DhpNPeWdnTMu91oZRMV+gGaVcQ==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.11.tgz", + "integrity": "sha512-G9U7bVmylzRLma3cK39RBm3guoD1HOvY4o0NS4JNm37AD0lS7/xyMt7kn0JejYyc0Im8J+rH69/dXGM9DAJcSQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.11.tgz", + "integrity": "sha512-7qL20SBKomekSunm7M9Fe5L93bFbn+FbHiGJbfTlp0RKhPVoJDP73vOxf1QrmJHyDPECsGWPFnKa/f8fO2FsHw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.11.tgz", + "integrity": "sha512-jisvIva8MidjI+B1lFRZZMfCPaCISePgTyR60wNT1MeQvIh5Ksa0G3gvI+Iqyj3jqYbvOHByenpa5eDGcSdoSg==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@napi-rs/wasm-runtime": "^0.2.10" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.11.tgz", + "integrity": "sha512-G+H5nQZ8sRZ8ebMY6mRGBBvTEzMYEcgVauLsNHpvTUavZoCCRVP1zWkCZgOju2dW3O22+8seTHniTdl1/uLz3g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.11.tgz", + "integrity": "sha512-Hfy46DBfFzyv0wgR0MMOwFFib2W2+Btc8oE5h4XlPhpelnSyA6nFxkVIyTgIXYGTdFaLoZFNn62fmqx3rjEg3A==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.11.tgz", + "integrity": "sha512-7L8NdsQlCJ8T106Gbz/AjzM4QKWVsoQbKpB9bMBGcIZswUuAnJMHpvbqGW3RBqLHCIwX4XZ5fxSBHEFcK2h9wA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true + "node_modules/@vercel/nft": { + "version": "0.29.4", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.29.4.tgz", + "integrity": "sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==", + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^10.4.5", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=18" + } }, "node_modules/abbrev": { "version": "3.0.1", @@ -2792,51 +2962,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/ansi-escapes": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", @@ -2947,18 +3072,20 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2977,20 +3104,19 @@ "node": ">=8" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3037,6 +3163,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", @@ -3191,9 +3334,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -3211,10 +3354,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3223,22 +3366,14 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3502,9 +3637,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001713", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz", - "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==", + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", "dev": true, "funding": [ { @@ -3580,17 +3715,6 @@ "node": ">=18" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/chunkd": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", @@ -3822,13 +3946,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">= 12.0.0" + } }, "node_modules/common-path-prefix": { "version": "3.0.0", @@ -3895,9 +4021,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4077,9 +4203,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4217,9 +4343,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -4269,16 +4395,16 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dunder-proto": { @@ -4303,9 +4429,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.136", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz", - "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==", + "version": "1.5.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", + "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", "dev": true, "license": "ISC" }, @@ -4351,17 +4477,17 @@ } }, "node_modules/enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=0.6" + "node": ">=10.13.0" } }, "node_modules/env-editor": { @@ -4418,9 +4544,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { @@ -4428,18 +4554,18 @@ "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -4451,21 +4577,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -4474,7 +4603,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -4503,13 +4632,33 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -4572,9 +4721,9 @@ } }, "node_modules/es-toolkit": { - "version": "1.34.1", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.34.1.tgz", - "integrity": "sha512-OA6cd94fJV9bm8dWhIySkWq4xV+rAQnBZUr2dnpXam0QJ8c+hurLbKA8/QooL9Mx4WCAxvIDsiEkid5KPQ5xgQ==", + "version": "1.39.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.39.1.tgz", + "integrity": "sha512-cJNIXXx861Brn2GaXourDn5h3WRjYVc5hHKBLve8r0vP9TFeyPCiNgJFLn30HiJyCK4lUyjDhBELBwZG1tgZ0A==", "dev": true, "license": "MIT", "workspaces": [ @@ -4604,60 +4753,64 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", + "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.28.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-compat-utils": { @@ -4677,41 +4830,128 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz", + "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-config-xo": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.45.0.tgz", - "integrity": "sha512-T30F2S2HKKmr/RoHopKE7wMUMWrsLMab1qFl2WyFJjETbD+l7p4hSQWpTVGW7TEbSKG1QBekwf6Jn9ZDPA6thA==", + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.46.0.tgz", + "integrity": "sha512-mjQUhdTCLQwHUFKf1hhSx1FFhm2jllr4uG2KjaW7gZHGAbjKoSypvo1eQvFk17lHx3bztYjZDDXQmkAZyaSlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin": "^2.6.1", + "confusing-browser-globals": "1.0.11", + "globals": "^15.3.0" + }, + "engines": { + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "eslint": ">=9.8.0" + } + }, + "node_modules/eslint-config-xo-react": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-react/-/eslint-config-xo-react-0.28.0.tgz", + "integrity": "sha512-dKvxB9kxMNLhWKsh6yiptACet+/WwKcN7ID2hIBAmjH6le4tt8um4sJ0/aAH6y+xle9tPrasX1Wnz90muCoz9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.1.0" + }, + "engines": { + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "eslint": ">=9.18.0" + } + }, + "node_modules/eslint-config-xo-typescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-7.0.0.tgz", + "integrity": "sha512-Mvy5eo6PW2BWPpxLsG7Y28LciZhLhiXFZAw/H3kdia34Efudk2aWMWwAKqkEFamo/SHiyMYkqUx6DYO+YJeVVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/eslint-plugin": "^2.6.1", + "eslint-config-xo": "^0.46.0", + "typescript-eslint": "^8.3.0" + }, + "engines": { + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "eslint": ">=9.8.0", + "typescript": ">=5.5.0" + } + }, + "node_modules/eslint-config-xo-typescript/node_modules/@stylistic/eslint-plugin": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", + "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/eslint-config-xo/node_modules/@stylistic/eslint-plugin": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", + "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", "dev": true, "license": "MIT", "dependencies": { - "confusing-browser-globals": "1.0.11" + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=8.56.0" + "eslint": ">=8.40.0" } }, - "node_modules/eslint-config-xo-typescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-5.0.0.tgz", - "integrity": "sha512-ukAYCKf3p039pRai7hb6xaomZzsKlCjV5qx3NbYe27UC7Nz75If1HcpQL5sNW2b5aH8+Axb6dIIv28+bVtwlVQ==", + "node_modules/eslint-config-xo/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, "license": "MIT", "engines": { @@ -4719,12 +4959,6 @@ }, "funding": { "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">=7.16.0", - "@typescript-eslint/parser": ">=7.16.0", - "eslint": ">=8.56.0", - "typescript": ">=5.0.0" } }, "node_modules/eslint-formatter-pretty": { @@ -4883,127 +5117,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/eslint-import-context": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.8.tgz", + "integrity": "sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.1.1" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-import-resolver-webpack": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.10.tgz", - "integrity": "sha512-ciVTEg7sA56wRMR772PyjcBRmyBMLS46xgzQZqt6cWBEKc7cK65ZSSLCTLVRu2gGtKyXUb5stwf4xxLBfERLFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "enhanced-resolve": "^0.9.1", - "find-root": "^1.1.0", - "hasown": "^2.0.2", - "interpret": "^1.4.0", - "is-core-module": "^2.15.1", - "is-regex": "^1.2.0", - "lodash": "^4.17.21", - "resolve": "^2.0.0-next.5", - "semver": "^5.7.2" - }, - "engines": { - "node": ">= 6" + "url": "https://opencollective.com/eslint-import-context" }, "peerDependencies": { - "eslint-plugin-import": ">=1.4.0", - "webpack": ">=1.11.0" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-webpack/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" + "unrs-resolver": "^1.0.0" }, "peerDependenciesMeta": { - "eslint": { + "unrs-resolver": { "optional": true } } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/eslint-plugin-ava": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-14.0.0.tgz", - "integrity": "sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-15.0.1.tgz", + "integrity": "sha512-eRX7mLFPvalGDWztJ4zm+anez2X6J/88r9CqLFfPAIMvFlGyJ+dUoFppoohgUQZLV09mIBNz5guP07zFJOLF8g==", "dev": true, "license": "MIT", "dependencies": { @@ -5017,10 +5159,23 @@ "resolve-from": "^5.0.0" }, "engines": { - "node": ">=14.17 <15 || >=16.4" + "node": "^18.18 || >=20" }, "peerDependencies": { - "eslint": ">=8.26.0" + "eslint": ">=9" + } + }, + "node_modules/eslint-plugin-ava/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-plugin-ava/node_modules/espree": { @@ -5063,152 +5218,121 @@ "eslint": ">=8" } }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "node_modules/eslint-plugin-import-x": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.15.1.tgz", + "integrity": "sha512-JfVpNg1qMkPD66iaSgmMoSYeUCGS8UFSm3GwHV0IbuV3Knar/SyK5qqCct9+AxoMIzaM+KSO7KK5pOeOkC/3GQ==", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" + "@typescript-eslint/types": "^8.33.1", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.7", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.1.1", + "unrs-resolver": "^1.7.10" }, "engines": { - "node": ">=6.5.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://opencollective.com/eslint-plugin-import-x" }, "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-plugin-eslint-comments/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } } }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "node_modules/eslint-plugin-n": { + "version": "17.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.19.0.tgz", + "integrity": "sha512-qxn1NaDHtizbhVAPpbMT8wWFaLtPnwhfN/e+chdu2i6Vgzmo/tGM62tcJ1Hf7J5Ie4dhse3DOPMmDxduzfifzw==", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" + "@eslint-community/eslint-utils": "^4.5.0", + "@typescript-eslint/utils": "^8.26.1", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "eslint": ">=8.23.0" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-n/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint-plugin-no-use-extend-native": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.7.2.tgz", + "integrity": "sha512-hUBlwaTXIO1GzTwPT6pAjvYwmSHe4XduDhAiQvur4RUujmBUFjd8Nb2+e7WQdsQ+nGHWGRlogcUWXJRGqizTWw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "is-get-set-prop": "^2.0.0", + "is-js-type": "^3.0.0", + "is-obj-prop": "^2.0.0", + "is-proto-prop": "^3.0.1" }, "engines": { - "node": "*" + "node": ">=18.18.0" + }, + "peerDependencies": { + "eslint": "^9.3.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-n": { - "version": "17.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.17.0.tgz", - "integrity": "sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==", - "dev": true, - "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.5.0", - "enhanced-resolve": "^5.17.1", - "eslint-plugin-es-x": "^7.8.0", - "get-tsconfig": "^4.8.1", - "globals": "^15.11.0", - "ignore": "^5.3.2", - "minimatch": "^9.0.5", - "semver": "^7.6.3" + "@eslint-community/eslint-utils": "^4.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5217,143 +5341,165 @@ "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": ">=8.23.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-n/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-no-use-extend-native": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz", - "integrity": "sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==", + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-get-set-prop": "^1.0.0", - "is-js-type": "^2.0.0", - "is-obj-prop": "^1.0.0", - "is-proto-prop": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.0.0" + "node": "*" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-unicorn": { - "version": "56.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz", - "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==", + "version": "59.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz", + "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^4.0.0", + "@babel/helper-validator-identifier": "^7.25.9", + "@eslint-community/eslint-utils": "^4.5.1", + "@eslint/plugin-kit": "^0.2.7", + "ci-info": "^4.2.0", "clean-regexp": "^1.0.0", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.41.0", "esquery": "^1.6.0", - "globals": "^15.9.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", + "find-up-simple": "^1.0.1", + "globals": "^16.0.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.6.3", - "strip-indent": "^3.0.0" + "regjsparser": "^0.12.0", + "semver": "^7.7.1", + "strip-indent": "^4.0.0" }, "engines": { - "node": ">=18.18" + "node": "^18.20.0 || ^20.10.0 || >=21.0.0" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=8.56.0" + "eslint": ">=9.22.0" } }, - "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/eslint-plugin-unicorn/node_modules/indent-string": { + "node_modules/eslint-plugin-unicorn/node_modules/strip-indent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-rule-docs": { @@ -5364,9 +5510,9 @@ "license": "MIT" }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5374,7 +5520,7 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5410,52 +5556,18 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5472,13 +5584,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5520,24 +5625,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -5551,22 +5638,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5577,19 +5648,6 @@ "node": ">= 4" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5603,46 +5661,6 @@ "node": "*" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esm-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esm-utils/-/esm-utils-4.3.0.tgz", - "integrity": "sha512-KupZztbWAnuksy1TYPjTkePxVlMWzmXdmB72z1WvUadtUiFv6x+0PKjYfyy1io9gdvU1A6QIcu055NRrJu1TEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-meta-resolve": "^4.1.0", - "url-or-path": "^2.3.0" - }, - "funding": { - "url": "https://github.com/fisker/esm-utils?sponsor=1" - } - }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -5661,19 +5679,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5745,17 +5750,6 @@ "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/events-to-array": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", @@ -5767,24 +5761,24 @@ } }, "node_modules/execa": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", - "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", "dev": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", - "human-signals": "^8.0.0", + "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", - "pretty-ms": "^9.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.0.0" + "yoctocolors": "^2.1.1" }, "engines": { "node": "^18.19.0 || >=20.5.0" @@ -5860,24 +5854,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause", - "peer": true - }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -5903,16 +5879,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/file-uri-to-path": { @@ -5923,144 +5899,49 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-5.0.0.tgz", - "integrity": "sha512-OuWNfjfP05JcpAP3JPgAKUhWefjMRfI5iAoSsvE24ANYWJaepAtlSgWECSVEuRgSXpyNEc9DJwG/TZpgcOqyig==", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "to-regex-range": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" } }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/find-cache-directory": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/find-cache-directory/-/find-cache-directory-6.0.0.tgz", + "integrity": "sha512-CvFd5ivA6HcSHbD+59P7CyzINHXzwhuQK8RY7CxJZtgDSAtRlHiCaQpZQ2lMR/WRyUIEmzUvL6G2AGurMfegZA==", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^6.3.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^8.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "node_modules/find-cache-directory/node_modules/pkg-dir": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-8.0.0.tgz", + "integrity": "sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==", "dev": true, "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, "engines": { - "node": ">=12.20" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true, - "license": "MIT" - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -6091,81 +5972,17 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "keyv": "^4.5.4" }, "engines": { - "node": "*" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -6241,13 +6058,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -6372,13 +6182,13 @@ } }, "node_modules/get-set-props": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.1.0.tgz", - "integrity": "sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.2.0.tgz", + "integrity": "sha512-YCmOj+4YAeEB5Dd9jfp6ETdejMet4zSxXjNkgaa4npBEKRI9uDOGB5MmAdAgi2OoFGAKshYhCbmLq2DS03CgVA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18.0.0" } }, "node_modules/get-stdin": { @@ -6430,9 +6240,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6474,18 +6284,10 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -6695,9 +6497,9 @@ "license": "MIT" }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -6752,9 +6554,9 @@ } }, "node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", "engines": { "node": ">= 4" @@ -6809,17 +6611,6 @@ "node": ">=4" } }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/import-modules": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", @@ -6854,25 +6645,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/ini": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", @@ -6884,9 +6656,9 @@ } }, "node_modules/ink": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-5.2.0.tgz", - "integrity": "sha512-gHzSBBvsh/1ZYuGi+aKzU7RwnYIr6PSz56or9T90i4DDS99euhN7nYKOMR3OTev0dKIB6Zod3vSapYzqoilQcg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-5.2.1.tgz", + "integrity": "sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==", "dev": true, "license": "MIT", "dependencies": { @@ -6973,9 +6745,9 @@ } }, "node_modules/ink/node_modules/type-fest": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz", - "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7018,16 +6790,6 @@ "node": ">= 0.4" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -7058,20 +6820,6 @@ "node": ">=8" } }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-actual-promise": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.2.tgz", @@ -7171,16 +6919,16 @@ } }, "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "builtin-modules": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7323,14 +7071,17 @@ } }, "node_modules/is-get-set-prop": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz", - "integrity": "sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-get-set-prop/-/is-get-set-prop-2.0.0.tgz", + "integrity": "sha512-C32bqXfHJfRwa0U5UIMqSGziZhALszXDJZ8n8mz8WZ6c6V7oYGHEWwJvftliBswypY3P3EQqdY5lpDSEKvTS1Q==", "dev": true, "license": "MIT", "dependencies": { - "get-set-props": "^0.1.0", - "lowercase-keys": "^1.0.0" + "get-set-props": "^0.2.0", + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": "> 18.0.0" } }, "node_modules/is-glob": { @@ -7381,13 +7132,16 @@ } }, "node_modules/is-js-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-2.0.0.tgz", - "integrity": "sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-3.0.0.tgz", + "integrity": "sha512-IbPf3g3vxm1D902xaBaYp2TUHiXZWwWRu5bM9hgKN9oAQcFaKALV6Gd13PGhXjKE5u2n8s1PhLhdke/E1fchxQ==", "dev": true, "license": "MIT", "dependencies": { - "js-types": "^1.0.0" + "js-types": "^4.0.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/is-lambda": { @@ -7410,14 +7164,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { @@ -7447,24 +7204,17 @@ } }, "node_modules/is-obj-prop": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-1.0.0.tgz", - "integrity": "sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj-prop/-/is-obj-prop-2.0.0.tgz", + "integrity": "sha512-2/VFrbzXSZVJIscazpxoB+pOQx2jBOAAL9Gui4cRKxflznUNBpsr8IDvBA4UGol3e40sltLNiY3qnZv/7qSUxA==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^1.0.0", - "obj-props": "^1.0.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", + "lowercase-keys": "^3.0.0", + "obj-props": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, "node_modules/is-plain-obj": { @@ -7496,14 +7246,17 @@ "license": "MIT" }, "node_modules/is-proto-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-2.0.0.tgz", - "integrity": "sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-3.0.1.tgz", + "integrity": "sha512-S8xSxNMGJO4eZD86kO46zrq2gLIhA+rN9443lQEvt8Mz/l8cxk72p/AWFmofY6uL9g9ILD6cXW6j8QQj4F3Hcw==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^1.0.0", - "proto-props": "^2.0.0" + "lowercase-keys": "^3.0.0", + "prototype-properties": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/is-regex": { @@ -7525,19 +7278,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -7631,19 +7371,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-unicode-supported": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", @@ -7702,16 +7429,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -7780,6 +7497,24 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -8047,39 +7782,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -8097,13 +7799,16 @@ "license": "MIT" }, "node_modules/js-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/js-types/-/js-types-1.0.0.tgz", - "integrity": "sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-types/-/js-types-4.0.0.tgz", + "integrity": "sha512-/c+n06zvqFQGxdz1BbElF7S3nEghjNchLN1TjQnk2j10HYDaUc57rcvl6BbnziTx8NQmrg0JOs/iwRpvcYaxjQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/js-yaml": { @@ -8170,19 +7875,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -8193,6 +7885,22 @@ ], "license": "MIT" }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8270,20 +7978,9 @@ "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/locate-path": { @@ -8308,13 +8005,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8407,13 +8097,16 @@ } }, "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru-cache": { @@ -8534,13 +8227,6 @@ "url": "https://github.com/sindresorhus/memoize?sponsor=1" } }, - "node_modules/memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==", - "dev": true, - "license": "MIT" - }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -8681,31 +8367,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -8753,16 +8414,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", @@ -8964,6 +8615,22 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8981,14 +8648,6 @@ "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -9362,9 +9021,19 @@ } }, "node_modules/obj-props": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-1.4.0.tgz", - "integrity": "sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/obj-props/-/obj-props-2.0.0.tgz", + "integrity": "sha512-Q/uLAAfjdhrzQWN2czRNh3fDCgXjh7yRIkdHjDgIHTwpFP0BsshxTA3HRNffHR7Iw/XGTH30u8vdMXQ+079urA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -9415,38 +9084,39 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { @@ -9468,16 +9138,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -9495,9 +9155,9 @@ } }, "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", "dev": true, "license": "MIT", "dependencies": { @@ -9844,16 +9504,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -10142,14 +9792,36 @@ "node": ">=10" } }, - "node_modules/proto-props": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proto-props/-/proto-props-2.0.0.tgz", - "integrity": "sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prototype-properties": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/prototype-properties/-/prototype-properties-5.0.0.tgz", + "integrity": "sha512-uCWE2QqnGlwvvJXTwiHTPTyHE62+zORO5hpFWhAwBGDtEtTmNZZleNLJDoFsqHCL4p/CeAP2Q1uMKFUKALuRGQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/punycode": { @@ -10192,17 +9864,6 @@ "node": ">=8" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -10544,25 +10205,29 @@ } }, "node_modules/regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/require-directory": { @@ -10574,17 +10239,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -10642,9 +10296,9 @@ } }, "node_modules/resolve-import/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "license": "ISC", "dependencies": { @@ -10666,9 +10320,9 @@ } }, "node_modules/resolve-import/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -10799,9 +10453,9 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "license": "ISC", "dependencies": { @@ -10823,9 +10477,9 @@ } }, "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -10937,28 +10591,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peer": true - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -11011,71 +10643,10 @@ "loose-envify": "^1.1.0" } }, - "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11099,17 +10670,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -11373,29 +10933,6 @@ "node": ">= 14" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -11451,6 +10988,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/stable-hash-x": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz", + "integrity": "sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -11472,6 +11019,20 @@ "node": ">=8" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string-length": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", @@ -11550,10 +11111,49 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "node_modules/string.prototype.trim": { @@ -11652,16 +11252,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/strip-final-newline": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", @@ -11780,9 +11370,9 @@ } }, "node_modules/sync-content/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", "dev": true, "license": "ISC", "dependencies": { @@ -11804,9 +11394,9 @@ } }, "node_modules/sync-content/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -11863,14 +11453,13 @@ } }, "node_modules/synckit": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.3.tgz", - "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", + "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.1", - "tslib": "^2.8.1" + "@pkgr/core": "^0.2.4" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -11949,13 +11538,13 @@ } }, "node_modules/tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=6" } }, "node_modules/tar": { @@ -12074,74 +11663,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -12157,13 +11678,6 @@ "node": ">=18" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/time-zone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", @@ -12173,20 +11687,6 @@ "node": ">=4" } }, - "node_modules/to-absolute-glob": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-3.0.0.tgz", - "integrity": "sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12226,29 +11726,39 @@ } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" } }, "node_modules/tsd": { @@ -12361,7 +11871,8 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true }, "node_modules/tuf-js": { "version": "2.2.1", @@ -12505,6 +12016,29 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.33.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.1.tgz", + "integrity": "sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.33.1", + "@typescript-eslint/parser": "8.33.1", + "@typescript-eslint/utils": "8.33.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -12524,16 +12058,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -12595,6 +12119,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unrs-resolver": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.11.tgz", + "integrity": "sha512-OhuAzBImFPjKNgZ2JwHMfGFUA6NSbRegd1+BPjC1Y0E6X9Y/vJ4zKeGmIMqmlYboj6cMNEwKI+xQisrg4J0HaQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.11", + "@unrs/resolver-binding-darwin-x64": "1.7.11", + "@unrs/resolver-binding-freebsd-x64": "1.7.11", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.11", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.11", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.11", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.11", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.11", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.11", + "@unrs/resolver-binding-linux-x64-musl": "1.7.11", + "@unrs/resolver-binding-wasm32-wasi": "1.7.11", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.11", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.11", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.11" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -12636,16 +12193,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-or-path": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/url-or-path/-/url-or-path-2.3.2.tgz", - "integrity": "sha512-DOI9KXk0bc/JOmFQHbn25knW2GX/ym7+egKFEFApG3VdDzRlLBMCIrMnruq4AZUGop1W0aiYQ5Vry6clzhxcOQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/fisker/url-or-path?sponsor=1" - } - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -12720,146 +12267,12 @@ "node": "20 || >=22" } }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, - "node_modules/webpack": { - "version": "5.99.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz", - "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/well-known-symbols": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", @@ -13132,13 +12545,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/write-file-atomic": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", @@ -13153,9 +12559,9 @@ } }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "license": "MIT", "engines": { @@ -13175,55 +12581,62 @@ } }, "node_modules/xo": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/xo/-/xo-0.60.0.tgz", - "integrity": "sha512-Il6Ap/bkYQm2CvocfiNY8yR52OospMdlxwbT2V/8KBRRCc+JKI1ARyFJpemuze9ZHBy/AAaDurjqWNj0C2DCYQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/xo/-/xo-1.0.5.tgz", + "integrity": "sha512-7eGWuph0NxSroDxDLo2ebXfeP2DrIeUe7L0PPrjzPUEIdFnAfV54Hpnw7QhWzCSLWm99Dn+zz288nltwPIegBQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^3.2.0", - "@typescript-eslint/eslint-plugin": "^7.16.1", - "@typescript-eslint/parser": "^7.16.1", + "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", + "@sindresorhus/tsconfig": "^7.0.0", + "@stylistic/eslint-plugin": "^4.2.0", + "@typescript-eslint/parser": "^8.32.1", "arrify": "^3.0.0", "cosmiconfig": "^9.0.0", "define-lazy-prop": "^3.0.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-xo": "^0.45.0", - "eslint-config-xo-typescript": "^5.0.0", + "eslint": "^9.27.0", + "eslint-config-prettier": "^10.1.5", + "eslint-config-xo-react": "^0.28.0", + "eslint-config-xo-typescript": "^7.0.0", "eslint-formatter-pretty": "^6.0.1", - "eslint-import-resolver-webpack": "^0.13.9", - "eslint-plugin-ava": "^14.0.0", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-n": "^17.14.0", - "eslint-plugin-no-use-extend-native": "^0.5.0", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-promise": "^6.4.0", - "eslint-plugin-unicorn": "^56.0.1", - "esm-utils": "^4.3.0", - "find-cache-dir": "^5.0.0", - "find-up-simple": "^1.0.0", + "eslint-plugin-ava": "^15.0.1", + "eslint-plugin-import-x": "^4.12.2", + "eslint-plugin-n": "^17.18.0", + "eslint-plugin-no-use-extend-native": "^0.7.2", + "eslint-plugin-prettier": "^5.4.0", + "eslint-plugin-promise": "^7.2.1", + "eslint-plugin-unicorn": "^59.0.1", + "find-cache-directory": "^6.0.0", "get-stdin": "^9.0.0", - "get-tsconfig": "^4.8.1", - "globby": "^14.0.2", - "imurmurhash": "^0.1.4", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash-es": "^4.17.21", + "get-tsconfig": "^4.10.1", + "globals": "^16.1.0", + "globby": "^14.1.0", "meow": "^13.2.0", "micromatch": "^4.0.8", - "open-editor": "^5.0.0", - "prettier": "^3.4.2", - "semver": "^7.6.3", - "slash": "^5.1.0", - "to-absolute-glob": "^3.0.0", - "typescript": "^5.7.2" + "open-editor": "^5.1.0", + "path-exists": "^5.0.0", + "prettier": "^3.5.3", + "type-fest": "^4.41.0", + "typescript-eslint": "^8.32.1" }, "bin": { - "xo": "cli.js" + "xo": "dist/cli.js" }, "engines": { - "node": ">=18.18" + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xo/node_modules/@sindresorhus/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-i5K04hLAP44Af16zmDjG07E1NHuDgCM07SJAT4gY0LZSRrWYzwt4qkLem6TIbIVh0k51RkN2bF+lP+lM5eC9fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13290,14 +12703,14 @@ } }, "node_modules/xo/node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", + "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.0" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -13363,6 +12776,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xo/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/xo/node_modules/supports-hyperlinks": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", @@ -13380,6 +12803,19 @@ "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, + "node_modules/xo/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13397,16 +12833,16 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yaml-types": { diff --git a/package.json b/package.json index 6d8071ee8..b61e106ee 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "typescript" ], "dependencies": { - "@vercel/nft": "^0.29.2", + "@vercel/nft": "^0.29.4", "acorn": "^8.14.1", "acorn-walk": "^8.3.4", "ansi-styles": "^6.2.1", @@ -100,7 +100,7 @@ "common-path-prefix": "^3.0.0", "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.4.0", + "debug": "^4.4.1", "emittery": "^1.1.0", "figures": "^6.1.0", "globby": "^14.1.0", @@ -128,17 +128,17 @@ "@ava/test": "github:avajs/test", "@ava/typescript": "^5.0.0", "@sindresorhus/tsconfig": "^5.1.1", - "@types/node": "^22.14.1", + "@types/node": "^22.15.30", "ansi-escapes": "^7.0.0", "c8": "^10.1.3", - "execa": "^9.5.2", + "execa": "^9.6.0", "expect": "^29.7.0", "sinon": "^20.0.0", "tap": "^21.1.0", "tempy": "^3.1.0", "tsd": "^0.32.0", "typescript": "~5.8.3", - "xo": "^0.60.0", + "xo": "^1.0.5", "zen-observable": "^0.10.0" }, "peerDependencies": { @@ -150,7 +150,7 @@ } }, "volta": { - "node": "22.14.0", - "npm": "11.3.0" + "node": "22.16.0", + "npm": "11.4.1" } } diff --git a/test-tap/assert.js b/test-tap/assert.js index ceb514b51..9f47de960 100644 --- a/test-tap/assert.js +++ b/test-tap/assert.js @@ -29,12 +29,12 @@ const AssertionsBase = class extends assert.Assertions { return true; }, pending(promise) { - promise.then(() => { - lastPassed = true; - }, error => { + promise.catch(error => { if (error.name !== 'AssertionFailed') { lastFailure = error; } + }).then(() => { + lastPassed = true; }); }, fail(error) { @@ -287,8 +287,7 @@ test('.is()', t => { fails(t, () => // eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins - assertions.is(new String('foo'), 'foo'), - ); + assertions.is(new String('foo'), 'foo')); fails(t, () => assertions.is(null, undefined)); @@ -298,8 +297,7 @@ test('.is()', t => { fails(t, () => // eslint-disable-next-line no-new-wrappers, unicorn/new-for-builtins - assertions.is(new String('foo'), new String('foo')), - ); + assertions.is(new String('foo'), new String('foo'))); fails(t, () => assertions.is(0, null)); @@ -514,16 +512,16 @@ test('.deepEqual()', t => { fails(t, () => assertions.deepEqual(() => {}, () => {})); passes(t, () => assertions.deepEqual(undefined, undefined) - && assertions.deepEqual({x: undefined}, {x: undefined}) - && assertions.deepEqual({x: [undefined]}, {x: [undefined]})); + && assertions.deepEqual({x: undefined}, {x: undefined}) + && assertions.deepEqual({x: [undefined]}, {x: [undefined]})); passes(t, () => assertions.deepEqual(null, null) - && assertions.deepEqual({x: null}, {x: null}) - && assertions.deepEqual({x: [null]}, {x: [null]})); + && assertions.deepEqual({x: null}, {x: null}) + && assertions.deepEqual({x: [null]}, {x: [null]})); passes(t, () => assertions.deepEqual(0, 0) - && assertions.deepEqual(1, 1) - && assertions.deepEqual(3.14, 3.14)); + && assertions.deepEqual(1, 1) + && assertions.deepEqual(3.14, 3.14)); fails(t, () => assertions.deepEqual(0, 1)); @@ -1578,7 +1576,7 @@ test('.truthy()', t => { }); passes(t, () => assertions.truthy(1) - && assertions.truthy(true)); + && assertions.truthy(true)); passes(t, () => assertions.truthy(1) && assertions.truthy(true)); @@ -1608,10 +1606,10 @@ test('.falsy()', t => { }); passes(t, () => assertions.falsy(0) - && assertions.falsy(false)); + && assertions.falsy(false)); passes(t, () => assertions.falsy(0) - && assertions.falsy(false)); + && assertions.falsy(false)); failsWith(t, () => assertions.falsy(false, null), { assertion: 't.falsy()', @@ -1829,7 +1827,7 @@ test('.assert()', t => { }); passes(t, () => assertions.assert(1) - && assertions.assert(true)); + && assertions.assert(true)); passes(t, () => assertions.assert(1) && assertions.assert(true)); diff --git a/test-tap/fixture/fail-fast/crash/crashes.cjs b/test-tap/fixture/fail-fast/crash/crashes.cjs index 158b1bc30..07098e4ff 100644 --- a/test-tap/fixture/fail-fast/crash/crashes.cjs +++ b/test-tap/fixture/fail-fast/crash/crashes.cjs @@ -1,3 +1,3 @@ -require('../../../../entrypoints/main.cjs'); // eslint-disable-line import/no-unassigned-import +require('../../../../entrypoints/main.cjs'); // eslint-disable-line import-x/no-unassigned-import process.exit(1); // eslint-disable-line unicorn/no-process-exit diff --git a/test-tap/fixture/no-tests.cjs b/test-tap/fixture/no-tests.cjs index a8072751b..498d1d1c2 100644 --- a/test-tap/fixture/no-tests.cjs +++ b/test-tap/fixture/no-tests.cjs @@ -1 +1 @@ -require('../../entrypoints/main.cjs'); // eslint-disable-line import/no-unassigned-import +require('../../entrypoints/main.cjs'); // eslint-disable-line import-x/no-unassigned-import diff --git a/test-tap/fixture/report/edgecases/ava-import-no-test-declaration.cjs b/test-tap/fixture/report/edgecases/ava-import-no-test-declaration.cjs index a407bc469..2b5c1939e 100644 --- a/test-tap/fixture/report/edgecases/ava-import-no-test-declaration.cjs +++ b/test-tap/fixture/report/edgecases/ava-import-no-test-declaration.cjs @@ -1 +1 @@ -require('../../../../entrypoints/main.cjs'); // eslint-disable-line import/no-unassigned-import +require('../../../../entrypoints/main.cjs'); // eslint-disable-line import-x/no-unassigned-import diff --git a/test-tap/fixture/with-dependencies/no-tests.cjs b/test-tap/fixture/with-dependencies/no-tests.cjs index 0d2c77b2c..d01c1b480 100644 --- a/test-tap/fixture/with-dependencies/no-tests.cjs +++ b/test-tap/fixture/with-dependencies/no-tests.cjs @@ -1,3 +1,3 @@ -require('./dep-1.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-2.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-3.custom'); // eslint-disable-line import/no-unassigned-import +require('./dep-1.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-2.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-3.custom'); // eslint-disable-line import-x/no-unassigned-import diff --git a/test-tap/fixture/with-dependencies/test-failure.cjs b/test-tap/fixture/with-dependencies/test-failure.cjs index 9fe6b4a54..921f55996 100644 --- a/test-tap/fixture/with-dependencies/test-failure.cjs +++ b/test-tap/fixture/with-dependencies/test-failure.cjs @@ -1,8 +1,8 @@ const test = require('../../../entrypoints/main.cjs'); -require('./dep-1.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-2.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-3.custom'); // eslint-disable-line import/no-unassigned-import +require('./dep-1.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-2.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-3.custom'); // eslint-disable-line import-x/no-unassigned-import test('hey ho', t => { t.fail(); diff --git a/test-tap/fixture/with-dependencies/test-uncaught-exception.cjs b/test-tap/fixture/with-dependencies/test-uncaught-exception.cjs index 878c04d07..7b38960cf 100644 --- a/test-tap/fixture/with-dependencies/test-uncaught-exception.cjs +++ b/test-tap/fixture/with-dependencies/test-uncaught-exception.cjs @@ -1,8 +1,8 @@ const test = require('../../../entrypoints/main.cjs'); -require('./dep-1.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-2.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-3.custom'); // eslint-disable-line import/no-unassigned-import +require('./dep-1.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-2.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-3.custom'); // eslint-disable-line import-x/no-unassigned-import test('hey ho', t => { t.pass(); diff --git a/test-tap/fixture/with-dependencies/test.cjs b/test-tap/fixture/with-dependencies/test.cjs index e1bf77ddb..deec33241 100644 --- a/test-tap/fixture/with-dependencies/test.cjs +++ b/test-tap/fixture/with-dependencies/test.cjs @@ -1,8 +1,8 @@ const test = require('../../../entrypoints/main.cjs'); -require('./dep-1.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-2.js'); // eslint-disable-line import/no-unassigned-import -require('./dep-3.custom'); // eslint-disable-line import/no-unassigned-import +require('./dep-1.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-2.js'); // eslint-disable-line import-x/no-unassigned-import +require('./dep-3.custom'); // eslint-disable-line import-x/no-unassigned-import test('hey ho', t => { t.pass(); diff --git a/test-tap/promise.js b/test-tap/promise.js index b12433262..466cab405 100644 --- a/test-tap/promise.js +++ b/test-tap/promise.js @@ -1,6 +1,6 @@ import {test} from 'tap'; -import './helper/chalk0.js'; // eslint-disable-line import/no-unassigned-import +import './helper/chalk0.js'; // eslint-disable-line import-x/no-unassigned-import import Test from '../lib/test.js'; import {set as setOptions} from '../lib/worker/options.cjs'; @@ -111,9 +111,9 @@ test('reject', t => ava(a => fail().then(() => { t.match(result.error.formattedDetails[0].formatted, /.*Error.*\n.*message: 'unicorn'/); })); -test('reject with non-Error', t => ava(() => - Promise.reject('failure'), // eslint-disable-line prefer-promise-reject-errors -).run().then(result => { +test('reject with non-Error', t => ava(async () => { + throw 'failure'; // eslint-disable-line no-throw-literal +}).run().then(result => { t.equal(result.passed, false); t.equal(result.error.name, 'AssertionError'); t.equal(result.error.message, 'Rejected promise returned by test'); diff --git a/test-tap/reporters/default.js b/test-tap/reporters/default.js index e14d843a8..818f2f7cc 100644 --- a/test-tap/reporters/default.js +++ b/test-tap/reporters/default.js @@ -18,7 +18,15 @@ test(async t => { const tty = new TTYStream({ columns: 200, - sanitizers: [...sanitizers, report.sanitizers.cwd, report.sanitizers.experimentalWarning, report.sanitizers.posix, report.sanitizers.tapLoaders, report.sanitizers.timers, report.sanitizers.version], + sanitizers: [ + ...sanitizers, + report.sanitizers.cwd, + report.sanitizers.experimentalWarning, + report.sanitizers.posix, + report.sanitizers.tapLoaders, + report.sanitizers.timers, + report.sanitizers.version, + ], }); const reporter = new Reporter({ extensions: ['cjs'], diff --git a/test-tap/reporters/tap.regular.v18.log b/test-tap/reporters/tap.regular.v18.log index 7686951e4..471c2c196 100644 --- a/test-tap/reporters/tap.regular.v18.log +++ b/test-tap/reporters/tap.regular.v18.log @@ -113,7 +113,7 @@ not ok 12 - test › no longer failing message: >- Test was expected to fail, but succeeded, you should stop marking the test as failing - at: 'Test.finish (/lib/test.js:633:28)' + at: 'Test.finish (/lib/test.js:635:7)' ... ---tty-stream-chunk-separator not ok 13 - test › logs diff --git a/test-tap/reporters/tap.regular.v20.log b/test-tap/reporters/tap.regular.v20.log index 7686951e4..471c2c196 100644 --- a/test-tap/reporters/tap.regular.v20.log +++ b/test-tap/reporters/tap.regular.v20.log @@ -113,7 +113,7 @@ not ok 12 - test › no longer failing message: >- Test was expected to fail, but succeeded, you should stop marking the test as failing - at: 'Test.finish (/lib/test.js:633:28)' + at: 'Test.finish (/lib/test.js:635:7)' ... ---tty-stream-chunk-separator not ok 13 - test › logs diff --git a/test-tap/reporters/tap.regular.v22.log b/test-tap/reporters/tap.regular.v22.log index 7686951e4..471c2c196 100644 --- a/test-tap/reporters/tap.regular.v22.log +++ b/test-tap/reporters/tap.regular.v22.log @@ -113,7 +113,7 @@ not ok 12 - test › no longer failing message: >- Test was expected to fail, but succeeded, you should stop marking the test as failing - at: 'Test.finish (/lib/test.js:633:28)' + at: 'Test.finish (/lib/test.js:635:7)' ... ---tty-stream-chunk-separator not ok 13 - test › logs diff --git a/test-tap/reporters/tap.regular.v24.log b/test-tap/reporters/tap.regular.v24.log index 7686951e4..471c2c196 100644 --- a/test-tap/reporters/tap.regular.v24.log +++ b/test-tap/reporters/tap.regular.v24.log @@ -113,7 +113,7 @@ not ok 12 - test › no longer failing message: >- Test was expected to fail, but succeeded, you should stop marking the test as failing - at: 'Test.finish (/lib/test.js:633:28)' + at: 'Test.finish (/lib/test.js:635:7)' ... ---tty-stream-chunk-separator not ok 13 - test › logs diff --git a/test-tap/test.js b/test-tap/test.js index 17f4bc19e..860290282 100644 --- a/test-tap/test.js +++ b/test-tap/test.js @@ -6,7 +6,7 @@ import ciInfo from 'ci-info'; import sinon from 'sinon'; import {test} from 'tap'; -import './helper/chalk0.js'; // eslint-disable-line import/no-unassigned-import +import './helper/chalk0.js'; // eslint-disable-line import-x/no-unassigned-import import * as snapshotManager from '../lib/snapshot-manager.js'; import Test from '../lib/test.js'; import {set as setOptions} from '../lib/worker/options.cjs'; @@ -466,8 +466,7 @@ test('assertions are bound', t => (a.notRegex)('bar', /foo/); }).run().then(result => { t.ok(result.passed); - }), -); + })); // Snapshots reused from test/assert.js test('snapshot assertion can be skipped', t => { diff --git a/test-tap/try-snapshot.js b/test-tap/try-snapshot.js index ff8830d22..e5fca1d77 100644 --- a/test-tap/try-snapshot.js +++ b/test-tap/try-snapshot.js @@ -3,7 +3,7 @@ import {fileURLToPath} from 'node:url'; import {test} from 'tap'; -import './helper/chalk0.js'; // eslint-disable-line import/no-unassigned-import +import './helper/chalk0.js'; // eslint-disable-line import-x/no-unassigned-import import ContextRef from '../lib/context-ref.js'; import * as snapshotManager from '../lib/snapshot-manager.js'; import Test from '../lib/test.js'; diff --git a/test/assertions/snapshots/test.js.snap b/test/assertions/snapshots/test.js.snap index a1a251bd92051c4b1185b5cd06005b73e12a62e1..e5b97821b2bde69929153aa2a6d4cc41f0a26b00 100644 GIT binary patch literal 635 zcmV->0)+iRRzV^9-C2a^j_~6SW7f_^`6Q-_HCqvoq&|UYzt# z&BukJh+=gT$~2wwR8kn3p-fGfka>R|1d`-i_m_)0@`r7+RtjJY;0u5s02~H9X21&u z{APe~fMW;v>;T^!;HLxBU7+IvfeUCq^Yu{RTgBoSTFlUmH%{L*LDf@3Y* zBYz-cqrBx>#oUsZ9GH4SRGAx=X_6lq@1V`s^wtW*S%CaFI#rjnwnZL;=*~nhI}=?o z$|j;M)P%GYT@h)mVl|dS67!9JSI3W58?%k)D%sfNaK4tJty1j6gz~^TRi4kkl;X_H$SaGFwqRqv`_^?<`j5n`K1H)+p=-`@WXVqqJ6)wx3 zR4jWcj+fd3PRfue9FG3oVUbCm^iEWtIE9k9nvfa>hErH5;Hge1p=qiLEdv?Ff3+0Z V5~Z5_PuZ0z`vXaRPPd2#001;@H(US! literal 627 zcmV-(0*w7ZRzVA zH_5gbJ0g81eIxxOby|!KNgnAF=_~0wsn0ihynUdQOgT4i-ENohEyi~k-zLIhyS&AC zyT^CXm0E*BXYUDFrB_`boEzpTx*kAsIGxGRS=y60w)gFkRQB0GTxwQlu*?ki(4ELo zgOlH@SgT|v15(GftIQ3<^w15ovo{bmzwH9CRt()RIDt!E2X>Z&y}z_avs3Du&KA@M z3sjO?fl?5{Tt-MqHTAAPKU@zi8^5bmqbcB7twbB8+@lz?#D-O-W0+?-^Zfd?IIXY6 zrkUhnKFLcsf`zj-DwZ|+rlEIp`jxNZciO2^TZVd2q7HN#jce#FgLcu)Mry!zX)d)k zmu1sr?zTY%x@KcJSN@21N`DVF=h8LEeS{f+(rB$VI^wW#&Rh$ls zN9!m;!E_cV&?1r;%t3%svCIxwsOJ%{X?&CaWvyRjm5Q&O0#x#M#%R~m@UoS { - assert(false); + assert.ok(false); }); diff --git a/test/completion-handlers/fixtures/exit0.js b/test/completion-handlers/fixtures/exit0.js index c4884b9ff..b60cca165 100644 --- a/test/completion-handlers/fixtures/exit0.js +++ b/test/completion-handlers/fixtures/exit0.js @@ -1,7 +1,7 @@ -import test, { registerCompletionHandler } from 'ava' +import test, {registerCompletionHandler} from 'ava'; registerCompletionHandler(() => { - process.exit(0) -}) + process.exit(0); // eslint-disable-line unicorn/no-process-exit +}); -test('pass', t => t.pass()) +test('pass', t => t.pass()); diff --git a/test/completion-handlers/fixtures/one.js b/test/completion-handlers/fixtures/one.js index 229e8035c..1cbb51392 100644 --- a/test/completion-handlers/fixtures/one.js +++ b/test/completion-handlers/fixtures/one.js @@ -1,9 +1,9 @@ -import test, { registerCompletionHandler } from 'ava' +import test, {registerCompletionHandler} from 'ava'; registerCompletionHandler(() => { - console.error('one') -}) + console.error('one'); +}); test('pass', t => { - t.pass() -}) + t.pass(); +}); diff --git a/test/completion-handlers/fixtures/two.js b/test/completion-handlers/fixtures/two.js index a688a1d2e..35a0a9124 100644 --- a/test/completion-handlers/fixtures/two.js +++ b/test/completion-handlers/fixtures/two.js @@ -1,10 +1,10 @@ -import test, { registerCompletionHandler } from 'ava' +import test, {registerCompletionHandler} from 'ava'; registerCompletionHandler(() => { - console.error('one') -}) + console.error('one'); +}); registerCompletionHandler(() => { - console.error('two') -}) + console.error('two'); +}); -test('pass', t => t.pass()) +test('pass', t => t.pass()); diff --git a/test/concurrency/snapshots/test.js.snap b/test/concurrency/snapshots/test.js.snap index 3f07b804fcf8e913ac645783cf62e5cca6c7362b..66994c506e635d0ae7aca5a416106f3da3b831c5 100644 GIT binary patch literal 264 zcmV+j0r&nvRzVVO-gf3S|TG=f5_q&(Z#DB6%MISI_ia0cL4E#GA1TEStM{-#h zqRx@)17{jI*Xf6GJv^`(MZVxa{~I5q5S^RD6ZyI(m{-xbC7-9Oe5PE;x1@7TJ(q7= O@c9PX*0d%!0{{REZ*}(o literal 266 zcmV+l0rmbtRzV)43W0eu|O|U zpR_gt59w4Oi@B2c|2^=htz&W@`aO}cMY_G!$WdVoBv4f@iR*JFai72nT}}fx)WFCV zQg1L|?1@#d(~wNRrlvu|%Vk&Wi)G4};!vK>f&OHr43&d6qK9j*1~olq1A-)}gghD# z1T03L@+(EGDdzUhxEx+d6+Nx^@BhXJlsUGWB`lyVYXr5-; Q+qU5I3) { diff --git a/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js b/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js index e60d0fef4..5950a2850 100644 --- a/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js +++ b/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line ava/no-ignored-test-files import test from 'ava'; test('test', t => { diff --git a/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js b/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js index e60d0fef4..6eba98f77 100644 --- a/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js +++ b/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js @@ -1,4 +1,4 @@ -// eslint-disable-next-line ava/no-ignored-test-files + import test from 'ava'; test('test', t => { diff --git a/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js b/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js index e60d0fef4..6eba98f77 100644 --- a/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js +++ b/test/config/fixtures/pkg-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-4.js @@ -1,4 +1,4 @@ -// eslint-disable-next-line ava/no-ignored-test-files + import test from 'ava'; test('test', t => { diff --git a/test/config/next-gen.js b/test/config/next-gen.js index 2bcf4b872..cfa117367 100644 --- a/test/config/next-gen.js +++ b/test/config/next-gen.js @@ -75,7 +75,8 @@ test.serial('loads .js config as ESM', ok('js-as-esm'), (t, conf) => { t.true(conf.failFast); }); -test.serial('finds unsupported configs', +test.serial( + 'finds unsupported configs', ok({ fixture: 'unsupported-configs', }), diff --git a/test/config/snapshots/integration.js.snap b/test/config/snapshots/integration.js.snap index b828257248e133546e6cdbbc24732806fdf28e0c..0b5a36191e52e9ba2a417b37682f7ed51d6ab51f 100644 GIT binary patch literal 564 zcmV-40?YkDRzV2dlFKY7|G7fXq890zg7##=S?T?zi} zX_Ba*UgOIM)*(M|1EU83unz!F0AL$yTUdSSoH|CFuIlwV;B~+X;3nepN#iEsQGUfD z;{*Uc0>IfcqxPcR<2Ybtwrn&SMd{Z`7wqAM(rB^tM)ATrY-8mnMu62VT+=4y>CLUg zxTe}E&ds*++-uaiiOF8+0W1cfB^u!FA-S=u%<=Ia79|=a{(WyW@XaLGs8;rzTi zB;(0SAT60qe#Z9suVMReMQrQ&=a+H2Rxq+^z~}VtEu%Lwp(|Nf1o$0%vIHaw2mk;r CM;bx^ literal 565 zcmV-50?PeCRzVRc7BP}wbS5$Kzm1K{ zTPPIiDIbdn00000000B+mCbI`KoG}0ag*{PlvEUn*^wta`nA&rL=d5Uq=C4)9Im{=a5?-CAG)K?v9^&A_FwUs!wN7@-RbY1rD z-ANoPuin6`Fjx=r3$8)7^z1dcdnvdn+7c#1adb4~_&R?eT_8(QIRJAD`-?QX6JtT+uOUx^~38RQjqC1&Y zUbC5!-CqcIzov;gLBobnSwbgGpc5@^ARnVtFM<4aRgk}wL;fZqYXbPm6(QekwYFBq zd1>)gqQ1WjwKCWm^xSzyQR6?%e*orA$}AH(VLOk`A!pv{n2-}3TF%A!%_x5TX^v~< zq4@1GrcjXFn>9m6{6OqO3CJ=5YYB6iT%p8VPOZJn5k{G{WIX2oGHp6Pbje5C!Th{C zK<#AMNnOrN{IhIle@(WJSCnl%KYp2R*9(n|8qm3V5023J3rI DKn4tI diff --git a/test/config/snapshots/loader.js.md b/test/config/snapshots/loader.js.md index 7a3c373d3..92afafe60 100644 --- a/test/config/snapshots/loader.js.md +++ b/test/config/snapshots/loader.js.md @@ -63,9 +63,3 @@ Generated by [AVA](https://avajs.dev). > error message 'Conflicting configuration in ava.config.js and ava.config.cjs' - -## throws an error if a config file contains a non-function `threadArgumentsFilter` property - -> error message - - 'threadArgumentsFilter from ava.config.js must be a function' diff --git a/test/config/snapshots/loader.js.snap b/test/config/snapshots/loader.js.snap index f42c1bf106bb3d426148c89bf67ebcde225b7a99..a0fa8e36baddb38f976c467aaa2f15a276f694bf 100644 GIT binary patch delta 625 zcmV-%0*?KZ1^xs*K~_N^Q*L2!b7*gLAa*kf0|0t8^XhqZ0rCOYbtULDZ`#vtiI)7t zvv5cPr#vouhY=r(2mk;800003m61Ife{v&ZdmOL3p0Q@vX?rVI-k?YNXnhi}?}Jm2+(2Yj$;2iF!(bZalFw!kfV7J>bbm zYMTO!2P>F%)gd#Mj=^|vdHX-dIYCso*AOLz15t>|!u^vOV*eEAFRp|z@uIho3b~d- z$=Aw&P+2q#5*L&N+J4$|F`9H`e@gPXH1@kb#J5kHUe@kE8bcP2hAgbm7phy)zx2@G z2l#@8nx-$imDQa1Eo~1oHyUd*ZnMJzDP>sOrSc~8S&w-#6ka1?5I8y|e4 zvP<5>nQ6ciVULC#OmU7=s8lLaf4hnPqlbPv=0s}tq<_=#cz2I;e7w6~e{J75rN@AC zF)3UtR#jux=hQ#gLpEl++dyF9H_O4oG&9zdev_0w>Z~q_y_<+$ie8bP=SrBmA=j5Z z*C#tvgG{9i4KHp+w@czK_I29@d&?@1|g)l?~!Vsx#e5b-t0TQd0%@rKJ5ACt*s=53nBjj Le~zhNqXz&06!9@- delta 647 zcmV;20(kxY1e66mK~_N^Q*L2!b7*gLAa*kf0{~u5)j0yM62|$XHSZbN2qAy_QV82( zG~%S^7r8?@SY98C2mk;800003osm5nf5M53?Qy*Bdd8Yvr|qqrd4eA4qxDI^j?>1? z;-t;d(a!(KE#&~nqJoKKN>?8_J%Cnp)XW7qJQb3 zzYp*Q3pGt&b}Oqn@f+G6W^OcA?zqhk3#61`ZI{aH%tt-u@whG61g6P(&%s`(;ca~I zfyy>{4`-$UPlP=hb}+>`PN7n%Nd4tH`p+Kv;g}Pt*^~ZD$L-ZM&hhr@fBNqD+LZ1C z&c&o~u2@x#S)WsXu!n5Swzq-6!f%!r3)9S4Px?(#`lz$IB=&A1dMbKGdYmg^>V{mO z_FNxqQ4KPcGIV)yb9LJ!?&Psk}*%iFc5`PA;ioM(oG-%$pizes3R;D5(CRMJ|_;29r>KL zD+3aLfeF!H$WK6S0wiiEs2-p6{NDF;?{cbb`pC~q^2%#k9Or0+CI)iOI)-^p2DC+? zOa@6=Fr?NB-YvkEh_8$dY`n{=dRz!*tqq_jlbzOC_`EE zFR7b2;*CrGa3RBZak}*%iFc5`PA;ip1rJFzkk_iS_QAb!RBnFmid`Vm!JMuYg zR|X{h0u!RYke@)@1W44hpn81L^ZVY@eIyfQ;wOGtl9Nu+;v_>Y6fuys#xl$^(x40q zsZ)sZDMM^@B2&p43(kz==cN$n@ZoGPI0*b3><5Q~;mG@coU7lw{Te>s-(E@KgjBv# zAtz=`>6_p(L8+SHRv-vdQEB5K!x;gBpae_hfEI?XUK#R| zH>7Us5pG@bw-+*u#<%PIryc&IzCHgl=S6$Y-Pgnp&G@f1`^VgQ%PW^zGiN|uHwT&c zGUpJ*Q?H8lrBs3?C@eAQo+gi-CU-ZLN6Fav9<{%;=%mpgHQ)@RT8x^Umg1w2+d_rV OSK(xv=l0{{RUJF6l9 diff --git a/test/configurable-module-format/fixtures/test.cts b/test/configurable-module-format/fixtures/test.cts index 12216fccf..7823fca57 100644 --- a/test/configurable-module-format/fixtures/test.cts +++ b/test/configurable-module-format/fixtures/test.cts @@ -1,8 +1,8 @@ -const test = require('ava'); // eslint-disable-line ava/no-ignored-test-files +const test = require('ava'); // eslint-disable-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-require-imports, unicorn/prefer-module // @ts-expect-error TS2345 -test('always passing test', t => { +test('always passing test', t => { // eslint-disable-line @typescript-eslint/no-unsafe-call const numberWithTypes = 0; - t.is(numberWithTypes, 0); + t.is(numberWithTypes, 0); // eslint-disable-line @typescript-eslint/no-unsafe-call }); diff --git a/test/configurable-module-format/snapshots/invalid-configurations.js.snap b/test/configurable-module-format/snapshots/invalid-configurations.js.snap index a76fd21f53d5ec401f7266bbc2197ee639c712c9..63194cb71b307744074a400b2756b6a006b63b75 100644 GIT binary patch literal 293 zcmV+=0owjSRzVLI&zoN?^4g58 z_3MR{Wgm+O00000000Bk&cRN@FboFZP6%=44g3JRZFinvXW+IhahsGRu3|^qZbjNl z^f(@^PlB?p8VDW$e6lU;_jj&$p7a}^K2V%^Jgl^ekpwiw+BG>LSlUC&fCs_Ijv@nF z%HF^Z!ILs*97ol$CE@q8F-p`+b5}i7r55+q|p+F8}A~BE80z^>i|YkNxlo2w?Wo$pQcXKqZX7 literal 294 zcmV+>0ondRRzV+7AT1|qu@5Omj}Od$!v zQu~BUsJVyp`-fdip3@@ZRe~W`wqd!UjMPuRQrrKD9sfG^%qCHeUm;_53L<)KvCjv^ s$dvEM4MY7;>cuze`Qk=7g6Xw?j4q^~vBe&~4B=T^00?0A(#Zk<08x{Qx&QzG diff --git a/test/environment-variables/snapshots/test.js.snap b/test/environment-variables/snapshots/test.js.snap index de6bc04f0c35ffe9e3fe7e784d071d2abb049606..8ef92721442eb2dd6081fb42db7c27e4ed70949b 100644 GIT binary patch literal 409 zcmV;K0cQR|RzVa= zVS)?{&>xEk00000000B!l0i-zQ4EIdqya=#B~e(g^Z|ecQl&1ssk%Z!>ZU^3zR7rI zUU>6fWP2v<4#X)~Hh1A7oTN%%q5$Fqc=cP>Z|nc$e?=D3>{{X|PGZ?UqTdm4nMT%#GEQ7EZNe^ewe4;&aw_04*f7KIfdQ zlGK#d2G-BZiw{TYD~lvi^2Ix(oG`^?q$WO=)Vk2HzQt5*F%4jh)87@-8miW+>@A$mv+18fwPtzuT zyaZS*10RbB00000000B!lFd%TFbv1zjRFFpZh`~HJOJ!435f$2#0d$B3qrf5tJ`Kv zlPPvPxPf>Ij_h4{5uSu>&}w`=0g)`*act}VQ(m&fxbc*p7RZ_n-VF(vWQv)p3`?}N z_Rf}QS=P#Hl^7(Mc~?p

!9=bgs#&85NG{agnBq)#$Y=w#4$lHgt}H9|qfp%|1lu z-m80nCW_-&z>WYAunTb3GH90Li;5 zFIKQFt}g!_sguCTd6GK&gOu_ptz${-war7pR7gKDWi6&i^kH-paK1e}uZ_HICWhq}jr5}q300000000A(kFjb3K@>$-L{jGu-Up~)lOmOcb-IA7I1Y5OHXLI^@Yywz>)<(zZ9lH@=2bb+x6ni)z-MTu*&lqZ56gwPnGa*9eEy=((0 zY_qU;24#&d>pGbpFCjQ{%eP_mR9!O|RnLR@dqk7r4dHKfdr2wVwZ2l{b{p;6Zv4}l zzU`(Ew}O<~u_*1?*7OBc_kmyL`G3qV2C_qj`oh^BRao38ygaC2cfh{^+T02riC@cg9I_hyapVz>BJG17~QEO z%~@){jvtE%00000000A(k1=Y)KoCVGLU8RH%mJK$8yBfmq;_XWyW0J-*O}}tJEKJD zV&B50b+nu$GR6df!FY<#XJCf+j!n(czRSLcdS!HTjVb}-D ztpm9>vA0GcUV=%oi7LC^Iiu!n`A|%X)0B_Jw5(PEU4m7(|Euv!ib+rPg?@hyTNz?@ zZrza2U{iy0V>}CedEL+lM9dl&=IR==36AtTL2UL(?^SpmDJP@?+T0 { - assert(false); + assert.ok(false); }); test('test async', async () => { - assert(await Promise.resolve(false)); + assert.ok(await Promise.resolve(false)); }); diff --git a/test/external-assertions/snapshots/test.js.md b/test/external-assertions/snapshots/test.js.md index 0007d1b51..7d97da549 100644 --- a/test/external-assertions/snapshots/test.js.md +++ b/test/external-assertions/snapshots/test.js.md @@ -203,11 +203,11 @@ Generated by [AVA](https://avajs.dev). ␊ The expression evaluated to a falsy value:␊ ␊ - assert(false)␊ + assert.ok(false)␊ ␊ AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:␊ ␊ - assert(false)␊ + assert.ok(false)␊ ␊ at ---␊ at ---␊ @@ -285,7 +285,7 @@ Generated by [AVA](https://avajs.dev). ␊ 2 tests failed` -## node assertion (node.js v^21) +## node assertion (node.js v^22) > Snapshot 1 @@ -300,11 +300,11 @@ Generated by [AVA](https://avajs.dev). ␊ The expression evaluated to a falsy value:␊ ␊ - assert(false)␊ + assert.ok(false)␊ ␊ AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:␊ ␊ - assert(false)␊ + assert.ok(false)␊ ␊ at ---␊ at ---␊ @@ -332,7 +332,7 @@ Generated by [AVA](https://avajs.dev). ␊ 2 tests failed` -## expect error (node.js v^21) +## expect error (node.js v^22) > Snapshot 1 @@ -382,7 +382,7 @@ Generated by [AVA](https://avajs.dev). ␊ 2 tests failed` -## node assertion (node.js v^22) +## node assertion (node.js v^24) > Snapshot 1 @@ -397,11 +397,11 @@ Generated by [AVA](https://avajs.dev). ␊ The expression evaluated to a falsy value:␊ ␊ - assert(false)␊ + assert.ok(false)␊ ␊ AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:␊ ␊ - assert(false)␊ + assert.ok(false)␊ ␊ at ---␊ at ---␊ @@ -429,7 +429,7 @@ Generated by [AVA](https://avajs.dev). ␊ 2 tests failed` -## expect error (node.js v^22) +## expect error (node.js v^24) > Snapshot 1 diff --git a/test/external-assertions/snapshots/test.js.snap b/test/external-assertions/snapshots/test.js.snap index 6b05ebfe0001b3c1453e9f97ae89c1bab32ffabf..52bc4f0fbc02458d80b344055c37b49cd0245bab 100644 GIT binary patch literal 503 zcmV*?jqRpa&mKH@na|=I_y#_Sq}!B@c2gW{!1Pj*d})$Dzy2WO_N^Z}UHbTn%ws+d z_k++yAe3Unyf6Tjw~adrgX{8%=Fx!kXeVU!VeGnuk*oasR&FQ9pZs=ixA2x%06t!x zq1h&$-?D%qWl;V49PdRpsfN%|;3QT)-75;jMf|;3VFB-L6Q3efD!`&X&Xv`oD2$+4 zv+bK|y{yetXK=Xhbj^4pbh_*ehCLki&|!e_GOJK1 z=yNC(3)!GB*|Qp20#43t8eHAmV}Mx-@5$b*WIQa*$O;`a$d z7gz`+&SeC=4=p8*WO7C$?5c5Q+E0Gzb*v#WqnSCbnC>{KH>tO^>21lC&NQXlq}w)m tb4(^qicKtT#7N>VVmp>%lVaPb*b<48ViSuSF_K7w>=WgLn17BJ003Tg@D%_6 literal 499 zcmV=S-Y(xz7+zM744;OiPkRxg4`a_Gj9ld3w{kl<{^YlFyM?#B2JrFn z4DBxQgN_XhDTDgg=XfuANi~FyLN~GU>0Z-76!G_Bg$=y7O9F~es{xA#I9Jw)<0yu9 z!*QTyh&5bp**|8>P&){(1=~`kVbh_*ehCRINqssurGOJK1 zm~$u;3)!GB*|Q#_i~bNjqs*ccY{diC8|elwaHb>EoOqYW(f<8Zxw(-eiB*u5(v4$P z;25k*xms1``CsNaNHfn;B$R<9<42ApR>20#43t9J;T&nDj7V$skOvhbrF;m7Bp48e z9{8l-QKm{!DC3E_0T$nzGu4Zi~sR pDW%E9jT}j=qclq?O(|_dN=sx-DNQbJEK)HMu008f_>?QyJ diff --git a/test/external-assertions/test.js b/test/external-assertions/test.js index 46e3aeb07..4851d2c98 100644 --- a/test/external-assertions/test.js +++ b/test/external-assertions/test.js @@ -17,8 +17,8 @@ for (const [label, selector] of Object.entries({ '^18': /^18\./, '^20 < 20.11': /^20\.(\d\.|10\.)/, '^20.11': /^20\.(1[1-9]\.|[2-9]\d\.)/, - '^21': /^21\./, '^22': /^22\./, + '^24': /^24\./, })) { // Tests need to be declared for all versions, so that snapshots can be // updated by running `npx test-ava -u test/external-assertions/test.js` for diff --git a/test/globs/fixtures/treat-patterns-as-files/_helper.js b/test/globs/fixtures/treat-patterns-as-files/_helper.js index 5d1cc2b33..5543e0027 100644 --- a/test/globs/fixtures/treat-patterns-as-files/_helper.js +++ b/test/globs/fixtures/treat-patterns-as-files/_helper.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line ava/no-ignored-test-files import test from 'ava'; test('helper files must not be selected', t => { diff --git a/test/globs/fixtures/treat-patterns-as-files/foo.js b/test/globs/fixtures/treat-patterns-as-files/foo.js index 7d80739f8..7b9a97dcc 100644 --- a/test/globs/fixtures/treat-patterns-as-files/foo.js +++ b/test/globs/fixtures/treat-patterns-as-files/foo.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line ava/no-ignored-test-files import test from 'ava'; test('foo.js', t => { diff --git a/test/globs/fixtures/treat-patterns-as-files/foo.ts b/test/globs/fixtures/treat-patterns-as-files/foo.ts index 8d784c264..0533030a7 100644 --- a/test/globs/fixtures/treat-patterns-as-files/foo.ts +++ b/test/globs/fixtures/treat-patterns-as-files/foo.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line ava/no-ignored-test-files import test from 'ava'; test('typescript files must not be selected', t => { diff --git a/test/globs/snapshots/test.js.snap b/test/globs/snapshots/test.js.snap index f2145552613b864976a4b02d73002547eeae6331..6ed757df221c5cb904807b42acaef6d7a4757b15 100644 GIT binary patch literal 442 zcmV;r0Y&~nRzVA08X81{B1AWLJ9oEa zy?fdnAnrio0ca5wJOfXVN8w4LGd@FzP>=#!&1z?Uecx!Wip+)lM>@L}wd&;Oy2Kb_ zB3qD#deg~~I4Z1@L^ct7l1Z&o;uv{qljk~BLDT8AF|54zy$f%lIoN{{ZtYe=wtwkjm2>$E*5NEqGPKSO(Z2Q zrKSFSPkqdqSKGnJ*p@y-`Bt$npGRN)LBBtze ze29N_hyQDVzl5C)0Qdv|E7%`l?`y+@*j9tV0Pr0k0=`H5(hhY?0GI&4Wjom4$qpn} z>@3RRa0vJTumd=N73{2H7qBkWTa5WyZUkkr3STv(qY@XT=9K)`G*6jPUvTe%u}+ z#zrSH?OE=n(b(-dj}aB3W4YqD=Tb|ZVyaApIrpBdc5PBTB4raUmBUNvGwhOcJf)I) z_m%pR`#3u?g4#0G#?nE?b^0^<>>d62l>Q6BfAzCInRpzef?!BO9|?>GD5Ry>8~YZ2 zIKh9K;V(dCGsK;+R-xX4+J3!g?Q72pnmD#r0 zY%*A3P+`yrHI+4}hH ({execa: true, result}), error => { // eslint-disable-line promise/prefer-await-to-then + const done = execaProcess.catch(error => { // eslint-disable-line promise/prefer-await-to-then sortStats(stats); throw Object.assign(error, {stats, runCount}); - }); + }).then(result => ({execa: true, result})); // eslint-disable-line promise/prefer-await-to-then while (true) { const item = await Promise.race([done, statusEvents.next()]); // eslint-disable-line no-await-in-loop diff --git a/test/hook-restrictions/snapshots/test.js.snap b/test/hook-restrictions/snapshots/test.js.snap index eab03f4c51498ebe4d856925e1c6df1af38614ca..934ca3d48a3e333a1622e92fe60904e85174f858 100644 GIT binary patch literal 205 zcmV;;05bnURzVjf|nI23;g0nt~zz{xgxLva|-{ni@wYO3>khz~E@3M#{ft2C z{*94ECLfCk00000000Axjxi2`KoCWj7-Q`X#?WA6V&hpXnPo@WuXm!k$ahVEaaBq|ipQfMh9PSBDFUTMnsNHlfd|FVqZEF+&8mKVGME^ { t.timeout(1000, 'timeout despite console output'); - for (let i = 0; await delay(100, true); i++) { + for (let i = 0; await delay(100, true); i++) { // eslint-disable-line no-await-in-loop if (i % 2 === 0) { console.log('stdout'); } else { diff --git a/test/line-numbers/fixtures/README.md b/test/line-numbers/fixtures/README.md index c35659a08..88821123f 100644 --- a/test/line-numbers/fixtures/README.md +++ b/test/line-numbers/fixtures/README.md @@ -1,5 +1,5 @@ Compile using: ```console -npx tsc line-numbers.ts --outDir . --sourceMap --module es2020 --moduleResolution node +npx tsc line-numbers.ts --outDir . --sourceMap --module es2020 --moduleResolution node --removeComments ``` diff --git a/test/line-numbers/fixtures/line-numbers.js b/test/line-numbers/fixtures/line-numbers.js index 1fb8144df..ef2838dcc 100644 --- a/test/line-numbers/fixtures/line-numbers.js +++ b/test/line-numbers/fixtures/line-numbers.js @@ -8,13 +8,11 @@ test('rainbow', function (t) { test.serial('cat', function (t) { t.pass(); }); -test.todo('dog'); // eslint-disable-line ava/no-todo-test -/* eslint-disable max-statements-per-line, ava/no-inline-assertions */ +test.todo('dog'); test('sun', function (t) { return t.pass(); }); test('moon', function (t) { t.pass(); }); -/* eslint-enable max-statements-per-line, ava/no-inline-assertions */ (function () { test('nested call', function (t) { t.pass(); diff --git a/test/line-numbers/fixtures/line-numbers.js.map b/test/line-numbers/fixtures/line-numbers.js.map index fed77ae4d..c0f0001ae 100644 --- a/test/line-numbers/fixtures/line-numbers.js.map +++ b/test/line-numbers/fixtures/line-numbers.js.map @@ -1 +1 @@ -{"version":3,"file":"line-numbers.js","sourceRoot":"","sources":["line-numbers.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AAEvB,IAAI,CAAC,SAAS,EAAE,UAAA,CAAC;IAChB,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,SAAS,EAAE,UAAA,CAAC;IAChB,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAA,CAAC;IACnB,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC;AAEzD,sEAAsE;AACtE,IAAI,CAAC,KAAK,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AAAC,IAAI,CAAC,MAAM,EAAE,UAAA,CAAC;IACzC,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AACH,qEAAqE;AAErE,CAAC;IACA,IAAI,CAAC,aAAa,EAAE,UAAA,CAAC;QACpB,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"line-numbers.js","sourceRoot":"","sources":["line-numbers.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AAEvB,IAAI,CAAC,SAAS,EAAE,UAAA,CAAC;IAChB,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,SAAS,EAAE,UAAA,CAAC;IAChB,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAA,CAAC;IACnB,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAGjB,IAAI,CAAC,KAAK,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,EAAE,EAAR,CAAQ,CAAC,CAAC;AAAC,IAAI,CAAC,MAAM,EAAE,UAAA,CAAC;IACzC,CAAC,CAAC,IAAI,EAAE,CAAC;AACV,CAAC,CAAC,CAAC;AAEH,CAAC;IACA,IAAI,CAAC,aAAa,EAAE,UAAA,CAAC;QACpB,CAAC,CAAC,IAAI,EAAE,CAAC;IACV,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,EAAE,CAAC"} \ No newline at end of file diff --git a/test/line-numbers/fixtures/line-numbers.ts b/test/line-numbers/fixtures/line-numbers.ts index 068887813..8ae9d6ce5 100644 --- a/test/line-numbers/fixtures/line-numbers.ts +++ b/test/line-numbers/fixtures/line-numbers.ts @@ -1,4 +1,4 @@ -import test from 'ava'; // eslint-disable-line ava/no-ignored-test-files +import test from 'ava'; test('unicorn', t => { t.pass(); @@ -12,13 +12,12 @@ test.serial('cat', t => { t.pass(); }); -test.todo('dog'); // eslint-disable-line ava/no-todo-test +test.todo('dog'); -/* eslint-disable max-statements-per-line, ava/no-inline-assertions */ +// eslint-disable-next-line @stylistic/max-statements-per-line test('sun', t => t.pass()); test('moon', t => { t.pass(); }); -/* eslint-enable max-statements-per-line, ava/no-inline-assertions */ (() => { test('nested call', t => { diff --git a/test/line-numbers/snapshots/test.js.snap b/test/line-numbers/snapshots/test.js.snap index 763f73cf764658d5349ba7f667c74d9ba728acf0..966b8098369317bf4e1117fc83da486240c9b923 100644 GIT binary patch literal 600 zcmV-e0;l~!RzV%kF0K~$s%@!&x(A}I7)kF&ck z$=2DKFf%dD(cbzIJhm6VgMtUYf}ceY1kvp7BsC?Z2V=-yb_U+O{lDM;?VHn1tW5IO zot&}HyyBx>$BGj#JUcJqkx-dtp$B=)Hgj6`UC(%Te3qut%Y)kywlIEZ8#}bwruuVh z<%lS(n$0FF8M8Xt)kb)enj*0i(y}PO#A%i6%QP9)?gQ8Z=4J(50THM{^fVlbx&U$j zAHu=S{rHd*PqoRi)oOvRf@+{9cBpoZB2c|e8=XvX*fhsQKPZcK4-ef;Y`q{Ac3T6T zCC2KqP8W)*>g-GB0@_;@TE{k%Y6XNptta6qk$y4Vo1t+7g1KzpuQ`s?bSulRPkBtL z9y8$!Jy-Jjn~1PdcX_!z_lEY*QH~w~cnsj#BGR>j^sDk4_#cZ100000000Bkl|gG0K@`X5?KZ7gWE1paJ@`aW5Ebb`Jb2KH2nxN{4 zH8fdb3scoezNos+fh6*1@6>3CQA*ta;m_+yI83BlPWQHNT#sNO+Yf7wBelI+@|!ar z)2b&-)PPTT3u$_4wLSL^_RdibpYZsU?Zqv^`85?m@6XLQ$Dj>0~W(LOr+MBQ5nN0 l*;rO1!(I%@Cv`EQmGt1Z_3XjzbF>z>;vczdWqP>_0039uD;od+ diff --git a/test/line-numbers/test.js b/test/line-numbers/test.js index a1fc13b52..0d89a6335 100644 --- a/test/line-numbers/test.js +++ b/test/line-numbers/test.js @@ -50,7 +50,7 @@ test('no test selected by line number', async t => { }); test('parent call is not selected', async t => { - const result = await t.throwsAsync(fixture(['line-numbers.js:23'])); + const result = await t.throwsAsync(fixture(['line-numbers.js:22'])); t.snapshot(cleanOutput(result.stdout), 'fails with message'); }); diff --git a/test/node-arguments/fixtures/node-arguments-from-config/node-arguments-from-config.js b/test/node-arguments/fixtures/node-arguments-from-config/node-arguments-from-config.js index d5d9f81b4..68fb6e4c3 100644 --- a/test/node-arguments/fixtures/node-arguments-from-config/node-arguments-from-config.js +++ b/test/node-arguments/fixtures/node-arguments-from-config/node-arguments-from-config.js @@ -2,6 +2,6 @@ import test from 'ava'; test('works', t => { t.plan(2); - t.truthy(global.SETUP_CALLED, 'setup variable set'); + t.truthy(globalThis.SETUP_CALLED, 'setup variable set'); t.truthy(process.execArgv.some(argv => argv.startsWith('--require')), 'require passed'); }); diff --git a/test/node-arguments/fixtures/node-arguments-from-config/setup.cjs b/test/node-arguments/fixtures/node-arguments-from-config/setup.cjs index 5d620e626..d76a13a1a 100644 --- a/test/node-arguments/fixtures/node-arguments-from-config/setup.cjs +++ b/test/node-arguments/fixtures/node-arguments-from-config/setup.cjs @@ -1 +1 @@ -global.SETUP_CALLED = true; +globalThis.SETUP_CALLED = true; diff --git a/test/node-arguments/snapshots/test.js.md b/test/node-arguments/snapshots/test.js.md index 9fdb63532..5e7d3b2a4 100644 --- a/test/node-arguments/snapshots/test.js.md +++ b/test/node-arguments/snapshots/test.js.md @@ -53,25 +53,3 @@ Generated by [AVA](https://avajs.dev). title: 'works', }, ] - -## `threadArgumentsFilter` configuration filters arguments for worker thread - -> tests pass - - [ - { - file: 'thread.js', - title: 'exec arguments filtered', - }, - ] - -## `threadArgumentsFilter` configuration ignored for worker process - -> tests pass - - [ - { - file: 'process.js', - title: 'exec arguments unfiltered', - }, - ] diff --git a/test/node-arguments/snapshots/test.js.snap b/test/node-arguments/snapshots/test.js.snap index bbccccf41e85c97ad9c54ef26ccfe632b0cbd8b0..932e64bd3037540c652002b6f5cf9d2629a5a8e3 100644 GIT binary patch literal 556 zcmV+{0@M9LRzVVpcV_?j=J$L{C)TSuf4QM(qNNMW zB{OMsUK7fY6$^5aF?wA3FsHzVoy>XaBY(cpT1NTdcNgwLxx_uuc>w?~0pLU&4Mp!X z1bHb$v+MW!AdW!@5D$cS)dY1j09XLPbrX2>ZZabkMQ6Po3B4H-K&ahPS5Fr)JBoUDO+e_Op-Vaewk>>11TAecVy*+>?{&T zt{64I&c~^-k;0kRblRkP-{v4)I3JzU23u-RLQUo;f;T%KCB31tYWq~|2P=u zuX}R7UrXG@_i>AFT{Y={vON1AmL_vPklrMi2d{|#V%1*zTmG$K)kxt`8sySQ9Q>w3u@uY%w;co4L^*^o;(~S(M)~e{8*W1R;Vo=E0f46faDaP# z>>P$5&k&ncx7!8W2SmU-h|ij!b_M`50QlMj?!6gJNJVTdmc3pN@Gf8runPy+x`%DR zP9JZi#!|ECm#UM6>cNCp{_a#oHoM1kN@}S{{KS=O2p*00000000ABk1=k-Komr0Yzzn#*$Aqn*#n>ysng^HY16LlZ@jR0t=&Zl zB}d2+$Z>M2C`g+kQ@tn66m#ur>zYHjd`UFX%Ex`^wU<`CJAV+bMtj7o2L64z# zF59dR_xemGD$5dFfCQK1a~kD407n3yX*hkY_tHdW ze^^x&cn4-+i8ZqgbFf%((itmBW>G?X+=qXi;&v+8L!*bmMKzvkYeKJT>6{nkMYrc4 LY)wE12>}2AMVxVo literal 263 zcmV+i0r>twRzVJu00000000ABk1=k-Koms(*chUq$VN~l%^o14piYw$q)ofFzwyGxYwcf@ zP;!JEfgC5N$_8mE_|j9Q%D2%!qQ28``d06_ z3COOosw%<*AtRKrldX^wiUlT}v7BHQSi*WIH=W}0RHCOw4}%M8Jk-`muWIg`XXRP9 N$3JXMKnDo{005~7dX@kH diff --git a/test/shared-workers/lifecycle/fixtures/teardown.js b/test/shared-workers/lifecycle/fixtures/teardown.js index 0375d8bd9..226c36145 100644 --- a/test/shared-workers/lifecycle/fixtures/teardown.js +++ b/test/shared-workers/lifecycle/fixtures/teardown.js @@ -8,7 +8,7 @@ plugin.registerSharedWorker({ filename: new URL('_worker.js', import.meta.url), supportedProtocols: ['ava-4'], teardown() { - assert(calledLast); + assert.ok(calledLast); console.log('🤗TEARDOWN CALLED'); }, }); diff --git a/test/shared-workers/unsupported-protocol/snapshots/test.js.snap b/test/shared-workers/unsupported-protocol/snapshots/test.js.snap index 7a98f9d83ecd3b65e4d98fea7115a3a163288f9f..e029aa684c4e87b7991e8c3fda60b56a787a0a4d 100644 GIT binary patch literal 281 zcmV+!0p|WeRzVGn$kAtRFL!y-!J0mz~o3j)nk6gs0 zmIzL;Krm9nM#`EBYjRnGm_Bd4cjoS!qw2Worq{1ddh@%$iU%snk|0YAXG5IMM$_Bz z&Gi|)kRplgVQ}fGyXq*OlnZ%iaNXMRzFqVJpYLz4d;Rl&=pQ`%9WXx#nEV~UJN;Uk f?2H$Yuwe^7onyP=1ZTJ$UyZ&1z!;qGdjS9d*cXHV literal 283 zcmV+$0p$KcRzVicV_-~WgHLE-6u$-#h!zX$ME hzmzJW@iY)D+5E9{sOJqE4Q@ua!wtX~obP)9008(Zgz*3X diff --git a/test/shared-workers/worker-execution-crash/snapshots/test.js.snap b/test/shared-workers/worker-execution-crash/snapshots/test.js.snap index 1fe72ef3c1f64f0d823d861bfe7a7ab581be0cdc..7d45055a967dd550f1372f98395ce6eee375faa5 100644 GIT binary patch literal 244 zcmV}4H+rrlRJds=(oyMoeRNBOc`nWCj^3g)}>L7Vz<$6z3 zW!3uWql0(Yr8fmI2QXrL$Y5!Vx{!{-Fa&!b!9KZgBYz8E2jJ$0?bW8#iKX|&D2l)V u=z$?d^v3kTV8~Wh)Y?hMYO%9Y{yM?ul(X^AH;EIYB!2;RiNl=&0RRAMRzV80Ky1Z+mU-PdNRD*p}*Z9WvtiM+cK}X*@*2ehiZ+bV2ShXK^?INbv3Tzp>x%2lb5r z-U{GjTa_L4n*hEG;JR$7s-xbMz@`LjTa7yEi3H9h@VTwV9Tf_Q6>w9v)TET*XNM8MSuxD&P1^rE^NR@uWEiOYVI(SX!WRr9P^ZCuG_-LZA+ zyS8OU;jYfALC(YG3ENCR(^akWnim?M=BClbP+MmgnwuD&)DzYYxCcM<7yNjndvv-{ zJ1fd&UmbrVo$G=QUZ}2+)JpeD*(aF}i``B>P5~4@;lL%shOK zCvPxrgAbqsB=`hQz!~@ozJsScYVdGVN^!{fIMr%3#uLWp8Gpk0#a&UPYcp~i6OQQF zxN4$r z@Y7ZOih2v>H(2%^HK?esp=<%=s$oSvhw=mba@DA!vVgG&yb2sOuBh8k-hm@movWxL zDCgkHRp%>eBV=p|tcQ-8Osb3aC~I)MXXYgF)c9sgo;BxXzES5&y4F zPgVGzdOTId>AO2sxtB&tC!1T4Q07nBr9p}VI!x&x*E3r0fph!=3yV=7uLS@AS)TPY diff --git a/test/shared-workers/worker-startup-crashes/snapshots/test.js.snap b/test/shared-workers/worker-startup-crashes/snapshots/test.js.snap index 3b07a2ec9b6ca4dcd5fa96b4c74f846237e1b3c6..8d254dea370b97adc7fdb5015c46fe0bb5ccede8 100644 GIT binary patch literal 204 zcmV;-05ktVRzV7}_M^sThYZ+Thf-lmd z)d%Un79WcU00000000AJ%s~pmKnwuD77@?>Adm11ih^FnYwTvb!6hk4O6##tsV^1J z&I4x6&#K+amk$L;rTI`$QYDAZ&4H_*1qUx0zN{%> z;N!k&cFj+_ZT9W?#_lXVB+59}_zQsMK`kJwffqDNFsZ%BV5noy0vK?*T#sM4Qx>DI G0002_C05)3 literal 208 zcmV;>05AVRRzVt zB}R07+&9gx`K{eH`}TY*W`#S5lyIp27XX@i(bbEBWmJkVioQspuS2(9K!?-idi(;o KQx>DI0000U3||)j diff --git a/test/snapshot-order/snapshots/randomness.js.snap b/test/snapshot-order/snapshots/randomness.js.snap index d5ee319b3bb8282a9819c70c263f7f9d52c9cdf0..fc7a71080bfd9b044349cf39c963097c28993435 100644 GIT binary patch literal 453 zcmV;$0XqIcRzV`1OPfR~$9Koq zEAHKmX4jEj8pMOxPr;K>QAGYt2=OXg?wm8{)0ttrRr>ro3`P=dETwm1B#Ktn*${0` z>e(T?cH!o9sRt&d~1WXm2lQpN!-st5EQj&?579 z`t5L%{&kVP3JqMh&PeZ!4n~RLdnvgkW!2$8OqGPdg`^CJQ-g9DJUw;Ih@0ns6IWjU zi9JYRAIZtRtqV{oTDk%1GgVoZ^e`M$we;cqX*YrG+O`;q_!AalzIt$UlwA zZOB>8|B&CLa!#L1gq$8mFY`{&BVV>=;oI@hOUj5x3X z%vJubWgm+O00000000Axl1)znF%X8^UB!>YAnM73^g^PECWs2e8>lz0YCLwg!_u(Z znzk4?g7JqezrtVU$%Ex%QB)c?>29*~&b&`&CT#_=3_E%-0>e!Vy&3}pD&c}_!$U#^ zBU&m0jL2tDgp!!52#$%e5t$GJ+K`ZH;9Afp-Im6dVvHL4=ofvohQ<#*z<$+!-#vsr z?AgV+0?swNtrjSZ3wZO63sY|>Mf>^fJi=Zj5x5d6(*#9hEy-fmjJVkNNt{Ua zC-%UFeV)}TT`lbZ;llbG)jvG?)(jW^#S|Z8*ACnztj>g72)D2{6?P^S35_ThbMl)p zIoBao>_6l~mrwmS`NM*6BO7UXDUrIiK+C2vOkG7Q&gdD!TL@!>^LEd@J?z`KUGboA u;1)z=+LK=^cEP7?y^;dmjSUyk9A(^+fD5Yn1VkvAjeP=Z22}c~0{{TBaMNM{ diff --git a/test/snapshot-removal/snapshots/test.js.snap b/test/snapshot-removal/snapshots/test.js.snap index 3b4f2117bb354467e3d24dd017b33e4f473f904b..a6233e4c99c44ae526417aa958474d405a4dc1cb 100644 GIT binary patch literal 433 zcmV;i0Z#rwRzV@F&~Qv00000000B+lD$p>K@^401py;bAou{2SeO_ghQi81YYSQ|XLm2|;_NQj z8Bj_KAHYX|#-}hofKOzl*@Y$is3b;1Oqgb7k~4Rb?>ob`r9%5gKaALTM)BRD4rEum zq0u5@UwVP?+QPUz5Hez+ji;38X?DD6?tbJr(#R`nW>G-AXq&Pp08Rm%1E^BILb;15 zk^`djR4SD~JD?1xNOU=VSS0GlJ0&xQ0GF85SaY97BK-_x96}6f#jqNUpYQ4;O${Yh|ta3z&nX{?fYXClg#}#7! zhW0mH>T_JeK07g(2??QDv2C=FN{ydwO1#bzH@+_M*c3a$8VKbDEP|eIakMO~_58oe b{8KtRMD76t zKp09g(jSWm00000000B+lFv%RKoG_=iETyEr04?-co4)E>A{l+J$vZ29yjgQY~3Vf zcU$ezgAd>%v=^U3d;p)wlTOkm^p9E)r3eiSGfTdmgx~iK+rEsOH~L}3jWCkm9qNd6 zbr2hkiib=@DB5TOK0u~8Y9pk?p5`r)>+VOb7BlP$>W)>ik_R@yIiY?^bxySh#WEBw zlwt#bY;s-Kf-MVd3$_6+#}{epCmqrqLmHo`Ub7v=y5HeV19m=oo|j7BNb*i~0CQ4j zR=SgZ&?Sw%4~_+eGHkSk}p3@XkIN8Z#QA|h_W({h3Ba8BVXQL%hlm*S-$%*eSZ;4^WDTW7G?Mt`-ezJpZpS a|CCM^ { .replaceAll(os.EOL, '\n') .replaceAll(mainSymbols.info, fallbackSymbols.info) .replaceAll(mainSymbols.tick, fallbackSymbols.tick), - 'stdout'); + 'stdout', + ); }); }); diff --git a/test/snapshot-tests/snapshots/corrupt.js.snap b/test/snapshot-tests/snapshots/corrupt.js.snap index c880bc043ee9296c57ef9f510b5e6b69c7a4ac8e..36b988a8b0364d8df1f1fc9fd3bcdd74970bb370 100644 GIT binary patch literal 310 zcmV-60m=SBRzVJsv#V<@`j&1|OfdudUW z8~Z3_;bC~3PHbF*45BlZKHYcncR$Pawke&j?rHOeY}w(sePmgvXw(@3bWy zu=jzn*6cO6D7zhbhc?EAP}hdd3T{(1R{I6VkX}l?5?zZX!qxyFhi`LRV&4AGrLK1COB5KaF^r^A7{WRf#T6=X9w zYOKT9j2VgNYdXke!yCnJVsyOyKM~J=iTc@ctBrm@B6El6Oo`4lMv(Fc!lEyR8fD76 G0RRBs+K@Z| diff --git a/test/snapshot-tests/snapshots/formatting.js.snap b/test/snapshot-tests/snapshots/formatting.js.snap index 35cca5ff8ccaabb995764b93ccf2ca5c6a9dde87..5f7fbfee3e43c03342dada71369381b68c33bd0a 100644 GIT binary patch literal 561 zcmV-10?z$GRzV^nDRMp{8rNmun!HFH$ zuqBKy?jMT?00000000BUQaz8;KoHG=5Mnz@x`$FE5s^=b4n(Arke~p8*pqm} zX4mYFoeR|=8h*f4blgun{sAowT06msIPp>8YP~!2-kbO4%WP^~_BMRHV9{du^vSX^ zqK&qUV5tm+6BwGZK`2~ha!eUB=a(eHIWp%xXJXdS7E&-gm(GjcwuTQEc}_xa4%GGD z&0hQtZuD+n``+v0`4+zIiKs}0gCvWPD)pjZP$m_bPKXW&RC6BLwxvmYO%tV_vSm+E z)pU*HqnAe~!$PDC4-XHirbS3{u1ASd{eB0y(o%rX&D@Nt)C6goE~uuEd0mQ{U^v3# z369kSw+7GH7&jO<=U2{~{BHAek}RCI!@(GXQH!7y0JQaEY)Tb3B&T;ghsbN^ou1Z; zZ5E?ABAWA#`!>37^!wI^Ai1lqGW^k=;o}1ZTz>itf+s21W959l#twrN)HuBIRF<4W z9G1+2))%&ODd72Cr9Cg%N{H-aQQ6GdnyqMO$zVn67HLUwDTMuuJ-0@8LC5vccD~Wn ziP&6pd5B+wLSP@^f7Sr{_cgdYKij_#$jG9gn%jy1aW2xGpT(3OG$I1Z*pRmg&024_ zY25ppG&V8(lE>?BdvSdIzx%&qxSDiA?q9vHv13V@cmLS;$36c6TRzVseFOji?Fklz literal 565 zcmV-50?PeCRzV@Ml00000000BUQax`IK@hb;2(cYyx~J`v(Av&obysXHOcgO^M0%iUV&H2h7bLcBtQ zP6k!88V>gl_K!w6QR$!U?#iWPV1~;v;|7C{aHS{*3Ej-is6y;Pk|YZ*^QluM@%Ly9 zFZSS&Zx4pAQENM#H1~Jb>FiPSaWq|6Wk$mZ49Af{2;dX(6Ieq9Hcd`;9Qx4L9Cv!6 z6>S#dFd{Vf4fjoOU#rt-gQv_^w;BF?%kW8`rCfda%EPipIXYNbm({S*fpXb6ymGQE znVc*Xh@5`o3z}oL%HgLIpnF<+}g3!&;VKll6I;;;5 zzSh)rNpw*BrQWwAMLPegd0&xUpvXCbAhjR+5AD9B<$ z^XP4x#^b+9V;#edJl_AeLq#D|XaBM8k9+W5fq@+6@%G8~jL|gOYN=mZysqy&k#^#3mH12IYxO2a;h4OzWb(_E?pC0$i~os z!=9Kf7klPzuvfR(PV{UsXB2a$O_<3v^}{16Q#HU)7d%VDz-ka&3?L~DY{ElVvkA|E z)N?!vI5rzVJxFI7bEhi+0sM`n6S#D`QQ5X4j$c~=`Qre|SLSnErgB-fAX*5*_m#4- z6*QIvt*Q|y8SDZBWZLgfEnZd@Rq~V6CUYcfLp%u}9^O6(KRLw`%5EJ>OvP-IwNOsp zB%}t{EKLJ{q4Xdqp1{A!wvmsl7lO`YSp!*LU{wc{1wf}a2&nC{rSgZ0wmT2<^_4Q; zb`4Ui>~_hNJFFxW?hrE5zix!JsH^!i=V_j^oSVJA&N4kIgBz*k>jn38Ar0b;)VZml zejQLpH;DSbz7$`*(|Ajk4wn|~|KZJ<6ukDBzBo>^%;BY~Qh?NKRMV}#7^MZH-5%wV vEVpMoHBcsilD7(Kv2m{)^$==t+V@xdf2-lGf2Jw#N~8H3`)GIoCJF!m&TT$@ literal 665 zcmV;K0%rX|RzV%_WS8%e+~OW4aVl@HM86b_T|YL z*T#a*C5)J4npkFlK+8yy0g==_Pbha&lPYU|TvJLc`B;5)x3X7pSM^@y{+<154c-+# zpjoE0g`v{W!*sUw+4Pd+eae6gY)%BsvjI0?$dpmwa^dQ??zNKSyr_pl{|Y{JK6Eag zrq*WW^ze{O2|7|XeTIIu8g8YMq`j=*C`kaXZ~hK$`4s9(vigCyeD^_p^3??qm@s3= zh{Z9ux*oH#!Eu?hovDR06Qs|CGO;Fe)!Q9Pxg5bnX|_AbHEGj+>~QmJPrWiSI2T zun`3Y1dSpPAYia-7=ZHOaL(dI!J<%p#%;QSWM>eMBM=X69|+$$dIQQ)85DF}B-shd z`RkO((Gp7?A-ILWgMef+@F&>;WV!W(KnWUbK&&?~Sq4Z%fG%zjpr+H7gcrpLj!0i` z3HmlmAT>g?Qzm5Cicp*(#!UV-5$uGz=sz>&S%xYtdvB(2W!=lFGN zHuDT=u;v0!2`CeRqPGgvdf;(r^%&H8x1VhJeJjCRUeg@!R;~FP`)GIoCJF!m#LPdu diff --git a/test/snapshot-workflow/snapshots/changing-label.js.snap b/test/snapshot-workflow/snapshots/changing-label.js.snap index 0760fcd150dcdd658aed1ec45fda12f2049054b0..5c047107e4797c0b0b8a628bc623d22de408890d 100644 GIT binary patch literal 324 zcmV-K0lWS|RzVDv0%<$&DnK$#D%?h8s%6h|Uwcz*LN2@uaXjK|gj>J(ZxmOt= z&B@KJn}hI&_5}saxIoJmXwHb6F31_gOJnx~)*E9;>FM_*I18FMIt|W`e*&O~yN-m4 zOJ6B6Um=+)i^dB{rXdgl_c?=7T~V>$4=WI=*}%GkU}qqi#;xpz9ap4mF#Evs%D)qh&9W{1pPDm$0RRAO+LlEC literal 326 zcmV-M0lEG`RzVib_nQZ83xwgaR%AI8L$wr@ zl`+zSOs-81!e2EIl$3CZo)*}G5p}m9qYy2W-Wjac$}#l#d*q#XT^t;Hr-wft;Ny0H z&~RNf7FpF`9y>!Dy~sQs0dCznZ%XZw%3XhGfl$i|+Uy0}0p@Yk%dXjQh2RhP2{Rk_{)WHe$}fF6J=#}%mi5m*>Y^;b!{+KhW)JQvW zJX4Z%zJ!K-4tqj8P`R?~m89f^UJsrR-rN{_U%39>9?y8DPh~Ew#n6s^mm6w*cS{0NewBUEFG7ZD1{*AXcM#y$&bEOw`C@v>Y}XjR5@#0KWj>8g4-2b?BAQunxNzUBwu%*2GKYU8*MAi}W@y zwQv)wS)8!FD5=z#xvN>h&M8SH%grr)*;+aJUlSMXly$bj{{BZEQ3n9_&&vWs0td?w h-vYoC0KT3Rz(u+GVSbot^#g~~{070XQHc-)000io3W@*# literal 538 zcmV+#0_FWdRzV?}LuT3b96`UmJo%ag&>9o63n;ZG&H~YnmyNxU6Laj9I%9YLN^W>q71&Owaq#`jP{a;~HUWD8i zq0-X|6;f`MQqF_7PJWYYk8BZU>rm+=3BLp=qH4A30CT`~U;*G=PNXQ!JlGu96#gRn zQ{-e&b1FT}{{2rs+$Q;rr+NXl13P6CKa(Gk c{d}SU&!y_u{4%5B2e!Al1HrLTi4X(;0P^bpzyJUM diff --git a/test/snapshot-workflow/snapshots/removing-all-snapshots.js.snap b/test/snapshot-workflow/snapshots/removing-all-snapshots.js.snap index 434df2578bab32b3df58e70270567c6240fb9860..e5d943b6edc67a44875031146f3d7bcb96997dd5 100644 GIT binary patch literal 337 zcmV-X0j~Z*RzVwee43;MB*D+AB?Rg z+r`Z(q#uh200000000AhkU>ksKoEsnMTFe^2M=spa;f zd1V@1y@1LRy^h?P6$rvkT7(^>VC;N#&uz9!k}}~<$kO4R`K=Gz3|`+BUABc(rKS97KX^k{%SDNUz4)&T$jR0E*F literal 337 zcmV-X0j~Z*RzVvvARs5=l zScOwJT_1}G00000000Ahkj+ZOFcgJbMFe-g!GSJDnP~@?&O(@#Zd@sfSfT0k)LR*T;7Mkr0 zhSs{4xkJc;3qtEF2X4E|oS}H|ulBt|uPOh)JKj6@fdDr>g7B jUsS7fRG-v}>dt_{7*{foA6hQO5^ggx8(5&Y=4c-4_kjQ)uF=7O+iTOZ(p VQZ7{fUBcKb`vw!1rZ%1d001Y3lK=n! literal 323 zcmV-J0lfY}RzVF00000000ABkikmBKoEu#MGC!n@%%#$Rp_SZu?L~2K7gW#5wd9}W;JHR z&NM3Gp^svp)D20kIt=Xc&;RYr>{pRhcJ<7gEs2qe-j=sUN+`8%axJ8|)(w|dcnU`^ zwl(!5Gp^SUJHm8^BO?`#;XTgqYTJrH;0B#nD)Ni{jYM2_qo_lujw!)Ynf@O(DY zt@iGm+OxqMMZUG|@0a_j&U>YckKsgToMU2ZnoI}nbFAR=7kJStJ*fVG@@hS(1`wc1 VXH*IQ`-$8X#Wxd{rZ%1d000)sC0@>MolR;MMur;knx7_+V|DI2M%mcpxy5%|qF zu6hAMS+wg};8d`KxV?F^wU(5g1{cTCY1GExBsx1f9{@w#^)3XieNf~+V76$H$x3F6 z7>I%UfB;DFAR~$&$BKyGe^kF)`EL3YrClhLDC5h$c zs`n0u$i46Co5NMtozli literal 323 zcmV-J0lfY}RzV14 z=?~N=Tpx=F00000000ABkikmCFc5}YMTEVHFYsdztFYp~ z%oasF?4!6(YPyNL=rEAU zUQ7U&w>3d7c_kbCQlTxZ97sX8dqX-t=SAvm*VIz)_EsoA@VK~JJe}9foz3QRIY_5g zG+YF2lDN^v*H`AF002ZRl!O2P diff --git a/test/snapshot-workflow/snapshots/reorder.js.snap b/test/snapshot-workflow/snapshots/reorder.js.snap index af989055d05bbe506de6bff1b56c9b8b06e4cb8d..330b6fe4188ba7db6fb6e6ca6b4a64b09663fb34 100644 GIT binary patch literal 346 zcmV-g0j2&yRzV;=?;nc@00000000AxP|ZriKoD*f5pwelKIoxJniQ`+2nE3hP!zF3C*6tJHfF=l zv}nacAH_bYBC$l!t!Tp8>&!zK<)On1? zm3cgs(KrAC;2~qsMCX)a>k2CnTCjmF_JX>>XdE}PJ1*FhvO)5Rm*L~^^)gc}Wzg@_ zf~FE1UR>4O2%Qd6>qYB#1z~jyPh4Rdp!U1jx4mwVYQBP~S&%w6KsO=Z?FHcmOUT#Q svfJD6zjuL$0pU@De+3?zhkumV2Xamc=PF0PZETwU0yYli7ykhO0BX9T>;M1& literal 345 zcmV-f0jB;zRzV z4O;QgN3l=pCb3N^9vt>EAK%~Xx5`SBFKE3%)?DKI^@HXDqG(x5!5C2`YAOuV1S}dW z(dz027>Q{M5O9GIw@eU~g!oPBoov04&PP1@t7GrfYsWwF&W;v7KmfPDEay}k%b<*f zByG*(S4z?mfO~h&T;#kIC2U;s4@Cq)5bRAwkyhxYnV4-Y9LYZI=No zxX7X)!B`~(fl8p=A=Kpdbh}dlr~q7s2)s)}9xc8FLWAZb^g+m_VOC+gA56bg9<634l;7;z6H(uF?xA_(TxnmKAvpk_Lg=Vc^qe;Hdd zhwbq1VY4joc=CP{RzT?SWRZkrNm7)p1=2S((}UZu(LDKR1{oW0>V^&|8BIWAgk969 z8PQKL9^^3EzYZgN2V*U#6-Vb2w8j5p745g?@BAZTk&p;-IPlCxIpZai{O9)*_`L$o Ke=+#~1^@t0-rI%% literal 467 zcmV;^0WAJORzVaC&(6};Py?dH69 z>>f3V9)i9|e$wvToNk8NTSb?_cK|7Xw%b3lJi&!xQyw;%J3E7YJg|x56LgloyxcpWjd5_X*B_ JG5G%m0004J+42AY diff --git a/test/snapshot-workflow/snapshots/try-skip.js.snap b/test/snapshot-workflow/snapshots/try-skip.js.snap index 8d5f4b1250b4c89613558c41b064e0c8f47890f3..8efd3e7766996f1c5ed1de08a9915f82249d26b2 100644 GIT binary patch literal 330 zcmV-Q0k!@?RzVF{Jbv-CYi@2i-(hgPV)n2#E1^P$6*bgQD~S zvxTx~wvyRm2n>PuC4&mxki&5+tU#z?(*-*j_Nix!thc>##etL!@)lpykLf&Fs@C!} z9#car$qYB?K^w=%dLVR_Yc{82z2x~X?4(D!nfxOkJLF+cj&d%2U?jqYuM9M_>1cT0 cb5tsaGYViwIXjiJzZhGVzf+|L=BEJw0Q6CpO#lD@ literal 333 zcmV-T0kZxPpRbgzo_3xi7S`5G4N$P8A{KkgQRyXqmx`xueB&S$G zQgK}Xm1SSYg3>k}Y|9STD70jDtVe_3suT%5PcDw5)2Oe>NpyB}J^^NUIH=&bu})A~ zhb$NNlD_&Zp90}MZWvU`jtoXuXb(?q$P$8mH|$eqc{;S+bIpzx(%14IdEFyddonIKEX0_5E^Qs|=DH-F fUJe{p5)Ss80@zT&M*N?6#yrvU%}>nM-X diff --git a/test/test-timeouts/fixtures/invalid-message.js b/test/test-timeouts/fixtures/invalid-message.js index 0e0ae5f96..c71923dde 100644 --- a/test/test-timeouts/fixtures/invalid-message.js +++ b/test/test-timeouts/fixtures/invalid-message.js @@ -1,6 +1,6 @@ import test from 'ava'; test('timeout with invalid message', t => { - t.timeout(10, 20); // eslint-disable-line ava/assertion-arguments + t.timeout(10, 20); }); diff --git a/test/test-timeouts/snapshots/test.js.snap b/test/test-timeouts/snapshots/test.js.snap index 3f85c7ca570251237d3307b1e7b2ac8a7acaf7fc..df71924e3ba063c1341357a79d1b461b48a8f96a 100644 GIT binary patch literal 301 zcmV+|0n+|KRzVGEj**Wyh3* zikkLTAr4lR+jPkmXa79KZ}+qvUR&?EHP24_i@&#?CWvWSt@H8?Jl)r3XaN8Ky$_Fr literal 302 zcmV+}0nz?JRzVcTiQoWJQBj~36{0~LfQEwB*?5zInGB4* z0!p|6M_{kP0s!u_rcu#bR1AEYXfV zTORR=hamj1?m85_zbMp>`VA;m1E+Tb8Dyp?HjEiFQEOAE!%o-@KW5hRr+*MVjU|#_!H~_fHrlL>Pr~J&u*=_qk3jsZ~bzLhsQlJ%7Nuy7o zNcT6ew+zvv2z7a*=jZ=4<>vN09p0dG)R`A6!{y&w&lALSBxoJ~06g8-W@rHb0I#lu AV*mgE diff --git a/test/watch-mode/fixtures/filter-files/test1.test.js b/test/watch-mode/fixtures/filter-files/test1.test.js index a5c70aedc..896bc9a16 100644 --- a/test/watch-mode/fixtures/filter-files/test1.test.js +++ b/test/watch-mode/fixtures/filter-files/test1.test.js @@ -1,17 +1,17 @@ const {default: test} = await import(process.env.TEST_AVA_IMPORT_FROM); // This fixture is copied to a temporary directory, so import AVA through its configured path. -test("alice", (t) => { - t.pass(); +test('alice', t => { + t.pass(); }); -test("bob", async (t) => { - t.pass(); +test('bob', async t => { + t.pass(); }); -test("catherine", async (t) => { - t.pass(); +test('catherine', async t => { + t.pass(); }); -test("david", async (t) => { - t.fail(); +test('david', async t => { + t.fail(); }); diff --git a/test/watch-mode/fixtures/filter-files/test2.test.js b/test/watch-mode/fixtures/filter-files/test2.test.js index 52927aeb5..f45004d40 100644 --- a/test/watch-mode/fixtures/filter-files/test2.test.js +++ b/test/watch-mode/fixtures/filter-files/test2.test.js @@ -1,17 +1,17 @@ const {default: test} = await import(process.env.TEST_AVA_IMPORT_FROM); // This fixture is copied to a temporary directory, so import AVA through its configured path. -test("emma", (t) => { - t.pass(); +test('emma', t => { + t.pass(); }); -test("frank", async (t) => { - t.pass(); +test('frank', async t => { + t.pass(); }); -test("gina", async (t) => { - t.pass(); +test('gina', async t => { + t.pass(); }); -test("harry", async (t) => { - t.fail(); +test('harry', async t => { + t.fail(); }); diff --git a/test/watch-mode/helpers/watch.js b/test/watch-mode/helpers/watch.js index b42ce3d4e..b8a1cf3de 100644 --- a/test/watch-mode/helpers/watch.js +++ b/test/watch-mode/helpers/watch.js @@ -19,159 +19,166 @@ export const serial = available(fileURLToPath(import.meta.url)) ? ava.serial : a */ const raceUnlessError = async (possiblyErroring, ...promises) => { const race = Promise.race(promises); - const intermediate = await Promise.race([Promise.resolve(possiblyErroring).then(() => raceUnlessError), race]); - return intermediate === raceUnlessError ? race : intermediate; + const intermediate = await Promise.race([didNotError(possiblyErroring), race]); + return intermediate === didNotError ? race : intermediate; +}; + +const didNotError = async possiblyErroring => { + await possiblyErroring; + return didNotError; }; export const withFixture = fixture => async (t, task) => { let completedTask = false; - await temporaryDirectoryTask(async dir => { - await fs.cp(cwd(fixture), dir, {recursive: true}); + try { + await temporaryDirectoryTask(async dir => { + await fs.cp(cwd(fixture), dir, {recursive: true}); - async function * run(args = [], options = {}) { - yield * exec(['--watch', ...args], {...options, cwd: dir, env: {AVA_FORCE_CI: 'not-ci', ...options.env}}); - } + async function * run(args = [], options = {}) { + yield * exec(['--watch', ...args], {...options, cwd: dir, env: {AVA_FORCE_CI: 'not-ci', ...options.env}}); + } - async function mkdir(file, options = {}) { - await fs.mkdir(path.join(dir, file), options); - } + async function mkdir(file, options = {}) { + await fs.mkdir(path.join(dir, file), options); + } - async function read(file) { - return fs.readFile(path.join(dir, file), 'utf8'); - } + async function read(file) { + return fs.readFile(path.join(dir, file), 'utf8'); + } - async function rm(file, options = {}) { - await fs.rm(path.join(dir, file), options); - } + async function rm(file, options = {}) { + await fs.rm(path.join(dir, file), options); + } - async function stat(file) { - return fs.stat(path.join(dir, file)); - } + async function stat(file) { + return fs.stat(path.join(dir, file)); + } - async function touch(file) { - const time = new Date(); - await fs.utimes(path.join(dir, file), time, time); - } + async function touch(file) { + const time = new Date(); + await fs.utimes(path.join(dir, file), time, time); + } - async function write(file, contents = '') { - await fs.writeFile(path.join(dir, file), contents); - } + async function write(file, contents = '') { + await fs.writeFile(path.join(dir, file), contents); + } - const operations = { - mkdir, - read, - rm, - stat, - touch, - write, - }; - - let activeWatchCount = 0; - await task(t, { - ...operations, - dir, - run, - async watch(handlers, args = [], options = {}) { - activeWatchCount++; - - let signalDone; - const donePromise = new Promise(resolve => { - signalDone = resolve; - }); - let isDone = false; - const done = () => { - activeWatchCount--; - isDone = true; - signalDone({done: true}); - }; - - let idlePromise = new Promise(() => {}); - let assertingIdle = false; - let failedIdleAssertion = false; - const assertIdle = async next => { - assertingIdle = true; - - t.timeout(30_000); - - const promise = Promise.all([delay(5000, null, {ref: false}), next?.()]).finally(() => { - if (idlePromise === promise) { - idlePromise = new Promise(() => {}); - assertingIdle = false; - t.timeout.clear(); - if (failedIdleAssertion) { - failedIdleAssertion = false; - t.fail('Watcher performed a test run while it should have been idle'); + const operations = { + mkdir, + read, + rm, + stat, + touch, + write, + }; + + let activeWatchCount = 0; + await task(t, { + ...operations, + dir, + run, + async watch(handlers, args = [], options = {}) { + activeWatchCount++; + + let signalDone; + const donePromise = new Promise(resolve => { + signalDone = resolve; + }); + let isDone = false; + const done = () => { + activeWatchCount--; + isDone = true; + signalDone({done: true}); + }; + + let idlePromise = new Promise(() => {}); + let assertingIdle = false; + let failedIdleAssertion = false; + const assertIdle = async next => { + assertingIdle = true; + + t.timeout(30_000); + + const promise = Promise.all([delay(5000, null, {ref: false}), next?.()]).finally(() => { // eslint-disable-line promise/prefer-await-to-then + if (idlePromise === promise) { + idlePromise = new Promise(() => {}); + assertingIdle = false; + t.timeout.clear(); + if (failedIdleAssertion) { + failedIdleAssertion = false; + t.fail('Watcher performed a test run while it should have been idle'); + } } - } - }).then(() => ({})); - idlePromise = promise; + }).then(() => ({})); // eslint-disable-line promise/prefer-await-to-then + idlePromise = promise; - await promise; - }; + await promise; + }; - let state = {}; - let pendingState; - let process; + let state = {}; + let pendingState; + let process; - t.teardown(async () => { - if (process?.connected) { - process.send('abort-watcher'); - } + t.teardown(async () => { + if (process?.connected) { + process.send('abort-watcher'); + } + + // Sending the `abort-watcher` message should suffice, but on Linux + // the recursive watch handle does not close properly. See + // but there seem to be + // other isues. + setTimeout(() => { + process.kill('SIGKILL'); + }, 1000).unref(); - // Sending the `abort-watcher` message should suffice, but on Linux - // the recursive watch handle does not close properly. See - // but there seem to be - // other isues. - setTimeout(() => { - process.kill('SIGKILL'); - }, 1000).unref(); + try { + await process; + } catch {} + }); + const results = run(args, options); try { - await process; - } catch {} - }); - - const results = run(args, options); - try { - let nextResult = results.next(); - while (!isDone) { // eslint-disable-line no-unmodified-loop-condition - const item = await raceUnlessError(pendingState, nextResult, idlePromise, donePromise); // eslint-disable-line no-await-in-loop - process ??= item.value?.process; - - if (item.value) { - failedIdleAssertion ||= assertingIdle; - - state = (await pendingState) ?? state; // eslint-disable-line no-await-in-loop - const result = item.value; - const {[result.runCount]: handler = handlers.else} = handlers; - pendingState = handler?.call({assertIdle, done, ...operations}, result, state); - - if (!item.done && !isDone) { - nextResult = results.next(); + let nextResult = results.next(); + while (!isDone) { // eslint-disable-line no-unmodified-loop-condition + const item = await raceUnlessError(pendingState, nextResult, idlePromise, donePromise); // eslint-disable-line no-await-in-loop + process ??= item.value?.process; + + if (item.value) { + failedIdleAssertion ||= assertingIdle; + + state = (await pendingState) ?? state; // eslint-disable-line no-await-in-loop + const result = item.value; + const {[result.runCount]: handler = handlers.else} = handlers; + pendingState = handler?.call({assertIdle, done, ...operations}, result, state); + + if (!item.done && !isDone) { + nextResult = results.next(); + } + } + + if (item.done) { + await pendingState; // eslint-disable-line no-await-in-loop + break; } } + } finally { + results.return(); - if (item.done) { - await pendingState; // eslint-disable-line no-await-in-loop - break; + // Handle outstanding promises in case they reject. + if (assertingIdle) { + await idlePromise; } - } - } finally { - results.return(); - // Handle outstanding promises in case they reject. - if (assertingIdle) { - await idlePromise; + await pendingState; } + }, + }); - await pendingState; - } - }, + t.is(activeWatchCount, 0, 'Handlers for all watch() calls should have invoked `this.done()` to end their tests'); + completedTask = true; }); - - t.is(activeWatchCount, 0, 'Handlers for all watch() calls should have invoked `this.done()` to end their tests'); - completedTask = true; - }).catch(error => { + } catch (error) { if (!completedTask) { throw error; } @@ -189,5 +196,5 @@ export const withFixture = fixture => async (t, task) => { throw error; } } - }); + } }; diff --git a/types/assertions.d.cts b/types/assertions.d.cts index 6f5ccddd6..4dc0bbc3b 100644 --- a/types/assertions.d.cts +++ b/types/assertions.d.cts @@ -143,7 +143,7 @@ export type Assertions = { truthy: TruthyAssertion; }; -type FalsyValue = false | 0 | 0n | '' | null | undefined; // eslint-disable-line @typescript-eslint/ban-types +type FalsyValue = false | 0 | 0n | '' | undefined; type Falsy = T extends Exclude ? (T extends number | string | bigint ? T & FalsyValue : never) : T; export type AssertAssertion = { diff --git a/types/shared-worker.d.cts b/types/shared-worker.d.cts index 3e1bd5a65..95314bdb4 100644 --- a/types/shared-worker.d.cts +++ b/types/shared-worker.d.cts @@ -2,7 +2,7 @@ export namespace SharedWorker { export type ProtocolIdentifier = 'ava-4'; export type FactoryOptions = { - negotiateProtocol (supported: readonly ['ava-4']): Protocol; + negotiateProtocol(supported: readonly ['ava-4']): Protocol; // Add overloads for additional protocols. }; diff --git a/xo.config.mjs b/xo.config.mjs new file mode 100644 index 000000000..d47110ef7 --- /dev/null +++ b/xo.config.mjs @@ -0,0 +1,107 @@ +import pluginAva from 'eslint-plugin-ava'; // eslint-disable-line import-x/no-extraneous-dependencies, n/no-extraneous-import + +// The AVA rules resolve the AVA config, however we have many fake AVA configs in the fixtures and so the rules must +// be disabled for those files. This sets up a rules config that does so, based on the recommended rules. +const disabledAvaRules = Object.fromEntries(Object.keys(pluginAva.configs['flat/recommended'].rules).map(rule => [rule, 'off'])); + +/** @type {import('xo').FlatXoConfig} */ +const xoConfig = [ + { + ignores: [ + 'test/line-numbers/fixtures/line-numbers.js', + 'test-tap/fixture/snapshots/test-sourcemaps/build/**', + 'test-tap/fixture/report/edgecases/ast-syntax-error.cjs', + 'test-tap/fixture/**/*.ts', + 'test-types', + 'examples/typescript-*/**/*.ts', + ], + }, + { + rules: { + 'import-x/order': [ + 'error', + { + alphabetize: { + order: 'asc', + }, + 'newlines-between': 'always', + }, + ], + 'import-x/newline-after-import': 'error', + 'unicorn/require-post-message-target-origin': 'off', + 'unicorn/prefer-event-target': 'off', + 'unicorn/prevent-abbreviations': 'off', + }, + }, + { + files: '**/*.d.*(c|m)ts', + rules: { + 'import-x/extensions': 'off', + 'n/file-extension-in-import': 'off', + }, + }, + { + files: 'examples/**', + rules: { + 'ava/no-ignored-test-files': 'off', + 'ava/no-only-test': 'off', + 'unicorn/prefer-module': 'off', + }, + }, + { + files: [ + 'test/**/fixtures/**', + 'test-tap/fixture/**', + ], + rules: { + ...disabledAvaRules, + 'import-x/no-extraneous-dependencies': 'off', + 'n/no-extraneous-import': 'off', + 'unicorn/no-empty-file': 'off', + 'unicorn/no-anonymous-default-export': 'off', + }, + }, + { + files: 'test-types/**', + rules: { + 'ava/assertion-arguments': 'off', + 'ava/no-ignored-test-files': 'off', + 'ava/no-skip-assert': 'off', + 'ava/use-t': 'off', + }, + }, + { + // TODO: Update tests. + files: 'test/**', + rules: { + 'import-x/no-anonymous-default-export': 'off', + 'n/prefer-global/process': 'off', + }, + }, + { + files: 'test/**/fixtures/**', + rules: { + 'n/file-extension-in-import': 'off', + }, + }, + { + // TODO: Update tests. + files: 'test/snapshot-*/fixtures/**', + rules: { + 'unicorn/prefer-module': 'off', + }, + }, + { + // TODO: Update tests. + files: 'test-tap/**', + rules: { + 'import-x/no-anonymous-default-export': 'off', + 'max-lines': 'off', + 'n/prefer-global/process': 'off', + 'promise/prefer-await-to-then': 'off', + 'unicorn/error-message': 'off', + }, + }, +]; + +export default xoConfig; From 859f3ff2eb72e08c1c254d87ed5ff967c718d900 Mon Sep 17 00:00:00 2001 From: Tommy Date: Fri, 6 Jun 2025 16:01:01 -0500 Subject: [PATCH 08/10] Update examples to use AVA 6 Co-authored-by: Sindre Sorhus Co-authored-by: Mark Wubben --- .gitignore | 1 + docs/05-command-line.md | 10 ------ docs/recipes/endpoint-testing.md | 24 +++++++++---- examples/endpoint-testing/app.js | 8 ++--- examples/endpoint-testing/package.json | 9 ++--- examples/endpoint-testing/test.js | 22 +++++++----- examples/macros/index.js | 4 ++- examples/macros/package.json | 5 +-- examples/macros/test.js | 15 ++++---- examples/matching-titles/package.json | 5 +-- examples/matching-titles/test.js | 3 +- examples/specific-line-numbers/package.json | 3 +- examples/specific-line-numbers/test.js | 3 +- examples/tap-reporter/package.json | 5 +-- examples/tap-reporter/readme.md | 2 +- examples/tap-reporter/test.js | 3 +- examples/timeouts/index.js | 40 +++++++++------------ examples/timeouts/package.json | 5 +-- examples/timeouts/test.js | 31 +++++++--------- examples/typescript-basic/.gitignore | 1 + examples/typescript-basic/package.json | 9 ++--- examples/typescript-basic/source/test.ts | 2 +- examples/typescript-basic/tsconfig.json | 1 - examples/typescript-context/.gitignore | 1 + examples/typescript-context/package.json | 9 ++--- examples/typescript-context/source/test.ts | 8 ++--- examples/typescript-context/tsconfig.json | 1 - xo.config.mjs | 1 - 28 files changed, 115 insertions(+), 116 deletions(-) create mode 100644 examples/typescript-basic/.gitignore create mode 100644 examples/typescript-context/.gitignore diff --git a/.gitignore b/.gitignore index 1f8ca5804..1d0a1618c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /test-tap/**/node_modules/ /test/**/fixtures/**/node_modules/*/ /examples/**/node_modules/ +/examples/**/package-lock.json diff --git a/docs/05-command-line.md b/docs/05-command-line.md index 3154b52a1..a92ed2654 100644 --- a/docs/05-command-line.md +++ b/docs/05-command-line.md @@ -144,16 +144,6 @@ test('moo will also run', t => { test.only('boo will run but not exclusively', t => { t.pass(); }); - -// Won't run, no title -test(function (t) { - t.fail(); -}); - -// Won't run, no explicit title -test(function foo(t) { - t.fail(); -}); ``` ## Running tests at specific line numbers diff --git a/docs/recipes/endpoint-testing.md b/docs/recipes/endpoint-testing.md index 5eaa08394..bd5d18432 100644 --- a/docs/recipes/endpoint-testing.md +++ b/docs/recipes/endpoint-testing.md @@ -4,21 +4,23 @@ Translations: [Español](https://github.com/avajs/ava-docs/blob/main/es_ES/docs/ [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/avajs/ava/tree/main/examples/endpoint-testing?file=test.js&terminal=test&view=editor) -AVA doesn't have a built-in method for testing endpoints, but you can use any HTTP client of your choosing, for example [`got`](https://github.com/sindresorhus/got). You'll also need to start an HTTP server, preferably on a unique port so that you can run tests in parallel. For that we recommend [`test-listen`](https://github.com/zeit/test-listen). +AVA doesn't have a built-in method for testing endpoints, but you can use any HTTP client of your choosing, for example [`ky`](https://github.com/sindresorhus/ky). You'll also need to start an HTTP server, preferably on a unique port so that you can run tests in parallel. For that we recommend [`async-listen`](https://github.com/vercel/async-listen). Since tests run concurrently, it's best to create a fresh server instance at least for each test file, but perhaps even for each test. This can be accomplished with `test.before()` and `test.beforeEach()` hooks and `t.context`. If you start your server using a `test.before()` hook you should make sure to execute your tests serially. Check out the example below: ```js -import http from 'node:http'; +import {createServer} from 'node:http'; + +import {listen} from 'async-listen'; import test from 'ava'; -import got from 'got'; -import listen from 'test-listen'; -import app from '../app'; +import ky, {HTTPError} from 'ky'; + +import app from './app.js'; test.before(async t => { - t.context.server = http.createServer(app); + t.context.server = createServer(app); t.context.prefixUrl = await listen(t.context.server); }); @@ -27,9 +29,17 @@ test.after.always(t => { }); test.serial('get /user', async t => { - const {email} = await got('user', {prefixUrl: t.context.prefixUrl}).json(); + const {email} = await ky('user', {prefixUrl: t.context.prefixUrl}).json(); + t.is(email, 'ava@rocks.com'); }); + +test.serial('404', async t => { + await t.throwsAsync( + ky('password', {prefixUrl: t.context.prefixUrl}), + {message: /Request failed with status code 404 Not Found/, instanceOf: HTTPError}, + ); +}); ``` Other libraries you may find useful: diff --git a/examples/endpoint-testing/app.js b/examples/endpoint-testing/app.js index 150d93427..4c7eb75c6 100644 --- a/examples/endpoint-testing/app.js +++ b/examples/endpoint-testing/app.js @@ -1,6 +1,4 @@ -'use strict'; - -const app = (request, response) => { +export default function app(request, response) { if (request.url === '/user') { response.setHeader('Content-Type', 'application/json'); response.end(JSON.stringify({email: 'ava@rocks.com'})); @@ -8,6 +6,4 @@ const app = (request, response) => { response.writeHead('404'); response.end(); } -}; - -module.exports = app; +} diff --git a/examples/endpoint-testing/package.json b/examples/endpoint-testing/package.json index c1003774c..434686a28 100644 --- a/examples/endpoint-testing/package.json +++ b/examples/endpoint-testing/package.json @@ -1,12 +1,13 @@ { "name": "ava-endpoint-testing", "description": "Example for endpoint testing", + "type": "module", "scripts": { - "test": "ava" + "test": "ava test.js" }, "devDependencies": { - "ava": "^3.15.0", - "got": "^11.8.2", - "test-listen": "^1.1.0" + "ava": "^6", + "ky": "^1.4.0", + "async-listen": "^3.0.1" } } diff --git a/examples/endpoint-testing/test.js b/examples/endpoint-testing/test.js index 413e68ccc..76d7bddc8 100644 --- a/examples/endpoint-testing/test.js +++ b/examples/endpoint-testing/test.js @@ -1,14 +1,13 @@ -'use strict'; -const http = require('node:http'); +import {createServer} from 'node:http'; -const test = require('ava'); -const got = require('got'); -const listen = require('test-listen'); +import {listen} from 'async-listen'; +import test from 'ava'; +import ky, {HTTPError} from 'ky'; -const app = require('./app.js'); +import app from './app.js'; test.before(async t => { - t.context.server = http.createServer(app); + t.context.server = createServer(app); t.context.prefixUrl = await listen(t.context.server); }); @@ -17,7 +16,14 @@ test.after.always(t => { }); test.serial('get /user', async t => { - const {email} = await got('user', {prefixUrl: t.context.prefixUrl}).json(); + const {email} = await ky('user', {prefixUrl: t.context.prefixUrl}).json(); t.is(email, 'ava@rocks.com'); }); + +test.serial('404', async t => { + await t.throwsAsync( + ky('password', {prefixUrl: t.context.prefixUrl}), + {message: /Request failed with status code 404 Not Found/, instanceOf: HTTPError}, + ); +}); diff --git a/examples/macros/index.js b/examples/macros/index.js index a5a11214b..c17afd446 100644 --- a/examples/macros/index.js +++ b/examples/macros/index.js @@ -1 +1,3 @@ -exports.sum = (a, b) => a + b; +export function sum(a, b) { + return a + b; +} diff --git a/examples/macros/package.json b/examples/macros/package.json index 44e851513..fb3b1587e 100644 --- a/examples/macros/package.json +++ b/examples/macros/package.json @@ -1,10 +1,11 @@ { "name": "ava-macros", "description": "Example for reusing test logic through macros", + "type": "module", "scripts": { - "test": "ava" + "test": "ava test.js" }, "devDependencies": { - "ava": "^3.15.0" + "ava": "^6" } } diff --git a/examples/macros/test.js b/examples/macros/test.js index 4b3648dde..b53d814eb 100644 --- a/examples/macros/test.js +++ b/examples/macros/test.js @@ -1,12 +1,13 @@ -const test = require('ava'); +import test from 'ava'; -const {sum} = require('./index.js'); +import {sum} from './index.js'; -function macro(t, a, b, expected) { - t.is(sum(a, b), expected); -} - -macro.title = (providedTitle, a, b, expected) => `${providedTitle ?? ''} ${a}+${b} = ${expected}`.trim(); +const macro = test.macro({ + exec(t, a, b, expected) { + t.is(sum(a, b), expected); + }, + title: (providedTitle, a, b, expected) => `${providedTitle ?? ''} ${a}+${b} = ${expected}`.trim(), +}); test(macro, 2, 2, 4); test(macro, 3, 3, 6); diff --git a/examples/matching-titles/package.json b/examples/matching-titles/package.json index 41ccb750a..6b0e14f0b 100644 --- a/examples/matching-titles/package.json +++ b/examples/matching-titles/package.json @@ -1,10 +1,11 @@ { "name": "ava-matching-titles", "description": "Example for running tests with matching titles", + "type": "module", "scripts": { - "test": "ava --match='*oo*'" + "test": "ava test.js --match='*oo*'" }, "devDependencies": { - "ava": "^3.15.0" + "ava": "^6" } } diff --git a/examples/matching-titles/test.js b/examples/matching-titles/test.js index 4c6cbd96b..c5672fd0c 100644 --- a/examples/matching-titles/test.js +++ b/examples/matching-titles/test.js @@ -1,5 +1,4 @@ -'use strict'; -const test = require('ava'); +import test from 'ava'; test('foo will run', t => { t.pass(); diff --git a/examples/specific-line-numbers/package.json b/examples/specific-line-numbers/package.json index 9aef3692c..1fbd97048 100644 --- a/examples/specific-line-numbers/package.json +++ b/examples/specific-line-numbers/package.json @@ -1,10 +1,11 @@ { "name": "ava-specific-line-numbers", "description": "Example for running tests at specific line numbers", + "type": "module", "scripts": { "test": "ava test.js:5" }, "devDependencies": { - "ava": "^3.15.0" + "ava": "^6" } } diff --git a/examples/specific-line-numbers/test.js b/examples/specific-line-numbers/test.js index 56f6991d2..4c4977204 100644 --- a/examples/specific-line-numbers/test.js +++ b/examples/specific-line-numbers/test.js @@ -1,5 +1,4 @@ -'use strict'; -const test = require('ava'); +import test from 'ava'; test('unicorn', t => { t.pass(); diff --git a/examples/tap-reporter/package.json b/examples/tap-reporter/package.json index 38c62a14e..7f068c208 100644 --- a/examples/tap-reporter/package.json +++ b/examples/tap-reporter/package.json @@ -1,11 +1,12 @@ { "name": "ava-tap-reporter", "description": "Example for a custom TAP reporter", + "type": "module", "scripts": { - "test": "ava --tap | tap-nyan" + "test": "ava test.js --tap | tap-nyan" }, "devDependencies": { - "ava": "^3.15.0", + "ava": "^6", "tap-nyan": "^1.1.0" } } diff --git a/examples/tap-reporter/readme.md b/examples/tap-reporter/readme.md index 816f0c5e3..c276727d3 100644 --- a/examples/tap-reporter/readme.md +++ b/examples/tap-reporter/readme.md @@ -1,5 +1,5 @@ # Running tests at specific line numbers -> Example for a [custom TAP reporter](https://github.com/avajs/ava/blob/main/docs/05-command-line.md#running-tests-at-specific-line-numbers) +> Example for a [custom TAP reporter](https://github.com/avajs/ava/blob/main/docs/05-command-line.md#tap-reporter) [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/avajs/ava/tree/main/examples/tap-reporter?file=test.js&terminal=test&view=editor) diff --git a/examples/tap-reporter/test.js b/examples/tap-reporter/test.js index 224061b89..a6b1bb9b3 100644 --- a/examples/tap-reporter/test.js +++ b/examples/tap-reporter/test.js @@ -1,5 +1,4 @@ -'use strict'; -const test = require('ava'); +import test from 'ava'; test('unicorn', t => { t.pass(); diff --git a/examples/timeouts/index.js b/examples/timeouts/index.js index 92709dd7b..2ba9a3648 100644 --- a/examples/timeouts/index.js +++ b/examples/timeouts/index.js @@ -1,35 +1,29 @@ -'use strict'; - const delay = ms => new Promise(resolve => { setTimeout(resolve, ms); }); -exports.fetchUsers = async () => { +export async function fetchUsers() { await delay(50); - return [ - { - id: 1, - firstName: 'Ava', - name: 'Rocks', - email: 'ava@rocks.com', - }, - ]; -}; + return [{ + id: 1, + firstName: 'Ava', + name: 'Rocks', + email: 'ava@rocks.com', + }]; +} -exports.fetchPosts = async userId => { +export async function fetchPosts(userId) { await delay(200); - return [ - { - id: 1, - userId, - message: 'AVA Rocks 🚀', - }, - ]; -}; + return [{ + id: 1, + userId, + message: 'AVA Rocks 🚀', + }]; +} -exports.createPost = async message => { +export async function createPost(message) { await delay(3000); return { @@ -37,4 +31,4 @@ exports.createPost = async message => { userId: 1, message, }; -}; +} diff --git a/examples/timeouts/package.json b/examples/timeouts/package.json index ec288c771..80a068571 100644 --- a/examples/timeouts/package.json +++ b/examples/timeouts/package.json @@ -1,10 +1,11 @@ { "name": "ava-timeouts", "description": "Example for test timeouts", + "type": "module", "scripts": { - "test": "ava --timeout=2s --verbose" + "test": "ava test.js --timeout=2s --verbose" }, "devDependencies": { - "ava": "^3.15.0" + "ava": "^6" } } diff --git a/examples/timeouts/test.js b/examples/timeouts/test.js index f16945c10..5f67fbd8e 100644 --- a/examples/timeouts/test.js +++ b/examples/timeouts/test.js @@ -1,21 +1,18 @@ -'use strict'; -const test = require('ava'); +import test from 'ava'; -const {fetchUsers, fetchPosts, createPost} = require('./index.js'); +import {fetchUsers, fetchPosts, createPost} from './index.js'; test('retrieve users', async t => { t.timeout(100); const users = await fetchUsers(); - t.deepEqual(users, [ - { - id: 1, - firstName: 'Ava', - name: 'Rocks', - email: 'ava@rocks.com', - }, - ]); + t.deepEqual(users, [{ + id: 1, + firstName: 'Ava', + name: 'Rocks', + email: 'ava@rocks.com', + }]); }); test('retrieve posts', async t => { @@ -23,13 +20,11 @@ test('retrieve posts', async t => { const posts = await fetchPosts(1); - t.deepEqual(posts, [ - { - id: 1, - userId: 1, - message: 'AVA Rocks 🚀', - }, - ]); + t.deepEqual(posts, [{ + id: 1, + userId: 1, + message: 'AVA Rocks 🚀', + }]); }); test('create post', async t => { diff --git a/examples/typescript-basic/.gitignore b/examples/typescript-basic/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/examples/typescript-basic/.gitignore @@ -0,0 +1 @@ +build diff --git a/examples/typescript-basic/package.json b/examples/typescript-basic/package.json index ad85254fc..bf11fa179 100644 --- a/examples/typescript-basic/package.json +++ b/examples/typescript-basic/package.json @@ -1,14 +1,15 @@ { "name": "ava-typescript-basic", "description": "Basic example for AVA with TypeScript", + "type": "module", "scripts": { "test": "ava" }, "devDependencies": { - "@ava/typescript": "^2.0.0", - "@sindresorhus/tsconfig": "^1.0.2", - "ava": "^3.15.0", - "typescript": "^4.3.4" + "@ava/typescript": "^5.0.0", + "@sindresorhus/tsconfig": "^6.0.0", + "ava": "^6", + "typescript": "~5.5.3" }, "ava": { "typescript": { diff --git a/examples/typescript-basic/source/test.ts b/examples/typescript-basic/source/test.ts index 339a2321a..aa9bead68 100644 --- a/examples/typescript-basic/source/test.ts +++ b/examples/typescript-basic/source/test.ts @@ -1,6 +1,6 @@ import test from 'ava'; -import {sum, subtract} from '.'; +import {sum, subtract} from './index.js'; test('sum', t => { t.is(sum(0, 0), 0); diff --git a/examples/typescript-basic/tsconfig.json b/examples/typescript-basic/tsconfig.json index 60833d016..7b7de8c66 100644 --- a/examples/typescript-basic/tsconfig.json +++ b/examples/typescript-basic/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "@sindresorhus/tsconfig", "compilerOptions": { - "module": "commonjs", "outDir": "build", } } diff --git a/examples/typescript-context/.gitignore b/examples/typescript-context/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/examples/typescript-context/.gitignore @@ -0,0 +1 @@ +build diff --git a/examples/typescript-context/package.json b/examples/typescript-context/package.json index f577a30ec..3138b4ecd 100644 --- a/examples/typescript-context/package.json +++ b/examples/typescript-context/package.json @@ -1,14 +1,15 @@ { "name": "ava-typescript-context", "description": "TypeScript example for typing t.context", + "type": "module", "scripts": { "test": "ava" }, "devDependencies": { - "@ava/typescript": "^2.0.0", - "@sindresorhus/tsconfig": "^1.0.2", - "ava": "^3.15.0", - "typescript": "^4.3.4" + "@ava/typescript": "^5.0.0", + "@sindresorhus/tsconfig": "^6.0.0", + "ava": "^6", + "typescript": "~5.5.3" }, "ava": { "typescript": { diff --git a/examples/typescript-context/source/test.ts b/examples/typescript-context/source/test.ts index feccdaac4..b73a4ee3b 100644 --- a/examples/typescript-context/source/test.ts +++ b/examples/typescript-context/source/test.ts @@ -1,10 +1,10 @@ -import anyTest, {TestInterface} from 'ava'; +import anyTest, {type TestFn} from 'ava'; -import {concat} from '.'; +import {concat} from './index.js'; -const test = anyTest as TestInterface<{sort: (a: string, b: string) => number}>; +const test = anyTest as TestFn<{sort: (a: string, b: string) => number}>; -test.beforeEach(t => { +test.before(t => { t.context = { sort: (a: string, b: string) => a.localeCompare(b) }; diff --git a/examples/typescript-context/tsconfig.json b/examples/typescript-context/tsconfig.json index 60833d016..7b7de8c66 100644 --- a/examples/typescript-context/tsconfig.json +++ b/examples/typescript-context/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "@sindresorhus/tsconfig", "compilerOptions": { - "module": "commonjs", "outDir": "build", } } diff --git a/xo.config.mjs b/xo.config.mjs index d47110ef7..156153829 100644 --- a/xo.config.mjs +++ b/xo.config.mjs @@ -45,7 +45,6 @@ const xoConfig = [ rules: { 'ava/no-ignored-test-files': 'off', 'ava/no-only-test': 'off', - 'unicorn/prefer-module': 'off', }, }, { From 05ead2812d5723104cb4bf45c040007c9f082ff4 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Sat, 7 Jun 2025 16:28:07 +0200 Subject: [PATCH 09/10] Update release process & maintaining notes * Add Release workflow * Update maintaining.md to reflect the actual process. --- .github/workflows/ci.yml | 2 + .github/workflows/release.yml | 79 +++++++++++++++++++++++++++++++++++ maintaining.md | 33 ++++++++------- 3 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e11eaa93b..f04a2ba50 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,8 @@ on: push: branches: - main + tags: + - 'v*' pull_request: paths-ignore: - "*.md" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..0e73a591e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,79 @@ +name: Release +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + tag: + description: 'Release tag (e.g., v1.2.3)' + required: true + type: string + skip_ci_check: + description: 'Skip CI status check' + required: false + type: boolean + default: false + +permissions: + contents: write + id-token: write + +jobs: + release: + name: Release + runs-on: ubuntu-latest + environment: npm + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref }} + fetch-depth: 0 + + - name: Check CI status + if: ${{ !inputs.skip_ci_check }} + run: | + # Check if CI has completed successfully for this commit + RESULT=$(gh run list --commit ${{ github.sha }} --status success --json conclusion,workflowName | jq '.[]|select(.workflowName == "Install and test AVA")') + if [ -z "$RESULT" ]; then + echo "CI has not completed successfully for this commit" + exit 1 + fi + echo "All CI checks have passed!" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Verify tag matches package.json version + run: | + PACKAGE_VERSION=$(jq -r '.version' package.json) + TAG_VERSION=${RELEASE_TAG#v} + if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then + echo "Package version ($PACKAGE_VERSION) does not match tag version ($TAG_VERSION)" + exit 1 + fi + env: + RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }} + + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: package.json + cache: npm + registry-url: https://registry.npmjs.org + + - name: Publish to npm with provenance + run: npm publish --provenance + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create GitHub Release + run: | + gh release create "$RELEASE_TAG" \ + --title "$RELEASE_TAG" \ + --draft \ + --generate-notes + env: + RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/maintaining.md b/maintaining.md index eb8347591..e7c4d2f57 100644 --- a/maintaining.md +++ b/maintaining.md @@ -7,26 +7,28 @@ ## Testing * `npm test`: Lint the code and run the entire test suite with coverage. -* `npx tap test-tap/fork.js --bail`: Run a specific test file and bail on the first failure (useful when hunting bugs). -* `npx test-ava test/{file}.js`: Run self-hosted tests. +* `npx test-ava`: Run self-hosted tests from `test/`. Wraps a stable version of AVA. +* `npx tap`: Run legacy tests from `test-tap/`. + +Note that in CI we only run linting with the Node.js version set in the `package.json` file under the `"volta"` key. ## CI -* Tests sometimes fail on Windows. Review the errors carefully. -* At least one Windows job must pass. -* All other jobs must pass. +We test across Linux, macOS and Windows, across all supported Node.js versions. The occasional failure in a specific environment is to be expected. If jobs fail, review carefully. + +TypeScript jobs should all pass. ## Updating dependencies * Make sure new dependency versions are compatible with our supported Node.js versions. -* Leave the TypeScript dependency as it is, to avoid accidental breakage. +* TypeScript dependency changes require CI changes to ensure backwards compatibility, see below. * Open a PR with the updates and only merge when CI passes (see the previous section). ## Updating TypeScript TypeScript itself does not follow SemVer. Consequently we may have to make changes to the type definition that, technically, are breaking changes for users with an older TypeScript version. That's OK, but we should be aware. -Only update the TypeScript dependency when truly necessary. This helps avoid accidental breakage. For instance we won't accidentally rely on newer TypeScript features. +When updating the TypeScript dependency, *also* add it to the CI workflow. This enables us to do typechecking with previous TypeScript versions and avoid unintentional breakage. For instance we won't accidentally rely on newer TypeScript features. Speaking of, using newer TypeScript features could be considered a breaking change. This needs to be assessed on a case-by-case basis. @@ -34,7 +36,7 @@ Speaking of, using newer TypeScript features could be considered a breaking chan * New features should come with tests and documentation. * Ensure the [contributing guidelines](.github/CONTRIBUTING.md) are followed. -* Squash commits when merging. +* Usually we squash commits when merging. Rebases may sometimes be appropriate. ## Experiments @@ -43,9 +45,12 @@ Speaking of, using newer TypeScript features could be considered a breaking chan ## Release process -* Update dependencies (see the previous section). -* If [necessary](docs/support-statement.md), update the `engines` field in `package.json`. - * Remove unsupported (or soon to be) Node.js versions. - * When doing a major version bump, make sure to require the latest releases of each supported Node.js version. -* Publish a new version using [`np`](https://github.com/sindresorhus/np) with a version number according to [SemVer](https://semver.org). -* Write a [release note](https://github.com/avajs/ava/releases/new) following the style of previous release notes. +* Use `npm version` with the correct increment and push the resulting tag and `main` branch. +* CI will run against the tag. Wait for this to complete. +* Approve the Release workflow within GitHub. The workflow includes npm provenance for enhanced security and supply chain transparency. + +### Setup Requirements + +For the automated workflows to work, the following secrets must be configured in the repository: + +- `NPM_TOKEN`: An npm automation token with publish permissions to the AVA package, within the `npm` environment From 372c241efbea3bcb790bc2cdcbc11b80d12bbdfd Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Sat, 7 Jun 2025 16:28:34 +0200 Subject: [PATCH 10/10] 6.4.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 449a96dff..5354e4b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ava", - "version": "6.3.0", + "version": "6.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ava", - "version": "6.3.0", + "version": "6.4.0", "license": "MIT", "dependencies": { "@vercel/nft": "^0.29.4", diff --git a/package.json b/package.json index b61e106ee..f1b2651e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ava", - "version": "6.3.0", + "version": "6.4.0", "description": "Node.js test runner that lets you develop with confidence.", "license": "MIT", "repository": "avajs/ava",