diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02a037ef1..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" @@ -15,7 +17,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/.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/.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/.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/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/docs/recipes/watch-mode.md b/docs/recipes/watch-mode.md index 39d7c4bee..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. @@ -42,10 +70,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. @@ -66,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/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/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/lib/api.js b/lib/api.js index f43fad799..92eb7bb4f 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,13 +149,17 @@ export default class Api extends Emittery { let testFiles; try { testFiles = await globs.findTests({cwd: this.options.projectDir, ...apiOptions.globs}); - if (selectedFiles.length === 0) { - selectedFiles = filter.length === 0 ? testFiles : globs.applyTestFileFilter({ - cwd: this.options.projectDir, - filter: filter.map(({pattern}) => pattern), - providers, - testFiles, - }); + 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, + }); } } catch (error) { selectedFiles = []; @@ -163,7 +167,7 @@ export default class Api extends Emittery { } const selectionInsights = { - filter, + filter: selectedFiles.appliedFilters ?? filter, ignoredFilterPatternFiles: selectedFiles.ignoredFilterPatternFiles ?? [], testFileCount: testFiles.length, selectionCount: selectedFiles.length, @@ -201,9 +205,8 @@ export default class Api extends Emittery { failFastEnabled: failFast, filePathPrefix: getFilePathPrefix(selectedFiles), files: selectedFiles, - matching: apiOptions.match.length > 0, - previousFailures: runtimeOptions.previousFailures ?? 0, - runOnlyExclusive: runtimeOptions.runOnlyExclusive === true, + matching: apiOptions.match.length > 0 || runtimeOptions.interactiveMatchPattern !== undefined, + previousFailures: runtimeOptions.countPreviousFailures?.() ?? 0, firstRun: runtimeOptions.firstRun ?? true, status: runStatus, }); @@ -266,14 +269,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, - // If we're looking for matches, run every single test process in exclusive-only mode - runOnlyExclusive: apiOptions.match.length > 0 || runtimeOptions.runOnlyExclusive === true, + match: runtimeOptions.interactiveMatchPattern === undefined ? match : [...match, runtimeOptions.interactiveMatchPattern], }; if (runtimeOptions.updateSnapshots) { @@ -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 a70f24e4e..10ca84f65 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; @@ -323,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)}`)); } } @@ -628,7 +633,8 @@ 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)); + // 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) { this.lineWriter.writeLine(colors.error(`* ${pattern}`)); @@ -708,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 fac04e344..1025bbdeb 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, @@ -253,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); @@ -378,7 +377,8 @@ export default class Runner extends Emittery { { titleSuffix: hookSuffix, testPassed: testOk, - }); + }, + ); } else { this.emit('stateChange', { type: 'test-failed', @@ -398,20 +398,16 @@ export default class Runner extends Emittery { { titleSuffix: hookSuffix, testPassed: testOk, - }); + }, + ); 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/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 2ee7d23b2..df13e7cf0 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) ?? (() => { + 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); @@ -79,11 +217,19 @@ 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(); + 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 => { @@ -117,17 +263,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; } @@ -151,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(); @@ -177,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; } @@ -327,42 +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]; - 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({ - 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({runOnlyExclusive}); - } 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(); + } else if (uniqueTestFiles.size > 0) { + signalChanged({testFiles: [...uniqueTestFiles]}); } takeCoverageForSelfTests?.(); @@ -378,34 +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 = [], runOnlyExclusive = false} = 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, - runOnlyExclusive, - 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/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/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/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 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 39a0dde22..5354e4b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "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.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": "*" @@ -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,111 +317,25 @@ } } }, - "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", - "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": { @@ -458,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": { @@ -477,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", @@ -487,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", @@ -529,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", @@ -566,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": { @@ -629,19 +733,25 @@ "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" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", + "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", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -827,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", @@ -865,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", @@ -939,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", @@ -1201,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": { @@ -1235,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", @@ -1404,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", @@ -1530,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": { @@ -1787,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": { @@ -1821,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": { @@ -2002,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": { @@ -2026,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": { @@ -2135,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" }, @@ -2189,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", @@ -2200,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": { @@ -2252,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", @@ -2267,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": { @@ -2308,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.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.0.0" + "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", @@ -2441,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", @@ -2878,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", @@ -3033,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" @@ -3063,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" @@ -3123,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", @@ -3277,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": [ { @@ -3297,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" @@ -3309,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" @@ -3588,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": [ { @@ -3666,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", @@ -3908,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", @@ -3981,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": { @@ -4163,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" @@ -4303,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" @@ -4355,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": { @@ -4389,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" }, @@ -4437,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": { @@ -4504,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": { @@ -4514,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", @@ -4537,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", @@ -4560,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" @@ -4589,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", @@ -4658,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": [ @@ -4690,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": { @@ -4763,60 +4830,141 @@ } }, "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": { - "confusing-browser-globals": "1.0.11" + "@stylistic/eslint-plugin": "^2.6.1", + "confusing-browser-globals": "1.0.11", + "globals": "^15.3.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" }, "peerDependencies": { - "eslint": ">=8.56.0" + "eslint": ">=9.8.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-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" + "node": ">=18.18" }, "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" + "eslint": ">=9.18.0" } }, - "node_modules/eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", + "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": { + "@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/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-formatter-pretty": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4969,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==", + "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": { - "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==", - "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": { @@ -5103,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": { @@ -5149,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" @@ -5303,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": { @@ -5450,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": { @@ -5460,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" @@ -5496,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", @@ -5558,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", @@ -5606,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", @@ -5637,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", @@ -5663,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", @@ -5689,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", @@ -5747,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", @@ -5831,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", @@ -5853,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" @@ -5946,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", @@ -5989,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": { @@ -6009,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", @@ -6177,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": { @@ -6327,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", @@ -6458,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": { @@ -6516,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": { @@ -6560,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": { @@ -6781,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" }, @@ -6838,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" @@ -6895,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", @@ -6940,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", @@ -6970,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": { @@ -7059,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": { @@ -7104,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", @@ -7144,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", @@ -7257,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" @@ -7409,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": { @@ -7467,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": { @@ -7496,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": { @@ -7533,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": { @@ -7582,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": { @@ -7611,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", @@ -7717,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", @@ -7788,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", @@ -7866,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", @@ -8133,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", @@ -8183,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": { @@ -8256,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", @@ -8279,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", @@ -8356,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": { @@ -8394,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", @@ -8493,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": { @@ -8620,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", @@ -8767,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", @@ -8839,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", @@ -9050,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", @@ -9067,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", @@ -9448,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": { @@ -9501,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": { @@ -9554,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", @@ -9581,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": { @@ -9930,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", @@ -10228,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": { @@ -10278,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", @@ -10630,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": { @@ -10660,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", @@ -10728,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": { @@ -10752,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": { @@ -10885,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": { @@ -10909,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": { @@ -11023,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", @@ -11097,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" @@ -11185,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", @@ -11459,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", @@ -11537,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", @@ -11558,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", @@ -11636,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": { @@ -11738,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", @@ -11866,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": { @@ -11890,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": { @@ -11949,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" @@ -12035,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": { @@ -12160,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", @@ -12243,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", @@ -12259,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", @@ -12312,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": { @@ -12447,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", @@ -12591,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", @@ -12610,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", @@ -12681,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", @@ -12722,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", @@ -12806,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", @@ -13218,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", @@ -13239,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": { @@ -13261,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" @@ -13376,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" @@ -13449,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", @@ -13466,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", @@ -13483,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 79fbeaf4e..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", @@ -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" @@ -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/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-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.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.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/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.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.v23.log b/test-tap/reporters/tap.regular.v24.log similarity index 99% rename from test-tap/reporters/tap.regular.v23.log rename to test-tap/reporters/tap.regular.v24.log index 7686951e4..471c2c196 100644 --- a/test-tap/reporters/tap.regular.v23.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/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-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 a1a251bd9..e5b97821b 100644 Binary files a/test/assertions/snapshots/test.js.snap and b/test/assertions/snapshots/test.js.snap differ diff --git a/test/builtin-nodejs-assert/fixtures/assert-failure.js b/test/builtin-nodejs-assert/fixtures/assert-failure.js index 7c5806c7e..ea532c7d5 100644 --- a/test/builtin-nodejs-assert/fixtures/assert-failure.js +++ b/test/builtin-nodejs-assert/fixtures/assert-failure.js @@ -3,5 +3,5 @@ import assert from 'node:assert'; import test from 'ava'; test('test', () => { - 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 3f07b804f..66994c506 100644 Binary files a/test/concurrency/snapshots/test.js.snap and b/test/concurrency/snapshots/test.js.snap differ diff --git a/test/config-require/fixtures/non-json/required.mjs b/test/config-require/fixtures/non-json/required.mjs index 0a9e1fb51..3cdaefe58 100644 --- a/test/config-require/fixtures/non-json/required.mjs +++ b/test/config-require/fixtures/non-json/required.mjs @@ -1,4 +1,4 @@ -export let receivedArgs = null; // eslint-disable-line import/no-mutable-exports +export let receivedArgs = null; // eslint-disable-line import-x/no-mutable-exports export default function (...args) { receivedArgs = args; diff --git a/test/config-require/fixtures/single-argument/required.js b/test/config-require/fixtures/single-argument/required.js index d363e318d..0eb32ae5d 100644 --- a/test/config-require/fixtures/single-argument/required.js +++ b/test/config-require/fixtures/single-argument/required.js @@ -1,4 +1,4 @@ -export let required = false; // eslint-disable-line import/no-mutable-exports +export let required = false; // eslint-disable-line import-x/no-mutable-exports export default function () { required = true; diff --git a/test/config-require/fixtures/with-arguments/required.mjs b/test/config-require/fixtures/with-arguments/required.mjs index 0a9e1fb51..3cdaefe58 100644 --- a/test/config-require/fixtures/with-arguments/required.mjs +++ b/test/config-require/fixtures/with-arguments/required.mjs @@ -1,4 +1,4 @@ -export let receivedArgs = null; // eslint-disable-line import/no-mutable-exports +export let receivedArgs = null; // eslint-disable-line import-x/no-mutable-exports export default function (...args) { receivedArgs = args; diff --git a/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js b/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js index e60d0fef4..5950a2850 100644 --- a/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.js +++ b/test/config/fixtures/mjs-with-tests/dir-a-wrapper/dir-a/dir-a-wrapper-3.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/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 b82825724..0b5a36191 100644 Binary files a/test/config/snapshots/integration.js.snap and b/test/config/snapshots/integration.js.snap differ 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 f42c1bf10..a0fa8e36b 100644 Binary files a/test/config/snapshots/loader.js.snap and b/test/config/snapshots/loader.js.snap differ diff --git a/test/config/snapshots/next-gen.js.snap b/test/config/snapshots/next-gen.js.snap index 44ef74fd8..ec5e33e21 100644 Binary files a/test/config/snapshots/next-gen.js.snap and b/test/config/snapshots/next-gen.js.snap differ 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 a76fd21f5..63194cb71 100644 Binary files a/test/configurable-module-format/snapshots/invalid-configurations.js.snap and b/test/configurable-module-format/snapshots/invalid-configurations.js.snap differ diff --git a/test/environment-variables/snapshots/test.js.snap b/test/environment-variables/snapshots/test.js.snap index de6bc04f0..8ef927214 100644 Binary files a/test/environment-variables/snapshots/test.js.snap and b/test/environment-variables/snapshots/test.js.snap differ diff --git a/test/extensions/snapshots/test.js.snap b/test/extensions/snapshots/test.js.snap index 61c83b6d2..350025324 100644 Binary files a/test/extensions/snapshots/test.js.snap and b/test/extensions/snapshots/test.js.snap differ diff --git a/test/external-assertions/fixtures/assert-failure.js b/test/external-assertions/fixtures/assert-failure.js index 74a0d043f..bcaf76ae9 100644 --- a/test/external-assertions/fixtures/assert-failure.js +++ b/test/external-assertions/fixtures/assert-failure.js @@ -3,9 +3,9 @@ import assert from 'node:assert'; import test from 'ava'; test('test', () => { - 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 6b05ebfe0..52bc4f0fb 100644 Binary files a/test/external-assertions/snapshots/test.js.snap and b/test/external-assertions/snapshots/test.js.snap differ 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 f21455526..6ed757df2 100644 Binary files a/test/globs/snapshots/test.js.snap and b/test/globs/snapshots/test.js.snap differ diff --git a/test/helpers/exec.js b/test/helpers/exec.js index 92612a6cd..8b9acdbf5 100644 --- a/test/helpers/exec.js +++ b/test/helpers/exec.js @@ -114,10 +114,10 @@ export async function * exec(args, options) { let runCount = 0; const statusEvents = execaProcess.getEachMessage(); - const done = execaProcess.then(result => ({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 eab03f4c5..934ca3d48 100644 Binary files a/test/hook-restrictions/snapshots/test.js.snap and b/test/hook-restrictions/snapshots/test.js.snap differ diff --git a/test/idle-timeouts/fixtures/console-output.js b/test/idle-timeouts/fixtures/console-output.js index af879f8ac..18dd918b4 100644 --- a/test/idle-timeouts/fixtures/console-output.js +++ b/test/idle-timeouts/fixtures/console-output.js @@ -1,9 +1,10 @@ import {setTimeout as delay} from 'node:timers/promises'; + import test from 'ava'; test('timeout with console output', async t => { 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 763f73cf7..966b80983 100644 Binary files a/test/line-numbers/snapshots/test.js.snap and b/test/line-numbers/snapshots/test.js.snap differ 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 bbccccf41..932e64bd3 100644 Binary files a/test/node-arguments/snapshots/test.js.snap and b/test/node-arguments/snapshots/test.js.snap differ diff --git a/test/shared-workers/cannot-publish-before-available/snapshots/test.js.snap b/test/shared-workers/cannot-publish-before-available/snapshots/test.js.snap index a3c5eed24..30f5eabd6 100644 Binary files a/test/shared-workers/cannot-publish-before-available/snapshots/test.js.snap and b/test/shared-workers/cannot-publish-before-available/snapshots/test.js.snap differ 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 7a98f9d83..e029aa684 100644 Binary files a/test/shared-workers/unsupported-protocol/snapshots/test.js.snap and b/test/shared-workers/unsupported-protocol/snapshots/test.js.snap differ 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 1fe72ef3c..7d45055a9 100644 Binary files a/test/shared-workers/worker-execution-crash/snapshots/test.js.snap and b/test/shared-workers/worker-execution-crash/snapshots/test.js.snap differ diff --git a/test/shared-workers/worker-protocol/fixtures/_declare.js b/test/shared-workers/worker-protocol/fixtures/_declare.js index 558695389..b426245a6 100644 --- a/test/shared-workers/worker-protocol/fixtures/_declare.js +++ b/test/shared-workers/worker-protocol/fixtures/_declare.js @@ -1,4 +1,3 @@ -/* eslint-disable ava/no-ignored-test-files */ import crypto from 'node:crypto'; import test from 'ava'; diff --git a/test/shared-workers/worker-protocol/snapshots/test.js.snap b/test/shared-workers/worker-protocol/snapshots/test.js.snap index 4d680de0a..85fb04e91 100644 Binary files a/test/shared-workers/worker-protocol/snapshots/test.js.snap and b/test/shared-workers/worker-protocol/snapshots/test.js.snap differ 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 3b07a2ec9..8d254dea3 100644 Binary files a/test/shared-workers/worker-startup-crashes/snapshots/test.js.snap and b/test/shared-workers/worker-startup-crashes/snapshots/test.js.snap differ diff --git a/test/snapshot-order/snapshots/randomness.js.snap b/test/snapshot-order/snapshots/randomness.js.snap index d5ee319b3..fc7a71080 100644 Binary files a/test/snapshot-order/snapshots/randomness.js.snap and b/test/snapshot-order/snapshots/randomness.js.snap differ diff --git a/test/snapshot-removal/snapshots/test.js.snap b/test/snapshot-removal/snapshots/test.js.snap index 3b4f2117b..a6233e4c9 100644 Binary files a/test/snapshot-removal/snapshots/test.js.snap and b/test/snapshot-removal/snapshots/test.js.snap differ diff --git a/test/snapshot-tests/formatting.js b/test/snapshot-tests/formatting.js index c9e225ae7..994cbcc45 100644 --- a/test/snapshot-tests/formatting.js +++ b/test/snapshot-tests/formatting.js @@ -41,7 +41,8 @@ test('test title should be normalized in stdout', async t => { .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 c880bc043..36b988a8b 100644 Binary files a/test/snapshot-tests/snapshots/corrupt.js.snap and b/test/snapshot-tests/snapshots/corrupt.js.snap differ diff --git a/test/snapshot-tests/snapshots/formatting.js.snap b/test/snapshot-tests/snapshots/formatting.js.snap index 35cca5ff8..5f7fbfee3 100644 Binary files a/test/snapshot-tests/snapshots/formatting.js.snap and b/test/snapshot-tests/snapshots/formatting.js.snap differ diff --git a/test/snapshot-workflow/snapshots/adding.js.snap b/test/snapshot-workflow/snapshots/adding.js.snap index f422582cf..dcf1a9a1c 100644 Binary files a/test/snapshot-workflow/snapshots/adding.js.snap and b/test/snapshot-workflow/snapshots/adding.js.snap differ diff --git a/test/snapshot-workflow/snapshots/changing-label.js.snap b/test/snapshot-workflow/snapshots/changing-label.js.snap index 0760fcd15..5c047107e 100644 Binary files a/test/snapshot-workflow/snapshots/changing-label.js.snap and b/test/snapshot-workflow/snapshots/changing-label.js.snap differ diff --git a/test/snapshot-workflow/snapshots/invalid-snapfile.js.snap b/test/snapshot-workflow/snapshots/invalid-snapfile.js.snap index 9e67b2be0..0caac3a1f 100644 Binary files a/test/snapshot-workflow/snapshots/invalid-snapfile.js.snap and b/test/snapshot-workflow/snapshots/invalid-snapfile.js.snap differ diff --git a/test/snapshot-workflow/snapshots/removing-all-snapshots.js.snap b/test/snapshot-workflow/snapshots/removing-all-snapshots.js.snap index 434df2578..e5d943b6e 100644 Binary files a/test/snapshot-workflow/snapshots/removing-all-snapshots.js.snap and b/test/snapshot-workflow/snapshots/removing-all-snapshots.js.snap differ diff --git a/test/snapshot-workflow/snapshots/removing-snapshots.js.snap b/test/snapshot-workflow/snapshots/removing-snapshots.js.snap index d96cd833b..14adbacef 100644 Binary files a/test/snapshot-workflow/snapshots/removing-snapshots.js.snap and b/test/snapshot-workflow/snapshots/removing-snapshots.js.snap differ diff --git a/test/snapshot-workflow/snapshots/removing-test.js.snap b/test/snapshot-workflow/snapshots/removing-test.js.snap index 08b3127df..8cf3d8694 100644 Binary files a/test/snapshot-workflow/snapshots/removing-test.js.snap and b/test/snapshot-workflow/snapshots/removing-test.js.snap differ diff --git a/test/snapshot-workflow/snapshots/reorder.js.snap b/test/snapshot-workflow/snapshots/reorder.js.snap index af989055d..330b6fe41 100644 Binary files a/test/snapshot-workflow/snapshots/reorder.js.snap and b/test/snapshot-workflow/snapshots/reorder.js.snap differ diff --git a/test/snapshot-workflow/snapshots/selection.js.snap b/test/snapshot-workflow/snapshots/selection.js.snap index 3b46b9531..a9f95a7c8 100644 Binary files a/test/snapshot-workflow/snapshots/selection.js.snap and b/test/snapshot-workflow/snapshots/selection.js.snap differ diff --git a/test/snapshot-workflow/snapshots/try-skip.js.snap b/test/snapshot-workflow/snapshots/try-skip.js.snap index 8d5f4b125..8efd3e776 100644 Binary files a/test/snapshot-workflow/snapshots/try-skip.js.snap and b/test/snapshot-workflow/snapshots/try-skip.js.snap differ 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 3f85c7ca5..df71924e3 100644 Binary files a/test/test-timeouts/snapshots/test.js.snap and b/test/test-timeouts/snapshots/test.js.snap differ 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..896bc9a16 --- /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..f45004d40 --- /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/helpers/watch.js b/test/watch-mode/helpers/watch.js index 32c00ced1..b8a1cf3de 100644 --- a/test/watch-mode/helpers/watch.js +++ b/test/watch-mode/helpers/watch.js @@ -12,155 +12,173 @@ 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([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 Promise.race([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; } @@ -178,5 +196,5 @@ export const withFixture = fixture => async (t, task) => { throw error; } } - }); + } }; 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(); + }, + }); +}); 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}) { 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", 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..156153829 --- /dev/null +++ b/xo.config.mjs @@ -0,0 +1,106 @@ +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', + }, + }, + { + 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;