diff --git a/.changeset/README.md b/.changeset/README.md
new file mode 100644
index 0000000..338dee3
--- /dev/null
+++ b/.changeset/README.md
@@ -0,0 +1,55 @@
+# Changesets
+
+This directory holds the source of truth for release notes and version bumps.
+
+## How it works
+
+Every PR that affects users (or anything you'd want to mention in a release) carries a markdown file in this directory. The CI workflow `release.yml` consumes these files when publishing.
+
+## Adding a changeset
+
+```bash
+pnpm changeset
+```
+
+The CLI prompts for:
+1. Bump type — `patch` (bugfix), `minor` (backward-compatible feature), or `major` (breaking change).
+2. A summary — used as the release note.
+
+It writes a file like `.changeset/quiet-foxes-paint.md`. Commit it alongside your code change.
+
+## Manual format
+
+If you'd rather write the file directly (LLM-friendly), the format is:
+
+```markdown
+---
+"ohlc-resample": minor
+---
+
+One-line summary of the change.
+
+Optional longer description in markdown. Bullets, code blocks, links — whatever
+makes the release note useful.
+```
+
+The filename can be anything ending in `.md` other than `README.md` and `config.json`.
+
+## What happens after merge
+
+1. PR with code + changeset → merges to `main`
+2. `release.yml` opens (or updates) a "Version Packages" PR that:
+ - Bumps `package.json#version`
+ - Prepends a `CHANGELOG.md` section assembled from pending changesets
+ - Deletes the consumed changeset files
+3. Merging the Version Packages PR triggers `release.yml` again, which:
+ - Publishes to npm with provenance
+ - Creates a `vX.Y.Z` git tag
+ - Creates a GitHub Release with the CHANGELOG entry as the body
+
+Trivial changes (typos, internal refactors that don't affect users) don't need a changeset.
+
+## Reference
+
+- https://github.com/changesets/changesets
+- https://github.com/changesets/action
diff --git a/.changeset/config.json b/.changeset/config.json
new file mode 100644
index 0000000..e9cc1a3
--- /dev/null
+++ b/.changeset/config.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
+ "changelog": [
+ "@changesets/changelog-github",
+ { "repo": "adiled/ohlc-resample" }
+ ],
+ "commit": false,
+ "fixed": [],
+ "linked": [],
+ "access": "public",
+ "baseBranch": "main",
+ "updateInternalDependencies": "patch",
+ "ignore": []
+}
diff --git a/.changeset/working-cli-and-modern-tooling.md b/.changeset/working-cli-and-modern-tooling.md
new file mode 100644
index 0000000..000207e
--- /dev/null
+++ b/.changeset/working-cli-and-modern-tooling.md
@@ -0,0 +1,38 @@
+---
+"ohlc-resample": major
+---
+
+Working CLI, vitest, modernized tooling. Closes #8.
+
+**Breaking change**
+
+- `engines.node` bumped from `>=20.12.2` to `>=22.12.0` (current LTS floor). The runtime API surface is unchanged — this is purely an install-constraint update. Library consumers on Node 22+ see no behavioural difference.
+
+**Distribution**
+
+- New `install.sh` for non-Node users: `curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh`. The installer uses your existing Node ≥22.12 if present; otherwise it downloads the official Node binary distribution from nodejs.org into `~/.ohlc/runtime/` and uses that. The package itself is the only release artifact — no per-platform binaries.
+
+**CLI** (was a non-functional stub in 1.x; now ships)
+
+- `--input-format ` honors the requested format (was a no-op heuristic).
+- New `-s, --shape ` for OHLCV tuple vs object JSON output. Auto-detects shape on JSON input and preserves it through the pipeline by default.
+- `-i` always wins over stdin, even in non-TTY contexts (CI, scripts).
+- Malformed CSV rows reported to stderr; zero valid rows now exits non-zero instead of producing empty output.
+- `bin.ohlc` → `dist/cli.js` (was `src/cli.ts`, non-functional post-install).
+- SIGINT/SIGTERM preserve a previously-set non-zero exit code.
+
+**Library**
+
+- `resampleOhlcv` now has overloaded signatures so the return type follows the input shape (`OHLCV[]` in → `OHLCV[]` out, same for `IOHLCV[]`). The original union signature is preserved as a third overload, so 1.x TS callers with union-typed data still compile.
+- Types (`IOHLCV`, `OHLCV`, `TradeTick`, etc.) are now re-exported from the package entrypoint.
+- Fixed inverted JSDoc on `resampleOhlcvArray`.
+- The legacy `default` export with `resample_ohlcv`, `array`, `json`, `trade_to_candle`, `tick_chart` aliases is preserved unchanged.
+
+**Build & tooling**
+
+- Test runner migrated jest → vitest 4. Cold-start time ~9s → ~2.5s.
+- TypeScript bumped to 6.x; tsconfig modernized (`target: es2022`, `lib: es2022`, explicit `types: ["node"]`).
+- Releases managed by [Changesets](https://github.com/changesets/changesets) with a direct-commit workflow: a push to `main` with a changeset triggers bump + commit + npm publish (with provenance) + tag + GitHub Release in a single CI run.
+- Dropped unused `chalk`, `coveralls`, `fast-csv` deps; moved `ts-node` to devDependencies.
+- CI workflow: triggers on `main`, runs Node 22.x and 24.x.
+- Removed obsolete `.npmignore`, dropped stale `deprecated.md`, cleaned coveralls/yarn/master references from README.
diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml
index 6c591a1..3a3b2bd 100644
--- a/.github/workflows/nodejs.yml
+++ b/.github/workflows/nodejs.yml
@@ -1,29 +1,26 @@
-# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
-# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
-
name: Node.js CI
on:
push:
- branches: [ master ]
+ branches: [main]
pull_request:
- branches: [ master ]
+ branches: [main]
jobs:
build:
-
runs-on: ubuntu-latest
-
strategy:
matrix:
- node-version: [10.x, 12.x]
-
+ node-version: [22.x, 24.x]
steps:
- - uses: actions/checkout@v2
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - run: npm ci
- - run: npm run build
- - run: npm test
+ - uses: actions/checkout@v4
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.node-version }}
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 9
+ - run: pnpm install --frozen-lockfile
+ - run: pnpm run build
+ - run: pnpm test
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..17c36f7
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,100 @@
+# Release workflow.
+#
+# Fires on every push to `main`. The decision to release is driven entirely by
+# what's in `.changeset/`:
+#
+# - If pending `.changeset/*.md` files exist, the workflow runs the changesets
+# CLI to bump `package.json#version`, regenerate `CHANGELOG.md`, and delete
+# the consumed changeset files. It commits and pushes those changes to main
+# (with `[skip ci]` so the bot's own commit doesn't re-trigger this workflow),
+# then publishes to npm with provenance, tags `vX.Y.Z`, and creates a
+# matching GitHub Release.
+#
+# - If there are no pending changesets, the workflow exits cleanly. Nothing
+# to release.
+#
+# All of this happens in a single workflow run from one push to main.
+#
+# The npm tarball is the only release artifact. `install.sh` (run client-side
+# by users) handles platform-specific work, including bringing a Node runtime
+# along when the user doesn't have one. No per-platform binaries are built or
+# uploaded.
+#
+# One-time setup:
+# - In repo Settings → Secrets and variables → Actions, add `NPM_TOKEN`
+# (an npm "Granular Access Token" with read+write on this package).
+
+name: Release
+
+on:
+ push:
+ branches: [main]
+
+# Prevent two release runs from racing each other.
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write # push the bump commit + tag, create GH Release
+ id-token: write # npm provenance (OIDC)
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # full history; changesets needs it
+
+ - uses: pnpm/action-setup@v4
+ with:
+ version: 10
+
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 24.x
+ cache: pnpm
+ registry-url: https://registry.npmjs.org
+
+ - run: pnpm install --frozen-lockfile
+ - run: pnpm run build
+ - run: pnpm test
+
+ - name: Apply pending changesets and publish
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+ run: |
+ set -euo pipefail
+
+ # Consume any pending changesets — bumps version, updates CHANGELOG,
+ # deletes the consumed .changeset/*.md files. No-op if none pending.
+ pnpm changeset version
+
+ if [[ -z $(git status --porcelain) ]]; then
+ echo "No pending changesets — nothing to release."
+ exit 0
+ fi
+
+ VERSION=$(node -p "require('./package.json').version")
+ TAG="v${VERSION}"
+
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ git config user.name "github-actions[bot]"
+ git add -A
+ git commit -m "chore(release): ${TAG} [skip ci]"
+ git push origin HEAD:main
+
+ # Publish first so a push success + publish failure doesn't leave a
+ # phantom version on main. (npm rejects duplicate versions, so a
+ # retried run is safe.)
+ pnpm publish --no-git-checks --access public --provenance
+
+ git tag "${TAG}"
+ git push origin "${TAG}"
+
+ # Extract the just-prepended CHANGELOG entry (everything between the
+ # first `## ` heading and the next one, minus the heading itself) and
+ # use it as the GitHub Release body.
+ awk '/^## /{i++} i==1' CHANGELOG.md | tail -n +2 > /tmp/release-notes.md
+ gh release create "${TAG}" \
+ --title "${TAG}" \
+ --notes-file /tmp/release-notes.md
diff --git a/.gitignore b/.gitignore
index e083eb3..acaf3dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,3 +90,7 @@ typings/
build/
dist/
.coveralls.yml
+
+# Local agent context — kept out of the repo
+AGENTS.md
+CLAUDE.md
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 4dbac10..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,15 +0,0 @@
-.babelrc
-.eslintignore
-.eslintrc.json
-.gitignore
-.lintstagedrc.json
-.nycrc
-.prettierrc.json
-.coveralls.yml
-
-tsconfig.json
-jest.config.js
-coverage
-src
-__tests__
-examples
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..e930908
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1 @@
+# ohlc-resample
diff --git a/README.md b/README.md
index c81eebf..ea279d1 100644
--- a/README.md
+++ b/README.md
@@ -13,10 +13,7 @@ Resample (inter-convert) trade, ticks or OHLCV data to different time frames
-
-
-
-
+
@@ -29,10 +26,30 @@ Resample (inter-convert) trade, ticks or OHLCV data to different time frames
## Install
+### CLI
+
+macOS / Linux:
+
+```sh
+curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh
+```
+
+Installs the `ohlc` CLI to `~/.local/bin`. If you don't already have a recent enough Node, the installer downloads one for you and uses it. Pin a specific version with `--version 2.0.0`.
+
+To uninstall:
+
+```sh
+curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh -s -- --uninstall
+```
+
+### Library
+
```sh
-npm install --save ohlc-resample
+npm install ohlc-resample # or pnpm add / yarn add / bun add
```
+Requires Node.js ≥22.12.
+
## Supported formats
- OHLCV (CCXT format) `[[time,open,high,low,close,volume]]`
@@ -176,6 +193,111 @@ const tickChart = resampleTicksByCount(airbnb_ticks, {
});
```
+## CLI Usage
+
+The package includes a command-line interface for resampling OHLCV data between timeframes and file formats.
+
+### Basic Usage
+
+```bash
+# Resample CSV file with default timeframes (1m -> 5m)
+ohlc-resample -i input.csv
+
+# Resample JSON file with custom timeframes
+ohlc-resample -i input.json -b 60 -n 300
+
+# Save output to file with specific format
+ohlc-resample -i input.csv -o output.json -f json
+```
+
+### Options
+
+```bash
+Options:
+ -V, --version Show version number
+ -i, --input Input file path (csv, json) or use pipe
+ -o, --output Output file path (csv, json) or use stdout
+ -f, --format Output format (csv, json) (default: "json")
+ --input-format Input format when piping (csv, json, auto) (default: "auto")
+ -s, --shape Output shape for JSON: object, array, auto (default: "auto")
+ -b, --base-timeframe Base timeframe in seconds (default: "60")
+ -n, --new-timeframe New timeframe in seconds (default: "300")
+ -h, --help Display help for command
+```
+
+### OHLCV shapes
+
+The CLI accepts and emits two equivalent JSON shapes:
+
+```json
+// object shape (IOHLCV[])
+[{ "time": 1609459200000, "open": 100, "high": 105, "low": 95, "close": 102, "volume": 1000 }]
+
+// array shape (OHLCV[], CCXT-style tuple)
+[[1609459200000, 100, 105, 95, 102, 1000]]
+```
+
+Input shape is auto-detected. Output shape mirrors input by default; override with `-s array` or `-s object`. CSV input is always parsed as object-shape; CSV output is always rows.
+
+### Input Formats
+
+The CLI supports both CSV and JSON input formats:
+
+#### CSV Format
+```csv
+time,open,high,low,close,volume
+1609459200000,100,105,95,102,1000
+1609459260000,102,107,101,106,1200
+```
+
+#### JSON Format
+```json
+[
+ {
+ "time": 1609459200000,
+ "open": 100,
+ "high": 105,
+ "low": 95,
+ "close": 102,
+ "volume": 1000
+ }
+]
+```
+
+### Pipe Input
+
+You can pipe data into the CLI from other commands. The format is automatically detected, or you can specify it:
+
+```bash
+# Auto-detect format
+cat data.json | ohlc-resample
+cat data.csv | ohlc-resample
+
+# Force specific format
+cat data.json | ohlc-resample --input-format json
+cat data.csv | ohlc-resample --input-format csv
+```
+
+The CLI supports two types of pipe input:
+1. JSON files/strings with OHLCV objects
+2. CSV files/strings with headers (time,open,high,low,close,volume)
+
+### Examples
+
+```bash
+# Resample 1-minute data to 5-minute candles
+ohlc-resample -i data.csv -b 60 -n 300
+
+# Convert CSV to JSON format
+ohlc-resample -i data.csv -f json
+
+# Pipe data and save to file
+cat data.csv | ohlc-resample -o output.json
+
+# Resample with custom timeframes and save as CSV
+ohlc-resample -i data.json -b 300 -n 3600 -f csv -o output.csv
+```
+
## Contributors
👤 **Adil Shaikh (https://adils.me)**
@@ -187,12 +309,12 @@ const tickChart = resampleTicksByCount(airbnb_ticks, {
## 🤝 Contributing
-Contributions, issues and feature requests are welcome! Feel free to check [issues page](https://github.com/adiled/ohlc-resample/issues). You can also take a look at the [contributing guide](https://github.com/adiled/ohlc-resample/blob/master/CONTRIBUTING.md).
+Contributions, issues and feature requests are welcome! Feel free to check the [issues page](https://github.com/adiled/ohlc-resample/issues).
### Run tests
```sh
-yarn test
+pnpm test
```
## Show your support
@@ -202,4 +324,4 @@ Give a ⭐️ if this project helped you!
## 📝 License
Copyright © 2022 [Adil Shaikh (https://adils.me)](https://github.com/adiled).
-This project is [LGPL--3.0](https://github.com/adiled/ohlc-resample/blob/master/LICENSE) licensed.
+This project is [LGPL--3.0](https://github.com/adiled/ohlc-resample/blob/main/COPYING) licensed.
diff --git a/__tests__/cli.ts b/__tests__/cli.ts
new file mode 100644
index 0000000..69dbe98
--- /dev/null
+++ b/__tests__/cli.ts
@@ -0,0 +1,402 @@
+import { describe, it, test, expect, beforeAll, beforeEach, afterEach } from 'vitest';
+import * as fs from 'fs';
+import * as path from 'path';
+import * as os from 'os';
+import { Readable, Writable } from 'stream';
+import { IOHLCV, OHLCV } from '../src/types';
+import { withTimeout } from './utils';
+import { runCli, parseCSV, detectFormat } from '../src/cli';
+
+describe('CLI', () => {
+ let tempDir: string;
+ let testData: IOHLCV[];
+ let testDataArray: OHLCV[];
+ let csvPath: string;
+ let jsonPath: string;
+ let jsonArrayPath: string;
+
+ const expectedCandle = {
+ time: 1609459200000,
+ open: 100,
+ high: 108,
+ low: 95,
+ close: 103,
+ volume: 5000,
+ };
+
+ beforeAll(() => {
+ testData = [
+ { time: 1609459200000, open: 100, high: 105, low: 95, close: 102, volume: 1000 },
+ { time: 1609459260000, open: 102, high: 107, low: 101, close: 106, volume: 1200 },
+ { time: 1609459320000, open: 106, high: 108, low: 104, close: 105, volume: 800 },
+ { time: 1609459380000, open: 105, high: 106, low: 103, close: 104, volume: 900 },
+ { time: 1609459440000, open: 104, high: 105, low: 102, close: 103, volume: 1100 },
+ ];
+ testDataArray = testData.map(d =>
+ [d.time, d.open, d.high, d.low, d.close, d.volume] as OHLCV);
+ });
+
+ beforeEach(async () => {
+ tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'ohlc-resample-test-'));
+ csvPath = path.join(tempDir, 'test.csv');
+ jsonPath = path.join(tempDir, 'test.json');
+ jsonArrayPath = path.join(tempDir, 'test-array.json');
+
+ const csvContent = 'time,open,high,low,close,volume\n' +
+ testData.map(d => `${d.time},${d.open},${d.high},${d.low},${d.close},${d.volume}`).join('\n');
+ await fs.promises.writeFile(csvPath, csvContent);
+ await fs.promises.writeFile(jsonPath, JSON.stringify(testData, null, 2));
+ await fs.promises.writeFile(jsonArrayPath, JSON.stringify(testDataArray, null, 2));
+
+ process.exitCode = 0;
+ });
+
+ afterEach(async () => {
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
+ process.exitCode = 0;
+ });
+
+ function captureWritable() {
+ let data = '';
+ const writable = new Writable({
+ write(chunk, _encoding, callback) {
+ data += chunk.toString();
+ callback();
+ },
+ });
+ return { writable, getData: () => data };
+ }
+
+ function readableFromString(str: string) {
+ return Readable.from([str]);
+ }
+
+ describe('File Input', () => {
+ test('reads CSV file', async () => {
+ await withTimeout(async () => {
+ const { writable, getData } = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath], undefined, writable, err.writable);
+ const output = JSON.parse(getData());
+ expect(output).toHaveLength(1);
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, 'read CSV file');
+ });
+
+ test('reads JSON file (object shape)', async () => {
+ await withTimeout(async () => {
+ const { writable, getData } = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', jsonPath], undefined, writable, err.writable);
+ const output = JSON.parse(getData());
+ expect(output).toHaveLength(1);
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, 'read JSON object file');
+ });
+
+ test('reads JSON file (array shape) and preserves shape on output', async () => {
+ await withTimeout(async () => {
+ const { writable, getData } = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', jsonArrayPath], undefined, writable, err.writable);
+ const output = JSON.parse(getData());
+ expect(output).toHaveLength(1);
+ expect(Array.isArray(output[0])).toBe(true);
+ expect(output[0]).toEqual([1609459200000, 100, 108, 95, 103, 5000]);
+ }, 1000, 'read JSON array file');
+ });
+
+ test('rejects non-csv/json file extension', async () => {
+ await withTimeout(async () => {
+ const invalidFile = path.join(tempDir, 'test.txt');
+ fs.writeFileSync(invalidFile, 'invalid data');
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', invalidFile], undefined, out.writable, err.writable);
+ expect(err.getData()).toContain('Only CSV and JSON files are accepted');
+ expect(process.exitCode).toBe(1);
+ }, 1000, 'reject invalid extension');
+ });
+ });
+
+ describe('Pipe Input', () => {
+ test('reads CSV from pipe', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ const stdin = readableFromString(fs.readFileSync(csvPath, 'utf8'));
+ await runCli(['node', 'cli.js'], stdin, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output).toHaveLength(1);
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, 'read pipe CSV');
+ });
+
+ test('-i wins even when stdin is non-interactive (regression)', async () => {
+ // Previously the CLI gated file-reading on `isTTY`, which broke
+ // scripted/CI invocations where stdin is not a TTY but `-i` is set.
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ // Hand it a non-empty stdin to prove it's ignored when -i is given.
+ const stdin = readableFromString('garbage that should never be read');
+ await runCli(['node', 'cli.js', '-i', csvPath], stdin, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output[0]).toMatchObject(expectedCandle);
+ expect(process.exitCode).toBe(0);
+ }, 1000, '-i over stdin');
+ });
+ });
+
+ describe('Output --shape flag', () => {
+ test('--shape array converts object input to tuple output', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', jsonPath, '-s', 'array'], undefined, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(Array.isArray(output[0])).toBe(true);
+ expect(output[0]).toEqual([1609459200000, 100, 108, 95, 103, 5000]);
+ }, 1000, '--shape array');
+ });
+
+ test('--shape object converts tuple input to object output', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', jsonArrayPath, '-s', 'object'], undefined, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, '--shape object');
+ });
+
+ test('--shape auto preserves CSV-derived object shape', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath], undefined, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, '--shape auto');
+ });
+ });
+
+ describe('Output Format', () => {
+ let outputFile: string;
+ beforeEach(() => { outputFile = path.join(tempDir, 'output'); });
+
+ test('writes CSV output', async () => {
+ await withTimeout(async () => {
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', jsonPath, '-o', outputFile, '-f', 'csv'], undefined, undefined, err.writable);
+ const content = fs.readFileSync(outputFile, 'utf8');
+ expect(content).toContain('time,open,high,low,close,volume');
+ expect(content.split('\n')).toHaveLength(2);
+ }, 1000, 'write CSV');
+ });
+
+ test('writes JSON output', async () => {
+ await withTimeout(async () => {
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath, '-o', outputFile, '-f', 'json'], undefined, undefined, err.writable);
+ const content = JSON.parse(fs.readFileSync(outputFile, 'utf8'));
+ expect(content).toHaveLength(1);
+ expect(content[0]).toMatchObject(expectedCandle);
+ }, 1000, 'write JSON');
+ });
+
+ test('writes to stdout when no output file is given', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', jsonPath], undefined, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output).toHaveLength(1);
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, 'write stdout');
+ });
+ });
+
+ describe('Error Handling', () => {
+ test('missing input file → exit 1 + ENOENT', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', 'nonexistent.csv'], undefined, out.writable, err.writable);
+ expect(err.getData()).toContain('no such file or directory');
+ expect(process.exitCode).toBe(1);
+ }, 1000, 'missing file');
+ });
+
+ test('invalid JSON → exit 1', async () => {
+ await withTimeout(async () => {
+ const invalidJsonFile = path.join(tempDir, 'invalid.json');
+ fs.writeFileSync(invalidJsonFile, '{invalid json');
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', invalidJsonFile], undefined, out.writable, err.writable);
+ expect(process.exitCode).toBe(1);
+ expect(err.getData()).toMatch(/Error:/);
+ }, 1000, 'invalid JSON');
+ });
+
+ test('CSV with all malformed rows → exit 1', async () => {
+ await withTimeout(async () => {
+ const invalidCsvFile = path.join(tempDir, 'invalid.csv');
+ fs.writeFileSync(invalidCsvFile, 'time,open,high,low,close,volume\n1,2,3,4,5');
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', invalidCsvFile], undefined, out.writable, err.writable);
+ expect(process.exitCode).toBe(1);
+ expect(err.getData()).toContain('no valid OHLCV rows');
+ }, 1000, 'invalid CSV');
+ });
+
+ test('non-numeric timeframe → exit 1', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath, '-b', 'invalid', '-n', '300'], undefined, out.writable, err.writable);
+ expect(err.getData()).toContain('Timeframes must be valid numbers');
+ expect(process.exitCode).toBe(1);
+ }, 1000, 'bad timeframe');
+ });
+
+ test('new <= base timeframe → exit 1', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath, '-b', '300', '-n', '60'], undefined, out.writable, err.writable);
+ expect(err.getData()).toContain('New timeframe must be greater than base timeframe');
+ expect(process.exitCode).toBe(1);
+ }, 1000, 'tf relationship');
+ });
+ });
+
+ describe('Resampling', () => {
+ test('default timeframes (60s → 300s)', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath], undefined, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output).toHaveLength(1);
+ expect(output[0]).toMatchObject(expectedCandle);
+ }, 1000, 'default tf');
+ });
+
+ test('custom timeframes (60s → 120s)', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ await runCli(['node', 'cli.js', '-i', csvPath, '-b', '60', '-n', '120'], undefined, out.writable, err.writable);
+ const output = JSON.parse(out.getData());
+ expect(output).toHaveLength(2);
+ expect(output[0]).toMatchObject({
+ time: 1609459200000, open: 100, high: 107, low: 95, close: 106, volume: 2200,
+ });
+ }, 1000, 'custom tf');
+ });
+ });
+
+ describe('--input-format', () => {
+ test('auto-detects JSON from pipe', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ const stdin = readableFromString(fs.readFileSync(jsonPath, 'utf8'));
+ await runCli(['node', 'cli.js'], stdin, out.writable, err.writable);
+ expect(JSON.parse(out.getData())[0]).toMatchObject(expectedCandle);
+ }, 1000, 'auto JSON');
+ });
+
+ test('auto-detects CSV from pipe', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ const stdin = readableFromString(fs.readFileSync(csvPath, 'utf8'));
+ await runCli(['node', 'cli.js'], stdin, out.writable, err.writable);
+ expect(JSON.parse(out.getData())[0]).toMatchObject(expectedCandle);
+ }, 1000, 'auto CSV');
+ });
+
+ test('--input-format json forces JSON parsing', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ const stdin = readableFromString(fs.readFileSync(jsonPath, 'utf8'));
+ await runCli(['node', 'cli.js', '--input-format', 'json'], stdin, out.writable, err.writable);
+ expect(JSON.parse(out.getData())[0]).toMatchObject(expectedCandle);
+ }, 1000, 'force JSON');
+ });
+
+ test('--input-format csv forces CSV parsing (errors on JSON-looking input)', async () => {
+ await withTimeout(async () => {
+ const out = captureWritable();
+ const err = captureWritable();
+ const stdin = readableFromString(fs.readFileSync(jsonPath, 'utf8'));
+ await runCli(['node', 'cli.js', '--input-format', 'csv'], stdin, out.writable, err.writable);
+ expect(process.exitCode).toBe(1);
+ }, 1000, 'force CSV on JSON');
+ });
+ });
+
+ describe('parseCSV', () => {
+ it('parses CSV with header', () => {
+ const { rows, skipped } = parseCSV('time,open,high,low,close,volume\n1000,1,2,0.5,1.5,10');
+ expect(rows).toEqual([{ time: 1000, open: 1, high: 2, low: 0.5, close: 1.5, volume: 10 }]);
+ expect(skipped).toBe(0);
+ });
+
+ it('parses CSV without header', () => {
+ const { rows } = parseCSV('1000,1,2,0.5,1.5,10');
+ expect(rows).toEqual([{ time: 1000, open: 1, high: 2, low: 0.5, close: 1.5, volume: 10 }]);
+ });
+
+ it('throws for empty CSV', () => {
+ expect(() => parseCSV('')).toThrow('Error: CSV must have at least one row');
+ });
+
+ it('counts skipped rows with wrong column count', () => {
+ const { rows, skipped } = parseCSV('1000,1,2,0.5,1.5,10\n2000,1,2,0.5,1.5\n3000,1,2,0.5,1.5,10');
+ expect(rows).toHaveLength(2);
+ expect(skipped).toBe(1);
+ });
+
+ it('counts skipped rows with missing values', () => {
+ const { rows, skipped } = parseCSV('1000,1,2,0.5,1.5,10\n2000,1,2,,1.5,10\n3000,1,2,0.5,1.5,10');
+ expect(rows).toHaveLength(2);
+ expect(skipped).toBe(1);
+ });
+
+ it('counts skipped rows with non-numeric values', () => {
+ const { rows, skipped } = parseCSV('1000,1,2,0.5,1.5,10\n2000,1,2,0.5,1.5,abc\n3000,1,2,0.5,1.5,10');
+ expect(rows).toHaveLength(2);
+ expect(skipped).toBe(1);
+ });
+ });
+
+ describe('detectFormat', () => {
+ it('detects CSV for 5-comma line', () => {
+ expect(detectFormat('1,2,3,4,5,6')).toBe('csv');
+ expect(detectFormat('1000,1,2,0.5,1.5,10\n')).toBe('csv');
+ });
+
+ it('detects JSON for array-of-objects', () => {
+ expect(detectFormat('[{"time":1,"open":2,"high":3,"low":1,"close":2,"volume":10}]')).toBe('json');
+ });
+
+ it('detects JSON for array-of-tuples', () => {
+ expect(detectFormat('[[1,2,3,1,2,10]]')).toBe('json');
+ });
+
+ it('rejects bare JSON scalars (not an array)', () => {
+ // Naked numbers/strings parse as JSON but aren't OHLCV input.
+ expect(() => detectFormat('1000')).toThrow('Could not detect input format');
+ });
+
+ it('throws for unknown format', () => {
+ expect(() => detectFormat('foo|bar|baz')).toThrow('Could not detect input format');
+ });
+ });
+});
diff --git a/__tests__/ohlcv.ts b/__tests__/ohlcv.ts
index 455fa64..1159a83 100644
--- a/__tests__/ohlcv.ts
+++ b/__tests__/ohlcv.ts
@@ -1,6 +1,7 @@
"use strict";
-import CConverter, { resampleOhlcv } from "../src/index";
+import { test, expect } from "vitest";
+import { resampleOhlcv } from "../src/index";
import type { IOHLCV, OHLCV } from "../src/types";
// From Binance
@@ -164,7 +165,7 @@ const link_btc_1m: Array = [
];
test("Resample OHLCV in object format - 1m to 2m", () => {
- let result = CConverter.json(link_btc_1m, {
+ let result = resampleOhlcv(link_btc_1m, {
baseTimeframe: 60,
newTimeframe: 120
});
diff --git a/__tests__/ticks.ts b/__tests__/ticks.ts
index 7c68e51..54d0604 100644
--- a/__tests__/ticks.ts
+++ b/__tests__/ticks.ts
@@ -1,6 +1,7 @@
"use strict";
-import Converter from "../src/index";
+import { test, expect } from "vitest";
+import { resampleTicksByTime, resampleTicksByCount } from "../src/index";
import type { Trade } from "../src/types";
const adabnb_trades = [
@@ -370,7 +371,7 @@ const filtered_adabnb_trades: Trade[] = adabnb_trades.map((trade: any) => ({
}));
test("Tick Chart Convert 5 tick", () => {
- let result = Converter.tick_chart(filtered_adabnb_trades, {
+ let result = resampleTicksByCount(filtered_adabnb_trades, {
tickCount: 5
});
@@ -385,7 +386,7 @@ test("Tick Chart Convert 5 tick", () => {
});
test("Resample ticks / trades to OHLCV", () => {
- let result = Converter.trade_to_candle(filtered_adabnb_trades, {
+ let result = resampleTicksByTime(filtered_adabnb_trades, {
timeframe: 60,
includeLatestCandle: false
});
@@ -406,7 +407,7 @@ test("Resample ticks / trades to OHLCV", () => {
});
test("Resample ticks / trades to OHLCV – including open candle", () => {
- let result = Converter.trade_to_candle(filtered_adabnb_trades, {
+ let result = resampleTicksByTime(filtered_adabnb_trades, {
timeframe: 60
});
@@ -417,7 +418,7 @@ test("Resample ticks / trades to OHLCV – including open candle", () => {
});
test("Resample ticks / trades to OHLCV - with gaps filled", () => {
- let result = Converter.trade_to_candle(filtered_adabnb_trades, {
+ let result = resampleTicksByTime(filtered_adabnb_trades, {
timeframe: 60,
fillGaps: true
});
diff --git a/__tests__/utils.ts b/__tests__/utils.ts
new file mode 100644
index 0000000..f656d2e
--- /dev/null
+++ b/__tests__/utils.ts
@@ -0,0 +1,78 @@
+import { describe, it, expect, vi } from 'vitest';
+import { performance } from 'perf_hooks';
+
+/**
+ * Wrap a test function with a soft timeout that rejects past `timeoutMs` and
+ * warns when the function runs past 80% of the budget. Once timed out, any
+ * later resolution from the wrapped function is ignored, so a slow `testFn`
+ * cannot log after the test has torn down.
+ */
+export function withTimeout(
+ testFn: () => Promise,
+ timeoutMs: number = 5000,
+ testName: string = 'unnamed test'
+): Promise {
+ const startTime = performance.now();
+ let settled = false;
+
+ return new Promise((resolve, reject) => {
+ const timeoutId = setTimeout(() => {
+ if (settled) return;
+ settled = true;
+ const elapsed = performance.now() - startTime;
+ reject(new Error(`Test "${testName}" took ${elapsed.toFixed(2)}ms (exceeded ${timeoutMs}ms timeout)`));
+ }, timeoutMs);
+
+ testFn()
+ .then((result) => {
+ if (settled) return;
+ settled = true;
+ clearTimeout(timeoutId);
+ const elapsed = performance.now() - startTime;
+ if (elapsed > timeoutMs * 0.8) {
+ console.warn(`Warning: Test "${testName}" took ${elapsed.toFixed(2)}ms (80% of ${timeoutMs}ms timeout)`);
+ }
+ resolve(result);
+ })
+ .catch((error) => {
+ if (settled) return;
+ settled = true;
+ clearTimeout(timeoutId);
+ reject(error);
+ });
+ });
+}
+
+describe('withTimeout utility', () => {
+ it('resolves when test completes within timeout', async () => {
+ const result = await withTimeout(async () => 'success', 1000, 'fast test');
+ expect(result).toBe('success');
+ });
+
+ it('rejects when test exceeds timeout', async () => {
+ await expect(withTimeout(
+ async () => {
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ return 'success';
+ },
+ 1000,
+ 'slow test'
+ )).rejects.toThrow('exceeded 1000ms timeout');
+ });
+
+ it('warns when test takes more than 80% of timeout', async () => {
+ const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
+
+ await withTimeout(
+ async () => {
+ await new Promise(resolve => setTimeout(resolve, 800));
+ return 'success';
+ },
+ 1000,
+ 'warning test'
+ );
+
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('80% of 1000ms timeout'));
+ consoleSpy.mockRestore();
+ });
+});
diff --git a/csv.csv b/csv.csv
deleted file mode 100644
index 6e47ae9..0000000
--- a/csv.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-1,2,3,5,6
-1,5,4,6,7
diff --git a/deprecated.md b/deprecated.md
deleted file mode 100644
index 3d52031..0000000
--- a/deprecated.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Deprecated stuff that need attention
-
-## Result of clean npm install with no package-lock.json
-
-```sh
-$ npm i
-npm WARN deprecated har-validator@5.1.5: this library is no longer supported
-npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known
-to be problematic. See https://v8.dev/blog/math-random for details.
-npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
-```
-
-```sh
-/ohlc-resample
-└─┬ coveralls@3.1.1
- └─┬ request@2.88.2
- └── uuid@3.4.0
-```
-
-```sh
-/ohlc-resample
-└─┬ coveralls@3.1.1
- └─┬ request@2.88.2
- └── har-validator@5.1.5
-```
-
-### Result of npm outdated
-
-```sh
-$ npm outdated
-Package Current Wanted Latest Location Depended by
-typescript 3.9.10 3.9.10 4.4.3 node_modules/typescript ohlc-resample (updated to 4.4.3)
-```
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..18c8bb2
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,207 @@
+#!/usr/bin/env sh
+# Install (or uninstall) the `ohlc` CLI on macOS or Linux.
+#
+# Brings its own Node.js if you don't have a recent enough one already.
+# Single source of truth: the npm package. No per-platform binaries.
+#
+# Usage:
+# curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh
+# curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh -s -- --uninstall
+#
+# Install flags:
+# --version Pin the npm version to install (default: latest).
+# --bin-dir Where to place the `ohlc` launcher (default: $HOME/.local/bin).
+# --install-dir Where to place runtime + lib (default: $HOME/.ohlc).
+#
+# Uninstall flags:
+# --uninstall Remove the launcher and the install dir.
+# --force Remove the directories even if they don't look like
+# this installer wrote them.
+
+set -eu
+
+PKG=ohlc-resample
+BIN_NAME=ohlc
+
+MODE=install
+VERSION=latest
+BIN_DIR="${HOME}/.local/bin"
+INSTALL_DIR="${HOME}/.ohlc"
+FORCE=0
+
+# Pinned Node version we'll fetch when the host's Node is missing or too old.
+# Must satisfy the package's `engines.node`.
+NODE_VERSION=22.12.0
+MIN_NODE_MAJOR=22
+MIN_NODE_MINOR=12
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ --version) VERSION="$2"; shift 2 ;;
+ --bin-dir) BIN_DIR="$2"; shift 2 ;;
+ --install-dir) INSTALL_DIR="$2"; shift 2 ;;
+ --uninstall) MODE=uninstall; shift ;;
+ --force) FORCE=1; shift ;;
+ -h|--help)
+ cat <<'USAGE'
+Install (or uninstall) the ohlc CLI. Brings its own Node.js if needed.
+
+Install:
+ curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh
+
+Uninstall:
+ curl -fsSL https://github.com/adiled/ohlc-resample/raw/main/install.sh | sh -s -- --uninstall
+
+Install flags:
+ --version Pin the npm version (default: latest)
+ --bin-dir Launcher destination (default: $HOME/.local/bin)
+ --install-dir Runtime + lib destination (default: $HOME/.ohlc)
+
+Uninstall flags:
+ --uninstall Switch to uninstall mode
+ --force Remove dirs even if they don't look like this installer wrote them
+USAGE
+ exit 0
+ ;;
+ *) printf 'unknown flag: %s\n' "$1" >&2; exit 1 ;;
+ esac
+done
+
+# Detect platform
+case "$(uname -s)" in
+ Darwin) os=darwin; archive_ext=tar.gz ;;
+ Linux) os=linux; archive_ext=tar.xz ;;
+ *) printf 'unsupported OS: %s\n' "$(uname -s)" >&2; exit 1 ;;
+esac
+
+case "$(uname -m)" in
+ arm64|aarch64) arch=arm64 ;;
+ x86_64|amd64) arch=x64 ;;
+ *) printf 'unsupported architecture: %s\n' "$(uname -m)" >&2; exit 1 ;;
+esac
+
+# ---- Uninstall ----
+if [ "$MODE" = "uninstall" ]; then
+ launcher="${BIN_DIR}/${BIN_NAME}"
+ removed_any=0
+
+ if [ -e "$launcher" ]; then
+ # Sanity check: is it our launcher? Our launcher refs the package path.
+ if [ "$FORCE" -eq 1 ] || grep -q "node_modules/${PKG}/dist/cli.js" "$launcher" 2>/dev/null; then
+ rm -f "$launcher"
+ printf '✓ Removed launcher %s\n' "$launcher"
+ removed_any=1
+ else
+ printf 'Refusing to remove %s (does not look like our launcher).\nPass --force to override.\n' "$launcher" >&2
+ fi
+ fi
+
+ if [ -d "$INSTALL_DIR" ]; then
+ # Sanity check: does it look like our install dir?
+ if [ "$FORCE" -eq 1 ] || [ -d "${INSTALL_DIR}/lib/node_modules/${PKG}" ] || [ -d "${INSTALL_DIR}/runtime" ]; then
+ rm -rf "$INSTALL_DIR"
+ printf '✓ Removed install dir %s\n' "$INSTALL_DIR"
+ removed_any=1
+ else
+ printf 'Refusing to remove %s (does not look like our install dir).\nPass --force to override.\n' "$INSTALL_DIR" >&2
+ fi
+ fi
+
+ if [ "$removed_any" -eq 0 ]; then
+ printf 'Nothing to uninstall (no launcher at %s and no install dir at %s).\n' "$launcher" "$INSTALL_DIR"
+ fi
+ exit 0
+fi
+
+# ---- Install ----
+mkdir -p "$BIN_DIR" "$INSTALL_DIR"
+
+# Decide which Node to use.
+NODE=""
+NPM=""
+
+version_ge() {
+ # version_ge "22.12.0" "22.12" → returns 0 if first ≥ MIN_NODE_MAJOR.MIN_NODE_MINOR
+ v=$1
+ major=$(echo "$v" | cut -d. -f1)
+ minor=$(echo "$v" | cut -d. -f2)
+ if [ "$major" -gt "$MIN_NODE_MAJOR" ]; then return 0; fi
+ if [ "$major" -eq "$MIN_NODE_MAJOR" ] && [ "$minor" -ge "$MIN_NODE_MINOR" ]; then return 0; fi
+ return 1
+}
+
+if command -v node >/dev/null 2>&1; then
+ host_v=$(node -p 'process.versions.node' 2>/dev/null || echo "0.0.0")
+ if version_ge "$host_v"; then
+ NODE=$(command -v node)
+ NPM=$(command -v npm)
+ printf '✓ Using host Node %s (%s)\n' "$host_v" "$NODE"
+ else
+ printf '→ Host Node is %s, need ≥%d.%d. Downloading a bundled Node…\n' "$host_v" "$MIN_NODE_MAJOR" "$MIN_NODE_MINOR"
+ fi
+fi
+
+# Bring our own Node if the host's isn't suitable.
+if [ -z "$NODE" ]; then
+ url="https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-${os}-${arch}.${archive_ext}"
+ printf '→ Fetching %s\n' "$url"
+
+ rt_dir="${INSTALL_DIR}/runtime"
+ rm -rf "$rt_dir"
+ mkdir -p "$rt_dir"
+
+ tmp=$(mktemp)
+ trap 'rm -f "$tmp"' EXIT
+ if ! curl -fSL --progress-bar -o "$tmp" "$url"; then
+ printf 'failed to download Node %s for %s/%s\n' "$NODE_VERSION" "$os" "$arch" >&2
+ exit 1
+ fi
+
+ tar -xf "$tmp" -C "$rt_dir" --strip-components=1
+ rm "$tmp"
+ trap - EXIT
+
+ NODE="$rt_dir/bin/node"
+ NPM="$rt_dir/bin/npm"
+ printf '✓ Node %s installed at %s\n' "$NODE_VERSION" "$rt_dir"
+fi
+
+# Install the package using whichever Node we picked. Extend PATH so npm's
+# `#!/usr/bin/env node` shebang resolves to the chosen Node when it's bundled.
+lib_dir="${INSTALL_DIR}/lib"
+mkdir -p "$lib_dir"
+[ -f "${lib_dir}/package.json" ] || printf '{"name":"ohlc-installer","private":true}\n' > "${lib_dir}/package.json"
+
+if [ "$VERSION" = "latest" ]; then
+ spec="$PKG"
+else
+ spec="${PKG}@${VERSION}"
+fi
+
+printf '→ Installing %s into %s\n' "$spec" "$lib_dir"
+node_bin_dir=$(dirname "$NODE")
+PATH="${node_bin_dir}:${PATH}" "$NPM" install --prefix "$lib_dir" "$spec" --silent --no-audit --no-fund --no-progress
+
+# Write the launcher.
+launcher="${BIN_DIR}/${BIN_NAME}"
+cat > "$launcher" </dev/null || true)"
+ [ -n "$v" ] && printf '\n%s --version → %s\n' "$BIN_NAME" "$v"
+fi
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index de09d6f..0000000
--- a/jest.config.js
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = {
- collectCoverage: true,
- coveragePathIgnorePatterns: ['/node_modules|dist/'],
- collectCoverageFrom: ['src/**/*.ts'],
- transform: {
- '.(ts|tsx)': ['ts-jest', {
- diagnostics: {
- ignoreCodes: [2345]
- }
- }]
- },
- testRegex: '(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$',
- moduleFileExtensions: ['ts', 'tsx', 'js'],
-};
\ No newline at end of file
diff --git a/package.json b/package.json
index 055c202..ad65d57 100644
--- a/package.json
+++ b/package.json
@@ -3,22 +3,26 @@
"version": "1.2.1",
"description": "Resample (inter-convert) trade, ticks or OHLCV data to different time frames, includes CLI",
"main": "dist/index.js",
+ "types": "dist/index.d.ts",
"engines": {
- "node": ">=20.12.2"
+ "node": ">=22.12.0"
},
"files": [
"dist"
],
"scripts": {
- "prebuild": "rimraf build",
+ "prebuild": "rimraf dist",
"build": "tsc --build",
"build:check": "node -e \"require('./dist')\"",
- "prepublishOnly": "npm test && npm run build && npm run coveralls && npm run build && npm run build:check",
- "test": "jest",
- "coveralls": "jest --coverage --coverageReporters=text-lcov | coveralls"
+ "prepublishOnly": "pnpm test && pnpm run build && pnpm run build:check",
+ "test": "vitest run",
+ "test:watch": "vitest",
+ "test:coverage": "vitest run --coverage",
+ "changeset": "changeset",
+ "release": "pnpm publish --no-git-checks --access public --provenance"
},
"bin": {
- "ohlc": "./src/cli.ts"
+ "ohlc": "./dist/cli.js"
},
"keywords": [
"ohlc",
@@ -43,18 +47,17 @@
},
"homepage": "https://github.com/adiled/ohlc-resample#readme",
"devDependencies": {
- "@types/jest": "^29.5.14",
- "@types/lodash": "^4.14.173",
- "coveralls": "^3.1.1",
- "jest": "^30.0.0",
- "rimraf": "^6.0.1",
- "ts-jest": "^29.4.0",
- "typescript": "^5.8.3"
+ "@changesets/changelog-github": "^0.7.0",
+ "@changesets/cli": "^2.31.0",
+ "@types/lodash": "^4.17.24",
+ "@types/node": "^25.6.2",
+ "@vitest/coverage-v8": "^4.1.5",
+ "rimraf": "^6.1.3",
+ "typescript": "^6.0.3",
+ "vitest": "^4.1.5"
},
"dependencies": {
- "commander": "^14.0.0",
- "fast-csv": "^5.0.2",
- "lodash": "^4.17.21",
- "ts-node": "^10.9.2"
+ "commander": "^14.0.3",
+ "lodash": "^4.18.1"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 60de520..96f0d38 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,860 +9,634 @@ importers:
.:
dependencies:
commander:
- specifier: ^14.0.0
- version: 14.0.0
- fast-csv:
- specifier: ^5.0.2
- version: 5.0.2
+ specifier: ^14.0.3
+ version: 14.0.3
lodash:
- specifier: ^4.17.21
- version: 4.17.21
- ts-node:
- specifier: ^10.9.2
- version: 10.9.2(@types/node@24.0.1)(typescript@5.8.3)
+ specifier: ^4.18.1
+ version: 4.18.1
devDependencies:
- '@types/jest':
- specifier: ^29.5.14
- version: 29.5.14
+ '@changesets/changelog-github':
+ specifier: ^0.7.0
+ version: 0.7.0
+ '@changesets/cli':
+ specifier: ^2.31.0
+ version: 2.31.0(@types/node@25.6.2)
'@types/lodash':
- specifier: ^4.14.173
- version: 4.17.17
- coveralls:
- specifier: ^3.1.1
- version: 3.1.1
- jest:
- specifier: ^30.0.0
- version: 30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
+ specifier: ^4.17.24
+ version: 4.17.24
+ '@types/node':
+ specifier: ^25.6.2
+ version: 25.6.2
+ '@vitest/coverage-v8':
+ specifier: ^4.1.5
+ version: 4.1.5(vitest@4.1.5)
rimraf:
- specifier: ^6.0.1
- version: 6.0.1
- ts-jest:
- specifier: ^29.4.0
- version: 29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.0)(@jest/types@30.0.0)(babel-jest@30.0.0(@babel/core@7.27.4))(jest-util@30.0.0)(jest@30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3)))(typescript@5.8.3)
+ specifier: ^6.1.3
+ version: 6.1.3
typescript:
- specifier: ^5.8.3
- version: 5.8.3
+ specifier: ^6.0.3
+ version: 6.0.3
+ vitest:
+ specifier: ^4.1.5
+ version: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@7.3.3(@types/node@25.6.2))
packages:
- '@ampproject/remapping@2.3.0':
- resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
- engines: {node: '>=6.0.0'}
-
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.27.5':
- resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.27.4':
- resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.27.5':
- resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-compilation-targets@7.27.2':
- resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.27.1':
- resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.27.3':
- resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-plugin-utils@7.27.1':
- resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-string-parser@7.27.1':
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-option@7.27.1':
- resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.27.6':
- resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==}
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.27.5':
- resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==}
+ '@babel/parser@7.29.3':
+ resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/plugin-syntax-async-generators@7.8.4':
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-bigint@7.8.3':
- resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-properties@7.12.13':
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-static-block@7.14.5':
- resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ '@babel/runtime@7.29.2':
+ resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-import-attributes@7.27.1':
- resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-import-meta@7.10.4':
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-json-strings@7.8.3':
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@bcoe/v8-coverage@1.0.2':
+ resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
+ engines: {node: '>=18'}
- '@babel/plugin-syntax-jsx@7.27.1':
- resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/apply-release-plan@7.1.1':
+ resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==}
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/assemble-release-plan@6.0.10':
+ resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==}
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/changelog-git@0.2.1':
+ resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==}
- '@babel/plugin-syntax-numeric-separator@7.10.4':
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/changelog-github@0.7.0':
+ resolution: {integrity: sha512-rBsbRvc4TVn+FvFnOVM3LxlFJfTXXCp8gfVJ+0BubxWNSVnLuAzowi5j+IEraLLP52w8AAs9QfKbPS3MMiXQJA==}
- '@babel/plugin-syntax-object-rest-spread@7.8.3':
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/cli@2.31.0':
+ resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==}
+ hasBin: true
- '@babel/plugin-syntax-optional-catch-binding@7.8.3':
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/config@3.1.4':
+ resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==}
- '@babel/plugin-syntax-optional-chaining@7.8.3':
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/errors@0.2.0':
+ resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
- '@babel/plugin-syntax-private-property-in-object@7.14.5':
- resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/get-dependents-graph@2.1.4':
+ resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==}
- '@babel/plugin-syntax-top-level-await@7.14.5':
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/get-github-info@0.8.0':
+ resolution: {integrity: sha512-cRnC+xdF0JIik7coko3iUP9qbnfi1iJQ3sAa6dE+Tx3+ET8bjFEm63PA4WEohgjYcmsOikPHWzPsMWWiZmntOQ==}
- '@babel/plugin-syntax-typescript@7.27.1':
- resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ '@changesets/get-release-plan@4.0.16':
+ resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==}
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
- engines: {node: '>=6.9.0'}
+ '@changesets/get-version-range-type@0.4.0':
+ resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
- '@babel/traverse@7.27.4':
- resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==}
- engines: {node: '>=6.9.0'}
+ '@changesets/git@3.0.4':
+ resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==}
- '@babel/types@7.27.6':
- resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==}
- engines: {node: '>=6.9.0'}
+ '@changesets/logger@0.1.1':
+ resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
- '@bcoe/v8-coverage@0.2.3':
- resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ '@changesets/parse@0.4.3':
+ resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==}
- '@cspotcode/source-map-support@0.8.1':
- resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
- engines: {node: '>=12'}
+ '@changesets/pre@2.0.2':
+ resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==}
- '@emnapi/core@1.4.3':
- resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==}
+ '@changesets/read@0.6.7':
+ resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==}
- '@emnapi/runtime@1.4.3':
- resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==}
+ '@changesets/should-skip-package@0.1.2':
+ resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==}
- '@emnapi/wasi-threads@1.0.2':
- resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==}
+ '@changesets/types@4.1.0':
+ resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==}
- '@fast-csv/format@5.0.2':
- resolution: {integrity: sha512-fRYcWvI8vs0Zxa/8fXd/QlmQYWWkJqKZPAXM+vksnplb3owQFKTPPh9JqOtD0L3flQw/AZjjXdPkD7Kp/uHm8g==}
+ '@changesets/types@6.1.0':
+ resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==}
- '@fast-csv/parse@5.0.2':
- resolution: {integrity: sha512-gMu1Btmm99TP+wc0tZnlH30E/F1Gw1Tah3oMDBHNPe9W8S68ixVHjt89Wg5lh7d9RuQMtwN+sGl5kxR891+fzw==}
+ '@changesets/write@0.4.0':
+ resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
- '@isaacs/balanced-match@4.0.1':
- resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
- engines: {node: 20 || >=22}
+ '@esbuild/aix-ppc64@0.27.7':
+ resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
- '@isaacs/brace-expansion@5.0.0':
- resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
- engines: {node: 20 || >=22}
+ '@esbuild/android-arm64@0.27.7':
+ resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
- '@isaacs/cliui@8.0.2':
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
+ '@esbuild/android-arm@0.27.7':
+ resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
- '@istanbuljs/load-nyc-config@1.1.0':
- resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
- engines: {node: '>=8'}
+ '@esbuild/android-x64@0.27.7':
+ resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
- '@istanbuljs/schema@0.1.3':
- resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
- engines: {node: '>=8'}
+ '@esbuild/darwin-arm64@0.27.7':
+ resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
- '@jest/console@30.0.0':
- resolution: {integrity: sha512-vfpJap6JZQ3I8sUN8dsFqNAKJYO4KIGxkcB+3Fw7Q/BJiWY5HwtMMiuT1oP0avsiDhjE/TCLaDgbGfHwDdBVeg==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/darwin-x64@0.27.7':
+ resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
- '@jest/core@30.0.0':
- resolution: {integrity: sha512-1zU39zFtWSl5ZuDK3Rd6P8S28MmS4F11x6Z4CURrgJ99iaAJg68hmdJ2SAHEEO6ociaNk43UhUYtHxWKEWoNYw==}
- 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
+ '@esbuild/freebsd-arm64@0.27.7':
+ resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
- '@jest/diff-sequences@30.0.0':
- resolution: {integrity: sha512-xMbtoCeKJDto86GW6AiwVv7M4QAuI56R7dVBr1RNGYbOT44M2TIzOiske2RxopBqkumDY+A1H55pGvuribRY9A==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/freebsd-x64@0.27.7':
+ resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
- '@jest/environment@30.0.0':
- resolution: {integrity: sha512-09sFbMMgS5JxYnvgmmtwIHhvoyzvR5fUPrVl8nOCrC5KdzmmErTcAxfWyAhJ2bv3rvHNQaKiS+COSG+O7oNbXw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-arm64@0.27.7':
+ resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
- '@jest/expect-utils@29.7.0':
- resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@esbuild/linux-arm@0.27.7':
+ resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
- '@jest/expect-utils@30.0.0':
- resolution: {integrity: sha512-UiWfsqNi/+d7xepfOv8KDcbbzcYtkWBe3a3kVDtg6M1kuN6CJ7b4HzIp5e1YHrSaQaVS8sdCoyCMCZClTLNKFQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-ia32@0.27.7':
+ resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
- '@jest/expect@30.0.0':
- resolution: {integrity: sha512-XZ3j6syhMeKiBknmmc8V3mNIb44kxLTbOQtaXA4IFdHy+vEN0cnXRzbRjdGBtrp4k1PWyMWNU3Fjz3iejrhpQg==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-loong64@0.27.7':
+ resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
- '@jest/fake-timers@30.0.0':
- resolution: {integrity: sha512-yzBmJcrMHAMcAEbV2w1kbxmx8WFpEz8Cth3wjLMSkq+LO8VeGKRhpr5+BUp7PPK+x4njq/b6mVnDR8e/tPL5ng==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-mips64el@0.27.7':
+ resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
- '@jest/get-type@30.0.0':
- resolution: {integrity: sha512-VZWMjrBzqfDKngQ7sUctKeLxanAbsBFoZnPxNIG6CmxK7Gv6K44yqd0nzveNIBfuhGZMmk1n5PGbvdSTOu0yTg==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-ppc64@0.27.7':
+ resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
- '@jest/globals@30.0.0':
- resolution: {integrity: sha512-OEzYes5A1xwBJVMPqFRa8NCao8Vr42nsUZuf/SpaJWoLE+4kyl6nCQZ1zqfipmCrIXQVALC5qJwKy/7NQQLPhw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-riscv64@0.27.7':
+ resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
- '@jest/pattern@30.0.0':
- resolution: {integrity: sha512-k+TpEThzLVXMkbdxf8KHjZ83Wl+G54ytVJoDIGWwS96Ql4xyASRjc6SU1hs5jHVql+hpyK9G8N7WuFhLpGHRpQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/linux-s390x@0.27.7':
+ resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
- '@jest/reporters@30.0.0':
- resolution: {integrity: sha512-5WHNlLO0Ok+/o6ML5IzgVm1qyERtLHBNhwn67PAq92H4hZ+n5uW/BYj1VVwmTdxIcNrZLxdV9qtpdZkXf16HxA==}
- 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
+ '@esbuild/linux-x64@0.27.7':
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
- '@jest/schemas@29.6.3':
- resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@esbuild/netbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
- '@jest/schemas@30.0.0':
- resolution: {integrity: sha512-NID2VRyaEkevCRz6badhfqYwri/RvMbiHY81rk3AkK/LaiB0LSxi1RdVZ7MpZdTjNugtZeGfpL0mLs9Kp3MrQw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/netbsd-x64@0.27.7':
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
- '@jest/snapshot-utils@30.0.0':
- resolution: {integrity: sha512-C/QSFUmvZEYptg2Vin84FggAphwHvj6la39vkw1CNOZQORWZ7O/H0BXmdeeeGnvlXDYY8TlFM5jgFnxLAxpFjA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/openbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
- '@jest/source-map@30.0.0':
- resolution: {integrity: sha512-oYBJ4d/NF4ZY3/7iq1VaeoERHRvlwKtrGClgescaXMIa1mmb+vfJd0xMgbW9yrI80IUA7qGbxpBWxlITrHkWoA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/openbsd-x64@0.27.7':
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
- '@jest/test-result@30.0.0':
- resolution: {integrity: sha512-685zco9HdgBaaWiB9T4xjLtBuN0Q795wgaQPpmuAeZPHwHZSoKFAUnozUtU+ongfi4l5VCz8AclOE5LAQdyjxQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/openharmony-arm64@0.27.7':
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
- '@jest/test-sequencer@30.0.0':
- resolution: {integrity: sha512-Hmvv5Yg6UmghXIcVZIydkT0nAK7M/hlXx9WMHR5cLVwdmc14/qUQt3mC72T6GN0olPC6DhmKE6Cd/pHsgDbuqQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/sunos-x64@0.27.7':
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
- '@jest/transform@30.0.0':
- resolution: {integrity: sha512-8xhpsCGYJsUjqpJOgLyMkeOSSlhqggFZEWAnZquBsvATtueoEs7CkMRxOUmJliF3E5x+mXmZ7gEEsHank029Og==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/win32-arm64@0.27.7':
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
- '@jest/types@29.6.3':
- resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ '@esbuild/win32-ia32@0.27.7':
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
- '@jest/types@30.0.0':
- resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@esbuild/win32-x64@0.27.7':
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
- '@jridgewell/gen-mapping@0.3.8':
- resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
- engines: {node: '>=6.0.0'}
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- '@jridgewell/set-array@1.2.1':
- resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/sourcemap-codec@1.5.0':
- resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
-
- '@jridgewell/trace-mapping@0.3.25':
- resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
-
- '@jridgewell/trace-mapping@0.3.9':
- resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
-
- '@napi-rs/wasm-runtime@0.2.11':
- resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==}
-
- '@pkgjs/parseargs@0.11.0':
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
-
- '@pkgr/core@0.2.7':
- resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
-
- '@sinclair/typebox@0.27.8':
- resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
-
- '@sinclair/typebox@0.34.35':
- resolution: {integrity: sha512-C6ypdODf2VZkgRT6sFM8E1F8vR+HcffniX0Kp8MsU8PIfrlXbNCBz0jzj17GjdmjTx1OtZzdH8+iALL21UjF5A==}
-
- '@sinonjs/commons@3.0.1':
- resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
-
- '@sinonjs/fake-timers@13.0.5':
- resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==}
-
- '@tsconfig/node10@1.0.11':
- resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
-
- '@tsconfig/node12@1.0.11':
- resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
-
- '@tsconfig/node14@1.0.3':
- resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
- '@tsconfig/node16@1.0.4':
- resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@tybys/wasm-util@0.9.0':
- resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+ '@manypkg/find-root@1.1.0':
+ resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
- '@types/babel__core@7.20.5':
- resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+ '@manypkg/get-packages@1.1.3':
+ resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
- '@types/babel__generator@7.27.0':
- resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
-
- '@types/babel__template@7.4.4':
- resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
-
- '@types/babel__traverse@7.20.7':
- resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==}
-
- '@types/istanbul-lib-coverage@2.0.6':
- resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
-
- '@types/istanbul-lib-report@3.0.3':
- resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
-
- '@types/istanbul-reports@3.0.4':
- resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
-
- '@types/jest@29.5.14':
- resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
-
- '@types/lodash@4.17.17':
- resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==}
-
- '@types/node@24.0.1':
- resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==}
-
- '@types/stack-utils@2.0.3':
- resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
-
- '@types/yargs-parser@21.0.3':
- resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
- '@types/yargs@17.0.33':
- resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
- '@ungap/structured-clone@1.3.0':
- resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
- '@unrs/resolver-binding-android-arm-eabi@1.9.0':
- resolution: {integrity: sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==}
+ '@rollup/rollup-android-arm-eabi@4.60.3':
+ resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==}
cpu: [arm]
os: [android]
- '@unrs/resolver-binding-android-arm64@1.9.0':
- resolution: {integrity: sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==}
+ '@rollup/rollup-android-arm64@4.60.3':
+ resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==}
cpu: [arm64]
os: [android]
- '@unrs/resolver-binding-darwin-arm64@1.9.0':
- resolution: {integrity: sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==}
+ '@rollup/rollup-darwin-arm64@4.60.3':
+ resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==}
cpu: [arm64]
os: [darwin]
- '@unrs/resolver-binding-darwin-x64@1.9.0':
- resolution: {integrity: sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==}
+ '@rollup/rollup-darwin-x64@4.60.3':
+ resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==}
cpu: [x64]
os: [darwin]
- '@unrs/resolver-binding-freebsd-x64@1.9.0':
- resolution: {integrity: sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==}
+ '@rollup/rollup-freebsd-arm64@4.60.3':
+ resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.60.3':
+ resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==}
cpu: [x64]
os: [freebsd]
- '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0':
- resolution: {integrity: sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
+ resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
- '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0':
- resolution: {integrity: sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==}
+ '@rollup/rollup-linux-arm-musleabihf@4.60.3':
+ resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==}
cpu: [arm]
os: [linux]
+ libc: [musl]
- '@unrs/resolver-binding-linux-arm64-gnu@1.9.0':
- resolution: {integrity: sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==}
+ '@rollup/rollup-linux-arm64-gnu@4.60.3':
+ resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@unrs/resolver-binding-linux-arm64-musl@1.9.0':
- resolution: {integrity: sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==}
+ '@rollup/rollup-linux-arm64-musl@4.60.3':
+ resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0':
- resolution: {integrity: sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==}
+ '@rollup/rollup-linux-loong64-gnu@4.60.3':
+ resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-loong64-musl@4.60.3':
+ resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.60.3':
+ resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
- '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0':
- resolution: {integrity: sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==}
+ '@rollup/rollup-linux-ppc64-musl@4.60.3':
+ resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.60.3':
+ resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
- '@unrs/resolver-binding-linux-riscv64-musl@1.9.0':
- resolution: {integrity: sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==}
+ '@rollup/rollup-linux-riscv64-musl@4.60.3':
+ resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==}
cpu: [riscv64]
os: [linux]
+ libc: [musl]
- '@unrs/resolver-binding-linux-s390x-gnu@1.9.0':
- resolution: {integrity: sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==}
+ '@rollup/rollup-linux-s390x-gnu@4.60.3':
+ resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
- '@unrs/resolver-binding-linux-x64-gnu@1.9.0':
- resolution: {integrity: sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==}
+ '@rollup/rollup-linux-x64-gnu@4.60.3':
+ resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@unrs/resolver-binding-linux-x64-musl@1.9.0':
- resolution: {integrity: sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==}
+ '@rollup/rollup-linux-x64-musl@4.60.3':
+ resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@unrs/resolver-binding-wasm32-wasi@1.9.0':
- resolution: {integrity: sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
+ '@rollup/rollup-openbsd-x64@4.60.3':
+ resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.60.3':
+ resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==}
+ cpu: [arm64]
+ os: [openharmony]
- '@unrs/resolver-binding-win32-arm64-msvc@1.9.0':
- resolution: {integrity: sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==}
+ '@rollup/rollup-win32-arm64-msvc@4.60.3':
+ resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==}
cpu: [arm64]
os: [win32]
- '@unrs/resolver-binding-win32-ia32-msvc@1.9.0':
- resolution: {integrity: sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==}
+ '@rollup/rollup-win32-ia32-msvc@4.60.3':
+ resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==}
cpu: [ia32]
os: [win32]
- '@unrs/resolver-binding-win32-x64-msvc@1.9.0':
- resolution: {integrity: sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==}
+ '@rollup/rollup-win32-x64-gnu@4.60.3':
+ resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==}
cpu: [x64]
os: [win32]
- acorn-walk@8.3.4:
- resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
- engines: {node: '>=0.4.0'}
-
- acorn@8.15.0:
- resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
- engines: {node: '>=0.4.0'}
- hasBin: true
-
- ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
- ansi-escapes@4.3.2:
- resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
- engines: {node: '>=8'}
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.1.0:
- resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
- engines: {node: '>=12'}
-
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
-
- ansi-styles@5.2.0:
- resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
- engines: {node: '>=10'}
-
- ansi-styles@6.2.1:
- resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
- engines: {node: '>=12'}
-
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
+ '@rollup/rollup-win32-x64-msvc@4.60.3':
+ resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==}
+ cpu: [x64]
+ os: [win32]
- arg@4.1.3:
- resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
- argparse@1.0.10:
- resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ '@types/chai@5.2.3':
+ resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
- asn1@0.2.6:
- resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
- assert-plus@1.0.0:
- resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
- engines: {node: '>=0.8'}
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
- async@3.2.6:
- resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
- asynckit@0.4.0:
- resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+ '@types/lodash@4.17.24':
+ resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==}
- aws-sign2@0.7.0:
- resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
+ '@types/node@12.20.55':
+ resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
- aws4@1.13.2:
- resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
+ '@types/node@25.6.2':
+ resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==}
- babel-jest@30.0.0:
- resolution: {integrity: sha512-JQ0DhdFjODbSawDf0026uZuwaqfKkQzk+9mwWkq2XkKFIaMhFVOxlVmbFCOnnC76jATdxrff3IiUAvOAJec6tw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@vitest/coverage-v8@4.1.5':
+ resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==}
peerDependencies:
- '@babel/core': ^7.11.0
-
- babel-plugin-istanbul@7.0.0:
- resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==}
- engines: {node: '>=12'}
-
- babel-plugin-jest-hoist@30.0.0:
- resolution: {integrity: sha512-DSRm+US/FCB4xPDD6Rnslb6PAF9Bej1DZ+1u4aTiqJnk7ZX12eHsnDiIOqjGvITCq+u6wLqUhgS+faCNbVY8+g==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@vitest/browser': 4.1.5
+ vitest: 4.1.5
+ peerDependenciesMeta:
+ '@vitest/browser':
+ optional: true
- babel-preset-current-node-syntax@1.1.0:
- resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
- peerDependencies:
- '@babel/core': ^7.0.0
+ '@vitest/expect@4.1.5':
+ resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==}
- babel-preset-jest@30.0.0:
- resolution: {integrity: sha512-hgEuu/W7gk8QOWUA9+m3Zk+WpGvKc1Egp6rFQEfYxEoM9Fk/q8nuTXNL65OkhwGrTApauEGgakOoWVXj+UfhKw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ '@vitest/mocker@4.1.5':
+ resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==}
peerDependencies:
- '@babel/core': ^7.11.0
-
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- bcrypt-pbkdf@1.0.2:
- resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
-
- brace-expansion@1.1.12:
- resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
-
- brace-expansion@2.0.2:
- resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
-
- braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
- engines: {node: '>=8'}
+ msw: ^2.4.9
+ vite: ^6.0.0 || ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
- browserslist@4.25.0:
- resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
+ '@vitest/pretty-format@4.1.5':
+ resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==}
- bs-logger@0.2.6:
- resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
- engines: {node: '>= 6'}
+ '@vitest/runner@4.1.5':
+ resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==}
- bser@2.1.1:
- resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+ '@vitest/snapshot@4.1.5':
+ resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==}
- buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ '@vitest/spy@4.1.5':
+ resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==}
- callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
+ '@vitest/utils@4.1.5':
+ resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==}
- camelcase@5.3.1:
- resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
- camelcase@6.3.0:
- resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
- engines: {node: '>=10'}
-
- caniuse-lite@1.0.30001723:
- resolution: {integrity: sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==}
-
- caseless@0.12.0:
- resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
- chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
- char-regex@1.0.2:
- resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
- engines: {node: '>=10'}
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- ci-info@3.9.0:
- resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
- ci-info@4.2.0:
- resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==}
- engines: {node: '>=8'}
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
- cjs-module-lexer@2.1.0:
- resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==}
+ ast-v8-to-istanbul@1.0.0:
+ resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==}
- cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
- co@4.6.0:
- resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
- engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ better-path-resolve@1.0.0:
+ resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
+ engines: {node: '>=4'}
- collect-v8-coverage@1.0.2:
- resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+ brace-expansion@5.0.6:
+ resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==}
+ engines: {node: 18 || 20 || >=22}
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ chai@6.2.2:
+ resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
+ engines: {node: '>=18'}
- combined-stream@1.0.8:
- resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
- engines: {node: '>= 0.8'}
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
- commander@14.0.0:
- resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
+ commander@14.0.3:
+ resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- core-util-is@1.0.2:
- resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
-
- coveralls@3.1.1:
- resolution: {integrity: sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==}
- engines: {node: '>=6'}
- hasBin: true
-
- create-require@1.1.1:
- resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
-
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
- dashdash@1.14.1:
- resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
- engines: {node: '>=0.10'}
-
- debug@4.4.1:
- resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- dedent@1.6.0:
- resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
-
- deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
-
- delayed-stream@1.0.0:
- resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
- engines: {node: '>=0.4.0'}
+ dataloader@1.4.0:
+ resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==}
- detect-newline@3.1.0:
- resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+ detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
- diff-sequences@29.6.3:
- resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
- diff@4.0.2:
- resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
- engines: {node: '>=0.3.1'}
+ dotenv@8.6.0:
+ resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==}
+ engines: {node: '>=10'}
- eastasianwidth@0.2.0:
- resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ enquirer@2.4.1:
+ resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+ engines: {node: '>=8.6'}
- ecc-jsbn@0.1.2:
- resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
+ es-module-lexer@2.1.0:
+ resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
- ejs@3.1.10:
- resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
- engines: {node: '>=0.10.0'}
+ esbuild@0.27.7:
+ resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
+ engines: {node: '>=18'}
hasBin: true
- electron-to-chromium@1.5.167:
- resolution: {integrity: sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==}
-
- emittery@0.13.1:
- resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
- engines: {node: '>=12'}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-
- error-ex@1.3.2:
- resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
-
- escalade@3.2.0:
- resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
- engines: {node: '>=6'}
-
- escape-string-regexp@2.0.0:
- resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
- engines: {node: '>=8'}
-
esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
- execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
-
- exit-x@0.2.2:
- resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==}
- engines: {node: '>= 0.8.0'}
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
- expect@29.7.0:
- resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ expect-type@1.3.0:
+ resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
+ engines: {node: '>=12.0.0'}
- expect@30.0.0:
- resolution: {integrity: sha512-xCdPp6gwiR9q9lsPCHANarIkFTN/IMZso6Kkq03sOm9IIGtzK/UJqml0dkhHibGh8HKOj8BIDIpZ0BZuU7QK6w==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
+ extendable-error@0.1.7:
+ resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
- extend@3.0.2:
- resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
- extsprintf@1.3.0:
- resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
- engines: {'0': node >=0.6.0}
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
- fast-csv@5.0.2:
- resolution: {integrity: sha512-CnB2zYAzzeh5Ta0UhSf32NexLy2SsEsSMY+fMWPV40k1OgaLEbm9Hf5dms3z/9fASZHBjB6i834079gVeksEqQ==}
- engines: {node: '>=10.0.0'}
-
- fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-
- fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
- fb-watchman@2.0.2:
- resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
-
- filelist@1.0.4:
- resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
@@ -872,73 +646,34 @@ packages:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
- foreground-child@3.3.1:
- resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
- engines: {node: '>=14'}
+ fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
- forever-agent@0.6.1:
- resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
-
- form-data@2.3.3:
- resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
- engines: {node: '>= 0.12'}
-
- fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ fs-extra@8.1.0:
+ resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+ engines: {node: '>=6 <7 || >=8'}
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
- get-caller-file@2.0.5:
- resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
- engines: {node: 6.* || 8.* || >= 10.*}
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
- get-package-type@0.1.0:
- resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
- engines: {node: '>=8.0.0'}
+ glob@13.0.6:
+ resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
+ engines: {node: 18 || 20 || >=22}
- get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
- getpass@0.1.7:
- resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
-
- glob@10.4.5:
- resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
- hasBin: true
-
- glob@11.0.3:
- resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==}
- engines: {node: 20 || >=22}
- hasBin: true
-
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
-
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- har-schema@2.0.0:
- resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
- engines: {node: '>=4'}
-
- har-validator@5.1.5:
- resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
- engines: {node: '>=6'}
- deprecated: this library is no longer supported
-
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -946,432 +681,147 @@ packages:
html-escaper@2.0.2:
resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
- http-signature@1.2.0:
- resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
- engines: {node: '>=0.8', npm: '>=1.3.7'}
-
- human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
-
- import-local@3.2.0:
- resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
- engines: {node: '>=8'}
+ human-id@4.1.3:
+ resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==}
hasBin: true
- imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
-
- inflight@1.0.6:
- resolution: {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.
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ iconv-lite@0.7.2:
+ resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+ engines: {node: '>=0.10.0'}
- is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
- is-generator-fn@2.1.0:
- resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
- engines: {node: '>=6'}
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
- is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
+ is-subdir@1.2.0:
+ resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
+ engines: {node: '>=4'}
- is-typedarray@1.0.0:
- resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- isstream@0.1.2:
- resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
-
istanbul-lib-coverage@3.2.2:
resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
engines: {node: '>=8'}
- istanbul-lib-instrument@6.0.3:
- resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
- engines: {node: '>=10'}
-
istanbul-lib-report@3.0.1:
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
engines: {node: '>=10'}
- istanbul-lib-source-maps@5.0.6:
- resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
- engines: {node: '>=10'}
-
- istanbul-reports@3.1.7:
- resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ istanbul-reports@3.2.0:
+ resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
engines: {node: '>=8'}
- jackspeak@3.4.3:
- resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
-
- jackspeak@4.1.1:
- resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==}
- engines: {node: 20 || >=22}
-
- jake@10.9.2:
- resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==}
- engines: {node: '>=10'}
- hasBin: true
-
- jest-changed-files@30.0.0:
- resolution: {integrity: sha512-rzGpvCdPdEV1Ma83c1GbZif0L2KAm3vXSXGRlpx7yCt0vhruwCNouKNRh3SiVcISHP1mb3iJzjb7tAEnNu1laQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-circus@30.0.0:
- resolution: {integrity: sha512-nTwah78qcKVyndBS650hAkaEmwWGaVsMMoWdJwMnH77XArRJow2Ir7hc+8p/mATtxVZuM9OTkA/3hQocRIK5Dw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-cli@30.0.0:
- resolution: {integrity: sha512-fWKAgrhlwVVCfeizsmIrPRTBYTzO82WSba3gJniZNR3PKXADgdC0mmCSK+M+t7N8RCXOVfY6kvCkvjUNtzmHYQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- jest-config@30.0.0:
- resolution: {integrity: sha512-p13a/zun+sbOMrBnTEUdq/5N7bZMOGd1yMfqtAJniPNuzURMay4I+vxZLK1XSDbjvIhmeVdG8h8RznqYyjctyg==}
- 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
-
- jest-diff@29.7.0:
- resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-diff@30.0.0:
- resolution: {integrity: sha512-TgT1+KipV8JTLXXeFX0qSvIJR/UXiNNojjxb/awh3vYlBZyChU/NEmyKmq+wijKjWEztyrGJFL790nqMqNjTHA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-docblock@30.0.0:
- resolution: {integrity: sha512-By/iQ0nvTzghEecGzUMCp1axLtBh+8wB4Hpoi5o+x1stycjEmPcH1mHugL4D9Q+YKV++vKeX/3ZTW90QC8ICPg==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-each@30.0.0:
- resolution: {integrity: sha512-qkFEW3cfytEjG2KtrhwtldZfXYnWSanO8xUMXLe4A6yaiHMHJUalk0Yyv4MQH6aeaxgi4sGVrukvF0lPMM7U1w==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-environment-node@30.0.0:
- resolution: {integrity: sha512-sF6lxyA25dIURyDk4voYmGU9Uwz2rQKMfjxKnDd19yk+qxKGrimFqS5YsPHWTlAVBo+YhWzXsqZoaMzrTFvqfg==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-get-type@29.6.3:
- resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-haste-map@30.0.0:
- resolution: {integrity: sha512-p4bXAhXTawTsADgQgTpbymdLaTyPW1xWNu1oIGG7/N3LIAbZVkH2JMJqS8/IUcnGR8Kc7WFE+vWbJvsqGCWZXw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-leak-detector@30.0.0:
- resolution: {integrity: sha512-E/ly1azdVVbZrS0T6FIpyYHvsdek4FNaThJTtggjV/8IpKxh3p9NLndeUZy2+sjAI3ncS+aM0uLLon/dBg8htA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-matcher-utils@29.7.0:
- resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ js-tokens@10.0.0:
+ resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==}
- jest-matcher-utils@30.0.0:
- resolution: {integrity: sha512-m5mrunqopkrqwG1mMdJxe1J4uGmS9AHHKYUmoxeQOxBcLjEvirIrIDwuKmUYrecPHVB/PUBpXs2gPoeA2FSSLQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-message-util@29.7.0:
- resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-message-util@30.0.0:
- resolution: {integrity: sha512-pV3qcrb4utEsa/U7UI2VayNzSDQcmCllBZLSoIucrESRu0geKThFZOjjh0kACDJFJRAQwsK7GVsmS6SpEceD8w==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-mock@30.0.0:
- resolution: {integrity: sha512-W2sRA4ALXILrEetEOh2ooZG6fZ01iwVs0OWMKSSWRcUlaLr4ESHuiKXDNTg+ZVgOq8Ei5445i/Yxrv59VT+XkA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-pnp-resolver@1.2.3:
- resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
- engines: {node: '>=6'}
- peerDependencies:
- jest-resolve: '*'
- peerDependenciesMeta:
- jest-resolve:
- optional: true
-
- jest-regex-util@30.0.0:
- resolution: {integrity: sha512-rT84010qRu/5OOU7a9TeidC2Tp3Qgt9Sty4pOZ/VSDuEmRupIjKZAb53gU3jr4ooMlhwScrgC9UixJxWzVu9oQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-resolve-dependencies@30.0.0:
- resolution: {integrity: sha512-Yhh7odCAUNXhluK1bCpwIlHrN1wycYaTlZwq1GdfNBEESNNI/z1j1a7dUEWHbmB9LGgv0sanxw3JPmWU8NeebQ==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-resolve@30.0.0:
- resolution: {integrity: sha512-zwWl1P15CcAfuQCEuxszjiKdsValhnWcj/aXg/R3aMHs8HVoCWHC4B/+5+1BirMoOud8NnN85GSP2LEZCbj3OA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-runner@30.0.0:
- resolution: {integrity: sha512-xbhmvWIc8X1IQ8G7xTv0AQJXKjBVyxoVJEJgy7A4RXsSaO+k/1ZSBbHwjnUhvYqMvwQPomWssDkUx6EoidEhlw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-runtime@30.0.0:
- resolution: {integrity: sha512-/O07qVgFrFAOGKGigojmdR3jUGz/y3+a/v9S/Yi2MHxsD+v6WcPppglZJw0gNJkRBArRDK8CFAwpM/VuEiiRjA==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-snapshot@30.0.0:
- resolution: {integrity: sha512-6oCnzjpvfj/UIOMTqKZ6gedWAUgaycMdV8Y8h2dRJPvc2wSjckN03pzeoonw8y33uVngfx7WMo1ygdRGEKOT7w==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-util@29.7.0:
- resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-util@30.0.0:
- resolution: {integrity: sha512-fhNBBM9uSUbd4Lzsf8l/kcAdaHD/4SgoI48en3HXcBEMwKwoleKFMZ6cYEYs21SB779PRuRCyNLmymApAm8tZw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-validate@30.0.0:
- resolution: {integrity: sha512-d6OkzsdlWItHAikUDs1hlLmpOIRhsZoXTCliV2XXalVQ3ZOeb9dy0CQ6AKulJu/XOZqpOEr/FiMH+FeOBVV+nw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-watcher@30.0.0:
- resolution: {integrity: sha512-fbAkojcyS53bOL/B7XYhahORq9cIaPwOgd/p9qW/hybbC8l6CzxfWJJxjlPBAIVN8dRipLR0zdhpGQdam+YBtw==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest-worker@30.0.0:
- resolution: {integrity: sha512-VZvxfWIybIvwK8N/Bsfe43LfQgd/rD0c4h5nLUx78CAqPxIQcW2qDjsVAC53iUR8yxzFIeCFFvWOh8en8hGzdg==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- jest@30.0.0:
- resolution: {integrity: sha512-/3G2iFwsUY95vkflmlDn/IdLyLWqpQXcftptooaPH4qkyU52V7qVYf1BjmdSPlp1+0fs6BmNtrGaSFwOfV07ew==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- js-yaml@3.14.1:
- resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
- hasBin: true
-
- jsbn@0.1.1:
- resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
-
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
- hasBin: true
-
- json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
-
- json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
- json-schema@0.4.0:
- resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
-
- json-stringify-safe@5.0.1:
- resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
-
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
+ js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
hasBin: true
- jsprim@1.4.2:
- resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
- engines: {node: '>=0.6.0'}
-
- lcov-parse@1.0.0:
- resolution: {integrity: sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==}
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
- leven@3.1.0:
- resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
- engines: {node: '>=6'}
-
- lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
- lodash.escaperegexp@4.1.2:
- resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==}
-
- lodash.groupby@4.6.0:
- resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==}
-
- lodash.isboolean@3.0.3:
- resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
-
- lodash.isequal@4.5.0:
- resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
- deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
-
- lodash.isfunction@3.0.9:
- resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==}
-
- lodash.isnil@4.0.0:
- resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==}
-
- lodash.isundefined@3.0.1:
- resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==}
-
- lodash.memoize@4.1.2:
- resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
-
- lodash.uniq@4.5.0:
- resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+ lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
- lodash@4.17.21:
- resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+ lodash@4.18.1:
+ resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
- log-driver@1.2.7:
- resolution: {integrity: sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==}
- engines: {node: '>=0.8.6'}
-
- lru-cache@10.4.3:
- resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
-
- lru-cache@11.1.0:
- resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==}
+ lru-cache@11.3.6:
+ resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==}
engines: {node: 20 || >=22}
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ magicast@0.5.2:
+ resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==}
make-dir@4.0.0:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
- make-error@1.3.6:
- resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
-
- makeerror@1.0.12:
- resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
-
- merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
- mime-db@1.52.0:
- resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
- engines: {node: '>= 0.6'}
-
- mime-types@2.1.35:
- resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
- engines: {node: '>= 0.6'}
-
- mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
-
- minimatch@10.0.3:
- resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
- engines: {node: 20 || >=22}
-
- minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-
- minimatch@5.1.6:
- resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
- engines: {node: '>=10'}
-
- minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ minimatch@10.2.5:
+ resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+ engines: {node: 18 || 20 || >=22}
- minipass@7.1.2:
- resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ minipass@7.1.3:
+ resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
engines: {node: '>=16 || 14 >=14.17'}
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+ mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
- napi-postinstall@0.2.4:
- resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==}
- engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ nanoid@3.3.12:
+ resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-
- node-int64@0.4.0:
- resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
- node-releases@2.0.19:
- resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+ obug@2.1.1:
+ resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
+ outdent@0.5.0:
+ resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
- npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ p-filter@2.1.0:
+ resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==}
engines: {node: '>=8'}
- oauth-sign@0.9.0:
- resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
-
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
- onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
-
p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
- p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
-
p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
+ p-map@2.1.0:
+ resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
+ engines: {node: '>=6'}
+
p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
@@ -1379,111 +829,88 @@ packages:
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
- parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
+ package-manager-detector@0.2.11:
+ resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
- path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
+ path-scurry@2.0.2:
+ resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
+ engines: {node: 18 || 20 || >=22}
- path-scurry@2.0.0:
- resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
- engines: {node: 20 || >=22}
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
- performance-now@2.1.0:
- resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
engines: {node: '>=8.6'}
- picomatch@4.0.2:
- resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
- pirates@4.0.7:
- resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
- engines: {node: '>= 6'}
-
- pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
-
- pretty-format@29.7.0:
- resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- pretty-format@30.0.0:
- resolution: {integrity: sha512-18NAOUr4ZOQiIR+BgI5NhQE7uREdx4ZyV0dyay5izh4yfQ+1T7BSvggxvRGoXocrRyevqW5OhScUjbi9GB8R8Q==}
- engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
-
- psl@1.15.0:
- resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
-
- punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
- pure-rand@7.0.1:
- resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==}
-
- qs@6.5.3:
- resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
- engines: {node: '>=0.6'}
+ postcss@8.5.14:
+ resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+ engines: {node: ^10 || ^12 || >=14}
- react-is@18.3.1:
- resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
- request@2.88.2:
- resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
- engines: {node: '>= 6'}
- deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
- require-directory@2.1.1:
- resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
- engines: {node: '>=0.10.0'}
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- resolve-cwd@3.0.0:
- resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
- engines: {node: '>=8'}
+ read-yaml-file@1.1.0:
+ resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
+ engines: {node: '>=6'}
resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
- rimraf@6.0.1:
- resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==}
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rimraf@6.1.3:
+ resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==}
engines: {node: 20 || >=22}
hasBin: true
- safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ rollup@4.60.3:
+ resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.7.2:
- resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ semver@7.8.0:
+ resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==}
engines: {node: '>=10'}
hasBin: true
@@ -1495,8 +922,8 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
@@ -1506,1937 +933,998 @@ packages:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
- source-map-support@0.5.13:
- resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
+ spawndamnit@3.0.1:
+ resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==}
+
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
- sshpk@1.18.0:
- resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
- engines: {node: '>=0.10.0'}
- hasBin: true
-
- stack-utils@2.0.6:
- resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
- engines: {node: '>=10'}
-
- string-length@4.0.2:
- resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
- engines: {node: '>=10'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
- string-width@5.1.2:
- resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
- engines: {node: '>=12'}
+ std-env@4.1.0:
+ resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==}
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
- strip-ansi@7.1.0:
- resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
- engines: {node: '>=12'}
-
- strip-bom@4.0.0:
- resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
- engines: {node: '>=8'}
-
- strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
-
- strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
- supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
+ term-size@2.2.1:
+ resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
+ engines: {node: '>=8'}
- synckit@0.11.8:
- resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==}
- engines: {node: ^14.18.0 || >=16.0.0}
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
- test-exclude@6.0.0:
- resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
- engines: {node: '>=8'}
+ tinyexec@1.1.2:
+ resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==}
+ engines: {node: '>=18'}
- tmpl@1.0.5:
- resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
+ engines: {node: '>=12.0.0'}
+
+ tinyrainbow@3.1.0:
+ resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==}
+ engines: {node: '>=14.0.0'}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
- tough-cookie@2.5.0:
- resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
- engines: {node: '>=0.8'}
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ undici-types@7.19.2:
+ resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==}
- ts-jest@29.4.0:
- resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
+ universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+
+ vite@7.3.3:
+ resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
- '@babel/core': '>=7.0.0-beta.0 <8'
- '@jest/transform': ^29.0.0 || ^30.0.0
- '@jest/types': ^29.0.0 || ^30.0.0
- babel-jest: ^29.0.0 || ^30.0.0
- esbuild: '*'
- jest: ^29.0.0 || ^30.0.0
- jest-util: ^29.0.0 || ^30.0.0
- typescript: '>=4.3 <6'
+ '@types/node': ^20.19.0 || >=22.12.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ lightningcss: ^1.21.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
peerDependenciesMeta:
- '@babel/core':
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
optional: true
- '@jest/transform':
+ sass-embedded:
optional: true
- '@jest/types':
+ stylus:
optional: true
- babel-jest:
+ sugarss:
optional: true
- esbuild:
+ terser:
optional: true
- jest-util:
+ tsx:
+ optional: true
+ yaml:
optional: true
- ts-node@10.9.2:
- resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ vitest@4.1.5:
+ resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==}
+ engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
- '@swc/core': '>=1.2.50'
- '@swc/wasm': '>=1.2.50'
- '@types/node': '*'
- typescript: '>=2.7'
+ '@edge-runtime/vm': '*'
+ '@opentelemetry/api': ^1.9.0
+ '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
+ '@vitest/browser-playwright': 4.1.5
+ '@vitest/browser-preview': 4.1.5
+ '@vitest/browser-webdriverio': 4.1.5
+ '@vitest/coverage-istanbul': 4.1.5
+ '@vitest/coverage-v8': 4.1.5
+ '@vitest/ui': 4.1.5
+ happy-dom: '*'
+ jsdom: '*'
+ vite: ^6.0.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
- '@swc/core':
+ '@edge-runtime/vm':
optional: true
- '@swc/wasm':
+ '@opentelemetry/api':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser-playwright':
+ optional: true
+ '@vitest/browser-preview':
+ optional: true
+ '@vitest/browser-webdriverio':
+ optional: true
+ '@vitest/coverage-istanbul':
+ optional: true
+ '@vitest/coverage-v8':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
optional: true
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- tunnel-agent@0.6.0:
- resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
-
- tweetnacl@0.14.5:
- resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
-
- type-detect@4.0.8:
- resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
- engines: {node: '>=4'}
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
- type-fest@0.21.3:
- resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
- engines: {node: '>=10'}
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
- type-fest@4.41.0:
- resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
- engines: {node: '>=16'}
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
- typescript@5.8.3:
- resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
- engines: {node: '>=14.17'}
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
hasBin: true
- undici-types@7.8.0:
- resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==}
+snapshots:
- unrs-resolver@1.9.0:
- resolution: {integrity: sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==}
+ '@babel/helper-string-parser@7.27.1': {}
- update-browserslist-db@1.1.3:
- resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
+ '@babel/helper-validator-identifier@7.28.5': {}
- uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ '@babel/parser@7.29.3':
+ dependencies:
+ '@babel/types': 7.29.0
- uuid@3.4.0:
- resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
- deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
- hasBin: true
+ '@babel/runtime@7.29.2': {}
- v8-compile-cache-lib@3.0.1:
- resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@bcoe/v8-coverage@1.0.2': {}
+
+ '@changesets/apply-release-plan@7.1.1':
+ 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.1.0
+ fs-extra: 7.0.1
+ lodash.startcase: 4.4.0
+ outdent: 0.5.0
+ prettier: 2.8.8
+ resolve-from: 5.0.0
+ semver: 7.8.0
- v8-to-istanbul@9.3.0:
- resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
- engines: {node: '>=10.12.0'}
+ '@changesets/assemble-release-plan@6.0.10':
+ 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.8.0
- verror@1.10.0:
- resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
- engines: {'0': node >=0.6.0}
+ '@changesets/changelog-git@0.2.1':
+ dependencies:
+ '@changesets/types': 6.1.0
- walker@1.0.8:
- resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+ '@changesets/changelog-github@0.7.0':
+ dependencies:
+ '@changesets/get-github-info': 0.8.0
+ '@changesets/types': 6.1.0
+ dotenv: 8.6.0
+ transitivePeerDependencies:
+ - encoding
+
+ '@changesets/cli@2.31.0(@types/node@25.6.2)':
+ 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.3(@types/node@25.6.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.11
+ picocolors: 1.1.1
+ resolve-from: 5.0.0
+ semver: 7.8.0
+ spawndamnit: 3.0.1
+ term-size: 2.2.1
+ transitivePeerDependencies:
+ - '@types/node'
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
+ '@changesets/config@3.1.4':
+ 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
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
+ '@changesets/errors@0.2.0':
+ dependencies:
+ extendable-error: 0.1.7
- wrap-ansi@8.1.0:
- resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
- engines: {node: '>=12'}
+ '@changesets/get-dependents-graph@2.1.4':
+ dependencies:
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ picocolors: 1.1.1
+ semver: 7.8.0
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ '@changesets/get-github-info@0.8.0':
+ dependencies:
+ dataloader: 1.4.0
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
- write-file-atomic@5.0.1:
- resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ '@changesets/get-release-plan@4.0.16':
+ 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
- y18n@5.0.8:
- resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
- engines: {node: '>=10'}
+ '@changesets/get-version-range-type@0.4.0': {}
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ '@changesets/git@3.0.4':
+ dependencies:
+ '@changesets/errors': 0.2.0
+ '@manypkg/get-packages': 1.1.3
+ is-subdir: 1.2.0
+ micromatch: 4.0.8
+ spawndamnit: 3.0.1
- yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
-
- yargs@17.7.2:
- resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
- engines: {node: '>=12'}
-
- yn@3.1.1:
- resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
- engines: {node: '>=6'}
-
- yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
-
-snapshots:
-
- '@ampproject/remapping@2.3.0':
+ '@changesets/logger@0.1.1':
dependencies:
- '@jridgewell/gen-mapping': 0.3.8
- '@jridgewell/trace-mapping': 0.3.25
-
- '@babel/code-frame@7.27.1':
- dependencies:
- '@babel/helper-validator-identifier': 7.27.1
- js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/compat-data@7.27.5': {}
-
- '@babel/core@7.27.4':
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.27.5
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4)
- '@babel/helpers': 7.27.6
- '@babel/parser': 7.27.5
- '@babel/template': 7.27.2
- '@babel/traverse': 7.27.4
- '@babel/types': 7.27.6
- convert-source-map: 2.0.0
- debug: 4.4.1
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/generator@7.27.5':
- dependencies:
- '@babel/parser': 7.27.5
- '@babel/types': 7.27.6
- '@jridgewell/gen-mapping': 0.3.8
- '@jridgewell/trace-mapping': 0.3.25
- jsesc: 3.1.0
-
- '@babel/helper-compilation-targets@7.27.2':
- dependencies:
- '@babel/compat-data': 7.27.5
- '@babel/helper-validator-option': 7.27.1
- browserslist: 4.25.0
- lru-cache: 5.1.1
- semver: 6.3.1
-
- '@babel/helper-module-imports@7.27.1':
- dependencies:
- '@babel/traverse': 7.27.4
- '@babel/types': 7.27.6
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-module-imports': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
- '@babel/traverse': 7.27.4
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-plugin-utils@7.27.1': {}
-
- '@babel/helper-string-parser@7.27.1': {}
-
- '@babel/helper-validator-identifier@7.27.1': {}
-
- '@babel/helper-validator-option@7.27.1': {}
-
- '@babel/helpers@7.27.6':
- dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.27.6
-
- '@babel/parser@7.27.5':
- dependencies:
- '@babel/types': 7.27.6
-
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)':
+ '@changesets/parse@0.4.3':
dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
+ '@changesets/types': 6.1.0
+ js-yaml: 4.1.1
- '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)':
+ '@changesets/pre@2.0.2':
dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
+ '@changesets/errors': 0.2.0
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
+ fs-extra: 7.0.1
- '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)':
+ '@changesets/read@0.6.7':
dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)':
- dependencies:
- '@babel/core': 7.27.4
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/template@7.27.2':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/parser': 7.27.5
- '@babel/types': 7.27.6
+ '@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.1
- '@babel/traverse@7.27.4':
+ '@changesets/should-skip-package@0.1.2':
dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.27.5
- '@babel/parser': 7.27.5
- '@babel/template': 7.27.2
- '@babel/types': 7.27.6
- debug: 4.4.1
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
+ '@changesets/types': 6.1.0
+ '@manypkg/get-packages': 1.1.3
- '@babel/types@7.27.6':
- dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
+ '@changesets/types@4.1.0': {}
- '@bcoe/v8-coverage@0.2.3': {}
+ '@changesets/types@6.1.0': {}
- '@cspotcode/source-map-support@0.8.1':
+ '@changesets/write@0.4.0':
dependencies:
- '@jridgewell/trace-mapping': 0.3.9
+ '@changesets/types': 6.1.0
+ fs-extra: 7.0.1
+ human-id: 4.1.3
+ prettier: 2.8.8
- '@emnapi/core@1.4.3':
- dependencies:
- '@emnapi/wasi-threads': 1.0.2
- tslib: 2.8.1
+ '@esbuild/aix-ppc64@0.27.7':
optional: true
- '@emnapi/runtime@1.4.3':
- dependencies:
- tslib: 2.8.1
+ '@esbuild/android-arm64@0.27.7':
optional: true
- '@emnapi/wasi-threads@1.0.2':
- dependencies:
- tslib: 2.8.1
+ '@esbuild/android-arm@0.27.7':
optional: true
- '@fast-csv/format@5.0.2':
- dependencies:
- lodash.escaperegexp: 4.1.2
- lodash.isboolean: 3.0.3
- lodash.isequal: 4.5.0
- lodash.isfunction: 3.0.9
- lodash.isnil: 4.0.0
-
- '@fast-csv/parse@5.0.2':
- dependencies:
- lodash.escaperegexp: 4.1.2
- lodash.groupby: 4.6.0
- lodash.isfunction: 3.0.9
- lodash.isnil: 4.0.0
- lodash.isundefined: 3.0.1
- lodash.uniq: 4.5.0
-
- '@isaacs/balanced-match@4.0.1': {}
-
- '@isaacs/brace-expansion@5.0.0':
- dependencies:
- '@isaacs/balanced-match': 4.0.1
-
- '@isaacs/cliui@8.0.2':
- dependencies:
- string-width: 5.1.2
- string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.0
- strip-ansi-cjs: strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: wrap-ansi@7.0.0
-
- '@istanbuljs/load-nyc-config@1.1.0':
- dependencies:
- camelcase: 5.3.1
- find-up: 4.1.0
- get-package-type: 0.1.0
- js-yaml: 3.14.1
- resolve-from: 5.0.0
-
- '@istanbuljs/schema@0.1.3': {}
-
- '@jest/console@30.0.0':
- dependencies:
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- chalk: 4.1.2
- jest-message-util: 30.0.0
- jest-util: 30.0.0
- slash: 3.0.0
-
- '@jest/core@30.0.0(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))':
- dependencies:
- '@jest/console': 30.0.0
- '@jest/pattern': 30.0.0
- '@jest/reporters': 30.0.0
- '@jest/test-result': 30.0.0
- '@jest/transform': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- 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.0.0
- jest-config: 30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
- jest-haste-map: 30.0.0
- jest-message-util: 30.0.0
- jest-regex-util: 30.0.0
- jest-resolve: 30.0.0
- jest-resolve-dependencies: 30.0.0
- jest-runner: 30.0.0
- jest-runtime: 30.0.0
- jest-snapshot: 30.0.0
- jest-util: 30.0.0
- jest-validate: 30.0.0
- jest-watcher: 30.0.0
- micromatch: 4.0.8
- pretty-format: 30.0.0
- slash: 3.0.0
- transitivePeerDependencies:
- - babel-plugin-macros
- - esbuild-register
- - supports-color
- - ts-node
-
- '@jest/diff-sequences@30.0.0': {}
-
- '@jest/environment@30.0.0':
- dependencies:
- '@jest/fake-timers': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- jest-mock: 30.0.0
-
- '@jest/expect-utils@29.7.0':
- dependencies:
- jest-get-type: 29.6.3
-
- '@jest/expect-utils@30.0.0':
- dependencies:
- '@jest/get-type': 30.0.0
-
- '@jest/expect@30.0.0':
- dependencies:
- expect: 30.0.0
- jest-snapshot: 30.0.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/fake-timers@30.0.0':
- dependencies:
- '@jest/types': 30.0.0
- '@sinonjs/fake-timers': 13.0.5
- '@types/node': 24.0.1
- jest-message-util: 30.0.0
- jest-mock: 30.0.0
- jest-util: 30.0.0
-
- '@jest/get-type@30.0.0': {}
-
- '@jest/globals@30.0.0':
- dependencies:
- '@jest/environment': 30.0.0
- '@jest/expect': 30.0.0
- '@jest/types': 30.0.0
- jest-mock: 30.0.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/pattern@30.0.0':
- dependencies:
- '@types/node': 24.0.1
- jest-regex-util: 30.0.0
-
- '@jest/reporters@30.0.0':
- dependencies:
- '@bcoe/v8-coverage': 0.2.3
- '@jest/console': 30.0.0
- '@jest/test-result': 30.0.0
- '@jest/transform': 30.0.0
- '@jest/types': 30.0.0
- '@jridgewell/trace-mapping': 0.3.25
- '@types/node': 24.0.1
- chalk: 4.1.2
- collect-v8-coverage: 1.0.2
- exit-x: 0.2.2
- glob: 10.4.5
- graceful-fs: 4.2.11
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-instrument: 6.0.3
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 5.0.6
- istanbul-reports: 3.1.7
- jest-message-util: 30.0.0
- jest-util: 30.0.0
- jest-worker: 30.0.0
- slash: 3.0.0
- string-length: 4.0.2
- v8-to-istanbul: 9.3.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/schemas@29.6.3':
- dependencies:
- '@sinclair/typebox': 0.27.8
-
- '@jest/schemas@30.0.0':
- dependencies:
- '@sinclair/typebox': 0.34.35
-
- '@jest/snapshot-utils@30.0.0':
- dependencies:
- '@jest/types': 30.0.0
- chalk: 4.1.2
- graceful-fs: 4.2.11
- natural-compare: 1.4.0
-
- '@jest/source-map@30.0.0':
- dependencies:
- '@jridgewell/trace-mapping': 0.3.25
- callsites: 3.1.0
- graceful-fs: 4.2.11
-
- '@jest/test-result@30.0.0':
- dependencies:
- '@jest/console': 30.0.0
- '@jest/types': 30.0.0
- '@types/istanbul-lib-coverage': 2.0.6
- collect-v8-coverage: 1.0.2
-
- '@jest/test-sequencer@30.0.0':
- dependencies:
- '@jest/test-result': 30.0.0
- graceful-fs: 4.2.11
- jest-haste-map: 30.0.0
- slash: 3.0.0
-
- '@jest/transform@30.0.0':
- dependencies:
- '@babel/core': 7.27.4
- '@jest/types': 30.0.0
- '@jridgewell/trace-mapping': 0.3.25
- babel-plugin-istanbul: 7.0.0
- 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.0.0
- jest-regex-util: 30.0.0
- jest-util: 30.0.0
- micromatch: 4.0.8
- pirates: 4.0.7
- slash: 3.0.0
- write-file-atomic: 5.0.1
- transitivePeerDependencies:
- - supports-color
-
- '@jest/types@29.6.3':
- dependencies:
- '@jest/schemas': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.6
- '@types/istanbul-reports': 3.0.4
- '@types/node': 24.0.1
- '@types/yargs': 17.0.33
- chalk: 4.1.2
-
- '@jest/types@30.0.0':
- dependencies:
- '@jest/pattern': 30.0.0
- '@jest/schemas': 30.0.0
- '@types/istanbul-lib-coverage': 2.0.6
- '@types/istanbul-reports': 3.0.4
- '@types/node': 24.0.1
- '@types/yargs': 17.0.33
- chalk: 4.1.2
-
- '@jridgewell/gen-mapping@0.3.8':
- dependencies:
- '@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.5.0
- '@jridgewell/trace-mapping': 0.3.25
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/set-array@1.2.1': {}
-
- '@jridgewell/sourcemap-codec@1.5.0': {}
-
- '@jridgewell/trace-mapping@0.3.25':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.0
-
- '@jridgewell/trace-mapping@0.3.9':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.0
-
- '@napi-rs/wasm-runtime@0.2.11':
- dependencies:
- '@emnapi/core': 1.4.3
- '@emnapi/runtime': 1.4.3
- '@tybys/wasm-util': 0.9.0
+ '@esbuild/android-x64@0.27.7':
optional: true
- '@pkgjs/parseargs@0.11.0':
+ '@esbuild/darwin-arm64@0.27.7':
optional: true
- '@pkgr/core@0.2.7': {}
-
- '@sinclair/typebox@0.27.8': {}
-
- '@sinclair/typebox@0.34.35': {}
-
- '@sinonjs/commons@3.0.1':
- dependencies:
- type-detect: 4.0.8
-
- '@sinonjs/fake-timers@13.0.5':
- dependencies:
- '@sinonjs/commons': 3.0.1
-
- '@tsconfig/node10@1.0.11': {}
-
- '@tsconfig/node12@1.0.11': {}
-
- '@tsconfig/node14@1.0.3': {}
-
- '@tsconfig/node16@1.0.4': {}
-
- '@tybys/wasm-util@0.9.0':
- dependencies:
- tslib: 2.8.1
+ '@esbuild/darwin-x64@0.27.7':
optional: true
- '@types/babel__core@7.20.5':
- dependencies:
- '@babel/parser': 7.27.5
- '@babel/types': 7.27.6
- '@types/babel__generator': 7.27.0
- '@types/babel__template': 7.4.4
- '@types/babel__traverse': 7.20.7
-
- '@types/babel__generator@7.27.0':
- dependencies:
- '@babel/types': 7.27.6
-
- '@types/babel__template@7.4.4':
- dependencies:
- '@babel/parser': 7.27.5
- '@babel/types': 7.27.6
-
- '@types/babel__traverse@7.20.7':
- dependencies:
- '@babel/types': 7.27.6
-
- '@types/istanbul-lib-coverage@2.0.6': {}
-
- '@types/istanbul-lib-report@3.0.3':
- dependencies:
- '@types/istanbul-lib-coverage': 2.0.6
-
- '@types/istanbul-reports@3.0.4':
- dependencies:
- '@types/istanbul-lib-report': 3.0.3
-
- '@types/jest@29.5.14':
- dependencies:
- expect: 29.7.0
- pretty-format: 29.7.0
-
- '@types/lodash@4.17.17': {}
-
- '@types/node@24.0.1':
- dependencies:
- undici-types: 7.8.0
-
- '@types/stack-utils@2.0.3': {}
-
- '@types/yargs-parser@21.0.3': {}
-
- '@types/yargs@17.0.33':
- dependencies:
- '@types/yargs-parser': 21.0.3
-
- '@ungap/structured-clone@1.3.0': {}
-
- '@unrs/resolver-binding-android-arm-eabi@1.9.0':
+ '@esbuild/freebsd-arm64@0.27.7':
optional: true
- '@unrs/resolver-binding-android-arm64@1.9.0':
+ '@esbuild/freebsd-x64@0.27.7':
optional: true
- '@unrs/resolver-binding-darwin-arm64@1.9.0':
+ '@esbuild/linux-arm64@0.27.7':
optional: true
- '@unrs/resolver-binding-darwin-x64@1.9.0':
+ '@esbuild/linux-arm@0.27.7':
optional: true
- '@unrs/resolver-binding-freebsd-x64@1.9.0':
+ '@esbuild/linux-ia32@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0':
+ '@esbuild/linux-loong64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0':
+ '@esbuild/linux-mips64el@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-arm64-gnu@1.9.0':
+ '@esbuild/linux-ppc64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-arm64-musl@1.9.0':
+ '@esbuild/linux-riscv64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0':
+ '@esbuild/linux-s390x@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0':
+ '@esbuild/linux-x64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-riscv64-musl@1.9.0':
+ '@esbuild/netbsd-arm64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-s390x-gnu@1.9.0':
+ '@esbuild/netbsd-x64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-x64-gnu@1.9.0':
+ '@esbuild/openbsd-arm64@0.27.7':
optional: true
- '@unrs/resolver-binding-linux-x64-musl@1.9.0':
+ '@esbuild/openbsd-x64@0.27.7':
optional: true
- '@unrs/resolver-binding-wasm32-wasi@1.9.0':
- dependencies:
- '@napi-rs/wasm-runtime': 0.2.11
+ '@esbuild/openharmony-arm64@0.27.7':
optional: true
- '@unrs/resolver-binding-win32-arm64-msvc@1.9.0':
+ '@esbuild/sunos-x64@0.27.7':
optional: true
- '@unrs/resolver-binding-win32-ia32-msvc@1.9.0':
+ '@esbuild/win32-arm64@0.27.7':
optional: true
- '@unrs/resolver-binding-win32-x64-msvc@1.9.0':
+ '@esbuild/win32-ia32@0.27.7':
optional: true
- acorn-walk@8.3.4:
- dependencies:
- acorn: 8.15.0
-
- acorn@8.15.0: {}
-
- ajv@6.12.6:
- dependencies:
- fast-deep-equal: 3.1.3
- fast-json-stable-stringify: 2.1.0
- json-schema-traverse: 0.4.1
- uri-js: 4.4.1
-
- ansi-escapes@4.3.2:
- dependencies:
- type-fest: 0.21.3
-
- ansi-regex@5.0.1: {}
-
- ansi-regex@6.1.0: {}
-
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
-
- ansi-styles@5.2.0: {}
-
- ansi-styles@6.2.1: {}
-
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
- arg@4.1.3: {}
-
- argparse@1.0.10:
- dependencies:
- sprintf-js: 1.0.3
-
- asn1@0.2.6:
- dependencies:
- safer-buffer: 2.1.2
-
- assert-plus@1.0.0: {}
-
- async@3.2.6: {}
-
- asynckit@0.4.0: {}
-
- aws-sign2@0.7.0: {}
-
- aws4@1.13.2: {}
-
- babel-jest@30.0.0(@babel/core@7.27.4):
- dependencies:
- '@babel/core': 7.27.4
- '@jest/transform': 30.0.0
- '@types/babel__core': 7.20.5
- babel-plugin-istanbul: 7.0.0
- babel-preset-jest: 30.0.0(@babel/core@7.27.4)
- chalk: 4.1.2
- graceful-fs: 4.2.11
- slash: 3.0.0
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-istanbul@7.0.0:
- dependencies:
- '@babel/helper-plugin-utils': 7.27.1
- '@istanbuljs/load-nyc-config': 1.1.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-instrument: 6.0.3
- test-exclude: 6.0.0
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-jest-hoist@30.0.0:
- dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.27.6
- '@types/babel__core': 7.20.5
-
- babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4):
- dependencies:
- '@babel/core': 7.27.4
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4)
- '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4)
-
- babel-preset-jest@30.0.0(@babel/core@7.27.4):
- dependencies:
- '@babel/core': 7.27.4
- babel-plugin-jest-hoist: 30.0.0
- babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4)
-
- balanced-match@1.0.2: {}
-
- bcrypt-pbkdf@1.0.2:
- dependencies:
- tweetnacl: 0.14.5
-
- brace-expansion@1.1.12:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
- brace-expansion@2.0.2:
- dependencies:
- balanced-match: 1.0.2
-
- braces@3.0.3:
- dependencies:
- fill-range: 7.1.1
-
- browserslist@4.25.0:
- dependencies:
- caniuse-lite: 1.0.30001723
- electron-to-chromium: 1.5.167
- node-releases: 2.0.19
- update-browserslist-db: 1.1.3(browserslist@4.25.0)
-
- bs-logger@0.2.6:
- dependencies:
- fast-json-stable-stringify: 2.1.0
-
- bser@2.1.1:
- dependencies:
- node-int64: 0.4.0
-
- buffer-from@1.1.2: {}
-
- callsites@3.1.0: {}
-
- camelcase@5.3.1: {}
-
- camelcase@6.3.0: {}
-
- caniuse-lite@1.0.30001723: {}
-
- caseless@0.12.0: {}
-
- chalk@4.1.2:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- char-regex@1.0.2: {}
-
- ci-info@3.9.0: {}
-
- ci-info@4.2.0: {}
-
- cjs-module-lexer@2.1.0: {}
-
- cliui@8.0.1:
- dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
-
- co@4.6.0: {}
-
- collect-v8-coverage@1.0.2: {}
-
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
- combined-stream@1.0.8:
- dependencies:
- delayed-stream: 1.0.0
-
- commander@14.0.0: {}
-
- concat-map@0.0.1: {}
-
- convert-source-map@2.0.0: {}
-
- core-util-is@1.0.2: {}
+ '@esbuild/win32-x64@0.27.7':
+ optional: true
- coveralls@3.1.1:
+ '@inquirer/external-editor@1.0.3(@types/node@25.6.2)':
dependencies:
- js-yaml: 3.14.1
- lcov-parse: 1.0.0
- log-driver: 1.2.7
- minimist: 1.2.8
- request: 2.88.2
+ chardet: 2.1.1
+ iconv-lite: 0.7.2
+ optionalDependencies:
+ '@types/node': 25.6.2
- create-require@1.1.1: {}
+ '@jridgewell/resolve-uri@3.1.2': {}
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
+ '@jridgewell/sourcemap-codec@1.5.5': {}
- dashdash@1.14.1:
+ '@jridgewell/trace-mapping@0.3.31':
dependencies:
- assert-plus: 1.0.0
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
- debug@4.4.1:
+ '@manypkg/find-root@1.1.0':
dependencies:
- ms: 2.1.3
-
- dedent@1.6.0: {}
-
- deepmerge@4.3.1: {}
-
- delayed-stream@1.0.0: {}
-
- detect-newline@3.1.0: {}
-
- diff-sequences@29.6.3: {}
-
- diff@4.0.2: {}
-
- eastasianwidth@0.2.0: {}
+ '@babel/runtime': 7.29.2
+ '@types/node': 12.20.55
+ find-up: 4.1.0
+ fs-extra: 8.1.0
- ecc-jsbn@0.1.2:
+ '@manypkg/get-packages@1.1.3':
dependencies:
- jsbn: 0.1.1
- safer-buffer: 2.1.2
+ '@babel/runtime': 7.29.2
+ '@changesets/types': 4.1.0
+ '@manypkg/find-root': 1.1.0
+ fs-extra: 8.1.0
+ globby: 11.1.0
+ read-yaml-file: 1.1.0
- ejs@3.1.10:
+ '@nodelib/fs.scandir@2.1.5':
dependencies:
- jake: 10.9.2
-
- electron-to-chromium@1.5.167: {}
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
- emittery@0.13.1: {}
+ '@nodelib/fs.stat@2.0.5': {}
- emoji-regex@8.0.0: {}
-
- emoji-regex@9.2.2: {}
-
- error-ex@1.3.2:
+ '@nodelib/fs.walk@1.2.8':
dependencies:
- is-arrayish: 0.2.1
-
- escalade@3.2.0: {}
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.1
- escape-string-regexp@2.0.0: {}
-
- esprima@4.0.1: {}
+ '@rollup/rollup-android-arm-eabi@4.60.3':
+ optional: true
- execa@5.1.1:
- dependencies:
- cross-spawn: 7.0.6
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
+ '@rollup/rollup-android-arm64@4.60.3':
+ optional: true
- exit-x@0.2.2: {}
+ '@rollup/rollup-darwin-arm64@4.60.3':
+ optional: true
- expect@29.7.0:
- dependencies:
- '@jest/expect-utils': 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
+ '@rollup/rollup-darwin-x64@4.60.3':
+ optional: true
- expect@30.0.0:
- dependencies:
- '@jest/expect-utils': 30.0.0
- '@jest/get-type': 30.0.0
- jest-matcher-utils: 30.0.0
- jest-message-util: 30.0.0
- jest-mock: 30.0.0
- jest-util: 30.0.0
+ '@rollup/rollup-freebsd-arm64@4.60.3':
+ optional: true
- extend@3.0.2: {}
+ '@rollup/rollup-freebsd-x64@4.60.3':
+ optional: true
- extsprintf@1.3.0: {}
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.3':
+ optional: true
- fast-csv@5.0.2:
- dependencies:
- '@fast-csv/format': 5.0.2
- '@fast-csv/parse': 5.0.2
+ '@rollup/rollup-linux-arm-musleabihf@4.60.3':
+ optional: true
- fast-deep-equal@3.1.3: {}
+ '@rollup/rollup-linux-arm64-gnu@4.60.3':
+ optional: true
- fast-json-stable-stringify@2.1.0: {}
+ '@rollup/rollup-linux-arm64-musl@4.60.3':
+ optional: true
- fb-watchman@2.0.2:
- dependencies:
- bser: 2.1.1
+ '@rollup/rollup-linux-loong64-gnu@4.60.3':
+ optional: true
- filelist@1.0.4:
- dependencies:
- minimatch: 5.1.6
+ '@rollup/rollup-linux-loong64-musl@4.60.3':
+ optional: true
- fill-range@7.1.1:
- dependencies:
- to-regex-range: 5.0.1
+ '@rollup/rollup-linux-ppc64-gnu@4.60.3':
+ optional: true
- find-up@4.1.0:
- dependencies:
- locate-path: 5.0.0
- path-exists: 4.0.0
+ '@rollup/rollup-linux-ppc64-musl@4.60.3':
+ optional: true
- foreground-child@3.3.1:
- dependencies:
- cross-spawn: 7.0.6
- signal-exit: 4.1.0
+ '@rollup/rollup-linux-riscv64-gnu@4.60.3':
+ optional: true
- forever-agent@0.6.1: {}
+ '@rollup/rollup-linux-riscv64-musl@4.60.3':
+ optional: true
- form-data@2.3.3:
- dependencies:
- asynckit: 0.4.0
- combined-stream: 1.0.8
- mime-types: 2.1.35
+ '@rollup/rollup-linux-s390x-gnu@4.60.3':
+ optional: true
- fs.realpath@1.0.0: {}
+ '@rollup/rollup-linux-x64-gnu@4.60.3':
+ optional: true
- fsevents@2.3.3:
+ '@rollup/rollup-linux-x64-musl@4.60.3':
optional: true
- gensync@1.0.0-beta.2: {}
+ '@rollup/rollup-openbsd-x64@4.60.3':
+ optional: true
- get-caller-file@2.0.5: {}
+ '@rollup/rollup-openharmony-arm64@4.60.3':
+ optional: true
- get-package-type@0.1.0: {}
+ '@rollup/rollup-win32-arm64-msvc@4.60.3':
+ optional: true
- get-stream@6.0.1: {}
+ '@rollup/rollup-win32-ia32-msvc@4.60.3':
+ optional: true
- getpass@0.1.7:
- dependencies:
- assert-plus: 1.0.0
+ '@rollup/rollup-win32-x64-gnu@4.60.3':
+ optional: true
- glob@10.4.5:
- dependencies:
- foreground-child: 3.3.1
- jackspeak: 3.4.3
- minimatch: 9.0.5
- minipass: 7.1.2
- package-json-from-dist: 1.0.1
- path-scurry: 1.11.1
+ '@rollup/rollup-win32-x64-msvc@4.60.3':
+ optional: true
- glob@11.0.3:
- dependencies:
- foreground-child: 3.3.1
- jackspeak: 4.1.1
- minimatch: 10.0.3
- minipass: 7.1.2
- package-json-from-dist: 1.0.1
- path-scurry: 2.0.0
+ '@standard-schema/spec@1.1.0': {}
- glob@7.2.3:
+ '@types/chai@5.2.3':
dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
+ '@types/deep-eql': 4.0.2
+ assertion-error: 2.0.1
- globals@11.12.0: {}
-
- graceful-fs@4.2.11: {}
+ '@types/deep-eql@4.0.2': {}
- har-schema@2.0.0: {}
+ '@types/estree@1.0.8': {}
- har-validator@5.1.5:
- dependencies:
- ajv: 6.12.6
- har-schema: 2.0.0
+ '@types/estree@1.0.9': {}
- has-flag@4.0.0: {}
+ '@types/lodash@4.17.24': {}
- html-escaper@2.0.2: {}
+ '@types/node@12.20.55': {}
- http-signature@1.2.0:
+ '@types/node@25.6.2':
dependencies:
- assert-plus: 1.0.0
- jsprim: 1.4.2
- sshpk: 1.18.0
+ undici-types: 7.19.2
- human-signals@2.1.0: {}
+ '@vitest/coverage-v8@4.1.5(vitest@4.1.5)':
+ dependencies:
+ '@bcoe/v8-coverage': 1.0.2
+ '@vitest/utils': 4.1.5
+ ast-v8-to-istanbul: 1.0.0
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-report: 3.0.1
+ istanbul-reports: 3.2.0
+ magicast: 0.5.2
+ obug: 2.1.1
+ std-env: 4.1.0
+ tinyrainbow: 3.1.0
+ vitest: 4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@7.3.3(@types/node@25.6.2))
+
+ '@vitest/expect@4.1.5':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ '@types/chai': 5.2.3
+ '@vitest/spy': 4.1.5
+ '@vitest/utils': 4.1.5
+ chai: 6.2.2
+ tinyrainbow: 3.1.0
+
+ '@vitest/mocker@4.1.5(vite@7.3.3(@types/node@25.6.2))':
+ dependencies:
+ '@vitest/spy': 4.1.5
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ optionalDependencies:
+ vite: 7.3.3(@types/node@25.6.2)
- import-local@3.2.0:
+ '@vitest/pretty-format@4.1.5':
dependencies:
- pkg-dir: 4.2.0
- resolve-cwd: 3.0.0
+ tinyrainbow: 3.1.0
- imurmurhash@0.1.4: {}
+ '@vitest/runner@4.1.5':
+ dependencies:
+ '@vitest/utils': 4.1.5
+ pathe: 2.0.3
- inflight@1.0.6:
+ '@vitest/snapshot@4.1.5':
dependencies:
- once: 1.4.0
- wrappy: 1.0.2
+ '@vitest/pretty-format': 4.1.5
+ '@vitest/utils': 4.1.5
+ magic-string: 0.30.21
+ pathe: 2.0.3
- inherits@2.0.4: {}
+ '@vitest/spy@4.1.5': {}
- is-arrayish@0.2.1: {}
+ '@vitest/utils@4.1.5':
+ dependencies:
+ '@vitest/pretty-format': 4.1.5
+ convert-source-map: 2.0.0
+ tinyrainbow: 3.1.0
- is-fullwidth-code-point@3.0.0: {}
+ ansi-colors@4.1.3: {}
- is-generator-fn@2.1.0: {}
+ ansi-regex@5.0.1: {}
- is-number@7.0.0: {}
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
- is-stream@2.0.1: {}
+ argparse@2.0.1: {}
- is-typedarray@1.0.0: {}
+ array-union@2.1.0: {}
- isexe@2.0.0: {}
+ assertion-error@2.0.1: {}
- isstream@0.1.2: {}
+ ast-v8-to-istanbul@1.0.0:
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ estree-walker: 3.0.3
+ js-tokens: 10.0.0
- istanbul-lib-coverage@3.2.2: {}
+ balanced-match@4.0.4: {}
- istanbul-lib-instrument@6.0.3:
+ better-path-resolve@1.0.0:
dependencies:
- '@babel/core': 7.27.4
- '@babel/parser': 7.27.5
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.2
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
+ is-windows: 1.0.2
- istanbul-lib-report@3.0.1:
+ brace-expansion@5.0.6:
dependencies:
- istanbul-lib-coverage: 3.2.2
- make-dir: 4.0.0
- supports-color: 7.2.0
+ balanced-match: 4.0.4
- istanbul-lib-source-maps@5.0.6:
+ braces@3.0.3:
dependencies:
- '@jridgewell/trace-mapping': 0.3.25
- debug: 4.4.1
- istanbul-lib-coverage: 3.2.2
- transitivePeerDependencies:
- - supports-color
+ fill-range: 7.1.1
- istanbul-reports@3.1.7:
- dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.1
+ chai@6.2.2: {}
- jackspeak@3.4.3:
- dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
-
- jackspeak@4.1.1:
- dependencies:
- '@isaacs/cliui': 8.0.2
-
- jake@10.9.2:
- dependencies:
- async: 3.2.6
- chalk: 4.1.2
- filelist: 1.0.4
- minimatch: 3.1.2
-
- jest-changed-files@30.0.0:
- dependencies:
- execa: 5.1.1
- jest-util: 30.0.0
- p-limit: 3.1.0
-
- jest-circus@30.0.0:
- dependencies:
- '@jest/environment': 30.0.0
- '@jest/expect': 30.0.0
- '@jest/test-result': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- chalk: 4.1.2
- co: 4.6.0
- dedent: 1.6.0
- is-generator-fn: 2.1.0
- jest-each: 30.0.0
- jest-matcher-utils: 30.0.0
- jest-message-util: 30.0.0
- jest-runtime: 30.0.0
- jest-snapshot: 30.0.0
- jest-util: 30.0.0
- p-limit: 3.1.0
- pretty-format: 30.0.0
- pure-rand: 7.0.1
- slash: 3.0.0
- stack-utils: 2.0.6
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
-
- jest-cli@30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3)):
- dependencies:
- '@jest/core': 30.0.0(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
- '@jest/test-result': 30.0.0
- '@jest/types': 30.0.0
- chalk: 4.1.2
- exit-x: 0.2.2
- import-local: 3.2.0
- jest-config: 30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
- jest-util: 30.0.0
- jest-validate: 30.0.0
- yargs: 17.7.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - esbuild-register
- - supports-color
- - ts-node
-
- jest-config@30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3)):
- dependencies:
- '@babel/core': 7.27.4
- '@jest/get-type': 30.0.0
- '@jest/pattern': 30.0.0
- '@jest/test-sequencer': 30.0.0
- '@jest/types': 30.0.0
- babel-jest: 30.0.0(@babel/core@7.27.4)
- chalk: 4.1.2
- ci-info: 4.2.0
- deepmerge: 4.3.1
- glob: 10.4.5
- graceful-fs: 4.2.11
- jest-circus: 30.0.0
- jest-docblock: 30.0.0
- jest-environment-node: 30.0.0
- jest-regex-util: 30.0.0
- jest-resolve: 30.0.0
- jest-runner: 30.0.0
- jest-util: 30.0.0
- jest-validate: 30.0.0
- micromatch: 4.0.8
- parse-json: 5.2.0
- pretty-format: 30.0.0
- slash: 3.0.0
- strip-json-comments: 3.1.1
- optionalDependencies:
- '@types/node': 24.0.1
- ts-node: 10.9.2(@types/node@24.0.1)(typescript@5.8.3)
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
+ chardet@2.1.1: {}
- jest-diff@29.7.0:
- dependencies:
- chalk: 4.1.2
- diff-sequences: 29.6.3
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
+ commander@14.0.3: {}
- jest-diff@30.0.0:
- dependencies:
- '@jest/diff-sequences': 30.0.0
- '@jest/get-type': 30.0.0
- chalk: 4.1.2
- pretty-format: 30.0.0
+ convert-source-map@2.0.0: {}
- jest-docblock@30.0.0:
+ cross-spawn@7.0.6:
dependencies:
- detect-newline: 3.1.0
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
- jest-each@30.0.0:
- dependencies:
- '@jest/get-type': 30.0.0
- '@jest/types': 30.0.0
- chalk: 4.1.2
- jest-util: 30.0.0
- pretty-format: 30.0.0
+ dataloader@1.4.0: {}
- jest-environment-node@30.0.0:
+ detect-indent@6.1.0: {}
+
+ dir-glob@3.0.1:
dependencies:
- '@jest/environment': 30.0.0
- '@jest/fake-timers': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- jest-mock: 30.0.0
- jest-util: 30.0.0
- jest-validate: 30.0.0
+ path-type: 4.0.0
- jest-get-type@29.6.3: {}
+ dotenv@8.6.0: {}
- jest-haste-map@30.0.0:
+ enquirer@2.4.1:
dependencies:
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- anymatch: 3.1.3
- fb-watchman: 2.0.2
- graceful-fs: 4.2.11
- jest-regex-util: 30.0.0
- jest-util: 30.0.0
- jest-worker: 30.0.0
- micromatch: 4.0.8
- walker: 1.0.8
+ ansi-colors: 4.1.3
+ strip-ansi: 6.0.1
+
+ es-module-lexer@2.1.0: {}
+
+ esbuild@0.27.7:
optionalDependencies:
- fsevents: 2.3.3
+ '@esbuild/aix-ppc64': 0.27.7
+ '@esbuild/android-arm': 0.27.7
+ '@esbuild/android-arm64': 0.27.7
+ '@esbuild/android-x64': 0.27.7
+ '@esbuild/darwin-arm64': 0.27.7
+ '@esbuild/darwin-x64': 0.27.7
+ '@esbuild/freebsd-arm64': 0.27.7
+ '@esbuild/freebsd-x64': 0.27.7
+ '@esbuild/linux-arm': 0.27.7
+ '@esbuild/linux-arm64': 0.27.7
+ '@esbuild/linux-ia32': 0.27.7
+ '@esbuild/linux-loong64': 0.27.7
+ '@esbuild/linux-mips64el': 0.27.7
+ '@esbuild/linux-ppc64': 0.27.7
+ '@esbuild/linux-riscv64': 0.27.7
+ '@esbuild/linux-s390x': 0.27.7
+ '@esbuild/linux-x64': 0.27.7
+ '@esbuild/netbsd-arm64': 0.27.7
+ '@esbuild/netbsd-x64': 0.27.7
+ '@esbuild/openbsd-arm64': 0.27.7
+ '@esbuild/openbsd-x64': 0.27.7
+ '@esbuild/openharmony-arm64': 0.27.7
+ '@esbuild/sunos-x64': 0.27.7
+ '@esbuild/win32-arm64': 0.27.7
+ '@esbuild/win32-ia32': 0.27.7
+ '@esbuild/win32-x64': 0.27.7
- jest-leak-detector@30.0.0:
- dependencies:
- '@jest/get-type': 30.0.0
- pretty-format: 30.0.0
+ esprima@4.0.1: {}
- jest-matcher-utils@29.7.0:
+ estree-walker@3.0.3:
dependencies:
- chalk: 4.1.2
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
+ '@types/estree': 1.0.9
- jest-matcher-utils@30.0.0:
- dependencies:
- '@jest/get-type': 30.0.0
- chalk: 4.1.2
- jest-diff: 30.0.0
- pretty-format: 30.0.0
+ expect-type@1.3.0: {}
- jest-message-util@29.7.0:
- dependencies:
- '@babel/code-frame': 7.27.1
- '@jest/types': 29.6.3
- '@types/stack-utils': 2.0.3
- chalk: 4.1.2
- graceful-fs: 4.2.11
- micromatch: 4.0.8
- pretty-format: 29.7.0
- slash: 3.0.0
- stack-utils: 2.0.6
+ extendable-error@0.1.7: {}
- jest-message-util@30.0.0:
+ fast-glob@3.3.3:
dependencies:
- '@babel/code-frame': 7.27.1
- '@jest/types': 30.0.0
- '@types/stack-utils': 2.0.3
- chalk: 4.1.2
- graceful-fs: 4.2.11
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
micromatch: 4.0.8
- pretty-format: 30.0.0
- slash: 3.0.0
- stack-utils: 2.0.6
- jest-mock@30.0.0:
+ fastq@1.20.1:
dependencies:
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- jest-util: 30.0.0
+ reusify: 1.1.0
- jest-pnp-resolver@1.2.3(jest-resolve@30.0.0):
+ fdir@6.5.0(picomatch@4.0.4):
optionalDependencies:
- jest-resolve: 30.0.0
+ picomatch: 4.0.4
- jest-regex-util@30.0.0: {}
-
- jest-resolve-dependencies@30.0.0:
+ fill-range@7.1.1:
dependencies:
- jest-regex-util: 30.0.0
- jest-snapshot: 30.0.0
- transitivePeerDependencies:
- - supports-color
+ to-regex-range: 5.0.1
- jest-resolve@30.0.0:
+ find-up@4.1.0:
dependencies:
- chalk: 4.1.2
- graceful-fs: 4.2.11
- jest-haste-map: 30.0.0
- jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0)
- jest-util: 30.0.0
- jest-validate: 30.0.0
- slash: 3.0.0
- unrs-resolver: 1.9.0
-
- jest-runner@30.0.0:
- dependencies:
- '@jest/console': 30.0.0
- '@jest/environment': 30.0.0
- '@jest/test-result': 30.0.0
- '@jest/transform': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- chalk: 4.1.2
- emittery: 0.13.1
- exit-x: 0.2.2
- graceful-fs: 4.2.11
- jest-docblock: 30.0.0
- jest-environment-node: 30.0.0
- jest-haste-map: 30.0.0
- jest-leak-detector: 30.0.0
- jest-message-util: 30.0.0
- jest-resolve: 30.0.0
- jest-runtime: 30.0.0
- jest-util: 30.0.0
- jest-watcher: 30.0.0
- jest-worker: 30.0.0
- p-limit: 3.1.0
- source-map-support: 0.5.13
- transitivePeerDependencies:
- - supports-color
-
- jest-runtime@30.0.0:
- dependencies:
- '@jest/environment': 30.0.0
- '@jest/fake-timers': 30.0.0
- '@jest/globals': 30.0.0
- '@jest/source-map': 30.0.0
- '@jest/test-result': 30.0.0
- '@jest/transform': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- chalk: 4.1.2
- cjs-module-lexer: 2.1.0
- collect-v8-coverage: 1.0.2
- glob: 10.4.5
- graceful-fs: 4.2.11
- jest-haste-map: 30.0.0
- jest-message-util: 30.0.0
- jest-mock: 30.0.0
- jest-regex-util: 30.0.0
- jest-resolve: 30.0.0
- jest-snapshot: 30.0.0
- jest-util: 30.0.0
- slash: 3.0.0
- strip-bom: 4.0.0
- transitivePeerDependencies:
- - supports-color
-
- jest-snapshot@30.0.0:
- dependencies:
- '@babel/core': 7.27.4
- '@babel/generator': 7.27.5
- '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4)
- '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4)
- '@babel/types': 7.27.6
- '@jest/expect-utils': 30.0.0
- '@jest/get-type': 30.0.0
- '@jest/snapshot-utils': 30.0.0
- '@jest/transform': 30.0.0
- '@jest/types': 30.0.0
- babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4)
- chalk: 4.1.2
- expect: 30.0.0
- graceful-fs: 4.2.11
- jest-diff: 30.0.0
- jest-matcher-utils: 30.0.0
- jest-message-util: 30.0.0
- jest-util: 30.0.0
- pretty-format: 30.0.0
- semver: 7.7.2
- synckit: 0.11.8
- transitivePeerDependencies:
- - supports-color
+ locate-path: 5.0.0
+ path-exists: 4.0.0
- jest-util@29.7.0:
+ fs-extra@7.0.1:
dependencies:
- '@jest/types': 29.6.3
- '@types/node': 24.0.1
- chalk: 4.1.2
- ci-info: 3.9.0
graceful-fs: 4.2.11
- picomatch: 2.3.1
+ jsonfile: 4.0.0
+ universalify: 0.1.2
- jest-util@30.0.0:
+ fs-extra@8.1.0:
dependencies:
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- chalk: 4.1.2
- ci-info: 4.2.0
graceful-fs: 4.2.11
- picomatch: 4.0.2
-
- jest-validate@30.0.0:
- dependencies:
- '@jest/get-type': 30.0.0
- '@jest/types': 30.0.0
- camelcase: 6.3.0
- chalk: 4.1.2
- leven: 3.1.0
- pretty-format: 30.0.0
-
- jest-watcher@30.0.0:
- dependencies:
- '@jest/test-result': 30.0.0
- '@jest/types': 30.0.0
- '@types/node': 24.0.1
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- emittery: 0.13.1
- jest-util: 30.0.0
- string-length: 4.0.2
-
- jest-worker@30.0.0:
- dependencies:
- '@types/node': 24.0.1
- '@ungap/structured-clone': 1.3.0
- jest-util: 30.0.0
- merge-stream: 2.0.0
- supports-color: 8.1.1
-
- jest@30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3)):
- dependencies:
- '@jest/core': 30.0.0(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
- '@jest/types': 30.0.0
- import-local: 3.2.0
- jest-cli: 30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - esbuild-register
- - supports-color
- - ts-node
+ jsonfile: 4.0.0
+ universalify: 0.1.2
- js-tokens@4.0.0: {}
+ fsevents@2.3.3:
+ optional: true
- js-yaml@3.14.1:
+ glob-parent@5.1.2:
dependencies:
- argparse: 1.0.10
- esprima: 4.0.1
-
- jsbn@0.1.1: {}
-
- jsesc@3.1.0: {}
-
- json-parse-even-better-errors@2.3.1: {}
-
- json-schema-traverse@0.4.1: {}
+ is-glob: 4.0.3
- json-schema@0.4.0: {}
-
- json-stringify-safe@5.0.1: {}
-
- json5@2.2.3: {}
-
- jsprim@1.4.2:
+ glob@13.0.6:
dependencies:
- assert-plus: 1.0.0
- extsprintf: 1.3.0
- json-schema: 0.4.0
- verror: 1.10.0
-
- lcov-parse@1.0.0: {}
+ minimatch: 10.2.5
+ minipass: 7.1.3
+ path-scurry: 2.0.2
- leven@3.1.0: {}
-
- lines-and-columns@1.2.4: {}
-
- locate-path@5.0.0:
+ globby@11.1.0:
dependencies:
- p-locate: 4.1.0
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.3
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
- lodash.escaperegexp@4.1.2: {}
+ graceful-fs@4.2.11: {}
- lodash.groupby@4.6.0: {}
+ has-flag@4.0.0: {}
- lodash.isboolean@3.0.3: {}
+ html-escaper@2.0.2: {}
- lodash.isequal@4.5.0: {}
+ human-id@4.1.3: {}
- lodash.isfunction@3.0.9: {}
+ iconv-lite@0.7.2:
+ dependencies:
+ safer-buffer: 2.1.2
- lodash.isnil@4.0.0: {}
+ ignore@5.3.2: {}
- lodash.isundefined@3.0.1: {}
+ is-extglob@2.1.1: {}
- lodash.memoize@4.1.2: {}
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
- lodash.uniq@4.5.0: {}
+ is-number@7.0.0: {}
- lodash@4.17.21: {}
+ is-subdir@1.2.0:
+ dependencies:
+ better-path-resolve: 1.0.0
- log-driver@1.2.7: {}
+ is-windows@1.0.2: {}
- lru-cache@10.4.3: {}
+ isexe@2.0.0: {}
- lru-cache@11.1.0: {}
+ istanbul-lib-coverage@3.2.2: {}
- lru-cache@5.1.1:
+ istanbul-lib-report@3.0.1:
dependencies:
- yallist: 3.1.1
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
- make-dir@4.0.0:
+ istanbul-reports@3.2.0:
dependencies:
- semver: 7.7.2
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
- make-error@1.3.6: {}
+ js-tokens@10.0.0: {}
- makeerror@1.0.12:
+ js-yaml@3.14.2:
dependencies:
- tmpl: 1.0.5
-
- merge-stream@2.0.0: {}
+ argparse: 1.0.10
+ esprima: 4.0.1
- micromatch@4.0.8:
+ js-yaml@4.1.1:
dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
+ argparse: 2.0.1
- mime-db@1.52.0: {}
+ jsonfile@4.0.0:
+ optionalDependencies:
+ graceful-fs: 4.2.11
- mime-types@2.1.35:
+ locate-path@5.0.0:
dependencies:
- mime-db: 1.52.0
+ p-locate: 4.1.0
- mimic-fn@2.1.0: {}
+ lodash.startcase@4.4.0: {}
- minimatch@10.0.3:
- dependencies:
- '@isaacs/brace-expansion': 5.0.0
+ lodash@4.18.1: {}
- minimatch@3.1.2:
- dependencies:
- brace-expansion: 1.1.12
+ lru-cache@11.3.6: {}
- minimatch@5.1.6:
+ magic-string@0.30.21:
dependencies:
- brace-expansion: 2.0.2
+ '@jridgewell/sourcemap-codec': 1.5.5
- minimatch@9.0.5:
+ magicast@0.5.2:
dependencies:
- brace-expansion: 2.0.2
-
- minimist@1.2.8: {}
+ '@babel/parser': 7.29.3
+ '@babel/types': 7.29.0
+ source-map-js: 1.2.1
- minipass@7.1.2: {}
+ make-dir@4.0.0:
+ dependencies:
+ semver: 7.8.0
- ms@2.1.3: {}
+ merge2@1.4.1: {}
- napi-postinstall@0.2.4: {}
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
- natural-compare@1.4.0: {}
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.6
- node-int64@0.4.0: {}
+ minipass@7.1.3: {}
- node-releases@2.0.19: {}
+ mri@1.2.0: {}
- normalize-path@3.0.0: {}
+ nanoid@3.3.12: {}
- npm-run-path@4.0.1:
+ node-fetch@2.7.0:
dependencies:
- path-key: 3.1.1
+ whatwg-url: 5.0.0
- oauth-sign@0.9.0: {}
+ obug@2.1.1: {}
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
+ outdent@0.5.0: {}
- onetime@5.1.2:
+ p-filter@2.1.0:
dependencies:
- mimic-fn: 2.1.0
+ p-map: 2.1.0
p-limit@2.3.0:
dependencies:
p-try: 2.2.0
- p-limit@3.1.0:
- dependencies:
- yocto-queue: 0.1.0
-
p-locate@4.1.0:
dependencies:
p-limit: 2.3.0
+ p-map@2.1.0: {}
+
p-try@2.2.0: {}
package-json-from-dist@1.0.1: {}
- parse-json@5.2.0:
+ package-manager-detector@0.2.11:
dependencies:
- '@babel/code-frame': 7.27.1
- error-ex: 1.3.2
- json-parse-even-better-errors: 2.3.1
- lines-and-columns: 1.2.4
+ quansync: 0.2.11
path-exists@4.0.0: {}
- path-is-absolute@1.0.1: {}
-
path-key@3.1.1: {}
- path-scurry@1.11.1:
+ path-scurry@2.0.2:
dependencies:
- lru-cache: 10.4.3
- minipass: 7.1.2
+ lru-cache: 11.3.6
+ minipass: 7.1.3
- path-scurry@2.0.0:
- dependencies:
- lru-cache: 11.1.0
- minipass: 7.1.2
+ path-type@4.0.0: {}
- performance-now@2.1.0: {}
+ pathe@2.0.3: {}
picocolors@1.1.1: {}
- picomatch@2.3.1: {}
-
- picomatch@4.0.2: {}
+ picomatch@2.3.2: {}
- pirates@4.0.7: {}
+ picomatch@4.0.4: {}
- pkg-dir@4.2.0:
- dependencies:
- find-up: 4.1.0
+ pify@4.0.1: {}
- pretty-format@29.7.0:
+ postcss@8.5.14:
dependencies:
- '@jest/schemas': 29.6.3
- ansi-styles: 5.2.0
- react-is: 18.3.1
+ nanoid: 3.3.12
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- pretty-format@30.0.0:
- dependencies:
- '@jest/schemas': 30.0.0
- ansi-styles: 5.2.0
- react-is: 18.3.1
+ prettier@2.8.8: {}
- psl@1.15.0:
- dependencies:
- punycode: 2.3.1
+ quansync@0.2.11: {}
- punycode@2.3.1: {}
+ queue-microtask@1.2.3: {}
- pure-rand@7.0.1: {}
+ read-yaml-file@1.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ js-yaml: 3.14.2
+ pify: 4.0.1
+ strip-bom: 3.0.0
- qs@6.5.3: {}
+ resolve-from@5.0.0: {}
- react-is@18.3.1: {}
+ reusify@1.1.0: {}
- request@2.88.2:
+ rimraf@6.1.3:
dependencies:
- aws-sign2: 0.7.0
- aws4: 1.13.2
- caseless: 0.12.0
- combined-stream: 1.0.8
- extend: 3.0.2
- forever-agent: 0.6.1
- form-data: 2.3.3
- har-validator: 5.1.5
- http-signature: 1.2.0
- is-typedarray: 1.0.0
- isstream: 0.1.2
- json-stringify-safe: 5.0.1
- mime-types: 2.1.35
- oauth-sign: 0.9.0
- performance-now: 2.1.0
- qs: 6.5.3
- safe-buffer: 5.2.1
- tough-cookie: 2.5.0
- tunnel-agent: 0.6.0
- uuid: 3.4.0
-
- require-directory@2.1.1: {}
+ glob: 13.0.6
+ package-json-from-dist: 1.0.1
- resolve-cwd@3.0.0:
+ rollup@4.60.3:
dependencies:
- resolve-from: 5.0.0
-
- resolve-from@5.0.0: {}
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.60.3
+ '@rollup/rollup-android-arm64': 4.60.3
+ '@rollup/rollup-darwin-arm64': 4.60.3
+ '@rollup/rollup-darwin-x64': 4.60.3
+ '@rollup/rollup-freebsd-arm64': 4.60.3
+ '@rollup/rollup-freebsd-x64': 4.60.3
+ '@rollup/rollup-linux-arm-gnueabihf': 4.60.3
+ '@rollup/rollup-linux-arm-musleabihf': 4.60.3
+ '@rollup/rollup-linux-arm64-gnu': 4.60.3
+ '@rollup/rollup-linux-arm64-musl': 4.60.3
+ '@rollup/rollup-linux-loong64-gnu': 4.60.3
+ '@rollup/rollup-linux-loong64-musl': 4.60.3
+ '@rollup/rollup-linux-ppc64-gnu': 4.60.3
+ '@rollup/rollup-linux-ppc64-musl': 4.60.3
+ '@rollup/rollup-linux-riscv64-gnu': 4.60.3
+ '@rollup/rollup-linux-riscv64-musl': 4.60.3
+ '@rollup/rollup-linux-s390x-gnu': 4.60.3
+ '@rollup/rollup-linux-x64-gnu': 4.60.3
+ '@rollup/rollup-linux-x64-musl': 4.60.3
+ '@rollup/rollup-openbsd-x64': 4.60.3
+ '@rollup/rollup-openharmony-arm64': 4.60.3
+ '@rollup/rollup-win32-arm64-msvc': 4.60.3
+ '@rollup/rollup-win32-ia32-msvc': 4.60.3
+ '@rollup/rollup-win32-x64-gnu': 4.60.3
+ '@rollup/rollup-win32-x64-msvc': 4.60.3
+ fsevents: 2.3.3
- rimraf@6.0.1:
+ run-parallel@1.2.0:
dependencies:
- glob: 11.0.3
- package-json-from-dist: 1.0.1
-
- safe-buffer@5.2.1: {}
+ queue-microtask: 1.2.3
safer-buffer@2.1.2: {}
- semver@6.3.1: {}
-
- semver@7.7.2: {}
+ semver@7.8.0: {}
shebang-command@2.0.0:
dependencies:
@@ -3444,247 +1932,112 @@ snapshots:
shebang-regex@3.0.0: {}
- signal-exit@3.0.7: {}
+ siginfo@2.0.0: {}
signal-exit@4.1.0: {}
slash@3.0.0: {}
- source-map-support@0.5.13:
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
-
- source-map@0.6.1: {}
+ source-map-js@1.2.1: {}
- sprintf-js@1.0.3: {}
-
- sshpk@1.18.0:
- dependencies:
- asn1: 0.2.6
- assert-plus: 1.0.0
- bcrypt-pbkdf: 1.0.2
- dashdash: 1.14.1
- ecc-jsbn: 0.1.2
- getpass: 0.1.7
- jsbn: 0.1.1
- safer-buffer: 2.1.2
- tweetnacl: 0.14.5
-
- stack-utils@2.0.6:
+ spawndamnit@3.0.1:
dependencies:
- escape-string-regexp: 2.0.0
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
- string-length@4.0.2:
- dependencies:
- char-regex: 1.0.2
- strip-ansi: 6.0.1
+ sprintf-js@1.0.3: {}
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
+ stackback@0.0.2: {}
- string-width@5.1.2:
- dependencies:
- eastasianwidth: 0.2.0
- emoji-regex: 9.2.2
- strip-ansi: 7.1.0
+ std-env@4.1.0: {}
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
- strip-ansi@7.1.0:
- dependencies:
- ansi-regex: 6.1.0
-
- strip-bom@4.0.0: {}
-
- strip-final-newline@2.0.0: {}
-
- strip-json-comments@3.1.1: {}
+ strip-bom@3.0.0: {}
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
- supports-color@8.1.1:
- dependencies:
- has-flag: 4.0.0
+ term-size@2.2.1: {}
- synckit@0.11.8:
- dependencies:
- '@pkgr/core': 0.2.7
+ tinybench@2.9.0: {}
- test-exclude@6.0.0:
+ tinyexec@1.1.2: {}
+
+ tinyglobby@0.2.16:
dependencies:
- '@istanbuljs/schema': 0.1.3
- glob: 7.2.3
- minimatch: 3.1.2
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
- tmpl@1.0.5: {}
+ tinyrainbow@3.1.0: {}
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
- tough-cookie@2.5.0:
- dependencies:
- psl: 1.15.0
- punycode: 2.3.1
-
- ts-jest@29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.0)(@jest/types@30.0.0)(babel-jest@30.0.0(@babel/core@7.27.4))(jest-util@30.0.0)(jest@30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3)))(typescript@5.8.3):
- dependencies:
- bs-logger: 0.2.6
- ejs: 3.1.10
- fast-json-stable-stringify: 2.1.0
- jest: 30.0.0(@types/node@24.0.1)(ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3))
- json5: 2.2.3
- lodash.memoize: 4.1.2
- make-error: 1.3.6
- semver: 7.7.2
- type-fest: 4.41.0
- typescript: 5.8.3
- yargs-parser: 21.1.1
- optionalDependencies:
- '@babel/core': 7.27.4
- '@jest/transform': 30.0.0
- '@jest/types': 30.0.0
- babel-jest: 30.0.0(@babel/core@7.27.4)
- jest-util: 30.0.0
-
- ts-node@10.9.2(@types/node@24.0.1)(typescript@5.8.3):
- dependencies:
- '@cspotcode/source-map-support': 0.8.1
- '@tsconfig/node10': 1.0.11
- '@tsconfig/node12': 1.0.11
- '@tsconfig/node14': 1.0.3
- '@tsconfig/node16': 1.0.4
- '@types/node': 24.0.1
- acorn: 8.15.0
- acorn-walk: 8.3.4
- arg: 4.1.3
- create-require: 1.1.1
- diff: 4.0.2
- make-error: 1.3.6
- typescript: 5.8.3
- v8-compile-cache-lib: 3.0.1
- yn: 3.1.1
-
- tslib@2.8.1:
- optional: true
-
- tunnel-agent@0.6.0:
- dependencies:
- safe-buffer: 5.2.1
-
- tweetnacl@0.14.5: {}
-
- type-detect@4.0.8: {}
+ tr46@0.0.3: {}
- type-fest@0.21.3: {}
+ typescript@6.0.3: {}
- type-fest@4.41.0: {}
+ undici-types@7.19.2: {}
- typescript@5.8.3: {}
+ universalify@0.1.2: {}
- undici-types@7.8.0: {}
-
- unrs-resolver@1.9.0:
+ vite@7.3.3(@types/node@25.6.2):
dependencies:
- napi-postinstall: 0.2.4
+ esbuild: 0.27.7
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+ postcss: 8.5.14
+ rollup: 4.60.3
+ tinyglobby: 0.2.16
optionalDependencies:
- '@unrs/resolver-binding-android-arm-eabi': 1.9.0
- '@unrs/resolver-binding-android-arm64': 1.9.0
- '@unrs/resolver-binding-darwin-arm64': 1.9.0
- '@unrs/resolver-binding-darwin-x64': 1.9.0
- '@unrs/resolver-binding-freebsd-x64': 1.9.0
- '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.0
- '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.0
- '@unrs/resolver-binding-linux-arm64-gnu': 1.9.0
- '@unrs/resolver-binding-linux-arm64-musl': 1.9.0
- '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.0
- '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.0
- '@unrs/resolver-binding-linux-riscv64-musl': 1.9.0
- '@unrs/resolver-binding-linux-s390x-gnu': 1.9.0
- '@unrs/resolver-binding-linux-x64-gnu': 1.9.0
- '@unrs/resolver-binding-linux-x64-musl': 1.9.0
- '@unrs/resolver-binding-wasm32-wasi': 1.9.0
- '@unrs/resolver-binding-win32-arm64-msvc': 1.9.0
- '@unrs/resolver-binding-win32-ia32-msvc': 1.9.0
- '@unrs/resolver-binding-win32-x64-msvc': 1.9.0
-
- update-browserslist-db@1.1.3(browserslist@4.25.0):
- dependencies:
- browserslist: 4.25.0
- escalade: 3.2.0
- picocolors: 1.1.1
-
- uri-js@4.4.1:
- dependencies:
- punycode: 2.3.1
-
- uuid@3.4.0: {}
-
- v8-compile-cache-lib@3.0.1: {}
+ '@types/node': 25.6.2
+ fsevents: 2.3.3
- v8-to-istanbul@9.3.0:
- dependencies:
- '@jridgewell/trace-mapping': 0.3.25
- '@types/istanbul-lib-coverage': 2.0.6
- convert-source-map: 2.0.0
+ vitest@4.1.5(@types/node@25.6.2)(@vitest/coverage-v8@4.1.5)(vite@7.3.3(@types/node@25.6.2)):
+ dependencies:
+ '@vitest/expect': 4.1.5
+ '@vitest/mocker': 4.1.5(vite@7.3.3(@types/node@25.6.2))
+ '@vitest/pretty-format': 4.1.5
+ '@vitest/runner': 4.1.5
+ '@vitest/snapshot': 4.1.5
+ '@vitest/spy': 4.1.5
+ '@vitest/utils': 4.1.5
+ es-module-lexer: 2.1.0
+ expect-type: 1.3.0
+ magic-string: 0.30.21
+ obug: 2.1.1
+ pathe: 2.0.3
+ picomatch: 4.0.4
+ std-env: 4.1.0
+ tinybench: 2.9.0
+ tinyexec: 1.1.2
+ tinyglobby: 0.2.16
+ tinyrainbow: 3.1.0
+ vite: 7.3.3(@types/node@25.6.2)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 25.6.2
+ '@vitest/coverage-v8': 4.1.5(vitest@4.1.5)
+ transitivePeerDependencies:
+ - msw
- verror@1.10.0:
- dependencies:
- assert-plus: 1.0.0
- core-util-is: 1.0.2
- extsprintf: 1.3.0
+ webidl-conversions@3.0.1: {}
- walker@1.0.8:
+ whatwg-url@5.0.0:
dependencies:
- makeerror: 1.0.12
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
which@2.0.2:
dependencies:
isexe: 2.0.0
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@8.1.0:
- dependencies:
- ansi-styles: 6.2.1
- string-width: 5.1.2
- strip-ansi: 7.1.0
-
- wrappy@1.0.2: {}
-
- write-file-atomic@5.0.1:
+ why-is-node-running@2.3.0:
dependencies:
- imurmurhash: 0.1.4
- signal-exit: 4.1.0
-
- y18n@5.0.8: {}
-
- yallist@3.1.1: {}
-
- yargs-parser@21.1.1: {}
-
- yargs@17.7.2:
- dependencies:
- cliui: 8.0.1
- escalade: 3.2.0
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 21.1.1
-
- yn@3.1.1: {}
-
- yocto-queue@0.1.0: {}
+ siginfo: 2.0.0
+ stackback: 0.0.2
diff --git a/src/cli.ts b/src/cli.ts
index 5f1a9e7..8e95c7e 100644
--- a/src/cli.ts
+++ b/src/cli.ts
@@ -1,51 +1,267 @@
+#!/usr/bin/env node
+
import * as path from 'path';
import * as fs from 'fs';
-import { program } from 'commander';
-import * as csv from 'fast-csv';
-import { OHLCV, IOHLCV } from './types';
+import { program as commanderProgram } from 'commander';
+import { IOHLCV, OHLCV } from './types';
+import { resampleOhlcv } from './lib';
+
+// Read version from package.json so there's a single source of truth.
+// `dist/cli.js` is one level deep; `../package.json` resolves to the
+// installed package's manifest both during dev and post-install.
+const { version: PACKAGE_VERSION } = require('../package.json') as { version: string };
+
+type Shape = 'object' | 'array';
+type InputFormat = 'csv' | 'json';
+type InputFormatOption = InputFormat | 'auto';
+type ShapeOption = Shape | 'auto';
+
+const REQUIRED_FIELDS = ['time', 'open', 'high', 'low', 'close', 'volume'] as const;
-program
- .description('Resample OHLCV between timeframes and file formats')
- .option('-i, --input ', 'Input file path (csv, json)')
- .option('-n, --name ', 'Output file name')
- .option('-f, --format ', 'Output file format (csv, json)')
- .option('-p, --placeholder', '')
- ;
+/**
+ * Parse a CSV string of OHLCV rows into `IOHLCV[]`. Accepts an optional
+ * header row matching the canonical field order; otherwise treats the first
+ * line as data. Malformed rows (wrong column count, missing values, or
+ * non-numeric cells) are skipped and counted in `skipped`.
+ *
+ * @throws if the input is empty.
+ */
+export function parseCSV(data: string): { rows: IOHLCV[]; skipped: number } {
+ const trimmed = data.trim();
+ if (!trimmed) {
+ throw new Error('Error: CSV must have at least one row');
+ }
+ const lines = trimmed.split('\n');
-program.parse();
-program.showHelpAfterError();
+ const firstLine = lines[0].trim().split(',').map(h => h.trim());
+ const hasHeader = REQUIRED_FIELDS.every((f, i) => firstLine[i] === f);
+ const headers = hasHeader ? firstLine : (REQUIRED_FIELDS as readonly string[]);
+ const startIndex = hasHeader ? 1 : 0;
-const options = program.opts();
+ const rows: IOHLCV[] = [];
+ let skipped = 0;
-(() => {
+ for (let i = startIndex; i < lines.length; i++) {
+ const line = lines[i].trim();
+ if (!line) continue;
+ const values = line.split(',').map(v => v.trim());
+ if (values.length !== headers.length) { skipped++; continue; }
- const inFormat = path.extname(options.input).slice(1).toLowerCase();
- const inPath = path.resolve(options.input);
+ const row: Record = {};
+ headers.forEach((header, index) => { row[header] = values[index]; });
- if (!['csv', 'json'].includes(inFormat)) {
- program.error('Only CSV and JSON files are accepted as input');
- return;
+ if (REQUIRED_FIELDS.some(f => row[f] === undefined || row[f] === '')) {
+ skipped++;
+ continue;
+ }
+ if (REQUIRED_FIELDS.some(f => isNaN(Number(row[f])))) {
+ skipped++;
+ continue;
+ }
+ rows.push({
+ time: Number(row.time),
+ open: Number(row.open),
+ high: Number(row.high),
+ low: Number(row.low),
+ close: Number(row.close),
+ volume: Number(row.volume),
+ });
}
+ return { rows, skipped };
+}
- const inBuffer = fs.readFileSync(inPath);
- const inStream = fs.createReadStream(inPath, {
- start: 0
- });
+/**
+ * Detect whether a string is JSON (array of objects or array of tuples) or
+ * CSV. JSON detection requires the value to parse and be an array.
+ *
+ * @throws if neither format is recognized.
+ */
+export function detectFormat(data: string): InputFormat {
+ const trimmed = data.trim();
+ try {
+ const parsed = JSON.parse(trimmed);
+ if (Array.isArray(parsed)) return 'json';
+ } catch { /* fall through */ }
+ const firstLine = trimmed.split('\n')[0];
+ if ((firstLine.match(/,/g) || []).length === 5) return 'csv';
+ throw new Error('Could not detect input format. Please specify --input-format');
+}
- if (inFormat === 'csv') {
- csv.parseStream(inStream)
- .on('data', (row) => {
- console.log(row);
- })
- .end(() => {
- console.log("end");
- });
+/** Detect whether a parsed JSON payload is tuple- or object-shaped. */
+function detectShape(data: unknown[]): Shape {
+ return data.length > 0 && Array.isArray(data[0]) ? 'array' : 'object';
+}
- // const data = inStream
- // .pipe(csv.parse({ headers: true }));
+const toObjectShape = (data: OHLCV[] | IOHLCV[]): IOHLCV[] => {
+ if (data.length > 0 && Array.isArray(data[0])) {
+ return (data as OHLCV[]).map(([time, open, high, low, close, volume]) => ({
+ time, open, high, low, close, volume,
+ }));
}
- if (inFormat === 'json') {
- //@ts-ignore
- const data: IOHLCV[] = JSON.parse(inBuffer);
+ return data as IOHLCV[];
+};
+
+const toArrayShape = (data: OHLCV[] | IOHLCV[]): OHLCV[] => {
+ if (data.length > 0 && !Array.isArray(data[0])) {
+ return (data as IOHLCV[]).map(({ time, open, high, low, close, volume }) =>
+ [time, open, high, low, close, volume] as OHLCV);
}
-})();
\ No newline at end of file
+ return data as OHLCV[];
+};
+
+/** Render OHLCV data as CSV text (with header). */
+function formatCSV(data: OHLCV[] | IOHLCV[]): string {
+ const rows = toArrayShape(data);
+ const lines = ['time,open,high,low,close,volume'];
+ for (const row of rows) lines.push(row.join(','));
+ return lines.join('\n');
+}
+
+/** Render OHLCV data as JSON text in the requested shape. */
+function formatJSON(data: OHLCV[] | IOHLCV[], shape: Shape): string {
+ const out = shape === 'array' ? toArrayShape(data) : toObjectShape(data);
+ return JSON.stringify(out, null, 2);
+}
+
+function prefixError(err: unknown): Error {
+ const msg = err instanceof Error ? err.message : String(err);
+ return new Error(msg.startsWith('Error:') ? msg : `Error: ${msg}`);
+}
+
+interface ParsedInput {
+ data: IOHLCV[] | OHLCV[];
+ shape: Shape;
+}
+
+function parseInput(raw: string, format: InputFormat): ParsedInput {
+ if (format === 'csv') {
+ const { rows, skipped } = parseCSV(raw);
+ if (rows.length === 0) {
+ throw new Error('Error: no valid OHLCV rows found in input');
+ }
+ return { data: rows, shape: 'object' };
+ }
+ let parsed: unknown;
+ try {
+ parsed = JSON.parse(raw);
+ } catch (err) {
+ throw prefixError(err);
+ }
+ if (!Array.isArray(parsed) || parsed.length === 0) {
+ throw new Error('Error: JSON input must be a non-empty array of OHLCV records');
+ }
+ return { data: parsed as IOHLCV[] | OHLCV[], shape: detectShape(parsed) };
+}
+
+/**
+ * Run the OHLCV resampling CLI. Streams and TTY flag are injectable for
+ * testing.
+ */
+export async function runCli(
+ argv: string[],
+ stdin: NodeJS.ReadableStream = process.stdin,
+ stdout: NodeJS.WritableStream = process.stdout,
+ stderr: NodeJS.WritableStream = process.stderr,
+): Promise {
+ const program = commanderProgram.createCommand();
+ program
+ .description('Resample OHLCV between timeframes and file formats')
+ .option('-i, --input ', 'Input file path (csv, json) or use pipe')
+ .option('-o, --output ', 'Output file path (csv, json) or use stdout')
+ .option('-f, --format ', 'Output format (csv, json)', 'json')
+ .option('--input-format ', 'Input format when piping (csv, json, auto)', 'auto')
+ .option('-s, --shape ', 'Output shape for JSON (object, array, auto)', 'auto')
+ .option('-b, --base-timeframe ', 'Base timeframe in seconds', '60')
+ .option('-n, --new-timeframe ', 'New timeframe in seconds', '300')
+ .version(PACKAGE_VERSION);
+
+ program.parse(argv);
+ program.showHelpAfterError();
+ const options = program.opts();
+
+ async function readFileData(filePath: string): Promise {
+ const ext = path.extname(filePath).slice(1).toLowerCase();
+ if (!['csv', 'json'].includes(ext)) {
+ throw new Error('Only CSV and JSON files are accepted as input');
+ }
+ let raw: string;
+ try {
+ raw = await fs.promises.readFile(path.resolve(filePath), 'utf8');
+ } catch (err) {
+ throw prefixError(err);
+ }
+ const parsed = parseInput(raw, ext as InputFormat);
+ if (ext === 'csv') {
+ const { skipped } = parseCSV(raw);
+ if (skipped > 0) stderr.write(`Warning: skipped ${skipped} malformed CSV row(s)\n`);
+ }
+ return parsed;
+ }
+
+ async function readPipeData(stream: NodeJS.ReadableStream): Promise {
+ const raw = await new Promise((resolve, reject) => {
+ let buf = '';
+ stream.on('data', chunk => { buf += chunk; });
+ stream.on('end', () => resolve(buf));
+ stream.on('error', err => reject(prefixError(err)));
+ });
+ const requested = options.inputFormat as InputFormatOption;
+ const format: InputFormat = requested === 'auto' ? detectFormat(raw) : requested;
+ const parsed = parseInput(raw, format);
+ if (format === 'csv') {
+ const { skipped } = parseCSV(raw);
+ if (skipped > 0) stderr.write(`Warning: skipped ${skipped} malformed CSV row(s)\n`);
+ }
+ return parsed;
+ }
+
+ async function writeOutput(
+ data: OHLCV[] | IOHLCV[],
+ format: 'csv' | 'json',
+ shape: Shape,
+ outputPath: string | undefined,
+ ): Promise {
+ const text = format === 'csv' ? formatCSV(data) : formatJSON(data, shape);
+ if (outputPath) {
+ await fs.promises.writeFile(outputPath, text);
+ return;
+ }
+ await new Promise((resolve, reject) => {
+ stdout.write(text, err => (err ? reject(err) : resolve()));
+ });
+ }
+
+ try {
+ // `-i` always wins. Only fall back to stdin when no input file is given.
+ // Don't gate on `isTTY` — that breaks scripted/CI invocations where stdin
+ // is not a TTY but `-i` is the intended source.
+ const input = options.input
+ ? await readFileData(options.input)
+ : await readPipeData(stdin);
+
+ const baseTimeframe = parseInt(options.baseTimeframe, 10);
+ const newTimeframe = parseInt(options.newTimeframe, 10);
+ if (isNaN(baseTimeframe) || isNaN(newTimeframe)) {
+ throw new Error('Timeframes must be valid numbers');
+ }
+ if (newTimeframe <= baseTimeframe) {
+ throw new Error('New timeframe must be greater than base timeframe');
+ }
+
+ const resampled = resampleOhlcv(input.data as IOHLCV[], { baseTimeframe, newTimeframe });
+
+ const requestedShape = options.shape as ShapeOption;
+ const outputShape: Shape = requestedShape === 'auto' ? input.shape : requestedShape;
+
+ await writeOutput(resampled, options.format, outputShape, options.output);
+ } catch (error: unknown) {
+ stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
+ process.exitCode = 1;
+ }
+}
+
+if (require.main === module) {
+ process.on('SIGINT', () => process.exit());
+ process.on('SIGTERM', () => process.exit());
+ runCli(process.argv);
+}
diff --git a/src/index.ts b/src/index.ts
index f364a52..35ef3cc 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,10 +1,15 @@
import * as lib from './lib';
export * from './lib';
+export * from './types';
+/**
+ * Legacy aliased export, kept for backward compatibility with 1.x consumers.
+ * Prefer the named exports above.
+ */
export default {
resample_ohlcv: lib.resampleOhlcv,
array: lib.resampleOhlcv,
json: lib.resampleOhlcv,
trade_to_candle: lib.resampleTicksByTime,
- tick_chart: lib.resampleTicksByCount
-};
\ No newline at end of file
+ tick_chart: lib.resampleTicksByCount,
+};
diff --git a/src/lib.ts b/src/lib.ts
index 2a8cd9a..9aeea46 100644
--- a/src/lib.ts
+++ b/src/lib.ts
@@ -10,17 +10,32 @@ import sortBy from "lodash/sortBy";
import chunk from "lodash/chunk";
/**
-* Resample OHLCV to different timeframe
- * @param ohlcvData
- * @param options
- * @param options.baseTimeframe
- * @param options.newTimeframe
+ * Resample OHLCV data to a coarser timeframe. The return type follows the
+ * shape of the input — pass tuples to get tuples back, pass objects to get
+ * objects back.
+ *
+ * @param ohlcvData OHLCV data in tuple (`OHLCV[]`) or object (`IOHLCV[]`) form.
+ * @param options.baseTimeframe Source timeframe in seconds.
+ * @param options.newTimeframe Target timeframe in seconds (must be a multiple of base).
*/
-
-export const resampleOhlcv = (
+export function resampleOhlcv(
+ ohlcvData: OHLCV[],
+ options: { baseTimeframe: number; newTimeframe: number }
+): OHLCV[];
+export function resampleOhlcv(
+ ohlcvData: IOHLCV[],
+ options: { baseTimeframe: number; newTimeframe: number }
+): IOHLCV[];
+// 1.x BC overload: a union-typed argument still resolves cleanly. Keep this
+// even though the narrower overloads above are preferred for new code.
+export function resampleOhlcv(
+ ohlcvData: OHLCV[] | IOHLCV[],
+ options: { baseTimeframe: number; newTimeframe: number }
+): OHLCV[] | IOHLCV[];
+export function resampleOhlcv(
ohlcvData: OHLCV[] | IOHLCV[],
- { baseTimeframe = 60, newTimeframe = 300 }: { baseTimeframe: number, newTimeframe: number }
-): OHLCV[] | IOHLCV[] => {
+ { baseTimeframe = 60, newTimeframe = 300 }: { baseTimeframe: number; newTimeframe: number }
+): OHLCV[] | IOHLCV[] {
if (ohlcvData.length === 0) {
throw new Error("input OHLCV data has no candles");
@@ -45,10 +60,12 @@ export const resampleOhlcv = (
}
/**
- * Resample OHLCV in object format to different timeframe
- * @param candledata
- * @param baseFrame
- * @param newFrame
+ * Resample OHLCV tuples (`[time, open, high, low, close, volume][]`) to a
+ * coarser timeframe.
+ *
+ * @param candledata Source candles as `OHLCV[]`.
+ * @param baseFrame Source timeframe in seconds.
+ * @param newFrame Target timeframe in seconds (must be a multiple of base).
*/
export const resampleOhlcvArray = (
diff --git a/tsconfig.json b/tsconfig.json
index 6d196d1..e4dfaae 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,16 +1,21 @@
{
"compilerOptions": {
- "target": "es2015",
+ "target": "es2022",
+ "lib": ["es2022"],
"module": "commonjs",
+ "moduleResolution": "node",
+ "ignoreDeprecations": "6.0",
"declaration": true,
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"alwaysStrict": true,
- "esModuleInterop": true
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "types": ["node"]
},
"include": [
"src/**/*.ts"
]
-}
\ No newline at end of file
+}
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000..601b349
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ include: ['__tests__/**/*.ts'],
+ coverage: {
+ provider: 'v8',
+ include: ['src/**/*.ts'],
+ reporter: ['text', 'lcov'],
+ },
+ },
+});