diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..654c6d4 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets). + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md). diff --git a/.changeset/changelog-generator.mjs b/.changeset/changelog-generator.mjs new file mode 100644 index 0000000..18e6d6d --- /dev/null +++ b/.changeset/changelog-generator.mjs @@ -0,0 +1,133 @@ +import { getInfo, getInfoFromPullRequest } from "@changesets/get-github-info"; + +/** @typedef {import("@changesets/types").ChangelogFunctions} ChangelogFunctions */ + +/** + * @returns {{ GITHUB_SERVER_URL: string }} value + */ +function readEnv() { + const GITHUB_SERVER_URL = + process.env.GITHUB_SERVER_URL || "https://github.com"; + return { GITHUB_SERVER_URL }; +} + +/** @type {ChangelogFunctions} */ +const changelogFunctions = { + getDependencyReleaseLine: async ( + changesets, + dependenciesUpdated, + options, + ) => { + if (!options.repo) { + throw new Error( + 'Please provide a repo to this changelog generator like this:\n"changelog": ["@changesets/changelog-github", { "repo": "org/repo" }]', + ); + } + if (dependenciesUpdated.length === 0) return ""; + + const changesetLink = `- Updated dependencies [${( + await Promise.all( + changesets.map(async (cs) => { + if (cs.commit) { + const { links } = await getInfo({ + repo: options.repo, + commit: cs.commit, + }); + return links.commit; + } + }), + ) + ) + .filter(Boolean) + .join(", ")}]:`; + + const updatedDependenciesList = dependenciesUpdated.map( + (dependency) => ` - ${dependency.name}@${dependency.newVersion}`, + ); + + return [changesetLink, ...updatedDependenciesList].join("\n"); + }, + getReleaseLine: async (changeset, type, options) => { + const { GITHUB_SERVER_URL } = readEnv(); + if (!options || !options.repo) { + throw new Error( + 'Please provide a repo to this changelog generator like this:\n"changelog": ["@changesets/changelog-github", { "repo": "org/repo" }]', + ); + } + + /** @type {number | undefined} */ + let prFromSummary; + /** @type {string | undefined} */ + let commitFromSummary; + /** @type {string[]} */ + const usersFromSummary = []; + + const replacedChangelog = changeset.summary + .replace(/^\s*(?:pr|pull|pull\s+request):\s*#?(\d+)/im, (_, pr) => { + const num = Number(pr); + if (!Number.isNaN(num)) prFromSummary = num; + return ""; + }) + .replace(/^\s*commit:\s*([^\s]+)/im, (_, commit) => { + commitFromSummary = commit; + return ""; + }) + .replaceAll(/^\s*(?:author|user):\s*@?([^\s]+)/gim, (_, user) => { + usersFromSummary.push(user); + return ""; + }) + .trim(); + + const [firstLine, ...futureLines] = replacedChangelog + .split("\n") + .map((l) => l.trimEnd()); + + const links = await (async () => { + if (prFromSummary !== undefined) { + let { links } = await getInfoFromPullRequest({ + repo: options.repo, + pull: prFromSummary, + }); + if (commitFromSummary) { + const shortCommitId = commitFromSummary.slice(0, 7); + links = { + ...links, + commit: `[\`${shortCommitId}\`](${GITHUB_SERVER_URL}/${options.repo}/commit/${commitFromSummary})`, + }; + } + return links; + } + const commitToFetchFrom = commitFromSummary || changeset.commit; + if (commitToFetchFrom) { + const { links } = await getInfo({ + repo: options.repo, + commit: commitToFetchFrom, + }); + return links; + } + return { + commit: null, + pull: null, + user: null, + }; + })(); + + const users = usersFromSummary.length + ? usersFromSummary + .map( + (userFromSummary) => + `[@${userFromSummary}](${GITHUB_SERVER_URL}/${userFromSummary})`, + ) + .join(", ") + : links.user; + + let suffix = ""; + if (links.pull || links.commit || users) { + suffix = `(${users ? `by ${users} ` : ""}in ${links.pull || links.commit})`; + } + + return `\n\n- ${firstLine} ${suffix}\n${futureLines.map((l) => ` ${l}`).join("\n")}`; + }, +}; + +export default changelogFunctions; diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..5d2c901 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.2/schema.json", + "changelog": ["./changelog-generator.mjs", { "repo": "webpack/webpack-sources" }], + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..6378b02 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,28 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 20 + labels: + - dependencies + versioning-strategy: widen + groups: + dependencies: + patterns: + - "*" + update-types: + - "minor" + - "patch" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 20 + labels: + - dependencies + groups: + dependencies: + patterns: + - "*" diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml new file mode 100644 index 0000000..13c0994 --- /dev/null +++ b/.github/workflows/benchmarks.yml @@ -0,0 +1,40 @@ +name: Benchmarks + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + id-token: write # Required for OIDC authentication with CodSpeed + +jobs: + benchmark: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + + - name: Use Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: lts/* + cache: npm + + - run: npm ci + + - name: Run benchmarks + uses: CodSpeedHQ/action@658a901452bb54c799643e060733b7afe9121b8d # v4.14.0 + with: + run: npm run benchmark + mode: "simulation" diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml new file mode 100644 index 0000000..91df925 --- /dev/null +++ b/.github/workflows/dependabot.yml @@ -0,0 +1,38 @@ +name: Dependabot + +on: pull_request + +permissions: + contents: write + pull-requests: write + +jobs: + dependabot-auto-merge: + runs-on: ubuntu-latest + if: github.actor == 'dependabot[bot]' + steps: + - name: Generate Token + uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1 + id: app-token + with: + app-id: ${{ secrets.BOT_APP_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + + - name: Dependabot metadata + id: dependabot-metadata + uses: dependabot/fetch-metadata@25dd0e34f4fe68f24cc83900b1fe3fe149efef98 # v3.1.0 + with: + github-token: "${{ steps.app-token.outputs.token }}" + + - name: Enable auto-merge for Dependabot PRs + if: steps.dependabot-metadata.outputs.update-type != 'version-update:semver-major' + run: | + if [ "$(gh pr status --json reviewDecision -q .currentBranch.reviewDecision)" != "APPROVED" ]; + then gh pr review --approve "$PR_URL" + else echo "PR already approved, skipping additional approvals to minimize emails/notification noise."; + fi + + gh pr merge --auto --squash "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..892eb1b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,43 @@ +name: Release + +on: + push: + branches: + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +permissions: + id-token: write # Required for OIDC + contents: write + pull-requests: write + +jobs: + release: + if: github.repository == 'webpack/webpack-sources' + name: Release + runs-on: ubuntu-latest + outputs: + published: ${{ steps.changesets.outputs.published }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Use Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: lts/* + cache: npm + + - run: npm ci + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@6a0a831ff30acef54f2c6aa1cbbc1096b066edaf # v1.7.0 + with: + version: npm run version + publish: npm run release + commit: "chore(release): new release" + title: "chore(release): new release" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: "" # https://github.com/changesets/changesets/issues/1152#issuecomment-3190884868 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1158afe..44ec62a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,40 +2,50 @@ name: Test on: push: - branches: - - main + branches: [main] pull_request: - branches: - - main + branches: [main] + +permissions: + contents: read jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + - name: Use Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: lts/* - cache: "npm" + cache: npm + - run: npm ci + - name: Cache eslint result - uses: actions/cache@v4 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: path: .eslintcache key: lint-eslint-${{ runner.os }}-node-${{ hashFiles('**/package-lock.json', '**/eslint.config.mjs') }} restore-keys: lint-eslint- + - run: npm run lint test: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x] + node-version: [10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x, 25.x] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 - - uses: actions/github-script@v7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + + - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 id: calculate_architecture with: result-encoding: string @@ -45,18 +55,39 @@ jobs: } else { return '' } + - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ matrix.node-version }} architecture: ${{ steps.calculate_architecture.outputs.result }} - cache: "npm" - - run: npm install - if: matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' - - run: npm ci - if: matrix.node-version != '10.x' && matrix.node-version != '12.x' && matrix.node-version != '14.x' - - run: npm run cover - - uses: codecov/codecov-action@v5 + cache: npm + + - name: Install dependencies + shell: bash + run: | + rm -f package-lock.json + + npm config set progress false + + if [ "${{ matrix.node-version }}" = "10.x" ]; then + yarn add -D jest@27 --ignore-scripts --ignore-engines + elif [ "${{ matrix.node-version }}" = "12.x" ] || [ "${{ matrix.node-version }}" = "14.x" ]; then + npm install -g npm@7 + npm install --save-dev jest@27 + else + npm install --save-dev jest@27 + fi + if: matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x' + + - name: Install dependencies + run: npm ci + if: matrix.node-version != '10.x' && matrix.node-version != '12.x' && matrix.node-version != '14.x' && matrix.node-version != '16.x' + + - name: Run tests with coverage + run: npm run test:coverage -- --ci + + - uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 with: flags: integration token: ${{ secrets.CODECOV_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..74e5b6c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# webpack-sources + +## 3.4.0 + +### Minor Changes + +- Add `Source.prototype.buffers()` that returns the source as `Buffer[]`. `ConcatSource`, `CachedSource`, and `CompatSource` implement it without allocating an intermediate concatenated buffer, allowing consumers that can write multiple buffers at once (e.g. via `writev`) to avoid the overhead of `Buffer.concat` in deeply nested sources. (by [@alexander-akait](https://github.com/alexander-akait) in [#204](https://github.com/webpack/webpack-sources/pull/204)) + +### Patch Changes + +- fix: use Int32Array for signed VLQ delta accumulation in `readMappings` so cumulative values that go negative are preserved instead of wrapping to a large unsigned integer (by [@alexander-akait](https://github.com/alexander-akait) in [#206](https://github.com/webpack/webpack-sources/pull/206)) + +- Improved performance in many places. (by [@alexander-akait](https://github.com/alexander-akait) in [#209](https://github.com/webpack/webpack-sources/pull/209)) diff --git a/README.md b/README.md index 14a2df4..bac006f 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,21 @@ Source.prototype.buffer() -> Buffer Returns the represented source code as Buffer. Strings are converted to utf-8. +#### `buffers` + + +```typescript +Source.prototype.buffers() -> Buffer[] +``` + +Returns the represented source code as an array of Buffers. This avoids the +intermediate `Buffer.concat` allocation performed by `buffer()` when the source +is composed of multiple children (for example `ConcatSource`). Consumers that +can accept an array of buffers (e.g. writing via `fs.createWriteStream` or +`writev`) should prefer this method for better performance. + +The default implementation returns `[this.buffer()]`. + #### `size` diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000..f1c56d1 --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,127 @@ +# Benchmarks + +Performance benchmarks for `webpack-sources`, tracked over time via +[CodSpeed](https://codspeed.io/). + +Runner stack: [tinybench](https://github.com/tinylibs/tinybench) + +[`@codspeed/core`](https://www.npmjs.com/package/@codspeed/core) with a local +`withCodSpeed()` wrapper ported from webpack's +`test/BenchmarkTestCases.benchmark.mjs` (also used by `enhanced-resolve`). +Locally it falls back to plain tinybench wall-clock measurements, and under +`CodSpeedHQ/action` in CI it automatically switches to CodSpeed's +instrumentation mode. + +## Running locally + +```sh +npm run benchmark +``` + +Optional substring filter to run only matching cases: + +```sh +npm run benchmark -- replace-source +BENCH_FILTER=source-map npm run benchmark +``` + +Locally the runner uses tinybench's wall-clock measurements and prints a +table of ops/s, mean, p99, and relative margin of error per task. Under CI, +the wrapper detects the CodSpeed runner environment and switches to +instruction-counting mode automatically. + +The V8 flags in `package.json` (`--no-opt --predictable --hash-seed=1` etc.) +are required by CodSpeed's instrumentation mode for deterministic results — +do not drop them. + +### Optional: running real instruction counts locally + +If you want to reproduce CI's exact instrument-count numbers on your own +machine (Linux only — the underlying Valgrind tooling has no macOS backend), +install the standalone CodSpeed CLI and wrap `npm run benchmark` with it: + +```sh +curl -fsSL https://codspeed.io/install.sh | bash +codspeed run npm run benchmark +``` + +This is only useful if you want to debug an instruction-count regression +outside CI. Day-to-day benchmark iteration should use `npm run benchmark` +directly (wall-clock mode). + +## Layout + +``` +benchmark/ +├── run.mjs # entry point: discovers cases, runs bench +├── with-codspeed.mjs # CodSpeed <-> tinybench bridge +├── fixtures.mjs # shared fixture loaders +└── cases/ + └── / + ├── index.bench.mjs # default export: register(bench, ctx) + └── fixture/ # optional: per-case input files +``` + +Each case directory must contain `index.bench.mjs` exporting a default +function with the signature: + +```js +export default function register(bench, { caseName, caseDir, fixtureDir }) { + bench.add("my case: descriptive name", () => { + // ... code to measure ... + }); +} +``` + +`fixtureDir` is the absolute path to the case's `fixture/` subdirectory +(which may or may not exist). `caseDir` is the parent directory containing +`index.bench.mjs`. + +Each task body should loop over a small batch of operations rather than +performing a single call — tinybench decides its own iteration count, so +we want the measurement to reflect per-batch throughput, which is more +stable than per-call timing for sub-microsecond work. + +## Existing cases + +### Per source class + +| Case | What it measures | +| ------------------- | -------------------------------------------------------------------------------- | +| `raw-source` | `RawSource` constructor, string/buffer accessors, streamChunks, updateHash | +| `original-source` | `OriginalSource` map/sourceAndMap/streamChunks across columns on/off combos | +| `replace-source` | `ReplaceSource` source/map/streamChunks for no, few, and many replacements | +| `concat-source` | `ConcatSource` _optimize, source/buffer/map, nested flattening, hash | +| `prefix-source` | `PrefixSource` delegation + newline prefix rewriting | +| `source-map-source` | `SourceMapSource` full + lines-only streamChunks, including combined inner maps | +| `cached-source` | `CachedSource` cold vs warm, plus `getCachedData()` round-trip | +| `compat-source` | `CompatSource` delegation vs `Source.prototype` fallback paths | +| `size-only-source` | `SizeOnlySource` constructor, `size()`, and the throw paths for other accessors | + +### Per helper module + +| Case | What it measures | +| ------------------------------------- | -------------------------------------------------------------------------- | +| `helpers-split-into-lines` | `splitIntoLines` scanner on fixture / big / long-line / empty inputs | +| `helpers-split-into-potential-tokens` | `splitIntoPotentialTokens` scanner used by column-aware OriginalSource | +| `helpers-get-generated-source-info` | `getGeneratedSourceInfo` final-line/column probe on various input shapes | +| `helpers-read-mappings` | VLQ decoder used by every source-map aware streamChunks path | +| `helpers-create-mappings-serializer` | VLQ encoder (full + lines-only) fed a representative event stream | +| `helpers-string-buffer-utils` | `internString` and enter/exitStringInterningRange | + +### End-to-end + +| Case | What it measures | +| --------------------------------- | ----------------------------------------------------------------------------- | +| `realistic-source-map-pipeline` | OriginalSource -> ReplaceSource -> ConcatSource -> CachedSource (cold + warm); also `buffer()` vs `buffers()` over the `CachedSource -> ConcatSource -> CachedSource -> ConcatSource` layering from issue #157 | + +## Adding a new case + +1. Create `benchmark/cases//index.bench.mjs`. +2. Export a default `register(bench, ctx)` function. Call `bench.add(name, fn)` + for each task. +3. If the case needs input files, place them under + `benchmark/cases//fixture/` and read them from `ctx.fixtureDir`. +4. Run `npm run benchmark -- ` to verify locally. + +Each task name should start with the case directory name (e.g. +`raw-source: source()`) so CodSpeed's report groups tasks by module. diff --git a/benchmark/cases/cached-source/index.bench.mjs b/benchmark/cases/cached-source/index.bench.mjs new file mode 100644 index 0000000..5ed15c7 --- /dev/null +++ b/benchmark/cases/cached-source/index.bench.mjs @@ -0,0 +1,259 @@ +/* + * cached-source + * + * Two axes matter for CachedSource: cold vs warm (first call vs repeat call + * on the same instance), and the cache-data round-trip that lets webpack + * store cached state to disk via getCachedData() / re-hydrate. + * + * Fixture lifetime policy: + * - Heavy fixtures (`warmed`, `warmedConcat`, `sink`) live inside + * beforeAll/afterAll hooks so they are GC'd between tasks. This keeps + * the V8 heap layout independent of how many tasks the file exports — + * adding a new task does not perturb pre-existing tasks' measurements. + * - Light fixtures (fixtureCode, fixtureMap) stay at module scope; they + * are immutable and cheap to retain. + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { fixtureCode, fixtureMap, noop } from "../../fixtures.mjs"; + +const CONSTRUCT_BATCH = 100; + +/** + * @returns {CachedSource} warmed CachedSource with all common caches populated + */ +function makeWarmed() { + const cached = new sources.CachedSource( + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap), + ); + cached.source(); + cached.map({}); + cached.sourceAndMap({}); + cached.buffer(); + cached.size(); + return cached; +} + +/** + * @returns {CachedSource} CachedSource wrapping a ConcatSource of 10 RawSources, + * with buffers() already populated + */ +function makeWarmedConcat() { + const parts = []; + for (let i = 0; i < 10; i++) parts.push(new sources.RawSource(fixtureCode)); + const cached = new sources.CachedSource(new sources.ConcatSource(...parts)); + cached.buffers(); + return cached; +} + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + /** @type {unknown[] | undefined} */ + let sink; + bench.add( + "cached-source: new CachedSource()", + () => { + const arr = /** @type {unknown[]} */ (sink); + for (let i = 0; i < CONSTRUCT_BATCH; i++) { + arr[i] = new sources.CachedSource(new sources.RawSource(fixtureCode)); + } + }, + { + beforeAll() { + sink = Array.from({ length: CONSTRUCT_BATCH }); + }, + afterAll() { + sink = undefined; + }, + }, + ); + + bench.add("cached-source: source() (cold)", () => { + for (let i = 0; i < 50; i++) { + new sources.CachedSource(new sources.RawSource(fixtureCode)).source(); + } + }); + + /** @type {CachedSource | undefined} */ + let warmed; + const warmedHooks = { + beforeAll() { + warmed = makeWarmed(); + }, + afterAll() { + warmed = undefined; + }, + }; + + bench.add( + "cached-source: source() (cached)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 500; i++) cs.source(); + }, + warmedHooks, + ); + + bench.add( + "cached-source: buffer() (cached)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 500; i++) cs.buffer(); + }, + warmedHooks, + ); + + bench.add( + "cached-source: buffers() (cached)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 500; i++) cs.buffers(); + }, + warmedHooks, + ); + + bench.add("cached-source: buffer() (cold, wraps ConcatSource x10)", () => { + for (let i = 0; i < 10; i++) { + const parts = []; + for (let j = 0; j < 10; j++) { + parts.push(new sources.RawSource(fixtureCode)); + } + new sources.CachedSource(new sources.ConcatSource(...parts)).buffer(); + } + }); + + bench.add("cached-source: buffers() (cold, wraps ConcatSource x10)", () => { + for (let i = 0; i < 10; i++) { + const parts = []; + for (let j = 0; j < 10; j++) { + parts.push(new sources.RawSource(fixtureCode)); + } + new sources.CachedSource(new sources.ConcatSource(...parts)).buffers(); + } + }); + + /** @type {CachedSource | undefined} */ + let warmedConcat; + const warmedConcatHooks = { + beforeAll() { + warmedConcat = makeWarmedConcat(); + }, + afterAll() { + warmedConcat = undefined; + }, + }; + + bench.add( + "cached-source: buffer() (warm, wraps ConcatSource x10)", + () => { + const cs = /** @type {CachedSource} */ (warmedConcat); + for (let i = 0; i < 500; i++) cs.buffer(); + }, + warmedConcatHooks, + ); + + bench.add( + "cached-source: buffers() (warm, wraps ConcatSource x10)", + () => { + const cs = /** @type {CachedSource} */ (warmedConcat); + for (let i = 0; i < 500; i++) cs.buffers(); + }, + warmedConcatHooks, + ); + + bench.add( + "cached-source: size() (cached)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 500; i++) cs.size(); + }, + warmedHooks, + ); + + bench.add("cached-source: map() (cold SourceMapSource)", () => { + for (let i = 0; i < 10; i++) { + new sources.CachedSource( + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap), + ).map({}); + } + }); + + bench.add( + "cached-source: map() (cached)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 500; i++) cs.map({}); + }, + warmedHooks, + ); + + bench.add("cached-source: sourceAndMap() (cold)", () => { + for (let i = 0; i < 10; i++) { + new sources.CachedSource( + new sources.OriginalSource(fixtureCode, "fixture.js"), + ).sourceAndMap({}); + } + }); + + bench.add( + "cached-source: sourceAndMap() (cached)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 500; i++) cs.sourceAndMap({}); + }, + warmedHooks, + ); + + bench.add("cached-source: streamChunks() (cold)", () => { + for (let i = 0; i < 5; i++) { + new sources.CachedSource( + new sources.OriginalSource(fixtureCode, "fixture.js"), + ).streamChunks({}, noop, noop, noop); + } + }); + + bench.add( + "cached-source: streamChunks() (warm)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 5; i++) { + cs.streamChunks({}, noop, noop, noop); + } + }, + warmedHooks, + ); + + bench.add("cached-source: originalLazy()", () => { + const lazy = new sources.CachedSource( + () => new sources.RawSource(fixtureCode), + ); + for (let i = 0; i < 500; i++) lazy.originalLazy(); + }); + + bench.add("cached-source: getCachedData() then restore", () => { + for (let i = 0; i < 10; i++) { + const a = new sources.CachedSource( + new sources.OriginalSource(fixtureCode, "fixture.js"), + ); + a.source(); + a.map({}); + const data = a.getCachedData(); + new sources.CachedSource( + new sources.OriginalSource(fixtureCode, "fixture.js"), + data, + ); + } + }); + + bench.add( + "cached-source: updateHash() (warm)", + () => { + const cs = /** @type {CachedSource} */ (warmed); + for (let i = 0; i < 50; i++) cs.updateHash(createHash("sha256")); + }, + warmedHooks, + ); +} diff --git a/benchmark/cases/compat-source/index.bench.mjs b/benchmark/cases/compat-source/index.bench.mjs new file mode 100644 index 0000000..8e392a2 --- /dev/null +++ b/benchmark/cases/compat-source/index.bench.mjs @@ -0,0 +1,197 @@ +/* + * compat-source + * + * CompatSource wraps a SourceLike. Interesting paths: the direct delegation + * (when the wrapped object provides buffer/size/map/updateHash) vs the + * Source.prototype fallback (when it doesn't). + * + * Fixture lifetime policy: SourceLike instances are built per-task in + * beforeAll hooks so their hidden-class state doesn't accumulate across + * tasks. Only the immutable fixtureCode string lives at module scope. + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { fixtureCode } from "../../fixtures.mjs"; + +/** @typedef {import("../../../lib/CompatSource").SourceLike} SourceLike */ + +const fixtureBuffer = Buffer.from(fixtureCode, "utf8"); + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + /** @type {SourceLike | undefined} */ + let sourceLike; + const sourceLikeHooks = { + beforeAll() { + sourceLike = { + source: () => fixtureCode, + buffer: () => fixtureBuffer, + }; + }, + afterAll() { + sourceLike = undefined; + }, + }; + + /** @type {SourceLike | undefined} */ + let richSourceLike; + const richHooks = { + beforeAll() { + richSourceLike = { + source: () => fixtureCode, + buffer: () => fixtureBuffer, + size: () => fixtureCode.length, + map: () => null, + sourceAndMap: () => ({ source: fixtureCode, map: null }), + updateHash: (hash) => { + hash.update(fixtureCode); + }, + }; + }, + afterAll() { + richSourceLike = undefined; + }, + }; + + bench.add("compat-source: CompatSource.from(Source)", () => { + const src = new sources.RawSource(fixtureCode); + for (let i = 0; i < 100; i++) sources.CompatSource.from(src); + }); + + bench.add( + "compat-source: CompatSource.from(SourceLike)", + () => { + const sl = /** @type {SourceLike} */ (sourceLike); + for (let i = 0; i < 100; i++) sources.CompatSource.from(sl); + }, + sourceLikeHooks, + ); + + bench.add( + "compat-source: source() (wrapping SourceLike)", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (sourceLike), + ); + for (let i = 0; i < 500; i++) cs.source(); + }, + sourceLikeHooks, + ); + + bench.add("compat-source: buffer() (fallback via super)", () => { + const cs = new sources.CompatSource({ source: () => fixtureCode }); + for (let i = 0; i < 50; i++) cs.buffer(); + }); + + bench.add( + "compat-source: buffer() (delegated)", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (sourceLike), + ); + for (let i = 0; i < 500; i++) cs.buffer(); + }, + sourceLikeHooks, + ); + + bench.add("compat-source: buffers() (fallback via super)", () => { + const cs = new sources.CompatSource({ source: () => fixtureCode }); + for (let i = 0; i < 50; i++) cs.buffers(); + }); + + /** @type {SourceLike | undefined} */ + let sourceLikeWithBuffers; + const sourceLikeWithBuffersHooks = { + beforeAll() { + const bufferArray = [fixtureBuffer]; + sourceLikeWithBuffers = { + source: () => fixtureCode, + buffer: () => fixtureBuffer, + buffers: () => bufferArray, + }; + }, + afterAll() { + sourceLikeWithBuffers = undefined; + }, + }; + + bench.add( + "compat-source: buffers() (delegated)", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (sourceLikeWithBuffers), + ); + for (let i = 0; i < 500; i++) cs.buffers(); + }, + sourceLikeWithBuffersHooks, + ); + + bench.add("compat-source: size() (fallback via super)", () => { + const cs = new sources.CompatSource({ source: () => fixtureCode }); + for (let i = 0; i < 50; i++) cs.size(); + }); + + bench.add( + "compat-source: size() (delegated)", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (richSourceLike), + ); + for (let i = 0; i < 500; i++) cs.size(); + }, + richHooks, + ); + + bench.add( + "compat-source: map()", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (richSourceLike), + ); + for (let i = 0; i < 500; i++) cs.map({}); + }, + richHooks, + ); + + bench.add( + "compat-source: sourceAndMap()", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (richSourceLike), + ); + for (let i = 0; i < 500; i++) cs.sourceAndMap({}); + }, + richHooks, + ); + + bench.add( + "compat-source: updateHash() (delegated)", + () => { + const cs = new sources.CompatSource( + /** @type {SourceLike} */ (richSourceLike), + ); + for (let i = 0; i < 20; i++) cs.updateHash(createHash("sha256")); + }, + richHooks, + ); + + bench.add("compat-source: updateHash() (fallback)", () => { + const cs = new sources.CompatSource({ source: () => fixtureCode }); + for (let i = 0; i < 20; i++) cs.updateHash(createHash("sha256")); + }); + + bench.add("compat-source: wraps OriginalSource", () => { + for (let i = 0; i < 20; i++) { + const cs = new sources.CompatSource( + new sources.OriginalSource(fixtureCode, "fix.js"), + ); + cs.source(); + cs.buffer(); + cs.size(); + cs.map({}); + } + }); +} diff --git a/benchmark/cases/concat-source/index.bench.mjs b/benchmark/cases/concat-source/index.bench.mjs new file mode 100644 index 0000000..1f58ebf --- /dev/null +++ b/benchmark/cases/concat-source/index.bench.mjs @@ -0,0 +1,218 @@ +/* + * concat-source + * + * ConcatSource is the bread-and-butter composition primitive used by + * webpack. We cover the construction/optimize path, the three output + * representations (source/buffer/map), and the common case where a + * SourceMapSource or nested ConcatSource participates in streaming. + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { fixtureCode, fixtureMap, noop } from "../../fixtures.mjs"; + +/** + * @returns {ConcatSource} mixed 4-child ConcatSource + */ +function buildMixed() { + return new sources.ConcatSource( + new sources.RawSource("// header\n"), + new sources.OriginalSource(fixtureCode, "a.js"), + "\n// middle\n", + new sources.OriginalSource(fixtureCode, "b.js"), + ); +} + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("concat-source: new ConcatSource() (10 raw)", () => { + for (let iter = 0; iter < 20; iter++) { + const parts = []; + for (let i = 0; i < 10; i++) { + parts.push(new sources.RawSource(fixtureCode)); + } + new sources.ConcatSource(...parts); + } + }); + + bench.add("concat-source: new ConcatSource() (strings)", () => { + for (let i = 0; i < 100; i++) { + new sources.ConcatSource("a", "b", "c", "d", "e", "f"); + } + }); + + bench.add("concat-source: add() x50", () => { + const cs = new sources.ConcatSource(); + for (let i = 0; i < 50; i++) cs.add(new sources.RawSource(fixtureCode)); + }); + + bench.add("concat-source: addAllSkipOptimizing()", () => { + const cs = new sources.ConcatSource(); + const parts = []; + for (let i = 0; i < 50; i++) parts.push(new sources.RawSource(fixtureCode)); + cs.addAllSkipOptimizing(parts); + }); + + bench.add("concat-source: source() (10 raw)", () => { + const parts = []; + for (let i = 0; i < 10; i++) parts.push(new sources.RawSource(fixtureCode)); + const cs = new sources.ConcatSource(...parts); + for (let i = 0; i < 10; i++) cs.source(); + }); + + bench.add("concat-source: source() (mixed)", () => { + const cs = buildMixed(); + for (let i = 0; i < 10; i++) cs.source(); + }); + + /** + * @returns {ConcatSource} flat ConcatSource over 10 RawSource(fixtureCode) + */ + function buildFlat10() { + const parts = []; + for (let i = 0; i < 10; i++) { + parts.push(new sources.RawSource(fixtureCode)); + } + return new sources.ConcatSource(...parts); + } + + /** + * @returns {ConcatSource} nested 4x10 ConcatSource + */ + function buildNested4x10() { + const makeInner = () => { + const parts = []; + for (let i = 0; i < 10; i++) { + parts.push(new sources.RawSource(fixtureCode)); + } + return new sources.ConcatSource(...parts); + }; + return new sources.ConcatSource( + makeInner(), + makeInner(), + makeInner(), + makeInner(), + ); + } + + /** @type {ConcatSource | undefined} */ + let flat10; + const flat10Hooks = { + beforeAll() { + flat10 = buildFlat10(); + }, + afterAll() { + flat10 = undefined; + }, + }; + + bench.add( + "concat-source: buffer() (10 raw)", + () => { + const cs = /** @type {ConcatSource} */ (flat10); + for (let i = 0; i < 10; i++) cs.buffer(); + }, + flat10Hooks, + ); + + bench.add( + "concat-source: buffers() (10 raw)", + () => { + const cs = /** @type {ConcatSource} */ (flat10); + for (let i = 0; i < 10; i++) cs.buffers(); + }, + flat10Hooks, + ); + + /** @type {ConcatSource | undefined} */ + let nested4x10; + const nested4x10Hooks = { + beforeAll() { + nested4x10 = buildNested4x10(); + }, + afterAll() { + nested4x10 = undefined; + }, + }; + + bench.add( + "concat-source: buffer() (nested 4x10 raw)", + () => { + const cs = /** @type {ConcatSource} */ (nested4x10); + for (let i = 0; i < 5; i++) cs.buffer(); + }, + nested4x10Hooks, + ); + + bench.add( + "concat-source: buffers() (nested 4x10 raw)", + () => { + const cs = /** @type {ConcatSource} */ (nested4x10); + for (let i = 0; i < 5; i++) cs.buffers(); + }, + nested4x10Hooks, + ); + + bench.add("concat-source: size()", () => { + const cs = buildMixed(); + for (let i = 0; i < 10; i++) cs.size(); + }); + + bench.add("concat-source: getChildren()", () => { + const cs = buildMixed(); + for (let i = 0; i < 100; i++) cs.getChildren(); + }); + + bench.add("concat-source: map()", () => { + for (let i = 0; i < 5; i++) buildMixed().map({}); + }); + + bench.add("concat-source: sourceAndMap()", () => { + for (let i = 0; i < 5; i++) buildMixed().sourceAndMap({}); + }); + + bench.add("concat-source: streamChunks() (mixed)", () => { + for (let i = 0; i < 5; i++) { + buildMixed().streamChunks({}, noop, noop, noop); + } + }); + + bench.add("concat-source: streamChunks({finalSource:true})", () => { + for (let i = 0; i < 5; i++) { + buildMixed().streamChunks({ finalSource: true }, noop, noop, noop); + } + }); + + bench.add("concat-source: streamChunks() with SourceMapSource child", () => { + for (let i = 0; i < 5; i++) { + const cs = new sources.ConcatSource( + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap), + new sources.RawSource("// trailer\n"), + ); + cs.streamChunks({}, noop, noop, noop); + } + }); + + bench.add("concat-source: nested flattening", () => { + for (let i = 0; i < 50; i++) { + const inner = new sources.ConcatSource( + new sources.RawSource("a"), + new sources.RawSource("b"), + new sources.RawSource("c"), + ); + new sources.ConcatSource( + inner, + new sources.RawSource("d"), + inner, + ).source(); + } + }); + + bench.add("concat-source: updateHash()", () => { + for (let i = 0; i < 10; i++) { + buildMixed().updateHash(createHash("sha256")); + } + }); +} diff --git a/benchmark/cases/helpers-create-mappings-serializer/index.bench.mjs b/benchmark/cases/helpers-create-mappings-serializer/index.bench.mjs new file mode 100644 index 0000000..bc1cbda --- /dev/null +++ b/benchmark/cases/helpers-create-mappings-serializer/index.bench.mjs @@ -0,0 +1,61 @@ +/* + * helpers: createMappingsSerializer + * + * Encodes VLQ mappings for getMap / sourceAndMap. Benchmarks feed a + * representative stream of fake mapping events against both the full + * (column-aware) and the lines-only serializers. + */ + +import createMappingsSerializer from "../../../lib/helpers/createMappingsSerializer.js"; + +/** + * Build a deterministic stream of mapping events that resembles what the + * source-map aware code paths feed through the serializer. + * @param {number} n number of events + * @returns {[number, number, number, number, number, number][]} events + */ +function buildEventStream(n) { + const events = []; + for (let i = 0; i < n; i++) { + const generatedLine = Math.floor(i / 20) + 1; + const generatedColumn = (i % 20) * 4; + const sourceIndex = i % 3; + const originalLine = Math.floor(i / 10) + 1; + const originalColumn = (i % 10) * 3; + const nameIndex = i % 5 === 0 ? i % 4 : -1; + events.push([ + generatedLine, + generatedColumn, + sourceIndex, + originalLine, + originalColumn, + nameIndex, + ]); + } + return events; +} + +const events = buildEventStream(5000); + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("helpers/createMappingsSerializer: full serializer", () => { + const addMapping = createMappingsSerializer(); + let out = ""; + for (const [gl, gc, si, ol, oc, ni] of events) { + out += addMapping(gl, gc, si, ol, oc, ni); + } + if (out.length === 0) throw new Error("unreachable"); + }); + + bench.add("helpers/createMappingsSerializer: lines-only serializer", () => { + const addMapping = createMappingsSerializer({ columns: false }); + let out = ""; + for (const [gl, gc, si, ol, oc, ni] of events) { + out += addMapping(gl, gc, si, ol, oc, ni); + } + if (out.length === 0) throw new Error("unreachable"); + }); +} diff --git a/benchmark/cases/helpers-get-generated-source-info/index.bench.mjs b/benchmark/cases/helpers-get-generated-source-info/index.bench.mjs new file mode 100644 index 0000000..4000975 --- /dev/null +++ b/benchmark/cases/helpers-get-generated-source-info/index.bench.mjs @@ -0,0 +1,30 @@ +/* + * helpers: getGeneratedSourceInfo + * + * Quick scanner that returns the final line/column of a source. The hot + * path on big sources was optimised to use String#indexOf in a loop. + */ + +import getGeneratedSourceInfo from "../../../lib/helpers/getGeneratedSourceInfo.js"; +import { bigSource, fixtureCode } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("helpers/getGeneratedSourceInfo: fixture", () => { + for (let i = 0; i < 100; i++) getGeneratedSourceInfo(fixtureCode); + }); + + bench.add("helpers/getGeneratedSourceInfo: big source", () => { + getGeneratedSourceInfo(bigSource); + }); + + bench.add("helpers/getGeneratedSourceInfo: single line", () => { + for (let i = 0; i < 10000; i++) getGeneratedSourceInfo("const a = 1;"); + }); + + bench.add("helpers/getGeneratedSourceInfo: undefined", () => { + for (let i = 0; i < 10000; i++) getGeneratedSourceInfo(undefined); + }); +} diff --git a/benchmark/cases/helpers-read-mappings/index.bench.mjs b/benchmark/cases/helpers-read-mappings/index.bench.mjs new file mode 100644 index 0000000..0a8c920 --- /dev/null +++ b/benchmark/cases/helpers-read-mappings/index.bench.mjs @@ -0,0 +1,30 @@ +/* + * helpers: readMappings + * + * The VLQ decoder used by every source-map aware code path. Measured + * separately so instruction-count regressions in the decoder itself are + * visible without the per-chunk onMapping overhead that streamChunksOf* + * adds. + */ + +import readMappings from "../../../lib/helpers/readMappings.js"; +import { fixtureMap, noop } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + const { mappings } = fixtureMap; + + bench.add("helpers/readMappings: fixture (noop callback)", () => { + for (let i = 0; i < 20; i++) readMappings(mappings, noop); + }); + + bench.add("helpers/readMappings: fixture (counting callback)", () => { + let n = 0; + readMappings(mappings, () => { + n++; + }); + if (n < 0) throw new Error("unreachable"); + }); +} diff --git a/benchmark/cases/helpers-split-into-lines/index.bench.mjs b/benchmark/cases/helpers-split-into-lines/index.bench.mjs new file mode 100644 index 0000000..5c30b5c --- /dev/null +++ b/benchmark/cases/helpers-split-into-lines/index.bench.mjs @@ -0,0 +1,31 @@ +/* + * helpers: splitIntoLines + * + * Core scanning primitive used by every streaming code path. We cover the + * fixture, a synthetic many-lines source, a few-very-long-lines source, + * and the empty-string fast path. + */ + +import splitIntoLines from "../../../lib/helpers/splitIntoLines.js"; +import { bigSource, fixtureCode, longLineSource } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("helpers/splitIntoLines: fixture", () => { + for (let i = 0; i < 100; i++) splitIntoLines(fixtureCode); + }); + + bench.add("helpers/splitIntoLines: big source", () => { + splitIntoLines(bigSource); + }); + + bench.add("helpers/splitIntoLines: long lines", () => { + for (let i = 0; i < 100; i++) splitIntoLines(longLineSource); + }); + + bench.add("helpers/splitIntoLines: empty", () => { + for (let i = 0; i < 10000; i++) splitIntoLines(""); + }); +} diff --git a/benchmark/cases/helpers-split-into-potential-tokens/index.bench.mjs b/benchmark/cases/helpers-split-into-potential-tokens/index.bench.mjs new file mode 100644 index 0000000..6ebdde2 --- /dev/null +++ b/benchmark/cases/helpers-split-into-potential-tokens/index.bench.mjs @@ -0,0 +1,22 @@ +/* + * helpers: splitIntoPotentialTokens + * + * Used by OriginalSource when column-aware mappings are requested. Scans + * for \n ; { } and runs of separator characters. + */ + +import splitIntoPotentialTokens from "../../../lib/helpers/splitIntoPotentialTokens.js"; +import { bigSource, fixtureCode } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("helpers/splitIntoPotentialTokens: fixture", () => { + for (let i = 0; i < 20; i++) splitIntoPotentialTokens(fixtureCode); + }); + + bench.add("helpers/splitIntoPotentialTokens: big source", () => { + splitIntoPotentialTokens(bigSource); + }); +} diff --git a/benchmark/cases/helpers-string-buffer-utils/index.bench.mjs b/benchmark/cases/helpers-string-buffer-utils/index.bench.mjs new file mode 100644 index 0000000..912d611 --- /dev/null +++ b/benchmark/cases/helpers-string-buffer-utils/index.bench.mjs @@ -0,0 +1,34 @@ +/* + * helpers: stringBufferUtils + * + * Measures internString() with and without an active interning range + * (which is what webpack toggles around layer transitions). + */ + +import stringBufferUtils from "../../../lib/helpers/stringBufferUtils.js"; +import { fixtureCode } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("helpers/stringBufferUtils: internString (disabled)", () => { + for (let i = 0; i < 500; i++) stringBufferUtils.internString(fixtureCode); + }); + + bench.add("helpers/stringBufferUtils: internString (enabled)", () => { + stringBufferUtils.enterStringInterningRange(); + try { + for (let i = 0; i < 500; i++) stringBufferUtils.internString(fixtureCode); + } finally { + stringBufferUtils.exitStringInterningRange(); + } + }); + + bench.add("helpers/stringBufferUtils: enter/exit interning range", () => { + for (let i = 0; i < 500; i++) { + stringBufferUtils.enterStringInterningRange(); + stringBufferUtils.exitStringInterningRange(); + } + }); +} diff --git a/benchmark/cases/original-source/index.bench.mjs b/benchmark/cases/original-source/index.bench.mjs new file mode 100644 index 0000000..0ebaebc --- /dev/null +++ b/benchmark/cases/original-source/index.bench.mjs @@ -0,0 +1,148 @@ +/* + * original-source + * + * OriginalSource is the common entry point for files that have no prior + * source map; its streaming path goes through splitIntoPotentialTokens + * (for column-aware output) or splitIntoLines (for lines-only). + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { + bigSource, + fixtureBuffer, + fixtureCode, + noop, +} from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("original-source: new OriginalSource(string)", () => { + for (let i = 0; i < 50; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js"); + } + }); + + bench.add("original-source: new OriginalSource(buffer)", () => { + for (let i = 0; i < 50; i++) { + new sources.OriginalSource(fixtureBuffer, "fixture.js"); + } + }); + + bench.add("original-source: source()", () => { + for (let i = 0; i < 50; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").source(); + } + }); + + bench.add("original-source: buffer()", () => { + for (let i = 0; i < 50; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").buffer(); + } + }); + + bench.add("original-source: size()", () => { + for (let i = 0; i < 50; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").size(); + } + }); + + bench.add("original-source: getName()", () => { + const src = new sources.OriginalSource(fixtureCode, "fixture.js"); + for (let i = 0; i < 500; i++) src.getName(); + }); + + bench.add("original-source: map()", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").map({}); + } + }); + + bench.add("original-source: map({columns:false})", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").map({ + columns: false, + }); + } + }); + + bench.add("original-source: sourceAndMap()", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").sourceAndMap({}); + } + }); + + bench.add("original-source: sourceAndMap({columns:false})", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").sourceAndMap({ + columns: false, + }); + } + }); + + bench.add("original-source: streamChunks()", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").streamChunks( + {}, + noop, + noop, + noop, + ); + } + }); + + bench.add("original-source: streamChunks({columns:false})", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").streamChunks( + { columns: false }, + noop, + noop, + noop, + ); + } + }); + + bench.add("original-source: streamChunks({finalSource:true})", () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").streamChunks( + { finalSource: true }, + noop, + noop, + noop, + ); + } + }); + + bench.add( + "original-source: streamChunks({finalSource:true,columns:false})", + () => { + for (let i = 0; i < 10; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").streamChunks( + { finalSource: true, columns: false }, + noop, + noop, + noop, + ); + } + }, + ); + + bench.add("original-source: streamChunks() (big source)", () => { + new sources.OriginalSource(bigSource, "big.js").streamChunks( + {}, + noop, + noop, + noop, + ); + }); + + bench.add("original-source: updateHash()", () => { + for (let i = 0; i < 20; i++) { + new sources.OriginalSource(fixtureCode, "fixture.js").updateHash( + createHash("sha256"), + ); + } + }); +} diff --git a/benchmark/cases/prefix-source/index.bench.mjs b/benchmark/cases/prefix-source/index.bench.mjs new file mode 100644 index 0000000..3fd8a6f --- /dev/null +++ b/benchmark/cases/prefix-source/index.bench.mjs @@ -0,0 +1,123 @@ +/* + * prefix-source + * + * PrefixSource delegates most work to its child. The interesting paths are + * source() (regex replace of \n) and streamChunks() (per-chunk column + * adjustment with special-casing for column==0). + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { fixtureCode, fixtureMap, noop } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("prefix-source: new PrefixSource(str, string)", () => { + for (let i = 0; i < 100; i++) new sources.PrefixSource("\t", fixtureCode); + }); + + bench.add("prefix-source: new PrefixSource(str, Source)", () => { + for (let i = 0; i < 100; i++) { + new sources.PrefixSource( + "\t", + new sources.OriginalSource(fixtureCode, "fixture.js"), + ); + } + }); + + bench.add("prefix-source: getPrefix()", () => { + const ps = new sources.PrefixSource("\t", fixtureCode); + let sink = 0; + for (let i = 0; i < 50_000; i++) sink ^= ps.getPrefix().length; + if (sink === -1) throw new Error("unreachable"); + }); + + bench.add("prefix-source: original()", () => { + const ps = new sources.PrefixSource( + "\t", + new sources.RawSource(fixtureCode), + ); + let sink = 0; + for (let i = 0; i < 50_000; i++) sink ^= ps.original() === ps ? 1 : 0; + if (sink === -1) throw new Error("unreachable"); + }); + + bench.add("prefix-source: source() (RawSource child)", () => { + const ps = new sources.PrefixSource( + "\t", + new sources.RawSource(fixtureCode), + ); + for (let i = 0; i < 10; i++) ps.source(); + }); + + bench.add("prefix-source: source() (OriginalSource child)", () => { + const ps = new sources.PrefixSource( + "\t", + new sources.OriginalSource(fixtureCode, "fixture.js"), + ); + for (let i = 0; i < 10; i++) ps.source(); + }); + + bench.add("prefix-source: buffer()", () => { + const ps = new sources.PrefixSource( + "\t", + new sources.RawSource(fixtureCode), + ); + for (let i = 0; i < 10; i++) ps.buffer(); + }); + + bench.add("prefix-source: size()", () => { + const ps = new sources.PrefixSource( + "\t", + new sources.RawSource(fixtureCode), + ); + for (let i = 0; i < 10; i++) ps.size(); + }); + + bench.add("prefix-source: map()", () => { + for (let i = 0; i < 5; i++) { + new sources.PrefixSource( + "\t", + new sources.OriginalSource(fixtureCode, "fixture.js"), + ).map({}); + } + }); + + bench.add("prefix-source: sourceAndMap()", () => { + for (let i = 0; i < 5; i++) { + new sources.PrefixSource( + "\t", + new sources.OriginalSource(fixtureCode, "fixture.js"), + ).sourceAndMap({}); + } + }); + + bench.add("prefix-source: streamChunks()", () => { + for (let i = 0; i < 5; i++) { + new sources.PrefixSource( + "\t", + new sources.OriginalSource(fixtureCode, "fixture.js"), + ).streamChunks({}, noop, noop, noop); + } + }); + + bench.add("prefix-source: streamChunks() with SourceMapSource child", () => { + for (let i = 0; i < 5; i++) { + new sources.PrefixSource( + " ", + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap), + ).streamChunks({}, noop, noop, noop); + } + }); + + bench.add("prefix-source: updateHash()", () => { + for (let i = 0; i < 10; i++) { + new sources.PrefixSource( + "\t", + new sources.OriginalSource(fixtureCode, "fixture.js"), + ).updateHash(createHash("sha256")); + } + }); +} diff --git a/benchmark/cases/raw-source/index.bench.mjs b/benchmark/cases/raw-source/index.bench.mjs new file mode 100644 index 0000000..f5acb7b --- /dev/null +++ b/benchmark/cases/raw-source/index.bench.mjs @@ -0,0 +1,87 @@ +/* + * raw-source + * + * Exercises every method on RawSource across both string and Buffer input + * variants. Each task body runs a small batch so that the reported + * throughput reflects per-batch cost rather than per-op overhead. + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { fixtureBuffer, fixtureCode, noop } from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("raw-source: new RawSource(string)", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode); + }); + + bench.add("raw-source: new RawSource(buffer)", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureBuffer); + }); + + bench.add("raw-source: new RawSource(buffer, true)", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureBuffer, true); + }); + + bench.add("raw-source: source() (string)", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode).source(); + }); + + bench.add("raw-source: source() cached", () => { + const src = new sources.RawSource(fixtureCode); + for (let i = 0; i < 500; i++) src.source(); + }); + + bench.add("raw-source: buffer() (from string)", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode).buffer(); + }); + + bench.add("raw-source: buffer() (from buffer)", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureBuffer).buffer(); + }); + + bench.add("raw-source: size()", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode).size(); + }); + + bench.add("raw-source: isBuffer()", () => { + const src = new sources.RawSource(fixtureBuffer); + for (let i = 0; i < 500; i++) src.isBuffer(); + }); + + bench.add("raw-source: map()", () => { + for (let i = 0; i < 50; i++) new sources.RawSource(fixtureCode).map({}); + }); + + bench.add("raw-source: sourceAndMap()", () => { + for (let i = 0; i < 50; i++) { + new sources.RawSource(fixtureCode).sourceAndMap({}); + } + }); + + bench.add("raw-source: streamChunks()", () => { + for (let i = 0; i < 20; i++) { + new sources.RawSource(fixtureCode).streamChunks({}, noop, noop, noop); + } + }); + + bench.add("raw-source: streamChunks({finalSource:true})", () => { + for (let i = 0; i < 20; i++) { + new sources.RawSource(fixtureCode).streamChunks( + { finalSource: true }, + noop, + noop, + noop, + ); + } + }); + + bench.add("raw-source: updateHash()", () => { + for (let i = 0; i < 20; i++) { + new sources.RawSource(fixtureCode).updateHash(createHash("sha256")); + } + }); +} diff --git a/benchmark/cases/realistic-source-map-pipeline/index.bench.mjs b/benchmark/cases/realistic-source-map-pipeline/index.bench.mjs new file mode 100644 index 0000000..5efebc9 --- /dev/null +++ b/benchmark/cases/realistic-source-map-pipeline/index.bench.mjs @@ -0,0 +1,214 @@ +/* + * realistic-source-map-pipeline + * + * Mimics a slice of what happens inside webpack's SourceFactory: an + * OriginalSource is wrapped in a ReplaceSource (per-module patching) and + * then several of those go through a ConcatSource, finally wrapped in a + * CachedSource for reuse across compilations. We measure both the cold + * pipeline (fresh objects, fresh caches) and the warm one (CachedSource + * reuse across calls). + * + * This is the case that most directly reflects "compile one chunk" cost. + * + * Fixture lifetime policy: warm fixtures are built in beforeAll hooks + * scoped to the tasks that need them (not at module scope) so that adding + * a new task to this file does not perturb pre-existing measurements. + */ + +import sources from "../../../lib/index.js"; +import { fixtureCode, fixtureMap } from "../../fixtures.mjs"; + +/** + * @returns {ConcatSource} source + */ +function buildFreshChunk() { + const parts = []; + for (let i = 0; i < 4; i++) { + const orig = new sources.OriginalSource(fixtureCode, `m${i}.js`); + const replaced = new sources.ReplaceSource(orig); + replaced.replace(0, 6, "/* h */"); + replaced.insert(100, "// injected\n"); + parts.push(replaced); + } + parts.push( + new sources.SourceMapSource(fixtureCode, "bundled.js", fixtureMap), + ); + return new sources.ConcatSource( + new sources.RawSource("/* chunk header */\n"), + ...parts, + new sources.RawSource("/* chunk footer */\n"), + ); +} + +/** + * @returns {CachedSource} warm CachedSource with source/map/buffer populated + */ +function buildWarmChunk() { + const cached = new sources.CachedSource(buildFreshChunk()); + cached.source(); + cached.map({}); + cached.sourceAndMap({}); + cached.buffer(); + cached.size(); + return cached; +} + +/* + * Reproduces the layering pattern called out in + * https://github.com/webpack/webpack-sources/issues/157: + * + * CachedSource -> ConcatSource -> CachedSource -> ConcatSource + * + * At every ConcatSource boundary, the legacy `buffer()` path calls + * Buffer.concat on the children's buffers, which copies all of the bytes + * through each layer. `buffers()` returns Buffer[] without concatenating, + * so the wrapping CachedSource can pass the chunks through to the consumer + * (e.g. fs.createWriteStream / writev) without ever materializing a single + * contiguous Buffer. + * + * Each inner chunk is ~5 raw sources of fixtureCode, the outer chunk stitches + * 4 of them together, mirroring "chunk-of-modules" nesting depth. + */ +/** + * @returns {CachedSource} cached source + */ +function buildLayeredChunk() { + const inner = []; + for (let i = 0; i < 4; i++) { + const parts = []; + for (let j = 0; j < 5; j++) { + parts.push(new sources.RawSource(fixtureCode)); + } + inner.push(new sources.CachedSource(new sources.ConcatSource(...parts))); + } + return new sources.CachedSource( + new sources.ConcatSource( + new sources.RawSource("/* outer header */\n"), + ...inner, + new sources.RawSource("/* outer footer */\n"), + ), + ); +} + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add( + "realistic-source-map-pipeline: cold sourceAndMap() (fresh pipeline)", + () => { + const chunk = new sources.CachedSource(buildFreshChunk()); + chunk.sourceAndMap({}); + }, + ); + + /** @type {CachedSource | undefined} */ + let warmChunk; + const warmChunkHooks = { + beforeAll() { + warmChunk = buildWarmChunk(); + }, + afterAll() { + warmChunk = undefined; + }, + }; + + bench.add( + "realistic-source-map-pipeline: warm sourceAndMap() (reuse CachedSource)", + () => { + const chunk = /** @type {CachedSource} */ (warmChunk); + for (let i = 0; i < 50; i++) chunk.sourceAndMap({}); + }, + warmChunkHooks, + ); + + bench.add("realistic-source-map-pipeline: cold map() only", () => { + const chunk = new sources.CachedSource(buildFreshChunk()); + chunk.map({}); + }); + + bench.add("realistic-source-map-pipeline: cold source() only", () => { + const chunk = new sources.CachedSource(buildFreshChunk()); + chunk.source(); + }); + + bench.add( + "realistic-source-map-pipeline: serialize through getCachedData()", + () => { + const chunk = new sources.CachedSource(buildFreshChunk()); + chunk.source(); + chunk.map({}); + const data = chunk.getCachedData(); + new sources.CachedSource(buildFreshChunk(), data).sourceAndMap({}); + }, + ); + + bench.add( + "realistic-source-map-pipeline: streamChunks() (columns on)", + () => { + buildFreshChunk().streamChunks( + { columns: true }, + () => {}, + () => {}, + () => {}, + ); + }, + ); + + bench.add( + "realistic-source-map-pipeline: streamChunks() (columns off)", + () => { + buildFreshChunk().streamChunks( + { columns: false }, + () => {}, + () => {}, + () => {}, + ); + }, + ); + + bench.add( + "realistic-source-map-pipeline: cold buffer() (Cached->Concat->Cached->Concat)", + () => { + buildLayeredChunk().buffer(); + }, + ); + + bench.add( + "realistic-source-map-pipeline: cold buffers() (Cached->Concat->Cached->Concat)", + () => { + buildLayeredChunk().buffers(); + }, + ); + + /** @type {CachedSource | undefined} */ + let warmLayeredChunk; + const warmLayeredHooks = { + beforeAll() { + const chunk = buildLayeredChunk(); + chunk.buffers(); + warmLayeredChunk = chunk; + }, + afterAll() { + warmLayeredChunk = undefined; + }, + }; + + bench.add( + "realistic-source-map-pipeline: warm buffer() (Cached->Concat->Cached->Concat)", + () => { + const chunk = /** @type {CachedSource} */ (warmLayeredChunk); + for (let i = 0; i < 50; i++) chunk.buffer(); + }, + warmLayeredHooks, + ); + + bench.add( + "realistic-source-map-pipeline: warm buffers() (Cached->Concat->Cached->Concat)", + () => { + const chunk = /** @type {CachedSource} */ (warmLayeredChunk); + for (let i = 0; i < 50; i++) chunk.buffers(); + }, + warmLayeredHooks, + ); +} diff --git a/benchmark/cases/replace-source/index.bench.mjs b/benchmark/cases/replace-source/index.bench.mjs new file mode 100644 index 0000000..d9c2067 --- /dev/null +++ b/benchmark/cases/replace-source/index.bench.mjs @@ -0,0 +1,153 @@ +/* + * replace-source + * + * Covers ReplaceSource across the relevant cardinalities: no replacements + * (pass-through), a handful of large-range replacements, and many small + * overlapping replacements. The last is the interesting one for the + * `source()` hot path optimised in this branch. + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { bigSource, fixtureCode, noop, smallSource } from "../../fixtures.mjs"; + +/** + * @param {number} count count + * @returns {ReplaceSource} source + */ +function buildManyReplacements(count) { + const src = new sources.ReplaceSource( + new sources.OriginalSource(bigSource, "big.js"), + ); + let idx = bigSource.indexOf("value"); + let i = 0; + while (idx !== -1 && i < count) { + src.replace(idx, idx + 4, "v", "value"); + idx = bigSource.indexOf("value", idx + 5); + i++; + } + return src; +} + +/** + * @returns {ReplaceSource} source + */ +function buildFewLargeReplacements() { + const src = new sources.ReplaceSource( + new sources.OriginalSource(bigSource, "big.js"), + ); + src.replace(100, 500, "/* replaced */"); + src.replace(5000, 8000, "/* replaced */"); + src.replace(20000, 30000, "/* replaced */"); + return src; +} + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("replace-source: new ReplaceSource()", () => { + for (let i = 0; i < 100; i++) { + new sources.ReplaceSource(new sources.RawSource(fixtureCode)); + } + }); + + bench.add("replace-source: replace() x1000", () => { + const src = new sources.ReplaceSource( + new sources.OriginalSource(bigSource, "big.js"), + ); + for (let i = 0; i < 1000; i++) src.replace(i * 10, i * 10 + 3, "x"); + }); + + bench.add("replace-source: insert() x1000", () => { + const src = new sources.ReplaceSource( + new sources.OriginalSource(bigSource, "big.js"), + ); + for (let i = 0; i < 1000; i++) src.insert(i * 10, "y"); + }); + + bench.add("replace-source: source() (no replacements)", () => { + for (let i = 0; i < 100; i++) { + new sources.ReplaceSource(new sources.RawSource(fixtureCode)).source(); + } + }); + + bench.add("replace-source: source() (small, 1 replacement)", () => { + for (let i = 0; i < 100; i++) { + const src = new sources.ReplaceSource(new sources.RawSource(smallSource)); + src.replace(0, 7, "var"); + src.source(); + } + }); + + bench.add("replace-source: source() (1000 small replacements)", () => { + buildManyReplacements(1000).source(); + }); + + bench.add("replace-source: source() (few large replacements)", () => { + buildFewLargeReplacements().source(); + }); + + bench.add("replace-source: size() (1000 small replacements)", () => { + buildManyReplacements(1000).size(); + }); + + bench.add("replace-source: buffer() (1000 small replacements)", () => { + buildManyReplacements(1000).buffer(); + }); + + bench.add("replace-source: map() (no replacements)", () => { + for (let i = 0; i < 10; i++) { + new sources.ReplaceSource( + new sources.OriginalSource(fixtureCode, "fix.js"), + ).map({}); + } + }); + + bench.add("replace-source: map()", () => { + for (let i = 0; i < 10; i++) { + const src = new sources.ReplaceSource( + new sources.OriginalSource(fixtureCode, "fix.js"), + ); + src.replace(0, 10, "/* hdr */"); + src.insert(200, "// inj\n"); + src.map({}); + } + }); + + bench.add("replace-source: sourceAndMap()", () => { + for (let i = 0; i < 10; i++) { + const src = new sources.ReplaceSource( + new sources.OriginalSource(fixtureCode, "fix.js"), + ); + src.replace(0, 10, "/* hdr */"); + src.insert(200, "// inj\n"); + src.sourceAndMap({}); + } + }); + + bench.add("replace-source: streamChunks() (1000 replacements)", () => { + buildManyReplacements(1000).streamChunks({}, noop, noop, noop); + }); + + bench.add("replace-source: getReplacements()", () => { + buildManyReplacements(1000).getReplacements(); + }); + + bench.add("replace-source: original()", () => { + const src = new sources.ReplaceSource(new sources.RawSource(fixtureCode)); + for (let i = 0; i < 500; i++) src.original(); + }); + + bench.add("replace-source: updateHash()", () => { + for (let i = 0; i < 20; i++) { + const src = new sources.ReplaceSource( + new sources.OriginalSource(fixtureCode, "fix.js"), + "fix", + ); + src.replace(0, 10, "/* hdr */"); + src.insert(200, "// inj\n"); + src.updateHash(createHash("sha256")); + } + }); +} diff --git a/benchmark/cases/size-only-source/index.bench.mjs b/benchmark/cases/size-only-source/index.bench.mjs new file mode 100644 index 0000000..c2deb8a --- /dev/null +++ b/benchmark/cases/size-only-source/index.bench.mjs @@ -0,0 +1,57 @@ +/* + * size-only-source + * + * SizeOnlySource is trivially fast — only size() succeeds; every other + * accessor throws. We benchmark the throw paths too since they're part of + * the public API and exercise the constructor's per-instance _error + * factory. + */ + +import sources from "../../../lib/index.js"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("size-only-source: new SizeOnlySource()", () => { + for (let i = 0; i < 500; i++) new sources.SizeOnlySource(1024); + }); + + bench.add("size-only-source: size()", () => { + const src = new sources.SizeOnlySource(1024); + for (let i = 0; i < 1000; i++) src.size(); + }); + + bench.add("size-only-source: source() (throws)", () => { + const src = new sources.SizeOnlySource(1024); + for (let i = 0; i < 100; i++) { + try { + src.source(); + } catch { + // expected + } + } + }); + + bench.add("size-only-source: buffer() (throws)", () => { + const src = new sources.SizeOnlySource(1024); + for (let i = 0; i < 100; i++) { + try { + src.buffer(); + } catch { + // expected + } + } + }); + + bench.add("size-only-source: map() (throws)", () => { + const src = new sources.SizeOnlySource(1024); + for (let i = 0; i < 100; i++) { + try { + src.map({}); + } catch { + // expected + } + } + }); +} diff --git a/benchmark/cases/source-map-source/index.bench.mjs b/benchmark/cases/source-map-source/index.bench.mjs new file mode 100644 index 0000000..cb14e15 --- /dev/null +++ b/benchmark/cases/source-map-source/index.bench.mjs @@ -0,0 +1,174 @@ +/* + * source-map-source + * + * SourceMapSource is the heaviest single class — it covers both standalone + * sources-with-maps and the combined-source-map path (outer map + inner + * map). We exercise every public method, both input variants (object / + * string / Buffer), and both streaming layouts (full / lines-only). + */ + +import { createHash } from "crypto"; +import sources from "../../../lib/index.js"; +import { + fixtureBuffer, + fixtureCode, + fixtureMap, + fixtureMapBuffer, + fixtureMapString, + noop, +} from "../../fixtures.mjs"; + +/** + * @param {import("tinybench").Bench} bench bench + */ +export default function register(bench) { + bench.add("source-map-source: new (object map)", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap); + } + }); + + bench.add("source-map-source: new (string map)", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMapString); + } + }); + + bench.add("source-map-source: new (buffer map)", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMapBuffer); + } + }); + + bench.add("source-map-source: new (buffer value)", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource(fixtureBuffer, "fixture.js", fixtureMap); + } + }); + + bench.add("source-map-source: source()", () => { + for (let i = 0; i < 100; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).source(); + } + }); + + bench.add("source-map-source: buffer()", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).buffer(); + } + }); + + bench.add("source-map-source: size()", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap).size(); + } + }); + + bench.add("source-map-source: getArgsAsBuffers()", () => { + for (let i = 0; i < 20; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).getArgsAsBuffers(); + } + }); + + bench.add("source-map-source: map()", () => { + for (let i = 0; i < 100; i++) { + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap).map( + {}, + ); + } + }); + + bench.add("source-map-source: map({columns:false})", () => { + for (let i = 0; i < 100; i++) { + new sources.SourceMapSource(fixtureCode, "fixture.js", fixtureMap).map({ + columns: false, + }); + } + }); + + bench.add("source-map-source: sourceAndMap()", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).sourceAndMap({}); + } + }); + + bench.add("source-map-source: sourceAndMap({columns:false})", () => { + for (let i = 0; i < 50; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).sourceAndMap({ + columns: false, + }); + } + }); + + bench.add("source-map-source: streamChunks()", () => { + for (let i = 0; i < 5; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).streamChunks({}, noop, noop, noop); + } + }); + + bench.add("source-map-source: streamChunks({columns:false})", () => { + for (let i = 0; i < 5; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).streamChunks({ columns: false }, noop, noop, noop); + } + }); + + bench.add("source-map-source: streamChunks({finalSource:true})", () => { + for (let i = 0; i < 5; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).streamChunks({ finalSource: true }, noop, noop, noop); + } + }); + + bench.add("source-map-source: streamChunks() (combined inner map)", () => { + for (let i = 0; i < 3; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + fixtureCode, + fixtureMap, + ).streamChunks({}, noop, noop, noop); + } + }); + + bench.add("source-map-source: updateHash()", () => { + for (let i = 0; i < 10; i++) { + new sources.SourceMapSource( + fixtureCode, + "fixture.js", + fixtureMap, + ).updateHash(createHash("sha256")); + } + }); +} diff --git a/benchmark/compare.mjs b/benchmark/compare.mjs new file mode 100644 index 0000000..0cb1188 --- /dev/null +++ b/benchmark/compare.mjs @@ -0,0 +1,47 @@ +/* + * Diff-runner for perf comparison. + * + * Usage: + * BENCH_OUTPUT=/tmp/before.json npm run benchmark + * BENCH_OUTPUT=/tmp/after.json npm run benchmark + * node benchmark/compare.mjs /tmp/before.json /tmp/after.json + */ + +import fs from "fs"; + +const [before, after] = process.argv.slice(2); +const b = JSON.parse(fs.readFileSync(before, "utf8")); +const a = JSON.parse(fs.readFileSync(after, "utf8")); + +const bMap = new Map(b.map((row) => [row.name, row])); +const aMap = new Map(a.map((row) => [row.name, row])); + +const rows = []; +for (const [name, aRow] of aMap) { + const bRow = bMap.get(name); + if (!bRow) continue; + const bOps = Number(bRow.opsPerSec); + const aOps = Number(aRow.opsPerSec); + if (!bOps || !aOps) continue; + const ratio = aOps / bOps; + rows.push({ + name, + before: bOps.toFixed(0), + after: aOps.toFixed(0), + "speedup (×)": ratio.toFixed(2), + "delta (%)": ((ratio - 1) * 100).toFixed(1), + }); +} +rows.sort((i1, i2) => Number(i1["speedup (×)"]) - Number(i2["speedup (×)"])); +console.table(rows); + +const overall = + rows.reduce((i1, i2) => i1 + Number(i2["speedup (×)"]), 0) / rows.length; +const wins = rows.filter((r) => Number(r["speedup (×)"]) > 1.05).length; +const losses = rows.filter((r) => Number(r["speedup (×)"]) < 0.95).length; + +console.log(); +console.log( + `Summary: ${rows.length} tasks, avg speedup ×${overall.toFixed(2)}, ` + + `${wins} with >5% improvement, ${losses} with >5% regression`, +); diff --git a/benchmark/fixtures.mjs b/benchmark/fixtures.mjs new file mode 100644 index 0000000..05b10ee --- /dev/null +++ b/benchmark/fixtures.mjs @@ -0,0 +1,49 @@ +/* + * Shared fixtures for benchmark cases. + * + * Each case can import what it needs from here. We read the fixture files + * from the existing test fixture directory so the benchmarks run against + * realistic source content and matching source maps. + */ + +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const fixturesDir = path.join(__dirname, "..", "test", "fixtures"); + +export const fixtureCode = fs.readFileSync( + path.join(fixturesDir, "es6-promise.js"), + "utf8", +); + +export const fixtureMap = JSON.parse( + fs.readFileSync(path.join(fixturesDir, "es6-promise.map"), "utf8"), +); + +export const fixtureBuffer = Buffer.from(fixtureCode, "utf8"); +export const fixtureMapString = JSON.stringify(fixtureMap); +export const fixtureMapBuffer = Buffer.from(fixtureMapString, "utf8"); + +// Synthetic multi-line source (~20k lines). Exercises scan-heavy paths +// (splitIntoLines, OriginalSource column walking, etc.). +export const bigSource = Array.from( + { length: 20000 }, + (_, i) => `const value${i} = ${i} * 2; // line ${i}`, +).join("\n"); + +// Synthetic source with a few very long lines (exercises indexOf-based +// scanning). +export const longLineSource = `${"a".repeat(100000)}\n${"b".repeat( + 100000, +)}\n${"c".repeat(100000)}`; + +// Small source useful when we want the constructor / method pair to +// dominate the measurement. +export const smallSource = + 'function hello(name) {\n\tconsole.log("hi " + name);\n}\nhello("world");\n'; + +// Noop callbacks for streamChunks benchmarks. Reused so V8 can optimise +// them into a known-shape function. +export const noop = () => {}; diff --git a/benchmark/run.mjs b/benchmark/run.mjs new file mode 100644 index 0000000..1820c58 --- /dev/null +++ b/benchmark/run.mjs @@ -0,0 +1,140 @@ +#!/usr/bin/env node +/* + * Benchmark entry point for webpack-sources. + * + * Discovers every directory under ./cases/ that contains an `index.bench.mjs` + * file, calls its default-exported `register(bench, ctx)` function to + * populate tinybench tasks, then runs them all. + * + * The bench is wrapped with a local `withCodSpeed()` bridge (ported from + * webpack / enhanced-resolve) so the same entry point works for: + * - local development (`npm run benchmark`) -> wall-clock measurements + * printed to the terminal; the wrapper detects that CodSpeed is not + * active and returns the bench untouched + * - CI under CodSpeedHQ/action -> the wrapper switches to instrumentation + * mode automatically and results are uploaded to codspeed.io + * + * See ./README.md for the layout of individual cases. + */ + +import fs from "fs/promises"; +import path from "path"; +import { fileURLToPath, pathToFileURL } from "url"; +import { Bench, hrtimeNow } from "tinybench"; +import { withCodSpeed } from "./with-codspeed.mjs"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const casesPath = path.join(__dirname, "cases"); + +/** + * Filter expression from CLI or env (e.g. `npm run benchmark -- RawSource`). + * A case is included if its directory name contains this substring. Empty + * means "include everything". + */ +const filter = process.env.BENCH_FILTER || process.argv[2] || ""; + +const bench = withCodSpeed( + new Bench({ + name: "webpack-sources", + now: hrtimeNow, + throws: true, + warmup: true, + // Extra warmup iterations let V8's hidden-class caches and the GC heap + // settle before measurement starts. This matters for CodSpeed + // instruction counting where each task is measured in a single call, + // so residual allocations from previous tasks can otherwise leak into + // the result of subsequent tasks. + warmupIterations: 10, + // Each task's body already loops over a batch of calls, so we keep the + // outer iteration count low to finish a full wall-clock run in a few + // seconds. CodSpeed's simulation mode uses this to warm up before + // instrumenting a single iteration per task. + iterations: 10, + }), +); + +const caseDirs = (await fs.readdir(casesPath, { withFileTypes: true })) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + .filter((name) => !filter || name.includes(filter)) + .sort(); + +if (caseDirs.length === 0) { + console.error( + filter + ? `No benchmark cases matched filter "${filter}"` + : "No benchmark cases found", + ); + process.exit(1); +} + +for (const caseName of caseDirs) { + const benchFile = path.join(casesPath, caseName, "index.bench.mjs"); + try { + await fs.access(benchFile); + } catch { + console.warn(`[skip] ${caseName}: no index.bench.mjs`); + continue; + } + const mod = await import(pathToFileURL(benchFile).href); + if (typeof mod.default !== "function") { + throw new Error( + `${caseName}/index.bench.mjs must export a default function`, + ); + } + await mod.default(bench, { + caseName, + caseDir: path.join(casesPath, caseName), + fixtureDir: path.join(casesPath, caseName, "fixture"), + }); + console.log(`Registered: ${caseName}`); +} + +console.log(`\nRunning ${bench.tasks.length} tasks...\n`); +await bench.run(); + +// Pretty-print results. Kept simple on purpose — CodSpeed uploads its own +// data in CI; this table is for humans running locally. +const rows = bench.tasks.map((task) => { + const r = task.result; + if (!r) return { name: task.name, status: "no result" }; + const lat = r.latency; + const tp = r.throughput; + return { + name: task.name, + "ops/s": tp?.mean?.toFixed(2) ?? "n/a", + "mean (ms)": lat?.mean?.toFixed(4) ?? "n/a", + "p99 (ms)": lat?.p99?.toFixed(4) ?? "n/a", + "rme (%)": lat?.rme?.toFixed(2) ?? "n/a", + samples: lat?.samplesCount ?? 0, + }; +}); +console.log(); +console.table(rows); + +// Optional JSON dump for diff-runner (see benchmark/compare.mjs). +if (process.env.BENCH_OUTPUT) { + const dump = bench.tasks.map((task) => { + const r = task.result; + return { + name: task.name, + opsPerSec: r?.throughput?.mean ?? 0, + meanMs: r?.latency?.mean ?? 0, + p99Ms: r?.latency?.p99 ?? 0, + rme: r?.latency?.rme ?? 0, + samples: r?.latency?.samplesCount ?? 0, + }; + }); + await fs.writeFile(process.env.BENCH_OUTPUT, JSON.stringify(dump, null, 2)); + console.log(`Wrote ${dump.length} rows to ${process.env.BENCH_OUTPUT}`); +} + +// Exit non-zero if any task threw, so CI picks it up. +const failed = bench.tasks.filter((t) => t.result?.error); +if (failed.length > 0) { + console.error(`\n${failed.length} task(s) errored:`); + for (const t of failed) { + console.error(` - ${t.name}: ${t.result?.error?.message}`); + } + process.exit(1); +} diff --git a/benchmark/with-codspeed.mjs b/benchmark/with-codspeed.mjs new file mode 100644 index 0000000..2e69912 --- /dev/null +++ b/benchmark/with-codspeed.mjs @@ -0,0 +1,208 @@ +/* + * CodSpeed <-> tinybench bridge for webpack-sources benchmarks. + * + * Ported from webpack's test/BenchmarkTestCases.benchmark.mjs and the + * equivalent wrapper in enhanced-resolve. The webpack version additionally + * handles baseline comparison, MongoDB profiling, and git-root detection — + * none of which apply here. + * + * Why not @codspeed/tinybench-plugin? + * That package accesses tinybench Task internals (task.fn, task.fnOpts) + * that were made private in tinybench v6, causing a TypeError in + * simulation mode. We follow webpack and enhanced-resolve in using + * @codspeed/core directly. + * + * Modes (via getCodspeedRunnerMode() from @codspeed/core): + * "disabled" — returns the bench untouched (local runs) + * "simulation" — overrides bench.run/runSync for CodSpeed instrumentation + * "walltime" — left untouched; tinybench's built-in timing is used + */ + +import path from "path"; +import { fileURLToPath } from "url"; +import { + InstrumentHooks, + getCodspeedRunnerMode, + setupCore, + teardownCore, +} from "@codspeed/core"; + +/** @typedef {import("tinybench").Bench} Bench */ +/** @typedef {import("tinybench").Task} Task */ +/** @typedef {() => unknown | Promise} Fn */ +/** @typedef {{ beforeAll?: Fn, afterAll?: Fn, beforeEach?: Fn, afterEach?: Fn }} HookOpts */ + +const repoRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "..", +); + +/** + * Capture the file that invoked bench.add() so we can build a stable URI + * for CodSpeed to identify the benchmark. + * @returns {string} calling file path relative to the repo root + */ +function getCallingFile() { + const dummy = {}; + const prev = Error.prepareStackTrace; + const prevLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 10; + Error.prepareStackTrace = (_err, trace) => trace; + Error.captureStackTrace(dummy, getCallingFile); + const trace = /** @type {NodeJS.CallSite[]} */ ( + /** @type {{ stack: unknown }} */ (dummy).stack + ); + Error.prepareStackTrace = prev; + Error.stackTraceLimit = prevLimit; + + let file = /** @type {string} */ (trace[1].getFileName() || ""); + if (file.startsWith("file://")) file = fileURLToPath(file); + if (!file) return ""; + return path.relative(repoRoot, file); +} + +// eslint-disable-next-line jsdoc/require-property +/** @typedef {object} EXPECTED_OBJECT */ + +/** + * @typedef {{ uri: string, fn: Fn, opts: EXPECTED_OBJECT | undefined }} TaskMeta + * @type {WeakMap>} + */ +const metaMap = new WeakMap(); + +/** + * @param {Bench} bench bench + * @returns {Map} meta map + */ +function getOrCreateMeta(bench) { + let m = metaMap.get(bench); + if (!m) { + m = new Map(); + metaMap.set(bench, m); + } + return m; +} + +/** + * Wrap a tinybench Bench so that CodSpeed simulation mode instruments each + * task. In "disabled" and "walltime" modes the bench is returned as-is. + * @param {Bench} bench bench + * @returns {Bench} bench + */ +export function withCodSpeed(bench) { + const mode = getCodspeedRunnerMode(); + if (mode === "disabled" || mode === "walltime") return bench; + + // --- simulation mode --- + + const meta = getOrCreateMeta(bench); + const rawAdd = bench.add.bind(bench); + + bench.add = (name, fn, opts) => { + const callingFile = getCallingFile(); + const uri = `${callingFile}::${name}`; + meta.set(name, { uri, fn, opts }); + return rawAdd(name, fn, opts); + }; + + const setup = () => { + setupCore(); + console.log("[CodSpeed] running in simulation mode"); + }; + + const teardown = () => { + teardownCore(); + console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`); + return bench.tasks; + }; + + /** + * @param {Fn} fn fn + * @param {boolean} isAsync is async + * @returns {Fn} wrapped + */ + const wrapFrame = (fn, isAsync) => { + if (isAsync) { + // eslint-disable-next-line camelcase + return async function __codspeed_root_frame__() { + await fn(); + }; + } + // eslint-disable-next-line camelcase + return function __codspeed_root_frame__() { + fn(); + }; + }; + + bench.run = async () => { + setup(); + for (const task of bench.tasks) { + const m = /** @type {TaskMeta} */ (meta.get(task.name)); + const hooks = /** @type {HookOpts | undefined} */ (m.opts) || {}; + + if (hooks.beforeAll) await hooks.beforeAll.call(task); + + // Warm-up: run the body a few times to stabilise caches / JIT. + // Honor beforeEach/afterEach so the measured iteration sees the + // same fixture state as the warmup iterations. + for (let i = 0; i < bench.iterations - 1; i++) { + if (hooks.beforeEach) await hooks.beforeEach.call(task); + await m.fn(); + if (hooks.afterEach) await hooks.afterEach.call(task); + } + + // Instrumented run. + if (hooks.beforeEach) await hooks.beforeEach.call(task); + global.gc?.(); + InstrumentHooks.startBenchmark(); + await wrapFrame(m.fn, true)(); + InstrumentHooks.stopBenchmark(); + if (hooks.afterEach) await hooks.afterEach.call(task); + InstrumentHooks.setExecutedBenchmark(process.pid, m.uri); + + if (hooks.afterAll) await hooks.afterAll.call(task); + + console.log( + `[CodSpeed] ${ + InstrumentHooks.isInstrumented() ? "Measured" : "Checked" + } ${m.uri}`, + ); + } + return teardown(); + }; + + bench.runSync = () => { + setup(); + for (const task of bench.tasks) { + const m = /** @type {TaskMeta} */ (meta.get(task.name)); + const hooks = /** @type {HookOpts | undefined} */ (m.opts) || {}; + + if (hooks.beforeAll) hooks.beforeAll.call(task); + + for (let i = 0; i < bench.iterations - 1; i++) { + if (hooks.beforeEach) hooks.beforeEach.call(task); + m.fn(); + if (hooks.afterEach) hooks.afterEach.call(task); + } + + if (hooks.beforeEach) hooks.beforeEach.call(task); + global.gc?.(); + InstrumentHooks.startBenchmark(); + wrapFrame(m.fn, false)(); + InstrumentHooks.stopBenchmark(); + if (hooks.afterEach) hooks.afterEach.call(task); + InstrumentHooks.setExecutedBenchmark(process.pid, m.uri); + + if (hooks.afterAll) hooks.afterAll.call(task); + + console.log( + `[CodSpeed] ${ + InstrumentHooks.isInstrumented() ? "Measured" : "Checked" + } ${m.uri}`, + ); + } + return teardown(); + }; + + return bench; +} diff --git a/eslint.config.mjs b/eslint.config.mjs index edeb275..f6ec278 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -8,4 +8,22 @@ export default defineConfig([ "n/prefer-node-protocol": "off", }, }, + { + // Benchmarks run only on a modern LTS Node (see .github/workflows/codspeed.yml) + // so we disable the engine-version-aware rules and other style checks + // that don't make sense for benchmark entry points. + files: ["benchmark/**/*.{js,mjs}"], + languageOptions: { + sourceType: "module", + ecmaVersion: "latest", + }, + rules: { + "no-console": "off", + "no-new": "off", + "n/hashbang": "off", + "n/no-unsupported-features/es-syntax": "off", + "n/no-unsupported-features/node-builtins": "off", + "n/no-process-exit": "off", + }, + }, ]); diff --git a/jest.config.js b/jest.config.js index 318d00e..f247ec6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -8,6 +8,10 @@ const config = { testPathIgnorePatterns: ["/test/helpers.js"], transformIgnorePatterns: [""], testEnvironment: "node", + snapshotFormat: { + escapeString: true, + printBasicPrototype: true, + }, }; module.exports = config; diff --git a/lib/CachedSource.js b/lib/CachedSource.js index 4690742..bea8f0d 100644 --- a/lib/CachedSource.js +++ b/lib/CachedSource.js @@ -78,6 +78,34 @@ const bufferedMapToMap = (bufferedMap) => { /** @typedef {{ map?: null | RawSourceMap, bufferedMap?: null | BufferedMap }} BufferEntry */ /** @typedef {Map} BufferedMaps */ +const CACHE_KEY_EMPTY = "{}"; +const CACHE_KEY_COLUMNS_FALSE = '{"columns":false}'; +const CACHE_KEY_COLUMNS_TRUE = '{"columns":true}'; + +/** + * Fast-path replacement for `JSON.stringify(options)` when used as a cache + * key. MapOptions / streamChunks Options are both small boolean-only shapes + * and the overwhelmingly common shapes (`undefined`, `{}`, `{columns}`) can + * be keyed without calling `JSON.stringify`, which dominates short-circuit + * cache lookups. Falls back to `JSON.stringify` for any other shape so keys + * remain compatible with previously cached `BufferedMaps` entries. + * @param {undefined | MapOptions | Options} options options + * @returns {string} cache key + */ +const getCacheKey = (options) => { + if (!options) return CACHE_KEY_EMPTY; + const { columns } = options; + if ( + /** @type {Options} */ (options).source === undefined && + /** @type {Options} */ (options).finalSource === undefined && + /** @type {MapOptions} */ (options).module === undefined + ) { + if (columns === undefined) return CACHE_KEY_EMPTY; + return columns ? CACHE_KEY_COLUMNS_TRUE : CACHE_KEY_COLUMNS_FALSE; + } + return JSON.stringify(options); +}; + /** * @typedef {object} CachedData * @property {boolean=} source source @@ -99,36 +127,48 @@ class CachedSource extends Source { * @type {Source | (() => Source)} */ this._source = source; - /** - * @private - * @type {boolean | undefined} - */ - this._cachedSourceType = cachedData ? cachedData.source : undefined; /** * @private * @type {undefined | string} */ this._cachedSource = undefined; - /** - * @private - * @type {Buffer | undefined} - */ - this._cachedBuffer = cachedData ? cachedData.buffer : undefined; - /** - * @private - * @type {number | undefined} - */ - this._cachedSize = cachedData ? cachedData.size : undefined; - /** - * @private - * @type {BufferedMaps} - */ - this._cachedMaps = cachedData ? cachedData.maps : new Map(); - /** - * @private - * @type {(string | Buffer)[] | undefined} - */ - this._cachedHashUpdate = cachedData ? cachedData.hash : undefined; + // Split on `cachedData` once instead of re-evaluating the ternary for + // every field. Under the interpreter (and CodSpeed's simulation) each + // ternary is a separate branch; consolidating cuts the per-instance + // branch count roughly in half. + if (cachedData) { + /** + * @private + * @type {boolean | undefined} + */ + this._cachedSourceType = cachedData.source; + /** + * @private + * @type {Buffer | undefined} + */ + this._cachedBuffer = cachedData.buffer; + /** + * @private + * @type {number | undefined} + */ + this._cachedSize = cachedData.size; + /** + * @private + * @type {BufferedMaps} + */ + this._cachedMaps = cachedData.maps; + /** + * @private + * @type {(string | Buffer)[] | undefined} + */ + this._cachedHashUpdate = cachedData.hash; + } else { + this._cachedSourceType = undefined; + this._cachedBuffer = undefined; + this._cachedSize = undefined; + this._cachedMaps = new Map(); + this._cachedHashUpdate = undefined; + } } /** @@ -184,8 +224,21 @@ class CachedSource extends Source { * @returns {SourceValue} source */ source() { - const source = this._getCachedSource(); - if (source !== undefined) return source; + // Fully inlined _getCachedSource: both warm- and cold-cache paths skip + // the prototype method lookup / stack frame the interpreter would + // otherwise pay on every call. + if (this._cachedSource !== undefined) return this._cachedSource; + const cachedBuffer = this._cachedBuffer; + const cachedSourceType = this._cachedSourceType; + if (cachedBuffer !== undefined && cachedSourceType !== undefined) { + const value = cachedSourceType + ? cachedBuffer.toString("utf8") + : cachedBuffer; + if (isDualStringBufferCachingEnabled()) { + this._cachedSource = /** @type {string} */ (value); + } + return /** @type {string} */ (value); + } return (this._cachedSource = /** @type {string} */ (this.original().source())); @@ -228,6 +281,9 @@ class CachedSource extends Source { */ buffer() { if (this._cachedBuffer !== undefined) return this._cachedBuffer; + if (this._cachedBuffers !== undefined) { + return (this._cachedBuffer = Buffer.concat(this._cachedBuffers)); + } if (this._cachedSource !== undefined) { const value = Buffer.isBuffer(this._cachedSource) ? this._cachedSource @@ -251,6 +307,21 @@ class CachedSource extends Source { return value; } + /** + * @returns {Buffer[]} buffers + */ + buffers() { + if (this._cachedBuffers !== undefined) return this._cachedBuffers; + if (this._cachedBuffer !== undefined) { + return (this._cachedBuffers = [this._cachedBuffer]); + } + const original = this.original(); + if (typeof original.buffers === "function") { + return (this._cachedBuffers = original.buffers()); + } + return (this._cachedBuffers = [this.buffer()]); + } + /** * @returns {number} size */ @@ -271,7 +342,7 @@ class CachedSource extends Source { * @returns {SourceAndMap} source and map */ sourceAndMap(options) { - const key = options ? JSON.stringify(options) : "{}"; + const key = getCacheKey(options); const cacheEntry = this._cachedMaps.get(key); // Look for a cached map if (cacheEntry !== undefined) { @@ -309,7 +380,7 @@ class CachedSource extends Source { * @returns {GeneratedSourceInfo} generated source info */ streamChunks(options, onChunk, onSource, onName) { - const key = options ? JSON.stringify(options) : "{}"; + const key = getCacheKey(options); if ( this._cachedMaps.has(key) && (this._cachedBuffer !== undefined || this._cachedSource !== undefined) @@ -356,7 +427,7 @@ class CachedSource extends Source { * @returns {RawSourceMap | null} map */ map(options) { - const key = options ? JSON.stringify(options) : "{}"; + const key = getCacheKey(options); const cacheEntry = this._cachedMaps.get(key); if (cacheEntry !== undefined) { return this._getMapFromCacheEntry(cacheEntry); diff --git a/lib/CompatSource.js b/lib/CompatSource.js index 70b3743..bbff94c 100644 --- a/lib/CompatSource.js +++ b/lib/CompatSource.js @@ -17,6 +17,7 @@ const Source = require("./Source"); * @typedef {object} SourceLike * @property {() => SourceValue} source source * @property {(() => Buffer)=} buffer buffer + * @property {(() => Buffer[])=} buffers buffers * @property {(() => number)=} size size * @property {((options?: MapOptions) => RawSourceMap | null)=} map map * @property {((options?: MapOptions) => SourceAndMap)=} sourceAndMap source and map @@ -60,6 +61,16 @@ class CompatSource extends Source { return super.buffer(); } + /** + * @returns {Buffer[]} buffers + */ + buffers() { + if (typeof this._sourceLike.buffers === "function") { + return this._sourceLike.buffers(); + } + return super.buffers(); + } + size() { if (typeof this._sourceLike.size === "function") { return this._sourceLike.size(); diff --git a/lib/ConcatSource.js b/lib/ConcatSource.js index f2c41a3..29c52b5 100644 --- a/lib/ConcatSource.js +++ b/lib/ConcatSource.js @@ -89,11 +89,22 @@ class ConcatSource extends Source { } buffer() { + return Buffer.concat(this.buffers()); + } + + /** + * @returns {Buffer[]} buffers + */ + buffers() { if (!this._isOptimized) this._optimize(); /** @type {Buffer[]} */ const buffers = []; for (const child of /** @type {SourceLike[]} */ (this._children)) { - if (typeof child.buffer === "function") { + if (typeof child.buffers === "function") { + for (const buffer of child.buffers()) { + buffers.push(buffer); + } + } else if (typeof child.buffer === "function") { buffers.push(child.buffer()); } else { const bufferOrString = child.source(); @@ -105,7 +116,7 @@ class ConcatSource extends Source { } } } - return Buffer.concat(buffers); + return buffers; } /** @@ -211,11 +222,6 @@ class ConcatSource extends Source { sourceIndex < 0 || sourceIndex >= sourceIndexMapping.length ? -1 : sourceIndexMapping[sourceIndex]; - const resultNameIndex = - nameIndex < 0 || nameIndex >= nameIndexMapping.length - ? -1 - : nameIndexMapping[nameIndex]; - lastMappingLine = resultSourceIndex < 0 ? 0 : generatedLine; let _chunk; // When using finalSource, we process the entire source code at once at the end, rather than chunk by chunk if (finalSource) { @@ -224,8 +230,17 @@ class ConcatSource extends Source { _chunk = chunk; } if (resultSourceIndex < 0) { + lastMappingLine = 0; onChunk(_chunk, line, column, -1, -1, -1, -1); } else { + // Only compute the remapped name index when the chunk + // actually carries a source mapping; otherwise it is + // unused. + const resultNameIndex = + nameIndex < 0 || nameIndex >= nameIndexMapping.length + ? -1 + : nameIndexMapping[nameIndex]; + lastMappingLine = generatedLine; onChunk( _chunk, line, diff --git a/lib/OriginalSource.js b/lib/OriginalSource.js index 101e09e..9949913 100644 --- a/lib/OriginalSource.js +++ b/lib/OriginalSource.js @@ -8,7 +8,6 @@ const Source = require("./Source"); const { getMap, getSourceAndMap } = require("./helpers/getFromStreamChunks"); const getGeneratedSourceInfo = require("./helpers/getGeneratedSourceInfo"); -const splitIntoLines = require("./helpers/splitIntoLines"); const splitIntoPotentialTokens = require("./helpers/splitIntoPotentialTokens"); const { isDualStringBufferCachingEnabled, @@ -83,6 +82,23 @@ class OriginalSource extends Source { return this._valueAsBuffer; } + /** + * Override Source.prototype.size (= `this.buffer().length`) to avoid + * allocating a Buffer just to read the byte length, and memoize the + * result so repeated calls don't re-scan the string. + * @returns {number} byte length + */ + size() { + if (this._cachedSize !== undefined) return this._cachedSize; + if (this._valueAsBuffer !== undefined) { + return (this._cachedSize = this._valueAsBuffer.length); + } + return (this._cachedSize = Buffer.byteLength( + /** @type {string} */ (this._value), + "utf8", + )); + } + /** * @param {MapOptions=} options map options * @returns {RawSourceMap | null} map @@ -165,27 +181,36 @@ class OriginalSource extends Source { } return result; } - // Without column info, but also without final source - // we need to split source by lines + // Without column info, but also without final source. + // We only get here when (options.columns === false && !finalSource), + // so the source field is always undefined and the chunk arg is always + // the line text. Single-pass scan over newlines avoids the + // splitIntoLines array allocation. + const value = this._value; + const len = value.length; + if (len === 0) { + return { generatedLine: 1, generatedColumn: 0, source: undefined }; + } let line = 1; - const matches = splitIntoLines(this._value); - /** @type {string | undefined} */ - let match; - for (match of matches) { - onChunk(finalSource ? undefined : match, line, 0, 0, line, 0, -1); + let i = 0; + while (i < len) { + const n = value.indexOf("\n", i); + if (n === -1) { + const lastLine = i === 0 ? value : value.slice(i); + onChunk(lastLine, line, 0, 0, line, 0, -1); + return { + generatedLine: line, + generatedColumn: lastLine.length, + source: undefined, + }; + } + const chunk = n === i ? "\n" : value.slice(i, n + 1); + onChunk(chunk, line, 0, 0, line, 0, -1); line++; + i = n + 1; } - return matches.length === 0 || /** @type {string} */ (match).endsWith("\n") - ? { - generatedLine: matches.length + 1, - generatedColumn: 0, - source: finalSource ? this._value : undefined, - } - : { - generatedLine: matches.length, - generatedColumn: /** @type {string} */ (match).length, - source: finalSource ? this._value : undefined, - }; + // Source ended with a newline. + return { generatedLine: line, generatedColumn: 0, source: undefined }; } /** diff --git a/lib/RawSource.js b/lib/RawSource.js index 0f2ce14..3551937 100644 --- a/lib/RawSource.js +++ b/lib/RawSource.js @@ -30,36 +30,36 @@ class RawSource extends Source { constructor(value, convertToString = false) { super(); const isBuffer = Buffer.isBuffer(value); - if (!isBuffer && typeof value !== "string") { + if (isBuffer) { + /** + * @private + * @type {boolean} + */ + this._valueIsBuffer = !convertToString; + /** + * @private + * @type {undefined | string | Buffer} + */ + this._value = convertToString ? undefined : value; + /** + * @private + * @type {undefined | Buffer} + */ + this._valueAsBuffer = value; + /** + * @private + * @type {undefined | string} + */ + this._valueAsString = undefined; + } else if (typeof value === "string") { + const interned = internString(value); + this._valueIsBuffer = false; + this._value = interned; + this._valueAsBuffer = undefined; + this._valueAsString = interned; + } else { throw new TypeError("argument 'value' must be either string or Buffer"); } - /** - * @private - * @type {boolean} - */ - this._valueIsBuffer = !convertToString && isBuffer; - const internedString = - typeof value === "string" ? internString(value) : undefined; - /** - * @private - * @type {undefined | string | Buffer} - */ - this._value = - convertToString && isBuffer - ? undefined - : typeof value === "string" - ? internedString - : value; - /** - * @private - * @type {undefined | Buffer} - */ - this._valueAsBuffer = isBuffer ? value : undefined; - /** - * @private - * @type {undefined | string} - */ - this._valueAsString = isBuffer ? undefined : internedString; } isBuffer() { @@ -93,6 +93,23 @@ class RawSource extends Source { return this._valueAsBuffer; } + /** + * Override Source.prototype.size (= `this.buffer().length`) to avoid + * allocating a Buffer just to read the byte length, and memoize the + * result so repeated calls don't re-scan the string. + * @returns {number} byte length + */ + size() { + if (this._cachedSize !== undefined) return this._cachedSize; + if (this._valueAsBuffer !== undefined) { + return (this._cachedSize = this._valueAsBuffer.length); + } + return (this._cachedSize = Buffer.byteLength( + /** @type {string} */ (this._valueAsString), + "utf8", + )); + } + /** * @param {MapOptions=} options map options * @returns {RawSourceMap | null} map diff --git a/lib/ReplaceSource.js b/lib/ReplaceSource.js index ffd4e15..07572a1 100644 --- a/lib/ReplaceSource.js +++ b/lib/ReplaceSource.js @@ -31,6 +31,35 @@ const hasStableSort = // This is larger than max string length const MAX_SOURCE_POSITION = 0x20000000; +/** + * Stable comparator hoisted to module scope so each `_sortReplacements()` + * call doesn't allocate a fresh closure. + * @param {Replacement} a a + * @param {Replacement} b b + * @returns {number} order + */ +const compareStable = (a, b) => { + const diff1 = a.start - b.start; + if (diff1 !== 0) return diff1; + const diff2 = a.end - b.end; + if (diff2 !== 0) return diff2; + return 0; +}; + +/** + * Index-stabilising comparator for v8 < 7.0 (pre-stable Array.prototype.sort). + * @param {Replacement} a a + * @param {Replacement} b b + * @returns {number} order + */ +const compareUnstableFallback = (a, b) => { + const diff1 = a.start - b.start; + if (diff1 !== 0) return diff1; + const diff2 = a.end - b.end; + if (diff2 !== 0) return diff2; + return /** @type {number} */ (a.index) - /** @type {number} */ (b.index); +}; + class Replacement { /** * @param {number} start start @@ -124,7 +153,7 @@ class ReplaceSource extends Source { if (this._replacements.length === 0) { return this._source.source(); } - let current = this._source.source(); + const current = /** @type {string} */ (this._source.source()); let pos = 0; const result = []; @@ -133,19 +162,19 @@ class ReplaceSource extends Source { const start = Math.floor(replacement.start); const end = Math.floor(replacement.end + 1); if (pos < start) { - const offset = start - pos; - result.push(current.slice(0, offset)); - current = current.slice(offset); + // slice directly from the original string rather than repeatedly + // producing smaller intermediate strings, which avoids O(n) copies. + result.push(current.slice(pos, start)); pos = start; } result.push(replacement.content); if (pos < end) { - const offset = end - pos; - current = current.slice(offset); pos = end; } } - result.push(current); + if (pos < current.length) { + result.push(pos === 0 ? current : current.slice(pos)); + } return result.join(""); } @@ -178,24 +207,10 @@ class ReplaceSource extends Source { _sortReplacements() { if (this._isSorted) return; if (hasStableSort) { - this._replacements.sort((a, b) => { - const diff1 = a.start - b.start; - if (diff1 !== 0) return diff1; - const diff2 = a.end - b.end; - if (diff2 !== 0) return diff2; - return 0; - }); + this._replacements.sort(compareStable); } else { for (const [i, repl] of this._replacements.entries()) repl.index = i; - this._replacements.sort((a, b) => { - const diff1 = a.start - b.start; - if (diff1 !== 0) return diff1; - const diff2 = a.end - b.end; - if (diff2 !== 0) return diff2; - return ( - /** @type {number} */ (a.index) - /** @type {number} */ (b.index) - ); - }); + this._replacements.sort(compareUnstableFallback); } this._isSorted = true; } @@ -545,10 +560,14 @@ class ReplaceSource extends Source { hash.update("ReplaceSource"); this._source.updateHash(hash); hash.update(this._name || ""); + // Feed each replacement as multiple updates instead of building one + // combined template literal per replacement. The resulting digest is + // identical (hash.update is additive over bytes), but we avoid + // allocating a new string per replacement. for (const repl of this._replacements) { - hash.update( - `${repl.start}${repl.end}${repl.content}${repl.name ? repl.name : ""}`, - ); + hash.update(`${repl.start}${repl.end}`); + hash.update(repl.content); + if (repl.name) hash.update(repl.name); } } } diff --git a/lib/SizeOnlySource.js b/lib/SizeOnlySource.js index dc74cb0..b72ce1b 100644 --- a/lib/SizeOnlySource.js +++ b/lib/SizeOnlySource.js @@ -49,6 +49,13 @@ class SizeOnlySource extends Source { throw this._error(); } + /** + * @returns {Buffer[]} buffers + */ + buffers() { + throw this._error(); + } + /** * @param {MapOptions=} options map options * @returns {RawSourceMap | null} map diff --git a/lib/Source.js b/lib/Source.js index 39859e2..c1798b7 100644 --- a/lib/Source.js +++ b/lib/Source.js @@ -52,6 +52,13 @@ class Source { return Buffer.from(source, "utf8"); } + /** + * @returns {Buffer[]} buffers + */ + buffers() { + return [this.buffer()]; + } + size() { return this.buffer().length; } diff --git a/lib/SourceMapSource.js b/lib/SourceMapSource.js index bd58d89..ed91a9a 100644 --- a/lib/SourceMapSource.js +++ b/lib/SourceMapSource.js @@ -143,6 +143,23 @@ class SourceMapSource extends Source { return this._valueAsBuffer; } + /** + * Override Source.prototype.size (= `this.buffer().length`) to avoid + * allocating a Buffer just to read the byte length, and memoize the + * result so repeated calls don't re-scan the string. + * @returns {number} byte length + */ + size() { + if (this._cachedSize !== undefined) return this._cachedSize; + if (this._valueAsBuffer !== undefined) { + return (this._cachedSize = this._valueAsBuffer.length); + } + return (this._cachedSize = Buffer.byteLength( + /** @type {string} */ (this._valueAsString), + "utf8", + )); + } + /** * @returns {SourceValue} source */ diff --git a/lib/helpers/createMappingsSerializer.js b/lib/helpers/createMappingsSerializer.js index 860b3da..3fb4f21 100644 --- a/lib/helpers/createMappingsSerializer.js +++ b/lib/helpers/createMappingsSerializer.js @@ -22,6 +22,29 @@ const ALPHABET = [ const CONTINUATION_BIT = 0x20; +/** + * Append a VLQ-encoded signed integer to `str`. Hoisted to module scope so + * that both serializers share a single function object and avoid allocating + * a new closure on every call. + * @param {string} str current string buffer + * @param {number} value signed integer to encode + * @returns {string} updated string buffer + */ +const writeValue = (str, value) => { + const sign = (value >>> 31) & 1; + const mask = value >> 31; + const absValue = (value + mask) ^ mask; + let data = (absValue << 1) | sign; + for (;;) { + const sextet = data & 0x1f; + data >>= 5; + if (data === 0) { + return str + ALPHABET[sextet]; + } + str += ALPHABET[sextet | CONTINUATION_BIT]; + } +}; + const createFullMappingsSerializer = () => { let currentLine = 1; let currentColumn = 0; @@ -60,10 +83,14 @@ const createFullMappingsSerializer = () => { return ""; } - /** @type {undefined | string} */ let str; if (currentLine < generatedLine) { - str = ";".repeat(generatedLine - currentLine); + // Consecutive lines (diff === 1) are the dominant case; avoid the + // `.repeat()` call entirely for them. + str = + generatedLine === currentLine + 1 + ? ";" + : ";".repeat(generatedLine - currentLine); currentLine = generatedLine; currentColumn = 0; initial = false; @@ -74,46 +101,26 @@ const createFullMappingsSerializer = () => { str = ","; } - /** - * @param {number} value value - * @returns {void} - */ - const writeValue = (value) => { - const sign = (value >>> 31) & 1; - const mask = value >> 31; - const absValue = (value + mask) ^ mask; - let data = (absValue << 1) | sign; - for (;;) { - const sextet = data & 0x1f; - data >>= 5; - if (data === 0) { - str += ALPHABET[sextet]; - break; - } else { - str += ALPHABET[sextet | CONTINUATION_BIT]; - } - } - }; - writeValue(generatedColumn - currentColumn); + str = writeValue(str, generatedColumn - currentColumn); currentColumn = generatedColumn; if (sourceIndex >= 0) { activeMapping = true; if (sourceIndex === currentSourceIndex) { str += "A"; } else { - writeValue(sourceIndex - currentSourceIndex); + str = writeValue(str, sourceIndex - currentSourceIndex); currentSourceIndex = sourceIndex; } - writeValue(originalLine - currentOriginalLine); + str = writeValue(str, originalLine - currentOriginalLine); currentOriginalLine = originalLine; if (originalColumn === currentOriginalColumn) { str += "A"; } else { - writeValue(originalColumn - currentOriginalColumn); + str = writeValue(str, originalColumn - currentOriginalColumn); currentOriginalColumn = originalColumn; } if (nameIndex >= 0) { - writeValue(nameIndex - currentNameIndex); + str = writeValue(str, nameIndex - currentNameIndex); currentNameIndex = nameIndex; activeName = true; } else { @@ -148,28 +155,7 @@ const createLinesOnlyMappingsSerializer = () => { // avoid writing multiple original mappings per line return ""; } - /** @type {undefined | string} */ let str; - /** - * @param {number} value value - * @returns {void} - */ - const writeValue = (value) => { - const sign = (value >>> 31) & 1; - const mask = value >> 31; - const absValue = (value + mask) ^ mask; - let data = (absValue << 1) | sign; - for (;;) { - const sextet = data & 0x1f; - data >>= 5; - if (data === 0) { - str += ALPHABET[sextet]; - break; - } else { - str += ALPHABET[sextet | CONTINUATION_BIT]; - } - } - }; lastWrittenLine = generatedLine; if (generatedLine === currentLine + 1) { currentLine = generatedLine; @@ -179,14 +165,14 @@ const createLinesOnlyMappingsSerializer = () => { return ";AACA"; } str = ";AA"; - writeValue(originalLine - currentOriginalLine); + str = writeValue(str, originalLine - currentOriginalLine); currentOriginalLine = originalLine; return `${str}A`; } str = ";A"; - writeValue(sourceIndex - currentSourceIndex); + str = writeValue(str, sourceIndex - currentSourceIndex); currentSourceIndex = sourceIndex; - writeValue(originalLine - currentOriginalLine); + str = writeValue(str, originalLine - currentOriginalLine); currentOriginalLine = originalLine; return `${str}A`; } @@ -198,14 +184,14 @@ const createLinesOnlyMappingsSerializer = () => { return `${str}AACA`; } str += "AA"; - writeValue(originalLine - currentOriginalLine); + str = writeValue(str, originalLine - currentOriginalLine); currentOriginalLine = originalLine; return `${str}A`; } str += "A"; - writeValue(sourceIndex - currentSourceIndex); + str = writeValue(str, sourceIndex - currentSourceIndex); currentSourceIndex = sourceIndex; - writeValue(originalLine - currentOriginalLine); + str = writeValue(str, originalLine - currentOriginalLine); currentOriginalLine = originalLine; return `${str}A`; }; diff --git a/lib/helpers/getGeneratedSourceInfo.js b/lib/helpers/getGeneratedSourceInfo.js index baee63e..52d6577 100644 --- a/lib/helpers/getGeneratedSourceInfo.js +++ b/lib/helpers/getGeneratedSourceInfo.js @@ -5,8 +5,6 @@ "use strict"; -const CHAR_CODE_NEW_LINE = "\n".charCodeAt(0); - /** * @typedef {object} GeneratedSourceInfo * @property {number=} generatedLine generated line @@ -30,9 +28,14 @@ const getGeneratedSourceInfo = (source) => { source, }; } + // Use native indexOf to scan for newlines instead of charCodeAt loops. + // This is significantly faster on large sources since indexOf uses + // vectorized/native string scanning. let generatedLine = 2; - for (let i = 0; i < lastLineStart; i++) { - if (source.charCodeAt(i) === CHAR_CODE_NEW_LINE) generatedLine++; + let idx = source.indexOf("\n"); + while (idx !== -1 && idx < lastLineStart) { + generatedLine++; + idx = source.indexOf("\n", idx + 1); } return { generatedLine, diff --git a/lib/helpers/readMappings.js b/lib/helpers/readMappings.js index 28dcece..6a1fe4c 100644 --- a/lib/helpers/readMappings.js +++ b/lib/helpers/readMappings.js @@ -35,8 +35,8 @@ const ccMax = ccToValue.length - 1; * @returns {void} */ const readMappings = (mappings, onMapping) => { - // generatedColumn, [sourceIndex, originalLine, orignalColumn, [nameIndex]] - const currentData = new Uint32Array([0, 0, 1, 0, 0]); + // generatedColumn, [sourceIndex, originalLine, originalColumn, [nameIndex]] + const currentData = new Int32Array([0, 0, 1, 0, 0]); let currentDataPos = 0; // currentValue will include a sign bit at bit 0 let currentValue = 0; @@ -71,7 +71,10 @@ const readMappings = (mappings, onMapping) => { currentData[4], ); } - [generatedColumn] = currentData; + // Direct typed-array index is faster here than destructuring, + // which would invoke the Int32Array iterator protocol. + // eslint-disable-next-line prefer-destructuring + generatedColumn = currentData[0]; } currentDataPos = 0; if (value === NEXT_LINE) { diff --git a/lib/helpers/splitIntoLines.js b/lib/helpers/splitIntoLines.js index b2a4f58..214d9c8 100644 --- a/lib/helpers/splitIntoLines.js +++ b/lib/helpers/splitIntoLines.js @@ -14,18 +14,19 @@ const splitIntoLines = (str) => { const len = str.length; let i = 0; while (i < len) { - const cc = str.charCodeAt(i); - // 10 is "\n".charCodeAt(0) - if (cc === 10) { + // indexOf is implemented natively and is significantly faster than + // scanning char-by-char with charCodeAt for long lines. + const n = str.indexOf("\n", i); + if (n === -1) { + results.push(i === 0 ? str : str.slice(i)); + break; + } + if (n === i) { results.push("\n"); - i++; } else { - let j = i + 1; - // 10 is "\n".charCodeAt(0) - while (j < len && str.charCodeAt(j) !== 10) j++; - results.push(str.slice(i, j + 1)); - i = j + 1; + results.push(str.slice(i, n + 1)); } + i = n + 1; } return results; }; diff --git a/lib/helpers/streamChunksOfCombinedSourceMap.js b/lib/helpers/streamChunksOfCombinedSourceMap.js index d1355f1..b427ee0 100644 --- a/lib/helpers/streamChunksOfCombinedSourceMap.js +++ b/lib/helpers/streamChunksOfCombinedSourceMap.js @@ -76,7 +76,11 @@ const streamChunksOfCombinedSourceMap = ( if (line > innerSourceMapLineData.length) return -1; const { mappingsData } = innerSourceMapLineData[line - 1]; let l = 0; - let r = mappingsData.length / 5; + // `mappingsData.length` is always a multiple of 5 (five values pushed + // per mapping), so dividing is exact. Coerce the bound to an int32 so + // the binary-search loop stays on V8's fast small-int path instead of + // comparing an int against a float. + let r = (mappingsData.length / 5) | 0; while (l < r) { const m = (l + r) >> 1; if (mappingsData[m * 5] <= column) { diff --git a/lib/helpers/streamChunksOfRawSource.js b/lib/helpers/streamChunksOfRawSource.js index ef88715..9a47095 100644 --- a/lib/helpers/streamChunksOfRawSource.js +++ b/lib/helpers/streamChunksOfRawSource.js @@ -6,7 +6,6 @@ "use strict"; const getGeneratedSourceInfo = require("./getGeneratedSourceInfo"); -const splitIntoLines = require("./splitIntoLines"); /** @typedef {import("./getGeneratedSourceInfo").GeneratedSourceInfo} GeneratedSourceInfo */ /** @typedef {import("./streamChunks").OnChunk} OnChunk */ @@ -19,25 +18,34 @@ const splitIntoLines = require("./splitIntoLines"); * @param {OnSource} _onSource on source * @param {OnName} _onName on name * @returns {GeneratedSourceInfo} source info + * + * Single-pass equivalent of `splitIntoLines(source).forEach(emit)` — emits + * each line via onChunk while scanning for newlines, so we never allocate + * the intermediate array of lines. */ const streamChunksOfRawSource = (source, onChunk, _onSource, _onName) => { + const len = source.length; + if (len === 0) { + return { generatedLine: 1, generatedColumn: 0 }; + } let line = 1; - const matches = splitIntoLines(source); - /** @type {undefined | string} */ - let match; - for (match of matches) { - onChunk(match, line, 0, -1, -1, -1, -1); + let i = 0; + while (i < len) { + const n = source.indexOf("\n", i); + if (n === -1) { + // Trailing partial line (no \n). Emit and return its length as the + // final column. + const lastLine = i === 0 ? source : source.slice(i); + onChunk(lastLine, line, 0, -1, -1, -1, -1); + return { generatedLine: line, generatedColumn: lastLine.length }; + } + const chunk = n === i ? "\n" : source.slice(i, n + 1); + onChunk(chunk, line, 0, -1, -1, -1, -1); line++; + i = n + 1; } - return matches.length === 0 || /** @type {string} */ (match).endsWith("\n") - ? { - generatedLine: matches.length + 1, - generatedColumn: 0, - } - : { - generatedLine: matches.length, - generatedColumn: /** @type {string} */ (match).length, - }; + // Source ended with a newline — the next "logical" line is empty. + return { generatedLine: line, generatedColumn: 0 }; }; /** diff --git a/lib/helpers/streamChunksOfSourceMap.js b/lib/helpers/streamChunksOfSourceMap.js index f98f021..aa0e91e 100644 --- a/lib/helpers/streamChunksOfSourceMap.js +++ b/lib/helpers/streamChunksOfSourceMap.js @@ -32,7 +32,8 @@ const streamChunksOfSourceMapFull = ( onName, ) => { const lines = splitIntoLines(source); - if (lines.length === 0) { + const linesLength = lines.length; + if (linesLength === 0) { return { generatedLine: 1, generatedColumn: 0, @@ -52,9 +53,9 @@ const streamChunksOfSourceMapFull = ( } } - const lastLine = lines[lines.length - 1]; + const lastLine = lines[linesLength - 1]; const lastNewLine = lastLine.endsWith("\n"); - const finalLine = lastNewLine ? lines.length + 1 : lines.length; + const finalLine = lastNewLine ? linesLength + 1 : linesLength; const finalColumn = lastNewLine ? 0 : lastLine.length; let currentGeneratedLine = 1; @@ -83,7 +84,7 @@ const streamChunksOfSourceMapFull = ( originalColumn, nameIndex, ) => { - if (mappingActive && currentGeneratedLine <= lines.length) { + if (mappingActive && currentGeneratedLine <= linesLength) { let chunk; const mappingLine = currentGeneratedLine; const mappingColumn = currentGeneratedColumn; @@ -110,7 +111,7 @@ const streamChunksOfSourceMapFull = ( mappingActive = false; } if (generatedLine > currentGeneratedLine && currentGeneratedColumn > 0) { - if (currentGeneratedLine <= lines.length) { + if (currentGeneratedLine <= linesLength) { const chunk = lines[currentGeneratedLine - 1].slice( currentGeneratedColumn, ); @@ -127,22 +128,29 @@ const streamChunksOfSourceMapFull = ( currentGeneratedLine++; currentGeneratedColumn = 0; } - while (generatedLine > currentGeneratedLine) { - if (currentGeneratedLine <= lines.length) { - onChunk( - lines[currentGeneratedLine - 1], - currentGeneratedLine, - 0, - -1, - -1, - -1, - -1, - ); - } + // Emit each fully-passed generated line. Once we move past the last + // available line we stop emitting, but still need to advance the + // counter to `generatedLine` so subsequent state matches the caller. + while ( + generatedLine > currentGeneratedLine && + currentGeneratedLine <= linesLength + ) { + onChunk( + lines[currentGeneratedLine - 1], + currentGeneratedLine, + 0, + -1, + -1, + -1, + -1, + ); currentGeneratedLine++; } + if (currentGeneratedLine < generatedLine) { + currentGeneratedLine = generatedLine; + } if (generatedColumn > currentGeneratedColumn) { - if (currentGeneratedLine <= lines.length) { + if (currentGeneratedLine <= linesLength) { const chunk = lines[currentGeneratedLine - 1].slice( currentGeneratedColumn, generatedColumn, @@ -195,7 +203,8 @@ const streamChunksOfSourceMapLinesFull = ( _onName, ) => { const lines = splitIntoLines(source); - if (lines.length === 0) { + const linesLength = lines.length; + if (linesLength === 0) { return { generatedLine: 1, generatedColumn: 0, @@ -232,39 +241,38 @@ const streamChunksOfSourceMapLinesFull = ( if ( sourceIndex < 0 || generatedLine < currentGeneratedLine || - generatedLine > lines.length + generatedLine > linesLength ) { return; } + // `generatedLine <= linesLength` is guaranteed by the guard above, so + // every line we iterate over is in bounds — no per-iteration length + // check needed. while (generatedLine > currentGeneratedLine) { - if (currentGeneratedLine <= lines.length) { - onChunk( - lines[currentGeneratedLine - 1], - currentGeneratedLine, - 0, - -1, - -1, - -1, - -1, - ); - } - currentGeneratedLine++; - } - if (generatedLine <= lines.length) { onChunk( - lines[generatedLine - 1], - generatedLine, + lines[currentGeneratedLine - 1], + currentGeneratedLine, 0, - sourceIndex, - originalLine, - originalColumn, + -1, + -1, + -1, -1, ); currentGeneratedLine++; } + onChunk( + lines[generatedLine - 1], + generatedLine, + 0, + sourceIndex, + originalLine, + originalColumn, + -1, + ); + currentGeneratedLine++; }; readMappings(mappings, onMapping); - for (; currentGeneratedLine <= lines.length; currentGeneratedLine++) { + for (; currentGeneratedLine <= linesLength; currentGeneratedLine++) { onChunk( lines[currentGeneratedLine - 1], currentGeneratedLine, @@ -276,10 +284,10 @@ const streamChunksOfSourceMapLinesFull = ( ); } - const lastLine = lines[lines.length - 1]; + const lastLine = lines[linesLength - 1]; const lastNewLine = lastLine.endsWith("\n"); - const finalLine = lastNewLine ? lines.length + 1 : lines.length; + const finalLine = lastNewLine ? linesLength + 1 : linesLength; const finalColumn = lastNewLine ? 0 : lastLine.length; return { diff --git a/package-lock.json b/package-lock.json index 1f8a976..d0b13ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,28 @@ { "name": "webpack-sources", - "version": "3.3.3", + "version": "3.3.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webpack-sources", - "version": "3.3.3", + "version": "3.3.4", "license": "MIT", "devDependencies": { - "@types/jest": "^27.5.2", + "@changesets/cli": "^2.30.0", + "@changesets/get-github-info": "^0.8.0", + "@codspeed/core": "^5.2.0", + "@types/jest": "^30.0.0", "eslint": "^9.28.0", "eslint-config-webpack": "^4.0.8", - "jest": "^27.5.1", + "jest": "^30.3.0", "prettier": "^3.5.3", "prettier-2": "npm:prettier@^2", "source-map": "^0.7.3", "sourcemap-validator": "^2.1.0", - "tooling": "webpack/tooling#v1.24.4", - "typescript": "^5.3.3", + "tinybench": "^6.0.0", + "tooling": "webpack/tooling#v1.26.1", + "typescript": "^6.0.2", "webpack": "^5.99.9" }, "engines": { @@ -26,22 +30,27 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", "dev": true, "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", + "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { @@ -54,9 +63,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", "engines": { @@ -64,22 +73,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -106,14 +114,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -232,27 +240,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -358,6 +366,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -484,6 +508,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", @@ -500,18 +534,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -519,9 +553,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -539,264 +573,875 @@ "dev": true, "license": "MIT" }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.82.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.82.0.tgz", - "integrity": "sha512-xs3OTxPefjTZaoDS7H1X2pV33enAmZg+8YldjmeYk7XZnq420phdnp6o0JtrsHBdSRJ5+RTocgyED9TL3epgpw==", + "node_modules/@changesets/apply-release-plan": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", + "integrity": "sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/config": "^3.1.4", + "@changesets/get-version-range-type": "^0.4.0", + "@changesets/git": "^3.0.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.8", - "@typescript-eslint/types": "^8.53.1", - "comment-parser": "1.4.4", - "esquery": "^1.7.0", - "jsdoc-type-pratt-parser": "~7.1.0" - }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=8" } }, - "node_modules/@es-joy/jsdoccomment/node_modules/comment-parser": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.4.tgz", - "integrity": "sha512-0D6qSQ5IkeRrGJFHRClzaMOenMeT0gErz3zIw3AprKMqhRN6LNU2jQOdkPG/FZ+8bCgXE1VidrgSzlBBDZRr8A==", + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@es-joy/resolve.exports": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", - "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "node_modules/@changesets/apply-release-plan/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "node_modules/@changesets/assemble-release-plan": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz", + "integrity": "sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "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" + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "semver": "^7.5.3" } }, - "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" + "node_modules/@changesets/changelog-git": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", + "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0" + } + }, + "node_modules/@changesets/cli": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.31.0.tgz", + "integrity": "sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/apply-release-plan": "^7.1.1", + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/changelog-git": "^0.2.1", + "@changesets/config": "^3.1.4", + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/get-release-plan": "^4.0.16", + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.2", + "@manypkg/get-packages": "^1.1.3", + "ansi-colors": "^4.1.3", + "enquirer": "^2.4.1", + "fs-extra": "^7.0.1", + "mri": "^1.2.0", + "package-manager-detector": "^0.2.0", + "picocolors": "^1.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "spawndamnit": "^3.0.1", + "term-size": "^2.1.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "bin": { + "changeset": "bin.js" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@changesets/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "node_modules/@changesets/config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.4.tgz", + "integrity": "sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@changesets/errors": "^0.2.0", + "@changesets/get-dependents-graph": "^2.1.4", + "@changesets/logger": "^0.1.1", + "@changesets/should-skip-package": "^0.1.2", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.8" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@changesets/errors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", + "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "extendable-error": "^0.1.5" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@changesets/get-dependents-graph": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz", + "integrity": "sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "picocolors": "^1.1.0", + "semver": "^7.5.3" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "node_modules/@changesets/get-github-info": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.8.0.tgz", + "integrity": "sha512-cRnC+xdF0JIik7coko3iUP9qbnfi1iJQ3sAa6dE+Tx3+ET8bjFEm63PA4WEohgjYcmsOikPHWzPsMWWiZmntOQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" } }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "node_modules/@changesets/get-release-plan": { + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz", + "integrity": "sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "dependencies": { + "@changesets/assemble-release-plan": "^6.0.10", + "@changesets/config": "^3.1.4", + "@changesets/pre": "^2.0.2", + "@changesets/read": "^0.6.7", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" } }, - "node_modules/@eslint/markdown": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.5.1.tgz", - "integrity": "sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==", + "node_modules/@changesets/get-version-range-type": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", + "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", + "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", "dev": true, "license": "MIT", - "workspaces": [ - "examples/*" - ], "dependencies": { - "@eslint/core": "^0.17.0", - "@eslint/plugin-kit": "^0.4.1", - "github-slugger": "^2.0.0", - "mdast-util-from-markdown": "^2.0.2", - "mdast-util-frontmatter": "^2.0.1", - "mdast-util-gfm": "^3.1.0", - "micromark-extension-frontmatter": "^2.0.0", - "micromark-extension-gfm": "^3.0.0", - "micromark-util-normalize-identifier": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@changesets/errors": "^0.2.0", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.8", + "spawndamnit": "^3.0.1" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "node_modules/@changesets/logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", + "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "node_modules/@changesets/parse": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.3.tgz", + "integrity": "sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@changesets/types": "^6.1.0", + "js-yaml": "^4.1.1" } }, - "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==", + "node_modules/@changesets/pre": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", + "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.2.0", + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" } }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "node_modules/@changesets/read": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", + "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" + "@changesets/git": "^3.0.4", + "@changesets/logger": "^0.1.1", + "@changesets/parse": "^0.4.3", + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0", + "picocolors": "^1.1.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@changesets/should-skip-package": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", + "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "@manypkg/get-packages": "^1.1.3" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "node_modules/@changesets/types": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", + "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config": { + "node_modules/@changesets/write": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", + "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@changesets/types": "^6.1.0", + "fs-extra": "^7.0.1", + "human-id": "^4.1.1", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@codspeed/core": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@codspeed/core/-/core-5.3.0.tgz", + "integrity": "sha512-++/kkPHPFI+dzX6FD+w+jFgKk8rgm5O1Tpg5nKUuFLENaB9ma///CZv76HdYZTJHu46dEeWwxGH+z0G3lLh59Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.4.0", + "find-up": "^6.3.0", + "form-data": "^4.0.4", + "node-gyp-build": "^4.6.0" + } + }, + "node_modules/@codspeed/core/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/@codspeed/core/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/@codspeed/core/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/@codspeed/core/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, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@codspeed/core/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/@codspeed/core/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz", + "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.58.0", + "comment-parser": "1.4.6", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~7.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "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" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/markdown": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.1.tgz", + "integrity": "sha512-WWKmld/EyNdEB8GMq7JMPX1SDWgyJAM1uhtCi5ySrqYQM4HQjmg11EX/q3ZpnpRXHfdccFtli3NBvvGaYjWyQw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0", + "micromark-extension-math": "^3.1.0", + "micromark-util-normalize-identifier": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/markdown/node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/markdown/node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", @@ -887,88 +1532,241 @@ "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", + "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", + "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", + "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.3.0", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", + "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", + "@types/node": "*", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@jest/globals": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", + "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" + }, "engines": { - "node": ">=8" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" + "jest-regex-util": "30.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "node_modules/@jest/reporters": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", + "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -979,226 +1777,206 @@ } } }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "node_modules/@jest/reporters/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", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@jest/reporters/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==", + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "node_modules/@jest/snapshot-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", + "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/source-map/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==", + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", + "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", + "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" + "@jest/test-result": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", + "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "@babel/core": "^7.27.4", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "pirates": "^4.0.7", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "write-file-atomic": "^5.0.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/transform/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", - "engines": { - "node": ">=0.10.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -1249,25 +2027,215 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "license": "MIT" + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" + } + }, + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } }, "node_modules/@pkgr/core": { "version": "0.2.9", @@ -1289,6 +2257,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "dev": true, + "license": "MIT" + }, "node_modules/@sindresorhus/base62": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", @@ -1303,9 +2278,9 @@ } }, "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1313,24 +2288,24 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.1" } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.7.1.tgz", - "integrity": "sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/types": "^8.53.1", + "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", @@ -1340,17 +2315,18 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=9.0.0" + "eslint": "^9.0.0 || ^10.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@types/babel__core": { @@ -1399,9 +2375,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "license": "MIT", "dependencies": { @@ -1414,7 +2390,6 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1438,14 +2413,14 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/unist": "*" } }, "node_modules/@types/istanbul-lib-coverage": { @@ -1476,14 +2451,14 @@ } }, "node_modules/@types/jest": { - "version": "27.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", - "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", "dev": true, "license": "MIT", "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" + "expect": "^30.0.0", + "pretty-format": "^30.0.0" } }, "node_modules/@types/json-schema": { @@ -1500,6 +2475,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -1518,22 +2507,15 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1549,9 +2531,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "16.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.11.tgz", - "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -1566,21 +2548,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", - "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/type-utils": "8.53.1", - "@typescript-eslint/utils": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1590,9 +2571,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.53.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@typescript-eslint/parser": "^8.58.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -1606,17 +2587,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", - "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "engines": { @@ -1627,19 +2607,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", - "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.53.1", - "@typescript-eslint/types": "^8.53.1", + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "engines": { @@ -1650,18 +2630,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", - "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1" + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1672,9 +2652,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", - "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", "dev": true, "license": "MIT", "engines": { @@ -1685,21 +2665,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", - "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1709,14 +2689,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", - "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", "dev": true, "license": "MIT", "engines": { @@ -1728,21 +2708,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", - "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.53.1", - "@typescript-eslint/tsconfig-utils": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/visitor-keys": "8.53.1", + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", - "minimatch": "^9.0.5", + "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1752,46 +2732,59 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", - "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.53.1", - "@typescript-eslint/types": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1" + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1801,19 +2794,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", - "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.53.1", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.58.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1823,6 +2816,295 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -2005,43 +3287,10 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2074,33 +3323,10 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2133,9 +3359,9 @@ } }, "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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -2166,6 +3392,16 @@ "node": ">=0.4.2" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2208,13 +3444,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2230,9 +3459,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2299,6 +3528,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -2452,60 +3691,71 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", + "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", + "@jest/transform": "30.3.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.8.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", "dev": true, "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", + "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "@types/babel__core": "^7.20.5" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -2536,20 +3786,20 @@ } }, "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", + "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" + "babel-plugin-jest-hoist": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/balanced-match": { @@ -2560,13 +3810,29 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", - "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", + "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/brace-expansion": { @@ -2593,13 +3859,6 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -2620,7 +3879,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -2715,13 +3973,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true, - "license": "MIT" - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2743,9 +3994,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "version": "1.0.30001781", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", + "integrity": "sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==", "dev": true, "funding": [ { @@ -2819,6 +4070,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -2830,9 +4088,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -2846,9 +4104,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "dev": true, "license": "MIT" }, @@ -2875,23 +4133,6 @@ "node": ">=0.8.0" } }, - "node_modules/cli-color": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", - "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.64", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -2963,9 +4204,9 @@ "license": "MIT" }, "node_modules/comment-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz", - "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz", + "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==", "dev": true, "license": "MIT", "engines": { @@ -2994,9 +4235,9 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { @@ -3022,62 +4263,6 @@ "node": ">= 8" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "dev": true, - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -3132,6 +4317,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3150,13 +4342,6 @@ } } }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, "node_modules/decode-named-character-reference": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", @@ -3172,11 +4357,19 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-is": { "version": "0.1.4", @@ -3288,14 +4481,17 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8" } }, "node_modules/doctrine": { @@ -3311,30 +4507,6 @@ "node": ">=0.10.0" } }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3350,21 +4522,28 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.277", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.277.tgz", - "integrity": "sha512-wKXFZw4erWmmOz5N/grBoJ2XrNJGDFMu2+W5ACHza5rHtvsqrK4gb6rnLC7XxKB9WlJ+RmyQatuEXmtm86xbnw==", + "version": "1.5.321", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", "dev": true, "license": "ISC" }, "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" @@ -3378,19 +4557,33 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -3491,9 +4684,9 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", + "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3512,6 +4705,7 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0", "safe-array-concat": "^1.1.3" }, "engines": { @@ -3585,62 +4779,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "dev": true, - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3664,60 +4802,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/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", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -3736,7 +4840,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -3780,7 +4884,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3792,37 +4895,37 @@ } }, "node_modules/eslint-config-webpack": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.9.0.tgz", - "integrity": "sha512-HHmimH5Ityp4VUmmomtl6oDqkTvd0ser53dpbEQmoO9A2/SxYc+TB8wLJV6Ad1SNBsK7sULHSOItUrVWp76tmA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.9.5.tgz", + "integrity": "sha512-A4FtsxyBZfLF69zX0+18EolUMNSkua3vKAz9GV0XovQIbK/TqE8qenXziq+sMvzIWFwTJXhhtd5gFTUjccuZmQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint/js": "^9.39.2", - "@eslint/markdown": "^7.5.1", - "@stylistic/eslint-plugin": "^5.7.0", + "@eslint/markdown": "^8.0.1", + "@stylistic/eslint-plugin": "^5.10.0", "detect-indent": "^7.0.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.12.1", - "eslint-plugin-jsdoc": "^62.3.0", - "eslint-plugin-n": "^17.23.2", + "eslint-plugin-jest": "^29.15.1", + "eslint-plugin-jsdoc": "^62.9.0", + "eslint-plugin-n": "^17.24.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-unicorn": "^62.0.0", - "globals": "^17.0.0", - "jsonc-eslint-parser": "^2.4.2", - "semver": "^7.7.3", + "eslint-plugin-unicorn": "^64.0.0", + "globals": "^17.4.0", + "jsonc-eslint-parser": "^3.1.0", + "semver": "^7.7.4", "sort-package-json": "^3.6.0", - "typescript-eslint": "^8.53.1" + "typescript-eslint": "^8.58.0" }, "engines": { "node": ">= 20.9.0" }, "peerDependencies": { "eslint": ">= 9.28.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <7.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3831,9 +4934,9 @@ } }, "node_modules/eslint-config-webpack/node_modules/globals": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.1.0.tgz", - "integrity": "sha512-8HoIcWI5fCvG5NADj4bDav+er9B9JMj2vyL2pI8D0eismKyUvPLTSs+Ln3wqhwcp306i73iyVnEKx3F6T47TGw==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", "dev": true, "license": "MIT", "engines": { @@ -3970,9 +5073,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "29.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.12.1.tgz", - "integrity": "sha512-Rxo7r4jSANMBkXLICJKS0gjacgyopfNAsoS0e3R9AHnjoKuQOaaPfmsDJPi8UWwygI099OV/K/JhpYRVkxD4AA==", + "version": "29.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.1.tgz", + "integrity": "sha512-6BjyErCQauz3zfJvzLw/kAez2lf4LEpbHLvWBfEcG4EI0ZiRSwjoH2uZulMouU8kRkBH+S0rhqn11IhTvxKgKw==", "dev": true, "license": "MIT", "dependencies": { @@ -3983,8 +5086,9 @@ }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0", - "eslint": "^8.57.0 || ^9.0.0", - "jest": "*" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "jest": "*", + "typescript": ">=4.8.4 <7.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -3992,28 +5096,31 @@ }, "jest": { "optional": true + }, + "typescript": { + "optional": true } } }, "node_modules/eslint-plugin-jsdoc": { - "version": "62.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.3.1.tgz", - "integrity": "sha512-eQzrU7Z8FFSKdUgurmz8XZMz25GC5807uPmAV1x/Dw+xLteJEqPjbsdBT1pYB5p3uSsD4q3tCbJOpVLMNiTSSw==", + "version": "62.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz", + "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.82.0", + "@es-joy/jsdoccomment": "~0.86.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.5", + "comment-parser": "1.4.6", "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^11.1.0", + "espree": "^11.2.0", "esquery": "^1.7.0", "html-entities": "^2.6.0", "object-deep-merge": "^2.0.0", "parse-imports-exports": "^0.2.4", - "semver": "^7.7.3", + "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, @@ -4021,13 +5128,13 @@ "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", - "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4038,15 +5145,15 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/espree": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.0.tgz", - "integrity": "sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.0" + "eslint-visitor-keys": "^5.0.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -4056,9 +5163,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.2.tgz", - "integrity": "sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==", + "version": "17.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz", + "integrity": "sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==", "dev": true, "license": "MIT", "dependencies": { @@ -4180,19 +5287,25 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4208,29 +5321,27 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "62.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-62.0.0.tgz", - "integrity": "sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==", + "version": "64.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-64.0.0.tgz", + "integrity": "sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", - "@eslint-community/eslint-utils": "^4.9.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint-community/eslint-utils": "^4.9.1", "change-case": "^5.4.4", - "ci-info": "^4.3.1", + "ci-info": "^4.4.0", "clean-regexp": "^1.0.0", - "core-js-compat": "^3.46.0", - "esquery": "^1.6.0", + "core-js-compat": "^3.49.0", "find-up-simple": "^1.0.1", - "globals": "^16.4.0", + "globals": "^17.4.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.13.0", - "semver": "^7.7.3", + "semver": "^7.7.4", "strip-indent": "^4.1.1" }, "engines": { @@ -4244,9 +5355,9 @@ } }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", "dev": true, "license": "MIT", "engines": { @@ -4286,22 +5397,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -4380,17 +5475,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -4425,40 +5509,40 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", "dev": true, - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -4474,6 +5558,36 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4505,6 +5619,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fault": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", @@ -4618,32 +5742,83 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, - "license": "MIT", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", "dependencies": { - "is-callable": "^1.2.7" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -4651,7 +5826,7 @@ "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", - "mime-types": "^2.1.35" + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" @@ -4666,6 +5841,21 @@ "node": ">=0.4.x" } }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4840,9 +6030,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4873,7 +6063,7 @@ "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", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -4941,6 +6131,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", @@ -5079,19 +6290,6 @@ "hermes-estree": "0.25.1" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -5116,33 +6314,14 @@ "dev": true, "license": "MIT" }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/human-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", + "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "bin": { + "human-id": "dist/cli.js" } }, "node_modules/human-signals": { @@ -5155,19 +6334,6 @@ "node": ">=10.17.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5575,20 +6741,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -5667,6 +6819,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/is-symbol": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", @@ -5701,13 +6866,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -5754,6 +6912,16 @@ "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/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -5779,30 +6947,20 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/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", - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -5821,30 +6979,20 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/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", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", @@ -5877,23 +7025,39 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", + "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", + "import-local": "^3.2.0", + "jest-cli": "30.3.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -5905,76 +7069,75 @@ } }, "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", + "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" + "execa": "^5.1.1", + "jest-util": "30.3.0", + "p-limit": "^3.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", + "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "p-limit": "^3.1.0", + "pretty-format": "30.3.0", + "pure-rand": "^7.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", + "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "yargs": "^17.7.2" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -5985,278 +7148,336 @@ } } }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.3.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", + "pretty-format": "30.3.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, "ts-node": { "optional": true } } }, - "node_modules/jest-config/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "node_modules/jest-config/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "node_modules/jest-config/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "detect-newline": "^3.0.0" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "node_modules/jest-diff": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" + "@jest/diff-sequences": "30.3.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" + "detect-newline": "^3.1.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "node_modules/jest-each": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", + "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "jest-util": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "node_modules/jest-environment-node": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", + "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" + }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", + "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "30.3.0", "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "picomatch": "^4.0.3", + "walker": "^1.0.8" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "optionalDependencies": { - "fsevents": "^2.3.2" + "fsevents": "^2.3.3" } }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/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", + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", + "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@jest/get-type": "30.1.0", + "pretty-format": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.3.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-util": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -6278,230 +7499,286 @@ } }, "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, "license": "MIT", "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", + "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", + "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", + "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "node_modules/jest-runner/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", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "node_modules/jest-runner/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", "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" + "has-flag": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "node_modules/jest-runtime": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", + "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, "engines": { - "node": ">=8.6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-snapshot": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", + "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", + "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "^27.5.1" + "pretty-format": "30.3.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { @@ -6518,22 +7795,23 @@ } }, "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", + "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.3.0", + "string-length": "^4.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker": { @@ -6588,62 +7866,15 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.0.tgz", - "integrity": "sha512-SX7q7XyCwzM/MEDCYz0l8GgGbJAACGFII9+WfNYr5SLEKukHWRy2Jk3iWRe7P+lpYJNs7oQ+OSei4JtKGUjd7A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz", + "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==", "dev": true, "license": "MIT", "engines": { "node": ">=20.0.0" } }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -6671,61 +7902,28 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-to-typescript": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-9.1.1.tgz", - "integrity": "sha512-VrdxmwQROjPBRlHxXwGUa2xzhOMPiNZIVsxZrZjMYtbI7suRFMiEktqaD/gqhfSya7Djy+x8dnJT+H0/0sZO0Q==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", + "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.4", - "cli-color": "^2.0.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.1", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "mz": "^2.7.0", - "prettier": "^2.0.5", - "stdin": "0.0.1" + "@apidevtools/json-schema-ref-parser": "^11.5.5", + "@types/json-schema": "^7.0.15", + "@types/lodash": "^4.17.7", + "is-glob": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "prettier": "^3.2.5", + "tinyglobby": "^0.2.9" }, "bin": { "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/json-schema-to-typescript/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=16.0.0" } }, "node_modules/json-schema-traverse": { @@ -6742,13 +7940,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6763,53 +7954,44 @@ } }, "node_modules/jsonc-eslint-parser": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", - "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-3.1.0.tgz", + "integrity": "sha512-75EA7EWZExL/j+MDKQrRbdzcRI2HOkRlmUw8fZJc1ioqFEOvBsq7Rt+A6yCxOt9w/TYNpkt52gC6nm/g5tFIng==", "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.5.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^5.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://github.com/sponsors/ota-meshi" } }, "node_modules/jsonc-eslint-parser/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": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/jsonc-eslint-parser/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==", + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "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" + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, "node_modules/jsx-ast-utils": { @@ -6828,24 +8010,41 @@ "node": ">=4.0" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/katex": { + "version": "0.16.45", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz", + "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==", "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" } }, "node_modules/leven": { @@ -6910,9 +8109,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, @@ -6937,10 +8136,17 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.18.1.tgz", + "integrity": "sha512-5urZrLnV/VD6zHK5KsVtZgt7H19v51mIzoS0aBNH8yp3I8tbswrEjOABOPY8m8uB7NuibubLrMX+Y0PXsU9X+w==", "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", "dev": true, "license": "MIT", @@ -6993,16 +8199,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -7081,9 +8277,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7244,6 +8440,26 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", @@ -7295,26 +8511,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/memoizee": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", - "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", - "dev": true, - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "es5-ext": "^0.10.64", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7322,6 +8518,16 @@ "dev": true, "license": "MIT" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -7538,6 +8744,26 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", @@ -7945,9 +9171,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -7991,9 +9217,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -8013,17 +9239,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { - "node": ">=10" + "node": ">=4" } }, "node_modules/ms": { @@ -8033,16 +9266,20 @@ "dev": true, "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "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": { @@ -8059,12 +9296,92 @@ "dev": true, "license": "MIT" }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/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", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/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==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } }, "node_modules/node-int64": { "version": "0.4.0", @@ -8074,9 +9391,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "dev": true, "license": "MIT" }, @@ -8103,13 +9420,6 @@ "node": ">=8" } }, - "node_modules/nwsapi": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", - "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -8284,6 +9594,13 @@ "node": ">= 0.8.0" } }, + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", + "dev": true, + "license": "MIT" + }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -8302,6 +9619,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8334,6 +9664,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -8344,6 +9684,23 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", + "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.7" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8393,13 +9750,6 @@ "dev": true, "license": "MIT" }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8437,6 +9787,40 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8445,9 +9829,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -8457,6 +9841,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -8567,12 +9961,11 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8614,18 +10007,18 @@ } }, "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -8641,20 +10034,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -8674,17 +10053,14 @@ "dev": true, "license": "MIT" }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" + "engines": { + "node": ">=10" } }, "node_modules/punycode": { @@ -8697,29 +10073,117 @@ "node": ">=6" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/read-yaml-file/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/reflect.getprototypeof": { "version": "1.0.10", @@ -8776,9 +10240,9 @@ } }, "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8808,13 +10272,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/reserved-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", @@ -8892,31 +10349,39 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "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", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "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", + "dependencies": { + "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { @@ -8939,27 +10404,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" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -9002,19 +10446,6 @@ "dev": true, "license": "MIT" }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/schema-utils": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", @@ -9036,12 +10467,11 @@ } }, "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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -9074,9 +10504,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -9086,16 +10516,6 @@ "node": ">=10" } }, - "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", - "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", @@ -9251,13 +10671,6 @@ "dev": true, "license": "ISC" }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -9276,9 +10689,9 @@ "license": "MIT" }, "node_modules/sort-package-json": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.6.0.tgz", - "integrity": "sha512-fyJsPLhWvY7u2KsKPZn1PixbXp+1m7V8NWqU8CvgFRbMEX41Ffw1kD8n0CfJiGoaSfoAvbrqRRl/DcHO8omQOQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.6.1.tgz", + "integrity": "sha512-Chgejw1+10p2D0U2tB7au1lHtz6TkFnxmvZktyBCRyV0GgmF6nl1IxXxAsPtJVsUyg/fo+BfCMAVVFUVRkAHrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9377,6 +10790,30 @@ "node": ">=0.8.0" } }, + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" + } + }, + "node_modules/spawndamnit/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -9396,9 +10833,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, "license": "CC0-1.0" }, @@ -9432,12 +10869,6 @@ "node": ">=8" } }, - "node_modules/stdin": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", - "integrity": "sha512-2bacd1TXzqOEsqRa+eEWkRdOSznwptrs4gqFcpMq5tOtmJUGPZd10W5Lam6wQ4YQ/+qjQt4e9u35yXCF6mrlfQ==", - "dev": true - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -9481,6 +10912,22 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.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", @@ -9592,6 +11039,20 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "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/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -9651,20 +11112,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -9678,13 +11125,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, "node_modules/synckit": { "version": "0.11.12", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", @@ -9702,9 +11142,9 @@ } }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.1.tgz", + "integrity": "sha512-b+u3CEM6FjDHru+nhUSjDofpWSBp2rINziJWgApm72wwGasQ/wKXftZe4tI2Y5HPv6OpzXSZHOFq87H4vfsgsw==", "dev": true, "license": "MIT", "engines": { @@ -9715,16 +11155,12 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, "engines": { "node": ">=8" }, @@ -9733,9 +11169,9 @@ } }, "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9752,16 +11188,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "dev": true, "license": "MIT", "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": { @@ -9801,48 +11236,14 @@ "node": ">=8" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/tinybench": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.0.0.tgz", + "integrity": "sha512-BWlWpVbbZXaYjRV0twGLNQO00Zj4HA/sjLOQP2IvzQqGwRGp+2kh7UU3ijyJ3ywFRogYDRbiHDMrUOfaMnN56g==", "dev": true, "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/timers-ext": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", - "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", - "dev": true, - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "next-tick": "^1.1.0" - }, "engines": { - "node": ">=0.12" + "node": ">=20.0.0" } }, "node_modules/tinyglobby": { @@ -9900,8 +11301,9 @@ } }, "node_modules/tooling": { - "version": "1.24.4", - "resolved": "git+ssh://git@github.com/webpack/tooling.git#064e6fbbf73858f135b32f842f3e381837100d28", + "version": "1.26.1", + "resolved": "git+ssh://git@github.com/webpack/tooling.git#a671b6d21a06387d0323d328346b9c4893beda10", + "integrity": "sha512-TnTaACVnaZuZRLMLQTwQPzID8oKjtld8VlMhVpozAz58Rofcg4TTOSIsXTTWvaw7pP+Y6giOmaVuEi61bLaK6g==", "dev": true, "license": "MIT", "dependencies": { @@ -9909,7 +11311,7 @@ "ajv": "^8.1.0", "commondir": "^1.0.1", "glob": "^7.1.6", - "json-schema-to-typescript": "^9.1.1", + "json-schema-to-typescript": "^15.0.4", "terser": "^5.32.0", "yargs": "^16.1.1" }, @@ -9919,9 +11321,9 @@ } }, "node_modules/tooling/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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -9942,39 +11344,10 @@ "dev": true, "license": "MIT" }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -10043,12 +11416,13 @@ "node": ">=4" } }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "ISC" + "license": "0BSD", + "optional": true }, "node_modules/type-check": { "version": "0.4.0", @@ -10164,23 +11538,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10190,16 +11553,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.53.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.53.1.tgz", - "integrity": "sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.53.1", - "@typescript-eslint/parser": "8.53.1", - "@typescript-eslint/typescript-estree": "8.53.1", - "@typescript-eslint/utils": "8.53.1" + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -10209,8 +11572,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/unbox-primitive": { @@ -10233,9 +11596,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -10253,6 +11616,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -10299,15 +11677,50 @@ } }, "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" } }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -10349,63 +11762,21 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -10430,20 +11801,10 @@ "node": ">=10.13.0" } }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10.4" - } - }, "node_modules/webpack": { - "version": "5.104.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", - "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", "dev": true, "license": "MIT", "dependencies": { @@ -10453,25 +11814,24 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.4", + "enhanced-resolve": "^5.20.0", "es-module-lexer": "^2.0.0", "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.3.1", - "mime-types": "^2.1.27", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -10490,9 +11850,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "dev": true, "license": "MIT", "engines": { @@ -10523,37 +11883,14 @@ "node": ">=4.0" } }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, "node_modules/which": { @@ -10689,6 +12026,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -10697,54 +12053,32 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=14" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10810,7 +12144,6 @@ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 4f6053c..64780f1 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,11 @@ { "name": "webpack-sources", - "version": "3.3.4", + "version": "3.4.0", "description": "Source code handling classes for webpack", - "keywords": ["webpack", "source-map"], + "keywords": [ + "webpack", + "source-map" + ], "homepage": "https://github.com/webpack/webpack-sources#readme", "bugs": { "url": "https://github.com/webpack/webpack-sources/issues" @@ -15,7 +18,10 @@ "author": "Tobias Koppers @sokra", "main": "lib/index.js", "types": "types.d.ts", - "files": ["lib/", "types.d.ts"], + "files": [ + "lib/", + "types.d.ts" + ], "scripts": { "lint": "npm run lint:code && npm run lint:types && npm run lint:types-test && npm run lint:special", "lint:code": "eslint --cache .", @@ -30,19 +36,26 @@ "fix:special": "node node_modules/tooling/inherit-types --write && node node_modules/tooling/format-file-header --write && node node_modules/tooling/generate-types --write", "pretest": "npm run lint", "test": "jest", - "cover": "jest --coverage" + "test:coverage": "jest --coverage", + "benchmark": "node --max-old-space-size=4096 --hash-seed=1 --random-seed=1 --no-opt --predictable --predictable-gc-schedule --interpreted-frames-native-stack --allow-natives-syntax --expose-gc --no-concurrent-sweeping ./benchmark/run.mjs", + "version": "changeset version", + "release": "changeset publish" }, "devDependencies": { - "@types/jest": "^27.5.2", + "@changesets/cli": "^2.30.0", + "@changesets/get-github-info": "^0.8.0", + "@codspeed/core": "^5.2.0", + "@types/jest": "^30.0.0", "eslint": "^9.28.0", "eslint-config-webpack": "^4.0.8", - "jest": "^27.5.1", + "jest": "^30.3.0", "prettier": "^3.5.3", "prettier-2": "npm:prettier@^2", "source-map": "^0.7.3", "sourcemap-validator": "^2.1.0", - "tooling": "webpack/tooling#v1.24.4", - "typescript": "^5.3.3", + "tinybench": "^6.0.0", + "tooling": "webpack/tooling#v1.26.1", + "typescript": "^6.0.2", "webpack": "^5.99.9" }, "engines": { diff --git a/test/CachedSource.js b/test/CachedSource.js index 1421e8d..52bced8 100644 --- a/test/CachedSource.js +++ b/test/CachedSource.js @@ -4,6 +4,7 @@ jest.mock("./__mocks__/createMappingsSerializer"); const crypto = require("crypto"); const { CachedSource } = require("../"); +const { ConcatSource } = require("../"); const { OriginalSource } = require("../"); const { RawSource } = require("../"); const { Source } = require("../"); @@ -419,4 +420,177 @@ describe.each([ expect(getHash(clone())).toBe(getHash(original)); expect(calls).toBe(3); }); + + it("should expose originalLazy (function form) and original()", () => { + const original = new RawSource("Hello World"); + const lazy = () => original; + const source = new CachedSource(lazy); + expect(source.originalLazy()).toBe(lazy); + expect(source.original()).toBe(original); + // After original() resolves the function, originalLazy returns the resolved source + expect(source.originalLazy()).toBe(original); + }); + + it("should compute size from cached buffer when _cachedSize is undefined", () => { + const buffer = Buffer.from("Hello World"); + // Provide cachedData with buffer but no size + const cachedSource = new CachedSource(new RawSource("Hello World"), { + buffer, + maps: new Map(), + }); + expect(cachedSource.size()).toBe(buffer.length); + expect(cachedSource.size()).toBe(buffer.length); + }); + + it("should return null for missing map when cached entry is empty", () => { + const cachedSource = new CachedSource(new RawSource("Hello World"), { + buffer: Buffer.from("Hello World"), + size: 11, + maps: new Map([["{}", {}]]), + }); + expect(cachedSource.map()).toBeNull(); + }); + + it("should flush accumulated hash strings when they exceed the threshold", () => { + class StringyHashSource extends Source { + source() { + return "ignored"; + } + + buffer() { + return Buffer.from("ignored"); + } + + size() { + return 7; + } + + map() { + return null; + } + + updateHash(hash) { + for (let i = 0; i < 15000; i++) { + hash.update(`chunk-${i}-`); + } + } + } + + const cachedSource = new CachedSource(new StringyHashSource()); + + const hashA = crypto.createHash("md5"); + cachedSource.updateHash(hashA); + const digestA = hashA.digest("hex"); + + // When hashing again, the cached hash update is replayed directly + const hashB = crypto.createHash("md5"); + cachedSource.updateHash(hashB); + const digestB = hashB.digest("hex"); + + expect(digestA).toBe(digestB); + }); + + it("should handle hash updates starting with a Buffer (no prior string to flush)", () => { + class BufferFirstHashSource extends Source { + source() { + return "text"; + } + + buffer() { + return Buffer.from("text"); + } + + size() { + return 4; + } + + map() { + return null; + } + + updateHash(hash) { + // Start with a Buffer so the tracker "else" branch runs + // with currentString === undefined, and also pass a long string + // so the length-gate in the "string" branch is exercised. + hash.update(Buffer.from("leading-buffer-")); + hash.update("a".repeat(11000)); + hash.update("short-string"); + } + } + + const cachedSource = new CachedSource(new BufferFirstHashSource()); + const hashA = crypto.createHash("md5"); + cachedSource.updateHash(hashA); + const digestA = hashA.digest("hex"); + + const hashB = crypto.createHash("md5"); + cachedSource.updateHash(hashB); + const digestB = hashB.digest("hex"); + + expect(digestA).toBe(digestB); + }); + + it("should allow streamChunks when cached map exists but source is not cached", () => { + const original = new OriginalSource("Hello World", "file.js"); + const cachedSource = new CachedSource(original); + + // Populate map cache only (no source/buffer cached yet) + cachedSource.map({}); + + const chunks = []; + cachedSource.streamChunks( + {}, + (...args) => { + chunks.push(args); + }, + () => {}, + () => {}, + ); + expect(chunks.length).toBeGreaterThan(0); + }); + + it("should return Buffer[] from buffers() and delegate to the original source", () => { + const original = new ConcatSource( + new RawSource(Buffer.from("hello ")), + new RawSource(Buffer.from("world")), + ); + const cachedSource = new CachedSource(original); + + const buffers = cachedSource.buffers(); + expect(Array.isArray(buffers)).toBe(true); + expect(buffers).toHaveLength(2); + expect(Buffer.concat(buffers).toString("utf8")).toBe("hello world"); + // The second call should return the cached array + expect(cachedSource.buffers()).toBe(buffers); + }); + + it("should return a single-entry Buffer[] from buffers() when buffer is already cached", () => { + const buffer = Buffer.from("cached"); + const original = new RawSource(buffer); + const cachedSource = new CachedSource(original); + // Populate the buffer cache + cachedSource.buffer(); + const buffers = cachedSource.buffers(); + expect(buffers).toHaveLength(1); + expect(buffers[0]).toBe(buffer); + }); + + it("should round-trip CachedSource with a Buffer-backed source", () => { + const buffer = Buffer.from(Array.from({ length: 64 }, (_, i) => i)); + const original = new RawSource(buffer); + const source = new CachedSource(original); + + // Populate _cachedSource with the Buffer + source.source(); + source.size(); + + const cachedData = source.getCachedData(); + expect(cachedData.source).toBe(false); + + // @ts-expect-error for tests + const clone = new CachedSource(null, cachedData); + expect(clone.source()).toEqual(source.source()); + expect(clone.buffer()).toEqual(source.buffer()); + expect(clone.size()).toEqual(source.size()); + }); }); diff --git a/test/CompatSource.js b/test/CompatSource.js index 96776f3..f78085b 100644 --- a/test/CompatSource.js +++ b/test/CompatSource.js @@ -36,4 +36,132 @@ describe("compatSource", () => { }); expect(calledWith).toEqual([Buffer.from(CONTENT)]); }); + + it("should use buffer from source-like when provided", () => { + const CONTENT = "Line1\n\nLine3\n"; + const buffer = Buffer.from(CONTENT); + const source = CompatSource.from({ + source() { + return CONTENT; + }, + buffer() { + return buffer; + }, + }); + expect(source.buffer()).toBe(buffer); + }); + + it("should use buffers from source-like when provided", () => { + const buffers = [Buffer.from("a"), Buffer.from("b")]; + const source = CompatSource.from({ + source() { + return "ab"; + }, + buffers() { + return buffers; + }, + }); + expect(source.buffers()).toBe(buffers); + }); + + it("should fall back to super buffers() when sourceLike doesn't provide it", () => { + const CONTENT = "Hello"; + const source = CompatSource.from({ + source() { + return CONTENT; + }, + }); + const buffers = source.buffers(); + expect(buffers).toHaveLength(1); + expect(buffers[0]).toEqual(Buffer.from(CONTENT)); + }); + + it("should use size from super when sourceLike doesn't define size", () => { + const CONTENT = "Hello"; + const source = CompatSource.from({ + source() { + return CONTENT; + }, + }); + expect(source.size()).toBe(5); + }); + + it("should call map from sourceLike when provided", () => { + const map = { + version: 3, + sources: ["a.js"], + names: [], + mappings: "", + file: "x", + }; + const source = CompatSource.from({ + source() { + return "content"; + }, + map() { + return map; + }, + updateHash(hash) { + hash.update("custom"); + }, + }); + expect(source.map()).toBe(map); + }); + + it("should call sourceAndMap from sourceLike when provided", () => { + const map = { + version: 3, + sources: ["a.js"], + names: [], + mappings: "", + file: "x", + }; + const sourceAndMap = { source: "content", map }; + const source = CompatSource.from({ + source() { + return "content"; + }, + sourceAndMap() { + return sourceAndMap; + }, + }); + expect(source.sourceAndMap()).toBe(sourceAndMap); + }); + + it("should call updateHash from sourceLike when provided", () => { + /** @type {(string | Buffer)[]} */ + const calledWith = []; + const source = CompatSource.from({ + source() { + return "content"; + }, + updateHash(hash) { + hash.update("custom-hash"); + }, + }); + source.updateHash({ + // @ts-expect-error for tests + update(value) { + calledWith.push(value); + }, + }); + expect(calledWith).toEqual(["custom-hash"]); + }); + + it("should throw when map is defined but updateHash is not", () => { + const source = CompatSource.from({ + source() { + return "content"; + }, + map() { + return null; + }, + }); + expect(() => { + source.updateHash({ + // @ts-expect-error for tests + update() {}, + }); + }).toThrow(/'map' method must also provide an 'updateHash' method/); + }); }); diff --git a/test/ConcatSource.js b/test/ConcatSource.js index f3a4df1..59c311f 100644 --- a/test/ConcatSource.js +++ b/test/ConcatSource.js @@ -212,6 +212,142 @@ describe("concatSource", () => { `); }); + it("should concat a SourceLike child without a buffer() method that returns a Buffer", () => { + const customBuffer = Buffer.from("custom-content"); + const customSource = { + source() { + return customBuffer; + }, + size() { + return customBuffer.length; + }, + }; + const source = new ConcatSource(customSource, new RawSource("-after")); + const result = source.buffer(); + expect(result).toEqual( + Buffer.concat([customBuffer, Buffer.from("-after")]), + ); + }); + + it("should expose individual buffers via buffers() without concatenating", () => { + const a = new RawSource(Buffer.from("a")); + const b = new RawSource(Buffer.from("b")); + const c = new RawSource(Buffer.from("c")); + const source = new ConcatSource(a, b, c); + const buffers = source.buffers(); + expect(Array.isArray(buffers)).toBe(true); + expect(buffers).toHaveLength(3); + expect(buffers[0]).toEqual(Buffer.from("a")); + expect(buffers[1]).toEqual(Buffer.from("b")); + expect(buffers[2]).toEqual(Buffer.from("c")); + expect(Buffer.concat(buffers)).toEqual(source.buffer()); + }); + + it("should flatten nested ConcatSource buffers() into a flat Buffer[]", () => { + const inner = new ConcatSource( + new RawSource(Buffer.from("x")), + new RawSource(Buffer.from("y")), + ); + const outer = new ConcatSource(new RawSource(Buffer.from("a")), inner); + const buffers = outer.buffers(); + expect(buffers).toHaveLength(3); + expect(Buffer.concat(buffers).toString("utf8")).toBe("axy"); + }); + + it("should fall back to buffer()/source() in buffers() for SourceLike children", () => { + const customBuffer = Buffer.from("custom"); + const bufferOnly = { + source() { + return customBuffer; + }, + buffer() { + return customBuffer; + }, + size() { + return customBuffer.length; + }, + }; + const sourceOnly = { + source() { + return Buffer.from("more"); + }, + size() { + return 4; + }, + }; + const source = new ConcatSource(bufferOnly, sourceOnly); + const buffers = source.buffers(); + expect(buffers).toHaveLength(2); + expect(buffers[0]).toBe(customBuffer); + expect(buffers[1]).toEqual(Buffer.from("more")); + }); + + it("should concat a SourceLike child where source() returns a string (no buffer())", () => { + const customSource = { + source() { + return "custom-content"; + }, + size() { + return "custom-content".length; + }, + }; + const source = new ConcatSource(customSource, new RawSource("-after")); + const result = source.buffer(); + expect(result).toEqual( + Buffer.concat([Buffer.from("custom-content"), Buffer.from("-after")]), + ); + }); + + it("should optimize nested string-only ConcatSources across re-optimization", () => { + // Create two ConcatSources that produce RawSource (kept in stringsAsRawSources) + const c1 = new ConcatSource("a", "b"); + c1.source(); // triggers _optimize, putting its RawSource("ab") into stringsAsRawSources + + const c2 = new ConcatSource("c", "d"); + c2.source(); // same, puts RawSource("cd") into stringsAsRawSources + + const merged = new ConcatSource(); + merged.add(c1); // flatten c1's children + merged.add("x"); + merged.add(c2); + merged.add("y"); + merged.add(c1); + expect(merged.source()).toBe("abxcdyab"); + }); + + it("should re-optimize when raw source followed by regular source", () => { + const c1 = new ConcatSource("a", "b"); + c1.source(); // places RawSource into stringsAsRawSources + const regular = new OriginalSource("Z", "z.js"); + const merged = new ConcatSource(); + merged.add(c1); // flatten + merged.add(regular); + expect(merged.source()).toBe("abZ"); + expect(merged.getChildren()).toHaveLength(2); + }); + + it("should reflect empty ConcatSource", () => { + const source = new ConcatSource(); + expect(source.source()).toBe(""); + expect(source.size()).toBe(0); + expect(source.buffer()).toEqual(Buffer.alloc(0)); + }); + + it("should flatten nested ConcatSource via add()", () => { + const inner = new ConcatSource("a", "b"); + const outer = new ConcatSource(); + outer.add(inner); + outer.add("c"); + expect(outer.source()).toBe("abc"); + }); + + it("should optimize on first getChildren() call", () => { + const source = new ConcatSource("a", "b", new RawSource("c")); + // Call getChildren without first calling source()/size()/buffer() + const children = source.getChildren(); + expect(children.length).toBeGreaterThan(0); + }); + it("should handle column mapping correctly with missing sources", () => { const source = new ConcatSource( "/*! For license information please see main.js.LICENSE.txt */", diff --git a/test/OriginalSource.js b/test/OriginalSource.js index b430936..8f6c779 100644 --- a/test/OriginalSource.js +++ b/test/OriginalSource.js @@ -102,6 +102,25 @@ describe.each([ expect(source.size()).toBe(256); }); + it("should expose getName()", () => { + const source = new OriginalSource("hi", "file.js"); + expect(source.getName()).toBe("file.js"); + }); + + it("should compute map correctly from buffer-backed source", () => { + const content = "Line1\nLine2\n"; + const source = new OriginalSource(Buffer.from(content), "file.js"); + expect(source.sourceAndMap().source).toBe(content); + }); + + it("should map correctly when constructed from a Buffer (streamChunks path)", () => { + const content = "Line1\nLine2\n"; + const source = new OriginalSource(Buffer.from(content), "file.js"); + // Calling map() without calling source() first to ensure streamChunks + // populates _value from the buffer + expect(source.map({ columns: false })).not.toBeNull(); + }); + it("should return the correct size for unicode files", () => { const source = new OriginalSource("😋", "file.js"); expect(source.size()).toBe(4); diff --git a/test/PrefixSource.js b/test/PrefixSource.js index bf56465..c64be40 100644 --- a/test/PrefixSource.js +++ b/test/PrefixSource.js @@ -2,9 +2,11 @@ jest.mock("./__mocks__/createMappingsSerializer"); +const crypto = require("crypto"); const { PrefixSource } = require("../"); const { OriginalSource } = require("../"); const { ConcatSource } = require("../"); +const { RawSource } = require("../"); const { withReadableMappings } = require("./helpers"); describe("prefixSource", () => { @@ -108,4 +110,63 @@ describe("prefixSource", () => { expect(source.sourceAndMap().source).toEqual(source.source()); }); + + it("should expose prefix and original source", () => { + const inner = new OriginalSource("Hello", "file.js"); + const source = new PrefixSource("> ", inner); + expect(source.getPrefix()).toBe("> "); + expect(source.original()).toBe(inner); + }); + + it("should update hash consistently", () => { + const source1 = new PrefixSource( + "> ", + new OriginalSource("Hello", "file.js"), + ); + const source2 = new PrefixSource( + "> ", + new OriginalSource("Hello", "file.js"), + ); + const source3 = new PrefixSource( + "> ", + new OriginalSource("World", "file.js"), + ); + + const hash1 = crypto.createHash("md5"); + source1.updateHash(hash1); + const digest1 = hash1.digest("hex"); + + const hash2 = crypto.createHash("md5"); + source2.updateHash(hash2); + const digest2 = hash2.digest("hex"); + + const hash3 = crypto.createHash("md5"); + source3.updateHash(hash3); + const digest3 = hash3.digest("hex"); + + expect(digest1).toBe(digest2); + expect(digest1).not.toBe(digest3); + }); + + it("should accept a raw string as source", () => { + const source = new PrefixSource("**", "line1\nline2"); + expect(source.source()).toBe("**line1\n**line2"); + }); + + it("should accept a Buffer as source", () => { + const source = new PrefixSource("**", Buffer.from("line1\nline2")); + expect(source.source()).toBe("**line1\n**line2"); + }); + + it("should work with RawSource (no map)", () => { + const source = new PrefixSource("> ", new RawSource("hello\nworld")); + expect(source.source()).toBe("> hello\n> world"); + }); + + it("should handle empty prefix (prefixOffset = 0)", () => { + const inner = new OriginalSource("hello\nworld\n", "file.js"); + const source = new PrefixSource("", inner); + expect(source.source()).toBe("hello\nworld\n"); + expect(source.sourceAndMap().source).toBe("hello\nworld\n"); + }); }); diff --git a/test/RawSource.js b/test/RawSource.js index 90f8741..2705a96 100644 --- a/test/RawSource.js +++ b/test/RawSource.js @@ -24,6 +24,42 @@ describe("rawSource", () => { expect(source.buffer()).toStrictEqual(source.buffer()); }); + it("converts to string on source() when constructed from buffer with convertToString=true", () => { + const source = new RawSource(Buffer.from(CODE_STRING), true); + expect(source.source()).toBe(CODE_STRING); + // Called again to hit cache path + expect(source.source()).toBe(CODE_STRING); + }); + + it("should throw TypeError for non-string non-Buffer value", () => { + expect(() => { + // @ts-expect-error for tests + // eslint-disable-next-line no-new + new RawSource(42); + }).toThrow(TypeError); + expect(() => { + // @ts-expect-error for tests + // eslint-disable-next-line no-new + new RawSource(null); + }).toThrow(TypeError); + expect(() => { + // @ts-expect-error for tests + // eslint-disable-next-line no-new + new RawSource({}); + }).toThrow(TypeError); + }); + + it("should report isBuffer() correctly for Buffer", () => { + const source = new RawSource(Buffer.from(CODE_STRING)); + expect(source.isBuffer()).toBe(true); + }); + + it("should return null from map()", () => { + const source = new RawSource(CODE_STRING); + expect(source.map()).toBeNull(); + expect(source.map({ columns: false })).toBeNull(); + }); + it("stream chunks works correctly", () => { const source = new RawSource(CODE_STRING, true); // @ts-expect-error for tests @@ -112,5 +148,22 @@ describe("rawSource", () => { }); expect.assertions(3); }); + + it("should handle streamChunks when constructed from a Buffer without pre-caching", () => { + // Buffer backing, convertToString=false. _valueAsString remains undefined. + const source = new RawSource(Buffer.from(CODE_STRING)); + /** @type {(string | undefined)[]} */ + const chunks = []; + // @ts-expect-error for tests + source.streamChunks(null, (chunk) => { + chunks.push(chunk); + }); + expect(chunks).toHaveLength(3); + }); + + it("should expose source() on a Buffer-backed RawSource", () => { + const source = new RawSource(Buffer.from(CODE_STRING)); + expect(source.source().toString("utf8")).toEqual(CODE_STRING); + }); }); }); diff --git a/test/ReplaceSource.js b/test/ReplaceSource.js index 83066db..b49acc6 100644 --- a/test/ReplaceSource.js +++ b/test/ReplaceSource.js @@ -4,9 +4,11 @@ jest.mock("./__mocks__/createMappingsSerializer"); +const crypto = require("crypto"); const validate = require("sourcemap-validator"); const { ReplaceSource } = require("../"); const { OriginalSource } = require("../"); +const { RawSource } = require("../"); const { SourceMapSource } = require("../"); const { withReadableMappings } = require("./helpers"); @@ -319,4 +321,134 @@ export default function StaticPage(_ref) { } `); }); + + it("should return getName()", () => { + const source = new ReplaceSource( + new OriginalSource("Hello World", "file.txt"), + "named.txt", + ); + expect(source.getName()).toBe("named.txt"); + }); + + it("should return getName() as undefined when not provided", () => { + const source = new ReplaceSource(new OriginalSource("Hi", "file.txt")); + expect(source.getName()).toBeUndefined(); + }); + + it("should return sorted replacements from getReplacements", () => { + const source = new ReplaceSource( + new OriginalSource("Hello World", "file.txt"), + ); + source.replace(6, 10, "Claude"); + source.replace(0, 4, "Howdy"); + const replacements = source.getReplacements(); + expect(replacements).toHaveLength(2); + expect(replacements[0].content).toBe("Howdy"); + expect(replacements[1].content).toBe("Claude"); + }); + + it("should throw when replace() gets non-string newValue", () => { + const source = new ReplaceSource( + new OriginalSource("Hello World", "file.txt"), + ); + expect(() => { + // @ts-expect-error for tests + source.replace(0, 4, 123); + }).toThrow(/insertion must be a string/); + }); + + it("should throw when insert() gets non-string newValue", () => { + const source = new ReplaceSource( + new OriginalSource("Hello World", "file.txt"), + ); + expect(() => { + // @ts-expect-error for tests + source.insert(0, 123); + }).toThrow(/insertion must be a string/); + }); + + it("should pass through source and map untouched when no replacements", () => { + const innerSource = new OriginalSource("Hello World", "file.txt"); + const source = new ReplaceSource(innerSource); + expect(source.source()).toBe(innerSource.source()); + expect(source.map()).toEqual(innerSource.map()); + expect(source.sourceAndMap()).toEqual(innerSource.sourceAndMap()); + }); + + it("should return original source when no replacements", () => { + const innerSource = new OriginalSource("Hello World", "file.txt"); + const source = new ReplaceSource(innerSource); + expect(source.original()).toBe(innerSource); + }); + + it("should update hash consistently", () => { + const inner = new OriginalSource("Hello World", "file.txt"); + + const source1 = new ReplaceSource(inner, "name"); + source1.replace(0, 4, "Howdy", "greeting"); + source1.insert(6, "[ins]"); + + const source2 = new ReplaceSource(inner, "name"); + source2.replace(0, 4, "Howdy", "greeting"); + source2.insert(6, "[ins]"); + + const source3 = new ReplaceSource(inner); + source3.replace(0, 4, "Hey"); + + const hash1 = crypto.createHash("md5"); + source1.updateHash(hash1); + const digest1 = hash1.digest("hex"); + + const hash2 = crypto.createHash("md5"); + source2.updateHash(hash2); + const digest2 = hash2.digest("hex"); + + const hash3 = crypto.createHash("md5"); + source3.updateHash(hash3); + const digest3 = hash3.digest("hex"); + + expect(digest1).toBe(digest2); + expect(digest1).not.toBe(digest3); + }); + + it("should handle replacements that skip a chunk ending with newline", () => { + const source = new ReplaceSource( + new OriginalSource( + ["line1", "line2", "line3", "line4"].join("\n"), + "file.txt", + ), + ); + source.replace(6, 17, "X"); + expect(source.source()).toBe("line1\nXline4"); + }); + + it("should handle multi-line replacement content", () => { + const source = new ReplaceSource( + new OriginalSource("hello world", "file.txt"), + ); + source.replace(6, 10, "multi\nline\nreplacement"); + expect(source.source()).toBe("hello multi\nline\nreplacement"); + }); + + it("should handle a replacement that happens at source end", () => { + const source = new ReplaceSource(new OriginalSource("hello", "file.txt")); + source.insert(5, " world"); + source.insert(5, "!"); + expect(source.source()).toBe("hello world!"); + }); + + it("should handle replacements ending with newline", () => { + const source = new ReplaceSource( + new OriginalSource("abc\ndef\nghi", "file.txt"), + ); + source.replace(0, 2, "xyz\n"); + expect(source.source()).toBe("xyz\n\ndef\nghi"); + }); + + it("should work with RawSource as source (no map)", () => { + const source = new ReplaceSource(new RawSource("Hello World")); + source.replace(6, 10, "You"); + expect(source.source()).toBe("Hello You"); + expect(source.sourceAndMap()).toHaveProperty("source", "Hello You"); + }); }); diff --git a/test/SizeOnlySource.js b/test/SizeOnlySource.js index 74d91d5..01c84f3 100644 --- a/test/SizeOnlySource.js +++ b/test/SizeOnlySource.js @@ -8,7 +8,7 @@ describe("sizeOnlySource", () => { expect(source.size()).toBe(42); }); - for (const method of ["source", "map", "sourceAndMap", "buffer"]) { + for (const method of ["source", "map", "sourceAndMap", "buffer", "buffers"]) { it(`should throw on ${method}()`, () => { const source = new SizeOnlySource(42); expect(() => { @@ -17,4 +17,14 @@ describe("sizeOnlySource", () => { }).toThrow(/not available/); }); } + + it("should throw on updateHash()", () => { + const source = new SizeOnlySource(42); + expect(() => { + source.updateHash({ + // @ts-expect-error for tests + update() {}, + }); + }).toThrow(/not available/); + }); }); diff --git a/test/Source.js b/test/Source.js new file mode 100644 index 0000000..594ad86 --- /dev/null +++ b/test/Source.js @@ -0,0 +1,89 @@ +"use strict"; + +const { Source } = require("../"); + +describe("source", () => { + it("should throw an Abstract error for source()", () => { + const source = new Source(); + expect(() => { + source.source(); + }).toThrow("Abstract"); + }); + + it("should throw an Abstract error for updateHash()", () => { + const source = new Source(); + expect(() => { + source.updateHash({ + // @ts-expect-error for tests + update() {}, + }); + }).toThrow("Abstract"); + }); + + it("should return null for map() by default", () => { + class DummySource extends Source { + source() { + return "dummy"; + } + } + const source = new DummySource(); + expect(source.map()).toBeNull(); + }); + + it("should return source and map for sourceAndMap()", () => { + class DummySource extends Source { + source() { + return "dummy"; + } + } + const source = new DummySource(); + expect(source.sourceAndMap()).toEqual({ + source: "dummy", + map: null, + }); + }); + + it("should compute buffer from string source by default", () => { + class DummySource extends Source { + source() { + return "dummy"; + } + } + const source = new DummySource(); + expect(source.buffer()).toEqual(Buffer.from("dummy", "utf8")); + }); + + it("should return buffer when source is already a buffer", () => { + const buffer = Buffer.from([1, 2, 3]); + class DummySource extends Source { + source() { + return buffer; + } + } + const source = new DummySource(); + expect(source.buffer()).toBe(buffer); + }); + + it("should compute size from buffer by default", () => { + class DummySource extends Source { + source() { + return "abcdef"; + } + } + const source = new DummySource(); + expect(source.size()).toBe(6); + }); + + it("should return a single-entry array for buffers() by default", () => { + class DummySource extends Source { + source() { + return "dummy"; + } + } + const source = new DummySource(); + const buffers = source.buffers(); + expect(Array.isArray(buffers)).toBe(true); + expect(buffers).toHaveLength(1); + expect(buffers[0]).toEqual(Buffer.from("dummy", "utf8")); + }); +}); diff --git a/test/SourceMapSource.js b/test/SourceMapSource.js index 4662d46..221cf47 100644 --- a/test/SourceMapSource.js +++ b/test/SourceMapSource.js @@ -578,6 +578,98 @@ describe.each([ expect(buffer2).toBe(buffer1); }); + it("should accept source map as string", () => { + const mapObj = { + version: 3, + sources: ["hello-source.txt"], + sourcesContent: ["hello world\n"], + mappings: "AAAA", + names: [], + file: "", + }; + const source = new SourceMapSource( + "hello world\n", + "hello.txt", + JSON.stringify(mapObj), + ); + expect(source.source()).toBe("hello world\n"); + const map = source.map(); + expect(map).toEqual({ ...mapObj }); + // call again to hit the cached string path in _sourceMapString + source.updateHash({ + // @ts-expect-error for tests + update() {}, + }); + }); + + it("should accept inner source map as string", () => { + const outerMap = { + version: 3, + sources: ["hello.txt"], + mappings: "AAAA", + names: [], + file: "", + }; + const innerMap = { + version: 3, + sources: ["hello-world.txt"], + mappings: "AAAA", + names: [], + file: "", + }; + const source = new SourceMapSource( + "hello world\n", + "hello.txt", + outerMap, + "hello world\n", + JSON.stringify(innerMap), + ); + // exercise _innerSourceMapBuffer via updateHash, then map() which + // calls _innerSourceMapObject which uses _innerSourceMapString - the string was already provided + source.updateHash({ + // @ts-expect-error for tests + update() {}, + }); + // also call map which will trigger _innerSourceMapObject (reads string) + expect(source.map()).not.toBeNull(); + }); + + it("should include remove original source flag in the hash", () => { + const outerMap = { + version: 3, + sources: ["hello.txt"], + mappings: "AAAA", + names: [], + file: "", + }; + const sourceA = new SourceMapSource( + "hello\n", + "hello.txt", + outerMap, + "hello\n", + null, + false, + ); + const sourceB = new SourceMapSource( + "hello\n", + "hello.txt", + outerMap, + "hello\n", + null, + true, + ); + + const hashA = crypto.createHash("md5"); + sourceA.updateHash(hashA); + const digestA = hashA.digest("hex"); + + const hashB = crypto.createHash("md5"); + sourceB.updateHash(hashB); + const digestB = hashB.digest("hex"); + + expect(digestA).not.toBe(digestB); + }); + for (const hash of [ ["md5", [crypto.createHash("md5"), crypto.createHash("md5")]], ["md4", [new BatchedHash(createMd4()), new BatchedHash(createMd4())]], diff --git a/test/__snapshots__/Fuzzy.js.snap b/test/__snapshots__/Fuzzy.js.snap index 4fdf875..4af250d 100644 --- a/test/__snapshots__/Fuzzy.js.snap +++ b/test/__snapshots__/Fuzzy.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`fuzzy 2 sources CachedSource CachedSource original lorem lines should return correct .map({"columns":false}) 1`] = ` Object { diff --git a/test/helpers-unit.js b/test/helpers-unit.js new file mode 100644 index 0000000..bee9e8d --- /dev/null +++ b/test/helpers-unit.js @@ -0,0 +1,324 @@ +"use strict"; + +const { + getMap, + getSourceAndMap, +} = require("../lib/helpers/getFromStreamChunks"); +const getGeneratedSourceInfo = require("../lib/helpers/getGeneratedSourceInfo"); +const getSource = require("../lib/helpers/getSource"); +const readMappings = require("../lib/helpers/readMappings"); +const splitIntoLines = require("../lib/helpers/splitIntoLines"); +const splitIntoPotentialTokens = require("../lib/helpers/splitIntoPotentialTokens"); +const streamAndGetSourceAndMap = require("../lib/helpers/streamAndGetSourceAndMap"); +const { + disableDualStringBufferCaching, + enableDualStringBufferCaching, + enterStringInterningRange, + exitStringInterningRange, + internString, + isDualStringBufferCachingEnabled, +} = require("../lib/helpers/stringBufferUtils"); + +describe("getGeneratedSourceInfo", () => { + it("should return empty object when source is undefined", () => { + expect(getGeneratedSourceInfo(undefined)).toEqual({}); + }); + + it("should return correct info for single line", () => { + const info = getGeneratedSourceInfo("hello world"); + expect(info).toEqual({ + generatedLine: 1, + generatedColumn: 11, + source: "hello world", + }); + }); + + it("should return correct info for multi-line source", () => { + const info = getGeneratedSourceInfo("hello\nworld\nfoo"); + expect(info.generatedLine).toBe(3); + expect(info.generatedColumn).toBe(3); + }); + + it("should count newlines accurately for trailing newline", () => { + const info = getGeneratedSourceInfo("a\nb\n"); + expect(info.generatedLine).toBe(3); + expect(info.generatedColumn).toBe(0); + }); + + it("should handle empty string as single empty line", () => { + const info = getGeneratedSourceInfo(""); + expect(info).toEqual({ + generatedLine: 1, + generatedColumn: 0, + source: "", + }); + }); +}); + +describe("getSource", () => { + const baseMap = { + version: 3, + sources: ["a.js", "b.js"], + names: [], + mappings: "", + file: "x", + }; + + it("should return null for negative index", () => { + expect(getSource(baseMap, -1)).toBeNull(); + }); + + it("should return source as-is when no sourceRoot", () => { + expect(getSource(baseMap, 0)).toBe("a.js"); + expect(getSource(baseMap, 1)).toBe("b.js"); + }); + + it("should prefix sourceRoot without trailing slash", () => { + expect(getSource({ ...baseMap, sourceRoot: "src" }, 0)).toBe("src/a.js"); + }); + + it("should prefix sourceRoot with trailing slash", () => { + expect(getSource({ ...baseMap, sourceRoot: "src/" }, 0)).toBe("src/a.js"); + }); +}); + +describe("splitIntoLines", () => { + it("should split simple lines", () => { + expect(splitIntoLines("a\nb\nc")).toEqual(["a\n", "b\n", "c"]); + }); + + it("should handle trailing newline", () => { + expect(splitIntoLines("a\nb\n")).toEqual(["a\n", "b\n"]); + }); + + it("should handle empty string", () => { + expect(splitIntoLines("")).toEqual([]); + }); +}); + +describe("splitIntoPotentialTokens", () => { + it("should split tokens from a non-empty string", () => { + const result = splitIntoPotentialTokens("a b c"); + expect(result).not.toBeNull(); + }); + + it("should return null for empty string", () => { + expect(splitIntoPotentialTokens("")).toBeNull(); + }); +}); + +describe("readMappings", () => { + it("should ignore out-of-range characters", () => { + const mappings = []; + // The tilde char (charCode 126) is out of the ccToValue range + readMappings("AAAA~;AAAA", (...args) => { + mappings.push(args); + }); + expect(mappings).toHaveLength(2); + expect(mappings[0]).toEqual([1, 0, 0, 1, 0, -1]); + }); + + it("should handle empty mappings", () => { + const mappings = []; + readMappings("", (...args) => { + mappings.push(args); + }); + expect(mappings).toHaveLength(0); + }); + + it("should parse simple mapping with source", () => { + const mappings = []; + readMappings("AAAA", (...args) => { + mappings.push(args); + }); + expect(mappings).toHaveLength(1); + expect(mappings[0]).toEqual([1, 0, 0, 1, 0, -1]); + }); + + it("should parse mapping with name", () => { + const mappings = []; + readMappings("AAAAA", (...args) => { + mappings.push(args); + }); + expect(mappings).toHaveLength(1); + expect(mappings[0]).toEqual([1, 0, 0, 1, 0, 0]); + }); + + it("should parse multiple lines", () => { + const mappings = []; + readMappings("AAAA;AACA", (...args) => { + mappings.push(args); + }); + expect(mappings).toHaveLength(2); + }); + + it("should preserve negative cumulative deltas (signed VLQ)", () => { + // Second segment "CAAD" emits deltas (+1, 0, 0, -1) which drives + // originalColumn negative. With an unsigned accumulator this would + // wrap to 4294967295. + const mappings = []; + readMappings("AAAA;CAAD", (...args) => { + mappings.push(args); + }); + expect(mappings).toHaveLength(2); + expect(mappings[0]).toEqual([1, 0, 0, 1, 0, -1]); + expect(mappings[1]).toEqual([2, 1, 0, 1, -1, -1]); + }); +}); + +describe("getFromStreamChunks", () => { + // A SourceLike with streamChunks that emits non-sequential indices so + // getMap/getSourceAndMap's gap-fill loops run. + const makeSparseSource = () => ({ + streamChunks(options, onChunk, onSource, onName) { + onSource(0, "first.js", "first content"); + // jump from 0 to 2, leaving index 1 empty + onSource(2, "third.js", "third content"); + onName(0, "alpha"); + onName(2, "gamma"); + onChunk("x", 1, 0, 0, 1, 0, 0); + onChunk("y", 1, 1, 2, 1, 0, 2); + return { generatedLine: 1, generatedColumn: 2, source: "xy" }; + }, + }); + + it("getMap fills missing source and name indices with null", () => { + const map = + /** @type {import("../lib/Source").RawSourceMap} */ + (getMap(makeSparseSource())); + expect(map).not.toBeNull(); + expect(map.sources).toEqual(["first.js", null, "third.js"]); + expect(map.sourcesContent).toEqual([ + "first content", + null, + "third content", + ]); + expect(map.names).toEqual(["alpha", null, "gamma"]); + }); + + it("getSourceAndMap fills missing source and name indices with null", () => { + const { map, source } = getSourceAndMap(makeSparseSource()); + const m = /** @type {import("../lib/Source").RawSourceMap} */ (map); + expect(source).toBe("xy"); + expect(m).not.toBeNull(); + expect(m.sources).toEqual(["first.js", null, "third.js"]); + expect(m.sourcesContent).toEqual(["first content", null, "third content"]); + expect(m.names).toEqual(["alpha", null, "gamma"]); + }); + + it("getMap returns null when no mappings are produced", () => { + const emptySource = { + streamChunks() { + return { generatedLine: 1, generatedColumn: 0, source: "" }; + }, + }; + expect(getMap(emptySource)).toBeNull(); + }); +}); + +describe("streamAndGetSourceAndMap", () => { + it("fills missing source and name indices and returns a map", () => { + const sparseSource = { + streamChunks(options, onChunk, onSource, onName) { + onSource(0, "first.js", "first content"); + onSource(2, "third.js", "third content"); + onName(0, "alpha"); + onName(2, "gamma"); + onChunk("x", 1, 0, 0, 1, 0, 0); + onChunk("y", 1, 1, 2, 1, 0, 2); + return { generatedLine: 1, generatedColumn: 2, source: "xy" }; + }, + }; + const chunks = []; + const sources = []; + const names = []; + const result = streamAndGetSourceAndMap( + // @ts-expect-error for tests + sparseSource, + {}, + (...args) => { + chunks.push(args); + }, + (...args) => { + sources.push(args); + }, + (...args) => { + names.push(args); + }, + ); + const { map: rawMap } = result; + const map = /** @type {import("../lib/Source").RawSourceMap} */ (rawMap); + expect(result.source).toBe("xy"); + expect(map.sources).toEqual(["first.js", null, "third.js"]); + expect(map.names).toEqual(["alpha", null, "gamma"]); + expect(chunks).toHaveLength(2); + expect(sources).toHaveLength(2); + expect(names).toHaveLength(2); + }); +}); + +describe("stringBufferUtils", () => { + afterEach(() => { + enableDualStringBufferCaching(); + }); + + it("should toggle dual string buffer caching", () => { + expect(isDualStringBufferCachingEnabled()).toBe(true); + disableDualStringBufferCaching(); + expect(isDualStringBufferCachingEnabled()).toBe(false); + enableDualStringBufferCaching(); + expect(isDualStringBufferCachingEnabled()).toBe(true); + }); + + it("should intern strings only when interning is enabled", () => { + const big = "a".repeat(200); + const big2 = `${"a".repeat(199)}a`; + // Ensure we start from a clean slate + expect(internString(big)).toBe(big); + + enterStringInterningRange(); + try { + const interned1 = internString(big); + const interned2 = internString(big2); + expect(interned1).toBe(big); + // Both strings have same content so should be deduplicated + expect(interned2).toBe(interned1); + } finally { + exitStringInterningRange(); + } + }); + + it("should not intern short strings", () => { + enterStringInterningRange(); + try { + const shortStr = "short"; + expect(internString(shortStr)).toBe(shortStr); + } finally { + exitStringInterningRange(); + } + }); + + it("should not intern falsy strings", () => { + enterStringInterningRange(); + try { + expect(internString("")).toBe(""); + } finally { + exitStringInterningRange(); + } + }); + + it("should nest interning ranges properly", () => { + enterStringInterningRange(); + enterStringInterningRange(); + const big = "b".repeat(200); + const interned1 = internString(big); + exitStringInterningRange(); + // Still enabled because one range is still open + const interned2 = internString(big); + expect(interned2).toBe(interned1); + exitStringInterningRange(); + // Now disabled; cache should be cleared, fresh string returned as-is + const freshStr = "c".repeat(200); + expect(internString(freshStr)).toBe(freshStr); + }); +}); diff --git a/test/package-entry.js b/test/package-entry.js index 65eb4c3..00882ba 100644 --- a/test/package-entry.js +++ b/test/package-entry.js @@ -23,4 +23,28 @@ describe("package-entry", () => { expect(require("../")[name]).toBe(require(`../lib/${name}`)); } }); + + it("should expose util.stringBufferUtils", () => { + const { util } = require("../"); + + expect(util.stringBufferUtils).toBe( + require("../lib/helpers/stringBufferUtils"), + ); + expect(typeof util.stringBufferUtils.isDualStringBufferCachingEnabled).toBe( + "function", + ); + expect(typeof util.stringBufferUtils.enableDualStringBufferCaching).toBe( + "function", + ); + expect(typeof util.stringBufferUtils.disableDualStringBufferCaching).toBe( + "function", + ); + expect(typeof util.stringBufferUtils.enterStringInterningRange).toBe( + "function", + ); + expect(typeof util.stringBufferUtils.exitStringInterningRange).toBe( + "function", + ); + expect(typeof util.stringBufferUtils.internString).toBe("function"); + }); }); diff --git a/types.d.ts b/types.d.ts index cf0ea71..8f03a14 100644 --- a/types.d.ts +++ b/types.d.ts @@ -318,6 +318,7 @@ declare class Source { constructor(); source(): SourceValue; buffer(): Buffer; + buffers(): Buffer[]; size(): number; map(options?: MapOptions): null | RawSourceMap; sourceAndMap(options?: MapOptions): SourceAndMap; @@ -345,6 +346,11 @@ declare interface SourceLike { */ buffer?: () => Buffer; + /** + * buffers + */ + buffers?: () => Buffer[]; + /** * size */