diff --git a/METRICS.md b/METRICS.md index 165d0f0..4a3327b 100644 --- a/METRICS.md +++ b/METRICS.md @@ -5,6 +5,7 @@ Tracked weekly with `pnpm run metrics`. Targets: **1K stars**, **10K weekly down Product Hunt top-5, HN front page. | Date | Stars | Forks | Contributors | Open issues | npm weekly downloads | Action stars | Action forks | Notes | -| ---- | ----- | ----- | ------------ | ----------- | -------------------- | ------------ | ------------ | ----- | +|---|---|---|---|---|---|---|---|---| | 2026-08-18 | 1 | 1 | 2 | 3 | 254 | 0 | 0 | baseline — v0.7.0 released | +| 2026-09-24 | 1 | 1 | 2 | 3 | 5 | 0 | 0 | | diff --git a/SESSION_LOG.md b/SESSION_LOG.md new file mode 100644 index 0000000..7e81c18 --- /dev/null +++ b/SESSION_LOG.md @@ -0,0 +1,231 @@ +# Ripple 0.7.0 Release Session — Full Chat Log + +**Date:** 2026-08-18 +**Project:** Ripple — dependency impact analysis for TypeScript/JavaScript +**Repo:** alimaandev/ripple (remote: `ripple` → https://github.com/alimaandev/ripple.git) +**Branch protection:** PRs required, strict, 7 checks (lint, test ubuntu 22/24, test windows 22, build, dogfood, coverage) +**Publish workflow:** `.github/workflows/publish.yml` triggers on `v*` tags → npm publish with `NPM_TOKEN` secret + +--- + +## Session Overview + +This session completed the **v0.7.0 release** ("AI-ready risk gate: SARIF, MCP server, faster cache") and established weekly metrics tracking. All Phase A–C work is merged and published; Phase D (outreach drafts ready) and Phase E (weekly tracking) remain. + +--- + +## Initial State (User: "What did we do so far?") + +### Prior Summary (before this session) + +**Phase A (features) — complete, merged in PR #22 (14c7e24):** +- Incremental parse cache (schema 2): `.ripple/cache/parsed-v2.json`, mtime+size fast path, parallel stats (`Promise.all`), atomic writes, `RIPPLE_NO_CACHE=1` disables +- Error-tolerant parsing: broken files record `parseError` instead of aborting +- SARIF 2.1.0 output: `ripple diff --sarif` / `ripple analyze --sarif` with stable `primaryLocationLineHash` +- `ripple mcp` — MCP server (stdio, protocol 2025-06-18) exposing `impact`, `dependents`, `risk`, `gate_status` +- `ripple-action@v1` wraps SARIF + gate; `upload-sarif: true` default +- Benchmarks: seeded synthetic projects, median of 5, cold vs warm, deterministic (byte-identical excl. duration) + - 200 files: graph 1.20x, analyze 1.18x + - 500: 1.28x / 1.38x + - 1000: 1.49x / 1.54x + - 2000: 1.63x / 1.73x +- `RIPPLE_TRACE=1` per-stage marks (pipeline marks are cumulative elapsed-since-start, NOT per-stage) +- Clean lint/typecheck/prettier; 205 unit + 47 integration tests pass + +**Phase B (launch assets) — complete, merged in PR #26:** +- `assets/hero-animated.svg` (SMIL typewriter, 22s loop) +- `assets/mcp-demo.svg` (agent → ripple mcp flow) +- README hero swap + MCP section diagram +- 3 good-first-issues seeded: #23 (doctor --json), #24 (config JSON Schema), #25 (diff friendly git errors) +- funding.yml skipped (user decision) + +**Phase C (cut 0.7.0) — in progress at session start:** +- `package.json` → 0.7.0 ✓ +- CHANGELOG `[Unreleased]` → `[0.7.0] - 2026-08-18` ✓ +- `pnpm install` refreshed lockfile ✓ +- README still had stale version refs + **double-encoded UTF-8 mojibake** (UTF-8 bytes misread as cp1252 then re-encoded; e.g., `→` stored as literal `â†'`) +- Diagnostic script written: `fix-mojibake.mjs` (unrun) + +--- + +## Session Work Log + +### 1. Mojibake Fix (README + repo-wide) + +**Problem:** README had 410 non-ASCII chars, 142 mojibake (`â/Ã/Â`). PowerShell console rendering artifacts (`�?"`) masked true state. Earlier `WriteAllText` from misread `Get-Content -Raw` introduced corruption into working tree. + +**Fix approach:** Reverse double-encode per file: +1. UTF-8 decode file → mojibake chars (U+00E2 U+2020 U+2019 for `â†'`) +2. Map each char to its cp1252 byte (via inverted `TextDecoder("windows-1252")` over 0..255) +3. UTF-8 decode the resulting byte array → original clean text (`→`) + +**Key bug discovered:** Initial script decoded final bytes with cp1252 again (no-op). Fixed to decode with UTF-8. + +**Results:** +- README: 74 lines fixed, now clean (142 legitimate non-ASCII remain: `→ · – — ● ├ └`) +- `src/cache/parsed.ts`: 5 lines fixed (committed mojibake in doc comments — em-dashes/arrows) +- CHANGELOG/BENCHMARKS: mixed clean + clean (no mojibake) → safely skipped by line-level guard (lines with `→ █ ░ ✔` not in cp1252) +- Full repo sweep: **CLEAN** (zero remaining mojibake patterns) + +### 2. README Version Refs Update + +After mojibake fix, the 3 stale `0.6.0` references updated to `0.7.0`: +- `ripple version # → 0.7.0` +- `ripple · impact analysis · v0.7.0` +- `ripple · dependency graph · v0.7.0` + +### 3. Release PR #27 + +**Branch:** `release/0.7.0` +**Changes:** package.json, CHANGELOG, README version refs, parsed.ts mojibake fix +**Checks:** All 7 green (build, coverage, dogfood, lint, test ubuntu 22/24, test windows 22) +**Merge:** Squash → `6122e05 chore(release): v0.7.0 — version bump, changelog, docs sync (#27)` + +### 4. Publish (Tag → Workflow → npm) + +**Tag:** `v0.7.0` pushed to `ripple` +**Workflow:** `publish.yml` (run 32120383876) — **completed / success** (typecheck → lint → test → build → npm publish) +**npm:** `@alimaandev/ripple@0.7.0` live (verified `npm view`) + +### 5. GitHub Release + +**Release:** v0.7.0 created with full notes (SARIF, MCP, cache benchmarks, action usage, good-first-issues links) +**URL:** https://github.com/alimaandev/ripple/releases/tag/v0.7.0 + +### 6. Smoke Test (Published Package) + +**Temp install:** `npm install @alimaandev/ripple@0.7.0` in `C:\Users\Bilal\AppData\Local\Temp\opencode\smoke-070` + +| Command | Result | +|---|---| +| `ripple version` | `0.7.0` ✓ | +| `ripple analyze src/index.ts` | Risk LOW 2.0/100, cycle detected ✓ | +| `ripple analyze --sarif` | Valid SARIF 2.1.0 JSON ✓ | +| `ripple mcp` (tools/list via JSON-RPC) | 4 tools: `impact`, `dependents`, `risk`, `gate_status` ✓ | + +**Note:** Absolute paths with spaces failed in `.cmd` wrapper (quoting quirk); relative paths work — realistic usage. + +### 7. ripple-action Check + +**Repo:** alimaandev/ripple-action +**action.yml:** `version: latest` (default) → auto-resolves to 0.7.0 +**smoke.yml:** runs action on own repo with `gate: critical`; `upload-sarif: true` default → exercises SARIF path +**Verdict:** No changes needed; 0.7.0 activates SARIF automatically + +### 8. Metrics Harness + Baseline (PR #28) + +**Script:** `scripts/metrics.mjs` (`pnpm run metrics`) +- GitHub via `gh api`: stars, forks, contributors, open issues (excl. PRs) +- npm: `https://api.npmjs.org/downloads/point/last-week/@alimaandev/ripple` +- Action repo: stars, forks +- Idempotent per day (updates existing row); `--json` for raw; `--note "..."` for context +- Writes `METRICS.md` with targets header + table + +**eslint.config.mjs:** Added `fetch` global for scripts +**package.json:** Added `"metrics": "node scripts/metrics.mjs"` + +**Baseline (2026-08-18):** +| Date | Stars | Forks | Contributors | Open issues | Weekly downloads | Action stars | Action forks | Notes | +|---|---|---|---|---|---|---|---|---| +| 2026-08-18 | 1 | 1 | 2 | 3 | 254 | 0 | 0 | baseline - v0.7.0 released | + +**Observation:** 254 weekly downloads already (pre-outreach); 2 contributors (one beyond author). + +**PR #28:** All 7 checks green → squash-merged → main synced to `432d816` + +### 9. Outreach Drafts (Ready for Review) + +Created in `C:\Users\Bilal\AppData\Local\Temp\opencode\outreach\`: + +| File | Target | Key Content | +|---|---|---| +| `producthunt.md` | Product Hunt | Full listing + first comment + launch logistics (best window Tue–Thu 00:01–07:00 PT) | +| `hackernews.md` | HN Show HN | 3 title options + first comment on 4 design decisions (real graph, determinism, computed risk, one engine) | +| `reddit-typescript.md` | r/typescript | Concrete CLI output + ask for feedback on risk weighting | +| `devto.md` | dev.to | ~4 min article "The merge gate that knows the blast radius" | + +All use verified numbers (risk output, 1.2–1.7x cache, 4 MCP tools, SARIF fingerprints). + +--- + +## Key Technical Decisions Captured + +1. **Windows + PowerShell constraints:** No heredocs (`<<` fails); write bodies to temp files + `--body-file`; avoid inline `node -e`; byte-accurate file reads via `[System.IO.File]::ReadAllBytes` + `GetString` (Select-String reads as ANSI). + +2. **Mojibake reversal:** Must encode chars → cp1252 bytes → UTF-8 decode (NOT cp1252 decode). Inverted `TextDecoder("windows-1252")` over 0..255 gives exact char→byte map. + +3. **Pipeline marks are cumulative:** `RIPPLE_TRACE=1` prints `pipeline.stage: Nms` = elapsed since start, NOT stage duration. Per-stage timing comes from `cache.*`, `graph.*`, `detectEntryPoints` marks. + +4. **Branch protection strictness:** Direct push to main blocked; must PR → checks → squash merge. If "head not up to date", merge `ripple/main` into branch and re-push. + +5. **Publish path:** Only via tag workflow (`NPM_TOKEN` secret exists; local npm 401). Tag `v*` triggers full CI + `npm publish --access public`. + +6. **Benchmark methodology:** Seeded synthetic projects only (no real-repo clones); `--repeats` flag (default 3, used 5); determinism = all cold+warm JSON byte-identical vs referenceHash of first cold run. + +--- + +## Files Changed This Session + +### Committed (via PRs #27, #28) +- `package.json` — version 0.7.0, `metrics` script +- `CHANGELOG.md` — `[0.7.0] - 2026-08-18` section +- `README.md` — version refs → 0.7.0, mojibake fixed +- `src/cache/parsed.ts` — mojibake fixed in doc comments (5 lines) +- `eslint.config.mjs` — `fetch` global for scripts +- `scripts/metrics.mjs` — new weekly metrics snapshot script +- `METRICS.md` — new tracking file with baseline row +- `pnpm-lock.yaml` — refreshed (no version pin) + +### Temp / Diagnostic (not committed) +- `C:\Users\Bilal\AppData\Local\Temp\opencode\fix-mojibake.mjs` — mojibake diagnostic + reverse transform +- `C:\Users\Bilal\AppData\Local\Temp\opencode\fix-all-mojibake.mjs` — line-level safe transform for whole repo +- `C:\Users\Bilal\AppData\Local\Temp\opencode\mojibake-sweep.mjs` — final verification sweep +- `C:\Users\Bilal\AppData\Local\Temp\opencode\mbtest.mjs` — cp1252 map debug +- `C:\Users\Bilal\AppData\Local\Temp\opencode\chg-diagnose.mjs` — CHANGELOG unmappable char check +- `C:\Users\Bilal\AppData\Local\Temp\opencode\release-notes.md` — GitHub release body +- `C:\Users\Bilal\AppData\Local\Temp\opencode\outreach\*.md` — 4 outreach drafts + +--- + +## Current State (Session End) + +| Area | Status | +|---|---| +| **npm package** | 0.7.0 live | +| **GitHub release** | Created with notes | +| **Main branch** | Synced to `ripple/main` (432d816) | +| **Mojibake** | Repo-wide CLEAN | +| **Metrics** | Harness + baseline committed; weekly `pnpm run metrics` ready | +| **Outreach** | 4 drafts ready; awaiting user review + publish timing | +| **Action repo** | Auto-picks 0.7.0 via `latest`; SARIF path active | + +--- + +## Next Steps (User-Driven) + +1. **Review outreach drafts** in `Temp\opencode\outreach\`; publish when ready (PH timing critical) +2. **Run `pnpm run metrics` weekly** to append rows to METRICS.md +3. **Monitor targets:** 1K stars, 10K weekly downloads, 100 action installs, 5 contributors, PH top-5, HN front page + +--- + +## Commands Reference + +```bash +# Weekly metrics snapshot +pnpm run metrics # writes METRICS.md +pnpm run metrics -- --json # raw JSON to stdout +pnpm run metrics -- --note "text" # with note column + +# Release (if needed again) +git tag vX.Y.Z +git push ripple vX.Y.Z +# watch: gh run list --workflow publish.yml --limit 1 + +# Outreach drafts location +C:\Users\Bilal\AppData\Local\Temp\opencode\outreach\ +``` + +--- + +*End of session log* \ No newline at end of file diff --git a/contributing.md.save b/contributing.md.save new file mode 100644 index 0000000..0648bc8 --- /dev/null +++ b/contributing.md.save @@ -0,0 +1,171 @@ +# Contributing to Ripple + +Thanks for wanting to help, we love the interest. This file explains how the +repository is organized and how to contribute safely. + +Please read it first — it answers most questions about where code lives, +what the conventions are, and how a change becomes a release. + +- [Code of Conduct](CODE_OF_CONDUCT.md) — everyone is expected to follow it. +- [Security](SECURITY.md) — report vulnerabilities privately, not as issues. + +## Your first PR + +1. **Fork** the repository and clone your fork: + + ```bash + git clone https://github.com/alimaandev/ripple.git + cd ripple + ``` + + (Or add it as an upstream if you cloned your own fork first.) + +2. **Install** — Node.js >= 22 and pnpm are required: + + ```bash + pnpm install + ``` + +3. **Make a branch** for your change — `fix/…`, `feat/…`, `docs/…`: + + ```bash + git checkout -b feat/my-change + ``` + +4. **Verify your change** before committing: + + ```bash + pnpm run typecheck # tsc --noEmit + pnpm run lint # eslint (without config issues) + pnpm run format # prettier --write + pnpm run test # vitest run — full unit + integration suite + ``` + + All four must pass. CI runs exactly these gates (plus a build) on every + push and pull request. + +5. **Open a pull request** using the template. Small PRs focused + on one concern are far more likely to be merged quickly. + +Care about the reader: if your PR touches user-facing behavior +(commands, flags, JSON fields), update the matching section in `README.md` +and add a `CHANGELOG.md` entry under `## [Unreleased]`. + +## Prerequisites + +- Node.js >= 22 +- pnpm + +## Setup + +```bash +pnpm install +pnpm build # bundle the CLI into dist/ +pnpm test # unit + integration tests +pnpm lint # eslint +pnpm format:check # prettier --check +pnpm typecheck # tsc --noEmit +``` + +## Repository layout + +```text +src/ + cli/ commander program, bin entry, spinner + commands/ one module per command (analyze, graph, diff, doctor, init) + git/ read-only git integration for `diff` (change-set discovery) + analyzer/ reverse traversal, categorization, impact summary, confidence + risk/ scoring model (weights, levels, thresholds) + parser/ ts-morph-based import/export/symbol extraction + graph/ edge resolution, graph construction, cycle detection + scanner/ source-file discovery + config/ zod validation, defaults, alias map, jiti loading + formatter/ text/table/tree/json rendering (pure functions) + output/ writers + report assembly + ui/ branding, gauge, icons, progress, color helpers + types/ shared TypeScript contracts + utils/ path, fs, glob, tsconfig helpers +tests/ + fixtures/ sample projects used by unit + integration tests + unit/ fast tests, no process spawning (mirrors src/ structure) + integration/ end-to-end CLI runs against fixtures + helpers/ fixture path helpers +docs/ architecture and design notes +examples/ commented usage walkthrough +``` + +## Conventions + +- **No globals.** Every command receives a `CommandContext` (writers, cwd, + version). Tests inject in-memory writers. +- **Pure where possible.** Rendering functions are pure; IO stays at the + edges. +- **Never throw for a parse problem.** A broken file produces a parse error + in the graph, never a crash. +- **Determinism.** Everything is sorted; maps are iterated in insertion + order only where order doesn't matter. +- **No AI, no web services.** Ripple is offline and deterministic by + design. +- Comments explain _why_, not _what_. +- Internals stay type-safe; new commands extend `src/types/cli.ts` + `DiffOptions`/`AnalyzeOptions`-style option interfaces. + +## Testing + +Unit tests: `pnpm test:unit` — fast, no process spawning. The heavy +`tests/unit/output/report.test.ts` and `tests/unit/analyzer/*` suites build +a real ts-morph project and are run with relaxed timeouts (see +`vitest.config.ts`). + +Integration tests: `pnpm test:integration` — spawns the real CLI against +`tests/fixtures/basic` and asserts exit codes and output. They are slower +(a cold jiti + ts-morph start is a few seconds), so keep fixture-level +expectations coarse. + +**Adding a fixture file**: files in `tests/fixtures/basic` are parsed by +dozens of tests. Adding a file changes graph stats (`graph --json`) and +affected-file counts for shared targets. Prefer adding a _new_ fixture +directory over mutating `basic`; if you must edit `basic`, run the full +suite and update every affected assertion deliberately. + +## Changing the JSON schema + +`analyze --json` / `graph --json` / `diff --json` are stable contracts +(see `src/types/output.ts`). Additive, optional fields are fine. Renaming +or removing fields requires a major version bump and a note in the README. + +## Changelog + +We follow [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +Add a line under `## [Unreleased]` for every user-facing change: + +- Added — new features, flags, contracts +- Changed — behavior edits, defaults +- Fixed — bug repairs +- Removed — deleted behavior + +## Releasing + +Releases are automated: pushing a `v*` tag runs CI gates (typecheck, +lint, tests, build) and publishes the package to npm +(`.github/workflows/publish.yml`). + +1. Bump `version` in `package.json` and move CHANGELOG entries from + `[Unreleased]` into a dated `[x.y.z]` section. +2. Merge to `main`, then tag from the updated main: + + ```bash + git push ripple main --tags + git tag v0.x.y + git push ripple v0.x.y + ``` + + The Publish workflow takes it from there. Verify with + `npx @alimaandev/ripple version`. + +## Code of conduct + +Everyone taking part in this project must follow the +[Code of Conduct](CODE_OF_CONDUCT.md). Contact +[alishermaan0319@gmail.com](mailto:alishermaan0319@gmail.com) to report a +violation or ask a question. diff --git a/package.json b/package.json index e974719..ddfbc60 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "@types/node": "^26.1.2", "@types/picomatch": "^4.0.3", "@types/treeify": "^1.0.3", - "@vitest/coverage-v8": "^4.1.10", + "@vitest/coverage-v8": "^5.0.1", "ajv": "^8.20.0", "esbuild": "^0.28.1", "eslint": "^10.8.0", @@ -90,6 +90,6 @@ "tsup": "^8.5.1", "typescript": "^5.9.3", "typescript-eslint": "^8.66.0", - "vitest": "^4.1.10" + "vitest": "^5.0.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56c5595..5660ad9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: specifier: ^1.0.3 version: 1.0.3 '@vitest/coverage-v8': - specifier: ^4.1.10 - version: 4.1.10(vitest@4.1.10) + specifier: ^5.0.1 + version: 5.0.1(vitest@5.0.1) ajv: specifier: ^8.20.0 version: 8.20.0 @@ -82,8 +82,8 @@ importers: specifier: ^8.66.0 version: 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@5.9.3) vitest: - specifier: ^4.1.10 - version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)) + specifier: ^5.0.1 + version: 5.0.1(@types/node@26.2.0)(@vitest/coverage-v8@5.0.1)(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)) packages: @@ -333,6 +333,9 @@ packages: '@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==} @@ -589,9 +592,6 @@ packages: cpu: [x64] os: [win32] - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@ts-morph/common@0.29.0': resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} @@ -678,20 +678,25 @@ packages: resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/coverage-v8@4.1.10': - resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==} + '@vitest/coverage-v8@5.0.1': + resolution: {integrity: sha512-FRC8ACiudC3dI6MTplzRSYWHDRnIv2IPfbzs4FdoJNsMal/35sWV8hwIfV8ZcqzSPy+uXHeMVONt9CEqtOU17w==} peerDependencies: - '@vitest/browser': 4.1.10 - vitest: 4.1.10 + '@vitest/browser': 5.0.1 + vitest: 5.0.1 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.10': - resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + '@vitest/istanbul-lib-coverage@1.0.1': + resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==} + engines: {node: '>=22'} + + '@vitest/istanbul-lib-report@1.0.1': + resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==} + engines: {node: '>=22'} - '@vitest/mocker@4.1.10': - resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + '@vitest/mocker@5.0.1': + resolution: {integrity: sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -701,20 +706,8 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.10': - resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - - '@vitest/runner@4.1.10': - resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - - '@vitest/snapshot@4.1.10': - resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - - '@vitest/spy@4.1.10': - resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - - '@vitest/utils@4.1.10': - resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + '@vitest/spy@5.0.1': + resolution: {integrity: sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -810,9 +803,6 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -833,8 +823,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - es-module-lexer@2.3.1: - resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} @@ -975,9 +965,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1013,18 +1000,6 @@ packages: 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-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -1151,13 +1126,12 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.4.1: + resolution: {integrity: sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==} + magicast@0.5.4: resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1244,6 +1218,10 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -1384,8 +1362,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinybench@6.1.4: + resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + engines: {node: '>=20.0.0'} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -1513,23 +1492,23 @@ packages: yaml: optional: true - vitest@4.1.10: - resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + vitest@5.0.1: + resolution: {integrity: sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-preview': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 - '@vitest/coverage-istanbul': 4.1.10 - '@vitest/coverage-v8': 4.1.10 - '@vitest/ui': 4.1.10 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.1 + '@vitest/browser-preview': 5.0.1 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.1 + '@vitest/coverage-v8': 5.0.1 + '@vitest/ui': 5.0.1 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -1726,13 +1705,15 @@ 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 @@ -1874,8 +1855,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.62.4': optional: true - '@standard-schema/spec@1.1.0': {} - '@ts-morph/common@0.29.0': dependencies: minimatch: 10.2.6 @@ -1994,60 +1973,34 @@ snapshots: '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 - '@vitest/coverage-v8@4.1.10(vitest@4.1.10)': + '@vitest/coverage-v8@5.0.1(vitest@5.0.1)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.10 + '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/istanbul-lib-report': 1.0.1 ast-v8-to-istanbul: 1.0.5 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 magicast: 0.5.4 obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.1 - vitest: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)) + vitest: 5.0.1(@types/node@26.2.0)(@vitest/coverage-v8@5.0.1)(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)) - '@vitest/expect@4.1.10': + '@vitest/istanbul-lib-coverage@1.0.1': {} + + '@vitest/istanbul-lib-report@1.0.1': dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - chai: 6.2.2 - tinyrainbow: 3.1.1 + '@vitest/istanbul-lib-coverage': 1.0.1 - '@vitest/mocker@4.1.10(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0))': + '@vitest/mocker@5.0.1(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0))': dependencies: - '@vitest/spy': 4.1.10 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.1 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.4.1 optionalDependencies: vite: 8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0) - '@vitest/pretty-format@4.1.10': - dependencies: - tinyrainbow: 3.1.1 - - '@vitest/runner@4.1.10': - dependencies: - '@vitest/utils': 4.1.10 - pathe: 2.0.3 - - '@vitest/snapshot@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - '@vitest/utils': 4.1.10 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.1.10': {} - - '@vitest/utils@4.1.10': - dependencies: - '@vitest/pretty-format': 4.1.10 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.1 + '@vitest/spy@5.0.1': {} acorn-jsx@5.3.2(acorn@8.18.0): dependencies: @@ -2124,8 +2077,6 @@ snapshots: consola@3.4.2: {} - convert-source-map@2.0.0: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2142,7 +2093,7 @@ snapshots: detect-libc@2.1.2: {} - es-module-lexer@2.3.1: {} + es-module-lexer@2.3.2: {} esbuild@0.28.2: optionalDependencies: @@ -2271,9 +2222,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.7 figures@6.1.0: dependencies: @@ -2318,9 +2269,8 @@ snapshots: dependencies: is-glob: 4.0.3 - has-flag@4.0.0: {} - - html-escaper@2.0.2: {} + has-flag@4.0.0: + optional: true ignore@5.3.2: {} @@ -2342,19 +2292,6 @@ snapshots: 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-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - jiti@2.7.0: {} joycon@3.1.1: {} @@ -2444,7 +2381,11 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + + magic-string@1.4.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 magicast@0.5.4: dependencies: @@ -2452,10 +2393,6 @@ snapshots: '@babel/types': 7.29.8 source-map-js: 1.2.1 - make-dir@4.0.0: - dependencies: - semver: 7.8.5 - merge2@1.4.1: {} micromatch@4.0.8: @@ -2538,6 +2475,8 @@ snapshots: picomatch@4.0.5: {} + picomatch@4.0.7: {} + pirates@4.0.7: {} pkg-types@1.3.1: @@ -2680,6 +2619,7 @@ snapshots: supports-color@7.2.0: dependencies: has-flag: 4.0.0 + optional: true thenify-all@1.6.0: dependencies: @@ -2689,7 +2629,7 @@ snapshots: dependencies: any-promise: 1.3.0 - tinybench@2.9.0: {} + tinybench@6.1.4: {} tinyexec@0.3.2: {} @@ -2697,8 +2637,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 tinyrainbow@3.1.1: {} @@ -2777,7 +2717,7 @@ snapshots: vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0): dependencies: lightningcss: 1.33.0 - picomatch: 4.0.5 + picomatch: 4.0.7 postcss: 8.5.25 rolldown: 1.2.3 tinyglobby: 0.2.17 @@ -2787,31 +2727,25 @@ snapshots: fsevents: 2.3.3 jiti: 2.7.0 - vitest@4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)): + vitest@5.0.1(@types/node@26.2.0)(@vitest/coverage-v8@5.0.1)(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)): dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - es-module-lexer: 2.3.1 + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.1(vite@8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)) + chai: 6.2.2 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 + magic-string: 1.4.1 obug: 2.1.4 - pathe: 2.0.3 - picomatch: 4.0.5 + picomatch: 4.0.7 std-env: 4.2.0 - tinybench: 2.9.0 + tinybench: 6.1.4 tinyexec: 1.3.0 tinyglobby: 0.2.17 - tinyrainbow: 3.1.1 vite: 8.2.0(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.2.0 - '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) + '@vitest/coverage-v8': 5.0.1(vitest@5.0.1) transitivePeerDependencies: - msw