From 166a337b6b9ace7b12ec37741e897214d7e393d8 Mon Sep 17 00:00:00 2001 From: Kohei Otsuka Date: Tue, 27 Oct 2026 19:31:56 +0900 Subject: [PATCH 1/5] test: check README coverage of exports, published wording, the fixture SHA and the CI workflow - tests/mock-contract-sha.test.ts pins the SHA-256 of the mock contract fixture, so the copy Teiresias keeps is compared against the same value without reading this repository - tests/ci-workflow.test.ts checks what test.yml runs, that it installs like deploy.yml, its permissions, and that every action is pinned by SHA Co-Authored-By: Claude Opus 5.5 --- tests/ci-workflow.test.ts | 87 ++++++++++++++++++++++++++++ tests/mock-contract-sha.test.ts | 26 +++++++++ tests/public-surface-wording.test.ts | 53 +++++++++++++++++ tests/readme-api-coverage.test.ts | 54 +++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 tests/ci-workflow.test.ts create mode 100644 tests/mock-contract-sha.test.ts create mode 100644 tests/public-surface-wording.test.ts create mode 100644 tests/readme-api-coverage.test.ts diff --git a/tests/ci-workflow.test.ts b/tests/ci-workflow.test.ts new file mode 100644 index 0000000..85d0c0f --- /dev/null +++ b/tests/ci-workflow.test.ts @@ -0,0 +1,87 @@ +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; + +// Daedalus has no dependencies, so its CI checks out this repository alone and runs on +// every branch. deploy.yml runs only on pushes to master; the test job installs the same +// way (pnpm version, CI pnpm settings, frozen lockfile) so that an install problem shows +// up on the pull request instead of after the merge. + +const read = (name: string) => + readFileSync(fileURLToPath(new URL(`../.github/workflows/${name}`, import.meta.url)), 'utf8'); + +/** The lines that decide how dependencies are installed. */ +function installLines(workflow: string): string[] { + return workflow + .split('\n') + .map((line) => line.trim()) + .filter( + (line) => + /^version:\s*\S/.test(line) || + /^run:\s*cp ci\/pnpm-workspace\.ci\.yaml pnpm-workspace\.yaml$/.test(line) || + /^run:\s*pnpm install\b/.test(line) || + /^uses:\s*pnpm\/action-setup@/.test(line), + ); +} + +function nodeVersions(workflow: string): string[] { + const matrix = workflow.match(/node-version:\s*\[([^\]]*)\]/); + if (matrix) return matrix[1].split(',').map((v) => v.trim()); + return [...workflow.matchAll(/node-version:\s*(\d+)\s*$/gm)].map((m) => m[1]); +} + +describe('test.yml', () => { + const test = read('test.yml'); + + it('runs the checks that prepublishOnly runs', () => { + for (const script of ['test', 'typecheck', 'test:types', 'build', 'verify:demo']) { + expect(test).toContain(`pnpm run ${script}`); + } + }); + + it('runs on every branch and checks out this repository alone', () => { + expect(test).not.toContain('branches:'); + expect(test).not.toContain('repository: code4history/'); + }); + + it('installs with the CI pnpm settings and the frozen lockfile', () => { + expect(test).toContain('run: cp ci/pnpm-workspace.ci.yaml pnpm-workspace.yaml'); + expect(test).toContain('run: pnpm install --frozen-lockfile'); + }); + + it('starts from read-only permissions', () => { + expect(test).toMatch(/^permissions:\n {2}contents: read$/m); + expect(test).not.toContain('id-token: write'); + }); +}); + +describe('deploy.yml and test.yml install the same way', () => { + const test = read('test.yml'); + const deploy = read('deploy.yml'); + + it('finds the install lines in deploy.yml', () => { + expect(installLines(deploy).length).toBeGreaterThanOrEqual(4); + }); + + it('uses the same install lines', () => { + expect([...new Set(installLines(test))]).toEqual([...new Set(installLines(deploy))]); + }); + + it('tests on the Node.js version deploy.yml builds with', () => { + const deployNode = nodeVersions(deploy); + expect(deployNode.length).toBe(1); + expect(nodeVersions(test)).toContain(deployNode[0]); + }); +}); + +describe('every workflow', () => { + for (const name of ['test.yml', 'deploy.yml', 'publish.yml']) { + it(`${name} pins every action by commit SHA`, () => { + const uses = read(name) + .split('\n') + .filter((line) => /^\s*-?\s*uses:/.test(line)); + expect(uses.length).toBeGreaterThan(0); + expect(uses.filter((line) => !/@[0-9a-f]{40}(\s|$)/.test(line))).toEqual([]); + }); + } +}); diff --git a/tests/mock-contract-sha.test.ts b/tests/mock-contract-sha.test.ts new file mode 100644 index 0000000..014dace --- /dev/null +++ b/tests/mock-contract-sha.test.ts @@ -0,0 +1,26 @@ +import { createHash } from 'node:crypto'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; + +// The mock contract fixture is the source of the copy Teiresias keeps in its own tests. +// Both repositories check their file against the same SHA-256 (fixtureVersion 1.0.1), so +// the two files stay identical without either repository reading the other. +const SPECIFIED_SHA256 = '5da3d253e46a0dc6f8710432fc0783a261fbb35ca0c47757b0b204a48fa85495'; + +const fixture = fileURLToPath(new URL('../src/testkit/mockContractFixture.ts', import.meta.url)); + +function sha256(bytes: Buffer): string { + return createHash('sha256').update(bytes).digest('hex'); +} + +describe('mock contract fixture', () => { + it('has the specified SHA-256', () => { + expect(sha256(readFileSync(fixture))).toBe(SPECIFIED_SHA256); + }); + + it('the check fails when a single byte changes', () => { + const changed = Buffer.concat([readFileSync(fixture), Buffer.from('\n')]); + expect(sha256(changed)).not.toBe(SPECIFIED_SHA256); + }); +}); diff --git a/tests/public-surface-wording.test.ts b/tests/public-surface-wording.test.ts new file mode 100644 index 0000000..3c870d1 --- /dev/null +++ b/tests/public-surface-wording.test.ts @@ -0,0 +1,53 @@ +import { readdirSync, readFileSync, statSync } from "node:fs"; +import { join, relative } from "node:path"; +import { fileURLToPath } from "node:url"; +import { describe, expect, it } from "vitest"; + +// Files that reach readers (the npm tarball, the README files and the changelog) must not +// point at the private development notes this package was built from: links into the +// private repository, internal task and milestone labels, or section numbers of +// unpublished documents. dist is generated from src, so src is what is checked. + +const packageRoot = fileURLToPath(new URL("..", import.meta.url)); + +const INTERNAL_REFERENCE = + /docs\/superpowers|\bm[0-9]+[ab]?-t[0-9]+|Cycle 1|post-cycle|仮仕様|AC-m[0-9]|HR-m[0-9]|SR-m[0-9]|maplat-v4-crs-libs|provisional specification|§[0-9]/; + +function walk(path: string): string[] { + if (statSync(path).isDirectory()) { + return readdirSync(path).flatMap((name) => walk(join(path, name))); + } + return [path]; +} + +function publicFiles(): string[] { + const packageJson = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8")) as { + files?: string[]; + }; + const listed = (packageJson.files ?? []).filter((entry) => entry !== "dist" && !entry.startsWith("dist/")); + const extra = readdirSync(packageRoot).filter((name) => /^README.*\.md$/.test(name) || name === "CHANGELOG.md"); + const files = new Set(); + for (const entry of [...listed, ...extra]) { + for (const file of walk(join(packageRoot, entry))) files.add(file); + } + return [...files].sort(); +} + +describe("public files carry no internal references", () => { + const files = publicFiles(); + + it("scans at least one file", () => { + expect(files.length).toBeGreaterThan(0); + }); + + it("has no internal reference in the published sources, README files and changelog", () => { + const hits: string[] = []; + for (const file of files) { + const lines = readFileSync(file, "utf8").split("\n"); + lines.forEach((line, index) => { + if (INTERNAL_REFERENCE.test(line)) hits.push(`${relative(packageRoot, file)}:${index + 1}: ${line.trim()}`); + }); + } + expect(hits).toEqual([]); + }); +}); diff --git a/tests/readme-api-coverage.test.ts b/tests/readme-api-coverage.test.ts new file mode 100644 index 0000000..65e45f8 --- /dev/null +++ b/tests/readme-api-coverage.test.ts @@ -0,0 +1,54 @@ +import { readFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import ts from "typescript"; +import { describe, expect, it } from "vitest"; + +// Every name exported from src/index.ts (values and types) must be documented in both +// README.md and README.ja.md. The list is read from the source at run time, so a new +// export makes this test fail until the README files mention it. +// dist/index.d.ts is generated from src/index.ts, so the two carry the same names. + +const packageRoot = fileURLToPath(new URL("..", import.meta.url)); +const entry = fileURLToPath(new URL("../src/index.ts", import.meta.url)); + +function listExportedNames(): string[] { + const program = ts.createProgram([entry], { + allowImportingTsExtensions: true, + noEmit: true, + module: ts.ModuleKind.ESNext, + moduleResolution: ts.ModuleResolutionKind.Bundler, + target: ts.ScriptTarget.ES2022, + skipLibCheck: true, + }); + const checker = program.getTypeChecker(); + const source = program.getSourceFile(entry); + if (!source) throw new Error(`cannot read ${entry}`); + const moduleSymbol = checker.getSymbolAtLocation(source); + if (!moduleSymbol) throw new Error(`${entry} is not a module`); + return checker + .getExportsOfModule(moduleSymbol) + .map((symbol) => symbol.getName()) + .filter((name) => name !== "default") + .sort(); +} + +function mentions(text: string, name: string): boolean { + const escaped = name.replace(/[$]/g, "\\$"); + return new RegExp(`(? { + const names = listExportedNames(); + + it("finds at least one export in src/index.ts", () => { + expect(names.length).toBeGreaterThan(0); + }); + + for (const readme of ["README.md", "README.ja.md"]) { + it(`${readme} mentions every export of src/index.ts`, () => { + const text = readFileSync(`${packageRoot}/${readme}`, "utf8"); + const missing = names.filter((name) => !mentions(text, name)); + expect(missing).toEqual([]); + }); + } +}); From a425d54e5caadcf69139cef3293be9dfba237e7a Mon Sep 17 00:00:00 2001 From: Kohei Otsuka Date: Tue, 27 Oct 2026 19:31:56 +0900 Subject: [PATCH 2/5] docs(src): drop references to private development notes from published comments Co-Authored-By: Claude Opus 5.5 --- src/fitting/affine.ts | 27 +++++++++++++-------------- src/fitting/similarity.ts | 28 ++++++++++++++-------------- src/types.ts | 10 +++++----- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/fitting/affine.ts b/src/fitting/affine.ts index 174f5f0..c5584f2 100644 --- a/src/fitting/affine.ts +++ b/src/fitting/affine.ts @@ -1,20 +1,19 @@ import type { GcpPair, WorldFile } from '../types.js'; /** - * m0-t2: 6 パラメータ affine 閉形式最小二乗と、採用 gate に使う統計 helper 群。 + * 6 パラメータ affine 閉形式最小二乗と、採用 gate に使う統計 helper 群。 * - * 設計正本: docs/superpowers/specs/2026-08-28-m0-t2-maplat-v4-crs-libs-task-design.md v1.2 - * §3.2 affine 閉形式最小二乗 - * §3.4 F 検定・criticalF・数値的ゼロ許容 εSSE - * §3.5 二重 gate(F gate と相対改善 gate の AND) + * - affine 閉形式最小二乗 + * - F 検定・criticalF・数値的ゼロ許容 εSSE + * - 二重 gate(F gate と相対改善 gate の AND) * * ここは package-internal である。`src/index.ts` からは公開しない - * (公開 API は `fitWorldFile` と型のみ。設計 §3.2.1)。 + * (公開 API は `fitWorldFile` と型のみ)。 */ export type AffineFit = { worldFile: WorldFile; - /** training SSE(設計 §3.4 の SSE 定義) */ + /** training SSE(下の `forwardSse` の定義) */ sse: number; }; @@ -24,7 +23,7 @@ export type AffineFit = { * SSE = Σ_i [ (X_i - X̂_i)² + (Y_i - Ŷ_i)² ] * X̂ = xScale·u + xSkew·v + xOrigin , Ŷ = ySkew·u + yScale·v + yOrigin * - * training SSE と holdout の残差計算の両方で使う(設計 §3.4 / §3.6)。 + * training SSE と holdout の残差計算の両方で使う。 */ export function forwardSse(worldFile: WorldFile, gcps: readonly GcpPair[]): number { let sse = 0; @@ -40,13 +39,13 @@ export function forwardSse(worldFile: WorldFile, gcps: readonly GcpPair[]): numb } /** - * 6 パラメータ affine の閉形式最小二乗(設計 §3.2)。 + * 6 パラメータ affine の閉形式最小二乗。 * * 重心化 pre-conditioning を行い、X 系・Y 系を独立な 2×2 正規方程式として解く。 * `det M === 0`(共分散行列が特異 = 完全共線)または解/SSE に非有限値が出た場合は `null`。 * * 注: ここの `=== 0` は **共分散行列の特異判定**であって SSE のゼロ比較ではない。 - * SSE の「ゼロ」判定は呼出側が設計 §3.4 の数値許容 εSSE で行い、厳密比較を使わない。 + * SSE の「ゼロ」判定は呼出側が数値許容 εSSE で行い、厳密比較を使わない。 */ export function fitAffine(gcps: readonly GcpPair[]): AffineFit | null { const n = gcps.length; @@ -124,7 +123,7 @@ export function fitAffine(gcps: readonly GcpPair[]): AffineFit | null { } /** - * F(df1, df2) 分布の上側 alpha 点(設計 §3.4)。 + * F(df1, df2) 分布の上側 alpha 点。 * * 本タスクでは df1 は常に 2 なので、一般形(不完全ベータ)は実装せず閉形式を用いる。 * @@ -142,12 +141,12 @@ export function criticalF(alpha: number, df1: number, df2: number): number { } /** - * F 統計量(設計 §3.4)。df1 = 2 固定。 + * F 統計量。df1 = 2 固定。 * * F = ((SSE4 - SSE6) / 2) / (SSE6 / df2) * * `df2` が非有限または `<= 0` なら NaN。 - * Z(SSE6)(数値的ゼロ)の場合に +Infinity とする判断は呼出側が行う(設計 §3.4)。 + * Z(SSE6)(数値的ゼロ)の場合に +Infinity とする判断は呼出側が行う。 */ export function fStatistic(sseSimilarity: number, sseAffine: number, df2: number): number { if (!Number.isFinite(df2) || df2 <= 0) return Number.NaN; @@ -155,7 +154,7 @@ export function fStatistic(sseSimilarity: number, sseAffine: number, df2: number } /** - * 相対改善(設計 §3.5)。 + * 相対改善。 * * (SSE4 - SSE6) / SSE4 * diff --git a/src/fitting/similarity.ts b/src/fitting/similarity.ts index 84cf53f..d342d8c 100644 --- a/src/fitting/similarity.ts +++ b/src/fitting/similarity.ts @@ -3,11 +3,11 @@ import { criticalF, fStatistic, fitAffine, forwardSse, relativeImprovement } fro export { type FitOptions, type FitResult, type FitWarning, type WarningCode }; -/** 設計 v1.2 §3.4: F gate の有意水準(開区間 (0,1)) */ +/** F gate の有意水準(開区間 (0,1)) */ const DEFAULT_ALPHA = 0.05; -/** 設計 v1.2 §3.5: 相対改善 gate の下限(閉区間 [0,1]) */ +/** 相対改善 gate の下限(閉区間 [0,1]) */ const DEFAULT_MIN_RELATIVE_IMPROVEMENT = 0.01; -/** 設計 v1.2 §3.3: 共分散固有値比の共線判定閾値(閉区間 [0,1]) */ +/** 共分散固有値比の共線判定閾値(閉区間 [0,1]) */ const DEFAULT_COLLINEARITY_THRESHOLD = 0.01; /** 閉区間 [0,1] を有効範囲とする option の正規化。範囲外・非有限は既定値へ落とし warning は足さない。 */ @@ -24,13 +24,13 @@ function normalizeOpenUnit(value: number | undefined, fallback: number): number return value; } -/** affine 診断値(`FitResult.debug` のうち sse / mse を除いた optional 部分。設計 §3.8) */ +/** affine 診断値(`FitResult.debug` のうち sse / mse を除いた optional 部分) */ type AffineDebug = Omit, 'sse' | 'mse'>; /** * 選択モデルの逆写像による rmsPixels(affine 採用時)。 - * m0-t1 の Helmert 逆写像方式を一般の 2×2 affine へ拡張したもので、 - * similarity(xScale=yScale, xSkew=-ySkew)を代入すると m0-t1 の式に一致する。 + * similarity(Helmert)の逆写像方式を一般の 2×2 affine へ拡張したもので、 + * similarity(xScale=yScale, xSkew=-ySkew)を代入すると similarity の式に一致する。 */ function affineRmsPixels(wf: WorldFile, gcps: readonly GcpPair[]): number { const det = wf.xScale * wf.yScale - wf.xSkew * wf.ySkew; @@ -49,7 +49,7 @@ function affineRmsPixels(wf: WorldFile, gcps: readonly GcpPair[]): number { return Math.sqrt(sumSqErrPixels / gcps.length); } -/** holdout の 1 点あたり 2D 距離 RMS(設計 §3.6) */ +/** holdout の 1 点あたり 2D 距離 RMS */ function holdoutRms(wf: WorldFile, holdout: readonly GcpPair[]): number { return Math.sqrt(forwardSse(wf, holdout) / holdout.length); } @@ -72,7 +72,7 @@ export function fitWorldFile( }; } - // 1b. 非空 holdout の非有限 pixel / geo は入力不正(設計 v1.2 §3.6 / §3.7 #0)。 + // 1b. 非空 holdout の非有限 pixel / geo は入力不正(分岐 #0)。 // training fit より先に検査し、非有限値を RMS へ伝播させない。新規 WarningCode は作らない。 const holdout: readonly GcpPair[] = opts?.holdout ?? []; for (let i = 0; i < holdout.length; i++) { @@ -151,7 +151,7 @@ export function fitWorldFile( } let sumU = 0, sumV = 0, sumX = 0, sumY = 0; - // Σ(X²+Y²)(training geo のみ)。εSSE の材料(設計 v1.2 §3.4)。 + // Σ(X²+Y²)(training geo のみ)。εSSE の材料。 // 総和順序は「training GCP を index 昇順に走査し、各点で X²+Y² を加える」に固定する。 // tests/affine.test.ts はこの順序で再計算し、厳密一致で照合する(MIN-R3-1 の選択機構)。 let sumGeoSq = 0; @@ -226,7 +226,7 @@ export function fitWorldFile( } // 4. Near Collinear detection (n >= 3) - // 固有値分解は similarity パスと affine パスで共用する(設計 §3.1。二重計算しない) + // 固有値分解は similarity パスと affine パスで共用する(二重計算しない) let nearCollinear = false; if (n >= 3) { const suu = Suu / n; @@ -297,7 +297,7 @@ export function fitWorldFile( } const rmsPixels = scale2 > 0 ? Math.sqrt(sumSqErrPixels / n) : 0; - // 6. affine 判定(m0-t2。設計 v1.2 §3.7 の分岐順に上から評価する) + // 6. affine 判定(分岐 #1〜#8 を番号順に上から評価する) const alpha = normalizeOpenUnit(opts?.alpha, DEFAULT_ALPHA); const minRelativeImprovement = normalizeClosedUnit( opts?.minRelativeImprovement, @@ -318,7 +318,7 @@ export function fitWorldFile( warnings.push({ code: 'affineSkippedCollinear' }); } else { // #4〜#8: affine 評価に到達する - // εSSE = 1024 · Number.EPSILON² · Σ(X²+Y²)(設計 §3.4 の仮仕様)。 + // εSSE = 1024 · Number.EPSILON² · Σ(X²+Y²)。 // 以降の SSE の「ゼロ」判定はすべて Z(s) := (s <= sseZeroTolerance) を使い、厳密比較はしない。 const sseZeroTolerance = 1024 * Number.EPSILON * Number.EPSILON * sumGeoSq; affineDebug.sseSimilarity = sse; @@ -342,7 +342,7 @@ export function fitWorldFile( rejectDetail = `affine SSE is not smaller than similarity SSE (SSE6=${affine.sse} > SSE4=${sse})`; } else { const df2 = 2 * n - 6; - // Z(SSE6) かつ ¬Z(SSE4) なら F = +Infinity(設計 §3.4) + // Z(SSE6) かつ ¬Z(SSE4) なら F = +Infinity const fValue = affine.sse <= sseZeroTolerance ? Number.POSITIVE_INFINITY : fStatistic(sse, affine.sse, df2); @@ -383,7 +383,7 @@ export function fitWorldFile( selectedRmsPixels = affineRmsPixels(affine!.worldFile, gcps); } - // ※ affine 評価に到達し holdout 未指定 / 空なら、採用可否にかかわらず必ず発出する(設計 §3.7 ※) + // ※ affine 評価に到達し holdout 未指定 / 空なら、採用可否にかかわらず必ず発出する if (holdout.length === 0) { warnings.push({ code: 'validationSkipped' }); } diff --git a/src/types.ts b/src/types.ts index 340360b..314b402 100644 --- a/src/types.ts +++ b/src/types.ts @@ -39,11 +39,11 @@ export type FitWarning = { export interface FitOptions { geoBasis?: GeoBasis; debug?: boolean; - collinearityThreshold?: number; // for affine (used in t2) - alpha?: number; // for F gate (used in t2) - minRelativeImprovement?: number; // for F gate (used in t2) + collinearityThreshold?: number; // for affine + alpha?: number; // for F gate + minRelativeImprovement?: number; // for F gate normalizeEpsilonMeters?: number; - holdout?: readonly GcpPair[]; // for holdout validation (used in t2) + holdout?: readonly GcpPair[]; // for holdout validation } export interface FitResult { @@ -56,7 +56,7 @@ export interface FitResult { warnings: readonly FitWarning[]; /** * `FitOptions.debug` が真のときだけ存在する診断値。 - * optional field は該当する分岐が実行されたときのみ存在する(m0-t2 設計 v1.2 §3.8)。 + * optional field は該当する分岐が実行されたときのみ存在する。 * `sse` / `mse` は**選択モデル**(affine 採用なら affine、不採用なら similarity)のもの。 */ debug?: { From 33d02caacce3ea5cb2082aa2d65d81bfeb462acf Mon Sep 17 00:00:00 2001 From: Kohei Otsuka Date: Tue, 27 Oct 2026 19:31:56 +0900 Subject: [PATCH 3/5] docs: add install, type and development sections and a changelog Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 12 ++++++++++++ README.ja.md | 40 ++++++++++++++++++++++++++++++++++++++++ README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..1771493 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +このプロジェクトの主な変更を記録します。版数は [Semantic Versioning](https://semver.org/) に従います。 +Notable changes to this project are recorded here. Versions follow [Semantic Versioning](https://semver.org/). + +## [Unreleased] + +### Added +- 初版。npm に `@c4h/daedalus` として公開します。主な API は `fitWorldFile`(対応点から相似または affine のワールドファイルを当てはめ、採用の可否・warning・残差を返す)と、その入出力の型(`GcpPair`・`GeoBasis`・`FitOptions`・`FitResult`・`WorldFile` ほか)です。全 export は README の公開 API の節にあります。 +- First release, published to npm as `@c4h/daedalus`. The main API is `fitWorldFile` (fits a similarity or affine world file to ground control points and reports whether it can be adopted, with warnings and residuals) and the types of its input and output (`GcpPair`, `GeoBasis`, `FitOptions`, `FitResult`, `WorldFile` and others). Every export is listed in the Public API section of the README. +- 対応していないことは README の「[非目標](./README.ja.md#非目標)」にあります。 +- What is not supported is listed under "[Non-goals](./README.md#non-goals)" in the README. diff --git a/README.ja.md b/README.ja.md index 222161b..3beefa5 100644 --- a/README.ja.md +++ b/README.ja.md @@ -21,6 +21,16 @@ English README is [here](./README.md). - **誤った点**: 1 点を約 75 m ずらしても品質の札は `adoptable` のままで、その点の長い残差の矢印と RMS でだけ見えます。品質の札は点の数で決まる判定で、誤差の大きさは見ません(デモでも札の横にそう書いています)。 - **点のドラッグ**: 点を手で動かすと、プリセットのボタンの押下が外れ、見え方の 1 行は「プリセットではない入力」の説明に替わります。 +## インストール + +Node.js >= 22(またはバンドラ経由のブラウザ)が必要です。 + + +```sh +pnpm add @c4h/daedalus +``` + + ## 公開 API ```ts @@ -31,6 +41,21 @@ const result = fitWorldFile(gcps, options); `fitWorldFile` と型のみが公開である。affine / F 検定の helper は package-internal であり `src/index.ts` からは export しない。 +### 型 + +| 名前 | 表すもの | +|---|---| +| `GcpPair` | 対応点 1 組。`pixel` `[u, v]` と `geo` `[X, Y]`。 | +| `GeoBasis` | `geo` の表し方。`{ kind: 'lonlat_deg', axisOrder: 'lon-lat' }` か `{ kind: 'planar_xy', axisOrder: 'xy', unit: 'm' \| 'ft' }`。 | +| `FitOptions` | `fitWorldFile` の option(下の表)。 | +| `FitResult` | 戻り値(下の観測契約を参照)。 | +| `WorldFile` | ワールドファイルの 6 つのパラメータ `xScale`・`xSkew`・`xOrigin`・`ySkew`・`yScale`・`yOrigin`。 | +| `QualityGate` | `'adoptable' \| 'preview' \| 'unusable'`。 | +| `FitStatus` | `'ok' \| 'ok_with_warnings' \| 'insufficient' \| 'failed'`。 | +| `FitWarning` | `{ code: WarningCode; detail?: string }`。 | +| `WarningCode` | 「warning コードと判定順序」に挙げた warning コード。 | +| `MaybePromise` | `MaybePromise = T \| Promise`(補助の型)。 | + ### `FitOptions` | option | 既定値 | 有効範囲 | 範囲外・非有限のとき | @@ -123,6 +148,21 @@ Z(s) = (s <= epsSSE) - weight / robust fitting / 逆写像 RMS の高度化 / アンチメリディアン・極域 - CI での継続的・自動のブラウザ実行(上の「Runtime」を参照) +## 開発 + +- `pnpm run dev`: デモをローカルで開く +- `pnpm run test` / `pnpm run typecheck` / `pnpm run test:types`: テスト・型検査・公開型の検査 +- `pnpm run build`: パッケージを `dist/` に build +- `pnpm run verify:demo`: GitHub Pages 用のデモを `dist-demo/` に build して確かめる + +このリポジトリだけを単独で install するとき(より大きな pnpm workspace の外)は、先に CI の設定を +写してください: `cp ci/pnpm-workspace.ci.yaml pnpm-workspace.yaml && pnpm install --frozen-lockfile`。 +写した `pnpm-workspace.yaml` は commit しないでください。 + +`pnpm publish` の前に `prepublishOnly`(test・typecheck・test:types・build・verify:demo)が走ります。 +公開は GitHub Actions(`.github/workflows/publish.yml`)から行います。変更の記録は +[CHANGELOG.md](./CHANGELOG.md) にあります。 + ## ライセンス MIT License です。[LICENSE](./LICENSE) を参照してください。 diff --git a/README.md b/README.md index 5d349c1..3aeebd7 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,16 @@ The demo is published on GitHub Pages: (the - **A wrong point**: moving one GCP by about 75 m keeps the quality gate at `adoptable`; only its long residual arrow and the RMS reveal it. The quality gate is decided by the number of points and does not look at the size of the errors, so the demo says so next to it. - **Dragging a point**: once you move a point by hand, the preset button is released and the expectation line says the input is no longer a preset. +## Installation + +Requires Node.js >= 22 (or a browser through a bundler). + + +```sh +pnpm add @c4h/daedalus +``` + + ## Public API ```ts @@ -31,6 +41,21 @@ const result = fitWorldFile(gcps, options); Only `fitWorldFile` and the types are public. The affine / F-test helpers are package-internal and are not exported from `src/index.ts`. +### Types + +| Name | What it describes | +|---|---| +| `GcpPair` | One ground control point: `pixel` `[u, v]` and `geo` `[X, Y]`. | +| `GeoBasis` | How `geo` is expressed: `{ kind: 'lonlat_deg', axisOrder: 'lon-lat' }` or `{ kind: 'planar_xy', axisOrder: 'xy', unit: 'm' \| 'ft' }`. | +| `FitOptions` | Options of `fitWorldFile` (below). | +| `FitResult` | The return value (see the observation contract below). | +| `WorldFile` | The six world-file parameters `xScale`, `xSkew`, `xOrigin`, `ySkew`, `yScale`, `yOrigin`. | +| `QualityGate` | `'adoptable' \| 'preview' \| 'unusable'`. | +| `FitStatus` | `'ok' \| 'ok_with_warnings' \| 'insufficient' \| 'failed'`. | +| `FitWarning` | `{ code: WarningCode; detail?: string }`. | +| `WarningCode` | The warning codes listed in "Warning codes and evaluation order". | +| `MaybePromise` | `MaybePromise = T \| Promise`, a helper type. | + ### `FitOptions` | option | default | valid range | out of range / non-finite | @@ -129,6 +154,21 @@ issues [#3](https://github.com/code4history/Daedalus/issues/3) (validation, weig - Weights / robust fitting / more advanced inverse-mapping RMS / antimeridian and polar regions - Continuous, automated browser execution on CI (see "Runtime" above) +## Development + +- `pnpm run dev`: open the demo locally +- `pnpm run test` / `pnpm run typecheck` / `pnpm run test:types`: tests, type check and the public type surface +- `pnpm run build`: build the package into `dist/` +- `pnpm run verify:demo`: build the GitHub Pages demo into `dist-demo/` and check it + +For an install of this repository on its own (outside a larger pnpm workspace), copy the CI +settings first: `cp ci/pnpm-workspace.ci.yaml pnpm-workspace.yaml && pnpm install --frozen-lockfile`. +Do not commit the copied `pnpm-workspace.yaml`. + +`pnpm publish` is guarded by `prepublishOnly` (test, typecheck, test:types, build and +verify:demo). Releases are published from GitHub Actions (`.github/workflows/publish.yml`). +Changes are listed in [CHANGELOG.md](./CHANGELOG.md). + ## License MIT License. See [LICENSE](./LICENSE). From 00962f15bfa2d66d0a05a33aff708322baa334b1 Mon Sep 17 00:00:00 2001 From: Kohei Otsuka Date: Tue, 27 Oct 2026 19:31:56 +0900 Subject: [PATCH 4/5] ci: make the package publishable, move tests to pnpm 11 and Node 22/24, add the npm publish workflow - package.json: private false, publishConfig.access public, files without src/testkit, engines.node >=22, prepublishOnly, homepage on the Pages site; devDependencies move to the latest release of their series - ci/pnpm-workspace.ci.yaml gains minimumReleaseAgeExclude and the tinypool override - test.yml installs the same way as deploy.yml (pnpm 11.27.0, CI pnpm settings, frozen lockfile) on Node 22 and 24, so the separate deploy-build job is folded into it; it starts from contents: read and every action is pinned by SHA - publish.yml is the shared trusted-publishing workflow with CI_WORKFLOW_FILE=test.yml Co-Authored-By: Claude Opus 5.5 --- .github/workflows/deploy.yml | 6 +- .github/workflows/publish.yml | 230 +++++++++++++++++++++ .github/workflows/test.yml | 67 +++--- ci/pnpm-workspace.ci.yaml | 29 ++- package.json | 28 ++- pnpm-lock.yaml | 371 +++++++++++++++++----------------- 6 files changed, 492 insertions(+), 239 deletions(-) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7ce322d..f734bf1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,13 +20,15 @@ jobs: name: Build demo site runs-on: ubuntu-latest steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Install pnpm uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: version: 11.27.0 - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..efb9b6b --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,230 @@ +name: Publish to npm + +on: + workflow_dispatch: + inputs: + dist_tag: + description: 'npm dist-tag(next = RC / latest = 正式版)' + type: choice + options: [next, latest] + required: true + expected_version: + description: '公開する version(package.json と一致すること。例 1.0.1-rc.1)' + type: string + required: true + expected_sha: + description: '起動する tag が指す commit の SHA(40 桁)' + type: string + required: true + dry_run: + description: 'true なら publish しない(リハーサル)' + type: boolean + default: true + +permissions: {} + +concurrency: + group: npm-publish + cancel-in-progress: false + +env: + # ---- repo ごとに変える(設計書 §3.2 の表) ---- + CI_WORKFLOW_FILE: test.yml + RELEASE_CHECK: pnpm run prepublishOnly + # ---- 共通 ---- + PNPM_VERSION: 11.27.0 + NODE_VERSION: '24' + +jobs: + verify: + name: 事前検査・build・pack(OIDC 権限なし) + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + actions: read + outputs: + name: ${{ steps.meta.outputs.name }} + version: ${{ steps.meta.outputs.version }} + tarball: ${{ steps.pack.outputs.tarball }} + sha256: ${{ steps.pack.outputs.sha256 }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: 起動条件の検査 + id: meta + env: + DIST_TAG: ${{ inputs.dist_tag }} + EXPECTED_VERSION: ${{ inputs.expected_version }} + EXPECTED_SHA: ${{ inputs.expected_sha }} + DRY_RUN: ${{ inputs.dry_run }} + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + # 形式検査(Minor #2): expected_version は semver、expected_sha は 40 桁の 16 進数。誤入力・注入文字列を早期に fail する + VER_RE='^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$' + SHA_RE='^[0-9a-fA-F]{40}$' + [[ "${EXPECTED_VERSION}" =~ ${VER_RE} ]] || { echo "::error::expected_version が semver でない: ${EXPECTED_VERSION}"; exit 1; } + [[ "${EXPECTED_SHA}" =~ ${SHA_RE} ]] || { echo "::error::expected_sha が 40 桁の 16 進数でない"; exit 1; } + NAME=$(node -p "require('./package.json').name") + VERSION=$(node -p "require('./package.json').version") + echo "name=${NAME}" >> "$GITHUB_OUTPUT" + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + # 本番は全項目で停止。dry_run は SHA 以外を警告に留める(master でのリハーサルのため) + check() { if [ "${DRY_RUN}" = "true" ]; then echo "::warning::$1"; else echo "::error::$1"; exit 1; fi; } + [ "${GITHUB_SHA}" = "${EXPECTED_SHA}" ] || { echo "::error::SHA 不一致: ${GITHUB_SHA} != ${EXPECTED_SHA}"; exit 1; } + [ "${GITHUB_REF_TYPE}" = "tag" ] || check "tag 以外から起動された(${GITHUB_REF})" + [ "${GITHUB_REF_NAME}" = "v${EXPECTED_VERSION}" ] || check "tag 名 ${GITHUB_REF_NAME} が v${EXPECTED_VERSION} と一致しない" + [ "${VERSION}" = "${EXPECTED_VERSION}" ] || check "version 不一致: package.json=${VERSION} 入力=${EXPECTED_VERSION}" + case "${VERSION}" in + *-*) [ "${DIST_TAG}" = "next" ] || check "prerelease ${VERSION} を ${DIST_TAG} に出そうとしている" ;; + *) [ "${DIST_TAG}" = "latest" ] || check "正式版 ${VERSION} を ${DIST_TAG} に出そうとしている" ;; + esac + if [ -n "$(npm view "${NAME}@${VERSION}" version 2>/dev/null || true)" ]; then + check "${NAME}@${VERSION} は公開済み" + fi + N=$(gh api "repos/${GITHUB_REPOSITORY}/actions/workflows/${CI_WORKFLOW_FILE}/runs?head_sha=${GITHUB_SHA}&status=success" --jq '.total_count') + [ "${N}" -ge 1 ] || check "${CI_WORKFLOW_FILE} が ${GITHUB_SHA} で成功していない" + { + echo "### publish 候補" + echo "- package: \`${NAME}@${VERSION}\` → dist-tag \`${DIST_TAG}\`(dry_run=${DRY_RUN})" + echo "- ref: \`${GITHUB_REF}\` / sha: \`${GITHUB_SHA}\`" + } >> "$GITHUB_STEP_SUMMARY" + + - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + with: + version: ${{ env.PNPM_VERSION }} + + - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0 + with: + node-version: ${{ env.NODE_VERSION }} + cache: pnpm + + - name: CI 用 pnpm 設定を展開 + run: cp ci/pnpm-workspace.ci.yaml pnpm-workspace.yaml + + - name: 依存の導入 + run: pnpm install --frozen-lockfile + + - name: release 検査(lint・typecheck・test・build) + run: bash -euo pipefail -c "${RELEASE_CHECK}" + + - name: pack + id: pack + run: | + set -euo pipefail + mkdir -p "${RUNNER_TEMP}/pack" + pnpm pack --pack-destination "${RUNNER_TEMP}/pack" + COUNT=$(find "${RUNNER_TEMP}/pack" -maxdepth 1 -name '*.tgz' | wc -l) + [ "${COUNT}" -eq 1 ] || { echo "::error::tarball が ${COUNT} 個"; exit 1; } + T=$(find "${RUNNER_TEMP}/pack" -maxdepth 1 -name '*.tgz') + S=$(sha256sum "${T}" | cut -d' ' -f1) + echo "tarball=$(basename "${T}")" >> "$GITHUB_OUTPUT" + echo "sha256=${S}" >> "$GITHUB_OUTPUT" + echo "- tarball: \`$(basename "${T}")\` sha256 \`${S}\`" >> "$GITHUB_STEP_SUMMARY" + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: npm-tarball + path: ${{ runner.temp }}/pack/*.tgz + if-no-files-found: error + retention-days: 30 + + publish: + name: publish(environment npm-publish の承認後) + needs: verify + runs-on: ubuntu-latest + timeout-minutes: 15 + environment: npm-publish + permissions: + contents: read + id-token: write + steps: + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: npm-tarball + path: ${{ runner.temp }}/pack + + - name: tarball の同一性 + env: + TARBALL: ${{ needs.verify.outputs.tarball }} + SHA256: ${{ needs.verify.outputs.sha256 }} + run: echo "${SHA256} ${RUNNER_TEMP}/pack/${TARBALL}" | sha256sum -c - + + - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 + with: + version: ${{ env.PNPM_VERSION }} + + - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0 + with: + node-version: ${{ env.NODE_VERSION }} + # registry-url は渡さない(.npmrc にトークン行を作らない) + + - name: OIDC 交換の確認(dry_run のときだけ・HTTP status だけを出す) + if: ${{ inputs.dry_run }} + env: + NAME: ${{ needs.verify.outputs.name }} + run: | + set -euo pipefail + ID=$(curl -sS -H "Authorization: Bearer ${ACTIONS_ID_TOKEN_REQUEST_TOKEN}" \ + "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=npm:registry.npmjs.org" \ + | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>process.stdout.write(JSON.parse(s).value||""))') + [ -n "${ID}" ] || { echo "::error::GitHub から ID トークンを取れない(id-token 権限を確認)"; exit 1; } + echo "::add-mask::${ID}" + ESC=$(node -p 'encodeURIComponent(process.env.NAME).replace(/^%40/,"@")') + CODE=$(curl -sS -o /dev/null -w '%{http_code}' -X POST -H "Authorization: Bearer ${ID}" \ + "https://registry.npmjs.org/-/npm/v1/oidc/token/exchange/package/${ESC}") + echo "- OIDC exchange: HTTP ${CODE}" >> "$GITHUB_STEP_SUMMARY" + case "${CODE}" in 2??) ;; *) echo "::error::OIDC 交換が HTTP ${CODE}。npm の trusted publisher 登録(repo・publish.yml・npm-publish)を確認"; exit 1 ;; esac + + - name: publish + working-directory: ${{ runner.temp }}/pack + env: + TARBALL: ${{ needs.verify.outputs.tarball }} + DIST_TAG: ${{ inputs.dist_tag }} + DRY_RUN: ${{ inputs.dry_run }} + run: | + set -euo pipefail + ARGS=(--access public --tag "${DIST_TAG}" --provenance --no-git-checks) + [ "${DRY_RUN}" = "true" ] && ARGS+=(--dry-run) + pnpm publish "./${TARBALL}" "${ARGS[@]}" + + - name: 公開結果の確認 + if: ${{ !inputs.dry_run }} + env: + NAME: ${{ needs.verify.outputs.name }} + VERSION: ${{ needs.verify.outputs.version }} + DIST_TAG: ${{ inputs.dist_tag }} + run: | + set -euo pipefail + # 版と dist-tag が一致するまで待つ(NayutaProducts#30)。404 の JSON・JSON でない出力では抜けない + [ -n "${VERSION}" ] || { echo "::error::VERSION が空(verify job の出力を確認)"; exit 1; } + JUDGE=' + let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{ + const want=process.env.VERSION, tag=process.env.DIST_TAG, final=process.env.FINAL==="1"; + let p=null; try{p=JSON.parse(s)}catch(e){p=null} + const ok=!!p&&typeof p==="object"&&!Array.isArray(p)&&!p.error; + const ver=ok&&p.version===want; + const tagOk=ok&&(p["dist-tags"]||{})[tag]===want; + if(!final){process.exit(ver&&tagOk?0:1)} + const prov=ok&&!!(p.dist&&p.dist.attestations&&p.dist.attestations.provenance); + let t=null; try{t=JSON.parse(process.env.TP_JSON||"")}catch(e){t=null} + const tp=!!t&&typeof t==="object"&&!Array.isArray(t)&&!t.error&&typeof t.id==="string"&&t.id!==""; + console.log(`- registry: version=${ok?p.version:"(応答なし)"} dist-tags.${tag}=${tagOk} provenance=${prov} trustedPublisher=${tp}`); + const errs=[]; + if(!ver)errs.push(`${want} が registry で見えない`); + if(!tagOk)errs.push(`dist-tag ${tag} が ${want} を指していない`); + if(!prov)errs.push("provenance が付いていない"); + if(!tp)errs.push("trustedPublisher が付いていない"); + if(errs.length){for(const m of errs)console.log(`::error::${m}`);console.log("::error::公開は済んだが照合に落ちた(取り消しはできない)。下流の波を止める");process.exit(1)} + })' + J="" + for i in $(seq 1 20); do + J=$(npm view "${NAME}@${VERSION}" --json 2>/dev/null || true) + if printf '%s' "${J}" | FINAL=0 node -e "${JUDGE}"; then break; fi + sleep 15 + done + TP=$(npm view "${NAME}@${VERSION}" _npmUser.trustedPublisher --json 2>/dev/null || true) + printf '%s' "${J}" | FINAL=1 TP_JSON="${TP}" node -e "${JUDGE}" | tee -a "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 770bc65..2011ea0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,31 +1,49 @@ name: CI -# ブランチ非限定(Atlas 前例と同一)∴ branches キーを持たない。 +# Runs on every branch (no branches key). on: push: pull_request: -# Daedalus は依存を 1 件も持たない(dependencies キー自体が無い)∴ 単体 checkout で完結し、 -# 兄弟リポジトリの checkout は不要である。デモ(index.html と demo/)は vite で作り、 -# GitHub Pages への配備は deploy.yml が master への push で行う。ここではデモの build と -# Pages 用の成果物の形だけを検査する(verify:demo)。 +permissions: + contents: read + +# Daedalus has no dependencies (no dependencies key at all), so CI checks out this +# repository alone. The demo (index.html and demo/) is built with vite; deploy.yml +# publishes it to GitHub Pages on pushes to master. This job checks the demo build and +# the shape of the Pages artifact (verify:demo). +# +# deploy.yml runs only on pushes to master. This job installs the same way (pnpm +# 11.27.0, the CI pnpm settings and --frozen-lockfile) and includes the Node.js version +# deploy.yml builds with, so an install problem shows up on the pull request instead of +# after the merge. tests/ci-workflow.test.ts keeps the two in step. jobs: test: - name: Test + name: Test (Node ${{ matrix.node-version }}) runs-on: ubuntu-latest + strategy: + matrix: + node-version: [22, 24] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false - name: Install pnpm - uses: pnpm/action-setup@v4 + uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 with: - version: 10 + version: 11.27.0 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0 with: - node-version: 22 + node-version: ${{ matrix.node-version }} cache: pnpm + # pnpm 11 reads allowBuilds, minimumReleaseAgeExclude and overrides only from + # pnpm-workspace.yaml, which is kept out of the repository root (see the comment in + # ci/pnpm-workspace.ci.yaml). + - name: Use CI pnpm settings + run: cp ci/pnpm-workspace.ci.yaml pnpm-workspace.yaml - name: Install dependencies - run: pnpm install + run: pnpm install --frozen-lockfile - name: Run tests run: pnpm run test - name: Run typecheck @@ -36,28 +54,3 @@ jobs: run: pnpm run build - name: Build and verify demo site run: pnpm run verify:demo - - # deploy.yml runs only on pushes to master, so its install path would otherwise be - # tried for the first time after merging. This job repeats the same steps (pnpm - # 11.27.0, Node.js 24, the CI pnpm settings and --frozen-lockfile) on every push - # and pull request, so a failing install shows up before the merge. - deploy-build: - name: Deploy build (same install as deploy.yml) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - name: Install pnpm - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0 - with: - version: 11.27.0 - - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - with: - node-version: 24 - cache: pnpm - - name: Use CI pnpm settings - run: cp ci/pnpm-workspace.ci.yaml pnpm-workspace.yaml - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Build and verify demo site - run: pnpm run verify:demo diff --git a/ci/pnpm-workspace.ci.yaml b/ci/pnpm-workspace.ci.yaml index aaed3bd..971be87 100644 --- a/ci/pnpm-workspace.ci.yaml +++ b/ci/pnpm-workspace.ci.yaml @@ -2,16 +2,29 @@ # before `pnpm install --frozen-lockfile`. # # Why it is not committed as pnpm-workspace.yaml: -# pnpm 11 reads allowBuilds only from pnpm-workspace.yaml (not from .npmrc or the -# package.json "pnpm" field). A pnpm-workspace.yaml at the repository root would -# also make this directory a workspace root during local development, where the -# repository is used inside a larger workspace. CI clones the repository on its -# own, so the copy is harmless there. +# pnpm 11 reads allowBuilds, minimumReleaseAgeExclude and overrides only from +# pnpm-workspace.yaml (not from .npmrc or the package.json "pnpm" field). A +# pnpm-workspace.yaml at the repository root would also make this directory a +# workspace root during local development, where the repository is used inside a +# larger workspace. CI clones the repository on its own, so the copy is harmless +# there. For a local install on its own, copy it the same way first. # -# Where the list comes from: running `pnpm install --frozen-lockfile` with pnpm -# 11.27.0, CI=true, lifecycle scripts enabled and no node_modules fails with -# ERR_PNPM_IGNORED_BUILDS for the packages below (pnpm 11 sets strictDepBuilds +# Where the allowBuilds list comes from: running `pnpm install --frozen-lockfile` +# with pnpm 11.27.0, CI=true, lifecycle scripts enabled and no node_modules fails +# with ERR_PNPM_IGNORED_BUILDS for the packages below (pnpm 11 sets strictDepBuilds # to true by default). Re-measure the same way when dependencies change. allowBuilds: esbuild: true + +# Our own packages are published by us, so they are exempt from the 24-hour quarantine +# that pnpm 11 applies by default (minimumReleaseAge=1440). Third-party packages keep it. +minimumReleaseAgeExclude: + - "@maplat/*" + - "@c4h/*" + +overrides: + # vitest 3.2 > tinypool. <2.1.2 is critical (prototype pollution leading to code + # execution in worker options). vitest 3.2 declares ^1.1.1 and no 1.x release is + # patched, so this crosses to the 2 series; the test run uses it as is. + tinypool: "^2.1.2" diff --git a/package.json b/package.json index b4ff735..5e31c6e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,10 @@ { "name": "@c4h/daedalus", "version": "0.0.1", - "private": true, + "private": false, + "publishConfig": { + "access": "public" + }, "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -12,6 +15,14 @@ "default": "./dist/index.js" } }, + "files": [ + "dist", + "src/index.ts", + "src/types.ts", + "src/fitting", + "README.md", + "README.ja.md" + ], "description": "World-file fitting helpers for Maplat.", "repository": { "type": "git", @@ -21,10 +32,10 @@ "bugs": { "url": "https://github.com/code4history/Daedalus/issues" }, - "homepage": "https://github.com/code4history/Daedalus#readme", + "homepage": "https://code4history.dev/Daedalus/", "engines": { "pnpm": ">=10", - "node": ">=20" + "node": ">=22" }, "scripts": { "build": "tsc -p tsconfig.build.json", @@ -36,14 +47,15 @@ "dev": "vite --host", "build:demo": "vite build", "preview": "vite preview", - "verify:demo": "GITHUB_PAGES=true pnpm run build:demo && node scripts/verify-demo-pages-build.mjs" + "verify:demo": "GITHUB_PAGES=true pnpm run build:demo && node scripts/verify-demo-pages-build.mjs", + "prepublishOnly": "pnpm run test && pnpm run typecheck && pnpm run test:types && pnpm run build && pnpm run verify:demo" }, "devDependencies": { "@types/node": "^25.5.2", - "@vitest/coverage-v8": "^3.2.6", - "jsdom": "^30.0.0", + "@vitest/coverage-v8": "^3.2.7", + "jsdom": "^30.1.3", "typescript": "^5.9.3", - "vite": "^7.3.1", - "vitest": "^3.2.6" + "vite": "^7.3.7", + "vitest": "^3.2.7" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a93e565..ad539d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,28 +4,31 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + tinypool: ^2.1.2 + importers: .: devDependencies: '@types/node': specifier: ^25.5.2 - version: 25.9.5 + version: 25.9.9 '@vitest/coverage-v8': - specifier: ^3.2.6 - version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@25.9.5)(jsdom@30.1.3)(supports-color@7.2.0)) + specifier: ^3.2.7 + version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0)) jsdom: - specifier: ^30.0.0 + specifier: ^30.1.3 version: 30.1.3 typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^7.3.1 - version: 7.3.6(@types/node@25.9.5) + specifier: ^7.3.7 + version: 7.3.7(@types/node@25.9.9) vitest: - specifier: ^3.2.6 - version: 3.2.7(@types/node@25.9.5)(jsdom@30.1.3)(supports-color@7.2.0) + specifier: ^3.2.7 + version: 3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0) packages: @@ -41,21 +44,21 @@ packages: resolution: {integrity: sha512-EgmJ7oEaGQECTn3H3wmnQpEy4hKY66VvM7VQndwPIQob3p877BgbyOUE3EX0LgXQCciF2H8KMdR+RznqjMNOLw==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + '@babel/helper-string-parser@7.29.11': + resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.8': - resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + '@babel/parser@7.29.11': + resolution: {integrity: sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.29.8': - resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + '@babel/types@7.29.11': + resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': @@ -282,8 +285,8 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -299,141 +302,141 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.63.0': - resolution: {integrity: sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==} + '@rollup/rollup-android-arm-eabi@4.65.0': + resolution: {integrity: sha512-t2AnVba25baFdq7gczzS13JyVcdubLVbFX1X04mxrggDrTQPUXNv3XM0k9H1hr5tqvg7AVvtQ720QHAj0iYqhg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.63.0': - resolution: {integrity: sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==} + '@rollup/rollup-android-arm64@4.65.0': + resolution: {integrity: sha512-dNONUaEwPGhl/nuO2KV8VABWlcjYyU6KtZGN8dQv5OS5JU7JSCxPijVNKXbRJd0iuTzTiJ4TjPt/4bbvDRNiMQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.63.0': - resolution: {integrity: sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==} + '@rollup/rollup-darwin-arm64@4.65.0': + resolution: {integrity: sha512-zWQqUH+9zavr2Bxuzfpuv2SIF3X31cr58TvSQC9o1GhpOvkqRwr60GkZdQcudyT/BEgdpdSafjgd2I13MbTL7g==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.63.0': - resolution: {integrity: sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==} + '@rollup/rollup-darwin-x64@4.65.0': + resolution: {integrity: sha512-RQYreBFWtO4//hIuOaZkYUnF/lPU4lz35dveDimDshWCJvVisVtJ/shmT9bkXK8wFJY+FJF89X6F3Cq1qI3LCw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.63.0': - resolution: {integrity: sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA==} + '@rollup/rollup-freebsd-arm64@4.65.0': + resolution: {integrity: sha512-A0NfMj6Cuh/9BE5k3awJKv6HoxFVXIcLAb6SZqAMoxUHPA1ZNNK4RsGuUPD/vL7nEAm9LG+ZzXWWTrnC0XtkpA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.63.0': - resolution: {integrity: sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw==} + '@rollup/rollup-freebsd-x64@4.65.0': + resolution: {integrity: sha512-BI6/H7q3aP0I7S7GOrjyxTjgEJlSnovXE38+bdxBpuKN6z+d//uF+T+VQ3Q7ltJL/71p17ufartARX9Ja5gOGQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.63.0': - resolution: {integrity: sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==} + '@rollup/rollup-linux-arm-gnueabihf@4.65.0': + resolution: {integrity: sha512-W1vUprf09RWaVWnsFP1vlUkEWJzTZlpObOEAYZXt9Fq0UVAOYEkeGr7wBX7McKqqIQskXdBnpiOMgwPujordgA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.63.0': - resolution: {integrity: sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==} + '@rollup/rollup-linux-arm-musleabihf@4.65.0': + resolution: {integrity: sha512-s8QTcZWgrl9haFzEGIqyE5BWyo89pFDGLMBFZ752WYxk8DJwNU/O1X6pZgPw829d9/sm6CCHyrMP3aurt76p1Q==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.63.0': - resolution: {integrity: sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==} + '@rollup/rollup-linux-arm64-gnu@4.65.0': + resolution: {integrity: sha512-ke1f6dLRzkqveyjjF2fkEwQYZvxHtNNwjegY8nJrwcO0Bdqr8CzFO/pKE0Bns13cx0qz2Ba2Y0Hs3dSwMdnHxA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.63.0': - resolution: {integrity: sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==} + '@rollup/rollup-linux-arm64-musl@4.65.0': + resolution: {integrity: sha512-926SMeUcy4y18Rz/w2aJiUKOnyAnm6czg72bXkQEaeemsll+Wr0hnsjb2BGRpHvWgwAMYy5ACJCotbvfLCfj0A==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.63.0': - resolution: {integrity: sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==} + '@rollup/rollup-linux-loong64-gnu@4.65.0': + resolution: {integrity: sha512-6T7JNRP1hc4hqF2dUsEoVLOt9K8tmODoCLldtQRYnrddGGQY8Gqe2pM/qMMUo7EMowpP7oa2N95k0/8sYK/ipw==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.63.0': - resolution: {integrity: sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==} + '@rollup/rollup-linux-loong64-musl@4.65.0': + resolution: {integrity: sha512-SImGFl1Je5kpyAgOCPONVT7h6ASV8mAUwGRjY7eZvVjPg//PfHOXgI+P241RF/+HqsA4PP3qD527ysWFKNQyhQ==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.63.0': - resolution: {integrity: sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==} + '@rollup/rollup-linux-ppc64-gnu@4.65.0': + resolution: {integrity: sha512-XeDTbmPF1Yu5asfXGPrMkWoxTDhgryQbmw5Q1+R582O51VNCk23J6f2pDrsAp5YkneBVBwtExx6ZGOb9D2aQ6A==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.63.0': - resolution: {integrity: sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==} + '@rollup/rollup-linux-ppc64-musl@4.65.0': + resolution: {integrity: sha512-VS55JUI/1nsljmV/jfqNkLZXFw8uMO8nNlfoHmSevNf6fO3neuhyDvx9dv3c/Ytt8r/431SL8Qax1dpYvOMZTg==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.63.0': - resolution: {integrity: sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==} + '@rollup/rollup-linux-riscv64-gnu@4.65.0': + resolution: {integrity: sha512-Vblw84TbX7RS4la1Y4+yQ7aore/oSyaNtFbppuBr5Vs/4LfBeXKq9dIfoExw6zOvRERqd2rRAjnZRaMhH/0x5w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.63.0': - resolution: {integrity: sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==} + '@rollup/rollup-linux-riscv64-musl@4.65.0': + resolution: {integrity: sha512-7+gHjtONvKgwR9InTKFaLq53f6YzBJkgeMRBENdWTsQr+spahGqQm8HF5aXpq8i4JaRrOqYyv6Zn1WltDTxaZQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.63.0': - resolution: {integrity: sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==} + '@rollup/rollup-linux-s390x-gnu@4.65.0': + resolution: {integrity: sha512-KvNDC0J6s4vVHhtJ6KrDXU0Er0au/hmRIBq/+1maCV8TseGupeKizq0bWcrbp2HE1T8xoknvN0Q/KZ/YF0qX3w==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.63.0': - resolution: {integrity: sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==} + '@rollup/rollup-linux-x64-gnu@4.65.0': + resolution: {integrity: sha512-GExdD15WPvu/x/drELjVam7vX8EsPgvTMOa/iJL/p/4m/oOqzbb7JXZg8fXR4hlXtg/sF2zyTZ3bR0AEtEMlhQ==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.63.0': - resolution: {integrity: sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==} + '@rollup/rollup-linux-x64-musl@4.65.0': + resolution: {integrity: sha512-8sT9PemIZfIMED4Vd4KGoOXVDj5CMSWNcGdbheRUx9TYS03yOWdT2Q0lXPyEyNBB9YTilwewIQKNIBk6Nxi0Kg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.63.0': - resolution: {integrity: sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==} + '@rollup/rollup-openbsd-x64@4.65.0': + resolution: {integrity: sha512-pO6Ehi0jo5yE0R6PltKhJhv9mlIiyzBJk5N5NUF2OF6xtVKI+1bdXxj/rb0jGXy3hck1ELVT0QPY3tzkAm360w==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.63.0': - resolution: {integrity: sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==} + '@rollup/rollup-openharmony-arm64@4.65.0': + resolution: {integrity: sha512-vo7N3/+cjjPDYr8vtxC+qSNgWa9sDvJ7g8N8R5SWqFY4WiNH1ULcAU70SKVyHeiIZOYYwNP9pTipmhN5sl1NPw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.63.0': - resolution: {integrity: sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw==} + '@rollup/rollup-win32-arm64-msvc@4.65.0': + resolution: {integrity: sha512-ArwvgFAbjKcDM7qqotZ4OVYf+UMT9xH2YzkCzK4+AuZSDihMlz1Ekoe4INwBVXzn2mnJzuIYOcSx07iTBijGRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.63.0': - resolution: {integrity: sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA==} + '@rollup/rollup-win32-ia32-msvc@4.65.0': + resolution: {integrity: sha512-QGMmK4/cxKE/36FoLMSHQBCyymv/eFTnsCvvsBF0rgmOvVbvX78VWZRerL3dHa77f4pM6Xcc2iGDhJ10w/svKQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.63.0': - resolution: {integrity: sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw==} + '@rollup/rollup-win32-x64-gnu@4.65.0': + resolution: {integrity: sha512-XfKYFWHIPs4HPODIMsGF1IKlS3H1e3WokUZIgpmn4+uNnZBlnRDDHEylNyazbQXwhMKZre68OjtRYbKqb5+j8w==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.63.0': - resolution: {integrity: sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ==} + '@rollup/rollup-win32-x64-msvc@4.65.0': + resolution: {integrity: sha512-wPWi++K4Bs1VR4XihOhfGi4IGX6Cub7FlerTf8X2v+2BtDHddgSqWCXwGD+h2yAe4/niIhNDwAltioOC+wEogQ==} cpu: [x64] os: [win32] @@ -446,8 +449,8 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/node@25.9.5': - resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} + '@types/node@25.9.9': + resolution: {integrity: sha512-b4e2xxj/yMeT2hNlD6x7zNFiQK2Dlmkb9CQ6v3/1G2RezKN4YS2lcEv8lzGm1mhs4f2lM4yNAMI/zUDBZBBt7w==} '@vitest/coverage-v8@3.2.7': resolution: {integrity: sha512-NEGWJS2XNu2PfRLQwOO3CTKj1tTETxNBdk454vDxVBhxJYhPaA/eS0nAI0c+1El1P7a60z8+i+ZrQoGESweGKg==} @@ -491,8 +494,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.3.0: - resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -520,11 +523,11 @@ packages: bidi-js@1.1.0: resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} - brace-expansion@2.1.4: - resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} - brace-expansion@5.0.9: - resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} cac@6.7.14: @@ -718,8 +721,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -751,8 +754,8 @@ packages: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.31: + resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} engines: {node: ^10 || ^12 || >=14} punycode@2.3.1: @@ -763,8 +766,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - rollup@4.63.0: - resolution: {integrity: sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==} + rollup@4.65.0: + resolution: {integrity: sha512-QVCvQUTGDN6JRwi3jVGCY3H4aTHvi9rX0LyoBMkGUvdh/Z6O51CzcLz85BWZaTCDGhl6ySGqYZs+xI1jmPqGcw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -792,8 +795,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} stackback@0.0.2: @@ -839,16 +842,16 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} + engines: {node: ^20.0.0 || >=22.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyspy@4.0.6: + resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} engines: {node: '>=14.0.0'} tldts-core@7.4.19: @@ -883,8 +886,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@7.3.6: - resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + vite@7.3.7: + resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1014,17 +1017,17 @@ snapshots: is-potential-custom-element-name: 1.0.1 lru-cache: 11.5.3 - '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-string-parser@7.29.11': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.8': + '@babel/parser@7.29.11': dependencies: - '@babel/types': 7.29.8 + '@babel/types': 7.29.11 - '@babel/types@7.29.8': + '@babel/types@7.29.11': dependencies: - '@babel/helper-string-parser': 7.29.7 + '@babel/helper-string-parser': 7.29.11 '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@1.0.2': {} @@ -1150,17 +1153,17 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true @@ -1168,79 +1171,79 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.63.0': + '@rollup/rollup-android-arm-eabi@4.65.0': optional: true - '@rollup/rollup-android-arm64@4.63.0': + '@rollup/rollup-android-arm64@4.65.0': optional: true - '@rollup/rollup-darwin-arm64@4.63.0': + '@rollup/rollup-darwin-arm64@4.65.0': optional: true - '@rollup/rollup-darwin-x64@4.63.0': + '@rollup/rollup-darwin-x64@4.65.0': optional: true - '@rollup/rollup-freebsd-arm64@4.63.0': + '@rollup/rollup-freebsd-arm64@4.65.0': optional: true - '@rollup/rollup-freebsd-x64@4.63.0': + '@rollup/rollup-freebsd-x64@4.65.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.63.0': + '@rollup/rollup-linux-arm-gnueabihf@4.65.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.63.0': + '@rollup/rollup-linux-arm-musleabihf@4.65.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.63.0': + '@rollup/rollup-linux-arm64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.63.0': + '@rollup/rollup-linux-arm64-musl@4.65.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.63.0': + '@rollup/rollup-linux-loong64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.63.0': + '@rollup/rollup-linux-loong64-musl@4.65.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.63.0': + '@rollup/rollup-linux-ppc64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.63.0': + '@rollup/rollup-linux-ppc64-musl@4.65.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.63.0': + '@rollup/rollup-linux-riscv64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.63.0': + '@rollup/rollup-linux-riscv64-musl@4.65.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.63.0': + '@rollup/rollup-linux-s390x-gnu@4.65.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.63.0': + '@rollup/rollup-linux-x64-gnu@4.65.0': optional: true - '@rollup/rollup-linux-x64-musl@4.63.0': + '@rollup/rollup-linux-x64-musl@4.65.0': optional: true - '@rollup/rollup-openbsd-x64@4.63.0': + '@rollup/rollup-openbsd-x64@4.65.0': optional: true - '@rollup/rollup-openharmony-arm64@4.63.0': + '@rollup/rollup-openharmony-arm64@4.65.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.63.0': + '@rollup/rollup-win32-arm64-msvc@4.65.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.63.0': + '@rollup/rollup-win32-ia32-msvc@4.65.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.63.0': + '@rollup/rollup-win32-x64-gnu@4.65.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.63.0': + '@rollup/rollup-win32-x64-msvc@4.65.0': optional: true '@types/chai@5.2.3': @@ -1252,11 +1255,11 @@ snapshots: '@types/estree@1.0.9': {} - '@types/node@25.9.5': + '@types/node@25.9.9': dependencies: undici-types: 7.24.6 - '@vitest/coverage-v8@3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@25.9.5)(jsdom@30.1.3)(supports-color@7.2.0))': + '@vitest/coverage-v8@3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -1271,7 +1274,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.7(@types/node@25.9.5)(jsdom@30.1.3)(supports-color@7.2.0) + vitest: 3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -1283,13 +1286,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@25.9.5))': + '@vitest/mocker@3.2.7(vite@7.3.7(@types/node@25.9.9))': dependencies: '@vitest/spy': 3.2.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.6(@types/node@25.9.5) + vite: 7.3.7(@types/node@25.9.9) '@vitest/pretty-format@3.2.7': dependencies: @@ -1309,7 +1312,7 @@ snapshots: '@vitest/spy@3.2.7': dependencies: - tinyspy: 4.0.4 + tinyspy: 4.0.6 '@vitest/utils@3.2.7': dependencies: @@ -1319,7 +1322,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.3.0: {} + ansi-regex@6.4.0: {} ansi-styles@4.3.0: dependencies: @@ -1343,11 +1346,11 @@ snapshots: dependencies: require-from-string: 2.0.2 - brace-expansion@2.1.4: + brace-expansion@2.1.7: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.9: + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 @@ -1378,7 +1381,7 @@ snapshots: css-tree@3.2.1: dependencies: mdn-data: 2.27.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 data-urls@8.0.0: dependencies: @@ -1543,13 +1546,13 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 magicast@0.3.5: dependencies: - '@babel/parser': 7.29.8 - '@babel/types': 7.29.8 - source-map-js: 1.2.1 + '@babel/parser': 7.29.11 + '@babel/types': 7.29.11 + source-map-js: 1.2.2 make-dir@4.0.0: dependencies: @@ -1559,17 +1562,17 @@ snapshots: minimatch@10.2.6: dependencies: - brace-expansion: 5.0.9 + brace-expansion: 5.0.12 minimatch@9.0.9: dependencies: - brace-expansion: 2.1.4 + brace-expansion: 2.1.7 minipass@7.1.3: {} ms@2.1.3: {} - nanoid@3.3.18: {} + nanoid@3.3.20: {} package-json-from-dist@1.0.1: {} @@ -1592,46 +1595,46 @@ snapshots: picomatch@4.0.7: {} - postcss@8.5.26: + postcss@8.5.31: dependencies: - nanoid: 3.3.18 + nanoid: 3.3.20 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 punycode@2.3.1: {} require-from-string@2.0.2: {} - rollup@4.63.0: + rollup@4.65.0: dependencies: '@types/estree': 1.0.9 optionalDependencies: '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.63.0 - '@rollup/rollup-android-arm64': 4.63.0 - '@rollup/rollup-darwin-arm64': 4.63.0 - '@rollup/rollup-darwin-x64': 4.63.0 - '@rollup/rollup-freebsd-arm64': 4.63.0 - '@rollup/rollup-freebsd-x64': 4.63.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.63.0 - '@rollup/rollup-linux-arm-musleabihf': 4.63.0 - '@rollup/rollup-linux-arm64-gnu': 4.63.0 - '@rollup/rollup-linux-arm64-musl': 4.63.0 - '@rollup/rollup-linux-loong64-gnu': 4.63.0 - '@rollup/rollup-linux-loong64-musl': 4.63.0 - '@rollup/rollup-linux-ppc64-gnu': 4.63.0 - '@rollup/rollup-linux-ppc64-musl': 4.63.0 - '@rollup/rollup-linux-riscv64-gnu': 4.63.0 - '@rollup/rollup-linux-riscv64-musl': 4.63.0 - '@rollup/rollup-linux-s390x-gnu': 4.63.0 - '@rollup/rollup-linux-x64-gnu': 4.63.0 - '@rollup/rollup-linux-x64-musl': 4.63.0 - '@rollup/rollup-openbsd-x64': 4.63.0 - '@rollup/rollup-openharmony-arm64': 4.63.0 - '@rollup/rollup-win32-arm64-msvc': 4.63.0 - '@rollup/rollup-win32-ia32-msvc': 4.63.0 - '@rollup/rollup-win32-x64-gnu': 4.63.0 - '@rollup/rollup-win32-x64-msvc': 4.63.0 + '@rollup/rollup-android-arm-eabi': 4.65.0 + '@rollup/rollup-android-arm64': 4.65.0 + '@rollup/rollup-darwin-arm64': 4.65.0 + '@rollup/rollup-darwin-x64': 4.65.0 + '@rollup/rollup-freebsd-arm64': 4.65.0 + '@rollup/rollup-freebsd-x64': 4.65.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.65.0 + '@rollup/rollup-linux-arm-musleabihf': 4.65.0 + '@rollup/rollup-linux-arm64-gnu': 4.65.0 + '@rollup/rollup-linux-arm64-musl': 4.65.0 + '@rollup/rollup-linux-loong64-gnu': 4.65.0 + '@rollup/rollup-linux-loong64-musl': 4.65.0 + '@rollup/rollup-linux-ppc64-gnu': 4.65.0 + '@rollup/rollup-linux-ppc64-musl': 4.65.0 + '@rollup/rollup-linux-riscv64-gnu': 4.65.0 + '@rollup/rollup-linux-riscv64-musl': 4.65.0 + '@rollup/rollup-linux-s390x-gnu': 4.65.0 + '@rollup/rollup-linux-x64-gnu': 4.65.0 + '@rollup/rollup-linux-x64-musl': 4.65.0 + '@rollup/rollup-openbsd-x64': 4.65.0 + '@rollup/rollup-openharmony-arm64': 4.65.0 + '@rollup/rollup-win32-arm64-msvc': 4.65.0 + '@rollup/rollup-win32-ia32-msvc': 4.65.0 + '@rollup/rollup-win32-x64-gnu': 4.65.0 + '@rollup/rollup-win32-x64-msvc': 4.65.0 fsevents: 2.3.3 saxes@6.0.0: @@ -1650,7 +1653,7 @@ snapshots: signal-exit@4.1.0: {} - source-map-js@1.2.1: {} + source-map-js@1.2.2: {} stackback@0.0.2: {} @@ -1674,7 +1677,7 @@ snapshots: strip-ansi@7.2.0: dependencies: - ansi-regex: 6.3.0 + ansi-regex: 6.4.0 strip-literal@3.1.0: dependencies: @@ -1699,11 +1702,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinypool@1.1.1: {} + tinypool@2.2.0: {} tinyrainbow@2.0.0: {} - tinyspy@4.0.4: {} + tinyspy@4.0.6: {} tldts-core@7.4.19: {} @@ -1725,13 +1728,13 @@ snapshots: undici@8.12.3: {} - vite-node@3.2.4(@types/node@25.9.5)(supports-color@7.2.0): + vite-node@3.2.4(@types/node@25.9.9)(supports-color@7.2.0): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@7.2.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.6(@types/node@25.9.5) + vite: 7.3.7(@types/node@25.9.9) transitivePeerDependencies: - '@types/node' - jiti @@ -1746,23 +1749,23 @@ snapshots: - tsx - yaml - vite@7.3.6(@types/node@25.9.5): + vite@7.3.7(@types/node@25.9.9): dependencies: esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - postcss: 8.5.26 - rollup: 4.63.0 + postcss: 8.5.31 + rollup: 4.65.0 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.5 + '@types/node': 25.9.9 fsevents: 2.3.3 - vitest@3.2.7(@types/node@25.9.5)(jsdom@30.1.3)(supports-color@7.2.0): + vitest@3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@25.9.5)) + '@vitest/mocker': 3.2.7(vite@7.3.7(@types/node@25.9.9)) '@vitest/pretty-format': 3.2.7 '@vitest/runner': 3.2.7 '@vitest/snapshot': 3.2.7 @@ -1778,13 +1781,13 @@ snapshots: tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.17 - tinypool: 1.1.1 + tinypool: 2.2.0 tinyrainbow: 2.0.0 - vite: 7.3.6(@types/node@25.9.5) - vite-node: 3.2.4(@types/node@25.9.5)(supports-color@7.2.0) + vite: 7.3.7(@types/node@25.9.9) + vite-node: 3.2.4(@types/node@25.9.9)(supports-color@7.2.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.5 + '@types/node': 25.9.9 jsdom: 30.1.3 transitivePeerDependencies: - jiti From e467d7ca93596d72db84950edab50d000c84a908 Mon Sep 17 00:00:00 2001 From: Kohei Otsuka Date: Tue, 27 Oct 2026 20:10:20 +0900 Subject: [PATCH 5/5] build: align dev tools with the shared versions (vitest 5, TypeScript 6) vitest 5 no longer depends on tinypool, so the tinypool override is dropped. TypeScript 6 refuses files on the command line while a tsconfig.json is present, so test:types passes --ignoreConfig (it already gives every option it needs). Co-Authored-By: Claude Opus 5.5 --- ci/pnpm-workspace.ci.yaml | 6 - package.json | 14 +- pnpm-lock.yaml | 1020 +++++++++---------------------------- 3 files changed, 241 insertions(+), 799 deletions(-) diff --git a/ci/pnpm-workspace.ci.yaml b/ci/pnpm-workspace.ci.yaml index 971be87..e807178 100644 --- a/ci/pnpm-workspace.ci.yaml +++ b/ci/pnpm-workspace.ci.yaml @@ -22,9 +22,3 @@ allowBuilds: minimumReleaseAgeExclude: - "@maplat/*" - "@c4h/*" - -overrides: - # vitest 3.2 > tinypool. <2.1.2 is critical (prototype pollution leading to code - # execution in worker options). vitest 3.2 declares ^1.1.1 and no 1.x release is - # patched, so this crosses to the 2 series; the test run uses it as is. - tinypool: "^2.1.2" diff --git a/package.json b/package.json index 5e31c6e..a1a4c5a 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "build": "tsc -p tsconfig.build.json", "typecheck": "tsc --noEmit", "test": "vitest run", - "test:types": "tsc --noEmit --strict --target ES2022 --module NodeNext --moduleResolution NodeNext --skipLibCheck tests/api-smoke.test.ts tests/contract-freeze.test.ts", + "test:types": "tsc --ignoreConfig --noEmit --strict --target ES2022 --module NodeNext --moduleResolution NodeNext --skipLibCheck tests/api-smoke.test.ts tests/contract-freeze.test.ts", "test:watch": "vitest", "coverage": "vitest run --coverage", "dev": "vite --host", @@ -51,11 +51,11 @@ "prepublishOnly": "pnpm run test && pnpm run typecheck && pnpm run test:types && pnpm run build && pnpm run verify:demo" }, "devDependencies": { - "@types/node": "^25.5.2", - "@vitest/coverage-v8": "^3.2.7", - "jsdom": "^30.1.3", - "typescript": "^5.9.3", - "vite": "^7.3.7", - "vitest": "^3.2.7" + "@types/node": "^26.6.5", + "@vitest/coverage-v8": "^5.0.4", + "jsdom": "^30.0.1", + "typescript": "^6.0.3", + "vite": "^7.3.5", + "vitest": "^5.0.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad539d0..8a8dc6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,38 +4,31 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - tinypool: ^2.1.2 - importers: .: devDependencies: '@types/node': - specifier: ^25.5.2 - version: 25.9.9 + specifier: ^26.6.5 + version: 26.6.5 '@vitest/coverage-v8': - specifier: ^3.2.7 - version: 3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0)) + specifier: ^5.0.4 + version: 5.0.5(vitest@5.0.5) jsdom: - specifier: ^30.1.3 + specifier: ^30.0.1 version: 30.1.3 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 vite: - specifier: ^7.3.7 - version: 7.3.7(@types/node@25.9.9) + specifier: ^7.3.5 + version: 7.3.7(@types/node@26.6.5) vitest: - specifier: ^3.2.7 - version: 3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0) + specifier: ^5.0.4 + version: 5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.5)(jsdom@30.1.3)(vite@7.3.7(@types/node@26.6.5)) packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@7.1.9': resolution: {integrity: sha512-vZ6JQVq8Ivgz6b/IBlAf90wZviXdluY13cQOPO+nJHbmXwGrPl2GcpqUY7a55/8ZVdfONXpCFMpRijOBCHNlcQ==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -270,17 +263,6 @@ packages: '@noble/hashes': optional: true - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/schema@0.1.6': - resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} - engines: {node: '>=8'} - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -298,145 +280,141 @@ packages: os: [linux] libc: [glibc] - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rollup/rollup-android-arm-eabi@4.65.0': - resolution: {integrity: sha512-t2AnVba25baFdq7gczzS13JyVcdubLVbFX1X04mxrggDrTQPUXNv3XM0k9H1hr5tqvg7AVvtQ720QHAj0iYqhg==} + '@rollup/rollup-android-arm-eabi@4.65.1': + resolution: {integrity: sha512-5coxNSjqOI2J3NkVhlp3u+zGcyjnowQFsU9sg7MMz4UPXY4Dv63kFGLt7ConXz9CNq2i0yuOJZAF/2RMrgI2OA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.65.0': - resolution: {integrity: sha512-dNONUaEwPGhl/nuO2KV8VABWlcjYyU6KtZGN8dQv5OS5JU7JSCxPijVNKXbRJd0iuTzTiJ4TjPt/4bbvDRNiMQ==} + '@rollup/rollup-android-arm64@4.65.1': + resolution: {integrity: sha512-K0HFf6XMB3IYs+jDZ1/RRhZaVOwxNXrl0n4MDEyGDjuK7+B6K/nDJp8DCBitO3S1sK/fzNxAf9QZAny4AIUPtg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.65.0': - resolution: {integrity: sha512-zWQqUH+9zavr2Bxuzfpuv2SIF3X31cr58TvSQC9o1GhpOvkqRwr60GkZdQcudyT/BEgdpdSafjgd2I13MbTL7g==} + '@rollup/rollup-darwin-arm64@4.65.1': + resolution: {integrity: sha512-zkZrXYwNlIcSUmcwY2DpsaDHr0XjVUeQHCuSunG3eQD7/5Wn/DvI7OMUE8NRRweK87yG8ebJ1xGOzmwpMsbZQA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.65.0': - resolution: {integrity: sha512-RQYreBFWtO4//hIuOaZkYUnF/lPU4lz35dveDimDshWCJvVisVtJ/shmT9bkXK8wFJY+FJF89X6F3Cq1qI3LCw==} + '@rollup/rollup-darwin-x64@4.65.1': + resolution: {integrity: sha512-Zaed+R3cpkkA3aiNd7NO0GV5KFh/LVf8j6bGcoRdpoXkSm/mWH8M0oX2/3u/nyGcx/bHEovD9CzX+w9/gcpI4A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.65.0': - resolution: {integrity: sha512-A0NfMj6Cuh/9BE5k3awJKv6HoxFVXIcLAb6SZqAMoxUHPA1ZNNK4RsGuUPD/vL7nEAm9LG+ZzXWWTrnC0XtkpA==} + '@rollup/rollup-freebsd-arm64@4.65.1': + resolution: {integrity: sha512-h12p3WJWhyJ9kir0zqAPr0rKNmBzOWIjoaOMT9OULs9KZQZCeOMKd+mGSvERjd9VxJYShd3zIxtrVxkYz6BEVA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.65.0': - resolution: {integrity: sha512-BI6/H7q3aP0I7S7GOrjyxTjgEJlSnovXE38+bdxBpuKN6z+d//uF+T+VQ3Q7ltJL/71p17ufartARX9Ja5gOGQ==} + '@rollup/rollup-freebsd-x64@4.65.1': + resolution: {integrity: sha512-yRBwh/5imKY4DydDulVtrjy8Jf7h7NQJUqZbgmZ3zFsCD9QqlnWvZ7RtEF+ecO1b+IukKjXlu5Bb9fehV3tIbg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.65.0': - resolution: {integrity: sha512-W1vUprf09RWaVWnsFP1vlUkEWJzTZlpObOEAYZXt9Fq0UVAOYEkeGr7wBX7McKqqIQskXdBnpiOMgwPujordgA==} + '@rollup/rollup-linux-arm-gnueabihf@4.65.1': + resolution: {integrity: sha512-1XuPiWYYaLE1UDOqhbKVOfsqxvfmFS/lYPSk92U1hEX1qRfSYH0hNeAlbxFIgjp4d6+YQmL95EPRgdvjbZEddA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.65.0': - resolution: {integrity: sha512-s8QTcZWgrl9haFzEGIqyE5BWyo89pFDGLMBFZ752WYxk8DJwNU/O1X6pZgPw829d9/sm6CCHyrMP3aurt76p1Q==} + '@rollup/rollup-linux-arm-musleabihf@4.65.1': + resolution: {integrity: sha512-Y3C5e55Yrf6p2r5rBcc4P9hFWVNi6oqWy/53I/AyCJJGlp3KRSpTP8eoUmVntchTbEnhgBgAgLO9flj9AvOdUw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.65.0': - resolution: {integrity: sha512-ke1f6dLRzkqveyjjF2fkEwQYZvxHtNNwjegY8nJrwcO0Bdqr8CzFO/pKE0Bns13cx0qz2Ba2Y0Hs3dSwMdnHxA==} + '@rollup/rollup-linux-arm64-gnu@4.65.1': + resolution: {integrity: sha512-Itj6coSswkYPIcVLczObXmwdplHNQQxyfnK1ppBg4czDaX8RiEzLKqU7EMc64BiBuiDZEUS+M93ktM18rv5llw==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.65.0': - resolution: {integrity: sha512-926SMeUcy4y18Rz/w2aJiUKOnyAnm6czg72bXkQEaeemsll+Wr0hnsjb2BGRpHvWgwAMYy5ACJCotbvfLCfj0A==} + '@rollup/rollup-linux-arm64-musl@4.65.1': + resolution: {integrity: sha512-KeO8jTEqdrnhvcahufbimyMoI44vedRUp1bVz2QUnRX2vDm/hxzCPt5F8fERVD5fsHyTW/vXmCElT054VOSVOA==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.65.0': - resolution: {integrity: sha512-6T7JNRP1hc4hqF2dUsEoVLOt9K8tmODoCLldtQRYnrddGGQY8Gqe2pM/qMMUo7EMowpP7oa2N95k0/8sYK/ipw==} + '@rollup/rollup-linux-loong64-gnu@4.65.1': + resolution: {integrity: sha512-dDOz5VZZ+ZGnglpmET6VJefamWXFsgaVtuhSClf2/URZBp048jprD6z1hddsIMN6n1w+oUzGZEBp9u6Mlszsfg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.65.0': - resolution: {integrity: sha512-SImGFl1Je5kpyAgOCPONVT7h6ASV8mAUwGRjY7eZvVjPg//PfHOXgI+P241RF/+HqsA4PP3qD527ysWFKNQyhQ==} + '@rollup/rollup-linux-loong64-musl@4.65.1': + resolution: {integrity: sha512-JbfRKz8nJCuo8gn1Dqx8lQWEHw4qhZ3uRaHphw5vrSjnSptJTKTRC/bLKHh8QQMsEnhL4uq+bdg3tkiXbJ2q/A==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.65.0': - resolution: {integrity: sha512-XeDTbmPF1Yu5asfXGPrMkWoxTDhgryQbmw5Q1+R582O51VNCk23J6f2pDrsAp5YkneBVBwtExx6ZGOb9D2aQ6A==} + '@rollup/rollup-linux-ppc64-gnu@4.65.1': + resolution: {integrity: sha512-3oQpe1q0emSeCAssVHMQdOz5fz3PBH5my/Fr0ZekV2UMNL4ZiRa1ciikYlGQXyDkeqseYYv1InwOY8YPqY7RIQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.65.0': - resolution: {integrity: sha512-VS55JUI/1nsljmV/jfqNkLZXFw8uMO8nNlfoHmSevNf6fO3neuhyDvx9dv3c/Ytt8r/431SL8Qax1dpYvOMZTg==} + '@rollup/rollup-linux-ppc64-musl@4.65.1': + resolution: {integrity: sha512-nNV3HHi23o1LtpGGwH+Bav4hqnc4+klQtC96tSvCfvql8bLlNFTnTFiGl/jai2nve3eEr/vT2ocuyf+h+eMnYQ==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.65.0': - resolution: {integrity: sha512-Vblw84TbX7RS4la1Y4+yQ7aore/oSyaNtFbppuBr5Vs/4LfBeXKq9dIfoExw6zOvRERqd2rRAjnZRaMhH/0x5w==} + '@rollup/rollup-linux-riscv64-gnu@4.65.1': + resolution: {integrity: sha512-b5zab0FryBxuocuDeqOsYGAg2EzjKw4mKA6LjQXCyewXjGv/BXqACBsY2cO45xM4hV2weYtdjGThP2VB2ByAYg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.65.0': - resolution: {integrity: sha512-7+gHjtONvKgwR9InTKFaLq53f6YzBJkgeMRBENdWTsQr+spahGqQm8HF5aXpq8i4JaRrOqYyv6Zn1WltDTxaZQ==} + '@rollup/rollup-linux-riscv64-musl@4.65.1': + resolution: {integrity: sha512-Rh08xZakiUxKNgI3hbgH9mivlx478lSqckS9s+Oc3/TX1VrAH3W8z/5wpJXR/v5VjqcJ/jJNVBg64PU1+iQsTQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.65.0': - resolution: {integrity: sha512-KvNDC0J6s4vVHhtJ6KrDXU0Er0au/hmRIBq/+1maCV8TseGupeKizq0bWcrbp2HE1T8xoknvN0Q/KZ/YF0qX3w==} + '@rollup/rollup-linux-s390x-gnu@4.65.1': + resolution: {integrity: sha512-qDgtS6juN3/k97y4kcD6XLFpXEo4f6CnG8lTOGYwlhrUYTrMyhN0WHdZCPAW5rqS0MqQG7qI7dxnjugt6QB39Q==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.65.0': - resolution: {integrity: sha512-GExdD15WPvu/x/drELjVam7vX8EsPgvTMOa/iJL/p/4m/oOqzbb7JXZg8fXR4hlXtg/sF2zyTZ3bR0AEtEMlhQ==} + '@rollup/rollup-linux-x64-gnu@4.65.1': + resolution: {integrity: sha512-44IKzBPqXXVm0kt1O+F5eW4juR5FyIxGNlFkpP8qwIDzucBsjM1HCbdYUQrQw8rU/g6HRl/tfBm0+Qq4H4Ro3w==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.65.0': - resolution: {integrity: sha512-8sT9PemIZfIMED4Vd4KGoOXVDj5CMSWNcGdbheRUx9TYS03yOWdT2Q0lXPyEyNBB9YTilwewIQKNIBk6Nxi0Kg==} + '@rollup/rollup-linux-x64-musl@4.65.1': + resolution: {integrity: sha512-tvYWZ/h2PCHs558Xu7B6LptuRCV8lXV2xI75ONMcldII1m2zlFwuI4BJZi9M6rSMkYqcPLLtPUPrjyqfbzLOdg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.65.0': - resolution: {integrity: sha512-pO6Ehi0jo5yE0R6PltKhJhv9mlIiyzBJk5N5NUF2OF6xtVKI+1bdXxj/rb0jGXy3hck1ELVT0QPY3tzkAm360w==} + '@rollup/rollup-openbsd-x64@4.65.1': + resolution: {integrity: sha512-gdyeucgZCnei3pXwadKVTEAOgRx0B+c847DUPR/PdOMmp3olhfkYo6r0J4PzRFZB5ZICZQTxntyvgmWH5xT7rg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.65.0': - resolution: {integrity: sha512-vo7N3/+cjjPDYr8vtxC+qSNgWa9sDvJ7g8N8R5SWqFY4WiNH1ULcAU70SKVyHeiIZOYYwNP9pTipmhN5sl1NPw==} + '@rollup/rollup-openharmony-arm64@4.65.1': + resolution: {integrity: sha512-Wf/NEKdn2SAL4Nvt8HyDtdkseWTwiLbZEOoNYnEaHkbso0B9eHO42vKnZh+OYsn+IMhAMcWcuIwPlBOgOXsUzg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.65.0': - resolution: {integrity: sha512-ArwvgFAbjKcDM7qqotZ4OVYf+UMT9xH2YzkCzK4+AuZSDihMlz1Ekoe4INwBVXzn2mnJzuIYOcSx07iTBijGRQ==} + '@rollup/rollup-win32-arm64-msvc@4.65.1': + resolution: {integrity: sha512-x9VSsDmsMsEWy4cr/mFeaEsXnVJ6Kc4NCAU/lCnwml3s7LQbZoa9+/qwc9etWHbuuDT5mYxdyyKUwo76njtjZw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.65.0': - resolution: {integrity: sha512-QGMmK4/cxKE/36FoLMSHQBCyymv/eFTnsCvvsBF0rgmOvVbvX78VWZRerL3dHa77f4pM6Xcc2iGDhJ10w/svKQ==} + '@rollup/rollup-win32-ia32-msvc@4.65.1': + resolution: {integrity: sha512-RIDbiVvvLkN45mOFpbo6eYMgnuiBEB62BGR/0s4QJgGg2AvVxucDDNn67kpAcUoYyfmY8iX8/RifMcmxmmnejA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.65.0': - resolution: {integrity: sha512-XfKYFWHIPs4HPODIMsGF1IKlS3H1e3WokUZIgpmn4+uNnZBlnRDDHEylNyazbQXwhMKZre68OjtRYbKqb5+j8w==} + '@rollup/rollup-win32-x64-gnu@4.65.1': + resolution: {integrity: sha512-+KN8HIr88vN59JNxlrM2fMimzY43Y0lQB7+0xdVsFbvFCAA74CLKCdfzIHzzvndJryBc94Pm+MvwtukKjaS2ug==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.65.0': - resolution: {integrity: sha512-wPWi++K4Bs1VR4XihOhfGi4IGX6Cub7FlerTf8X2v+2BtDHddgSqWCXwGD+h2yAe4/niIhNDwAltioOC+wEogQ==} + '@rollup/rollup-win32-x64-msvc@4.65.1': + resolution: {integrity: sha512-+Y1Sd49cSDq60UOl8/U2HI0ebUvnSl/hDhMHQn+ouw17yb8fYwMWIazzJ4JFpSkjPE7sj5NTNSX9IoyEqcFfyQ==} cpu: [x64] os: [win32] @@ -449,110 +427,54 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/node@25.9.9': - resolution: {integrity: sha512-b4e2xxj/yMeT2hNlD6x7zNFiQK2Dlmkb9CQ6v3/1G2RezKN4YS2lcEv8lzGm1mhs4f2lM4yNAMI/zUDBZBBt7w==} + '@types/node@26.6.5': + resolution: {integrity: sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==} - '@vitest/coverage-v8@3.2.7': - resolution: {integrity: sha512-NEGWJS2XNu2PfRLQwOO3CTKj1tTETxNBdk454vDxVBhxJYhPaA/eS0nAI0c+1El1P7a60z8+i+ZrQoGESweGKg==} + '@vitest/coverage-v8@5.0.5': + resolution: {integrity: sha512-4KpkGdIrSqBihx/JyP/e+S+IKB98etg1XDQiLAxksLfcShnwi1VReGeOT9NI43hLHbknosKp/1CCLn9Zgcs8mg==} peerDependencies: - '@vitest/browser': 3.2.7 - vitest: 3.2.7 + '@vitest/browser': 5.0.5 + vitest: 5.0.5 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.2.7': - resolution: {integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==} + '@vitest/istanbul-lib-coverage@1.0.2': + resolution: {integrity: sha512-9J/JMwOf9AoJhAywhrn7ScKTL38hsWQP/qPG60OtaAFcQ5OXPwKsxZFlbnuCKmZ61m8/lGgHYnFpdyQZUvG/iA==} + engines: {node: '>=22'} + + '@vitest/istanbul-lib-report@1.0.2': + resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==} + engines: {node: '>=22'} - '@vitest/mocker@3.2.7': - resolution: {integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==} + '@vitest/mocker@5.0.5': + resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + msw: ^2.4.9 || ^3.0.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.7': - resolution: {integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==} - - '@vitest/runner@3.2.7': - resolution: {integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==} - - '@vitest/snapshot@3.2.7': - resolution: {integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==} - - '@vitest/spy@3.2.7': - resolution: {integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==} - - '@vitest/utils@3.2.7': - resolution: {integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.4.0: - resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} + '@vitest/spy@5.0.5': + resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-v8-to-istanbul@0.3.12: - resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} + ast-v8-to-istanbul@1.0.7: + resolution: {integrity: sha512-kFL68AG6ajd8fg248zwM9GQrUWEp79gsmjum34OEXjs4yHuUMZfYKwOLW9GMmB4oNvVrj+EAGxsP7ye2UR9UlA==} bidi-js@1.1.0: resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} - brace-expansion@2.1.7: - resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} - - brace-expansion@5.0.12: - resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} - engines: {node: 20 || >=22} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -561,37 +483,15 @@ packages: resolution: {integrity: sha512-JQUCCK+/CAGbGGx618PlFZMXH81Jtj7t73CHv9dd/zVWvxgGT2zLFRjnKb+Ng46GIwcy+f7f88qd4duqllK+WQ==} engines: {node: ^22.14.0 || >=24.0.0} - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - entities@8.1.0: resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} engines: {node: '>=20.19.0'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} @@ -614,66 +514,21 @@ packages: picomatch: optional: true - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - html-encoding-sniffer@7.0.0: resolution: {integrity: sha512-UikN5yr7xsCDAq87Or5or0PAlD3HJJOKVzM05az588WnpDJ4Ux7a2A53Qi6gofGg2/EtvF/H4hCi/TXfCW4Y6w==} engines: {node: ^22.13.0 || >=24.0.0} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - 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.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - jsdom@30.1.3: resolution: {integrity: sha512-hQMUPvRgN7KxsfIytDQji7bimuJeRQa6Qo5+iuiZQk5CafeRxLIA10/cG5YCBFNpD9RO3oqIiN4CO1Y44kxqXg==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -683,70 +538,31 @@ packages: canvas: optional: true - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.5.3: resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} engines: {node: 20 || >=22} - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magic-string@1.4.4: + resolution: {integrity: sha512-jQz9sVhrZuphH4NrAIHSgkDJCluQO7Ioi4KGRLa7aTUjAODQ13hENX0YIytqYE/rIkO485gQG2LeBxJaW53kkQ==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + magicast@0.5.5: + resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==} mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - minimatch@10.2.6: - resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} - engines: {node: 18 || 20 || >=22} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - 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==} - nanoid@3.3.20: resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} - 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'} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -766,8 +582,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - rollup@4.65.0: - resolution: {integrity: sha512-QVCvQUTGDN6JRwi3jVGCY3H4aTHvi9rX0LyoBMkGUvdh/Z6O51CzcLz85BWZaTCDGhl6ySGqYZs+xI1jmPqGcw==} + rollup@4.65.1: + resolution: {integrity: sha512-HzD4IdphaPMvuAacnL/vtoq5B8FwqewKvxTtqYibWvP6VDyZ+UsTtlw5F8HIOIIpLQAkN2NOP/0sM3puo9xN/A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -775,83 +591,27 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - source-map-js@1.2.2: resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} engines: {node: '>=0.10.0'} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + tinybench@6.2.2: + resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} + engines: {node: '>=20.0.0'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - test-exclude@7.0.2: - resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@2.2.0: - resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} - engines: {node: ^20.0.0 || >=22.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.6: - resolution: {integrity: sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} tldts-core@7.4.19: @@ -869,23 +629,18 @@ packages: resolution: {integrity: sha512-BcDSDW+SIGWVOns1Zm6Yg91q9AEj7eaID0QDY9oIqJD1A8dscNwMcl9Sms2DeuWCNov1X0/oXanHGYQBSLwZsg==} engines: {node: ^22.14.0 || >=24.0.0} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} undici@8.12.3: resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} engines: {node: '>=22.19.0'} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@7.3.7: resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -926,26 +681,39 @@ packages: yaml: optional: true - vitest@3.2.7: - resolution: {integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@5.0.5: + resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.7 - '@vitest/ui': 3.2.7 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.5 + '@vitest/browser-preview': 5.0.5 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.5 + '@vitest/coverage-v8': 5.0.5 + '@vitest/ui': 5.0.5 happy-dom: '*' jsdom: '*' + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': optional: true '@types/node': optional: true - '@vitest/browser': + '@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 @@ -970,24 +738,11 @@ packages: resolution: {integrity: sha512-KwOAJrpf+GTgBvcBQJcP38sMF0DsQKdwtG+TxM2pW44P6E5k0hDbWrDmyuJDIF0Uef0aQq0ZoJs+5oI+k8ddhg==} engines: {node: ^22.14.0 || >=24.0.0} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} hasBin: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -997,11 +752,6 @@ packages: snapshots: - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@asamuzakjp/css-color@7.1.9': dependencies: '@csstools/css-calc': 3.4.3(@csstools/css-parser-algorithms@4.0.2(@csstools/css-tokenizer@4.0.2))(@csstools/css-tokenizer@4.0.2) @@ -1140,22 +890,6 @@ snapshots: '@exodus/bytes@1.16.0': {} - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/schema@0.1.6': {} - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.6.0 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.6.0': {} @@ -1168,82 +902,79 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true - '@pkgjs/parseargs@0.11.0': + '@rollup/rollup-android-arm-eabi@4.65.1': optional: true - '@rollup/rollup-android-arm-eabi@4.65.0': + '@rollup/rollup-android-arm64@4.65.1': optional: true - '@rollup/rollup-android-arm64@4.65.0': + '@rollup/rollup-darwin-arm64@4.65.1': optional: true - '@rollup/rollup-darwin-arm64@4.65.0': + '@rollup/rollup-darwin-x64@4.65.1': optional: true - '@rollup/rollup-darwin-x64@4.65.0': + '@rollup/rollup-freebsd-arm64@4.65.1': optional: true - '@rollup/rollup-freebsd-arm64@4.65.0': + '@rollup/rollup-freebsd-x64@4.65.1': optional: true - '@rollup/rollup-freebsd-x64@4.65.0': + '@rollup/rollup-linux-arm-gnueabihf@4.65.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.65.0': + '@rollup/rollup-linux-arm-musleabihf@4.65.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.65.0': + '@rollup/rollup-linux-arm64-gnu@4.65.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.65.0': + '@rollup/rollup-linux-arm64-musl@4.65.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.65.0': + '@rollup/rollup-linux-loong64-gnu@4.65.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.65.0': + '@rollup/rollup-linux-loong64-musl@4.65.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.65.0': + '@rollup/rollup-linux-ppc64-gnu@4.65.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.65.0': + '@rollup/rollup-linux-ppc64-musl@4.65.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.65.0': + '@rollup/rollup-linux-riscv64-gnu@4.65.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.65.0': + '@rollup/rollup-linux-riscv64-musl@4.65.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.65.0': + '@rollup/rollup-linux-s390x-gnu@4.65.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.65.0': + '@rollup/rollup-linux-x64-gnu@4.65.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.65.0': + '@rollup/rollup-linux-x64-musl@4.65.1': optional: true - '@rollup/rollup-linux-x64-musl@4.65.0': + '@rollup/rollup-openbsd-x64@4.65.1': optional: true - '@rollup/rollup-openbsd-x64@4.65.0': + '@rollup/rollup-openharmony-arm64@4.65.1': optional: true - '@rollup/rollup-openharmony-arm64@4.65.0': + '@rollup/rollup-win32-arm64-msvc@4.65.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.65.0': + '@rollup/rollup-win32-ia32-msvc@4.65.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.65.0': + '@rollup/rollup-win32-x64-gnu@4.65.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.65.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.65.0': + '@rollup/rollup-win32-x64-msvc@4.65.1': optional: true '@types/chai@5.2.3': @@ -1255,128 +986,52 @@ snapshots: '@types/estree@1.0.9': {} - '@types/node@25.9.9': + '@types/node@26.6.5': dependencies: - undici-types: 7.24.6 + undici-types: 8.9.0 - '@vitest/coverage-v8@3.2.7(supports-color@7.2.0)(vitest@3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0))': + '@vitest/coverage-v8@5.0.5(vitest@5.0.5)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.12 - debug: 4.4.3(supports-color@7.2.0) - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6(supports-color@7.2.0) - istanbul-reports: 3.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 - std-env: 3.10.0 - test-exclude: 7.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0) - transitivePeerDependencies: - - supports-color + '@vitest/istanbul-lib-coverage': 1.0.2 + '@vitest/istanbul-lib-report': 1.0.2 + ast-v8-to-istanbul: 1.0.7 + magicast: 0.5.5 + obug: 3.0.0 + std-env: 4.3.0 + tinyrainbow: 3.2.0 + vitest: 5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.5)(jsdom@30.1.3)(vite@7.3.7(@types/node@26.6.5)) - '@vitest/expect@3.2.7': + '@vitest/istanbul-lib-coverage@1.0.2': {} + + '@vitest/istanbul-lib-report@1.0.2': dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.7 - '@vitest/utils': 3.2.7 - chai: 5.3.3 - tinyrainbow: 2.0.0 + '@vitest/istanbul-lib-coverage': 1.0.2 - '@vitest/mocker@3.2.7(vite@7.3.7(@types/node@25.9.9))': + '@vitest/mocker@5.0.5(vite@7.3.7(@types/node@26.6.5))': dependencies: - '@vitest/spy': 3.2.7 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.5 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.4.4 optionalDependencies: - vite: 7.3.7(@types/node@25.9.9) - - '@vitest/pretty-format@3.2.7': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/runner@3.2.7': - dependencies: - '@vitest/utils': 3.2.7 - pathe: 2.0.3 - strip-literal: 3.1.0 - - '@vitest/snapshot@3.2.7': - dependencies: - '@vitest/pretty-format': 3.2.7 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@3.2.7': - dependencies: - tinyspy: 4.0.6 - - '@vitest/utils@3.2.7': - dependencies: - '@vitest/pretty-format': 3.2.7 - loupe: 3.2.1 - tinyrainbow: 2.0.0 - - ansi-regex@5.0.1: {} + vite: 7.3.7(@types/node@26.6.5) - ansi-regex@6.4.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} + '@vitest/spy@5.0.5': {} assertion-error@2.0.1: {} - ast-v8-to-istanbul@0.3.12: + ast-v8-to-istanbul@1.0.7: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 10.0.0 - balanced-match@1.0.2: {} - - balanced-match@4.0.4: {} - bidi-js@1.1.0: dependencies: require-from-string: 2.0.2 - brace-expansion@2.1.7: - dependencies: - balanced-match: 1.0.2 - - brace-expansion@5.0.12: - dependencies: - balanced-match: 4.0.4 - - cac@6.7.14: {} - - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 - - check-error@2.1.3: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + chai@6.3.0: {} css-tree@3.2.1: dependencies: @@ -1390,25 +1045,11 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - debug@4.4.3(supports-color@7.2.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 7.2.0 - decimal.js@10.6.0: {} - deep-eql@5.0.2: {} - - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - entities@8.1.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.3.2: {} esbuild@0.28.2: optionalDependencies: @@ -1449,70 +1090,19 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - fsevents@2.3.3: optional: true - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - has-flag@4.0.0: {} - html-encoding-sniffer@7.0.0: dependencies: '@exodus/bytes': 1.16.0 transitivePeerDependencies: - '@noble/hashes' - html-escaper@2.0.2: {} - - is-fullwidth-code-point@3.0.0: {} - is-potential-custom-element-name@1.0.1: {} - isexe@2.0.0: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@5.0.6(supports-color@7.2.0): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.3(supports-color@7.2.0) - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - js-tokens@10.0.0: {} - js-tokens@9.0.1: {} - jsdom@30.1.3: dependencies: '@asamuzakjp/css-color': 7.1.9 @@ -1538,59 +1128,28 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - loupe@3.2.1: {} - - lru-cache@10.4.3: {} - lru-cache@11.5.3: {} - magic-string@0.30.21: + magic-string@1.4.4: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 - magicast@0.3.5: + magicast@0.5.5: dependencies: '@babel/parser': 7.29.11 '@babel/types': 7.29.11 source-map-js: 1.2.2 - make-dir@4.0.0: - dependencies: - semver: 7.8.5 - mdn-data@2.27.1: {} - minimatch@10.2.6: - dependencies: - brace-expansion: 5.0.12 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.7 - - minipass@7.1.3: {} - - ms@2.1.3: {} - nanoid@3.3.20: {} - package-json-from-dist@1.0.1: {} + obug@3.0.0: {} parse5@8.0.1: dependencies: entities: 8.1.0 - path-key@3.1.1: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - - pathe@2.0.3: {} - - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@4.0.7: {} @@ -1605,108 +1164,56 @@ snapshots: require-from-string@2.0.2: {} - rollup@4.65.0: + rollup@4.65.1: dependencies: '@types/estree': 1.0.9 optionalDependencies: '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.65.0 - '@rollup/rollup-android-arm64': 4.65.0 - '@rollup/rollup-darwin-arm64': 4.65.0 - '@rollup/rollup-darwin-x64': 4.65.0 - '@rollup/rollup-freebsd-arm64': 4.65.0 - '@rollup/rollup-freebsd-x64': 4.65.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.65.0 - '@rollup/rollup-linux-arm-musleabihf': 4.65.0 - '@rollup/rollup-linux-arm64-gnu': 4.65.0 - '@rollup/rollup-linux-arm64-musl': 4.65.0 - '@rollup/rollup-linux-loong64-gnu': 4.65.0 - '@rollup/rollup-linux-loong64-musl': 4.65.0 - '@rollup/rollup-linux-ppc64-gnu': 4.65.0 - '@rollup/rollup-linux-ppc64-musl': 4.65.0 - '@rollup/rollup-linux-riscv64-gnu': 4.65.0 - '@rollup/rollup-linux-riscv64-musl': 4.65.0 - '@rollup/rollup-linux-s390x-gnu': 4.65.0 - '@rollup/rollup-linux-x64-gnu': 4.65.0 - '@rollup/rollup-linux-x64-musl': 4.65.0 - '@rollup/rollup-openbsd-x64': 4.65.0 - '@rollup/rollup-openharmony-arm64': 4.65.0 - '@rollup/rollup-win32-arm64-msvc': 4.65.0 - '@rollup/rollup-win32-ia32-msvc': 4.65.0 - '@rollup/rollup-win32-x64-gnu': 4.65.0 - '@rollup/rollup-win32-x64-msvc': 4.65.0 + '@rollup/rollup-android-arm-eabi': 4.65.1 + '@rollup/rollup-android-arm64': 4.65.1 + '@rollup/rollup-darwin-arm64': 4.65.1 + '@rollup/rollup-darwin-x64': 4.65.1 + '@rollup/rollup-freebsd-arm64': 4.65.1 + '@rollup/rollup-freebsd-x64': 4.65.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.65.1 + '@rollup/rollup-linux-arm-musleabihf': 4.65.1 + '@rollup/rollup-linux-arm64-gnu': 4.65.1 + '@rollup/rollup-linux-arm64-musl': 4.65.1 + '@rollup/rollup-linux-loong64-gnu': 4.65.1 + '@rollup/rollup-linux-loong64-musl': 4.65.1 + '@rollup/rollup-linux-ppc64-gnu': 4.65.1 + '@rollup/rollup-linux-ppc64-musl': 4.65.1 + '@rollup/rollup-linux-riscv64-gnu': 4.65.1 + '@rollup/rollup-linux-riscv64-musl': 4.65.1 + '@rollup/rollup-linux-s390x-gnu': 4.65.1 + '@rollup/rollup-linux-x64-gnu': 4.65.1 + '@rollup/rollup-linux-x64-musl': 4.65.1 + '@rollup/rollup-openbsd-x64': 4.65.1 + '@rollup/rollup-openharmony-arm64': 4.65.1 + '@rollup/rollup-win32-arm64-msvc': 4.65.1 + '@rollup/rollup-win32-ia32-msvc': 4.65.1 + '@rollup/rollup-win32-x64-gnu': 4.65.1 + '@rollup/rollup-win32-x64-msvc': 4.65.1 fsevents: 2.3.3 saxes@6.0.0: dependencies: xmlchars: 2.2.0 - semver@7.8.5: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - siginfo@2.0.0: {} - - signal-exit@4.1.0: {} - source-map-js@1.2.2: {} - stackback@0.0.2: {} + std-env@4.3.0: {} - std-env@3.10.0: {} + tinybench@6.2.2: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.4.0 - - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - test-exclude@7.0.2: - dependencies: - '@istanbuljs/schema': 0.1.6 - glob: 10.5.0 - minimatch: 10.2.6 - - tinybench@2.9.0: {} - - tinyexec@0.3.2: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinypool@2.2.0: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.6: {} + tinyrainbow@3.2.0: {} tldts-core@7.4.19: {} @@ -1722,86 +1229,46 @@ snapshots: dependencies: punycode: 2.3.1 - typescript@5.9.3: {} + typescript@6.0.3: {} - undici-types@7.24.6: {} + undici-types@8.9.0: {} undici@8.12.3: {} - vite-node@3.2.4(@types/node@25.9.9)(supports-color@7.2.0): - dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@7.2.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.3.7(@types/node@25.9.9) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.3.7(@types/node@25.9.9): + vite@7.3.7(@types/node@26.6.5): dependencies: esbuild: 0.28.2 fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 postcss: 8.5.31 - rollup: 4.65.0 + rollup: 4.65.1 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.9 + '@types/node': 26.6.5 fsevents: 2.3.3 - vitest@3.2.7(@types/node@25.9.9)(jsdom@30.1.3)(supports-color@7.2.0): + vitest@5.0.5(@types/node@26.6.5)(@vitest/coverage-v8@5.0.5)(jsdom@30.1.3)(vite@7.3.7(@types/node@26.6.5)): dependencies: '@types/chai': 5.2.3 - '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@7.3.7(@types/node@25.9.9)) - '@vitest/pretty-format': 3.2.7 - '@vitest/runner': 3.2.7 - '@vitest/snapshot': 3.2.7 - '@vitest/spy': 3.2.7 - '@vitest/utils': 3.2.7 - chai: 5.3.3 - debug: 4.4.3(supports-color@7.2.0) + '@vitest/mocker': 5.0.5(vite@7.3.7(@types/node@26.6.5)) + chai: 6.3.0 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 - pathe: 2.0.3 + magic-string: 1.4.4 + obug: 3.0.0 picomatch: 4.0.7 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 + std-env: 4.3.0 + tinybench: 6.2.2 + tinyexec: 1.3.1 tinyglobby: 0.2.17 - tinypool: 2.2.0 - tinyrainbow: 2.0.0 - vite: 7.3.7(@types/node@25.9.9) - vite-node: 3.2.4(@types/node@25.9.9)(supports-color@7.2.0) - why-is-node-running: 2.3.0 + vite: 7.3.7(@types/node@26.6.5) + why-is-node-running: 3.2.1 optionalDependencies: - '@types/node': 25.9.9 + '@types/node': 26.6.5 + '@vitest/coverage-v8': 5.0.5(vitest@5.0.5) jsdom: 30.1.3 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml w3c-xmlserializer@6.0.0: dependencies: @@ -1819,26 +1286,7 @@ snapshots: transitivePeerDependencies: - '@noble/hashes' - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - 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.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 + why-is-node-running@3.2.1: {} xml-name-validator@5.0.0: {}