pax_global_header00006660000000000000000000000064152125055770014523gustar00rootroot0000000000000052 comment=6891a40951723d17f7478a810850e33f2facd7f9 watchpack-2.5.2/000077500000000000000000000000001521250557700134765ustar00rootroot00000000000000watchpack-2.5.2/.changeset/000077500000000000000000000000001521250557700155155ustar00rootroot00000000000000watchpack-2.5.2/.changeset/README.md000066400000000000000000000010001521250557700167630ustar00rootroot00000000000000# 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). watchpack-2.5.2/.changeset/changelog-generator.mjs000066400000000000000000000067701521250557700221550ustar00rootroot00000000000000import { 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; watchpack-2.5.2/.changeset/config.json000066400000000000000000000004371521250557700176610ustar00rootroot00000000000000{ "$schema": "https://unpkg.com/@changesets/config@3.1.2/schema.json", "changelog": ["./changelog-generator.mjs", { "repo": "webpack/watchpack" }], "fixed": [], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": [] } watchpack-2.5.2/.editorconfig000066400000000000000000000004331521250557700161530ustar00rootroot00000000000000root = true [*] indent_style = tab indent_size = 2 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true max_line_length = 80 [*.json] indent_style = space indent_size = 2 [*.yml] indent_style = space indent_size = 2 [*.md] trim_trailing_whitespace = false watchpack-2.5.2/.gitattributes000066400000000000000000000000521521250557700163660ustar00rootroot00000000000000* text=auto examples/* eol=lf bin/* eol=lfwatchpack-2.5.2/.github/000077500000000000000000000000001521250557700150365ustar00rootroot00000000000000watchpack-2.5.2/.github/dependabot.yml000066400000000000000000000010601521250557700176630ustar00rootroot00000000000000version: 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: - "*" watchpack-2.5.2/.github/workflows/000077500000000000000000000000001521250557700170735ustar00rootroot00000000000000watchpack-2.5.2/.github/workflows/benchmarks.yml000066400000000000000000000016111521250557700217320ustar00rootroot00000000000000name: 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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 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@9d332c4d90b43981c3e55ae8e38e68709996240f # v4.17.0 with: run: npm run benchmark mode: "simulation" watchpack-2.5.2/.github/workflows/dependabot.yml000066400000000000000000000024371521250557700217310ustar00rootroot00000000000000name: 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@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 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 }} watchpack-2.5.2/.github/workflows/release.yml000066400000000000000000000022431521250557700212370ustar00rootroot00000000000000name: 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/watchpack' name: Release runs-on: ubuntu-latest outputs: published: ${{ steps.changesets.outputs.published }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - 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@a45c4d594aa4e2c509dc14a9f2b3b67ba3780d0d # v1.9.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 watchpack-2.5.2/.github/workflows/test.yml000066400000000000000000000063041521250557700206000ustar00rootroot00000000000000name: Test on: push: branches: - main pull_request: branches: - main jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 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: Cache eslint result 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: true 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] polling: ["false", "200"] exclude: - os: macos-latest node-version: 10.x polling: "200" - os: macos-latest node-version: 12.x polling: "200" - os: macos-latest node-version: 14.x polling: "200" - os: macos-latest node-version: 16.x polling: "200" - os: macos-latest node-version: 18.x polling: "200" - os: macos-latest node-version: 20.x polling: "200" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: fetch-depth: 0 - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 id: calculate_architecture with: result-encoding: string script: | if ('${{ matrix.os }}' === 'macos-latest' && ('${{ matrix['node-version'] }}' === '10.x' || '${{ matrix['node-version'] }}' === '12.x' || '${{ matrix['node-version'] }}' === '14.x')) { return "x64" } else { return '' } - name: Use Node.js ${{ matrix.node-version }} 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 --save-dev jest@^27 write-file-atomic@^3 rimraf@^2 npm install --ignore-engines if: matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x' || matrix.node-version == '18.x' - run: npm ci if: matrix.node-version != '10.x' && matrix.node-version != '12.x' && matrix.node-version != '14.x' && matrix.node-version != '16.x' && matrix.node-version != '18.x' - run: npm run test:coverage env: WATCHPACK_POLLING: ${{ matrix.polling }} - uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1 with: flags: integration token: ${{ secrets.CODECOV_TOKEN }} watchpack-2.5.2/.gitignore000066400000000000000000000001331521250557700154630ustar00rootroot00000000000000/node_modules /test/fixtures /playground/folder /coverage .DS_Store .eslintcache yarn.lock watchpack-2.5.2/.prettierignore000066400000000000000000000000371521250557700165410ustar00rootroot00000000000000package.json package-lock.json watchpack-2.5.2/.prettierrc.js000066400000000000000000000005011521250557700162710ustar00rootroot00000000000000"use strict"; module.exports = { printWidth: 80, useTabs: true, tabWidth: 2, trailingComma: "all", arrowParens: "always", overrides: [ { files: "*.json", options: { parser: "json", useTabs: false, }, }, { files: "*.{cts,mts,ts}", options: { parser: "typescript", }, }, ], }; watchpack-2.5.2/CHANGELOG.md000066400000000000000000000034731521250557700153160ustar00rootroot00000000000000# watchpack ## 2.5.2 ### Patch Changes - fix: retry `fs.lstat` on transient `EBUSY` errors instead of emitting a spurious `remove` event (fixes #223, #44). The retry count is controlled by the `WATCHPACK_RETRIES` environment variable (default: `3`; set to `0` or `"false"` to disable retrying). (by [@alexander-akait](https://github.com/alexander-akait) in [#293](https://github.com/webpack/watchpack/pull/293)) - Improve perfomance for ignored and improve perfomance for reduce plan. (by [@alexander-akait](https://github.com/alexander-akait) in [#289](https://github.com/webpack/watchpack/pull/289)) - perf: speed up `ignored` matchers (~35–45% faster on POSIX paths) and `reducePlan` (~20–40% faster on medium and large plans). Also adds a tinybench suite under `bench/` and a CodSpeed GitHub Actions workflow to catch future regressions. (by [@alexander-akait](https://github.com/alexander-akait) in [#287](https://github.com/webpack/watchpack/pull/287)) - fix: don't log "Watchpack Error (initial scan)" for unreadable entries inside a watched parent directory, e.g. `pagefile.sys` on WSL or `/efi` on Linux (fixes #187). `EACCES` / `ENODEV` (and `EINVAL` on Windows) errors are now handled like `EPERM` / `ENOENT` / `EBUSY`: the entry is recorded as missing and the scan continues silently. (by [@alexander-akait](https://github.com/alexander-akait) in [#298](https://github.com/webpack/watchpack/pull/298)) - fix: prevent unbounded watcher growth when a symlinked directory points back to one of its own ancestors (e.g. `a/b/loop -> ..`) with `followSymlinks: true`. Such symlinks are now recorded as plain entries instead of being descended into; symlinks pointing outside the watched tree (#231) behave as before. (by [@alexander-akait](https://github.com/alexander-akait) in [#297](https://github.com/webpack/watchpack/pull/297)) watchpack-2.5.2/LICENSE000066400000000000000000000020571521250557700145070ustar00rootroot00000000000000Copyright JS Foundation and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. watchpack-2.5.2/README.md000066400000000000000000000147311521250557700147630ustar00rootroot00000000000000# watchpack Wrapper library for directory and file watching. [![Test](https://github.com/webpack/watchpack/actions/workflows/test.yml/badge.svg)](https://github.com/webpack/watchpack/actions/workflows/test.yml) [![Codecov](https://codecov.io/gh/webpack/watchpack/graph/badge.svg?token=8xk2OrrxWm)](https://codecov.io/gh/webpack/watchpack) [![Downloads](https://img.shields.io/npm/dm/watchpack.svg)](https://www.npmjs.com/package/watchpack) ## Concept watchpack high level API doesn't map directly to watchers. Instead a three level architecture ensures that for each directory only a single watcher exists. - The high level API requests `DirectoryWatchers` from a `WatcherManager`, which ensures that only a single `DirectoryWatcher` per directory is created. - A user-faced `Watcher` can be obtained from a `DirectoryWatcher` and provides a filtered view on the `DirectoryWatcher`. - Reference-counting is used on the `DirectoryWatcher` and `Watcher` to decide when to close them. - The real watchers are created by the `DirectoryWatcher`. - Files are never watched directly. This should keep the watcher count low. - Watching can be started in the past. This way watching can start after file reading. - Symlinks are not followed, instead the symlink is watched. ## API ```javascript const Watchpack = require("watchpack"); const wp = new Watchpack({ // options: aggregateTimeout: 1000, // fire "aggregated" event when after a change for 1000ms no additional change occurred // aggregated defaults to undefined, which doesn't fire an "aggregated" event poll: true, // poll: true - use polling with the default interval // poll: 10000 - use polling with an interval of 10s // poll defaults to undefined, which prefer native watching methods // Note: enable polling when watching on a network path // When WATCHPACK_POLLING environment variable is set it will override this option followSymlinks: true, // true: follows symlinks and watches symlinks and real files // (This makes sense when symlinks has not been resolved yet, comes with a performance hit) // false (default): watches only specified item they may be real files or symlinks // (This makes sense when symlinks has already been resolved) ignored: "**/.git", // ignored: "string" - a glob pattern for files or folders that should not be watched // ignored: ["string", "string"] - multiple glob patterns that should be ignored // ignored: /regexp/ - a regular expression for files or folders that should not be watched // ignored: (entry) => boolean - an arbitrary function which must return truthy to ignore an entry // For all cases expect the arbitrary function the path will have path separator normalized to '/'. // All subdirectories are ignored too }); // Watchpack.prototype.watch({ // files: Iterable, // directories: Iterable, // missing: Iterable, // startTime?: number // }) wp.watch({ files: listOfFiles, directories: listOfDirectories, missing: listOfNotExistingItems, startTime: Date.now() - 10000, }); // starts watching these files and directories // calling this again will override the files and directories // files: can be files or directories, for files: content and existence changes are tracked // for directories: only existence and timestamp changes are tracked // directories: only directories, directory content (and content of children, ...) and // existence changes are tracked. // assumed to exist, when directory is not found without further information a remove event is emitted // missing: can be files or directories, // only existence changes are tracked // expected to not exist, no remove event is emitted when not found initially // files and directories are assumed to exist, when they are not found without further information a remove event is emitted // missing is assumed to not exist and no remove event is emitted wp.on("change", (filePath, mtime, explanation) => { // filePath: the changed file // mtime: last modified time for the changed file // explanation: textual information how this change was detected }); wp.on("remove", (filePath, explanation) => { // filePath: the removed file or directory // explanation: textual information how this change was detected }); wp.on("aggregated", (changes, removals) => { // changes: a Set of all changed files // removals: a Set of all removed files // watchpack gives up ownership on these Sets. }); // Watchpack.prototype.pause() wp.pause(); // stops emitting events, but keeps watchers open // next "watch" call can reuse the watchers // The watcher will keep aggregating events // which can be received with getAggregated() // Watchpack.prototype.close() wp.close(); // stops emitting events and closes all watchers // Watchpack.prototype.getAggregated(): { changes: Set, removals: Set } const { changes, removals } = wp.getAggregated(); // returns the current aggregated info and removes that from the watcher // The next aggregated event won't include that info and will only emitted // when futher changes happen // Can also be used when paused. // Watchpack.prototype.collectTimeInfoEntries(fileInfoEntries: Map, directoryInfoEntries: Map) wp.collectTimeInfoEntries(fileInfoEntries, directoryInfoEntries); // collects time info objects for all known files and directories // this include info from files not directly watched // key: absolute path, value: object with { safeTime, timestamp } // safeTime: a point in time at which it is safe to say all changes happened before that // timestamp: only for files, the mtime timestamp of the file // Watchpack.prototype.getTimeInfoEntries() const fileTimes = wp.getTimeInfoEntries(); // returns a Map with all known time info objects for files and directories // similar to collectTimeInfoEntries but returns a single map with all entries // (deprecated) // Watchpack.prototype.getTimes() const fileTimesOld = wp.getTimes(); // returns an object with all known change times for files // this include timestamps from files not directly watched // key: absolute path, value: timestamp as number ``` ## Environment variables - `WATCHPACK_POLLING`: when set, overrides the `poll` option (see above). - `WATCHPACK_RETRIES`: number of times to retry `fs.lstat` when it returns `EBUSY` (default: `3`). Useful on Windows where anti-virus scanners, indexers or editors briefly lock files — without retries watchpack would see a spurious `remove` and stop tracking the file. Set to `0` or `"false"` to disable retrying. watchpack-2.5.2/benchmark/000077500000000000000000000000001521250557700154305ustar00rootroot00000000000000watchpack-2.5.2/benchmark/README.md000066400000000000000000000055061521250557700167150ustar00rootroot00000000000000# Benchmarks This directory holds watchpack's performance benchmarks. The layout mirrors [webpack/enhanced-resolve's `benchmark/`](https://github.com/webpack/enhanced-resolve/tree/main/benchmark): each scenario lives under `cases//index.bench.mjs`, `run.mjs` discovers every case and runs it through [tinybench](https://github.com/tinylibs/tinybench), and the same entry point works both locally (wall-clock) and under [CodSpeed](https://codspeed.io/) (instruction-count simulation) via the `with-codspeed.mjs` bridge. ## Running ```sh # Run every case npm run benchmark # Run only cases whose directory name contains "ignored" BENCH_FILTER=ignored npm run benchmark # - or, equivalently - npm run benchmark -- ignored ``` The output is a table of `ops/s`, mean latency, p99 latency, RME, and sample count per registered task. When run under `CodSpeedHQ/action` the bridge switches to instrumentation mode automatically. ## Layout ``` bench/ ├── README.md ├── run.mjs # entry: discovers cases, runs them, prints a table ├── with-codspeed.mjs # tinybench <-> @codspeed/core bridge └── cases/ └── / └── index.bench.mjs ``` Each `index.bench.mjs` exports a default `register(bench, ctx)` function that calls `bench.add(name, fn)` one or more times. The `ctx` argument is `{ caseName, caseDir, fixtureDir }`; `fixtureDir` points at `cases//fixture/` (the directory is optional — only create it if you need a real on-disk tree). ## Writing a case 1. Create `bench/cases//index.bench.mjs`. 2. Default-export a `register` function. 3. Pre-build expensive fixtures **outside** the benchmark callback so only the hot path is measured. 4. Each `bench.add` body should loop over a fixed batch of inputs so the measurement window sees enough work to be stable (tens of microseconds minimum). 5. Avoid any non-determinism — use fixed request lists, no `Math.random`. 6. Focus one case on one scenario. If you need a materially different shape (warm vs. cold cache, POSIX vs. Windows paths), prefer a new case directory over piling `bench.add` calls into an existing one. ## CodSpeed `bench/run.mjs` wraps the `Bench` with `withCodSpeed()`. When `CODSPEED_*` env vars are absent the wrapper returns the bench untouched and tinybench's built-in timing is used. Under `CodSpeedHQ/action` with `mode: "simulation"` the wrapper overrides `bench.run` to call the instrumentation hooks once per task, which produces reproducible instruction-count measurements independent of the runner's load. The `@codspeed/tinybench-plugin` package is intentionally not used here: it reads private tinybench v6 Task fields and breaks in simulation mode. Both webpack and enhanced-resolve ran into the same issue and wrote their own bridges; `with-codspeed.mjs` is ported from enhanced-resolve's. watchpack-2.5.2/benchmark/cases/000077500000000000000000000000001521250557700165265ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/ignored-cross-platform/000077500000000000000000000000001521250557700231265ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/ignored-cross-platform/index.bench.mjs000066400000000000000000000054531521250557700260350ustar00rootroot00000000000000/* * ignored-cross-platform * * Stress-tests the separator-normalization path in the `ignored` matcher. * The matcher must handle native Windows paths (with backslashes), paths * that have already been normalized to POSIX, and mixed bags produced by * cross-platform tools. This case isolates those scenarios from the plain * POSIX batch measured by `ignored-match` so the backslash-heavy code path * has its own CodSpeed trend line. */ import Watchpack from "../../../lib/index.js"; const UNIX_PATHS = [ "/home/user/project/src/index.js", "/home/user/project/src/components/App.jsx", "/home/user/project/node_modules/react/index.js", "/home/user/project/dist/bundle.js", "/home/user/project/.git/HEAD", "/home/user/project/coverage/lcov.info", "/home/user/project/src/utils/helpers.ts", "/home/user/project/test/fixtures/a.js", "/home/user/project/README.md", "/home/user/project/package.json", ]; const WINDOWS_PATHS = UNIX_PATHS.map((path) => path.replace(/\//g, "\\")); const MIXED_PATHS = UNIX_PATHS.map((path, i) => i % 2 === 0 ? path : path.replace(/\//g, "\\"), ); // Simulates a monorepo deep-path batch: each path has ~17 segments so the // regex has to scan a long string before committing to match/no-match. const DEEP_PATHS = Array.from({ length: 10 }, (_, i) => { const segments = Array.from({ length: 15 }, (_, j) => `level${j}`); segments.push(i === 3 ? "node_modules" : `leaf${i}`); segments.push("index.js"); return `/${segments.join("/")}`; }); /** * @param {import("../../../lib/index").WatchOptions} options options * @returns {(item: string) => boolean} true when ignored, otherwise false */ const buildIgnored = (options) => new Watchpack(options).watcherOptions.ignored; const LARGE_ARRAY_IGNORED = [ "**/node_modules", "**/.git", "**/dist", "**/build", "**/coverage", "**/.cache", "**/.next", "**/.nuxt", "**/tmp", "**/*.log", ]; /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { const regexpMatcher = buildIgnored({ ignored: /node_modules|\.git|dist|coverage/, }); const arrayMatcher = buildIgnored({ ignored: LARGE_ARRAY_IGNORED }); bench.add("ignored-cross-platform: regex against windows paths", () => { for (const path of WINDOWS_PATHS) regexpMatcher(path); }); bench.add("ignored-cross-platform: regex against mixed separators", () => { for (const path of MIXED_PATHS) regexpMatcher(path); }); bench.add("ignored-cross-platform: regex against deep posix paths", () => { for (const path of DEEP_PATHS) regexpMatcher(path); }); bench.add("ignored-cross-platform: array[10] against windows paths", () => { for (const path of WINDOWS_PATHS) arrayMatcher(path); }); bench.add( "ignored-cross-platform: array[10] against deep posix paths", () => { for (const path of DEEP_PATHS) arrayMatcher(path); }, ); } watchpack-2.5.2/benchmark/cases/ignored-match/000077500000000000000000000000001521250557700212475ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/ignored-match/index.bench.mjs000066400000000000000000000054511521250557700241540ustar00rootroot00000000000000/* * ignored-match * * Exercises the `ignored` matcher against a realistic POSIX path batch for * every supported option shape (regex, glob string, short/long array, plain * predicate, and the "no ignored option" no-op fast path). The matcher is * what webpack hits per file for every watched entry, so the shape of this * batch dominates per-rebuild time in large projects. */ import Watchpack from "../../../lib/index.js"; const UNIX_PATHS = [ "/home/user/project/src/index.js", "/home/user/project/src/components/App.jsx", "/home/user/project/node_modules/react/index.js", "/home/user/project/dist/bundle.js", "/home/user/project/.git/HEAD", "/home/user/project/coverage/lcov.info", "/home/user/project/src/utils/helpers.ts", "/home/user/project/test/fixtures/a.js", "/home/user/project/README.md", "/home/user/project/package.json", ]; /** * Reach into a Watchpack instance to get at the normalized matcher without * duplicating the option-compilation logic. * @param {import("../../../lib/index").WatchOptions} options options * @returns {(item: string) => boolean} true when ignored, otherwise false */ const buildIgnored = (options) => new Watchpack(options).watcherOptions.ignored; /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { const noneMatcher = buildIgnored({}); const regexpMatcher = buildIgnored({ ignored: /node_modules|\.git|dist|coverage/, }); const stringMatcher = buildIgnored({ ignored: "**/node_modules" }); const singletonArrayMatcher = buildIgnored({ ignored: ["**/node_modules"] }); const smallArrayMatcher = buildIgnored({ ignored: ["**/node_modules", "**/.git"], }); const largeArrayMatcher = buildIgnored({ ignored: [ "**/node_modules", "**/.git", "**/dist", "**/build", "**/coverage", "**/.cache", "**/.next", "**/.nuxt", "**/tmp", "**/*.log", ], }); const functionMatcher = buildIgnored({ ignored: (path) => path.includes("node_modules") || path.includes(".git"), }); bench.add("ignored-match: no ignored option (noop fast path)", () => { for (const path of UNIX_PATHS) noneMatcher(path); }); bench.add("ignored-match: regex matcher", () => { for (const path of UNIX_PATHS) regexpMatcher(path); }); bench.add("ignored-match: glob string matcher", () => { for (const path of UNIX_PATHS) stringMatcher(path); }); bench.add("ignored-match: array[1] matcher", () => { for (const path of UNIX_PATHS) singletonArrayMatcher(path); }); bench.add("ignored-match: array[2] matcher", () => { for (const path of UNIX_PATHS) smallArrayMatcher(path); }); bench.add("ignored-match: array[10] matcher", () => { for (const path of UNIX_PATHS) largeArrayMatcher(path); }); bench.add("ignored-match: function matcher", () => { for (const path of UNIX_PATHS) functionMatcher(path); }); } watchpack-2.5.2/benchmark/cases/link-resolver/000077500000000000000000000000001521250557700213225ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/link-resolver/index.bench.mjs000066400000000000000000000047151521250557700242310ustar00rootroot00000000000000/* * link-resolver * * LinkResolver resolves directory + file paths while expanding any symlinks * along the way. Webpack hits it on every watched entry before asking the * platform's fs.watch, so both the cold (first seen) and warm (cache hit) * paths matter: the former bounds worst-case rebuild latency, the latter * bounds the per-file cost of the steady state. * * To keep the benchmark deterministic we aim the resolver at a path that * does not exist. readlinkSync throws ENOENT, LinkResolver catches it * silently and walks its cache / parent chain exactly like it would for a * real path — without any filesystem side effects that would make CodSpeed * instrumentation noisy. */ import LinkResolver from "../../../lib/LinkResolver.js"; const SEP = process.platform === "win32" ? "\\" : "/"; const ROOT = process.platform === "win32" ? "C:\\nonexistent_bench" : "/nonexistent_bench"; const makePath = (depth) => { let path = ROOT; for (let i = 0; i < depth; i++) path += `${SEP}level${i}`; return path; }; const shallowPaths = Array.from( { length: 100 }, (_, i) => `${ROOT}${SEP}file${i}`, ); const mediumPaths = Array.from( { length: 100 }, (_, i) => `${makePath(5)}${SEP}file${i}`, ); const deepPaths = Array.from( { length: 50 }, (_, i) => `${makePath(15)}${SEP}file${i}`, ); /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { // Pre-populated resolver for the warm/cache-hit measurements. const warmResolver = new LinkResolver(); for (const path of shallowPaths) warmResolver.resolve(path); for (const path of mediumPaths) warmResolver.resolve(path); for (const path of deepPaths) warmResolver.resolve(path); bench.add("link-resolver: cold shallow batch (depth=1, n=100)", () => { const resolver = new LinkResolver(); for (const path of shallowPaths) resolver.resolve(path); }); bench.add("link-resolver: cold medium batch (depth=5, n=100)", () => { const resolver = new LinkResolver(); for (const path of mediumPaths) resolver.resolve(path); }); bench.add("link-resolver: cold deep batch (depth=15, n=50)", () => { const resolver = new LinkResolver(); for (const path of deepPaths) resolver.resolve(path); }); bench.add("link-resolver: warm shallow batch (cache hit, n=100)", () => { for (const path of shallowPaths) warmResolver.resolve(path); }); bench.add("link-resolver: warm deep batch (cache hit, n=50)", () => { for (const path of deepPaths) warmResolver.resolve(path); }); } watchpack-2.5.2/benchmark/cases/reduce-plan-deep/000077500000000000000000000000001521250557700216405ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/reduce-plan-deep/index.bench.mjs000066400000000000000000000027701521250557700245460ustar00rootroot00000000000000/* * reduce-plan-deep * * Deeply nested path plans exercise the parent-chain walk in reducePlan's * tree-building pass (each leaf bubbles its entry count up an arbitrarily * long ancestor list) and the subtree-deactivation walk during reduction * (merging near the root has to mark every descendant inactive). * * `depth=30, leaves=3` approximates a monorepo with a handful of files at * every level; `depth=80, leaves=2` is a synthetic worst case with a long * spine and very few siblings per rung. */ import reducePlan from "../../../lib/reducePlan.js"; const ROOT = process.platform === "win32" ? "C:\\root" : "/root"; const SEP = process.platform === "win32" ? "\\" : "/"; /** * @param {number} depth directory depth * @param {number} leaves leaves per level * @returns {Map} plan */ const buildDeepPlan = (depth, leaves) => { const plan = new Map(); let i = 0; const walk = (prefix, level) => { for (let l = 0; l < leaves; l++) { plan.set(`${prefix}${SEP}file${i}`, `v${i++}`); } if (level < depth) walk(`${prefix}${SEP}sub${level}`, level + 1); }; walk(ROOT, 0); return plan; }; const deepPlan = buildDeepPlan(30, 3); const veryDeepPlan = buildDeepPlan(80, 2); /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { bench.add("reduce-plan-deep: depth=30, leaves=3, limit=20", () => { reducePlan(deepPlan, 20); }); bench.add("reduce-plan-deep: depth=80, leaves=2, limit=40", () => { reducePlan(veryDeepPlan, 40); }); } watchpack-2.5.2/benchmark/cases/reduce-plan-fast-path/000077500000000000000000000000001521250557700226125ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/reduce-plan-fast-path/index.bench.mjs000066400000000000000000000031211521250557700255070ustar00rootroot00000000000000/* * reduce-plan-fast-path * * Measures the cheap paths through reducePlan: plans that are already under * the limit (no reduction needed at all) and plans that are only slightly * over the limit (the while loop runs a handful of times). These should be * dominated by tree construction + the final "write down new plan" pass, * not by the selection loop. * * Keeping this isolated from the heavy cases means a regression in the * setup cost (e.g. accidentally quadratic tree building) shows up on its * own trend line instead of hiding under a 10ms huge-plan benchmark. */ import reducePlan from "../../../lib/reducePlan.js"; const ROOT = process.platform === "win32" ? "C:\\root" : "/root"; const SEP = process.platform === "win32" ? "\\" : "/"; /** * @param {number} count number of leaf targets * @param {number} width branching factor per directory * @returns {Map} plan */ const buildWidePlan = (count, width) => { const plan = new Map(); let i = 0; let dir = 0; while (i < count) { const group = `${ROOT}${SEP}group${dir}`; for (let j = 0; j < width && i < count; j++, i++) { plan.set(`${group}${SEP}file${i}`, `v${i}`); } dir++; } return plan; }; const smallPlan = buildWidePlan(50, 10); const mediumPlan = buildWidePlan(500, 20); /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { bench.add("reduce-plan-fast-path: under limit (n=50, limit=100)", () => { reducePlan(smallPlan, 100); }); bench.add("reduce-plan-fast-path: barely over (n=500, limit=499)", () => { reducePlan(mediumPlan, 499); }); } watchpack-2.5.2/benchmark/cases/reduce-plan-flat/000077500000000000000000000000001521250557700216515ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/reduce-plan-flat/index.bench.mjs000066400000000000000000000023101521250557700245450ustar00rootroot00000000000000/* * reduce-plan-flat * * Lots of sibling entries under a single directory: every leaf shares the * same parent, so the tree is one level deep and the candidate-selection * loop only has a single viable merge target per round. This distribution * shows up in projects that watch many files in one folder (e.g. a single * "pages" or "generated" directory with hundreds of entries). */ import reducePlan from "../../../lib/reducePlan.js"; const ROOT = process.platform === "win32" ? "C:\\root" : "/root"; const SEP = process.platform === "win32" ? "\\" : "/"; /** * @param {number} count number of targets * @returns {Map} plan */ const buildFlatPlan = (count) => { const plan = new Map(); for (let i = 0; i < count; i++) { plan.set(`${ROOT}${SEP}file${i}`, `v${i}`); } return plan; }; const flatMediumPlan = buildFlatPlan(500); const flatLargePlan = buildFlatPlan(5000); /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { bench.add("reduce-plan-flat: n=500 in one dir, limit=50", () => { reducePlan(flatMediumPlan, 50); }); bench.add("reduce-plan-flat: n=5000 in one dir, limit=100", () => { reducePlan(flatLargePlan, 100); }); } watchpack-2.5.2/benchmark/cases/reduce-plan-wide/000077500000000000000000000000001521250557700216535ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/reduce-plan-wide/index.bench.mjs000066400000000000000000000037641521250557700245650ustar00rootroot00000000000000/* * reduce-plan-wide * * Exercises reducePlan on "wide" plans — lots of sibling leaves bucketed * under shared parent directories. This is the distribution webpack creates * when many watchers share a root but fan out into sub-trees, and it's the * stress pattern for the selection loop: every iteration of the outer * `while (currentCount > limit)` must scan the candidate set to find the * best node to merge. * * Three magnitudes: small (50), medium (500), large (2000), huge (10000). */ import reducePlan from "../../../lib/reducePlan.js"; const ROOT = process.platform === "win32" ? "C:\\root" : "/root"; const SEP = process.platform === "win32" ? "\\" : "/"; /** * @param {number} count number of leaf targets * @param {number} width branching factor per directory * @returns {Map} plan */ const buildWidePlan = (count, width) => { const plan = new Map(); let i = 0; let dir = 0; while (i < count) { const group = `${ROOT}${SEP}group${dir}`; for (let j = 0; j < width && i < count; j++, i++) { plan.set(`${group}${SEP}file${i}`, `v${i}`); } dir++; } return plan; }; const smallPlan = buildWidePlan(50, 10); const mediumPlan = buildWidePlan(500, 20); const largePlan = buildWidePlan(2000, 25); const hugePlan = buildWidePlan(10000, 40); /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { bench.add("reduce-plan-wide: small plan (n=50, limit=10)", () => { reducePlan(smallPlan, 10); }); bench.add("reduce-plan-wide: medium plan (n=500, limit=50)", () => { reducePlan(mediumPlan, 50); }); bench.add("reduce-plan-wide: medium light (n=500, limit=400)", () => { reducePlan(mediumPlan, 400); }); bench.add("reduce-plan-wide: large plan (n=2000, limit=100)", () => { reducePlan(largePlan, 100); }); bench.add("reduce-plan-wide: large aggressive (n=2000, limit=10)", () => { reducePlan(largePlan, 10); }); bench.add("reduce-plan-wide: huge plan (n=10000, limit=500)", () => { reducePlan(hugePlan, 500); }); } watchpack-2.5.2/benchmark/cases/watchpack-construction/000077500000000000000000000000001521250557700232235ustar00rootroot00000000000000watchpack-2.5.2/benchmark/cases/watchpack-construction/index.bench.mjs000066400000000000000000000050341521250557700261250ustar00rootroot00000000000000/* * watchpack-construction * * Webpack creates and tears down a Watchpack instance at module boundaries * and on every dev-server restart. The constructor compiles the `ignored` * matcher, installs it on a WeakMap-keyed options cache, and wires up the * internal `WatcherManager`. This case measures the construction cost for * each supported `ignored` option shape so any regression in that setup * path surfaces before it reaches webpack users. * * `.close()` is invoked after every construction to keep the outer test * process from leaking timers even though no watchers have been attached. * * Each benchmark body constructs BATCH instances in a loop. A single * construction is ~100 µs, so one instrumented iteration would be too short * for CodSpeed simulation mode to measure with low variance — batching * amortizes per-sample overhead (GC, JIT state, timer resolution) and * stabilizes CI-reported numbers. */ import Watchpack from "../../../lib/index.js"; const BATCH = 100; const optionsNone = {}; const optionsWithRegExp = { ignored: /node_modules|\.git/ }; const optionsWithString = { ignored: "**/node_modules" }; const optionsWithSmallArray = { ignored: ["**/node_modules", "**/.git"] }; const optionsWithLargeArray = { ignored: [ "**/node_modules", "**/.git", "**/dist", "**/build", "**/coverage", "**/.cache", "**/.next", "**/.nuxt", "**/tmp", "**/*.log", ], }; const optionsWithFn = { ignored: (path) => path.includes("node_modules") }; /** * @param {object} options watchpack options reused across the batch */ const run = (options) => { for (let i = 0; i < BATCH; i++) { new Watchpack(options).close(); } }; /** * @param {import("tinybench").Bench} bench bench */ export default function register(bench) { bench.add("watchpack-construction: no ignored option", () => { run(optionsNone); }); bench.add("watchpack-construction: regex ignored", () => { run(optionsWithRegExp); }); bench.add("watchpack-construction: glob string ignored", () => { run(optionsWithString); }); bench.add("watchpack-construction: array[2] ignored", () => { run(optionsWithSmallArray); }); bench.add("watchpack-construction: array[10] ignored", () => { run(optionsWithLargeArray); }); bench.add("watchpack-construction: function ignored", () => { run(optionsWithFn); }); bench.add("watchpack-construction: cached options (WeakMap hit)", () => { // Same options object every iteration exercises the WeakMap cache // installed on the options by `cachedNormalizeOptions`. run(optionsWithLargeArray); }); } watchpack-2.5.2/benchmark/run.mjs000066400000000000000000000074361521250557700167610ustar00rootroot00000000000000#!/usr/bin/env node /* * Benchmark entry point for enhanced-resolve. * * 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) 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 -- realistic`). * 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: "enhanced-resolve", now: hrtimeNow, throws: true, warmup: true, warmupIterations: 2, // Kept deliberately low: each task's body already loops over many // resolve calls, and we want wall-clock runs to finish in a few // seconds. CodSpeed's simulation mode ignores this and instruments // exactly one 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" }; // tinybench v6 result shape: latency/throughput objects, no top-level // hz / samples. `latency` fields are in ms already. 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); // 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); } watchpack-2.5.2/benchmark/with-codspeed.mjs000066400000000000000000000115721521250557700207100ustar00rootroot00000000000000/* * CodSpeed <-> tinybench bridge for watchpack benchmarks. * * Ported from webpack/enhanced-resolve's benchmark/with-codspeed.mjs, which * itself is derived from webpack's test/BenchmarkTestCases.benchmark.mjs. * * 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. webpack and enhanced-resolve hit the same issue and use * @codspeed/core directly — we follow their lead. * * 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 {() => unknown | Promise} Fn */ 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} task meta */ 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 function * @param {boolean} isAsync true when is async, otherwise false * @returns {Fn} wrapper function */ 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)); // Warm-up: run the body a few times to stabilise caches / JIT. for (let i = 0; i < bench.iterations - 1; i++) { await m.fn(); } // Instrumented run. global.gc?.(); InstrumentHooks.startBenchmark(); await wrapFrame(m.fn, true)(); InstrumentHooks.stopBenchmark(); InstrumentHooks.setExecutedBenchmark(process.pid, m.uri); 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)); for (let i = 0; i < bench.iterations - 1; i++) { m.fn(); } global.gc?.(); InstrumentHooks.startBenchmark(); wrapFrame(m.fn, false)(); InstrumentHooks.stopBenchmark(); InstrumentHooks.setExecutedBenchmark(process.pid, m.uri); console.log( `[CodSpeed] ${ InstrumentHooks.isInstrumented() ? "Measured" : "Checked" } ${m.uri}`, ); } return teardown(); }; return bench; } watchpack-2.5.2/eslint.config.mjs000066400000000000000000000017561521250557700167640ustar00rootroot00000000000000import { defineConfig } from "eslint/config"; import config from "eslint-config-webpack"; export default defineConfig([ { extends: [config], rules: { // TODO remove in the next major release "no-implicit-coercion": ["error", { number: false }], "id-length": [ "error", { min: 2, max: Number.POSITIVE_INFINITY, properties: "never", exceptions: [ // Watcher "w", // jQuery "$", // Loops "i", "j", "k", "v", "m", "n", "t", // Left and right "l", "r", // Lodash "_", // Comparison "a", "b", ], }, ], "n/prefer-node-protocol": "off", }, }, { files: ["benchmark/**/*"], languageOptions: { ecmaVersion: "latest", }, rules: { "no-console": "off", "n/hashbang": "off", "n/no-unsupported-features/node-builtins": "off", "n/no-unsupported-features/es-syntax": "off", "n/no-process-exit": "off", }, }, ]); watchpack-2.5.2/lib/000077500000000000000000000000001521250557700142445ustar00rootroot00000000000000watchpack-2.5.2/lib/DirectoryWatcher.js000066400000000000000000001000341521250557700200620ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const { EventEmitter } = require("events"); const path = require("path"); const fs = require("graceful-fs"); const watchEventSource = require("./watchEventSource"); /** @typedef {import("./index").IgnoredFunction} IgnoredFunction */ /** @typedef {import("./index").EventType} EventType */ /** @typedef {import("./index").TimeInfoEntries} TimeInfoEntries */ /** @typedef {import("./index").Entry} Entry */ /** @typedef {import("./index").ExistenceOnlyTimeEntry} ExistenceOnlyTimeEntry */ /** @typedef {import("./index").OnlySafeTimeEntry} OnlySafeTimeEntry */ /** @typedef {import("./index").EventMap} EventMap */ /** @typedef {import("./getWatcherManager").WatcherManager} WatcherManager */ /** @typedef {import("./watchEventSource").Watcher} EventSourceWatcher */ /** @type {ExistenceOnlyTimeEntry} */ const EXISTANCE_ONLY_TIME_ENTRY = Object.freeze({}); let FS_ACCURACY = 2000; const IS_OSX = require("os").platform() === "darwin"; const IS_WIN = require("os").platform() === "win32"; const { WATCHPACK_POLLING, WATCHPACK_RETRIES } = process.env; const FORCE_POLLING = // @ts-expect-error avoid additional checks `${+WATCHPACK_POLLING}` === WATCHPACK_POLLING ? +WATCHPACK_POLLING : Boolean(WATCHPACK_POLLING) && WATCHPACK_POLLING !== "false"; // Number of retries (and delay between retries, in ms) when an fs operation // returns EBUSY. EBUSY is transient on Windows when an AV scanner, indexer, // or another process briefly locks a file; retrying avoids incorrectly // reporting the file as removed (see webpack/watchpack#223, #44). // // Configurable via `WATCHPACK_RETRIES` env var: an integer >= 0, or "false" // to disable retries entirely. Unset / invalid values fall back to 3. const BUSY_RETRIES = (() => { if (WATCHPACK_RETRIES === undefined) return 3; if (WATCHPACK_RETRIES === "false") return 0; const n = Number(WATCHPACK_RETRIES); return Number.isFinite(n) && n >= 0 ? Math.floor(n) : 3; })(); const BUSY_RETRY_DELAY = 100; /** * @param {string} str string * @returns {string} lower cased string */ function withoutCase(str) { return str.toLowerCase(); } /** * @param {number} times times * @param {() => void} callback callback * @returns {() => void} result */ function needCalls(times, callback) { return function needCallsCallback() { if (--times === 0) { return callback(); } }; } /** * @param {Entry} entry entry */ function fixupEntryAccuracy(entry) { if (entry.accuracy > FS_ACCURACY) { entry.safeTime = entry.safeTime - entry.accuracy + FS_ACCURACY; entry.accuracy = FS_ACCURACY; } } /** * @param {number=} mtime mtime */ function ensureFsAccuracy(mtime) { if (!mtime) return; if (FS_ACCURACY > 1 && mtime % 1 !== 0) FS_ACCURACY = 1; else if (FS_ACCURACY > 10 && mtime % 10 !== 0) FS_ACCURACY = 10; else if (FS_ACCURACY > 100 && mtime % 100 !== 0) FS_ACCURACY = 100; else if (FS_ACCURACY > 1000 && mtime % 1000 !== 0) FS_ACCURACY = 1000; } /** * Call `fs.lstat` with retries on EBUSY. Transient EBUSY errors are common * on Windows when another process (AV scanner, indexer, editor) holds an * open handle on the file. See webpack/watchpack#223, #44. * * The retry count is taken from the `WATCHPACK_RETRIES` env var (default * 3, set to "0" or "false" to disable retrying). The hot path is a single * `fs.lstat` call with one inline callback; the timer and the recursive * call are only scheduled when an EBUSY is actually observed. * @param {string} target target path * @param {{ closed: boolean }} watcher owning watcher (checked between retries) * @param {(err: NodeJS.ErrnoException | null, stats: import("fs").Stats) => void} callback callback * @param {number=} remaining retries remaining (defaults to `BUSY_RETRIES`) */ function lstatWithRetry(target, watcher, callback, remaining = BUSY_RETRIES) { fs.lstat(target, (err, stats) => { if ( err && /** @type {NodeJS.ErrnoException} */ (err).code === "EBUSY" && remaining > 0 && !watcher.closed ) { setTimeout( () => lstatWithRetry(target, watcher, callback, remaining - 1), BUSY_RETRY_DELAY, ); return; } callback(err, stats); }); } /** * @typedef {object} FileWatcherEvents * @property {(type: EventType) => void} initial-missing initial missing event * @property {(mtime: number, type: EventType, initial: boolean) => void} change change event * @property {(type: EventType) => void} remove remove event * @property {() => void} closed closed event */ /** * @typedef {object} DirectoryWatcherEvents * @property {(type: EventType) => void} initial-missing initial missing event * @property {((file: string, mtime: number, type: EventType, initial: boolean) => void)} change change event * @property {(type: EventType) => void} remove remove event * @property {() => void} closed closed event */ /** * @template {EventMap} T * @extends {EventEmitter<{ [K in keyof T]: Parameters }>} */ class Watcher extends EventEmitter { /** * @param {DirectoryWatcher} directoryWatcher a directory watcher * @param {string} target a target to watch * @param {number=} startTime start time */ constructor(directoryWatcher, target, startTime) { super(); this.directoryWatcher = directoryWatcher; this.path = target; this.startTime = startTime && +startTime; } /** * @param {number} mtime mtime * @param {boolean} initial true when initial, otherwise false * @returns {boolean} true of start time less than mtile, otherwise false */ checkStartTime(mtime, initial) { const { startTime } = this; if (typeof startTime !== "number") return !initial; return startTime <= mtime; } close() { // @ts-expect-error bad typing in EventEmitter this.emit("closed"); } } /** @typedef {Set} InitialScanRemoved */ /** * @typedef {object} WatchpackEvents * @property {(target: string, mtime: string, type: EventType, initial: boolean) => void} change change event * @property {() => void} closed closed event */ /** * @typedef {object} DirectoryWatcherOptions * @property {boolean=} followSymlinks true when need to resolve symlinks and watch symlink and real file, otherwise false * @property {IgnoredFunction=} ignored ignore some files from watching (glob pattern or regexp) * @property {number | boolean=} poll true when need to enable polling mode for watching, otherwise false */ /** * @extends {EventEmitter<{ [K in keyof WatchpackEvents]: Parameters }>} */ class DirectoryWatcher extends EventEmitter { /** * @param {WatcherManager} watcherManager a watcher manager * @param {string} directoryPath directory path * @param {DirectoryWatcherOptions=} options options */ constructor(watcherManager, directoryPath, options = {}) { super(); if (FORCE_POLLING) { options.poll = FORCE_POLLING; } this.watcherManager = watcherManager; this.options = options; this.path = directoryPath; // safeTime is the point in time after which reading is safe to be unchanged // timestamp is a value that should be compared with another timestamp (mtime) /** @type {Map} */ this.files = new Map(); /** @type {Map} */ this.filesWithoutCase = new Map(); /** @type {Map | boolean>} */ this.directories = new Map(); /** @type {Map>} */ this._symlinkTargetWatchers = new Map(); this.lastWatchEvent = 0; this.initialScan = true; this.ignored = options.ignored || (() => false); this.nestedWatching = false; /** @type {number | false} */ this.polledWatching = typeof options.poll === "number" ? options.poll : options.poll ? 5007 : false; /** @type {undefined | NodeJS.Timeout} */ this.timeout = undefined; /** @type {null | InitialScanRemoved} */ this.initialScanRemoved = new Set(); /** @type {undefined | number} */ this.initialScanFinished = undefined; /** @type {Map | Watcher>>} */ this.watchers = new Map(); /** @type {Watcher | null} */ this.parentWatcher = null; this.refs = 0; /** @type {Map} */ this._activeEvents = new Map(); this.closed = false; this.scanning = false; this.scanAgain = false; this.scanAgainInitial = false; this.createWatcher(); this.doScan(true); } createWatcher() { try { if (this.polledWatching) { /** @type {EventSourceWatcher} */ (this.watcher) = /** @type {EventSourceWatcher} */ ({ close: () => { if (this.timeout) { clearTimeout(this.timeout); this.timeout = undefined; } }, }); } else { if (IS_OSX) { this.watchInParentDirectory(); } this.watcher = /** @type {EventSourceWatcher} */ (watchEventSource.watch(this.path)); this.watcher.on("change", this.onWatchEvent.bind(this)); this.watcher.on("error", this.onWatcherError.bind(this)); } } catch (err) { this.onWatcherError(err); } } /** * @template {(watcher: Watcher) => void} T * @param {string} path path * @param {T} fn function */ forEachWatcher(path, fn) { const watchers = this.watchers.get(withoutCase(path)); if (watchers !== undefined) { for (const w of watchers) { fn(w); } } } /** * @param {string} itemPath an item path * @param {boolean} initial true when initial, otherwise false * @param {EventType} type even type */ setMissing(itemPath, initial, type) { if (this.initialScan) { /** @type {InitialScanRemoved} */ (this.initialScanRemoved).add(itemPath); } const oldDirectory = this.directories.get(itemPath); if (oldDirectory) { if (this.nestedWatching) { /** @type {Watcher} */ (oldDirectory).close(); } this.directories.delete(itemPath); this.forEachWatcher(itemPath, (w) => w.emit("remove", type)); if (!initial) { this.forEachWatcher(this.path, (w) => w.emit("change", itemPath, null, type, initial), ); } } const oldFile = this.files.get(itemPath); if (oldFile) { this.files.delete(itemPath); const key = withoutCase(itemPath); const count = /** @type {number} */ (this.filesWithoutCase.get(key)) - 1; if (count <= 0) { this.filesWithoutCase.delete(key); this.forEachWatcher(itemPath, (w) => w.emit("remove", type)); } else { this.filesWithoutCase.set(key, count); } if (!initial) { this.forEachWatcher(this.path, (w) => w.emit("change", itemPath, null, type, initial), ); } } } /** * @param {string} target a target to set file time * @param {number} mtime mtime * @param {boolean} initial true when initial, otherwise false * @param {boolean} ignoreWhenEqual true to ignore when equal, otherwise false * @param {EventType} type type */ setFileTime(target, mtime, initial, ignoreWhenEqual, type) { const now = Date.now(); if (this.ignored(target)) return; const old = this.files.get(target); let safeTime; let accuracy; if (initial) { safeTime = Math.min(now, mtime) + FS_ACCURACY; accuracy = FS_ACCURACY; } else { safeTime = now; accuracy = 0; if (old && old.timestamp === mtime && mtime + FS_ACCURACY < now) { // We are sure that mtime is untouched // This can be caused by some file attribute change // e. g. when access time has been changed // but the file content is untouched return; } } if (ignoreWhenEqual && old && old.timestamp === mtime) return; this.files.set(target, { safeTime, accuracy, timestamp: mtime, }); if (!old) { const key = withoutCase(target); const count = this.filesWithoutCase.get(key); this.filesWithoutCase.set(key, (count || 0) + 1); if (count !== undefined) { // There is already a file with case-insensitive-equal name // On a case-insensitive filesystem we may miss the renaming // when only casing is changed. // To be sure that our information is correct // we trigger a rescan here this.doScan(false); } this.forEachWatcher(target, (w) => { if (!initial || w.checkStartTime(safeTime, initial)) { w.emit("change", mtime, type); } }); } else if (!initial) { this.forEachWatcher(target, (w) => w.emit("change", mtime, type)); } this.forEachWatcher(this.path, (w) => { if (!initial || w.checkStartTime(safeTime, initial)) { w.emit("change", target, safeTime, type, initial); } }); } /** * @param {string} directoryPath directory path * @param {number} birthtime birthtime * @param {boolean} initial true when initial, otherwise false * @param {EventType} type even type */ setDirectory(directoryPath, birthtime, initial, type) { if (this.ignored(directoryPath)) return; if (directoryPath === this.path) { if (!initial) { this.forEachWatcher(this.path, (w) => w.emit("change", directoryPath, birthtime, type, initial), ); } } else { const old = this.directories.get(directoryPath); if (!old) { const now = Date.now(); if (this.nestedWatching) { this.createNestedWatcher(directoryPath); } else { this.directories.set(directoryPath, true); } const safeTime = initial ? Math.min(now, birthtime) + FS_ACCURACY : now; this.forEachWatcher(directoryPath, (w) => { if (!initial || w.checkStartTime(safeTime, false)) { w.emit("change", birthtime, type); } }); this.forEachWatcher(this.path, (w) => { if (!initial || w.checkStartTime(safeTime, initial)) { w.emit("change", directoryPath, safeTime, type, initial); } }); } } } /** * @param {string} directoryPath directory path */ createNestedWatcher(directoryPath) { const watcher = this.watcherManager.watchDirectory(directoryPath, 1); watcher.on("change", (target, mtime, type, initial) => { this.forEachWatcher(this.path, (w) => { if (!initial || w.checkStartTime(mtime, initial)) { w.emit("change", target, mtime, type, initial); } }); }); this.directories.set(directoryPath, watcher); } /** * @param {boolean} flag true when nested, otherwise false */ setNestedWatching(flag) { if (this.nestedWatching !== Boolean(flag)) { this.nestedWatching = Boolean(flag); if (this.nestedWatching) { for (const directory of this.directories.keys()) { this.createNestedWatcher(directory); } } else { for (const [directory, watcher] of this.directories) { /** @type {Watcher} */ (watcher).close(); this.directories.set(directory, true); } for (const w of this._symlinkTargetWatchers.values()) { w.close(); } this._symlinkTargetWatchers.clear(); } } } /** * @param {string} target a target to watch * @param {number=} startTime start time * @returns {Watcher | Watcher} watcher */ watch(target, startTime) { const key = withoutCase(target); let watchers = this.watchers.get(key); if (watchers === undefined) { watchers = new Set(); this.watchers.set(key, watchers); } this.refs++; const watcher = /** @type {Watcher | Watcher} */ (new Watcher(this, target, startTime)); watcher.on("closed", () => { if (--this.refs <= 0) { this.close(); return; } watchers.delete(watcher); if (watchers.size === 0) { this.watchers.delete(key); if (this.path === target) this.setNestedWatching(false); } }); watchers.add(watcher); let safeTime; if (target === this.path) { this.setNestedWatching(true); safeTime = this.lastWatchEvent; for (const entry of this.files.values()) { fixupEntryAccuracy(entry); safeTime = Math.max(safeTime, entry.safeTime); } } else { const entry = this.files.get(target); if (entry) { fixupEntryAccuracy(entry); safeTime = entry.safeTime; } else { safeTime = 0; } } if (safeTime) { if (startTime && safeTime >= startTime) { process.nextTick(() => { if (this.closed) return; if (target === this.path) { /** @type {Watcher} */ (watcher).emit( "change", target, safeTime, "watch (outdated on attach)", true, ); } else { /** @type {Watcher} */ (watcher).emit( "change", safeTime, "watch (outdated on attach)", true, ); } }); } } else if (this.initialScan) { if ( /** @type {InitialScanRemoved} */ (this.initialScanRemoved).has(target) ) { process.nextTick(() => { if (this.closed) return; watcher.emit("remove"); }); } } else if ( target !== this.path && !this.directories.has(target) && watcher.checkStartTime( /** @type {number} */ (this.initialScanFinished), false, ) ) { process.nextTick(() => { if (this.closed) return; watcher.emit("initial-missing", "watch (missing on attach)"); }); } return watcher; } /** * @param {EventType} eventType event type * @param {string=} filename filename */ onWatchEvent(eventType, filename) { if (this.closed) return; if (!filename) { // In some cases no filename is provided // This seem to happen on windows // So some event happened but we don't know which file is affected // We have to do a full scan of the directory this.doScan(false); return; } const target = path.join(this.path, filename); if (this.ignored(target)) return; if (this._activeEvents.get(filename) === undefined) { this._activeEvents.set(filename, false); const checkStats = () => { if (this.closed) return; this._activeEvents.set(filename, false); lstatWithRetry(target, this, (err, stats) => { if (this.closed) return; if (this._activeEvents.get(filename) === true) { process.nextTick(checkStats); return; } this._activeEvents.delete(filename); // ENOENT happens when the file/directory doesn't exist // EPERM happens when the containing directory doesn't exist // EBUSY happens when another process has the file locked (e.g. // Windows AV scanner). lstatWithRetry already retried before // giving up here. if (err) { if ( err.code !== "ENOENT" && err.code !== "EPERM" && err.code !== "EBUSY" ) { this.onStatsError(err); } else if ( filename === path.basename(this.path) && // This may indicate that the directory itself was removed !fs.existsSync(this.path) ) { this.onDirectoryRemoved("stat failed"); } } this.lastWatchEvent = Date.now(); if (!stats) { // On EBUSY we keep the tracked state: the file is likely still // there and a later event or scan will reconcile. Emitting a // remove here would make the watch appear to stop after a // transient lock (webpack/watchpack#223, #44). if (err && err.code === "EBUSY" && BUSY_RETRIES > 0) { return; } this.setMissing(target, false, eventType); } else if (stats.isDirectory()) { this.setDirectory(target, +stats.birthtime || 1, false, eventType); } else if (stats.isFile() || stats.isSymbolicLink()) { if (stats.mtime) { ensureFsAccuracy(+stats.mtime); } this.setFileTime( target, +stats.mtime || +stats.ctime || 1, false, false, eventType, ); } }); }; process.nextTick(checkStats); } else { this._activeEvents.set(filename, true); } } /** * @param {unknown=} err error */ onWatcherError(err) { if (this.closed) return; if (err) { if ( /** @type {NodeJS.ErrnoException} */ (err).code !== "EPERM" && /** @type {NodeJS.ErrnoException} */ (err).code !== "ENOENT" ) { // eslint-disable-next-line no-console console.error(`Watchpack Error (watcher): ${err}`); } this.onDirectoryRemoved("watch error"); } } /** * @param {Error | NodeJS.ErrnoException=} err error */ onStatsError(err) { if (err) { // eslint-disable-next-line no-console console.error(`Watchpack Error (stats): ${err}`); } } /** * @param {Error | NodeJS.ErrnoException=} err error */ onScanError(err) { if (err) { // eslint-disable-next-line no-console console.error(`Watchpack Error (initial scan): ${err}`); } this.onScanFinished(); } onScanFinished() { if (this.polledWatching) { this.timeout = setTimeout(() => { if (this.closed) return; this.doScan(false); }, this.polledWatching); } } /** * @param {string} reason a reason */ onDirectoryRemoved(reason) { if (this.watcher) { this.watcher.close(); this.watcher = null; } this.watchInParentDirectory(); const type = /** @type {EventType} */ (`directory-removed (${reason})`); for (const directory of this.directories.keys()) { this.setMissing(directory, false, type); } for (const file of this.files.keys()) { this.setMissing(file, false, type); } } watchInParentDirectory() { if (!this.parentWatcher) { const parentDir = path.dirname(this.path); // avoid watching in the root directory // removing directories in the root directory is not supported if (path.dirname(parentDir) === parentDir) return; this.parentWatcher = this.watcherManager.watchFile(this.path, 1); /** @type {Watcher} */ (this.parentWatcher).on("change", (mtime, type) => { if (this.closed) return; // On non-osx platforms we don't need this watcher to detect // directory removal, as an EPERM error indicates that if ((!IS_OSX || this.polledWatching) && this.parentWatcher) { this.parentWatcher.close(); this.parentWatcher = null; } // Try to create the watcher when parent directory is found if (!this.watcher) { this.createWatcher(); this.doScan(false); // directory was created so we emit an event this.forEachWatcher(this.path, (w) => w.emit("change", this.path, mtime, type, false), ); } }); /** @type {Watcher} */ (this.parentWatcher).on("remove", () => { this.onDirectoryRemoved("parent directory removed"); }); } } /** * @param {boolean} initial true when initial, otherwise false */ doScan(initial) { if (this.scanning) { if (this.scanAgain) { if (!initial) this.scanAgainInitial = false; } else { this.scanAgain = true; this.scanAgainInitial = initial; } return; } this.scanning = true; if (this.timeout) { clearTimeout(this.timeout); this.timeout = undefined; } process.nextTick(() => { if (this.closed) return; fs.readdir(this.path, (err, items) => { if (this.closed) return; if (err) { // Mirror the lstat error handling below: treat permission / // invalid-argument / no-device errors on the directory itself // as removed rather than logging "Watchpack Error (initial // scan)". These surface for unreadable mounts (WSL `/mnt/c`, // fuse mounts), unmounted devices (`/efi`), and libuv's // post-Node 22.17 `EINVAL` on protected Windows paths // (see #187). if ( err.code === "ENOENT" || err.code === "EPERM" || err.code === "EACCES" || err.code === "ENODEV" || (err.code === "EINVAL" && IS_WIN) ) { this.onDirectoryRemoved("scan readdir failed"); } else { this.onScanError(err); } this.initialScan = false; this.initialScanFinished = Date.now(); if (initial) { for (const watchers of this.watchers.values()) { for (const watcher of watchers) { if (watcher.checkStartTime(this.initialScanFinished, false)) { watcher.emit( "initial-missing", "scan (parent directory missing in initial scan)", ); } } } } if (this.scanAgain) { this.scanAgain = false; this.doScan(this.scanAgainInitial); } else { this.scanning = false; } return; } const itemPaths = new Set( items.map((item) => path.join(this.path, item.normalize("NFC"))), ); for (const file of this.files.keys()) { if (!itemPaths.has(file)) { this.setMissing(file, initial, "scan (missing)"); } } for (const directory of this.directories.keys()) { if (!itemPaths.has(directory)) { this.setMissing(directory, initial, "scan (missing)"); } } if (this.scanAgain) { // Early repeat of scan this.scanAgain = false; this.doScan(initial); return; } const itemFinished = needCalls(itemPaths.size + 1, () => { if (this.closed) return; this.initialScan = false; this.initialScanRemoved = null; this.initialScanFinished = Date.now(); if (initial) { const missingWatchers = new Map(this.watchers); missingWatchers.delete(withoutCase(this.path)); for (const item of itemPaths) { missingWatchers.delete(withoutCase(item)); } for (const watchers of missingWatchers.values()) { for (const watcher of watchers) { if (watcher.checkStartTime(this.initialScanFinished, false)) { watcher.emit( "initial-missing", "scan (missing in initial scan)", ); } } } } if (this.scanAgain) { this.scanAgain = false; this.doScan(this.scanAgainInitial); } else { this.scanning = false; this.onScanFinished(); } }); for (const itemPath of itemPaths) { lstatWithRetry(itemPath, this, (err2, stats) => { if (this.closed) return; if (err2) { if ( err2.code === "ENOENT" || err2.code === "EPERM" || err2.code === "EACCES" || err2.code === "EBUSY" || err2.code === "ENODEV" || // TODO https://github.com/libuv/libuv/pull/4566 (err2.code === "EINVAL" && IS_WIN) ) { // readdir saw the entry but we can't stat it due to a // transient lock — keep the previously-known entry instead // of incorrectly flagging it as missing. if ( !( err2.code === "EBUSY" && BUSY_RETRIES > 0 && this.files.has(itemPath) ) ) { this.setMissing(itemPath, initial, `scan (${err2.code})`); } } else { this.onScanError(err2); } itemFinished(); return; } /** * @param {string | null} realPath resolved real path for an outside-dir symlink target */ const apply = (realPath) => { if (stats.isFile() || stats.isSymbolicLink()) { if (stats.mtime) ensureFsAccuracy(+stats.mtime); this.setFileTime( itemPath, +stats.mtime || +stats.ctime || 1, initial, true, "scan (file)", ); if (realPath && !this._symlinkTargetWatchers.has(itemPath)) { const w = this.watcherManager.watchFile(realPath, Date.now()); if (w) { w.on("change", (mtime, type, wInitial) => { if (wInitial) return; this.setFileTime(itemPath, mtime, false, false, type); }); this._symlinkTargetWatchers.set(itemPath, w); } } } else if ( stats.isDirectory() && (!initial || !this.directories.has(itemPath)) ) { this.setDirectory( itemPath, +stats.birthtime || 1, initial, "scan (dir)", ); } itemFinished(); }; if ( this.options.followSymlinks && this.nestedWatching && stats.isSymbolicLink() ) { fs.realpath(itemPath, (err3, realPath) => { if (this.closed) return; if ( err3 || !realPath || withoutCase(path.dirname(realPath)) === withoutCase(this.path) ) { apply(null); return; } // Cycle protection: when the symlink's target is the symlink // path itself or one of its ancestors, descending would // create an unbounded chain of `DirectoryWatcher`s as we walk // back into territory we are already watching. Treat the // symlink as a plain entry instead so the symlink itself is // still tracked but no recursion happens. const rel = path.relative(realPath, itemPath); if (!path.isAbsolute(rel) && !rel.startsWith("..")) { apply(null); return; } fs.stat(realPath, (err4, targetStats) => { if (this.closed) return; if (err4 || !targetStats) { apply(null); } else if (targetStats.isFile()) { apply(realPath); } else if (targetStats.isDirectory()) { // Treat a symlink whose target is a directory as a // nested watched directory so files inside the target // propagate change events to the symlink path. this.setDirectory( itemPath, +targetStats.birthtime || +stats.birthtime || 1, initial, "scan (dir)", ); itemFinished(); } else { apply(null); } }); }); return; } apply(null); }); } itemFinished(); }); }); } /** * @returns {Record} times */ getTimes() { const obj = Object.create(null); let safeTime = this.lastWatchEvent; for (const [file, entry] of this.files) { fixupEntryAccuracy(entry); safeTime = Math.max(safeTime, entry.safeTime); obj[file] = Math.max(entry.safeTime, entry.timestamp); } if (this.nestedWatching) { for (const w of this.directories.values()) { const times = /** @type {Watcher} */ (w).directoryWatcher.getTimes(); for (const file of Object.keys(times)) { const time = times[file]; safeTime = Math.max(safeTime, time); obj[file] = time; } } obj[this.path] = safeTime; } if (!this.initialScan) { for (const watchers of this.watchers.values()) { for (const watcher of watchers) { const { path } = watcher; if (!Object.prototype.hasOwnProperty.call(obj, path)) { obj[path] = null; } } } } return obj; } /** * @param {TimeInfoEntries} fileTimestamps file timestamps * @param {TimeInfoEntries} directoryTimestamps directory timestamps * @returns {number} safe time */ collectTimeInfoEntries(fileTimestamps, directoryTimestamps) { let safeTime = this.lastWatchEvent; for (const [file, entry] of this.files) { fixupEntryAccuracy(entry); safeTime = Math.max(safeTime, entry.safeTime); fileTimestamps.set(file, entry); } if (this.nestedWatching) { for (const w of this.directories.values()) { safeTime = Math.max( safeTime, /** @type {Watcher} */ (w).directoryWatcher.collectTimeInfoEntries( fileTimestamps, directoryTimestamps, ), ); } fileTimestamps.set(this.path, EXISTANCE_ONLY_TIME_ENTRY); directoryTimestamps.set(this.path, { safeTime, }); } else { for (const dir of this.directories.keys()) { // No additional info about this directory // but maybe another DirectoryWatcher has info fileTimestamps.set(dir, EXISTANCE_ONLY_TIME_ENTRY); if (!directoryTimestamps.has(dir)) { directoryTimestamps.set(dir, EXISTANCE_ONLY_TIME_ENTRY); } } fileTimestamps.set(this.path, EXISTANCE_ONLY_TIME_ENTRY); directoryTimestamps.set(this.path, EXISTANCE_ONLY_TIME_ENTRY); } if (!this.initialScan) { for (const watchers of this.watchers.values()) { for (const watcher of watchers) { const { path } = watcher; if (!fileTimestamps.has(path)) { fileTimestamps.set(path, null); } } } } return safeTime; } close() { if (this.closed) return; this.closed = true; this.initialScan = false; if (this.watcher) { this.watcher.close(); this.watcher = null; } if (this.nestedWatching) { for (const w of this.directories.values()) { /** @type {Watcher} */ (w).close(); } this.directories.clear(); } for (const w of this._symlinkTargetWatchers.values()) { w.close(); } this._symlinkTargetWatchers.clear(); if (this.parentWatcher) { this.parentWatcher.close(); this.parentWatcher = null; } this.emit("closed"); } } module.exports = DirectoryWatcher; module.exports.EXISTANCE_ONLY_TIME_ENTRY = EXISTANCE_ONLY_TIME_ENTRY; module.exports.Watcher = Watcher; watchpack-2.5.2/lib/LinkResolver.js000066400000000000000000000065401521250557700172260ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const fs = require("fs"); const path = require("path"); // macOS, Linux, and Windows all rely on these errors const EXPECTED_ERRORS = new Set(["EINVAL", "ENOENT"]); // On Windows there is also this error in some cases if (process.platform === "win32") EXPECTED_ERRORS.add("UNKNOWN"); class LinkResolver { constructor() { /** @type {Map} */ this.cache = new Map(); } /** * @param {string} file path to file or directory * @returns {readonly string[]} array of file and all symlinks contributed in the resolving process (first item is the resolved file) */ resolve(file) { const cacheEntry = this.cache.get(file); if (cacheEntry !== undefined) { return cacheEntry; } const parent = path.dirname(file); if (parent === file) { // At root of filesystem there can't be a link const result = Object.freeze([file]); this.cache.set(file, result); return result; } // resolve the parent directory to find links there and get the real path const parentResolved = this.resolve(parent); let realFile = file; // is the parent directory really somewhere else? if (parentResolved[0] !== parent) { // get the real location of file const basename = path.basename(file); realFile = path.resolve(parentResolved[0], basename); } // try to read the link content try { const linkContent = fs.readlinkSync(realFile); // resolve the link content relative to the parent directory const resolvedLink = path.resolve(parentResolved[0], linkContent); // recursive resolve the link content for more links in the structure const linkResolved = this.resolve(resolvedLink); // merge parent and link resolve results let result; if (linkResolved.length > 1 && parentResolved.length > 1) { // when both contain links we need to duplicate them with a Set const resultSet = new Set(linkResolved); // add the link resultSet.add(realFile); // add all symlinks of the parent for (let i = 1; i < parentResolved.length; i++) { resultSet.add(parentResolved[i]); } result = Object.freeze([...resultSet]); } else if (parentResolved.length > 1) { // we have links in the parent but not for the link content location result = [...parentResolved]; // eslint-disable-next-line prefer-destructuring result[0] = linkResolved[0]; // add the link result.push(realFile); Object.freeze(result); } else if (linkResolved.length > 1) { // we can return the link content location result result = [...linkResolved]; // add the link result.push(realFile); Object.freeze(result); } else { // neither link content location nor parent have links // this link is the only link here result = Object.freeze([ // the resolve real location linkResolved[0], // add the link realFile, ]); } this.cache.set(file, result); return result; } catch (err) { if ( /** @type {NodeJS.ErrnoException} */ (err).code && !EXPECTED_ERRORS.has(/** @type {NodeJS.ErrnoException} */ (err).code) ) { throw err; } // no link const result = [...parentResolved]; result[0] = realFile; Object.freeze(result); this.cache.set(file, result); return result; } } } module.exports = LinkResolver; watchpack-2.5.2/lib/getWatcherManager.js000066400000000000000000000046141521250557700201770ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const path = require("path"); const DirectoryWatcher = require("./DirectoryWatcher"); /** @typedef {import("./index").EventMap} EventMap */ /** @typedef {import("./DirectoryWatcher").DirectoryWatcherOptions} DirectoryWatcherOptions */ /** @typedef {import("./DirectoryWatcher").DirectoryWatcherEvents} DirectoryWatcherEvents */ /** @typedef {import("./DirectoryWatcher").FileWatcherEvents} FileWatcherEvents */ /** * @template {EventMap} T * @typedef {import("./DirectoryWatcher").Watcher} Watcher */ class WatcherManager { /** * @param {DirectoryWatcherOptions=} options options */ constructor(options = {}) { this.options = options; /** @type {Map} */ this.directoryWatchers = new Map(); } /** * @param {string} directory a directory * @returns {DirectoryWatcher} a directory watcher */ getDirectoryWatcher(directory) { const watcher = this.directoryWatchers.get(directory); if (watcher === undefined) { const newWatcher = new DirectoryWatcher(this, directory, this.options); this.directoryWatchers.set(directory, newWatcher); newWatcher.on("closed", () => { this.directoryWatchers.delete(directory); }); return newWatcher; } return watcher; } /** * @param {string} file file * @param {number=} startTime start time * @returns {Watcher | null} watcher or null if file has no directory */ watchFile(file, startTime) { const directory = path.dirname(file); if (directory === file) return null; return this.getDirectoryWatcher(directory).watch(file, startTime); } /** * @param {string} directory directory * @param {number=} startTime start time * @returns {Watcher} watcher */ watchDirectory(directory, startTime) { return this.getDirectoryWatcher(directory).watch(directory, startTime); } } const watcherManagers = new WeakMap(); /** * @param {DirectoryWatcherOptions} options options * @returns {WatcherManager} the watcher manager */ module.exports = (options) => { const watcherManager = watcherManagers.get(options); if (watcherManager !== undefined) return watcherManager; const newWatcherManager = new WatcherManager(options); watcherManagers.set(options, newWatcherManager); return newWatcherManager; }; module.exports.WatcherManager = WatcherManager; watchpack-2.5.2/lib/index.js000066400000000000000000000422451521250557700157200ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const { EventEmitter } = require("events"); const LinkResolver = require("./LinkResolver"); const getWatcherManager = require("./getWatcherManager"); const globToRegExp = require("./util/globToRegExp"); const watchEventSource = require("./watchEventSource"); /** @typedef {import("./getWatcherManager").WatcherManager} WatcherManager */ /** @typedef {import("./DirectoryWatcher")} DirectoryWatcher */ /** @typedef {import("./DirectoryWatcher").DirectoryWatcherEvents} DirectoryWatcherEvents */ /** @typedef {import("./DirectoryWatcher").FileWatcherEvents} FileWatcherEvents */ // eslint-disable-next-line jsdoc/reject-any-type /** @typedef {Record any>} EventMap */ /** * @template {EventMap} T * @typedef {import("./DirectoryWatcher").Watcher} Watcher */ /** @typedef {(item: string) => boolean} IgnoredFunction */ /** @typedef {string[] | RegExp | string | IgnoredFunction} Ignored */ /** * @typedef {object} WatcherOptions * @property {boolean=} followSymlinks true when need to resolve symlinks and watch symlink and real file, otherwise false * @property {Ignored=} ignored ignore some files from watching (glob pattern or regexp) * @property {number | boolean=} poll true when need to enable polling mode for watching, otherwise false */ /** @typedef {WatcherOptions & { aggregateTimeout?: number }} WatchOptions */ /** * @typedef {object} NormalizedWatchOptions * @property {boolean} followSymlinks true when need to resolve symlinks and watch symlink and real file, otherwise false * @property {IgnoredFunction} ignored ignore some files from watching (glob pattern or regexp) * @property {number | boolean=} poll true when need to enable polling mode for watching, otherwise false */ /** @typedef {`scan (${string})` | "change" | "rename" | `watch ${string}` | `directory-removed ${string}`} EventType */ /** @typedef {{ safeTime: number, timestamp: number, accuracy: number }} Entry */ /** @typedef {{ safeTime: number }} OnlySafeTimeEntry */ // eslint-disable-next-line jsdoc/ts-no-empty-object-type /** @typedef {{ }} ExistenceOnlyTimeEntry */ /** @typedef {Map} TimeInfoEntries */ /** @typedef {Set} Changes */ /** @typedef {Set} Removals */ /** @typedef {{ changes: Changes, removals: Removals }} Aggregated */ /** @typedef {{ files?: Iterable, directories?: Iterable, missing?: Iterable, startTime?: number }} WatchMethodOptions */ /** @typedef {Record} Times */ /** * @param {MapIterator | MapIterator} watchers watchers * @param {Set} set set */ function addWatchersToSet(watchers, set) { for (const ww of watchers) { // Set.add is already idempotent, so skip the redundant has() probe. set.add(ww.watcher.directoryWatcher); } } /** * @param {string} ignored ignored * @returns {string | undefined} resolved global to regexp */ const stringToRegexp = (ignored) => { if (ignored.length === 0) { return; } return `^${globToRegExp(ignored)}(?:$|\\/)`; }; /** * Normalizes path separators for regex testing. `String.prototype.replace` * always allocates a new string, even when the pattern finds nothing; for * POSIX paths (the common case) that allocation is pure overhead. Check for * a backslash with `indexOf` first so we skip the copy on paths that are * already normalized. * @param {string} item item * @returns {string} item with backslashes normalized to forward slashes */ const normalizeSeparators = (item) => item.includes("\\") ? item.replace(/\\/g, "/") : item; /** * @param {Ignored=} ignored ignored * @returns {(item: string) => boolean} ignored to function */ const ignoredToFunction = (ignored) => { if (Array.isArray(ignored)) { const stringRegexps = /** @type {string[]} */ (ignored.map((i) => stringToRegexp(i)).filter(Boolean)); if (stringRegexps.length === 0) { return () => false; } const regexp = stringRegexps.length === 1 ? new RegExp(stringRegexps[0]) : new RegExp(stringRegexps.join("|")); return (item) => regexp.test(normalizeSeparators(item)); } else if (typeof ignored === "string") { const stringRegexp = stringToRegexp(ignored); if (!stringRegexp) { return () => false; } const regexp = new RegExp(stringRegexp); return (item) => regexp.test(normalizeSeparators(item)); } else if (ignored instanceof RegExp) { return (item) => ignored.test(normalizeSeparators(item)); } else if (typeof ignored === "function") { return ignored; } else if (ignored) { throw new Error(`Invalid option for 'ignored': ${ignored}`); } else { return () => false; } }; /** * @param {WatchOptions} options options * @returns {NormalizedWatchOptions} normalized options */ const normalizeOptions = (options) => ({ followSymlinks: Boolean(options.followSymlinks), ignored: ignoredToFunction(options.ignored), poll: options.poll, }); const normalizeCache = new WeakMap(); /** * @param {WatchOptions} options options * @returns {NormalizedWatchOptions} normalized options */ const cachedNormalizeOptions = (options) => { const cacheEntry = normalizeCache.get(options); if (cacheEntry !== undefined) return cacheEntry; const normalized = normalizeOptions(options); normalizeCache.set(options, normalized); return normalized; }; class WatchpackFileWatcher { /** * @param {Watchpack} watchpack watchpack * @param {Watcher} watcher watcher * @param {string | string[]} files files */ constructor(watchpack, watcher, files) { /** @type {string[]} */ this.files = Array.isArray(files) ? files : [files]; this.watcher = watcher; watcher.on("initial-missing", (type) => { for (const file of this.files) { if (!watchpack._missing.has(file)) { watchpack._onRemove(file, file, type); } } }); watcher.on("change", (mtime, type, _initial) => { for (const file of this.files) { watchpack._onChange(file, mtime, file, type); } }); watcher.on("remove", (type) => { for (const file of this.files) { watchpack._onRemove(file, file, type); } }); } /** * @param {string | string[]} files files */ update(files) { if (!Array.isArray(files)) { if (this.files.length !== 1) { this.files = [files]; } else if (this.files[0] !== files) { this.files[0] = files; } } else { this.files = files; } } close() { this.watcher.close(); } } class WatchpackDirectoryWatcher { /** * @param {Watchpack} watchpack watchpack * @param {Watcher} watcher watcher * @param {string} directories directories */ constructor(watchpack, watcher, directories) { /** @type {string[]} */ this.directories = Array.isArray(directories) ? directories : [directories]; this.watcher = watcher; watcher.on("initial-missing", (type) => { for (const item of this.directories) { watchpack._onRemove(item, item, type); } }); watcher.on("change", (file, mtime, type, _initial) => { for (const item of this.directories) { watchpack._onChange(item, mtime, file, type); } }); watcher.on("remove", (type) => { for (const item of this.directories) { watchpack._onRemove(item, item, type); } }); } /** * @param {string | string[]} directories directories */ update(directories) { if (!Array.isArray(directories)) { if (this.directories.length !== 1) { this.directories = [directories]; } else if (this.directories[0] !== directories) { this.directories[0] = directories; } } else { this.directories = directories; } } close() { this.watcher.close(); } } /** * @typedef {object} WatchpackEvents * @property {(file: string, mtime: number, type: EventType) => void} change change event * @property {(file: string, type: EventType) => void} remove remove event * @property {(changes: Changes, removals: Removals) => void} aggregated aggregated event */ /** * @extends {EventEmitter<{ [K in keyof WatchpackEvents]: Parameters }>} */ class Watchpack extends EventEmitter { /** * @param {WatchOptions=} options options */ constructor(options = {}) { super(); if (!options) options = {}; /** @type {WatchOptions} */ this.options = options; this.aggregateTimeout = typeof options.aggregateTimeout === "number" ? options.aggregateTimeout : 200; /** @type {NormalizedWatchOptions} */ this.watcherOptions = cachedNormalizeOptions(options); /** @type {WatcherManager} */ this.watcherManager = getWatcherManager(this.watcherOptions); /** @type {Map} */ this.fileWatchers = new Map(); /** @type {Map} */ this.directoryWatchers = new Map(); /** @type {Set} */ this._missing = new Set(); this.startTime = undefined; this.paused = false; /** @type {Changes} */ this.aggregatedChanges = new Set(); /** @type {Removals} */ this.aggregatedRemovals = new Set(); /** @type {undefined | NodeJS.Timeout} */ this.aggregateTimer = undefined; this._onTimeout = this._onTimeout.bind(this); } /** * @overload * @param {Iterable} arg1 files * @param {Iterable} arg2 directories * @param {number=} arg3 startTime * @returns {void} */ /** * @overload * @param {WatchMethodOptions} arg1 watch options * @returns {void} */ /** * @param {Iterable | WatchMethodOptions} arg1 files * @param {Iterable=} arg2 directories * @param {number=} arg3 startTime * @returns {void} */ watch(arg1, arg2, arg3) { /** @type {Iterable | undefined} */ let files; /** @type {Iterable | undefined} */ let directories; /** @type {Iterable | undefined} */ let missing; /** @type {number | undefined} */ let startTime; if (!arg2) { ({ files = [], directories = [], missing = [], startTime, } = /** @type {WatchMethodOptions} */ (arg1)); } else { files = /** @type {Iterable} */ (arg1); directories = /** @type {Iterable} */ (arg2); missing = []; startTime = /** @type {number} */ (arg3); } this.paused = false; const { fileWatchers, directoryWatchers } = this; const { ignored } = this.watcherOptions; /** * @param {string} path path * @returns {boolean} true when need to filter, otherwise false */ const filter = (path) => !ignored(path); /** * @template K, V * @param {Map} map map * @param {K} key key * @param {V} item item */ const addToMap = (map, key, item) => { const list = map.get(key); if (list === undefined) { map.set(key, item); } else if (Array.isArray(list)) { list.push(item); } else { map.set(key, [list, item]); } }; const fileWatchersNeeded = new Map(); const directoryWatchersNeeded = new Map(); /** @type {Set} */ const missingFiles = new Set(); if (this.watcherOptions.followSymlinks) { const resolver = new LinkResolver(); for (const file of files) { if (filter(file)) { for (const innerFile of resolver.resolve(file)) { if (file === innerFile || filter(innerFile)) { addToMap(fileWatchersNeeded, innerFile, file); } } } } for (const file of missing) { if (filter(file)) { for (const innerFile of resolver.resolve(file)) { if (file === innerFile || filter(innerFile)) { missingFiles.add(file); addToMap(fileWatchersNeeded, innerFile, file); } } } } for (const dir of directories) { if (filter(dir)) { let first = true; for (const innerItem of resolver.resolve(dir)) { if (filter(innerItem)) { addToMap( first ? directoryWatchersNeeded : fileWatchersNeeded, innerItem, dir, ); } first = false; } } } } else { for (const file of files) { if (filter(file)) { addToMap(fileWatchersNeeded, file, file); } } for (const file of missing) { if (filter(file)) { missingFiles.add(file); addToMap(fileWatchersNeeded, file, file); } } for (const dir of directories) { if (filter(dir)) { addToMap(directoryWatchersNeeded, dir, dir); } } } // Close unneeded old watchers // and update existing watchers for (const [key, w] of fileWatchers) { const needed = fileWatchersNeeded.get(key); if (needed === undefined) { w.close(); fileWatchers.delete(key); } else { w.update(needed); fileWatchersNeeded.delete(key); } } for (const [key, w] of directoryWatchers) { const needed = directoryWatchersNeeded.get(key); if (needed === undefined) { w.close(); directoryWatchers.delete(key); } else { w.update(needed); directoryWatchersNeeded.delete(key); } } // Create new watchers and install handlers on these watchers watchEventSource.batch(() => { for (const [key, files] of fileWatchersNeeded) { const watcher = this.watcherManager.watchFile(key, startTime); if (watcher) { fileWatchers.set(key, new WatchpackFileWatcher(this, watcher, files)); } } for (const [key, directories] of directoryWatchersNeeded) { const watcher = this.watcherManager.watchDirectory(key, startTime); if (watcher) { directoryWatchers.set( key, new WatchpackDirectoryWatcher(this, watcher, directories), ); } } }); this._missing = missingFiles; this.startTime = startTime; } close() { this.paused = true; if (this.aggregateTimer) clearTimeout(this.aggregateTimer); for (const w of this.fileWatchers.values()) w.close(); for (const w of this.directoryWatchers.values()) w.close(); this.fileWatchers.clear(); this.directoryWatchers.clear(); } pause() { this.paused = true; if (this.aggregateTimer) clearTimeout(this.aggregateTimer); } /** * @returns {Record} times */ getTimes() { /** @type {Set} */ const directoryWatchers = new Set(); addWatchersToSet(this.fileWatchers.values(), directoryWatchers); addWatchersToSet(this.directoryWatchers.values(), directoryWatchers); /** @type {Record} */ const obj = Object.create(null); for (const w of directoryWatchers) { // getTimes() returns a prototype-less object, so for...in is safe // and avoids the throwaway array that Object.keys would allocate. const times = w.getTimes(); for (const file in times) obj[file] = times[file]; } return obj; } /** * @returns {TimeInfoEntries} time info entries */ getTimeInfoEntries() { /** @type {TimeInfoEntries} */ const map = new Map(); this.collectTimeInfoEntries(map, map); return map; } /** * @param {TimeInfoEntries} fileTimestamps file timestamps * @param {TimeInfoEntries} directoryTimestamps directory timestamps */ collectTimeInfoEntries(fileTimestamps, directoryTimestamps) { /** @type {Set} */ const allWatchers = new Set(); addWatchersToSet(this.fileWatchers.values(), allWatchers); addWatchersToSet(this.directoryWatchers.values(), allWatchers); for (const w of allWatchers) { w.collectTimeInfoEntries(fileTimestamps, directoryTimestamps); } } /** * @returns {Aggregated} aggregated info */ getAggregated() { if (this.aggregateTimer) { clearTimeout(this.aggregateTimer); this.aggregateTimer = undefined; } const changes = this.aggregatedChanges; const removals = this.aggregatedRemovals; this.aggregatedChanges = new Set(); this.aggregatedRemovals = new Set(); return { changes, removals }; } /** * @param {string} item item * @param {number} mtime mtime * @param {string} file file * @param {EventType} type type */ _onChange(item, mtime, file, type) { file = file || item; if (!this.paused) { this.emit("change", file, mtime, type); if (this.aggregateTimer) clearTimeout(this.aggregateTimer); this.aggregateTimer = setTimeout(this._onTimeout, this.aggregateTimeout); } this.aggregatedRemovals.delete(item); this.aggregatedChanges.add(item); } /** * @param {string} item item * @param {string} file file * @param {EventType} type type */ _onRemove(item, file, type) { file = file || item; if (!this.paused) { this.emit("remove", file, type); if (this.aggregateTimer) clearTimeout(this.aggregateTimer); this.aggregateTimer = setTimeout(this._onTimeout, this.aggregateTimeout); } this.aggregatedChanges.delete(item); this.aggregatedRemovals.add(item); } _onTimeout() { this.aggregateTimer = undefined; const changes = this.aggregatedChanges; const removals = this.aggregatedRemovals; this.aggregatedChanges = new Set(); this.aggregatedRemovals = new Set(); this.emit("aggregated", changes, removals); } } /** * @template A * @template B * @param {A} obj input a * @param {B} exports input b * @returns {A & B} merged */ const mergeExports = (obj, exports) => { const descriptors = Object.getOwnPropertyDescriptors(exports); Object.defineProperties(obj, descriptors); return /** @type {A & B} */ (Object.freeze(obj)); }; /** @typedef {typeof Watchpack & { util: { readonly globToRegExp: typeof globToRegExp } }} WatchpackExports */ module.exports = /** @type {WatchpackExports} */ ( mergeExports(Watchpack, { util: { get globToRegExp() { return globToRegExp; }, }, }) ); watchpack-2.5.2/lib/reducePlan.js000066400000000000000000000111241521250557700166630ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const path = require("path"); /** * @template T * @typedef {object} TreeNode * @property {string} target target * @property {TreeNode} parent parent * @property {TreeNode[]} children children * @property {number} entries number of entries * @property {boolean} active true when active, otherwise false * @property {T[] | T | undefined} value value */ /** * @template T * @param {Map} plan plan * @param {number} limit limit * @returns {Map>} the new plan */ module.exports = (plan, limit) => { const treeMap = new Map(); // Convert to tree for (const [target, value] of plan) { treeMap.set(target, { target, parent: undefined, children: undefined, entries: 1, active: true, value, }); } let currentCount = treeMap.size; // Create parents and calculate sum of entries for (const node of treeMap.values()) { const parentPath = path.dirname(node.target); if (parentPath !== node.target) { let parent = treeMap.get(parentPath); if (parent === undefined) { parent = { target: parentPath, parent: undefined, children: [node], entries: node.entries, active: false, value: undefined, }; treeMap.set(parentPath, parent); node.parent = parent; } else { node.parent = parent; if (parent.children === undefined) { parent.children = [node]; } else { parent.children.push(node); } do { parent.entries += node.entries; parent = parent.parent; } while (parent); } } } // Reduce until limit reached. When no reduction is needed at all, skip // building the candidate set entirely to avoid paying for the setup on the // common fast path. if (currentCount > limit) { // Pre-filter candidate nodes so the inner selection loop skips structural // non-candidates entirely. `children` length and parent presence are // fixed after tree construction; only `entries` can change (it can only // decrease), so a node that fails the `entries` check in a later round // is simply skipped via `continue`. When we merge a subtree we drop the // descendants from the candidate set to keep it shrinking over // iterations. /** @type {Set>} */ const candidates = new Set(); for (const node of treeMap.values()) { if (!node.parent || !node.children) continue; if (node.children.length === 0) continue; if (node.children.length === 1 && !node.value) continue; candidates.add(node); } const costBias = limit * 0.3; while (currentCount > limit) { // Select node that helps reaching the limit most effectively without overmerging const overLimit = currentCount - limit; let bestNode; let bestCost = Infinity; for (const node of candidates) { if (node.entries <= 1) continue; // Try to select the node with has just a bit more entries than we need to reduce // When just a bit more is over 30% over the limit, // also consider just a bit less entries then we need to reduce const diff = node.entries - 1 - overLimit; const cost = diff >= 0 ? diff : -diff + costBias; if (cost < bestCost) { bestNode = node; bestCost = cost; // A cost of 0 means the merge reduces exactly to the limit; // no further candidate can improve on that, so stop scanning. if (cost === 0) break; } } if (!bestNode) break; // Merge all children const reduction = bestNode.entries - 1; bestNode.active = true; bestNode.entries = 1; candidates.delete(bestNode); currentCount -= reduction; let { parent } = bestNode; while (parent) { parent.entries -= reduction; parent = parent.parent; } const queue = new Set(bestNode.children); for (const node of queue) { node.active = false; node.entries = 0; candidates.delete(node); if (node.children) { for (const child of node.children) queue.add(child); } } } } // Write down new plan const newPlan = new Map(); for (const rootNode of treeMap.values()) { if (!rootNode.active) continue; const map = new Map(); const queue = new Set([rootNode]); for (const node of queue) { if (node.active && node !== rootNode) continue; if (node.value) { if (Array.isArray(node.value)) { for (const item of node.value) { map.set(item, node.target); } } else { map.set(node.value, node.target); } } if (node.children) { for (const child of node.children) { queue.add(child); } } } newPlan.set(rootNode.target, map); } return newPlan; }; watchpack-2.5.2/lib/util/000077500000000000000000000000001521250557700152215ustar00rootroot00000000000000watchpack-2.5.2/lib/util/globToRegExp.js000066400000000000000000000062551521250557700201300ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Haijie Xie @hai-x */ "use strict"; // Based on https://github.com/fitzgen/glob-to-regexp (MIT) // Specialized for watchpack: `extended` and `globstar` always enabled. // Returns the regexp source without `^`/`$` anchors. const CC_EXCLAMATION = 33; // "!" const CC_DOLLAR = 36; // "$" const CC_LEFT_PARENTHESIS = 40; // "(" const CC_RIGHT_PARENTHESIS = 41; // ")" const CC_ASTERISK = 42; // "*" const CC_PLUS = 43; // "+" const CC_COMMA = 44; // "," const CC_DOT = 46; // "." const CC_SLASH = 47; // "/" const CC_EQUAL = 61; // "=" const CC_QUESTION_MARK = 63; // "?" const CC_LEFT_BRACKET = 91; // "[" const CC_RIGHT_BRACKET = 93; // "]" const CC_CARET = 94; // "^" const CC_LEFT_BRACE = 123; // "{" const CC_PIPE = 124; // "|" const CC_RIGHT_BRACE = 125; // "}" /** * @param {string} glob glob pattern * @returns {string} regexp source without anchors */ module.exports = (glob) => { if (typeof glob !== "string") { throw new TypeError("Expected a string"); } const len = glob.length; let reStr = ""; let inGroup = false; // Start of the current run of literal characters, copied with one slice let literalStart = 0; for (let i = 0; i < len; i++) { const cc = glob.charCodeAt(i); const tokenStart = i; let mapped; switch (cc) { case CC_SLASH: mapped = "\\/"; break; case CC_DOLLAR: mapped = "\\$"; break; case CC_CARET: mapped = "\\^"; break; case CC_PLUS: mapped = "\\+"; break; case CC_DOT: mapped = "\\."; break; case CC_LEFT_PARENTHESIS: mapped = "\\("; break; case CC_RIGHT_PARENTHESIS: mapped = "\\)"; break; case CC_EQUAL: mapped = "\\="; break; case CC_EXCLAMATION: mapped = "\\!"; break; case CC_PIPE: mapped = "\\|"; break; case CC_QUESTION_MARK: mapped = "."; break; case CC_LEFT_BRACKET: mapped = "["; break; case CC_RIGHT_BRACKET: mapped = "]"; break; case CC_LEFT_BRACE: inGroup = true; mapped = "("; break; case CC_RIGHT_BRACE: inGroup = false; mapped = ")"; break; case CC_COMMA: mapped = inGroup ? "|" : "\\,"; break; case CC_ASTERISK: { const atStart = i === 0; const afterSlash = !atStart && glob.charCodeAt(i - 1) === CC_SLASH; let starCount = 1; while (i + 1 < len && glob.charCodeAt(i + 1) === CC_ASTERISK) { starCount++; i++; } const atEnd = i + 1 === len; const beforeSlash = !atEnd && glob.charCodeAt(i + 1) === CC_SLASH; if ( starCount > 1 && (atStart || afterSlash) && (atEnd || beforeSlash) ) { // Globstar segment, matches zero or more path segments mapped = "((?:[^/]*(?:\\/|$))*)"; i++; // Move over the "/" } else { // Not a globstar, matches one path segment mapped = "([^/]*)"; } break; } default: // Literal character, extend the current run continue; } if (literalStart < tokenStart) { reStr += glob.slice(literalStart, tokenStart); } reStr += mapped; literalStart = i + 1; } if (literalStart < len) { reStr += literalStart === 0 ? glob : glob.slice(literalStart); } return reStr; }; watchpack-2.5.2/lib/watchEventSource.js000066400000000000000000000275461521250557700201110ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const { EventEmitter } = require("events"); const fs = require("fs"); const path = require("path"); const reducePlan = require("./reducePlan"); /** @typedef {import("fs").FSWatcher} FSWatcher */ /** @typedef {import("./index").EventType} EventType */ const IS_OSX = require("os").platform() === "darwin"; const IS_WIN = require("os").platform() === "win32"; const SUPPORTS_RECURSIVE_WATCHING = IS_OSX || IS_WIN; // Use 20 for OSX to make `FSWatcher.close` faster // https://github.com/nodejs/node/issues/29949 const watcherLimit = // @ts-expect-error avoid additional checks +process.env.WATCHPACK_WATCHER_LIMIT || (IS_OSX ? 20 : 10000); const recursiveWatcherLogging = Boolean( process.env.WATCHPACK_RECURSIVE_WATCHER_LOGGING, ); let isBatch = false; let watcherCount = 0; /** @type {Map} */ const pendingWatchers = new Map(); /** @type {Map} */ const recursiveWatchers = new Map(); /** @type {Map} */ const directWatchers = new Map(); /** @type {Map} */ const underlyingWatcher = new Map(); /** * @param {string} filePath file path * @returns {NodeJS.ErrnoException} new error with file path in the message */ function createEPERMError(filePath) { const error = /** @type {NodeJS.ErrnoException} */ (new Error(`Operation not permitted: ${filePath}`)); error.code = "EPERM"; return error; } /** * @param {FSWatcher} watcher watcher * @param {string} filePath a file path * @param {(type: "rename" | "change", filename: string) => void} handleChangeEvent function to handle change * @returns {(type: "rename" | "change", filename: string) => void} handler of change event */ function createHandleChangeEvent(watcher, filePath, handleChangeEvent) { // path.basename(filePath) is invariant for the lifetime of the watcher, // so compute it once rather than on every dispatched event. const ownBasename = path.basename(filePath); return (type, filename) => { // TODO: After Node.js v22, fs.watch(dir) and deleting a dir will trigger the rename change event. // Here we just ignore it and keep the same behavior as before v22 // https://github.com/libuv/libuv/pull/4376 if ( type === "rename" && path.isAbsolute(filename) && path.basename(filename) === ownBasename ) { if (!IS_OSX) { // Before v22, windows will throw EPERM error watcher.emit("error", createEPERMError(filename)); } // Before v22, macos nothing to do return; } handleChangeEvent(type, filename); }; } class DirectWatcher { /** * @param {string} filePath file path */ constructor(filePath) { this.filePath = filePath; this.watchers = new Set(); /** @type {FSWatcher | undefined} */ this.watcher = undefined; try { const watcher = fs.watch(filePath); this.watcher = watcher; const handleChangeEvent = createHandleChangeEvent( watcher, filePath, (type, filename) => { for (const w of this.watchers) { w.emit("change", type, filename); } }, ); watcher.on("change", handleChangeEvent); watcher.on("error", (error) => { for (const w of this.watchers) { w.emit("error", error); } }); } catch (err) { process.nextTick(() => { for (const w of this.watchers) { w.emit("error", err); } }); } watcherCount++; } /** * @param {Watcher} watcher a watcher */ add(watcher) { underlyingWatcher.set(watcher, this); this.watchers.add(watcher); } /** * @param {Watcher} watcher a watcher */ remove(watcher) { this.watchers.delete(watcher); if (this.watchers.size === 0) { directWatchers.delete(this.filePath); watcherCount--; if (this.watcher) this.watcher.close(); } } getWatchers() { return this.watchers; } } /** @typedef {Set} WatcherSet */ class RecursiveWatcher { /** * @param {string} rootPath a root path */ constructor(rootPath) { this.rootPath = rootPath; /** @type {Map} */ this.mapWatcherToPath = new Map(); /** @type {Map} */ this.mapPathToWatchers = new Map(); this.watcher = undefined; try { const watcher = fs.watch(rootPath, { recursive: true, }); this.watcher = watcher; watcher.on("change", (type, filename) => { if (!filename) { if (recursiveWatcherLogging) { process.stderr.write( `[watchpack] dispatch ${type} event in recursive watcher (${this.rootPath}) to all watchers\n`, ); } for (const w of this.mapWatcherToPath.keys()) { w.emit("change", /** @type {EventType} */ (type)); } } else { const dir = path.dirname(/** @type {string} */ (filename)); const watchers = this.mapPathToWatchers.get(dir); if (recursiveWatcherLogging) { process.stderr.write( `[watchpack] dispatch ${type} event in recursive watcher (${ this.rootPath }) for '${filename}' to ${ watchers ? watchers.size : 0 } watchers\n`, ); } if (watchers === undefined) return; for (const w of watchers) { w.emit( "change", /** @type {EventType} */ (type), path.basename(/** @type {string} */ (filename)), ); } } }); watcher.on("error", (error) => { for (const w of this.mapWatcherToPath.keys()) { w.emit("error", error); } }); } catch (err) { process.nextTick(() => { for (const w of this.mapWatcherToPath.keys()) { w.emit("error", err); } }); } watcherCount++; if (recursiveWatcherLogging) { process.stderr.write( `[watchpack] created recursive watcher at ${rootPath}\n`, ); } } /** * @param {string} filePath a file path * @param {Watcher} watcher a watcher */ add(filePath, watcher) { underlyingWatcher.set(watcher, this); const subpath = filePath.slice(this.rootPath.length + 1) || "."; this.mapWatcherToPath.set(watcher, subpath); const set = this.mapPathToWatchers.get(subpath); if (set === undefined) { const newSet = new Set(); newSet.add(watcher); this.mapPathToWatchers.set(subpath, newSet); } else { set.add(watcher); } } /** * @param {Watcher} watcher a watcher */ remove(watcher) { const subpath = this.mapWatcherToPath.get(watcher); if (!subpath) return; this.mapWatcherToPath.delete(watcher); const set = /** @type {WatcherSet} */ (this.mapPathToWatchers.get(subpath)); set.delete(watcher); if (set.size === 0) { this.mapPathToWatchers.delete(subpath); } if (this.mapWatcherToPath.size === 0) { recursiveWatchers.delete(this.rootPath); watcherCount--; if (this.watcher) this.watcher.close(); if (recursiveWatcherLogging) { process.stderr.write( `[watchpack] closed recursive watcher at ${this.rootPath}\n`, ); } } } getWatchers() { return this.mapWatcherToPath; } } /** * @typedef {object} WatcherEvents * @property {(eventType: EventType, filename?: string) => void} change change event * @property {(err: unknown) => void} error error event */ /** * @extends {EventEmitter<{ [K in keyof WatcherEvents]: Parameters }>} */ class Watcher extends EventEmitter { constructor() { super(); } close() { if (pendingWatchers.has(this)) { pendingWatchers.delete(this); return; } const watcher = underlyingWatcher.get(this); /** @type {RecursiveWatcher | DirectWatcher} */ (watcher).remove(this); underlyingWatcher.delete(this); } } /** * @param {string} filePath a file path * @returns {DirectWatcher} a directory watcher */ const createDirectWatcher = (filePath) => { const existing = directWatchers.get(filePath); if (existing !== undefined) return existing; const w = new DirectWatcher(filePath); directWatchers.set(filePath, w); return w; }; /** * @param {string} rootPath a root path * @returns {RecursiveWatcher} a recursive watcher */ const createRecursiveWatcher = (rootPath) => { const existing = recursiveWatchers.get(rootPath); if (existing !== undefined) return existing; const w = new RecursiveWatcher(rootPath); recursiveWatchers.set(rootPath, w); return w; }; const execute = () => { /** @type {Map} */ const map = new Map(); /** * @param {Watcher} watcher a watcher * @param {string} filePath a file path */ const addWatcher = (watcher, filePath) => { const entry = map.get(filePath); if (entry === undefined) { map.set(filePath, watcher); } else if (Array.isArray(entry)) { entry.push(watcher); } else { map.set(filePath, [entry, watcher]); } }; for (const [watcher, filePath] of pendingWatchers) { addWatcher(watcher, filePath); } pendingWatchers.clear(); // Fast case when we are not reaching the limit if (!SUPPORTS_RECURSIVE_WATCHING || watcherLimit - watcherCount >= map.size) { // Create watchers for all entries in the map for (const [filePath, entry] of map) { const w = createDirectWatcher(filePath); if (Array.isArray(entry)) { for (const item of entry) w.add(item); } else { w.add(entry); } } return; } // Reconsider existing watchers to improving watch plan for (const watcher of recursiveWatchers.values()) { for (const [w, subpath] of watcher.getWatchers()) { addWatcher(w, path.join(watcher.rootPath, subpath)); } } for (const watcher of directWatchers.values()) { for (const w of watcher.getWatchers()) { addWatcher(w, watcher.filePath); } } // Merge map entries to keep watcher limit // Create a 10% buffer to be able to enter fast case more often const plan = reducePlan(map, watcherLimit * 0.9); // Update watchers for all entries in the map for (const [filePath, entry] of plan) { if (entry.size === 1) { for (const [watcher, filePath] of entry) { const w = createDirectWatcher(filePath); const old = underlyingWatcher.get(watcher); if (old === w) continue; w.add(watcher); if (old !== undefined) old.remove(watcher); } } else { const filePaths = new Set(entry.values()); if (filePaths.size > 1) { const w = createRecursiveWatcher(filePath); for (const [watcher, watcherPath] of entry) { const old = underlyingWatcher.get(watcher); if (old === w) continue; w.add(watcherPath, watcher); if (old !== undefined) old.remove(watcher); } } else { for (const filePath of filePaths) { const w = createDirectWatcher(filePath); for (const watcher of entry.keys()) { const old = underlyingWatcher.get(watcher); if (old === w) continue; w.add(watcher); if (old !== undefined) old.remove(watcher); } } } } } }; module.exports.Watcher = Watcher; /** * @param {() => void} fn a function */ module.exports.batch = (fn) => { isBatch = true; try { fn(); } finally { isBatch = false; execute(); } }; module.exports.createHandleChangeEvent = createHandleChangeEvent; module.exports.getNumberOfWatchers = () => watcherCount; /** * @param {string} filePath a file path * @returns {Watcher} watcher */ module.exports.watch = (filePath) => { const watcher = new Watcher(); // Find an existing watcher const directWatcher = directWatchers.get(filePath); if (directWatcher !== undefined) { directWatcher.add(watcher); return watcher; } // Only platforms with recursive fs.watch ever populate recursiveWatchers, // so skip the entire parent walk when the map is empty (always the case // on Linux and the common case before the watcher limit is reached). if (recursiveWatchers.size !== 0) { let current = filePath; for (;;) { const recursiveWatcher = recursiveWatchers.get(current); if (recursiveWatcher !== undefined) { recursiveWatcher.add(filePath, watcher); return watcher; } const parent = path.dirname(current); if (parent === current) break; current = parent; } } // Queue up watcher for creation pendingWatchers.set(watcher, filePath); if (!isBatch) execute(); return watcher; }; module.exports.watcherLimit = watcherLimit; watchpack-2.5.2/lib/watchpack.js000066400000000000000000000003261521250557700165500ustar00rootroot00000000000000/* MIT License http://www.opensource.org/licenses/mit-license.php Author Alexander Akait @akexander-akait */ "use strict"; // TODO remove this file in the next major release module.exports = require("./index"); watchpack-2.5.2/package-lock.json000066400000000000000000014263251521250557700167270ustar00rootroot00000000000000{ "name": "watchpack", "version": "2.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "watchpack", "version": "2.5.1", "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2" }, "devDependencies": { "@changesets/cli": "^2.30.0", "@changesets/get-github-info": "^0.8.0", "@codspeed/core": "^5.2.0", "@types/glob-to-regexp": "^0.4.4", "@types/graceful-fs": "^4.1.9", "@types/jest": "^30.0.0", "@types/node": "^24.10.4", "eslint": "^9.39.2", "eslint-config-webpack": "^4.9.3", "jest": "^30.3.0", "prettier": "^3.7.4", "tinybench": "^6.0.0", "typescript": "^6.0.2", "write-file-atomic": "^8.0.0" }, "engines": { "node": ">=10.13.0" } }, "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==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "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==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@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/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/core/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/@babel/generator": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets/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/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "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==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" }, "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==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "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-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@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", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "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/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", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "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==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "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==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "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", "engines": { "node": ">=8" } }, "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": ">=10.13.0" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "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": ">=8" } }, "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": { "@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/@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" }, "bin": { "changeset": "bin.js" } }, "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": ">=8" } }, "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": "MIT", "dependencies": { "@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/@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": "MIT", "dependencies": { "extendable-error": "^0.1.5" } }, "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": "MIT", "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "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": { "dataloader": "^1.4.0", "node-fetch": "^2.5.0" } }, "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", "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/@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", "dependencies": { "@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/@changesets/logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", "dev": true, "license": "MIT", "dependencies": { "picocolors": "^1.1.0" } }, "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": "MIT", "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^4.1.1" } }, "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": "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/@changesets/read": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.7.tgz", "integrity": "sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==", "dev": true, "license": "MIT", "dependencies": { "@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/@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": "MIT", "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "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": "MIT" }, "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.5.0", "resolved": "https://registry.npmjs.org/@codspeed/core/-/core-5.5.0.tgz", "integrity": "sha512-5FbjNlxSVOfemB85orEecikZiTz0C8aZYUfCkt5HY6QLLd1mqkrHAfekEJw0gkHcgCjNgD6DVp2TXm0V/xtt4w==", "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", "stack-trace": "1.0.0-pre2" } }, "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.1", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "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" } }, "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.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "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" } }, "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==", "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==", "dev": true, "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/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": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@istanbuljs/load-nyc-config/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/@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": { "@types/node": "*", "jest-regex-util": "30.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": { "@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": "*", "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", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" }, "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/reporters/node_modules/brace-expansion": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { "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" }, "bin": { "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "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": "ISC", "dependencies": { "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "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": "MIT", "dependencies": { "@sinclair/typebox": "^0.34.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": { "@jest/types": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", "graceful-fs": "^4.2.11" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/test-result": { "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": "30.3.0", "@jest/types": "30.3.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/test-sequencer": { "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": "30.3.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.3.0", "slash": "^3.0.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/transform": { "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.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", "write-file-atomic": "^5.0.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/transform/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/@jest/transform/node_modules/write-file-atomic": { "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", "signal-exit": "^4.0.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@jest/types": { "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": { "@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": "^17.0.33", "chalk": "^4.1.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "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/@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/@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": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "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", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@pkgr/core": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/pkgr" } }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, "node_modules/@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", "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sinonjs/commons": { "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": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "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": "^3.0.1" } }, "node_modules/@stylistic/eslint-plugin": { "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.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0" } }, "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", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.2" } }, "node_modules/@types/debug": { "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": { "@types/ms": "*" } }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/glob-to-regexp": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.4.tgz", "integrity": "sha512-nDKoaKJYbnn1MZxUY0cA1bPmmgZbg0cTq7Rh13d0KWYNOiKbqoR+2d89SnRPszGh7ROzSwZ/GOjZ4jPbmmZ6Eg==", "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==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "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/unist": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { "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": { "expect": "^30.0.0", "pretty-format": "^30.0.0" } }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@types/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/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "24.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { "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": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.4.tgz", "integrity": "sha512-PegsU+XfyJJNjd4+u/k6f9yTyp0lEXXiPopUNobZcIAUJFGICFLN+sP0Rb3JehVmiij1Ph0dFGYqODoRo/2+6A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.59.4", "@typescript-eslint/type-utils": "8.59.4", "@typescript-eslint/utils": "8.59.4", "@typescript-eslint/visitor-keys": "8.59.4", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^8.59.4", "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": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.59.4", "@typescript-eslint/types": "8.59.4", "@typescript-eslint/typescript-estree": "8.59.4", "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.59.4", "@typescript-eslint/types": "^8.59.4", "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.59.4", "@typescript-eslint/visitor-keys": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.4.tgz", "integrity": "sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.59.4", "@typescript-eslint/typescript-estree": "8.59.4", "@typescript-eslint/utils": "8.59.4", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/project-service": "8.59.4", "@typescript-eslint/tsconfig-utils": "8.59.4", "@typescript-eslint/types": "8.59.4", "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "typescript": ">=4.8.4 <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": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.4.tgz", "integrity": "sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.59.4", "@typescript-eslint/types": "8.59.4", "@typescript-eslint/typescript-estree": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.59.4", "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "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/acorn": { "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": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { "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": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "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", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/anymatch/node_modules/picomatch": { "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": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/are-docs-informative": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "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", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/axios": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "node_modules/babel-jest": { "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": "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "node_modules/babel-plugin-istanbul": { "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.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" }, "engines": { "node": ">=12" } }, "node_modules/babel-plugin-jest-hoist": { "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": { "@types/babel__core": "^7.20.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { "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": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "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==", "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "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": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/builtin-modules": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", "dev": true, "license": "MIT", "engines": { "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/call-bound": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "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==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/change-case": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "dev": true, "license": "MIT" }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, "license": "MIT", "funding": { "type": "github", "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/ci-info": { "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": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "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" }, "node_modules/clean-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, "engines": { "node": ">=4" } }, "node_modules/clean-regexp/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/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/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "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": ">= 12" } }, "node_modules/comment-parser": { "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": { "node": ">= 12.0.0" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/core-js-compat": { "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": { "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/data-view-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "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", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "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", "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "dev": true, "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/dedent": { "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", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "peerDependenciesMeta": { "babel-plugin-macros": { "optional": true } } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/detect-indent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "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": ">=8" } }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, "engines": { "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.278", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", "dev": true, "license": "ISC" }, "node_modules/emittery": { "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": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/enhanced-resolve": { "version": "5.21.6", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" }, "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", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.24.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "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==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-to-primitive": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { "version": "9.39.2", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@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", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://eslint.org/donate" }, "peerDependencies": { "jiti": "*" }, "peerDependenciesMeta": { "jiti": { "optional": true } } }, "node_modules/eslint-compat-utils": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.4" }, "engines": { "node": ">=12" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "node_modules/eslint-config-prettier": { "version": "10.1.8", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, "funding": { "url": "https://opencollective.com/eslint-config-prettier" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-config-webpack": { "version": "4.9.6", "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.9.6.tgz", "integrity": "sha512-4g1VqqOVgPrO/2bh17qNRKsQK26Aw1WF9mVTnvF+rNTDIUUTx+IaukXqXlumzwApQ1GfJlOsdLvT6WER1SPePg==", "dev": true, "license": "MIT", "dependencies": { "@eslint/js": "^9.39.2", "@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.15.2", "eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-n": "^18.0.1", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-unicorn": "^64.0.0", "globals": "^17.6.0", "jsonc-eslint-parser": "^3.1.0", "semver": "^7.8.0", "sort-package-json": "^3.6.0", "typescript-eslint": "^8.59.3" }, "engines": { "node": ">= 20.9.0" }, "peerDependencies": { "eslint": ">= 9.28.0", "typescript": ">=4.8.4 <7.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/eslint-config-webpack/node_modules/globals": { "version": "17.6.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-es-x": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, "funding": [ "https://github.com/sponsors/ota-meshi", "https://opencollective.com/eslint" ], "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-jest": { "version": "29.15.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^8.0.0" }, "engines": { "node": "^20.12.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "jest": "*", "typescript": ">=4.8.4 <7.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true }, "jest": { "optional": true }, "typescript": { "optional": true } } }, "node_modules/eslint-plugin-jsdoc": { "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.86.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.6", "debug": "^4.4.3", "escape-string-regexp": "^4.0.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.4", "spdx-expression-parse": "^4.0.0", "to-valid-identifier": "^1.0.0" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { "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.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/eslint-plugin-jsdoc/node_modules/espree": { "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.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-plugin-n": { "version": "18.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.0.1.tgz", "integrity": "sha512-q3ARhk+eZRc7myR0KHx+R3/GJeOHF+Ir6PK95Pu2tEX8Sl/4BIpmmVLva2kPrjC2gCmn6WHlHm+3yeo6Rxhycw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.5.0", "enhanced-resolve": "^5.17.1", "eslint-plugin-es-x": "^7.8.0", "get-tsconfig": "^4.8.1", "globals": "^15.11.0", "globrex": "^0.1.2", "ignore": "^5.3.2", "semver": "^7.6.3" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": ">=8.57.1", "ts-declaration-location": "^1.0.6", "typescript": ">=5.0.0" }, "peerDependenciesMeta": { "ts-declaration-location": { "optional": true }, "typescript": { "optional": true } } }, "node_modules/eslint-plugin-n/node_modules/globals": { "version": "15.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-plugin-prettier": { "version": "5.5.5", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.12" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { "@types/eslint": { "optional": true }, "eslint-config-prettier": { "optional": true } } }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "engines": { "node": ">=18" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "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==", "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-unicorn": { "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.1", "change-case": "^5.4.4", "ci-info": "^4.4.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.49.0", "find-up-simple": "^1.0.1", "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.4", "strip-indent": "^4.1.1" }, "engines": { "node": "^20.10.0 || >=21.0.0" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "node_modules/eslint-plugin-unicorn/node_modules/globals": { "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": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "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": "30.3.0", "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", "dev": true, "license": "MIT", "dependencies": { "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "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", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "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", "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "dev": true, "license": "MIT", "dependencies": { "format": "^0.2.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" }, "peerDependencies": { "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { "picomatch": { "optional": true } } }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-up-simple": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" }, "engines": { "node": ">=16" } }, "node_modules/flatted": { "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", "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": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "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": "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": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "dev": true, "engines": { "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", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-tsconfig": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, "node_modules/git-hooks-list": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.2.1.tgz", "integrity": "sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/fisker/git-hooks-list?sponsor=1" } }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true, "license": "ISC" }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "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", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true, "license": "MIT" }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", "dependencies": { "hermes-estree": "0.25.1" } }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/mdevils" }, { "type": "patreon", "url": "https://patreon.com/mdevils" } ], "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "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", "bin": { "human-id": "dist/cli.js" } }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-bigint": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-builtin-module": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", "dependencies": { "builtin-modules": "^5.0.0" }, "engines": { "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-view": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "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", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" }, "funding": { "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", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "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.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { "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" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "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": "30.3.0", "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", "dev": true, "license": "MIT", "dependencies": { "@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": "^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-changed-files": { "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": { "execa": "^5.1.1", "jest-util": "30.3.0", "p-limit": "^3.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-circus": { "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": "30.3.0", "@jest/expect": "30.3.0", "@jest/test-result": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "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.6" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-cli": { "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": "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": "^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-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": "30.3.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { "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/brace-expansion": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "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": "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-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": "ISC", "dependencies": { "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "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/diff-sequences": "30.3.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": { "detect-newline": "^3.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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/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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { "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": "30.3.0", "@types/node": "*", "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "node_modules/jest-leak-detector": { "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": "30.1.0", "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { "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": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.3.0", "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { "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.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.6" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-mock": { "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": "30.3.0", "@types/node": "*", "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { "node": ">=6" }, "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { "jest-resolve": { "optional": true } } }, "node_modules/jest-regex-util": { "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve": { "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": { "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve-dependencies": { "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-regex-util": "30.0.1", "jest-snapshot": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { "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": "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.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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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/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.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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runtime/node_modules/brace-expansion": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "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": "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": ">=16 || 14 >=14.17" }, "funding": { "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": "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/get-type": "30.1.0", "@jest/types": "30.3.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-watcher": { "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": "30.3.0", "@jest/types": "30.3.0", "@types/node": "*", "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "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": { "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsdoc-type-pratt-parser": { "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/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonc-eslint-parser": { "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": "^5.0.0", "semver": "^7.3.5" }, "engines": { "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": "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/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, "node_modules/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": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "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": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "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/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.3" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mdast-util-from-markdown": { "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": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-frontmatter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mdast-util-gfm": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", "dev": true, "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-footnote": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-strikethrough": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-task-list-item": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "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", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-markdown": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "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", "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-frontmatter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", "dev": true, "license": "MIT", "dependencies": { "fault": "^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-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "dev": true, "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "dev": true, "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^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-extension-gfm-footnote": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "dev": true, "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^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-extension-gfm-strikethrough": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "dev": true, "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^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-extension-gfm-table": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "dev": true, "license": "MIT", "dependencies": { "devlop": "^1.0.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-extension-gfm-tagfilter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "dev": true, "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "dev": true, "license": "MIT", "dependencies": { "devlop": "^1.0.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-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", "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-label": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-space": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-chunked": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-string": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-encode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/micromatch/node_modules/picomatch": { "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": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/minimatch": { "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": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/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", "engines": { "node": ">=4" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "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", "bin": { "napi-postinstall": "lib/cli.js" }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/napi-postinstall" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "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", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "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==", "dev": true, "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-deep-merge": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", "dev": true, "license": "MIT" }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.entries": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.groupby": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.values": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" }, "engines": { "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", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "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", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "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", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { "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", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-imports-exports": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "dev": true, "license": "MIT", "dependencies": { "parse-statements": "1.0.11" } }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-statements": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", "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", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "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", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "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": { "node": ">=12" }, "funding": { "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", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "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", "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/pretty-format": { "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": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, "license": "MIT" }, "node_modules/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", "engines": { "node": ">=10" } }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "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/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": { "sprintf-js": "~1.0.2" } }, "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", "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", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, "license": "MIT", "bin": { "regexp-tree": "bin/regexp-tree" } }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regjsparser": { "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": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/reserved-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.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" } }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-cwd/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/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "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": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "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, "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": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, "node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-proto": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel-map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel-weakmap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/sort-object-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.1.0.tgz", "integrity": "sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==", "dev": true, "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==", "dev": true, "license": "MIT", "dependencies": { "detect-indent": "^7.0.2", "detect-newline": "^4.0.1", "git-hooks-list": "^4.1.1", "is-plain-obj": "^4.1.0", "semver": "^7.7.3", "sort-object-keys": "^2.0.1", "tinyglobby": "^0.2.15" }, "bin": { "sort-package-json": "cli.js" }, "engines": { "node": ">=20" } }, "node_modules/sort-package-json/node_modules/detect-newline": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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/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": { "buffer-from": "^1.0.0", "source-map": "^0.6.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", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "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" }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-trace": { "version": "1.0.0-pre2", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", "dev": true, "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/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-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", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.repeat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "node_modules/string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/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", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.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", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/synckit": { "version": "0.11.12", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/synckit" } }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "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", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, "node_modules/tinybench": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.0.2.tgz", "integrity": "sha512-FlHoQpcFvCzeXK5kVPvV7IVgW/hs/B36QWTz876iSdeJguBDfdTSRQmYmaHX+fQNt4hp+gEFB2XXw+8hT4/y8A==", "dev": true, "license": "MIT", "engines": { "node": ">=20.0.0" } }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/to-valid-identifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", "dev": true, "license": "MIT", "dependencies": { "@sindresorhus/base62": "^1.0.0", "reserved-identifiers": "^1.0.0" }, "engines": { "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ts-api-utils": { "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": { "node": ">=18.12" }, "peerDependencies": { "typescript": ">=4.8.4" } }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/tsconfig-paths/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/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": "0BSD", "optional": true }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { "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", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/typescript-eslint": { "version": "8.59.4", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.4.tgz", "integrity": "sha512-Rw6+44QNFaXtgHSjPy+Kw8hrJniMYzR85E9yLmOLcfZ91/rz+JXQbDTCmc6ccxMPY6K6PgAq26f0JCBfR7LIPQ==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/eslint-plugin": "8.59.4", "@typescript-eslint/parser": "8.59.4", "@typescript-eslint/typescript-estree": "8.59.4", "@typescript-eslint/utils": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", "dev": true, "license": "MIT" }, "node_modules/unist-util-is": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "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", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit-parents": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/universalify": { "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", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/v8-to-istanbul": { "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": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { "version": "1.1.20", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/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/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", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-8.0.0.tgz", "integrity": "sha512-dYwyZredl67GyLLIHJnRM3h2PcOmN5SkcgC7eM5DPDEOEl6dLFqVrMg3F1Ea32usj4VSVZtd2H4MtKTNOf6nPg==", "dev": true, "license": "ISC", "dependencies": { "signal-exit": "^4.0.1" }, "engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, "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": "ISC", "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "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": { "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/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/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-validation-error": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } } } } watchpack-2.5.2/package.json000066400000000000000000000044761521250557700157770ustar00rootroot00000000000000{ "name": "watchpack", "version": "2.5.2", "description": "", "homepage": "https://github.com/webpack/watchpack", "bugs": { "url": "https://github.com/webpack/watchpack/issues" }, "repository": { "type": "git", "url": "https://github.com/webpack/watchpack.git" }, "license": "MIT", "author": "Tobias Koppers @sokra", "main": "lib/index.js", "types": "types/index.js", "directories": { "test": "test" }, "files": [ "lib/", "types/" ], "scripts": { "lint": "npm run lint:code && npm run lint:types && npm run lint:types-test && npm run lint:declarations && npm run fmt:check", "lint:code": "eslint --cache .", "lint:types": "tsc --noEmit", "lint:types-test": "tsc -p tsconfig.types.test.json --noEmit", "lint:declarations": "npm run fix:declarations && git diff --exit-code ./types", "fix": "npm run fix:code && npm run fix:declarations", "fix:code": "npm run lint:code -- --fix", "fix:declarations": "tsc && npm run fmt -- ./types", "fmt": "npm run fmt:base -- --log-level warn --write", "fmt:check": "npm run fmt:base -- --check", "fmt:base": "prettier --cache --ignore-unknown .", "pretest": "npm run lint", "test": "npm run test:coverage", "test:base": "jest --runInBand", "test:only": "npm run test:base", "test:watch": "npm run test:base -- --watch", "test:coverage": "npm run test:base -- --collectCoverageFrom=\"lib/**/*.js\" --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" }, "dependencies": { "graceful-fs": "^4.1.2" }, "devDependencies": { "@changesets/cli": "^2.30.0", "@changesets/get-github-info": "^0.8.0", "@codspeed/core": "^5.2.0", "@types/glob-to-regexp": "^0.4.4", "@types/graceful-fs": "^4.1.9", "@types/jest": "^30.0.0", "@types/node": "^24.10.4", "eslint": "^9.39.2", "eslint-config-webpack": "^4.9.3", "jest": "^30.3.0", "prettier": "^3.7.4", "tinybench": "^6.0.0", "typescript": "^6.0.2", "write-file-atomic": "^8.0.0" }, "engines": { "node": ">=10.13.0" } } watchpack-2.5.2/playground/000077500000000000000000000000001521250557700156625ustar00rootroot00000000000000watchpack-2.5.2/playground/watch-folder.js000066400000000000000000000022761521250557700206060ustar00rootroot00000000000000"use strict"; const path = require("path"); const Watchpack = require("../"); const folder = path.join(__dirname, "folder"); /** * @param {string} name name * @param {string[]} files files * @param {string} folders folders */ function startWatcher(name, files, folders) { const w = new Watchpack({ aggregateTimeout: 3000, }); w.on("change", (file, mtime) => { // eslint-disable-next-line no-console console.log(name, "change", path.relative(folder, file), mtime); }); w.on("aggregated", (changes) => { const times = w.getTimes(); // eslint-disable-next-line no-console console.log( name, "aggregated", Array.from(changes, (file) => path.relative(folder, file)), Object.keys(times).reduce((obj, file) => { obj[path.relative(folder, file)] = times[file]; return obj; }, {}), ); }); const startTime = Date.now() - 10000; // eslint-disable-next-line no-console console.log(name, startTime); w.watch(files, folders, startTime); } startWatcher("folder", [], [folder]); startWatcher( "sub+files", [ path.join(folder, "a.txt"), path.join(folder, "b.txt"), path.join(folder, "c.txt"), path.join(folder, "d.txt"), ], [path.join(folder, "subfolder")], ); watchpack-2.5.2/test/000077500000000000000000000000001521250557700144555ustar00rootroot00000000000000watchpack-2.5.2/test/Assumption.test.js000066400000000000000000000316111521250557700201350ustar00rootroot00000000000000"use strict"; const fs = require("fs"); const path = require("path"); const { createHandleChangeEvent } = require("../lib/watchEventSource"); const TestHelper = require("./helpers/TestHelper"); /** @typedef {import("fs").FSWatcher} FSWatcher */ const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); const IS_OSX = require("os").platform() === "darwin"; const IS_WIN = require("os").platform() === "win32"; const SUPPORTS_RECURSIVE_WATCHING = IS_OSX || IS_WIN; // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(20000); describe("Assumption", () => { /** @type {FSWatcher | null} */ let watcherToClose = null; beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { if (watcherToClose) { watcherToClose.close(); watcherToClose = null; } testHelper.after(done); }); it("should have a file system with correct mtime behavior (stats)", (done) => { let i = 60; const count = 60; let minDiffBefore = +Infinity; let maxDiffBefore = -Infinity; let sumDiffBefore = 0; let minDiffAfter = +Infinity; let maxDiffAfter = -Infinity; let sumDiffAfter = 0; /** * @returns {void} */ function afterMeasure() { console.log( `mtime stats accuracy (before): [${minDiffBefore} ; ${ maxDiffBefore }] avg ${Math.round(sumDiffBefore / count)}`, ); console.log( `mtime stats accuracy (after): [${minDiffAfter} ; ${ maxDiffAfter }] avg ${Math.round(sumDiffAfter / count)}`, ); expect(minDiffBefore).toBeGreaterThanOrEqual(-2000); expect(maxDiffBefore).toBeLessThan(2000); expect(minDiffAfter).toBeGreaterThanOrEqual(-2000); expect(maxDiffAfter).toBeLessThan(2000); done(); } testHelper.tick(100, function checkMtime() { const before = Date.now(); testHelper.file("a"); const after = Date.now(); const stats = fs.statSync(path.join(fixtures, "a")); const diffBefore = +stats.mtime - before; if (diffBefore < minDiffBefore) minDiffBefore = diffBefore; if (diffBefore > maxDiffBefore) maxDiffBefore = diffBefore; sumDiffBefore += diffBefore; const diffAfter = +stats.mtime - after; if (diffAfter < minDiffAfter) minDiffAfter = diffAfter; if (diffAfter > maxDiffAfter) maxDiffAfter = diffAfter; sumDiffAfter += diffAfter; if (i-- === 0) { afterMeasure(); } else { testHelper.tick(100, checkMtime); } }); }); it("should have a file system with correct mtime behavior (fs.watch)", (done) => { testHelper.file("a"); let i = 60; const count = 60; /** @type {number | undefined} */ let before; /** @type {number | undefined} */ let after; let minDiffBefore = +Infinity; let maxDiffBefore = -Infinity; let sumDiffBefore = 0; let minDiffAfter = +Infinity; let maxDiffAfter = -Infinity; let sumDiffAfter = 0; /** * @returns {void} */ function afterMeasure() { console.log( `mtime fs.watch accuracy (before): [${minDiffBefore} ; ${ maxDiffBefore }] avg ${Math.round(sumDiffBefore / count)}`, ); console.log( `mtime fs.watch accuracy (after): [${minDiffAfter} ; ${ maxDiffAfter }] avg ${Math.round(sumDiffAfter / count)}`, ); expect(minDiffBefore).toBeGreaterThanOrEqual(-2000); expect(maxDiffBefore).toBeLessThan(2000); expect(minDiffAfter).toBeGreaterThanOrEqual(-2000); expect(maxDiffAfter).toBeLessThan(2000); done(); } /** * @returns {void} */ function checkMtime() { before = Date.now(); testHelper.file("a"); after = Date.now(); } const watcher = (watcherToClose = fs.watch(fixtures)); testHelper.tick(100, () => { watcher.on("change", (type, filename) => { // fs.watch can fire spurious events with no filename, or with // the watched directory's own basename (on macOS / Node >= 22 // when the directory itself is touched). We only care about // the file this test writes to. if (filename !== "a") return; const stats = fs.statSync( path.join(fixtures, /** @type {string} */ (filename)), ); if (before && after) { const diffBefore = +stats.mtime - before; if (diffBefore < minDiffBefore) minDiffBefore = diffBefore; if (diffBefore > maxDiffBefore) maxDiffBefore = diffBefore; sumDiffBefore += diffBefore; const diffAfter = +stats.mtime - after; if (diffAfter < minDiffAfter) minDiffAfter = diffAfter; if (diffAfter > maxDiffAfter) maxDiffAfter = diffAfter; sumDiffAfter += diffAfter; before = after = undefined; if (i-- === 0) { afterMeasure(); } else { testHelper.tick(100, checkMtime); } } }); testHelper.tick(100, checkMtime); }); }); if (SUPPORTS_RECURSIVE_WATCHING) { it("should have a file system with correct mtime behavior (fs.watch recursive)", (done) => { testHelper.file("a"); let i = 60; const count = 60; /** @type {number | undefined} */ let before; /** @type {number | undefined} */ let after; let minDiffBefore = +Infinity; let maxDiffBefore = -Infinity; let sumDiffBefore = 0; let minDiffAfter = +Infinity; let maxDiffAfter = -Infinity; let sumDiffAfter = 0; /** * @returns {void} */ function afterMeasure() { console.log( `mtime fs.watch({ recursive: true }) accuracy (before): [${ minDiffBefore } ; ${maxDiffBefore}] avg ${Math.round(sumDiffBefore / count)}`, ); console.log( `mtime fs.watch({ recursive: true }) accuracy (after): [${ minDiffAfter } ; ${maxDiffAfter}] avg ${Math.round(sumDiffAfter / count)}`, ); expect(minDiffBefore).toBeGreaterThanOrEqual(-2000); expect(maxDiffBefore).toBeLessThan(2000); expect(minDiffAfter).toBeGreaterThanOrEqual(-2000); expect(maxDiffAfter).toBeLessThan(2000); done(); } /** * @returns {void} */ function checkMtime() { before = Date.now(); testHelper.file("a"); after = Date.now(); } const watcher = (watcherToClose = fs.watch(fixtures, { recursive: true, })); testHelper.tick(100, () => { watcher.on("change", (type, filename) => { // fs.watch can fire spurious events with no filename, or // with the watched directory's own basename (on macOS / // Node >= 22 when the directory itself is touched). We // only care about the file this test writes to. if (filename !== "a") return; const stats = fs.statSync( path.join(fixtures, /** @type {string} */ (filename)), ); if (before && after) { const diffBefore = +stats.mtime - before; if (diffBefore < minDiffBefore) minDiffBefore = diffBefore; if (diffBefore > maxDiffBefore) maxDiffBefore = diffBefore; sumDiffBefore += diffBefore; const diffAfter = +stats.mtime - after; if (diffAfter < minDiffAfter) minDiffAfter = diffAfter; if (diffAfter > maxDiffAfter) maxDiffAfter = diffAfter; sumDiffAfter += diffAfter; before = after = undefined; if (i-- === 0) { afterMeasure(); } else { testHelper.tick(100, checkMtime); } } }); testHelper.tick(100, checkMtime); }); }); } // On Windows, non-recursive `fs.watch` fires a change event when a // subdirectory's mtime changes (for example, when a file is created // inside). Skip this assumption check there. if (!IS_WIN) { it("should not fire events in subdirectories", (done) => { testHelper.dir("watch-test-directory"); testHelper.tick(500, () => { const watcher = (watcherToClose = fs.watch(fixtures)); watcher.on("change", (arg, arg2) => { expect(true).toBe(false); done(new Error(`should not be emitted ${arg} ${arg2}`)); // @ts-expect-error for tests done = function () {}; }); watcher.on("error", (err) => { done(err); // @ts-expect-error for tests done = function () {}; }); testHelper.tick(500, () => { testHelper.file("watch-test-directory/watch-test-file"); testHelper.tick(500, () => { done(); }); }); }); }); } if (SUPPORTS_RECURSIVE_WATCHING) { it("should fire events in subdirectories (recursive)", (done) => { testHelper.dir("watch-test-directory"); testHelper.file("watch-test-directory/watch-test-file"); testHelper.file("watch-test-directory/existing-file"); testHelper.tick(500, () => { const watcher = (watcherToClose = fs.watch(fixtures, { recursive: true, })); /** @type {string[]} */ const events = []; const matches = () => events.some((item) => /watch-test-directory[/\\]watch-test-file/.test(item), ); let timedOut = false; // Poll for the expected event instead of relying on a fixed wait // window. Windows recursive fs.watch can deliver events for the // overwritten file with noticeable delay under CI load. const pollTimeout = setTimeout(() => { timedOut = true; }, 5000); /** * @returns {void} */ const check = () => { if (matches()) { clearTimeout(pollTimeout); done(); return; } if (timedOut) { expect(matches()).toBe(true); done(); return; } testHelper.tick(100, check); }; watcher.once("change", () => { testHelper.tick(200, check); }); watcher.on("change", (type, filename) => { events.push(/** @type {string} */ (filename)); }); watcher.on("error", (err) => { clearTimeout(pollTimeout); done(err); // @ts-expect-error for tests done = function () {}; }); testHelper.tick(500, () => { testHelper.file("watch-test-directory/watch-test-file"); }); }); }); it("should allow to create/close/create recursive watchers", (done) => { testHelper.dir("watch-test-directory"); testHelper.file("watch-test-directory/watch-test-file"); testHelper.file("watch-test-directory/existing-file"); testHelper.tick(500, () => { watcherToClose = fs.watch(fixtures, { recursive: true, }); watcherToClose.close(); watcherToClose = fs.watch(fixtures, { recursive: true, }); watcherToClose.close(); watcherToClose = fs.watch(fixtures, { recursive: true, }); watcherToClose.close(); const watcher = (watcherToClose = fs.watch(fixtures, { recursive: true, })); /** @type {string[]} */ const events = []; const matches = () => events.some((item) => /watch-test-directory[/\\]watch-test-file/.test(item), ); let timedOut = false; const pollTimeout = setTimeout(() => { timedOut = true; }, 5000); /** * @returns {void} */ const check = () => { if (matches()) { clearTimeout(pollTimeout); done(); return; } if (timedOut) { expect(matches()).toBe(true); done(); return; } testHelper.tick(100, check); }; watcher.once("change", () => { testHelper.tick(200, check); }); watcher.on("change", (type, filename) => { events.push(/** @type {string} */ (filename)); }); watcher.on("error", (err) => { clearTimeout(pollTimeout); done(err); // @ts-expect-error for tests done = function () {}; }); testHelper.tick(500, () => { testHelper.file("watch-test-directory/watch-test-file"); }); }); }); } if (!IS_OSX) { it("should detect removed directory", (done) => { testHelper.dir("watch-test-dir"); testHelper.tick(() => { const watcher = (watcherToClose = fs.watch( path.join(fixtures, "watch-test-dir"), )); let gotSelfRename = false; let gotPermError = false; const handleChangeEvent = createHandleChangeEvent( watcher, path.join(fixtures, "watch-test-dir"), (type, filename) => { if (type === "rename" && filename === "watch-test-dir") { gotSelfRename = true; } }, ); watcher.on("change", handleChangeEvent); watcher.on("error", (err) => { if ( err && /** @type {NodeJS.ErrnoException} */ (err).code === "EPERM" ) { gotPermError = true; } }); testHelper.tick(500, () => { testHelper.remove("watch-test-dir"); testHelper.tick(3000, () => { if (gotPermError || gotSelfRename) { done(); } else { expect(true).toBe(false); done(new Error("Didn't receive a event about removed directory")); } }); }); }); }); } for (const delay of [100, 200, 300, 500, 700, 1000].reverse()) { // eslint-disable-next-line no-loop-func it(`should fire events not after start and ${delay}ms delay`, (done) => { testHelper.file(`watch-test-file-${delay}`); testHelper.tick(delay, () => { const watcher = (watcherToClose = fs.watch(fixtures)); watcher.on("change", (arg) => { expect(true).toBe(false); done(new Error(`should not be emitted ${arg}`)); // @ts-expect-error for tests done = function () {}; }); watcher.on("error", (err) => { done(err); // @ts-expect-error for tests done = function () {}; }); testHelper.tick(500, () => { done(); }); }); }); } }); watchpack-2.5.2/test/Casing.test.js000066400000000000000000000063201521250557700171760ustar00rootroot00000000000000"use strict"; const path = require("path"); const Watchpack = require("../lib"); const TestHelper = require("./helpers/TestHelper"); const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); let fsIsCaseInsensitive; try { fsIsCaseInsensitive = require("fs").existsSync( path.join(__dirname, "..", "PACKAGE.JSON"), ); } catch (_err) { fsIsCaseInsensitive = false; } // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(10000); if (fsIsCaseInsensitive) { describe("casing", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("should watch a file with the wrong casing", (done) => { const w = new Watchpack({ aggregateTimeout: 1000, }); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBeGreaterThan(0); w.close(); done(); }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("A"); }); }); it("should mark as missing on changing filename casing (dir watch)", (done) => { const w = new Watchpack({ aggregateTimeout: 1000, }); const dir = "case-rename"; const testFile = path.join(dir, "hello.txt"); const testFileRename = path.join(dir, "hEllO.txt"); testHelper.dir(dir); testHelper.file(testFile); w.on("aggregated", (changes, _removals) => { const files = w.getTimeInfoEntries(); w.close(); expect(changes).toContain(path.join(fixtures, dir)); for (const file of files.keys()) { if (file.endsWith("hello.txt")) { expect(true).toBe(false); return done(new Error("Renamed file was still in timeInfoEntries")); } } return done(); }); testHelper.tick(() => { w.watch([], [path.join(fixtures, "case-rename")]); testHelper.tick(() => { testHelper.rename(testFile, testFileRename); }); }); }); it("should mark as missing on changing filename casing (file watch)", (done) => { const w = new Watchpack({ aggregateTimeout: 1000, }); const dir = "case-rename"; const testFile = path.join(dir, "hello.txt"); const testFileRename = path.join(dir, "hEllO.txt"); testHelper.dir(dir); testHelper.file(testFile); w.on("aggregated", (changes, removals) => { const files = w.getTimeInfoEntries(); w.close(); expect(changes).toContain(path.join(fixtures, testFileRename)); expect(removals).not.toContain(path.join(fixtures, testFileRename)); for (const file of files.keys()) { if (file.endsWith("hello.txt") && files.get(file)) { return done(new Error("Renamed file was still in timeInfoEntries")); } } return done(); }); testHelper.tick(() => { w.watch({ files: [path.join(fixtures, testFile)], missing: [path.join(fixtures, testFileRename)], }); testHelper.tick(() => { testHelper.rename(testFile, testFileRename); }); }); }); }); } else { describe("casing (no tests)", () => { it("pass", () => { expect(true).toBe(true); }); }); } watchpack-2.5.2/test/DirectoryWatcher.test.js000066400000000000000000000275601521250557700212650ustar00rootroot00000000000000"use strict"; const path = require("path"); const DirectoryWatcher = require("../lib/DirectoryWatcher"); const getWatcherManager = require("../lib/getWatcherManager"); const TestHelper = require("./helpers/TestHelper"); /** @typedef {import("../lib/DirectoryWatcher").DirectoryWatcherOptions} DirectoryWatcherOptions */ /** @type {DirectoryWatcherOptions} */ const EMPTY_OPTIONS = {}; const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); /** @type {DirectoryWatcher[]} */ const openWatchers = []; /** * @param {string} directoryPath directory path * @param {DirectoryWatcherOptions} options options * @returns {DirectoryWatcher} directory watcher */ function getDirectoryWatcher(directoryPath, options) { const directoryWatcher = new DirectoryWatcher( getWatcherManager(options), directoryPath, options, ); openWatchers.push(directoryWatcher); const orgClose = directoryWatcher.close; directoryWatcher.close = function close() { orgClose.call(this); const idx = openWatchers.indexOf(directoryWatcher); if (idx < 0) throw new Error("DirectoryWatcher was already closed"); openWatchers.splice(idx, 1); }; return directoryWatcher; } // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(10000); describe("DirectoryWatcher", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(() => { for (const watchers of openWatchers) { console.log(`DirectoryWatcher (${watchers.path}) was not closed.`); watchers.close(); } done(); }); }); it("should detect a file creation", (done) => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); a.on("change", (mtime) => { expect(typeof mtime).toBe("number"); expect(Object.keys(directoryWatcher.getTimes()).sort()).toEqual([ path.join(fixtures, "a"), ]); a.close(); done(); }); testHelper.tick(() => { testHelper.file("a"); }); }); it("should detect a file change", (done) => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); testHelper.file("a"); testHelper.tick(1000, () => { const a = directoryWatcher.watch(path.join(fixtures, "a")); a.on("change", (mtime) => { expect(typeof mtime).toBe("number"); a.close(); done(); }); testHelper.tick(() => { testHelper.file("a"); }); }); }); it("should not detect a file change in initial scan", (done) => { testHelper.file("a"); testHelper.tick(() => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); a.on("change", () => { expect(true).toBe(false); throw new Error("should not be detected"); }); testHelper.tick(() => { a.close(); done(); }); }); }); it("should detect a file change in initial scan with start date", (done) => { const start = new Date(); testHelper.tick(1000, () => { testHelper.file("a"); testHelper.tick(1000, () => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a"), +start); a.on("change", () => { expect(true).toBe(true); a.close(); done(); }); }); }); }); it("should not detect a file change in initial scan without start date", (done) => { testHelper.file("a"); testHelper.tick(200, () => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); a.on("change", (mtime, type) => { expect(true).toBe(false); throw new Error( `should not be detected (${type} mtime=${mtime} now=${Date.now()})`, ); }); testHelper.tick(() => { a.close(); done(); }); }); }); const IS_OSX = require("os").platform() === "darwin"; /** @type {Record<"slow" | "fast", number>} */ // FSEvents coalesces rapid changes, so on macOS the "fast" case needs a // larger interval or consecutive writes will be dropped. const timings = { slow: 300, fast: IS_OSX ? 150 : 50, }; for (const name of Object.keys(timings)) { const time = timings[/** @type {keyof typeof timings} */ (name)]; it(`should detect multiple file changes (${name})`, (done) => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); testHelper.file("a"); testHelper.tick(() => { const a = directoryWatcher.watch(path.join(fixtures, "a")); let count = 20; let wasChanged = false; a.on("change", (mtime) => { expect(typeof mtime).toBe("number"); if (!wasChanged) return; wasChanged = false; if (count-- <= 0) { a.close(); done(); } else { testHelper.tick(time, () => { wasChanged = true; testHelper.file("a"); }); } }); testHelper.tick(() => { wasChanged = true; testHelper.file("a"); }); }); }); } it("should detect a file removal", (done) => { testHelper.file("a"); const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); a.on("remove", () => { expect(true).toBe(true); a.close(); done(); }); testHelper.tick(() => { testHelper.remove("a"); }); }); it("should report directory as initial missing on the second watch when directory doesn't exist", (done) => { const wm = getWatcherManager(EMPTY_OPTIONS); testHelper.dir("dir1"); wm.watchDirectory(path.join(fixtures, "dir1")); testHelper.tick(() => { let initialMissing = false; wm.watchDirectory(path.join(fixtures, "dir3")).on( "initial-missing", () => { initialMissing = true; }, ); testHelper.tick(() => { for (const [, w] of wm.directoryWatchers) { w.close(); } expect(initialMissing).toBe(true); done(); }); }); }); it("should not report directory as initial missing on the second watch when directory exists", (done) => { const wm = getWatcherManager(EMPTY_OPTIONS); testHelper.dir("dir1"); wm.watchDirectory(path.join(fixtures, "dir1")); testHelper.tick(() => { let initialMissing = false; wm.watchDirectory(path.join(fixtures, "dir1")).on( "initial-missing", () => { initialMissing = true; }, ); testHelper.tick(() => { for (const [, w] of wm.directoryWatchers) { w.close(); } expect(initialMissing).toBe(false); done(); }); }); }); if (!Number(process.env.WATCHPACK_POLLING)) { it("should log errors emitted from watcher to stderr", (done) => { const errorSpy = jest.spyOn(console, "error"); const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); if (!directoryWatcher.watcher) { done(new Error("No watcher")); return; } directoryWatcher.watcher.emit("error", "error_message"); testHelper.tick(() => { a.close(); expect(errorSpy).toHaveBeenCalled(); done(); }); }); } describe("permission error suppression (#187)", () => { /** * @param {string} code error code to attach * @returns {NodeJS.ErrnoException} fabricated errno error */ const makeErr = (code) => { const err = /** @type {NodeJS.ErrnoException} */ (new Error(code)); err.code = code; return err; }; const IS_WIN = require("os").platform() === "win32"; // On WSL, scanning `/mnt/c` lists files like `pagefile.sys` whose lstat // returns EACCES; on native Windows + Node ≥22.17 the same paths now // return EINVAL via libuv; on Linux a lstat that traverses an // unmounted device entry (e.g. `/efi`) returns ENODEV. All used to // print "Watchpack Error (initial scan): …"; all should be silent. const lstatCodes = IS_WIN ? ["EACCES", "EPERM", "ENODEV", "EINVAL"] : ["EACCES", "EPERM", "ENODEV"]; for (const code of lstatCodes) { it(`does not log when an item lstat returns ${code} during initial scan`, (done) => { testHelper.file("a"); testHelper.tick(() => { const fs = require("graceful-fs"); const originalLstat = fs.lstat; // eslint-disable-next-line jsdoc/reject-any-type /** @type {any} */ (fs).lstat = ( /** @type {string} */ target, /** @type {(err: NodeJS.ErrnoException | null) => void} */ cb, ) => { if (target.endsWith(`${path.sep}a`)) { process.nextTick(() => cb(makeErr(code))); return; } originalLstat(target, cb); }; const errorSpy = jest .spyOn(console, "error") .mockImplementation(() => {}); const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); testHelper.tick(500, () => { // eslint-disable-next-line jsdoc/reject-any-type /** @type {any} */ (fs).lstat = originalLstat; a.close(); const printed = errorSpy.mock.calls .map((call) => String(call[0])) .filter((msg) => msg.includes("initial scan")); errorSpy.mockRestore(); expect(printed).toEqual([]); done(); }); }); }); } const readdirCodes = IS_WIN ? ["EACCES", "ENODEV", "EINVAL"] : ["EACCES", "ENODEV"]; for (const code of readdirCodes) { it(`does not log when readdir on the watched directory returns ${code}`, (done) => { const fs = require("graceful-fs"); const originalReaddir = fs.readdir; // eslint-disable-next-line jsdoc/reject-any-type /** @type {any} */ (fs).readdir = ( /** @type {string} */ target, /** @type {(err: NodeJS.ErrnoException | null) => void} */ cb, ) => { if (target === fixtures) { process.nextTick(() => cb(makeErr(code))); return; } originalReaddir(target, cb); }; const errorSpy = jest .spyOn(console, "error") .mockImplementation(() => {}); const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); testHelper.tick(500, () => { // eslint-disable-next-line jsdoc/reject-any-type /** @type {any} */ (fs).readdir = originalReaddir; a.close(); const printed = errorSpy.mock.calls .map((call) => String(call[0])) .filter((msg) => msg.includes("initial scan")); errorSpy.mockRestore(); expect(printed).toEqual([]); done(); }); }); } }); describe("EBUSY retry handling (#223)", () => { /** * @returns {NodeJS.ErrnoException} EBUSY error */ const makeEbusy = () => { const err = /** @type {NodeJS.ErrnoException} */ (new Error("EBUSY")); err.code = "EBUSY"; return err; }; it("does not emit remove when lstat keeps returning EBUSY", (done) => { testHelper.file("a"); testHelper.tick(1000, () => { const directoryWatcher = getDirectoryWatcher(fixtures, EMPTY_OPTIONS); const a = directoryWatcher.watch(path.join(fixtures, "a")); let removed = false; a.on("remove", () => { removed = true; }); // Wait for the initial scan to finish with the real lstat, then // hijack graceful-fs's lstat so every call for "a" returns EBUSY // and assert that onWatchEvent does not fall through to a remove. testHelper.tick(500, () => { const fs = require("graceful-fs"); const originalLstat = fs.lstat; // eslint-disable-next-line jsdoc/reject-any-type /** @type {any} */ (fs).lstat = ( /** @type {string} */ target, /** @type {(err: NodeJS.ErrnoException | null) => void} */ cb, ) => { if (target.endsWith(`${path.sep}a`)) { process.nextTick(() => cb(makeEbusy())); return; } originalLstat(target, cb); }; directoryWatcher.onWatchEvent("change", "a"); // 3 retries × 100 ms + buffer. testHelper.tick(800, () => { // eslint-disable-next-line jsdoc/reject-any-type /** @type {any} */ (fs).lstat = originalLstat; a.close(); expect(removed).toBe(false); done(); }); }); }); }); }); }); watchpack-2.5.2/test/DirectoryWatcherExtra.test.js000066400000000000000000000441531521250557700222660ustar00rootroot00000000000000"use strict"; const path = require("path"); const DirectoryWatcher = require("../lib/DirectoryWatcher"); const getWatcherManager = require("../lib/getWatcherManager"); const TestHelper = require("./helpers/TestHelper"); /** @typedef {import("../lib/DirectoryWatcher")} DirectoryWatcherType */ /** @typedef {import("../lib/DirectoryWatcher").DirectoryWatcherOptions} DirectoryWatcherOptions */ /** @type {DirectoryWatcherOptions} */ const EMPTY_OPTIONS = {}; const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); // The WATCHPACK_POLLING env var unconditionally overrides options.poll in // DirectoryWatcher's constructor, so tests that assert the effect of the // `poll` option have to be skipped when it is set. const FORCES_POLLING = Boolean( process.env.WATCHPACK_POLLING && process.env.WATCHPACK_POLLING !== "false", ); // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(20000); describe("DirectoryWatcher extra coverage", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("should be a no-op to close() twice", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const w = dw.watch(path.join(fixtures, "no-such")); testHelper.tick(200, () => { expect(() => { w.close(); // second close is OK via emitting closed again w.close(); }).not.toThrow(); done(); }); }); it("should expose exported Watcher class and EXISTANCE_ONLY_TIME_ENTRY", () => { expect(typeof DirectoryWatcher).toBe("function"); expect(typeof DirectoryWatcher.Watcher).toBe("function"); expect(DirectoryWatcher.EXISTANCE_ONLY_TIME_ENTRY).toBeDefined(); expect(Object.isFrozen(DirectoryWatcher.EXISTANCE_ONLY_TIME_ENTRY)).toBe( true, ); }); it("watcher.checkStartTime handles startTime branches", () => { const fakeDir = /** @type {DirectoryWatcherType} */ ( /** @type {unknown} */ ({}) ); const watcher = new DirectoryWatcher.Watcher(fakeDir, "/tmp/x", 100); expect(watcher.startTime).toBe(100); // start time < mtime => true expect(watcher.checkStartTime(200, false)).toBe(true); // start time > mtime => false expect(watcher.checkStartTime(50, false)).toBe(false); // no startTime case const watcher2 = new DirectoryWatcher.Watcher(fakeDir, "/tmp/x"); // no startTime, initial=true -> return !initial = false expect(watcher2.checkStartTime(1000, true)).toBe(false); // no startTime, initial=false -> return !initial = true expect(watcher2.checkStartTime(1000, false)).toBe(true); // close is a safe no-op watcher.close(); watcher2.close(); }); it("setNestedWatching to the same state should be a no-op", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); // Already false by default expect(dw.nestedWatching).toBe(false); dw.setNestedWatching(false); // same state, no-op expect(dw.nestedWatching).toBe(false); // Switch to true dw.setNestedWatching(true); expect(dw.nestedWatching).toBe(true); dw.setNestedWatching(true); // same state, no-op expect(dw.nestedWatching).toBe(true); dw.close(); }); it("onStatsError logs when given an error", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); dw.onStatsError(new Error("stats-fail")); expect(errorSpy).toHaveBeenCalledWith( expect.stringContaining("Watchpack Error (stats)"), ); errorSpy.mockRestore(); dw.close(); }); it("onStatsError without an error is a no-op", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); dw.onStatsError(); expect(errorSpy).not.toHaveBeenCalled(); errorSpy.mockRestore(); dw.close(); }); it("onScanError logs and finalizes the scan", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); dw.onScanError(new Error("scan-fail")); expect(errorSpy).toHaveBeenCalledWith( expect.stringContaining("Watchpack Error (initial scan)"), ); errorSpy.mockRestore(); dw.close(); }); it("onScanError without an error still finalizes the scan", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); dw.onScanError(); expect(errorSpy).not.toHaveBeenCalled(); errorSpy.mockRestore(); dw.close(); }); it("onWatcherError does not log for EPERM or ENOENT", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); const errPerm = Object.assign(new Error("perm"), { code: "EPERM" }); const errEnoent = Object.assign(new Error("ent"), { code: "ENOENT" }); dw.onWatcherError(errPerm); dw.onWatcherError(errEnoent); expect(errorSpy).not.toHaveBeenCalled(); errorSpy.mockRestore(); testHelper.tick(100, () => { dw.close(); done(); }); }); it("onWatcherError logs for other error codes", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); const err = Object.assign(new Error("unexpected"), { code: "EMFILE" }); dw.onWatcherError(err); expect(errorSpy).toHaveBeenCalledWith( expect.stringContaining("Watchpack Error (watcher)"), ); errorSpy.mockRestore(); testHelper.tick(100, () => { dw.close(); done(); }); }); it("onWatcherError with no error is a no-op", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); dw.onWatcherError(); expect(errorSpy).not.toHaveBeenCalled(); errorSpy.mockRestore(); dw.close(); }); it("onWatcherError after close is a no-op", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); dw.close(); const errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); dw.onWatcherError(new Error("after")); expect(errorSpy).not.toHaveBeenCalled(); errorSpy.mockRestore(); }); it("onWatchEvent after close is a no-op", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); dw.close(); expect(() => dw.onWatchEvent("rename", "x.txt")).not.toThrow(); }); it("onWatchEvent ignores paths matched by ignored()", () => { const dw = new DirectoryWatcher(getWatcherManager({}), fixtures, { ignored: (item) => item.endsWith("skip-me"), }); expect(() => dw.onWatchEvent("rename", "skip-me")).not.toThrow(); dw.close(); }); it("onWatchEvent triggers a rescan when filename is missing", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); let calledWithInitial = null; const orig = dw.doScan.bind(dw); dw.doScan = function doScan(initial) { calledWithInitial = initial; return orig(initial); }; dw.onWatchEvent("change"); expect(calledWithInitial).toBe(false); testHelper.tick(300, () => { dw.close(); done(); }); }); it("setDirectory on the directory itself emits a change only when not initial", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const w = dw.watch(fixtures); let changeCount = 0; w.on("change", () => { changeCount++; }); // initial=true branch: no event emitted dw.setDirectory(fixtures, Date.now(), true, "scan (dir)"); // initial=false branch: event emitted dw.setDirectory(fixtures, Date.now(), false, "change"); expect(changeCount).toBe(1); w.close(); }); it("setMissing on a non-existent item is a no-op", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "not-there"); expect(() => dw.setMissing(target, false, "scan (missing)")).not.toThrow(); dw.close(); }); // The WATCHPACK_POLLING env var forces options.poll, so the next three // assertions about the effect of the `poll` option only hold when no // env var override is active. if (!FORCES_POLLING) { it("directoryWatcher constructor accepts no options", () => { const dw = new DirectoryWatcher(getWatcherManager({}), fixtures); expect(dw.polledWatching).toBe(false); expect(dw.ignored("anything")).toBe(false); dw.close(); }); it("directoryWatcher with poll:true defaults to 5007ms", () => { const options = { poll: true }; const dw = new DirectoryWatcher( getWatcherManager(options), fixtures, options, ); expect(dw.polledWatching).toBe(5007); dw.close(); }); it("directoryWatcher with poll:number uses that number", () => { const options = { poll: 123 }; const dw = new DirectoryWatcher( getWatcherManager(options), fixtures, options, ); expect(dw.polledWatching).toBe(123); dw.close(); }); } it("forEachWatcher should noop if no watcher registered for path", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); let called = false; dw.forEachWatcher("/no/such/path", () => { called = true; }); expect(called).toBe(false); dw.close(); }); it("onDirectoryRemoved emits remove for tracked files and directories", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); dw.files.set(path.join(fixtures, "f1"), { safeTime: Date.now(), timestamp: Date.now(), accuracy: 10, }); dw.filesWithoutCase.set(path.join(fixtures, "f1").toLowerCase(), 1); dw.directories.set(path.join(fixtures, "d1"), true); let removeEvents = 0; const w1 = dw.watch(path.join(fixtures, "f1")); const w2 = dw.watch(path.join(fixtures, "d1")); w1.on("remove", () => { removeEvents++; }); w2.on("remove", () => { removeEvents++; }); dw.onDirectoryRemoved("test"); testHelper.tick(300, () => { expect(removeEvents).toBeGreaterThanOrEqual(2); w1.close(); w2.close(); dw.close(); done(); }); }); it("doScan with scanAgain already set flips scanAgainInitial to false when non-initial", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); // Force scanning=true and scanAgain=true with initial=true dw.scanning = true; dw.scanAgain = true; dw.scanAgainInitial = true; dw.doScan(false); expect(dw.scanAgainInitial).toBe(false); // Cleanup dw.scanning = false; dw.scanAgain = false; dw.close(); testHelper.tick(100, done); }); it("fixupEntryAccuracy adjusts entries whose accuracy exceeds FS_ACCURACY", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const file = path.join(fixtures, "something"); // Pre-seed with an absurdly high accuracy. FS_ACCURACY maxes at 2000 and // only decreases, so any entry with accuracy greater than 2000 (or after // FS_ACCURACY has dropped) will trigger the fixup branch. dw.files.set(file, { safeTime: 100000, timestamp: 100000, accuracy: 100000, }); const times = dw.getTimes(); // safeTime was adjusted down: safeTime = safeTime - accuracy + FS_ACCURACY // max(entry.safeTime, entry.timestamp) after adjustment = 100000 (timestamp) expect(times[file]).toBe(100000); dw.close(); }); it("setNestedWatching true->false closes nested watchers", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); dw.setNestedWatching(true); expect(dw.nestedWatching).toBe(true); // Add a fake directory with a closable watcher let closed = false; dw.directories.set( path.join(fixtures, "d1"), /** @type {import("../lib/DirectoryWatcher").Watcher} */ ( /** @type {unknown} */ ({ close() { closed = true; }, }) ), ); dw.setNestedWatching(false); expect(closed).toBe(true); expect(dw.nestedWatching).toBe(false); expect(dw.directories.get(path.join(fixtures, "d1"))).toBe(true); dw.close(); }); it("setNestedWatching false->true creates nested watchers for pre-populated directories", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); // Directly populate a fake entry to exercise the createNestedWatcher loop const childDir = path.join(fixtures, "child-dir-marker"); dw.directories.set(childDir, true); dw.setNestedWatching(true); expect(dw.nestedWatching).toBe(true); const created = dw.directories.get(childDir); expect(created).not.toBe(true); // Cleanup the nested watcher before closing dw.setNestedWatching(false); dw.close(); }); it("setFileTime detects a case-insensitive duplicate and triggers a rescan", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); let scanCount = 0; const origScan = dw.doScan.bind(dw); dw.doScan = function doScan(initial) { scanCount++; return origScan(initial); }; const fA = path.join(fixtures, "Aaa"); const fB = path.join(fixtures, "aaa"); // First file dw.setFileTime(fA, Date.now(), true, false, "scan (file)"); const countBefore = scanCount; // Second file with case-insensitive-equal name triggers rescan dw.setFileTime(fB, Date.now(), true, false, "scan (file)"); expect(scanCount).toBeGreaterThan(countBefore); dw.close(); }); it("setFileTime without initial triggers change on existing watcher", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "file"); // Preload an existing entry dw.files.set(target, { safeTime: Date.now() - 10000, timestamp: Date.now() - 10000, accuracy: 10, }); const w = dw.watch(target); let gotChange = false; w.on("change", () => { gotChange = true; }); dw.setFileTime(target, Date.now(), false, false, "change"); expect(gotChange).toBe(true); w.close(); dw.close(); }); it("setFileTime skips when timestamp is unchanged and old is stable", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "file"); const ts = Date.now() - 10000; dw.files.set(target, { safeTime: ts, timestamp: ts, accuracy: 0, }); const w = dw.watch(target); let gotChange = false; w.on("change", () => { gotChange = true; }); // Same mtime and mtime + FS_ACCURACY(2000) < now => skip dw.setFileTime(target, ts, false, false, "change"); expect(gotChange).toBe(false); w.close(); dw.close(); }); it("setFileTime with ignoreWhenEqual skips when timestamp matches", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "file"); const ts = Date.now(); dw.files.set(target, { safeTime: ts, timestamp: ts, accuracy: 0 }); const w = dw.watch(target); let gotChange = false; w.on("change", () => { gotChange = true; }); dw.setFileTime(target, ts, true, true, "scan (file)"); expect(gotChange).toBe(false); w.close(); dw.close(); }); it("setMissing emits remove event when file is currently tracked", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "file"); const lowerKey = target.toLowerCase(); dw.files.set(target, { safeTime: Date.now(), timestamp: Date.now(), accuracy: 0, }); dw.filesWithoutCase.set(lowerKey, 1); const w = dw.watch(target); let gotRemove = false; w.on("remove", () => { gotRemove = true; }); dw.setMissing(target, false, "scan (missing)"); testHelper.tick(100, () => { expect(gotRemove).toBe(true); w.close(); dw.close(); done(); }); }); it("watch() with outdated safeTime emits change for file watcher", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "some-file"); const safeTime = Date.now() - 1000; dw.files.set(target, { safeTime, timestamp: safeTime, accuracy: 0, }); const startTime = safeTime - 100; // startTime < safeTime, triggers emit const w = dw.watch(target, startTime); let gotChange = false; w.on("change", () => { gotChange = true; }); process.nextTick(() => { testHelper.tick(100, () => { expect(gotChange).toBe(true); w.close(); dw.close(); done(); }); }); }); it("watch() emits remove when the target was marked removed during initial scan", (done) => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const target = path.join(fixtures, "removed-during-scan"); // Still in initial scan expect(dw.initialScan).toBe(true); /** @type {Set} */ (dw.initialScanRemoved).add(target); const w = dw.watch(target); let gotRemove = false; w.on("remove", () => { gotRemove = true; }); testHelper.tick(100, () => { expect(gotRemove).toBe(true); w.close(); dw.close(); done(); }); }); it("setMissing decrements filesWithoutCase counter when count > 1", () => { const dw = new DirectoryWatcher( getWatcherManager(EMPTY_OPTIONS), fixtures, EMPTY_OPTIONS, ); const t1 = path.join(fixtures, "aaa"); const lowerKey = t1.toLowerCase(); dw.files.set(t1, { safeTime: Date.now(), timestamp: Date.now(), accuracy: 0, }); dw.filesWithoutCase.set(lowerKey, 2); // more than one dw.setMissing(t1, false, "scan (missing)"); expect(dw.filesWithoutCase.get(lowerKey)).toBe(1); dw.close(); }); }); watchpack-2.5.2/test/LinkResolver.test.js000066400000000000000000000126711521250557700204170ustar00rootroot00000000000000"use strict"; const fs = require("fs"); const path = require("path"); const LinkResolverTest = require("../lib/LinkResolver"); const TestHelper = require("./helpers/TestHelper"); const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); let symlinksSupported = false; try { fs.symlinkSync("helpers", path.join(__dirname, "fixtures"), "dir"); fs.unlinkSync(path.join(__dirname, "fixtures")); symlinksSupported = true; } catch (_err) { // symlinks not supported in this environment } // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(10000); describe("LinkResolver", () => { it("should not throw when a path resolves with ENOENT", () => { const resolver = new LinkResolverTest(); const result = resolver.resolve("/path/to/nonexistent/file/or/folder"); expect(result).toEqual(["/path/to/nonexistent/file/or/folder"]); }); it("should cache resolution results", () => { const resolver = new LinkResolverTest(); const target = "/path/to/somewhere/nowhere"; const first = resolver.resolve(target); const second = resolver.resolve(target); expect(second).toBe(first); }); it("should treat filesystem roots as unresolvable links", () => { const resolver = new LinkResolverTest(); const { root } = path.parse(process.cwd()); const result = resolver.resolve(root); expect(result).toEqual([root]); expect(Object.isFrozen(result)).toBe(true); }); it("should rethrow unexpected fs.readlinkSync errors", () => { const { readlinkSync } = fs; const customError = Object.assign(new Error("mock io error"), { code: "EIO", }); fs.readlinkSync = () => { throw customError; }; try { const resolver = new LinkResolverTest(); expect(() => resolver.resolve("/some/path/that/errors")).toThrow( /mock io error/, ); } finally { fs.readlinkSync = readlinkSync; } }); if (symlinksSupported) { describe("with symlinks", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("should include a symlink in the resolution result", () => { testHelper.dir("a"); testHelper.file(path.join("a", "target")); testHelper.symlinkFile( path.join("a", "link"), path.join(fixtures, "a", "target"), ); const resolver = new LinkResolverTest(); const result = resolver.resolve(path.join(fixtures, "a", "link")); expect(result[0]).toBe(path.join(fixtures, "a", "target")); expect(result).toContain(path.join(fixtures, "a", "link")); }); it("should include chained symlinks in the resolution result", () => { testHelper.dir("a"); testHelper.file(path.join("a", "target")); testHelper.symlinkFile( path.join("a", "link1"), path.join(fixtures, "a", "target"), ); testHelper.symlinkFile( path.join("a", "link2"), path.join(fixtures, "a", "link1"), ); const resolver = new LinkResolverTest(); const result = resolver.resolve(path.join(fixtures, "a", "link2")); expect(result[0]).toBe(path.join(fixtures, "a", "target")); expect(result).toContain(path.join(fixtures, "a", "link1")); expect(result).toContain(path.join(fixtures, "a", "link2")); }); it("should resolve a file that sits inside a symlinked directory", () => { testHelper.dir("a"); testHelper.dir(path.join("a", "real")); testHelper.file(path.join("a", "real", "f")); testHelper.symlinkDir( path.join("a", "linkDir"), path.join(fixtures, "a", "real"), ); const resolver = new LinkResolverTest(); const result = resolver.resolve( path.join(fixtures, "a", "linkDir", "f"), ); expect(result[0]).toBe(path.join(fixtures, "a", "real", "f")); // Parent symlink is included expect(result).toContain(path.join(fixtures, "a", "linkDir")); }); it("should combine parent symlinks with a file-level symlink", () => { testHelper.dir("real"); testHelper.file(path.join("real", "t")); testHelper.symlinkDir("linkDir", path.join(fixtures, "real")); testHelper.symlinkFile( path.join("linkDir", "link_t"), path.join(fixtures, "real", "t"), ); const resolver = new LinkResolverTest(); const result = resolver.resolve( path.join(fixtures, "linkDir", "link_t"), ); expect(result[0]).toBe(path.join(fixtures, "real", "t")); }); it("should dedupe entries when both link content and parent have symlinks", () => { // Structure creates both a parent symlink chain and a target symlink chain testHelper.dir("real"); testHelper.file(path.join("real", "t")); // parent symlink chain: linkA -> linkB -> real testHelper.symlinkDir("linkB", path.join(fixtures, "real")); testHelper.symlinkDir("linkA", path.join(fixtures, "linkB")); // target symlink chain inside real: tLinkA -> tLinkB -> t testHelper.symlinkFile( path.join("real", "tLinkB"), path.join(fixtures, "real", "t"), ); testHelper.symlinkFile( path.join("real", "tLinkA"), path.join(fixtures, "real", "tLinkB"), ); const resolver = new LinkResolverTest(); const result = resolver.resolve(path.join(fixtures, "linkA", "tLinkA")); expect(result[0]).toBe(path.join(fixtures, "real", "t")); // Contains all link layers expect(result).toContain(path.join(fixtures, "linkA")); expect(result).toContain(path.join(fixtures, "linkB")); }); }); } else { it("symlinks (not supported in this environment)", () => { expect(true).toBe(true); }); } }); watchpack-2.5.2/test/ManyWatchers.test.js000066400000000000000000000050101521250557700203720ustar00rootroot00000000000000"use strict"; const path = require("path"); const Watchpack = require("../lib"); const watchEventSource = require("../lib/watchEventSource"); const TestHelper = require("./helpers/TestHelper"); const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(600000); describe("ManyWatchers", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("should watch more than 4096 directories", (done) => { console.time("creating files"); // windows is very slow in creating so many files // this can take about 1 minute /** @type {string[]} */ const files = []; for (let i = 1; i < 5000; i++) { let highBit = 1; let j = i; while (j > 1) { highBit <<= 1; j >>= 1; } const dir = `${i & highBit}/${i & ~highBit}`; if (i === highBit) { testHelper.dir(`${i}`); testHelper.file(`${i}/file`); files.push(path.join(fixtures, `${i}`, "file")); } testHelper.dir(dir); testHelper.file(`${dir}/file`); files.push(path.join(fixtures, dir, "file")); if (i === highBit) { testHelper.file(`${dir}/file2`); files.push(path.join(fixtures, dir, "file2")); } } testHelper.file("file"); files.push(path.join(fixtures, "file")); console.timeEnd("creating files"); testHelper.tick(10000, () => { const w = new Watchpack({ aggregateTimeout: 1000, }); w.on("aggregated", (changes) => { console.timeEnd("detecting change event"); expect([...changes]).toEqual([path.join(fixtures, "4096/900/file")]); w.close(); done(); }); console.time("creating/closing watchers"); // MacOS is very slow in creating and destroying watchers // This can take about 2 minutes for (let i = 100; i < files.length; i += 2432) { for (let j = 0; j < files.length - i; j += 987) { w.watch({ files: files.slice(j, j + i) }); } } w.watch({ files }); console.timeEnd("creating/closing watchers"); console.time("calling watch with the same files"); for (let i = 0; i < 2000; i++) { w.watch({ files }); } console.timeEnd("calling watch with the same files"); testHelper.tick(10000, () => { console.time("detecting change event"); testHelper.file("4096/900/file"); }); }); }); it("should set the watcher limit based on the platform", () => { expect(watchEventSource.watcherLimit).toBe( require("os").platform() === "darwin" ? 20 : 10000, ); }); }); watchpack-2.5.2/test/Polling.test.js000066400000000000000000000037271521250557700174060ustar00rootroot00000000000000"use strict"; const path = require("path"); const Watchpack = require("../lib"); const TestHelper = require("./helpers/TestHelper"); const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(15000); describe("polled Watchpack", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("should set poll:true as the poll option", (done) => { const w = new Watchpack({ aggregateTimeout: 100, poll: true, }); expect(w.watcherOptions.poll).toBe(true); w.watch([], []); testHelper.tick(300, () => { w.close(); done(); }); }); it("should accept a numeric poll interval", (done) => { const w = new Watchpack({ aggregateTimeout: 100, poll: 200, }); expect(w.watcherOptions.poll).toBe(200); w.watch([], []); testHelper.tick(300, () => { w.close(); done(); }); }); it("should detect a file creation on an existing file in polled mode", (done) => { testHelper.file("a"); testHelper.tick(500, () => { const w = new Watchpack({ aggregateTimeout: 100, poll: 150, }); w.once("aggregated", (changes) => { expect([...changes]).toContain(path.join(fixtures, "a")); w.close(); done(); }); w.watch([path.join(fixtures, "a")], [], Date.now() - 10000); testHelper.tick(300, () => { testHelper.file("a"); }); }); }); it("should detect a file removal in polled mode", (done) => { testHelper.file("a"); testHelper.tick(300, () => { const w = new Watchpack({ aggregateTimeout: 100, poll: 150, }); w.on("aggregated", (_changes, removals) => { if (!removals.has(path.join(fixtures, "a"))) return; expect([...removals]).toContain(path.join(fixtures, "a")); w.close(); done(); }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(300, () => { testHelper.remove("a"); }); }); }); }); watchpack-2.5.2/test/Watchpack.test.js000066400000000000000000001332431521250557700177040ustar00rootroot00000000000000"use strict"; const path = require("path"); const WatchpackTest = require("../lib"); const TestHelper = require("./helpers/TestHelper"); const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); /** @typedef {import("../lib/index").Entry} Entry */ /** @typedef {import("../lib/index").Changes} Changes */ // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(10000); describe("Watchpack", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("should watch a single file", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBeGreaterThan(0); w.close(); done(); }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); }); }); it("should aggregate changes while paused", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); testHelper.file("a"); testHelper.file("b"); w.watch([path.join(fixtures, "a"), path.join(fixtures, "b")], []); testHelper.tick(() => { w.pause(); w.on("change", (_file) => { throw new Error("should not be emitted"); }); w.on("aggregated", (_changes) => { throw new Error("should not be emitted"); }); testHelper.tick(() => { testHelper.file("a"); testHelper.remove("b"); testHelper.file("b"); testHelper.remove("a"); testHelper.tick(() => { const { changes, removals } = w.getAggregated(); expect([...changes]).toEqual([path.join(fixtures, "b")]); expect([...removals]).toEqual([path.join(fixtures, "a")]); w.close(); done(); }); }); }); }); it("should not watch a single ignored file (glob)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 300, ignored: "**/a", }); let changeEvents = 0; let aggregatedEvents = 0; w.on("change", () => { changeEvents++; }); w.on("aggregated", () => { aggregatedEvents++; }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); testHelper.tick(1000, () => { expect(changeEvents).toBe(0); expect(aggregatedEvents).toBe(0); expect(testHelper.getNumberOfWatchers()).toBe(0); w.close(); done(); }); }); }); it("should not watch a single ignored file (regexp)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 300, ignored: /\/a$/, }); let changeEvents = 0; let aggregatedEvents = 0; w.on("change", () => { changeEvents++; }); w.on("aggregated", () => { aggregatedEvents++; }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); testHelper.tick(1000, () => { expect(changeEvents).toBe(0); expect(aggregatedEvents).toBe(0); expect(testHelper.getNumberOfWatchers()).toBe(0); w.close(); done(); }); }); }); it("should not watch a single ignored file (function)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 300, ignored: (entry) => entry.includes("a"), }); let changeEvents = 0; let aggregatedEvents = 0; w.on("change", () => { changeEvents++; }); w.on("aggregated", () => { aggregatedEvents++; }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); testHelper.tick(1000, () => { expect(changeEvents).toBe(0); expect(aggregatedEvents).toBe(0); expect(testHelper.getNumberOfWatchers()).toBe(0); w.close(); done(); }); }); }); it("should watch multiple files", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes].sort()).toEqual([ path.join(fixtures, "a"), path.join(fixtures, "b"), ]); expect(changeEvents).toEqual([ path.join(fixtures, "a"), path.join(fixtures, "b"), path.join(fixtures, "a"), path.join(fixtures, "b"), path.join(fixtures, "a"), ]); expect(Object.keys(w.getTimes()).sort()).toEqual([ path.join(fixtures, "a"), path.join(fixtures, "b"), ]); w.close(); done(); }); w.watch([path.join(fixtures, "a"), path.join(fixtures, "b")], []); testHelper.tick(400, () => { testHelper.file("a"); testHelper.tick(400, () => { testHelper.file("b"); testHelper.tick(400, () => { testHelper.file("a"); testHelper.tick(400, () => { testHelper.file("b"); testHelper.tick(400, () => { testHelper.file("a"); }); }); }); }); }); }); it("should watch a directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "a")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.tick(200, () => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(200, () => { testHelper.file(path.join("dir", "a")); }); }); }); it("should not watch an ignored directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 300, ignored: ["**/dir"], }); let changeEvents = 0; let aggregatedEvents = 0; w.on("change", () => { changeEvents++; }); w.on("aggregated", () => { aggregatedEvents++; }); testHelper.dir("dir"); testHelper.tick(200, () => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(200, () => { testHelper.file(path.join("dir", "a")); testHelper.tick(1000, () => { expect(changeEvents).toBe(0); expect(aggregatedEvents).toBe(0); expect(testHelper.getNumberOfWatchers()).toBe(0); w.close(); done(); }); }); }); }); it("should not watch an ignored file in a directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 300, ignored: ["**/a"], }); let changeEvents = 0; let aggregatedEvents = 0; w.on("change", () => { changeEvents++; }); w.on("aggregated", () => { aggregatedEvents++; }); testHelper.dir("dir"); testHelper.tick(200, () => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(200, () => { testHelper.file(path.join("dir", "a")); testHelper.tick(1000, () => { expect(changeEvents).toBe(0); expect(aggregatedEvents).toBe(0); w.close(); done(); }); }); }); }); it("should watch a file when ignore is empty array", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, ignored: [], }); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBeGreaterThan(0); w.close(); done(); }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); }); }); it("should watch a file when ignore is an array with empty string", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, ignored: ["", ""], }); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBeGreaterThan(0); w.close(); done(); }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); }); }); it("should watch a file when ignore is empty string", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, ignored: "", }); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBeGreaterThan(0); w.close(); done(); }); w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.file("a"); }); }); it("should watch a file then a directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes, removals) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect([...removals]).toEqual([]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "a")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "subdir")); testHelper.file(path.join("dir", "a")); testHelper.tick(400, () => { w.watch([path.join(fixtures, "dir", "a")], []); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.file(path.join("dir", "a")); }); }); }); }); it("should watch a directory (delete file)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "a")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.file(path.join("dir", "a")); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.remove(path.join("dir", "a")); }); }); }); it("should watch a directory (delete and recreate file)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([ path.join(fixtures, "dir", "a"), path.join(fixtures, "dir", "b"), path.join(fixtures, "dir", "a"), ]); w.close(); done(); }); testHelper.dir("dir"); testHelper.file(path.join("dir", "a")); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); // Windows' ReadDirectoryChangesW can reorder rapid events, so give // each operation enough separation that the watcher observes them // in source order and we exit the initial scan before the first // change. testHelper.tick(500, () => { testHelper.remove(path.join("dir", "a")); testHelper.tick(500, () => { testHelper.file(path.join("dir", "b")); testHelper.tick(500, () => { testHelper.file(path.join("dir", "a")); }); }); }); }); }); it("should watch a missing directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir", "sub")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "sub")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.tick(() => { w.watch({ missing: [path.join(fixtures, "dir", "sub")] }); testHelper.tick(() => { testHelper.dir(path.join("dir", "sub")); }); }); }); it("should watch a directory (add directory)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "sub")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.dir(path.join("dir", "sub")); }); }); }); it("should watch a directory (delete directory)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.file(path.join("dir", "sub", "a")); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.remove(path.join("dir", "sub")); }); }); }); it("should watch a directory (delete, restore and change directory)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes, removals) => { expect([...changes]).toEqual([path.join(fixtures, "dir", "sub", "a")]); expect([...removals]).toEqual([]); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.file(path.join("dir", "sub", "a")); testHelper.tick(() => { w.watch([path.join(fixtures, "dir", "sub", "a")], []); testHelper.tick(() => { testHelper.remove(path.join("dir", "sub")); testHelper.tick(() => { testHelper.dir(path.join("dir", "sub")); testHelper.file(path.join("dir", "sub", "a")); }); }); }); }); it("should watch a directory (delete directory2)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "sub")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.remove(path.join("dir", "sub")); }); }); }); it("should watch already watched directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "a")]); w.close(); done(); }); testHelper.dir("dir"); testHelper.file(path.join("dir", "a")); testHelper.tick(400, () => { w.watch([path.join(fixtures, "dir", "a")], []); testHelper.tick(1000, () => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(400, () => { testHelper.remove(path.join("dir", "a")); }); }); }); }); it("should watch file in a sub directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "sub", "a")]); const times = w.getTimeInfoEntries(); const dir = /** @type {Entry} */ (times.get(path.join(fixtures, "dir"))); const sub = /** @type {Entry} */ (times.get(path.join(fixtures, "dir", "sub"))); const a = /** @type {Entry} */ (times.get(path.join(fixtures, "dir", "sub", "a"))); expect(typeof dir).toBe("object"); expect(Object.prototype.hasOwnProperty.call(dir, "safeTime")).toBe(true); expect(sub.safeTime).toBeGreaterThanOrEqual(a.safeTime); expect(dir.safeTime).toBeGreaterThanOrEqual(sub.safeTime); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.tick(() => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.file(path.join("dir", "sub", "a")); }); }); }); it("should watch file in a sub directory (passed in maps)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "sub", "a")]); const files = new Map(); const directories = new Map(); w.collectTimeInfoEntries(files, directories); const dir = directories.get(path.join(fixtures, "dir")); const dirAsFile = files.get(path.join(fixtures, "dir")); const sub = directories.get(path.join(fixtures, "dir", "sub")); const subAsFile = files.get(path.join(fixtures, "dir", "sub")); const a = files.get(path.join(fixtures, "dir", "sub", "a")); const file = files.get(path.join(fixtures, "file")); expect(typeof dir).toBe("object"); expect(Object.prototype.hasOwnProperty.call(dir, "safeTime")).toBe(true); expect(typeof dirAsFile).toBe("object"); expect(Object.prototype.hasOwnProperty.call(dirAsFile, "safeTime")).toBe( false, ); expect(typeof sub).toBe("object"); expect(Object.prototype.hasOwnProperty.call(sub, "safeTime")).toBe(true); expect(typeof subAsFile).toBe("object"); expect(Object.prototype.hasOwnProperty.call(subAsFile, "safeTime")).toBe( false, ); expect(typeof a).toBe("object"); expect(Object.prototype.hasOwnProperty.call(a, "safeTime")).toBe(true); expect(Object.prototype.hasOwnProperty.call(a, "timestamp")).toBe(true); expect(file).toBeNull(); expect(sub.safeTime).toBeGreaterThanOrEqual(a.safeTime); expect(dir.safeTime).toBeGreaterThanOrEqual(sub.safeTime); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.dir(path.join("dir", "sub2")); testHelper.tick(() => { w.watch([path.join(fixtures, "file")], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.file(path.join("dir", "sub", "a")); }); }); }); it("should watch directory as file and directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); w.on("aggregated", (_changes) => { const files = new Map(); const directories = new Map(); w.collectTimeInfoEntries(files, directories); // fixtures should exist const fixturesAsFile = files.get(path.join(fixtures)); expect(typeof fixturesAsFile).toBe("object"); // dir should exist const dirAsFile = files.get(path.join(fixtures, "dir")); expect(typeof dirAsFile).toBe("object"); expect(Object.prototype.hasOwnProperty.call(dirAsFile, "safeTime")).toBe( false, ); // a should have timestamp const a = files.get(path.join(fixtures, "dir", "sub", "a")); expect(typeof a).toBe("object"); expect(Object.prototype.hasOwnProperty.call(a, "safeTime")).toBe(true); expect(Object.prototype.hasOwnProperty.call(a, "timestamp")).toBe(true); // sub should have timestamp const sub = directories.get(path.join(fixtures, "dir", "sub")); expect(typeof sub).toBe("object"); expect(Object.prototype.hasOwnProperty.call(sub, "safeTime")).toBe(true); // sub should exist as file const subAsFile = files.get(path.join(fixtures, "dir", "sub")); expect(typeof subAsFile).toBe("object"); expect(Object.prototype.hasOwnProperty.call(subAsFile, "safeTime")).toBe( false, ); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.dir(path.join("dir", "sub2")); testHelper.tick(() => { w.watch( [ path.join(fixtures, "dir", "sub", "a"), path.join(fixtures, "dir", "sub"), path.join(fixtures), ], [path.join(fixtures, "dir", "sub")], ); testHelper.tick(() => { testHelper.file(path.join("dir", "sub", "a")); }); }); }); it("should watch 2 files in a not-existing directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); w.on("aggregated", (changes) => { expect([...changes].sort()).toEqual([ path.join(fixtures, "dir", "sub", "a"), path.join(fixtures, "dir", "sub", "b"), ]); w.close(); done(); }); testHelper.dir("dir"); w.watch( [ path.join(fixtures, "dir", "sub", "a"), path.join(fixtures, "dir", "sub", "b"), ], [], ); testHelper.tick(() => { testHelper.dir(path.join("dir", "sub")); testHelper.file(path.join("dir", "sub", "a")); testHelper.file(path.join("dir", "sub", "b")); }); }); it("should watch file in a sub sub directory", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([ path.join(fixtures, "dir", "sub", "sub", "a"), ]); expect(Object.keys(w.getTimes()).sort()).toEqual([ path.join(fixtures, "dir"), path.join(fixtures, "dir", "sub"), path.join(fixtures, "dir", "sub", "sub"), path.join(fixtures, "dir", "sub", "sub", "a"), ]); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub")); testHelper.dir(path.join("dir", "sub", "sub")); testHelper.tick(2000, () => { w.watch([], [path.join(fixtures, "dir")], Date.now()); testHelper.tick(() => { testHelper.file(path.join("dir", "sub", "sub", "a")); }); }); }); it("should watch file in a directory that contains special glob characters", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); /** @type {string[]} */ const changeEvents = []; w.on("change", (file) => { if (changeEvents[changeEvents.length - 1] === file) return; changeEvents.push(file); }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "dir")]); expect(changeEvents).toEqual([path.join(fixtures, "dir", "sub()", "a")]); const times = w.getTimeInfoEntries(); const dir = /** @type {Entry} */ (times.get(path.join(fixtures, "dir"))); const sub = /** @type {Entry} */ (times.get(path.join(fixtures, "dir", "sub()"))); const a = /** @type {Entry} */ (times.get(path.join(fixtures, "dir", "sub()", "a"))); expect(sub.safeTime).toBeGreaterThanOrEqual(a.safeTime); expect(dir.safeTime).toBeGreaterThanOrEqual(sub.safeTime); w.close(); done(); }); testHelper.dir("dir"); testHelper.dir(path.join("dir", "sub()")); testHelper.tick(2000, () => { w.watch([], [path.join(fixtures, "dir")]); testHelper.tick(() => { testHelper.file(path.join("dir", "sub()", "a")); }); }); }); it("should detect a single change to future timestamps", (done) => { const options = { aggregateTimeout: 1000, }; const w = new WatchpackTest(options); const w2 = new WatchpackTest(options); w.on("change", () => { throw new Error("should not report change event"); }); w.on("aggregated", () => { throw new Error("should not report aggregated event"); }); testHelper.file("a"); testHelper.tick(400, () => { w2.watch([path.join(fixtures, "a")], [], Date.now()); testHelper.tick(1000, () => { // wait for initial scan testHelper.mtime("a", Date.now() + 1000000); testHelper.tick(400, () => { w.watch([path.join(fixtures, "a")], [], Date.now()); testHelper.tick(1000, () => { expect(true).toBe(true); w2.close(); w.close(); done(); }); }); }); }); }); it("should create different watchers for different options", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); const w2 = new WatchpackTest({ aggregateTimeout: 1000, }); testHelper.file("a"); testHelper.tick(400, () => { w.watch([path.join(fixtures, "a")], [], Date.now()); w2.watch([path.join(fixtures, "a")], [], Date.now()); testHelper.tick(1000, () => { testHelper.file("a"); testHelper.tick(400, () => { testHelper.file("a"); testHelper.tick(1000, () => { expect(true).toBe(true); w2.close(); w.close(); done(); }); }); }); }); }); it("should detect a past change to a file (timestamp)", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBeGreaterThan(0); w.close(); done(); }); const startTime = Date.now(); testHelper.tick(() => { testHelper.file("a"); testHelper.tick(() => { w.watch([path.join(fixtures, "a")], [], startTime); }); }); }); it("should not detect a past change to a file (watched)", (done) => { const w2 = new WatchpackTest(); const w = new WatchpackTest(); w.on("change", () => { throw new Error("Should not be detected"); }); testHelper.tick(() => { testHelper.file("b"); w2.watch([path.join(fixtures, "b")], []); testHelper.tick(1000, () => { // wait for stable state testHelper.file("a"); testHelper.tick(1000, () => { const startTime = Date.now(); testHelper.tick(400, () => { w.watch([path.join(fixtures, "a")], [], startTime); testHelper.tick(1000, () => { expect(true).toBe(true); w.close(); w2.close(); done(); }); }); }); }); }); }); it("should detect a past change to a file (watched)", (done) => { const w2 = new WatchpackTest(); const w = new WatchpackTest(); let changeEvents = 0; w.on("change", (file) => { expect(file).toBe(path.join(fixtures, "a")); changeEvents++; }); w.on("aggregated", (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a")]); expect(changeEvents).toBe(1); w.close(); w2.close(); done(); }); testHelper.tick(() => { testHelper.file("b"); w2.watch([path.join(fixtures, "b")], []); testHelper.tick(() => { const startTime = Date.now(); testHelper.tick(() => { testHelper.file("a"); testHelper.tick(400, () => { w.watch([path.join(fixtures, "a")], [], startTime); }); }); }); }); }); it("should watch a single file removal", (done) => { testHelper.file("a"); const w = new WatchpackTest({ aggregateTimeout: 1000, }); let removeEvents = 0; w.on("remove", (file) => { expect(file).toBe(path.join(fixtures, "a")); removeEvents++; }); w.on("aggregated", (changes, removals) => { expect([...removals]).toEqual([path.join(fixtures, "a")]); expect(removeEvents).toBe(1); w.close(); done(); }); testHelper.tick(400, () => { w.watch([path.join(fixtures, "a")], []); testHelper.tick(() => { testHelper.remove("a"); }); }); }); it("should watch multiple file removals", (done) => { let step = 0; testHelper.file("a"); testHelper.file("b"); const w = new WatchpackTest({ aggregateTimeout: 3000, }); /** @type {string[]} */ const removeEvents = []; w.on("remove", (file) => { if (removeEvents[removeEvents.length - 1] === file) return; removeEvents.push(file); }); w.on("aggregated", (changes, removals) => { expect(step).toBe(6); expect([...removals].sort()).toEqual([ path.join(fixtures, "a"), path.join(fixtures, "b"), ]); // @ts-expect-error for testing if (!+process.env.WATCHPACK_POLLING) { expect(removeEvents).toEqual([ path.join(fixtures, "a"), path.join(fixtures, "b"), path.join(fixtures, "a"), path.join(fixtures, "b"), ]); } expect(Object.keys(w.getTimes()).sort()).toEqual([ path.join(fixtures, "a"), path.join(fixtures, "b"), ]); w.close(); done(); }); testHelper.tick(400, () => { w.watch([path.join(fixtures, "a"), path.join(fixtures, "b")], []); step = 1; testHelper.tick(1000, () => { testHelper.remove("a"); step = 2; testHelper.tick(() => { testHelper.remove("b"); step = 3; testHelper.tick(1000, () => { testHelper.file("a"); testHelper.file("b"); step = 4; testHelper.tick(1000, () => { testHelper.remove("a"); step = 5; testHelper.tick(() => { testHelper.remove("b"); step = 6; }); }); }); }); }); }); }); it("should not report changes in initial scan when no start time is provided", (done) => { const w = new WatchpackTest({ aggregateTimeout: 100, }); w.on("aggregated", () => { done(new Error("should not fire")); }); testHelper.dir("dir"); testHelper.dir("dir/b"); testHelper.dir("dir/b/sub"); testHelper.file("dir/b/sub/file"); testHelper.dir("dir/b/sub/sub"); testHelper.file("dir/b/sub/sub/file"); testHelper.file("dir/b/file"); testHelper.file("dir/a"); testHelper.tick(1000, () => { w.watch({ directories: [path.join(fixtures, "dir", "b", "sub")], }); testHelper.tick(2000, () => { // no event fired w.watch({ files: [path.join(fixtures, "dir", "a")], directories: [ path.join(fixtures, "dir", "b", "sub"), path.join(fixtures, "dir", "b"), ], missing: [path.join(fixtures, "dir", "c")], }); testHelper.tick(2000, () => { expect(true).toBe(true); // no event fired w.close(); done(); }); }); }); }); it("should not report changes in initial scan when start time is provided", (done) => { const w = new WatchpackTest({ aggregateTimeout: 100, }); w.on("aggregated", () => { done(new Error("should not fire")); }); testHelper.dir("dir"); testHelper.dir("dir/b"); testHelper.dir("dir/b/sub"); testHelper.file("dir/b/sub/file"); testHelper.dir("dir/b/sub/sub"); testHelper.file("dir/b/sub/sub/file"); testHelper.file("dir/b/file"); testHelper.file("dir/a"); testHelper.tick(1000, () => { w.watch({ directories: [path.join(fixtures, "dir", "b", "sub")], startTime: Date.now(), }); testHelper.tick(2000, () => { // no event fired w.watch({ files: [path.join(fixtures, "dir", "a")], directories: [ path.join(fixtures, "dir", "b", "sub"), path.join(fixtures, "dir", "b"), ], missing: [path.join(fixtures, "dir", "c")], startTime: Date.now(), }); testHelper.tick(2000, () => { expect(true).toBe(true); // no event fired w.close(); done(); }); }); }); }); it("should not report changes to a folder watched as file when items are added", (done) => { const w = new WatchpackTest({ aggregateTimeout: 100, }); w.on("aggregated", () => { done(new Error("should not fire")); }); testHelper.dir("dir"); testHelper.file("dir/a"); testHelper.tick(1000, () => { testHelper.file("dir/b"); w.watch({ files: [path.join(fixtures, "dir")], startTime: Date.now(), }); testHelper.tick(1000, () => { testHelper.file("dir/c"); testHelper.tick(1000, () => { expect(true).toBe(true); // no event fired w.close(); done(); }); }); }); }); it("should report removal of file and directory if it is missing in initial scan", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); w.on("aggregated", (changes, removals) => { expect([...changes]).toEqual([]); expect([...removals].sort()).toEqual([ path.join(fixtures, "dir", "a"), path.join(fixtures, "dir", "b"), ]); w.close(); done(); }); testHelper.dir("dir"); testHelper.tick(() => { w.watch({ files: [path.join(fixtures, "dir", "a")], directories: [path.join(fixtures, "dir", "b")], missing: [path.join(fixtures, "dir", "c")], }); }); }); it("should report removal of file and directory if parent directory is missing in initial scan", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); w.on("aggregated", (changes, removals) => { expect([...changes]).toEqual([]); expect([...removals].sort()).toEqual([ path.join(fixtures, "dir", "a"), path.join(fixtures, "dir", "b"), ]); w.close(); done(); }); testHelper.tick(() => { w.watch({ files: [path.join(fixtures, "dir", "a")], directories: [path.join(fixtures, "dir", "b")], missing: [path.join(fixtures, "dir", "c")], }); }); }); it("should not detect file reading as change, but atomic file writes", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); w.on("aggregated", (changes, removals) => { expect([...changes].sort()).toEqual([ path.join(fixtures, "dir", "b"), path.join(fixtures, "dir", "c"), ]); expect([...removals]).toEqual([]); w.close(); done(); }); testHelper.dir("dir"); testHelper.file(path.join("dir", "a")); testHelper.file(path.join("dir", "b")); testHelper.file(path.join("dir", "c")); testHelper.tick(1000, () => { w.watch({ files: [ path.join(fixtures, "dir", "a"), path.join(fixtures, "dir", "b"), path.join(fixtures, "dir", "c"), ], }); testHelper.tick(1000, () => { testHelper.accessFile(path.join("dir", "a")); testHelper.fileAtomic(path.join("dir", "b")); testHelper.file(path.join("dir", "c")); }); }); }); it("should allow to reuse watchers when watch is called again", (done) => { const w = new WatchpackTest({ aggregateTimeout: 1000, }); w.on("aggregated", () => { expect(true).toBe(false); done(new Error("should not fire")); }); testHelper.dir("dir"); testHelper.dir("dir/b"); testHelper.dir("dir/b/sub"); testHelper.file("dir/b/sub/file"); testHelper.file("dir/b/file"); testHelper.dir("dir/b1"); testHelper.dir("dir/b1/sub"); testHelper.file("dir/b1/sub/file"); testHelper.file("dir/b1/file"); testHelper.dir("dir/b2"); testHelper.dir("dir/b2/sub"); testHelper.file("dir/b2/sub/file"); testHelper.file("dir/b2/file"); testHelper.file("dir/a"); testHelper.file("dir/a1"); testHelper.file("dir/a2"); testHelper.tick(() => { w.watch({ files: [ path.join(fixtures, "dir", "a"), path.join(fixtures, "dir", "a1"), ], directories: [ path.join(fixtures, "dir", "b"), path.join(fixtures, "dir", "b1"), ], missing: [ path.join(fixtures, "dir", "c"), path.join(fixtures, "dir", "c1"), ], }); testHelper.tick(() => { w.watch({ files: [ path.join(fixtures, "dir", "a"), path.join(fixtures, "dir", "a2"), ], directories: [ path.join(fixtures, "dir", "b"), path.join(fixtures, "dir", "b2"), ], missing: [ path.join(fixtures, "dir", "c"), path.join(fixtures, "dir", "c2"), ], }); testHelper.file("dir/b1/sub/file"); testHelper.file("dir/a1"); testHelper.file("dir/c1"); testHelper.tick(2000, () => { // no event fired w.close(); done(); }); }); }); }); let symlinksSupported = false; try { const fs = require("fs"); fs.symlinkSync("helpers", path.join(__dirname, "fixtures"), "dir"); fs.unlinkSync(path.join(__dirname, "fixtures")); symlinksSupported = true; } catch (_err) { // ignore } if (symlinksSupported) { describe("symlinks", () => { beforeEach((done) => { testHelper.dir("a"); testHelper.dir(path.join("a", "b")); testHelper.file(path.join("a", "b", "c")); testHelper.file(path.join("a", "b", "d")); testHelper.symlinkDir("link", "a"); testHelper.symlinkDir(path.join("a", "link"), "b"); testHelper.symlinkFile(path.join("a", "b", "link"), "c"); testHelper.symlinkFile(path.join("a", "b", "link2"), "link"); testHelper.symlinkFile("link2", "link/link/link2"); testHelper.tick(1000, done); }); /** * @param {string | string[]} files files * @param {string | string[]} dirs dirs * @param {(changes: Changes) => void} callback callback * @param {() => void} ready ready callback */ function expectWatchEvent(files, dirs, callback, ready) { const w = new WatchpackTest({ aggregateTimeout: 500, followSymlinks: true, }); if (typeof files === "string") { files = [files]; } if (typeof dirs === "string") { dirs = [dirs]; } w.watch([...files], [...dirs], Date.now()); let active = false; let closed = false; w.on("aggregated", (changes) => { w.close(); closed = true; if (!active) throw new Error("Events are not expected yet"); callback(changes); }); testHelper.tick(1000, () => { if (closed) return; active = true; ready(); }); } it("should detect a change to the original file", (done) => { expectWatchEvent( path.join(fixtures, "link2"), [], (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link2")]); done(); }, () => { testHelper.file(path.join("a", "b", "c")); }, ); }); it("should detect a change to the direct symlink", (done) => { expectWatchEvent( path.join(fixtures, "link2"), [], (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link2")]); done(); }, () => { testHelper.unlink("link2"); testHelper.symlinkFile("link2", path.join("a", "b", "d")); }, ); }); it("should detect a change to the double symlink", (done) => { expectWatchEvent( path.join(fixtures, "link2"), [], (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link2")]); done(); }, () => { testHelper.unlink(path.join("a", "b", "link2")); testHelper.symlinkFile(path.join("a", "b", "link2"), "d"); }, ); }); it("should detect a change to the directory symlink", (done) => { expectWatchEvent( path.join(fixtures, "link2"), [], (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link2")]); done(); }, () => { testHelper.unlink(path.join("a", "link")); testHelper.symlinkDir(path.join("a", "link"), path.join("b", "d")); }, ); }); it("should detect a file change in a watched symlinked directory", (done) => { expectWatchEvent( [], path.join(fixtures, "link"), (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link")]); done(); }, () => { testHelper.file(path.join("a", "b", "c")); }, ); }); it("should detect a symlink file change in a watched symlinked directory", (done) => { expectWatchEvent( [], path.join(fixtures, "link"), (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link")]); done(); }, () => { testHelper.unlink(path.join("a", "b", "link2")); testHelper.symlinkFile(path.join("a", "b", "link2"), "d"); }, ); }); it("should detect a symlink dir change in a watched symlinked directory", (done) => { expectWatchEvent( [], path.join(fixtures, "link"), (changes) => { expect([...changes]).toEqual([path.join(fixtures, "link")]); done(); }, () => { testHelper.unlink(path.join("a", "link")); testHelper.symlinkDir(path.join("a", "link"), path.join("b", "d")); }, ); }); it("should detect a change to a symlink target file inside a watched real directory (#190)", (done) => { testHelper.file("ext_target"); testHelper.symlinkFile( path.join("a", "b", "ext_link"), path.join("..", "..", "ext_target"), ); testHelper.tick(2500, () => { expectWatchEvent( [], path.join(fixtures, "a", "b"), (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a", "b")]); done(); }, () => { testHelper.file("ext_target"); }, ); }); }); it("should detect a change inside a symlinked directory nested in a watched real directory (#190)", (done) => { testHelper.dir("ext_dir"); testHelper.file(path.join("ext_dir", "inner")); testHelper.symlinkDir( path.join("a", "b", "ext_dir_link"), path.join("..", "..", "ext_dir"), ); testHelper.tick(2500, () => { expectWatchEvent( [], path.join(fixtures, "a", "b"), (changes) => { expect([...changes]).toEqual([path.join(fixtures, "a", "b")]); done(); }, () => { testHelper.file(path.join("ext_dir", "inner")); }, ); }); }); it("should report the symlink path (not the resolved target) for files inside a symlinked directory (#231)", (done) => { testHelper.dir("ext_dir"); testHelper.file(path.join("ext_dir", "inner")); testHelper.symlinkDir( path.join("a", "b", "ext_dir_link"), path.join("..", "..", "ext_dir"), ); testHelper.tick(2500, () => { const w = new WatchpackTest({ aggregateTimeout: 500, followSymlinks: true, }); /** @type {string[]} */ const fileChanges = []; w.on("change", (file) => { fileChanges.push(file); }); w.watch([], [path.join(fixtures, "a", "b")], Date.now()); testHelper.tick(1000, () => { testHelper.file(path.join("ext_dir", "inner")); testHelper.tick(2000, () => { const symlinkPath = path.join( fixtures, "a", "b", "ext_dir_link", "inner", ); const resolvedPath = path.join(fixtures, "ext_dir", "inner"); expect(fileChanges).toContain(symlinkPath); expect(fileChanges).not.toContain(resolvedPath); w.close(); done(); }); }); }); }); it("should not recurse infinitely when a symlinked directory points to one of its ancestors (#231 cycle guard)", (done) => { // fixtures/a/b/cycle is a symlink to ".." (i.e. fixtures/a). Without // a cycle guard, descent would walk a/b/cycle -> a/b/cycle/b -> // a/b/cycle/b/cycle -> ... creating an unbounded chain of watchers. testHelper.symlinkDir(path.join("a", "b", "cycle"), ".."); testHelper.tick(500, () => { const w = new WatchpackTest({ aggregateTimeout: 500, followSymlinks: true, }); w.watch([], [path.join(fixtures, "a", "b")], Date.now()); testHelper.tick(2000, () => { // With the guard the descent stops at the cycle, so the // `WatcherManager` only tracks a small, bounded number of // `DirectoryWatcher`s. Without it, every recursion level adds // a new entry and the size grows into the hundreds within // a couple of seconds (locally observed: 2500+ at 2s). expect(w.watcherManager.directoryWatchers.size).toBeLessThan(10); w.close(); done(); }); }); }); it("should evaluate `ignored` against the symlink path for files inside a symlinked directory (#231)", (done) => { testHelper.dir("ext_dir"); testHelper.file(path.join("ext_dir", "inner")); testHelper.symlinkDir( path.join("a", "b", "ext_dir_link"), path.join("..", "..", "ext_dir"), ); testHelper.tick(2500, () => { const allowedPrefix = path.join(fixtures, "a", "b"); const allowedWithSep = allowedPrefix + path.sep; /** @type {string[]} */ const ignoredQueries = []; const w = new WatchpackTest({ aggregateTimeout: 500, followSymlinks: true, // Mirror issue #231 example 2: allow only the watched root, the // ancestors of `a/b`, `a/b` itself, and anything under it. The // resolved target `fixtures/ext_dir/...` lies outside this allowlist. ignored: (entry) => { ignoredQueries.push(entry); if (entry === allowedPrefix) return false; if (entry.startsWith(allowedWithSep)) return false; // allow ancestors of the allowed prefix so we can descend into it if (allowedWithSep.startsWith(entry + path.sep)) return false; return true; }, }); /** @type {string[]} */ const fileChanges = []; w.on("change", (file) => { fileChanges.push(file); }); w.watch([], [fixtures], Date.now()); testHelper.tick(1000, () => { testHelper.file(path.join("ext_dir", "inner")); testHelper.tick(2000, () => { const symlinkPath = path.join( fixtures, "a", "b", "ext_dir_link", "inner", ); const resolvedPath = path.join(fixtures, "ext_dir", "inner"); expect(fileChanges).toContain(symlinkPath); expect(fileChanges).not.toContain(resolvedPath); // `ignored` must have been queried with the symlink-preserving // path so the user's allowlist works as documented in #231. expect(ignoredQueries).toContain(symlinkPath); expect(ignoredQueries).not.toContain(resolvedPath); w.close(); done(); }); }); }); }); }); } else { it("symlinks", () => { expect(true).toBe(true); }); } }); watchpack-2.5.2/test/WatchpackUnit.test.js000066400000000000000000000362521521250557700205460ustar00rootroot00000000000000"use strict"; const fs = require("fs"); const path = require("path"); const Watchpack = require("../lib"); describe("Watchpack unit", () => { it("should throw when ignored is an invalid value (number)", () => { expect( () => new Watchpack({ // @ts-expect-error intentionally invalid ignored: 123, }), ).toThrow(/Invalid option for 'ignored'/); }); it("should throw when ignored is an invalid value (object)", () => { expect( () => new Watchpack({ // @ts-expect-error intentionally invalid ignored: { not: "valid" }, }), ).toThrow(/Invalid option for 'ignored'/); }); it("should use default options when none provided", () => { const w = new Watchpack(); expect(w.aggregateTimeout).toBe(200); expect(w.paused).toBe(false); expect(w.startTime).toBeUndefined(); expect(w.watcherOptions.followSymlinks).toBe(false); expect(typeof w.watcherOptions.ignored).toBe("function"); expect(w.watcherOptions.ignored("anything")).toBe(false); w.close(); }); it("should honour custom aggregateTimeout", () => { const w = new Watchpack({ aggregateTimeout: 500 }); expect(w.aggregateTimeout).toBe(500); w.close(); }); it("should cache normalized options on same options object", () => { const options = { aggregateTimeout: 100 }; const w1 = new Watchpack(options); const w2 = new Watchpack(options); expect(w1.watcherOptions).toBe(w2.watcherOptions); w1.close(); w2.close(); }); it("should accept a RegExp ignored option", () => { const w = new Watchpack({ ignored: /ignoredPattern/ }); expect(w.watcherOptions.ignored("/foo/ignoredPattern/bar")).toBe(true); expect(w.watcherOptions.ignored("/foo/keep")).toBe(false); w.close(); }); it("should accept a function ignored option", () => { /** @type {(entry: string) => boolean} */ const ignored = (entry) => entry.includes("skip"); const w = new Watchpack({ ignored }); expect(w.watcherOptions.ignored).toBe(ignored); w.close(); }); it("should treat empty ignored array as matching nothing", () => { const w = new Watchpack({ ignored: [] }); expect(w.watcherOptions.ignored("any")).toBe(false); w.close(); }); it("should treat array of empty strings as matching nothing", () => { const w = new Watchpack({ ignored: ["", "", ""] }); expect(w.watcherOptions.ignored("any")).toBe(false); w.close(); }); it("should treat empty ignored string as matching nothing", () => { const w = new Watchpack({ ignored: "" }); expect(w.watcherOptions.ignored("any")).toBe(false); w.close(); }); it("should combine multiple ignored globs", () => { const w = new Watchpack({ ignored: ["**/foo", "**/bar"] }); expect(w.watcherOptions.ignored("/x/foo")).toBe(true); expect(w.watcherOptions.ignored("/x/bar")).toBe(true); expect(w.watcherOptions.ignored("/x/baz")).toBe(false); w.close(); }); it("should normalize backslashes in paths against regex ignores", () => { const w = new Watchpack({ ignored: "**/foo" }); expect(w.watcherOptions.ignored("C:\\x\\foo")).toBe(true); w.close(); }); it("should allow calling pause with no aggregate timer", () => { const w = new Watchpack(); // Just calling pause without any events should be a no-op w.pause(); expect(w.paused).toBe(true); w.close(); }); it("getAggregated should return empty sets initially", () => { const w = new Watchpack(); const { changes, removals } = w.getAggregated(); expect([...changes]).toEqual([]); expect([...removals]).toEqual([]); w.close(); }); it("getAggregated should swap and clear internal sets, and stop the aggregation timer", () => { const w = new Watchpack({ aggregateTimeout: 100000 }); // Simulate an internal change event while not paused to start the timer w.paused = false; w._onChange("/tmp/a", 1, "/tmp/a", "change"); w._onRemove("/tmp/b", "/tmp/b", "change"); expect(w.aggregateTimer).toBeDefined(); const { changes, removals } = w.getAggregated(); expect([...changes]).toEqual(["/tmp/a"]); expect([...removals]).toEqual(["/tmp/b"]); expect(w.aggregateTimer).toBeUndefined(); // Now subsequent getAggregated should be empty const next = w.getAggregated(); expect([...next.changes]).toEqual([]); expect([...next.removals]).toEqual([]); w.close(); }); it("_onChange should not emit while paused but still track changes", () => { const w = new Watchpack(); w.paused = true; let emitted = false; w.on("change", () => { emitted = true; }); w._onChange("/tmp/file", 1, "/tmp/file", "change"); expect(emitted).toBe(false); expect(w.aggregatedChanges.has("/tmp/file")).toBe(true); w.close(); }); it("_onRemove should not emit while paused but still track removals", () => { const w = new Watchpack(); w.paused = true; let emitted = false; w.on("remove", () => { emitted = true; }); w._onRemove("/tmp/file", "/tmp/file", "change"); expect(emitted).toBe(false); expect(w.aggregatedRemovals.has("/tmp/file")).toBe(true); w.close(); }); it("_onChange cancels a pending removal for the same item", () => { const w = new Watchpack(); w.paused = true; w._onRemove("/tmp/file", "/tmp/file", "change"); expect(w.aggregatedRemovals.has("/tmp/file")).toBe(true); w._onChange("/tmp/file", 1, "/tmp/file", "change"); expect(w.aggregatedRemovals.has("/tmp/file")).toBe(false); expect(w.aggregatedChanges.has("/tmp/file")).toBe(true); w.close(); }); it("_onRemove cancels a pending change for the same item", () => { const w = new Watchpack(); w.paused = true; w._onChange("/tmp/file", 1, "/tmp/file", "change"); expect(w.aggregatedChanges.has("/tmp/file")).toBe(true); w._onRemove("/tmp/file", "/tmp/file", "change"); expect(w.aggregatedChanges.has("/tmp/file")).toBe(false); expect(w.aggregatedRemovals.has("/tmp/file")).toBe(true); w.close(); }); it("_onChange falls back to item when file is falsy", (done) => { const w = new Watchpack({ aggregateTimeout: 50 }); w.on("change", (file) => { expect(file).toBe("/tmp/item"); w.close(); done(); }); w._onChange( "/tmp/item", 1, /** @type {string} */ (/** @type {unknown} */ (undefined)), "change", ); }); it("_onRemove falls back to item when file is falsy", (done) => { const w = new Watchpack({ aggregateTimeout: 50 }); w.on("remove", (file) => { expect(file).toBe("/tmp/item"); w.close(); done(); }); w._onRemove( "/tmp/item", /** @type {string} */ (/** @type {unknown} */ (undefined)), "change", ); }); it("_onTimeout emits aggregated and clears state", (done) => { const w = new Watchpack({ aggregateTimeout: 10000 }); w.paused = true; w._onChange("/tmp/change", 1, "/tmp/change", "change"); w._onRemove("/tmp/remove", "/tmp/remove", "change"); w.on("aggregated", (changes, removals) => { expect([...changes]).toEqual(["/tmp/change"]); expect([...removals]).toEqual(["/tmp/remove"]); expect(w.aggregateTimer).toBeUndefined(); // sets have been reset expect(w.aggregatedChanges.size).toBe(0); expect(w.aggregatedRemovals.size).toBe(0); w.close(); done(); }); w._onTimeout(); }); it("getTimes returns an empty prototype-less object with no watchers", () => { const w = new Watchpack(); const times = w.getTimes(); expect(Object.getPrototypeOf(times)).toBeNull(); expect(Object.keys(times)).toEqual([]); w.close(); }); it("getTimeInfoEntries returns empty Map with no watchers", () => { const w = new Watchpack(); const entries = w.getTimeInfoEntries(); expect(entries).toBeInstanceOf(Map); expect(entries.size).toBe(0); w.close(); }); it("collectTimeInfoEntries populates nothing with no watchers", () => { const w = new Watchpack(); const files = new Map(); const dirs = new Map(); w.collectTimeInfoEntries(files, dirs); expect(files.size).toBe(0); expect(dirs.size).toBe(0); w.close(); }); it("close() on an unused Watchpack should be safe", () => { const w = new Watchpack(); w.close(); // Idempotent close w.close(); expect(w.paused).toBe(true); }); it("close() clears a running aggregate timer", () => { const w = new Watchpack({ aggregateTimeout: 100000 }); w._onChange("/tmp/a", 1, "/tmp/a", "change"); expect(w.aggregateTimer).toBeDefined(); w.close(); // timer is cleared by close expect(w.paused).toBe(true); }); }); describe("Watchpack internal watcher classes", () => { /** * @template T * @param {T | undefined} v value * @returns {T} value narrowed to non-undefined */ const ensure = (v) => { if (v === undefined) throw new Error("value is undefined"); return v; }; it("watchpackFileWatcher.update handles single-file -> array transition", () => { const { EventEmitter } = require("events"); // Reach in to the internal class via a minimal Watcher stand-in const w = new Watchpack(); // Build a fake underlying watcher with only on/close const fakeWatcher = Object.assign(new EventEmitter(), { close() {}, }); // Construct WatchpackFileWatcher using Reflect, fetched through // an internal use by watching a path const file = path.join(__dirname, "fixtures", "nonexistent-xxx"); w.watch([file], []); const fw = ensure(w.fileWatchers.get(file)); expect(fw.files).toEqual([file]); // Single -> same single: no-op branch fw.update(file); expect(fw.files).toEqual([file]); // Single -> single (different): replace in place fw.update(`${file}-b`); expect(fw.files).toEqual([`${file}-b`]); // Single -> array: length differs, go to array branch fw.update([`${file}-b`, `${file}-c`]); expect(fw.files).toEqual([`${file}-b`, `${file}-c`]); // Array -> array fw.update([`${file}-b`, `${file}-d`]); expect(fw.files).toEqual([`${file}-b`, `${file}-d`]); // Array -> single: length !== 1, replace with [single] fw.update(`${file}-e`); expect(fw.files).toEqual([`${file}-e`]); // Reference the fakeWatcher to avoid unused-var lint expect(fakeWatcher).toBeDefined(); w.close(); }); it("watchpackDirectoryWatcher.update handles single-dir -> array transition", () => { const w = new Watchpack(); const dir = path.join(__dirname, "fixtures", "dir-nonexistent-x"); w.watch([], [dir]); const dw = ensure(w.directoryWatchers.get(dir)); expect(dw.directories).toEqual([dir]); dw.update(dir); expect(dw.directories).toEqual([dir]); dw.update(`${dir}-b`); expect(dw.directories).toEqual([`${dir}-b`]); dw.update([`${dir}-b`, `${dir}-c`]); expect(dw.directories).toEqual([`${dir}-b`, `${dir}-c`]); dw.update([`${dir}-b`, `${dir}-d`]); expect(dw.directories).toEqual([`${dir}-b`, `${dir}-d`]); dw.update(`${dir}-e`); expect(dw.directories).toEqual([`${dir}-e`]); w.close(); }); it("watchpackFileWatcher.initial-missing emits remove for each tracked file", () => { const w = new Watchpack(); const file = path.join(__dirname, "fixtures", "init-missing"); w.watch([file], []); const fw = ensure(w.fileWatchers.get(file)); // Simulate multiple tracked files fw.files = [file, `${file}-2`]; let removeCount = 0; w.on("remove", () => { removeCount++; }); fw.watcher.emit("initial-missing", "scan (missing)"); expect(removeCount).toBe(2); w.close(); }); it("watchpackFileWatcher.change emits for each tracked file", () => { const w = new Watchpack(); const file = path.join(__dirname, "fixtures", "change-multi"); w.watch([file], []); const fw = ensure(w.fileWatchers.get(file)); fw.files = [file, `${file}-2`]; let changeCount = 0; w.on("change", () => { changeCount++; }); fw.watcher.emit("change", Date.now(), "change", false); expect(changeCount).toBe(2); w.close(); }); it("watchpackFileWatcher.remove emits for each tracked file", () => { const w = new Watchpack(); const file = path.join(__dirname, "fixtures", "remove-multi"); w.watch([file], []); const fw = ensure(w.fileWatchers.get(file)); fw.files = [file, `${file}-2`]; let removeCount = 0; w.on("remove", () => { removeCount++; }); /** @type {import("events").EventEmitter} */ (fw.watcher).emit("remove", "remove"); expect(removeCount).toBe(2); w.close(); }); it("watch() groups multiple paths that resolve to the same underlying watcher", () => { const w = new Watchpack(); const dirA = path.join(__dirname, "fixtures", "dir-same"); const dirB = path.join(__dirname, "fixtures", "dir-same"); // Watching the same directory twice exercises the addToMap array branch w.watch([], [dirA, dirB]); const dw = ensure(w.directoryWatchers.get(dirA)); // Two entries with same key become an array expect(Array.isArray(dw.directories) ? dw.directories.length : 1).toBe(2); w.close(); }); it("watch() groups three or more paths that resolve to the same underlying watcher", () => { const w = new Watchpack(); const dir = path.join(__dirname, "fixtures", "dir-triple"); // Three identical entries exercise the Array.isArray -> push branch w.watch([], [dir, dir, dir]); const dw = ensure(w.directoryWatchers.get(dir)); expect(Array.isArray(dw.directories) ? dw.directories.length : 1).toBe(3); w.close(); }); it("watch() can change from a directory-only set to a file-only set", () => { const w = new Watchpack(); const target = path.join(__dirname, "fixtures", "dir-toggle"); w.watch([], [target]); expect(w.directoryWatchers.has(target)).toBe(true); // Now watch same path as a file only, clearing directory watcher w.watch([target], []); expect(w.directoryWatchers.has(target)).toBe(false); expect(w.fileWatchers.has(target)).toBe(true); // Then stop watching the file w.watch([], []); expect(w.fileWatchers.has(target)).toBe(false); w.close(); }); let symlinksSupported = false; try { fs.symlinkSync("helpers", path.join(__dirname, "fixtures"), "dir"); fs.unlinkSync(path.join(__dirname, "fixtures")); symlinksSupported = true; } catch (_err) { // ignore } if (symlinksSupported) { it("watch() with followSymlinks handles files, missing, and directories", () => { const w = new Watchpack({ followSymlinks: true }); // Use non-existent paths — LinkResolver.resolve will fall through // ENOENT branches and still return the input path as the only entry const file = path.join(__dirname, "fixtures", "no-file-sym"); const dir = path.join(__dirname, "fixtures", "no-dir-sym"); const missing = path.join(__dirname, "fixtures", "no-missing-sym"); w.watch({ files: [file], directories: [dir], missing: [missing], }); // Missing is part of the internal state expect(w._missing.has(missing)).toBe(true); w.close(); }); } else { it("followSymlinks (symlinks not supported in this environment)", () => { expect(symlinksSupported).toBe(false); }); } it("watchpackDirectoryWatcher events emit per tracked directory", () => { const w = new Watchpack(); const dir = path.join(__dirname, "fixtures", "dir-events"); w.watch([], [dir]); const dw = ensure(w.directoryWatchers.get(dir)); dw.directories = [dir, `${dir}-2`]; let changeCount = 0; let removeCount = 0; w.on("change", () => { changeCount++; }); w.on("remove", () => { removeCount++; }); dw.watcher.emit("change", "file-a", Date.now(), "change", false); expect(changeCount).toBe(2); dw.watcher.emit("initial-missing", "scan (missing)"); expect(removeCount).toBe(2); removeCount = 0; /** @type {import("events").EventEmitter} */ (dw.watcher).emit("remove", "remove"); expect(removeCount).toBe(2); w.close(); }); }); watchpack-2.5.2/test/getWatcherManager.test.js000066400000000000000000000021101521250557700213530ustar00rootroot00000000000000"use strict"; const path = require("path"); const getWatcherManager = require("../lib/getWatcherManager"); describe("getWatcherManager", () => { it("should cache the WatcherManager for a given options reference", () => { const options = { followSymlinks: false }; const wm1 = getWatcherManager(options); const wm2 = getWatcherManager(options); expect(wm2).toBe(wm1); }); it("should create a new WatcherManager for a new options reference", () => { const wm1 = getWatcherManager({}); const wm2 = getWatcherManager({}); expect(wm2).not.toBe(wm1); }); it("watcherManager constructor defaults options to an empty object", () => { const { WatcherManager } = getWatcherManager; const wm = new WatcherManager(); expect(wm.options).toEqual({}); expect(wm.directoryWatchers).toBeInstanceOf(Map); }); it("watchFile returns null when the file is its own directory (filesystem root)", () => { const { WatcherManager } = getWatcherManager; const wm = new WatcherManager({}); const { root } = path.parse(process.cwd()); expect(wm.watchFile(root)).toBeNull(); }); }); watchpack-2.5.2/test/helpers/000077500000000000000000000000001521250557700161175ustar00rootroot00000000000000watchpack-2.5.2/test/helpers/TestHelper.js000066400000000000000000000112021521250557700205300ustar00rootroot00000000000000"use strict"; /* global expect */ const fs = require("fs"); const path = require("path"); // @ts-expect-error no need extra types const writeFileAtomic = require("write-file-atomic"); /** @typedef {import("../../lib/getWatcherManager").DirectoryWatcherOptions} DirectoryWatcherOptions */ /** @typedef {import("../../lib/getWatcherManager").WatcherManager} WatcherManager */ const watchEventSource = require("../../lib/watchEventSource"); const IS_OSX = require("os").platform() === "darwin"; require("../../lib/getWatcherManager"); let watcherManagerModule = require.cache[require.resolve("../../lib/getWatcherManager")]; /** @type {Set} */ const allWatcherManager = new Set(); // @ts-expect-error for tests const oldFn = watcherManagerModule.exports; // @ts-expect-error for tests watcherManagerModule = (options) => { const watcherManager = oldFn(options); allWatcherManager.add(watcherManager); }; const checkAllWatcherClosed = () => { for (const watcherManager of allWatcherManager) { expect([...watcherManager.directoryWatchers.keys()]).toEqual([]); } expect(watchEventSource.getNumberOfWatchers()).toBe(0); }; class TestHelper { /** * @param {string} testdir testdir */ constructor(testdir) { this.testdir = testdir; } /** * @param {number | (() => void)} arg arg * @param {() => void=} fn fn */ tick(arg, fn) { // if polling is set, ensure the tick is longer than the polling interval. // On macOS the FSEvents dispatch cycle is ~100-500ms, so use a larger // default tick there to keep fs.watch-based tests stable. const defaultTick = (Number(process.env.WATCHPACK_POLLING) || (IS_OSX ? 250 : 100)) + 10; if (typeof arg === "function") { fn = arg; arg = defaultTick; } setTimeout(() => { /** @type {() => void} */ (fn)(); }, arg); } /** * @param {() => void} done done */ before(done) { checkAllWatcherClosed(); this.tick(IS_OSX ? 700 : 400, () => { this.rm(this.testdir); fs.mkdirSync(this.testdir); done(); }); } /** * @param {() => void} done done */ after(done) { let i = 0; const del = () => { try { this.rm(this.testdir); } catch (err) { if (i++ > 20) throw err; this.tick(100, del.bind(this)); return; } checkAllWatcherClosed(); this.tick(IS_OSX ? 500 : 300, done); }; this.tick(IS_OSX ? 500 : 300, () => { del(); }); } /** * @param {string} name name */ dir(name) { fs.mkdirSync(path.join(this.testdir, name)); } /** * @param {string} orig orig * @param {string} dest dest */ rename(orig, dest) { fs.renameSync(path.join(this.testdir, orig), path.join(this.testdir, dest)); } /** * @param {string} path path to remove */ rm(path) { // eslint-disable-next-line n/no-unsupported-features/node-builtins if (typeof fs.rmSync === "function") { // eslint-disable-next-line n/no-unsupported-features/node-builtins fs.rmSync(path, { force: true, recursive: true }); return; } // For very old Node.js versions // @ts-expect-error for old Node.js versions // eslint-disable-next-line import/no-unresolved require("rimraf").sync(path); } /** * @param {string} name name */ file(name) { fs.writeFileSync(path.join(this.testdir, name), `${Math.random()}`, "utf8"); } /** * @param {string} name name */ fileAtomic(name) { writeFileAtomic.sync( path.join(this.testdir, name), `${Math.random()}`, "utf8", ); } /** * @param {string} name name */ accessFile(name) { const stat = fs.statSync(path.join(this.testdir, name)); fs.utimesSync( path.join(this.testdir, name), new Date(Date.now() - 1000 * 60 * 60 * 24), stat.mtime, ); fs.readFileSync(path.join(this.testdir, name)); } /** * @param {string} name name * @param {string} target target */ symlinkFile(name, target) { fs.symlinkSync(target, path.join(this.testdir, name), "file"); } /** * @param {string} name name * @param {string} target target */ symlinkDir(name, target) { fs.symlinkSync(target, path.join(this.testdir, name), "dir"); } /** * @param {string} name name */ unlink(name) { fs.unlinkSync(path.join(this.testdir, name)); } /** * @param {string} name name * @param {number} mtime mtime */ mtime(name, mtime) { const stats = fs.statSync(path.join(this.testdir, name)); fs.utimesSync(path.join(this.testdir, name), stats.atime, new Date(mtime)); } /** * @param {string} name name */ remove(name) { this.rm(path.join(this.testdir, name)); } getNumberOfWatchers() { let count = 0; for (const watcherManager of allWatcherManager) { count += watcherManager.directoryWatchers.size; } return count; } } module.exports = TestHelper; watchpack-2.5.2/test/reducePlan.test.js000066400000000000000000000060741521250557700200620ustar00rootroot00000000000000"use strict"; const path = require("path"); const reducePlan = require("../lib/reducePlan"); const { sep } = path; const root = path.resolve(sep); describe("reducePlan", () => { it("should return an empty plan when input is empty", () => { const result = reducePlan(new Map(), 10); expect(result.size).toBe(0); }); it("should not reduce when count is at or below limit", () => { const plan = new Map([ [path.join(root, "a", "b"), "v1"], [path.join(root, "a", "c"), "v2"], ]); const result = reducePlan(plan, 10); // Both entries remain as separate groups expect(result.size).toBe(2); const first = /** @type {Map} */ (result.get(path.join(root, "a", "b"))); expect(first).toBeInstanceOf(Map); expect(first.get("v1")).toBe(path.join(root, "a", "b")); }); it("should merge child entries under a common parent when over the limit", () => { const plan = new Map(); for (let i = 0; i < 20; i++) { plan.set(path.join(root, "parent", `child${i}`), `v${i}`); } const result = reducePlan(plan, 1); // A single merged plan with the parent as root expect(result.size).toBe(1); const [[rootTarget, entryMap]] = [...result]; expect(rootTarget).toBe(path.join(root, "parent")); expect(entryMap.size).toBe(20); for (let i = 0; i < 20; i++) { expect(entryMap.get(`v${i}`)).toBe( path.join(root, "parent", `child${i}`), ); } }); it("should support array values at a node", () => { const plan = new Map(); plan.set(path.join(root, "p", "a"), ["v1", "v2"]); plan.set(path.join(root, "p", "b"), "v3"); plan.set(path.join(root, "p", "c"), "v4"); const result = reducePlan(plan, 1); expect(result.size).toBe(1); const [entryMap] = [...result.values()]; expect(entryMap.size).toBe(4); }); it("should merge partially when limit allows keeping some entries separate", () => { const plan = new Map(); // Two separate subtrees plan.set(path.join(root, "sub1", "a"), "a1"); plan.set(path.join(root, "sub1", "b"), "a2"); plan.set(path.join(root, "sub2", "a"), "b1"); plan.set(path.join(root, "sub2", "b"), "b2"); const result = reducePlan(plan, 2); // Should merge each subtree into one expect(result.size).toBeGreaterThanOrEqual(1); let total = 0; for (const entryMap of result.values()) { total += entryMap.size; } expect(total).toBe(4); }); it("should skip a single-child node with no value when selecting merges", () => { const plan = new Map(); // /r/a/c, /r/a/d -> /r/a has 2 children // /r/b -> 1 child plan.set(path.join(root, "r", "a", "c"), "c"); plan.set(path.join(root, "r", "a", "d"), "d"); plan.set(path.join(root, "r", "b"), "b"); const result = reducePlan(plan, 2); let total = 0; for (const entryMap of result.values()) { total += entryMap.size; } expect(total).toBe(3); }); it("should reduce with deep nesting", () => { const plan = new Map(); for (let i = 0; i < 6; i++) { plan.set(path.join(root, "x", "y", "z", `f${i}`), `v${i}`); } const result = reducePlan(plan, 1); const [entryMap] = [...result.values()]; expect(entryMap.size).toBe(6); }); }); watchpack-2.5.2/test/watchEventSource.test.js000066400000000000000000000142551521250557700212710ustar00rootroot00000000000000"use strict"; const fs = require("fs"); const path = require("path"); const watchEventSource = require("../lib/watchEventSource"); const TestHelper = require("./helpers/TestHelper"); const fixtures = path.join(__dirname, "fixtures"); const testHelper = new TestHelper(fixtures); // eslint-disable-next-line jest/no-confusing-set-timeout jest.setTimeout(10000); describe("watchEventSource", () => { beforeEach((done) => { testHelper.before(done); }); afterEach((done) => { testHelper.after(done); }); it("exposes the internal watcher limit constant", () => { expect(typeof watchEventSource.watcherLimit).toBe("number"); expect(watchEventSource.watcherLimit).toBeGreaterThan(0); }); it("exposes a Watcher class extending EventEmitter", () => { const { EventEmitter } = require("events"); expect(typeof watchEventSource.Watcher).toBe("function"); const w = new watchEventSource.Watcher(); expect(w).toBeInstanceOf(EventEmitter); // close before it is associated with any underlying watcher // (fallback branch that removes from pendingWatchers) // It is a pending watcher here since batch hasn't executed // emulate by putting it into the pending state via watch: const handle = watchEventSource.watch(path.join(fixtures, "never-created")); handle.close(); }); it("watch() returns a Watcher emitting change events for file writes", (done) => { testHelper.dir("ev"); const watched = path.join(fixtures, "ev"); testHelper.tick(300, () => { const w = watchEventSource.watch(watched); let done2 = false; w.on("change", () => { if (done2) return; done2 = true; expect(done2).toBe(true); w.close(); done(); }); testHelper.tick(200, () => { fs.writeFileSync(path.join(watched, "x"), "hello", "utf8"); }); }); }); it("watch() returns the same underlying watcher when called twice in batch for the same path", (done) => { testHelper.dir("shared"); const watched = path.join(fixtures, "shared"); testHelper.tick(300, () => { /** @type {import("../lib/watchEventSource").Watcher[]} */ const created = []; watchEventSource.batch(() => { created.push(watchEventSource.watch(watched)); created.push(watchEventSource.watch(watched)); }); const [a, b] = created; // Both watchers should fire on change let countA = 0; let countB = 0; a.on("change", () => { countA++; }); b.on("change", () => { countB++; }); testHelper.tick(200, () => { fs.writeFileSync(path.join(watched, "f"), "y", "utf8"); testHelper.tick(500, () => { expect(countA + countB).toBeGreaterThan(0); a.close(); b.close(); done(); }); }); }); }); it("watch() emits an error asynchronously when the path does not exist", (done) => { const w = watchEventSource.watch( path.join(fixtures, "definitely-not-here"), ); w.on("error", (err) => { expect(err).toBeDefined(); w.close(); done(); }); }); it("getNumberOfWatchers returns a non-negative count", () => { expect(watchEventSource.getNumberOfWatchers()).toBeGreaterThanOrEqual(0); }); it("batch propagates synchronous errors from the callback but still calls execute", () => { let executed = false; const orig = watchEventSource.watch; // Spy via patch: we reach execute() only by adding a pending watcher. try { expect(() => watchEventSource.batch(() => { // Add a pending watcher const handle = orig(path.join(fixtures, "batch-no-dir")); executed = true; // Close so execute doesn't actually create anything handle.close(); throw new Error("boom"); }), ).toThrow("boom"); } finally { expect(executed).toBe(true); } }); }); describe("watchEventSource.createHandleChangeEvent", () => { const { EventEmitter } = require("events"); /** * @returns {import("fs").FSWatcher} a minimal FSWatcher stand-in */ const makeFakeWatcher = () => /** @type {import("fs").FSWatcher} */ ( /** @type {unknown} */ (new EventEmitter()) ); it("forwards non-self-rename events unchanged", () => { const watcher = makeFakeWatcher(); const filePath = "/tmp/my-dir"; /** @type {[string, string][]} */ const received = []; const handle = watchEventSource.createHandleChangeEvent( watcher, filePath, (type, filename) => { received.push([type, filename]); }, ); handle("change", "inner.txt"); expect(received).toEqual([["change", "inner.txt"]]); }); it("forwards rename events for relative filenames", () => { const watcher = makeFakeWatcher(); const filePath = "/tmp/my-dir"; /** @type {[string, string][]} */ const received = []; const handle = watchEventSource.createHandleChangeEvent( watcher, filePath, (type, filename) => { received.push([type, filename]); }, ); handle("rename", "inner.txt"); expect(received).toEqual([["rename", "inner.txt"]]); }); it("suppresses self-rename events on non-osx platforms and emits EPERM", () => { const origPlatform = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(process, "platform")); Object.defineProperty(process, "platform", { value: "linux" }); try { // The createHandleChangeEvent closure captured IS_OSX at module load // time, so we cannot retroactively override it. We still exercise the // branch by calling on linux, where IS_OSX was false at load time. const watcher = makeFakeWatcher(); const filePath = path.resolve("/tmp/some-dir"); /** @type {NodeJS.ErrnoException | undefined} */ let errorSeen; watcher.on("error", (err) => { errorSeen = /** @type {NodeJS.ErrnoException} */ (err); }); /** @type {[string, string][]} */ const received = []; const handle = watchEventSource.createHandleChangeEvent( watcher, filePath, (type, filename) => { received.push([type, filename]); }, ); handle("rename", path.resolve("/tmp/some-dir")); // On linux the handler should have emitted an EPERM error and skipped if (require("os").platform() !== "darwin") { expect(errorSeen && errorSeen.code).toBe("EPERM"); expect(received).toEqual([]); } else { expect(errorSeen).toBeUndefined(); expect(received).toEqual([]); } } finally { Object.defineProperty(process, "platform", origPlatform); } }); }); watchpack-2.5.2/test/watchpack-reexport.test.js000066400000000000000000000005721521250557700216100ustar00rootroot00000000000000"use strict"; describe("watchpack re-export", () => { it("should re-export the same class as the main entry", () => { const WatchpackMain = require("../lib"); const WatchpackAlt = require("../lib/watchpack"); expect(WatchpackAlt).toBe(WatchpackMain); const instance = new WatchpackAlt(); expect(instance).toBeInstanceOf(WatchpackMain); instance.close(); }); }); watchpack-2.5.2/tsconfig.json000066400000000000000000000010051521250557700162010ustar00rootroot00000000000000{ "compilerOptions": { "target": "es2018", "module": "commonjs", "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "erasableSyntaxOnly": true, "verbatimModuleSyntax": true, "rewriteRelativeImportExtensions": true, "types": ["node"], "rootDir": "./lib", "outDir": "./types", "allowJs": true, "checkJs": true, "strict": true, "alwaysStrict": true, "declaration": true, "emitDeclarationOnly": true }, "include": ["./lib/**/*"] } watchpack-2.5.2/tsconfig.types.json000066400000000000000000000000361521250557700173470ustar00rootroot00000000000000{ "extends": "./tsconfig" } watchpack-2.5.2/tsconfig.types.test.json000066400000000000000000000002131521250557700203220ustar00rootroot00000000000000{ "extends": "./tsconfig", "compilerOptions": { "rootDir": "./", "types": ["node", "jest"] }, "include": ["./test/*.js"] } watchpack-2.5.2/types/000077500000000000000000000000001521250557700146425ustar00rootroot00000000000000watchpack-2.5.2/types/DirectoryWatcher.d.ts000066400000000000000000000236251521250557700207260ustar00rootroot00000000000000export = DirectoryWatcher; /** @typedef {Set} InitialScanRemoved */ /** * @typedef {object} WatchpackEvents * @property {(target: string, mtime: string, type: EventType, initial: boolean) => void} change change event * @property {() => void} closed closed event */ /** * @typedef {object} DirectoryWatcherOptions * @property {boolean=} followSymlinks true when need to resolve symlinks and watch symlink and real file, otherwise false * @property {IgnoredFunction=} ignored ignore some files from watching (glob pattern or regexp) * @property {number | boolean=} poll true when need to enable polling mode for watching, otherwise false */ /** * @extends {EventEmitter<{ [K in keyof WatchpackEvents]: Parameters }>} */ declare class DirectoryWatcher extends EventEmitter<{ /** * change event */ change: [ target: string, mtime: string, type: import("./index").EventType, initial: boolean, ]; /** * closed event */ closed: []; }> { /** * @param {WatcherManager} watcherManager a watcher manager * @param {string} directoryPath directory path * @param {DirectoryWatcherOptions=} options options */ constructor( watcherManager: WatcherManager, directoryPath: string, options?: DirectoryWatcherOptions | undefined, ); watcherManager: import("./getWatcherManager").WatcherManager; options: DirectoryWatcherOptions; path: string; /** @type {Map} */ files: Map; /** @type {Map} */ filesWithoutCase: Map; /** @type {Map | boolean>} */ directories: Map | boolean>; /** @type {Map>} */ _symlinkTargetWatchers: Map>; lastWatchEvent: number; initialScan: boolean; ignored: import("./index").IgnoredFunction; nestedWatching: boolean; /** @type {number | false} */ polledWatching: number | false; /** @type {undefined | NodeJS.Timeout} */ timeout: undefined | NodeJS.Timeout; /** @type {null | InitialScanRemoved} */ initialScanRemoved: null | InitialScanRemoved; /** @type {undefined | number} */ initialScanFinished: undefined | number; /** @type {Map | Watcher>>} */ watchers: Map< string, Set | Watcher> >; /** @type {Watcher | null} */ parentWatcher: Watcher | null; refs: number; /** @type {Map} */ _activeEvents: Map; closed: boolean; scanning: boolean; scanAgain: boolean; scanAgainInitial: boolean; createWatcher(): void; watcher: watchEventSource.Watcher | null | undefined; /** * @template {(watcher: Watcher) => void} T * @param {string} path path * @param {T} fn function */ forEachWatcher) => void>( path: string, fn: T, ): void; /** * @param {string} itemPath an item path * @param {boolean} initial true when initial, otherwise false * @param {EventType} type even type */ setMissing(itemPath: string, initial: boolean, type: EventType): void; /** * @param {string} target a target to set file time * @param {number} mtime mtime * @param {boolean} initial true when initial, otherwise false * @param {boolean} ignoreWhenEqual true to ignore when equal, otherwise false * @param {EventType} type type */ setFileTime( target: string, mtime: number, initial: boolean, ignoreWhenEqual: boolean, type: EventType, ): void; /** * @param {string} directoryPath directory path * @param {number} birthtime birthtime * @param {boolean} initial true when initial, otherwise false * @param {EventType} type even type */ setDirectory( directoryPath: string, birthtime: number, initial: boolean, type: EventType, ): void; /** * @param {string} directoryPath directory path */ createNestedWatcher(directoryPath: string): void; /** * @param {boolean} flag true when nested, otherwise false */ setNestedWatching(flag: boolean): void; /** * @param {string} target a target to watch * @param {number=} startTime start time * @returns {Watcher | Watcher} watcher */ watch( target: string, startTime?: number | undefined, ): Watcher | Watcher; /** * @param {EventType} eventType event type * @param {string=} filename filename */ onWatchEvent(eventType: EventType, filename?: string | undefined): void; /** * @param {unknown=} err error */ onWatcherError(err?: unknown | undefined): void; /** * @param {Error | NodeJS.ErrnoException=} err error */ onStatsError(err?: (Error | NodeJS.ErrnoException) | undefined): void; /** * @param {Error | NodeJS.ErrnoException=} err error */ onScanError(err?: (Error | NodeJS.ErrnoException) | undefined): void; onScanFinished(): void; /** * @param {string} reason a reason */ onDirectoryRemoved(reason: string): void; watchInParentDirectory(): void; /** * @param {boolean} initial true when initial, otherwise false */ doScan(initial: boolean): void; /** * @returns {Record} times */ getTimes(): Record; /** * @param {TimeInfoEntries} fileTimestamps file timestamps * @param {TimeInfoEntries} directoryTimestamps directory timestamps * @returns {number} safe time */ collectTimeInfoEntries( fileTimestamps: TimeInfoEntries, directoryTimestamps: TimeInfoEntries, ): number; close(): void; } declare namespace DirectoryWatcher { export { EXISTANCE_ONLY_TIME_ENTRY, Watcher, IgnoredFunction, EventType, TimeInfoEntries, Entry, ExistenceOnlyTimeEntry, OnlySafeTimeEntry, EventMap, WatcherManager, EventSourceWatcher, FileWatcherEvents, DirectoryWatcherEvents, InitialScanRemoved, WatchpackEvents, DirectoryWatcherOptions, }; } import { EventEmitter } from "events"; /** * @typedef {object} FileWatcherEvents * @property {(type: EventType) => void} initial-missing initial missing event * @property {(mtime: number, type: EventType, initial: boolean) => void} change change event * @property {(type: EventType) => void} remove remove event * @property {() => void} closed closed event */ /** * @typedef {object} DirectoryWatcherEvents * @property {(type: EventType) => void} initial-missing initial missing event * @property {((file: string, mtime: number, type: EventType, initial: boolean) => void)} change change event * @property {(type: EventType) => void} remove remove event * @property {() => void} closed closed event */ /** * @template {EventMap} T * @extends {EventEmitter<{ [K in keyof T]: Parameters }>} */ declare class Watcher extends EventEmitter<{ [K in keyof T]: Parameters; }> { /** * @param {DirectoryWatcher} directoryWatcher a directory watcher * @param {string} target a target to watch * @param {number=} startTime start time */ constructor( directoryWatcher: DirectoryWatcher, target: string, startTime?: number | undefined, ); directoryWatcher: DirectoryWatcher; path: string; startTime: number | undefined; /** * @param {number} mtime mtime * @param {boolean} initial true when initial, otherwise false * @returns {boolean} true of start time less than mtile, otherwise false */ checkStartTime(mtime: number, initial: boolean): boolean; close(): void; } import watchEventSource = require("./watchEventSource"); /** @typedef {import("./index").IgnoredFunction} IgnoredFunction */ /** @typedef {import("./index").EventType} EventType */ /** @typedef {import("./index").TimeInfoEntries} TimeInfoEntries */ /** @typedef {import("./index").Entry} Entry */ /** @typedef {import("./index").ExistenceOnlyTimeEntry} ExistenceOnlyTimeEntry */ /** @typedef {import("./index").OnlySafeTimeEntry} OnlySafeTimeEntry */ /** @typedef {import("./index").EventMap} EventMap */ /** @typedef {import("./getWatcherManager").WatcherManager} WatcherManager */ /** @typedef {import("./watchEventSource").Watcher} EventSourceWatcher */ /** @type {ExistenceOnlyTimeEntry} */ declare const EXISTANCE_ONLY_TIME_ENTRY: ExistenceOnlyTimeEntry; type IgnoredFunction = import("./index").IgnoredFunction; type EventType = import("./index").EventType; type TimeInfoEntries = import("./index").TimeInfoEntries; type Entry = import("./index").Entry; type ExistenceOnlyTimeEntry = import("./index").ExistenceOnlyTimeEntry; type OnlySafeTimeEntry = import("./index").OnlySafeTimeEntry; type EventMap = import("./index").EventMap; type WatcherManager = import("./getWatcherManager").WatcherManager; type EventSourceWatcher = import("./watchEventSource").Watcher; type FileWatcherEvents = { /** * initial missing event */ "initial-missing": (type: EventType) => void; /** * change event */ change: (mtime: number, type: EventType, initial: boolean) => void; /** * remove event */ remove: (type: EventType) => void; /** * closed event */ closed: () => void; }; type DirectoryWatcherEvents = { /** * initial missing event */ "initial-missing": (type: EventType) => void; /** * change event */ change: ( file: string, mtime: number, type: EventType, initial: boolean, ) => void; /** * remove event */ remove: (type: EventType) => void; /** * closed event */ closed: () => void; }; type InitialScanRemoved = Set; type WatchpackEvents = { /** * change event */ change: ( target: string, mtime: string, type: EventType, initial: boolean, ) => void; /** * closed event */ closed: () => void; }; type DirectoryWatcherOptions = { /** * true when need to resolve symlinks and watch symlink and real file, otherwise false */ followSymlinks?: boolean | undefined; /** * ignore some files from watching (glob pattern or regexp) */ ignored?: IgnoredFunction | undefined; /** * true when need to enable polling mode for watching, otherwise false */ poll?: (number | boolean) | undefined; }; watchpack-2.5.2/types/LinkResolver.d.ts000066400000000000000000000005741521250557700200610ustar00rootroot00000000000000export = LinkResolver; declare class LinkResolver { /** @type {Map} */ cache: Map; /** * @param {string} file path to file or directory * @returns {readonly string[]} array of file and all symlinks contributed in the resolving process (first item is the resolved file) */ resolve(file: string): readonly string[]; } watchpack-2.5.2/types/getWatcherManager.d.ts000066400000000000000000000041311521250557700210230ustar00rootroot00000000000000declare namespace _exports { export { EventMap, DirectoryWatcherOptions, DirectoryWatcherEvents, FileWatcherEvents, Watcher, }; } declare function _exports(options: DirectoryWatcherOptions): WatcherManager; declare namespace _exports { export { WatcherManager }; } export = _exports; type EventMap = import("./index").EventMap; type DirectoryWatcherOptions = import("./DirectoryWatcher").DirectoryWatcherOptions; type DirectoryWatcherEvents = import("./DirectoryWatcher").DirectoryWatcherEvents; type FileWatcherEvents = import("./DirectoryWatcher").FileWatcherEvents; type Watcher = import("./DirectoryWatcher").Watcher; /** @typedef {import("./index").EventMap} EventMap */ /** @typedef {import("./DirectoryWatcher").DirectoryWatcherOptions} DirectoryWatcherOptions */ /** @typedef {import("./DirectoryWatcher").DirectoryWatcherEvents} DirectoryWatcherEvents */ /** @typedef {import("./DirectoryWatcher").FileWatcherEvents} FileWatcherEvents */ /** * @template {EventMap} T * @typedef {import("./DirectoryWatcher").Watcher} Watcher */ declare class WatcherManager { /** * @param {DirectoryWatcherOptions=} options options */ constructor(options?: DirectoryWatcherOptions | undefined); options: DirectoryWatcher.DirectoryWatcherOptions; /** @type {Map} */ directoryWatchers: Map; /** * @param {string} directory a directory * @returns {DirectoryWatcher} a directory watcher */ getDirectoryWatcher(directory: string): DirectoryWatcher; /** * @param {string} file file * @param {number=} startTime start time * @returns {Watcher | null} watcher or null if file has no directory */ watchFile( file: string, startTime?: number | undefined, ): Watcher | null; /** * @param {string} directory directory * @param {number=} startTime start time * @returns {Watcher} watcher */ watchDirectory( directory: string, startTime?: number | undefined, ): Watcher; } import DirectoryWatcher = require("./DirectoryWatcher"); watchpack-2.5.2/types/index.d.ts000066400000000000000000000156241521250557700165530ustar00rootroot00000000000000declare namespace _exports { export { WatcherManager, DirectoryWatcher, DirectoryWatcherEvents, FileWatcherEvents, EventMap, Watcher, IgnoredFunction, Ignored, WatcherOptions, WatchOptions, NormalizedWatchOptions, EventType, Entry, OnlySafeTimeEntry, ExistenceOnlyTimeEntry, TimeInfoEntries, Changes, Removals, Aggregated, WatchMethodOptions, Times, WatchpackEvents, WatchpackExports, }; } declare const _exports: WatchpackExports; export = _exports; type WatcherManager = import("./getWatcherManager").WatcherManager; type DirectoryWatcher = import("./DirectoryWatcher"); type DirectoryWatcherEvents = import("./DirectoryWatcher").DirectoryWatcherEvents; type FileWatcherEvents = import("./DirectoryWatcher").FileWatcherEvents; type EventMap = Record any>; type Watcher = import("./DirectoryWatcher").Watcher; type IgnoredFunction = (item: string) => boolean; type Ignored = string[] | RegExp | string | IgnoredFunction; type WatcherOptions = { /** * true when need to resolve symlinks and watch symlink and real file, otherwise false */ followSymlinks?: boolean | undefined; /** * ignore some files from watching (glob pattern or regexp) */ ignored?: Ignored | undefined; /** * true when need to enable polling mode for watching, otherwise false */ poll?: (number | boolean) | undefined; }; type WatchOptions = WatcherOptions & { aggregateTimeout?: number; }; type NormalizedWatchOptions = { /** * true when need to resolve symlinks and watch symlink and real file, otherwise false */ followSymlinks: boolean; /** * ignore some files from watching (glob pattern or regexp) */ ignored: IgnoredFunction; /** * true when need to enable polling mode for watching, otherwise false */ poll?: (number | boolean) | undefined; }; type EventType = | `scan (${string})` | "change" | "rename" | `watch ${string}` | `directory-removed ${string}`; type Entry = { safeTime: number; timestamp: number; accuracy: number; }; type OnlySafeTimeEntry = { safeTime: number; }; type ExistenceOnlyTimeEntry = {}; type TimeInfoEntries = Map< string, Entry | OnlySafeTimeEntry | ExistenceOnlyTimeEntry | null >; type Changes = Set; type Removals = Set; type Aggregated = { changes: Changes; removals: Removals; }; type WatchMethodOptions = { files?: Iterable; directories?: Iterable; missing?: Iterable; startTime?: number; }; type Times = Record; type WatchpackEvents = { /** * change event */ change: (file: string, mtime: number, type: EventType) => void; /** * remove event */ remove: (file: string, type: EventType) => void; /** * aggregated event */ aggregated: (changes: Changes, removals: Removals) => void; }; type WatchpackExports = typeof Watchpack & { util: { readonly globToRegExp: typeof globToRegExp; }; }; /** * @typedef {object} WatchpackEvents * @property {(file: string, mtime: number, type: EventType) => void} change change event * @property {(file: string, type: EventType) => void} remove remove event * @property {(changes: Changes, removals: Removals) => void} aggregated aggregated event */ /** * @extends {EventEmitter<{ [K in keyof WatchpackEvents]: Parameters }>} */ declare class Watchpack extends EventEmitter<{ /** * change event */ change: [file: string, mtime: number, type: EventType]; /** * remove event */ remove: [file: string, type: EventType]; /** * aggregated event */ aggregated: [changes: Changes, removals: Removals]; }> { /** * @param {WatchOptions=} options options */ constructor(options?: WatchOptions | undefined); /** @type {WatchOptions} */ options: WatchOptions; aggregateTimeout: number; /** @type {NormalizedWatchOptions} */ watcherOptions: NormalizedWatchOptions; /** @type {WatcherManager} */ watcherManager: WatcherManager; /** @type {Map} */ fileWatchers: Map; /** @type {Map} */ directoryWatchers: Map; /** @type {Set} */ _missing: Set; startTime: number | undefined; paused: boolean; /** @type {Changes} */ aggregatedChanges: Changes; /** @type {Removals} */ aggregatedRemovals: Removals; /** @type {undefined | NodeJS.Timeout} */ aggregateTimer: undefined | NodeJS.Timeout; _onTimeout(): void; /** * @overload * @param {Iterable} arg1 files * @param {Iterable} arg2 directories * @param {number=} arg3 startTime * @returns {void} */ watch( arg1: Iterable, arg2: Iterable, arg3?: number | undefined, ): void; /** * @overload * @param {WatchMethodOptions} arg1 watch options * @returns {void} */ watch(arg1: WatchMethodOptions): void; close(): void; pause(): void; /** * @returns {Record} times */ getTimes(): Record; /** * @returns {TimeInfoEntries} time info entries */ getTimeInfoEntries(): TimeInfoEntries; /** * @param {TimeInfoEntries} fileTimestamps file timestamps * @param {TimeInfoEntries} directoryTimestamps directory timestamps */ collectTimeInfoEntries( fileTimestamps: TimeInfoEntries, directoryTimestamps: TimeInfoEntries, ): void; /** * @returns {Aggregated} aggregated info */ getAggregated(): Aggregated; /** * @param {string} item item * @param {number} mtime mtime * @param {string} file file * @param {EventType} type type */ _onChange(item: string, mtime: number, file: string, type: EventType): void; /** * @param {string} item item * @param {string} file file * @param {EventType} type type */ _onRemove(item: string, file: string, type: EventType): void; } import globToRegExp = require("./util/globToRegExp"); import { EventEmitter } from "events"; declare class WatchpackFileWatcher { /** * @param {Watchpack} watchpack watchpack * @param {Watcher} watcher watcher * @param {string | string[]} files files */ constructor( watchpack: Watchpack, watcher: Watcher, files: string | string[], ); /** @type {string[]} */ files: string[]; watcher: import("./DirectoryWatcher").Watcher< import("./DirectoryWatcher").FileWatcherEvents >; /** * @param {string | string[]} files files */ update(files: string | string[]): void; close(): void; } declare class WatchpackDirectoryWatcher { /** * @param {Watchpack} watchpack watchpack * @param {Watcher} watcher watcher * @param {string} directories directories */ constructor( watchpack: Watchpack, watcher: Watcher, directories: string, ); /** @type {string[]} */ directories: string[]; watcher: import("./DirectoryWatcher").Watcher< import("./DirectoryWatcher").DirectoryWatcherEvents >; /** * @param {string | string[]} directories directories */ update(directories: string | string[]): void; close(): void; } watchpack-2.5.2/types/reducePlan.d.ts000066400000000000000000000007621521250557700175230ustar00rootroot00000000000000declare namespace _exports { export { TreeNode }; } declare function _exports( plan: Map, limit: number, ): Map>; export = _exports; type TreeNode = { /** * target */ target: string; /** * parent */ parent: TreeNode; /** * children */ children: TreeNode[]; /** * number of entries */ entries: number; /** * true when active, otherwise false */ active: boolean; /** * value */ value: T[] | T | undefined; }; watchpack-2.5.2/types/util/000077500000000000000000000000001521250557700156175ustar00rootroot00000000000000watchpack-2.5.2/types/util/globToRegExp.d.ts000066400000000000000000000001041521250557700207450ustar00rootroot00000000000000declare function _exports(glob: string): string; export = _exports; watchpack-2.5.2/types/watchEventSource.d.ts000066400000000000000000000030371521250557700207300ustar00rootroot00000000000000export function batch(fn: () => void): void; export function getNumberOfWatchers(): number; export function watch(filePath: string): Watcher; export type FSWatcher = import("fs").FSWatcher; export type EventType = import("./index").EventType; export type WatcherSet = Set; export type WatcherEvents = { /** * change event */ change: (eventType: EventType, filename?: string) => void; /** * error event */ error: (err: unknown) => void; }; /** * @typedef {object} WatcherEvents * @property {(eventType: EventType, filename?: string) => void} change change event * @property {(err: unknown) => void} error error event */ /** * @extends {EventEmitter<{ [K in keyof WatcherEvents]: Parameters }>} */ export class Watcher extends EventEmitter<{ /** * change event */ change: [ eventType: import("./index").EventType, filename?: string | undefined, ]; /** * error event */ error: [err: unknown]; }> { constructor(); close(): void; } /** * @param {FSWatcher} watcher watcher * @param {string} filePath a file path * @param {(type: "rename" | "change", filename: string) => void} handleChangeEvent function to handle change * @returns {(type: "rename" | "change", filename: string) => void} handler of change event */ export function createHandleChangeEvent( watcher: FSWatcher, filePath: string, handleChangeEvent: (type: "rename" | "change", filename: string) => void, ): (type: "rename" | "change", filename: string) => void; export const watcherLimit: number; import { EventEmitter } from "events"; watchpack-2.5.2/types/watchpack.d.ts000066400000000000000000000001171521250557700174000ustar00rootroot00000000000000declare const _exports: import("./index").WatchpackExports; export = _exports;