diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 046fd99..22dac03 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -6,9 +6,9 @@ 'schedule:weekly', 'helpers:pinGitHubActionDigests', ], - // E2E fixtures deliberately pin the published toolchain versions the suites - // run against; bumping them is a manual, E2E-verified decision. - ignorePaths: ['**/node_modules/**', 'packages/vscode/e2e/**'], + // E2E fixtures pin exact published versions; their Rstack dependencies are + // updated by the `rstack toolchain` group below. + ignorePaths: ['**/node_modules/**'], packageRules: [ // Use chore as semantic commit type for commit messages { @@ -32,10 +32,11 @@ // waiver list staying in sync. Listed after `all-patch` so these land in // their own PR instead of the weekly patch roll-up. // - // This includes `@rslint/core`, `@rstest/core` and `rstack`, whose ranges - // sit alongside the runtime `SUPPORT_MATRIX` (shared/versionCheck.ts). - // That matrix is a floor, not a pin: raising a devDependency does not move - // it. Lowering the floor stays a deliberate, separate edit. + // This includes `@rslint/core`, `@rstest/core` and `rstack`, which appear as + // root/development ranges and exact fixture pins. The runtime + // `SUPPORT_MATRIX` (shared/versionCheck.ts) is a floor, not a pin: raising a + // dependency does not move it. Lowering the floor stays a deliberate, + // separate edit. { groupName: 'rstack toolchain', groupSlug: 'rstack', diff --git a/.gitignore b/.gitignore index 2c7bbfd..0c3f7bf 100644 --- a/.gitignore +++ b/.gitignore @@ -150,8 +150,8 @@ tests-dist/ # F5 playground's materialized Node (see .vscode/tasks.json "playground node") packages/vscode/.playground/ -# E2E fixtures install published npm versions on demand; only -# their manifests and configs are tracked. +# E2E fixtures pin exact published versions and install them fresh; +# their generated node_modules directories and lockfiles stay disposable. packages/vscode/e2e/fixtures/*/node_modules/ packages/vscode/e2e/fixtures/*/pnpm-lock.yaml packages/vscode/e2e/lint/fixtures/pnpm-lock.yaml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a7402ec..a4b43b6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thanks for your interest in contributing to Rstack Editor! ## Setup -- Node.js: the version is pinned in [`.nvmrc`](./.nvmrc) (`nvm use` / `fnm use`). Node >= 22.12 is required. +- Node.js: the version is pinned in [`.nvmrc`](./.nvmrc) (`nvm use` / `fnm use`). Node `^22.18.0 || >=24.3.0` is required. - pnpm: pinned via the `packageManager` field — run `corepack enable pnpm` once and the right version is used automatically. ```bash @@ -19,9 +19,9 @@ pnpm install # also installs the git hooks (rs hooks) | `pnpm lint` | Lint + type check (`rs lint --type-check`) | | `pnpm fmt` | Format the repo (`rs fmt`) | | `pnpm test:unit` | Unit tests | -| `pnpm test:e2e` | Full E2E chain (installs fixtures, launches a real VS Code) | +| `pnpm test:e2e` | Full E2E chain (fresh-installs exactly pinned fixtures, launches a real VS Code) | -To try the extension: press F5 in VS Code at the repo root — the playground launch config starts a watch build, lets you pick a fixture project, and opens an Extension Development Host on it. Run `pnpm --filter rstack test:e2e:fixtures` once beforehand to install the fixture dependencies. +To try the extension: press F5 in VS Code at the repo root — the playground launch config starts a watch build, lets you pick a fixture project, and opens an Extension Development Host on it. Run `pnpm --filter rstack test:e2e:fixtures` once beforehand to install the exactly pinned fixture dependencies. ## Submitting changes diff --git a/README.md b/README.md index d3ae583..a0ae50a 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The extension resolves the tools from your project's `node_modules` and checks t | -------------- | --------- | | `@rslint/core` | `>=0.8.0` | | `@rstest/core` | `>=0.6.0` | -| `rstack` | `>=0.6.1` | +| `rstack` | `>=0.7.0` | ## Documentation diff --git a/docs/adr/0001-node-runtime-selection.md b/docs/adr/0001-node-runtime-selection.md index 94a66e4..35bfd4a 100644 --- a/docs/adr/0001-node-runtime-selection.md +++ b/docs/adr/0001-node-runtime-selection.md @@ -1,16 +1,18 @@ # Node runtime selection -The Node.js a test worker runs on is a **User Node runtime** — chosen by the extension from the user's own environment, the PATH `node` first and then the `node` the user's interactive shell would give them — and it must satisfy a uniform floor, `^22.18.0 || >=23.6.0`. The **VS Code Node runtime** is never a candidate. When nothing satisfies the floor, the test stack reports a status and runs nothing. +The Node.js a test worker runs on is a **User Node runtime** — chosen by the extension from the user's own environment, the PATH `node` first and then the `node` the user's interactive shell would give them — and it must satisfy a uniform floor, `^22.18.0 || >=24.3.0`. The **VS Code Node runtime** is never a candidate. When nothing satisfies the floor, the test stack reports a status and runs nothing. -## Why the floor is `^22.18.0 || >=23.6.0` +## Why the floor is `^22.18.0 || >=24.3.0` -The strictest thing a worker does is load an `rstack.config.*`, which rstack's shipped shim loads through `@rstackjs/load-config` with `loader: 'native'`. That path rethrows with no jiti fallback (`rstack-cli` `packages/rstack/src/config.ts:174`, bundled verbatim into `rstack@0.4.0`'s `dist/687.js`), and `native` never consults `process.features.typescript` — it calls `import()` directly. So the worker needs Node's native TypeScript stripping, which was unflagged in 23.6.0 and backported to the LTS line in 22.18.0. That release history is why the floor is a disjunction rather than a single version: 23.0–23.5 compare above 22.18.0 yet predate the unflagging, and `^22.18.0 || >=23.6.0` names exactly the versions that strip by default. +The strictest thing a worker does is load an `rstack.config.*`, which rstack's shipped shim loads through `@rstackjs/load-config` with `loader: 'native'`. That path rethrows with no jiti fallback (`rstack-cli` `packages/rstack/src/config.ts:174`, bundled verbatim into `rstack@0.4.0`'s `dist/687.js`), and `native` never consults `process.features.typescript` — it calls `import()` directly. So the worker needs Node's native TypeScript stripping, which was unflagged in 23.6.0 and backported to the LTS line in 22.18.0; that is the type-stripping lower bound. -Native type stripping is the _only_ thing on the worker's path that needs more than the declared `engines` of the packages involved: `@rstest/core` 0.11.6 and `@rsbuild/core` declare `^20.19.0 || >=22.12.0`, `rstack` 0.4.0 declares `>=22.12.0`, and `Module.registerHooks` (used by rstack's `freshImport`, added in 22.15) has a three-level fallback. +The supported rstack line adds a narrower declared contract. Since rstack 0.7.0, `engines.node` is `^22.18.0 || >=24.3.0`: Node 23 is unsupported, and Node 24.0–24.2 still emits the experimental type-stripping warning that 24.3.0 removes ([rstackjs/rstack-cli#427](https://github.com/rstackjs/rstack-cli/pull/427)). The extension therefore intersects native type-stripping availability with rstack's declared engines rather than accepting a runtime the supported toolchain rejects. The range follows those engines as that contract changes. + +Other packages on the worker path allow older runtimes: `@rstest/core` and `@rsbuild/core` declare `^20.19.0 || >=22.12.0`, and `Module.registerHooks` (used by rstack's `freshImport`, added in 22.15) has a three-level fallback. ## Considered options -**A per-project floor** — 22.18.0 only for projects driven by an `rstack.config.*`, 22.12.0 for a native `rstest.config.*`. Rejected: it buys back Node 20.19–22.17 at the cost of a second code path through every call site. Node 20 left support on 2026-04-30, so the users it genuinely serves are those on Node 22.12–22.17 — a supported LTS line, needing only a patch-level update within 22.x. That is a low-friction ask, and one uniform floor is a support contract the README and the status bar can each state in one sentence. +**A per-project floor** — the full rstack floor only for projects driven by an `rstack.config.*`, with looser floors where package contracts allow. Rejected: it buys back Node 20.19–22.17, Node 23 and Node 24.0–24.2 at the cost of a second code path through every call site. Node 20 is out of support; Node 23 is an unsupported odd-numbered line; and users on Node 22 or 24 need only a patch-level update within that line. That is a low-friction ask, and one uniform floor is a support contract the README and the status bar can each state in one sentence. **A capability probe instead of a version check** — asking each candidate for `process.features.typescript` rather than comparing semver. Rejected: `process.features.typescript` is itself Stability 1.2 (release candidate) and its value set has moved (`"transform"` existed on 22.18–25.1, removed in 26.0.0). More decisively, `loader: 'native'` never reads it, so the probe would not be testing the condition that actually fails. A floor is a contract; contracts are declared, not sniffed. diff --git a/docs/adr/0002-fmt-lsp-on-user-node-runtime.md b/docs/adr/0002-fmt-lsp-on-user-node-runtime.md index 839ff08..04d1704 100644 --- a/docs/adr/0002-fmt-lsp-on-user-node-runtime.md +++ b/docs/adr/0002-fmt-lsp-on-user-node-runtime.md @@ -1,6 +1,6 @@ # Formatting through the `rs fmt` language server -Document formatting is served by **`rs fmt --lsp`** — one language server per detected workspace folder, spawned with its cwd at the folder root, running on a **User Node runtime** that satisfies the floor ADR 0001 sets (`^22.18.0 || >=23.6.0`). It replaces a spawn-per-request `rs fmt --stdin-filepath` MVP that ran on the VS Code Node runtime and kept one pre-spawned process warm for the active editor. The floor for the project's `rstack` rises to `>=0.5.2`, the first release that ships `--lsp`; older releases surface as `version mismatch` and format nothing. The raise is **toolchain-wide by decision**, not fmt-scoped: `SUPPORT_MATRIX.rstack` is one entry and the Rstest bridge gates on the same one, so a project on `rstack` 0.3.5–0.5.1 also stops running tests until it upgrades. A per-stack floor was considered and rejected — "which rstack does the extension support?" should have one answer, and the mismatch status names the required version. +Document formatting is served by **`rs fmt --lsp`** — one language server per detected workspace folder, spawned with its cwd at the folder root, running on a **User Node runtime** that satisfies the floor ADR 0001 sets. It replaces a spawn-per-request `rs fmt --stdin-filepath` MVP that ran on the VS Code Node runtime and kept one pre-spawned process warm for the active editor. The floor for the project's `rstack` rises to `>=0.5.2`, the first release that ships `--lsp`; older releases surface as `version mismatch` and format nothing. The raise is **toolchain-wide by decision**, not fmt-scoped: `SUPPORT_MATRIX.rstack` is one entry and the Rstest bridge gates on the same one, so a project on `rstack` 0.3.5–0.5.1 also stops running tests until it upgrades. A per-stack floor was considered and rejected — "which rstack does the extension support?" should have one answer, and the mismatch status names the required version. ## Why a server rather than a process per request diff --git a/docs/adr/0003-lint-through-editor-worker.md b/docs/adr/0003-lint-through-editor-worker.md index ebede74..98f88b8 100644 --- a/docs/adr/0003-lint-through-editor-worker.md +++ b/docs/adr/0003-lint-through-editor-worker.md @@ -6,7 +6,7 @@ status: accepted Rslint's language server is two halves: the Go process (`rslint --lsp`) lints natively, but it hands config evaluation (`rslint/loadConfigs`, `activateConfigs`, `commit`/`abort`) and JS plugin rules (`rslint/pluginLint`) back to its client over reverse requests. Upstream's VS Code extension is that client, and so — as a near-verbatim copy — was ours: the project's `rslint.config.*` was evaluated inside the extension host, on the VS Code Node runtime, with a cwd that means nothing (ADR 0001's lint entry). Linting from a Rstack config (`define.lint()`) forces the issue: `rs lint`'s answer is a shim rstack ships (`/dist/rslintConfig.js`, treated as a stable path by agreement with rstack-cli) that calls `loadRstackConfig()` and finds `rstack.config.*` from **the evaluating process's cwd**. Evaluated in the extension host, it finds nothing. The first attempt (PR #10) worked around that by writing a **generated shim** into the project with the absolute config path baked in; it was rejected — the editor must not manufacture bridging artifacts. -**Decision.** The extension ships a **lint worker**: a vscode-free Node script, run once per lint server on a **User Node runtime** (ADR 0001's floor and candidate order, `rstack.nodeExecutable` as the shared escape hatch) with its cwd at the workspace folder root. The worker spawns the Go `rslint --lsp` of the resolved `@rslint/core`, proxies LSP over stdio to the extension, and answers Go's reverse requests itself with that core's `ConfigModuleHost` and `createPluginLintHost`. Its entry is `--lsp [--config ]`: with `--config` it pins the server to that module through the protocol-2 `configPath` of `rslint/configRefresh` (`@rslint/core >= 0.8.0`, rslint #1630); without it the server does its ordinary automatic discovery. A **bridged folder** runs the worker with `--config /dist/rslintConfig.js`; a **native folder** runs it without. From the extension's side, lint is now the shape fmt already has: a thin language client per server, and no project code loaded in the extension host — which retires the lint entry on ADR 0001's debt list. +**Decision.** The extension ships a **lint worker**: a vscode-free Node script, run once per lint server on a **User Node runtime** (ADR 0001's floor and candidate order, `rstack.nodeExecutable` as the shared escape hatch) with its cwd at the workspace folder root. The worker spawns the Go `rslint --lsp` of the resolved `@rslint/core`, proxies LSP over stdio to the extension, and answers Go's reverse requests itself with that core's `ConfigModuleHost` and `createPluginLintHost`. Its entry is `--lsp [--config ]`: with `--config` it pins the server to that module through the protocol-versioned `configPath` of `rslint/configRefresh` (`@rslint/core >= 0.8.0`; the explicit path was introduced for protocol 2 in rslint #1630); without it the server does its ordinary automatic discovery. A **bridged folder** runs the worker with `--config /dist/rslintConfig.js`; a **native folder** runs it without. From the extension's side, lint is now the shape fmt already has: a thin language client per server, and no project code loaded in the extension host — which retires the lint entry on ADR 0001's debt list. ## Considered options @@ -22,10 +22,10 @@ Rslint's language server is two halves: the Go process (`rslint --lsp`) lints na ## Consequences -- **Lint gains a Node floor it never had.** A native folder that lints on VS Code's Node today reports `version mismatch` and starts nothing when no User Node runtime clears `^22.18.0 || >=23.6.0`. Accepted deliberately: one worker, one path, one floor (ADR 0001 already rejected per-project floors), and this is the debt that ADR named. -- **Resolution follows one chain, mirroring `rs lint`.** For a bridged folder: `rstack` from the folder root → `@rslint/core` from rstack's directory (the transitive copy `rs lint` itself imports; a pnpm project declaring only `rstack` cannot resolve `@rslint/core` from its root) → the Go binary through that core's `resolveRslintBinary()`. For a native folder the chain starts at `@rslint/core` from the **document's own directory** (the #1617 sync; before it, from the folder root). The extension walks the chain as far as the **core directory** — `fs.stat`, `package.json` reads and semver comparisons, no project code loaded, so inside the load bound and legitimately on the VS Code Node runtime, exactly as fmt resolves the `rs` bin — and gates there; the worker receives `--core [--config ]` and takes the last hop itself, calling that core's `resolveRslintBinary()` on the User Node runtime, since it is a JS export of the project's package. Floors follow the "latest release only" rule: `@rslint/core >= 0.8.0` (protocol 1 support removed) and `rstack >= 0.6.1` toolchain-wide — `rstack` 0.5.2 still depends on `@rslint/core ~0.7.3`, and one answer to "which rstack does the extension support" is worth more than keeping 0.5.x users' tests running. +- **Lint gains a Node floor it never had.** A native folder that lints on VS Code's Node today reports `version mismatch` and starts nothing when no User Node runtime clears the ADR 0001 floor. Accepted deliberately: one worker, one path, one floor (ADR 0001 already rejected per-project floors), and this is the debt that ADR named. +- **Resolution follows one chain, mirroring `rs lint`.** For a bridged folder: `rstack` from the folder root → `@rslint/core` from rstack's directory (the transitive copy `rs lint` itself imports; a pnpm project declaring only `rstack` cannot resolve `@rslint/core` from its root) → the Go binary through that core's `resolveRslintBinary()`. For a native folder the chain starts at `@rslint/core` from the **document's own directory** (the #1617 sync; before it, from the folder root). The extension walks the chain as far as the **core directory** — `fs.stat`, `package.json` reads and semver comparisons, no project code loaded, so inside the load bound and legitimately on the VS Code Node runtime, exactly as fmt resolves the `rs` bin — and gates there; the worker receives `--core [--config ]` and takes the last hop itself, calling that core's `resolveRslintBinary()` on the User Node runtime, since it is a JS export of the project's package. Floors follow the evidence in `SUPPORT_MATRIX`: `@rslint/core >= 0.8.0` is the first release with explicit protocol-2 config selection, while `rstack >= 0.7.0` is the first release whose shim supplies `basePath` and itself pins `@rslint/core` 0.9.0; one answer to "which rstack does the extension support" is worth more than keeping older releases running. - **One override, and it names a core, not a binary.** `rstack.rslint.binPath` / `customBinPath` are removed in favour of `rstack.rslint.corePath` — the setting upstream introduced in rslint #1617: a path to an `@rslint/core` package directory, resource-scoped, from which the binary, config host, protocol version and plugin host all derive. In a bridged folder it overrides the rstack → `@rslint/core` hop only; the shim stays rstack's. A binary chosen independently of its core cannot be supported: the two must speak the same protocol. The rest of #1617 — per-document core resolution, one runtime per physical installation — has since been synced (issue #13): a **Lint runtime** is now one Rslint core inside one workspace folder, resolved per open document and refcounted by it, so a folder runs as many workers as its files have distinct cores (a bridged folder always exactly one, rstack's) and none at all while nothing is open. The worker never noticed: it still takes explicit `--core` / `--config` paths, which is precisely why that change did not touch it. -- **Ownership is per folder, native wins.** One server holds one config choice for its lifetime (protocol 2 locks `configPath` per process), and explicit and automatic modes cannot mix, so a folder is bridged only when no `rslint.config.*` exists anywhere in it and a `rstack.config.*` sits at its root; a subdirectory `rstack.config.*` lights nothing (`rs lint` in a terminal reads its cwd only — the same reason ADR 0002 rejected deepest-config-wins for fmt). Detection lights a bridged folder on the file's presence and never reads it: a `rstack.config.*` without `define.lint()` runs an empty config, as `rs lint` does. +- **Ownership is per folder, native wins.** One server holds one config choice for its lifetime (the supported config protocols lock `configPath` per process), and explicit and automatic modes cannot mix, so a folder is bridged only when no `rslint.config.*` exists anywhere in it and a `rstack.config.*` sits at its root; a subdirectory `rstack.config.*` lights nothing (`rs lint` in a terminal reads its cwd only — the same reason ADR 0002 rejected deepest-config-wins for fmt). Detection lights a bridged folder on the file's presence and never reads it: a `rstack.config.*` without `define.lint()` runs an empty config, as `rs lint` does. - **Config changes refresh, mode changes restart.** Rslint has a live refresh (`rslint/configRefresh` with the same `configPath`), unlike `rs fmt --lsp`, so the extension keeps its watcher-driven refresh — extended, for a bridged folder, with the root `rstack.config.*` — and the worker re-stamps `protocolVersion` and its `configPath` on every refresh (the extension does not know either). Only a native ↔ bridged flip, or a dependency change the refresh cannot absorb, restarts the server. This is the "diverge only when the tool forces it" rule: rslint can refresh, fmt cannot. - **Failure states mirror fmt.** Bridged folder: no `rstack` → `disabled`; `rstack` or the chained `@rslint/core` below floor, or no Node clearing the floor → `version mismatch`; worker or Go dying → `crashed`. Native folder missing `@rslint/core` stays `crashed` — the user asked for Rslint by name. - The lint copy diverges further from upstream: the reverse-request adapter and plugin pool move into the worker unchanged in logic, and the extension-side `Rslint.ts` keeps only the language-client half. Recorded as an adaptation in `packages/vscode/AGENTS.md`. diff --git a/package.json b/package.json index 6403bc7..2b39fa1 100644 --- a/package.json +++ b/package.json @@ -16,11 +16,11 @@ }, "devDependencies": { "bumpp": "^11.1.0", - "rstack": "^0.6.4" + "rstack": "^0.7.2" }, "packageManager": "pnpm@11.20.0", "engines": { - "node": ">=22.12.0", + "node": "^22.18.0 || >=24.3.0", "pnpm": ">=11.0.0" } } diff --git a/packages/vscode/AGENTS.md b/packages/vscode/AGENTS.md index a5e778b..246962c 100644 --- a/packages/vscode/AGENTS.md +++ b/packages/vscode/AGENTS.md @@ -17,13 +17,13 @@ One extension replacing the standalone `rstack.rslint` and `rstack.rstest` exten 4. **Status aggregation** — stacks own no UI chrome; they report to the shell's single status bar item, which always exists. In CI the test stack's `MasterLogger` also mirrors every entry to stderr (`RSTACK_E2E_MIRROR_LOGS=1`, set by `e2e/rstest/runTest.ts`) — the output channel is unreadable there; rationale in `stacks/test/logger.ts`. 5. **Worker-cwd decoupling** (test) — a project's cwd is explicit, not derived from the config file path; for native configs behavior stays byte-identical to upstream. 6. **Node runtime selection** (lint, test, fmt) — the Node a project-loading child process runs on is a **User Node runtime** chosen by the extension against one uniform floor, never assumed from PATH; the recovery path is the user's own shell, and the dividing line is the **load bound** (terms in CONTEXT.md; the full rule and rationale in `docs/adr/0001-node-runtime-selection.md`). All three callers — the lint worker, the rstest worker and the `rs fmt --lsp` server — take the decision from the one shared module (`shared/nodeResolution.ts`) and share one escape hatch, the resource-scoped `rstack.nodeExecutable` (`shared/nodeExecutableSetting.ts`); each appends its own consequence to the shared preflight message. -7. **Lint worker and Rstack bridge** — the extension host is only Rslint's language client. One vscode-free, editor-shipped lint worker per **Lint runtime** (one Rslint core inside one workspace folder — CONTEXT.md) runs on the User Node runtime, owns the Go LSP plus all five reverse requests, and derives the binary/config/plugin pieces from one explicit `@rslint/core` directory. Upstream's `CoreResolver` loads that core in the extension host; ours only walks to the directory (`fs.stat` + `package.json` + semver) and hands the path to the worker, and its `CoreInstallation` therefore carries paths, not module factories; upstream's installation cache goes with the module loading it memoized (`clear()` is a no-op kept for the `RuntimeManager` contract). A bridged folder passes only rstack's published `dist/rslintConfig.js` shim; neither the extension nor the worker re-implements Rstack config semantics. Because protocol 2 locks `configPath` per process, the shim is part of the runtime key (`folder + core identity + shim`), which upstream — having no bridge — keys on the core alone. Why: `docs/adr/0003-lint-through-editor-worker.md`. +7. **Lint worker and Rstack bridge** — the extension host is only Rslint's language client. One vscode-free, editor-shipped lint worker per **Lint runtime** (one Rslint core inside one workspace folder — CONTEXT.md) runs on the User Node runtime, owns the Go LSP plus all five reverse requests, and derives the binary/config/plugin pieces from one explicit `@rslint/core` directory. Upstream's `CoreResolver` loads that core in the extension host; ours only walks to the directory (`fs.stat` + `package.json` + semver) and hands the path to the worker, and its `CoreInstallation` therefore carries paths, not module factories; upstream's installation cache goes with the module loading it memoized (`clear()` is a no-op kept for the `RuntimeManager` contract). A bridged folder passes only rstack's published `dist/rslintConfig.js` shim; neither the extension nor the worker re-implements Rstack config semantics. Because every supported config protocol locks `configPath` per process, the shim is part of the runtime key (`folder + core identity + shim`), which upstream — having no bridge — keys on the core alone. Why: `docs/adr/0003-lint-through-editor-worker.md`. 8. **Self-documenting Rslint diagnostics** — client-side providers parse Inline directives into per-rule hover, DocumentLink and underline-decoration affordances (the hover renders `Rslint(rule-id)`, the shape VS Code gives the published diagnostics), and the router enriches today's `[rule-id] message` diagnostics with a derived Rule docs link. No rule metadata or network lookup is bundled (ADR 0004). The hover provider yields whenever the owning language client's resolved capabilities advertise `hoverProvider`; an optional `Rslint.onClosed` hook identity-safely prunes the controller's capability mirror; the diagnostic synthesis is removed once upstream publishes `code` / `codeDescription` natively. 9. **Color env parity with the CLI** (test) — upstream hard-codes `FORCE_COLOR: '1'` into the worker's spawn env; ours mirrors the CLI's `getForceColorEnv` (rstest `packages/core/src/utils/logger.ts`) instead (`stacks/test/shared/colorEnv.ts`): the master injects `FORCE_COLOR=1` into the composed spawn env only when neither `FORCE_COLOR` nor `NO_COLOR` is already set (marking the injection with `RSTACK_FORCE_COLOR_INJECTED`), and the worker retracts the marked injection right after config load if the config set `NO_COLOR` — the CLI's own decision point. Otherwise a project whose config sets `process.env.NO_COLOR` (rstack-cli does) hits Node's "'NO_COLOR' env is ignored" warning in every pool process. A user-set `FORCE_COLOR` beside a config-set `NO_COLOR` still warns, exactly as the bare CLI does. ## Rules -- **Pre-1.0.0 the extension breaks freely.** No compatibility is owed with earlier unpublished states of this extension — settings, command ids and behavior may change without deprecation paths, and dead compat code for them is removed, not kept. Only the **latest released** `rstack`, `@rstest/core` and `@rslint/core` need support: whenever a change touches a floor in `SUPPORT_MATRIX`, set it to the latest release at that time — do not reason about which older release would still work — and raise it without a transition story (the floor status names the required version). No settings migration exists either — not for earlier states of this extension, and not for the two retired standalone extensions (removed in #15; users re-enter their settings under `rstack.*`). +- **Pre-1.0.0 the extension breaks freely.** No compatibility is owed with earlier unpublished states of this extension — settings, command ids and behavior may change without deprecation paths, and dead compat code for them is removed, not kept. No settings migration exists either — not for earlier states of this extension, and not for the two retired standalone extensions (removed in #15; users re-enter their settings under `rstack.*`). Testing and fixtures track only the latest published releases, pinned exactly and bumped by Renovate; a green E2E run speaks only for those releases. `SUPPORT_MATRIX` floors are the minimum versions the extension accepts: each entry is the lowest release evidence shows works with the current code, and its comment records that evidence. Move a floor only when a change makes older releases stop working, never because a devDependency or fixture moved. Raising a floor needs no transition story; the status names the required version. - **The three tools are treated uniformly by default.** Detection, dependency-change retry, restart semantics, version gating and status reporting follow one shared pattern across the lint/test/fmt stacks; a stack diverges only when its tool forces it, and the divergence is recorded here as a gotcha. When adding behavior to one stack, first ask whether it belongs to all three. This is about behavior, not code — the upstream copies still must not be deduplicated. - **Not installed is a state, not an error — uniformly.** A folder or project whose dependencies are not installed (no `rstack`, no `@rstest/core`, no `@rslint/core`, a config importing a package that is not there) is the normal state of a fresh clone and of scaffolded templates beside their generator (`create-rstack`'s `template-*`, which declare their own dependencies and are never installed). Every stack reports it the same way: a `disabled` status whose reason names the restart command as the way out (ADR 0002: an install that changes no lockfile fires no detection pass), one `warn` line in the output channel without a stack trace, never a `crashed` status and never a notification. The words come from one place, `shared/notInstalled.ts` (the `formatVersionMismatch` precedent) — each stack keeps its own status machinery, none its own wording; the restart hint is derived from `stackCommandTitle`, which `tests/extension.test.ts` checks against the manifest. Lint's report lives in the `onDocumentFailure` hook (`stacks/lint/index.ts`), which owns the log line too, so the upstream-tracked `RuntimeManager` only defers to it. Rstest classifies the config-import case in the worker (`missingDependencyCauseOf`: Node's `code`, a bare — package-name — specifier, and for a subpath a walk-up proving the package really is absent, so a typo'd relative import or a missing subpath of an installed package stays a real error) because the IPC channel drops the `code` — `NormalizedConfigResult` carries the verdict as data end to end, and `Project` branches on it. The config-import case is implemented for Rstest only today — lint and fmt load configs inside their own servers and cannot classify there yet (#30). - One stack failing to register or crashing must never take another stack (or the shell) down. @@ -42,18 +42,18 @@ One extension replacing the standalone `rstack.rslint` and `rstack.rstest` exten - The lint × `rstack.config.*` bridge stays thin on purpose: only a root Rstack config can claim a bridged folder, any native config anywhere in the folder wins ownership, and the worker evaluates rstack's published shim from the folder root. Never generate a shim, load the Rstack config in the extension host, or interpret `define.lint()` ourselves. - **Yarn Plug'n'Play is unsupported by decision, extension-wide.** Every stack resolves through physical `node_modules` (`shared/packageResolve.ts`, `resolution.ts`'s rstack → `@rslint/core` chain, the fmt bin probe, the rstest package lookup) and the lint worker's own `createRequire` from the core directory does too. Lint once carried a `.pnp.cjs` branch for the find-`@rslint/core` hop only; nothing after that hop (config evaluation, plugin resolution, the other stacks) had PnP hooks, so it never produced a working folder, and upstream removed its own PnP path in the same refactor that introduced `corePath`. Real support would be a PnP editor-SDK-shaped project across all three stacks, not a resolver branch — do not reintroduce one. - **A Lint runtime lives as long as a document needs it, and a folder with none is `running: idle`.** Since the #1617 sync, `RuntimeManager` refcounts each runtime by open document: the first document to resolve a core starts one, the last to release it closes it, so a detected folder with nothing open holds zero workers and zero Go processes. That folder still reports `running` — with the detail `idle` — because it is live and will start a runtime on the next `didOpen`; do **not** add a `StackState` kind for it (the shell's status bar and `when` clauses read the kinds, and idle is not a kind of health). A folder's state is the **worst of** its runtimes plus any document whose core resolution currently fails (last-good: that document keeps the runtime it already had), so one failing core is never masked by a healthy sibling — the same invariant fmt pins across folders, applied inside one and across them alike (lint's rank table matches fmt's: `disabled` there means "a package is not installed" — no `rstack`, or no `@rslint/core` — not the kill switch). Triggers: the shell's detection pass (which already covers lockfiles) plus one lint-owned watcher on `node_modules/@rslint/core/package.json` — upstream's glob minus the lockfiles detection owns. Failures report through the status only: upstream's `window.showWarningMessage` is dropped, since stacks own no UI chrome. Consequently `whenStackActive('rslint')` means "the controller registered its folders", not "a server is up" — E2E suites open a document and await diagnostics. -- The lint worker is deliberately vscode-free so it can move upstream whole. It takes explicit `--core` / `--config` native paths, writes logs only to stderr because stdout is LSP, and owns the Go child plus config/plugin lifecycles. Config edits use `rslint/configRefresh` with the same pinned path; a native ↔ bridged ownership change replaces the whole folder runtime because protocol 2 locks that choice for the process lifetime. +- The lint worker is deliberately vscode-free so it can move upstream whole. It takes explicit `--core` / `--config` native paths, writes logs only to stderr because stdout is LSP, and owns the Go child plus config/plugin lifecycles. Config edits use `rslint/configRefresh` with the same pinned path; a native ↔ bridged ownership change replaces the whole folder runtime because the supported config protocols lock that choice for the process lifetime. - The test × `rstack.config.*` bridge stays thin on purpose: it points the upstream machinery at rstack's shipped shim and lets the shim interpret the config inside the worker, same as the CLI. Bridged projects resolve `@rstest/core` from the resolved rstack package directory, mirroring lint, so rstack's dependency remains visible under isolated installs. Never re-implement rstack config semantics in the extension. - The fmt stack is an LSP client: one `rs fmt --lsp` server per detected workspace folder, spawned at the **folder root** even when a deeper `rstack.config.*` exists. Deepest-config-wins was removed deliberately — `rs fmt` loads one config from its cwd with no upward walk, so anchoring deeper made the editor disagree with `rs fmt` in a terminal; a subproject that needs its own fmt config becomes its own workspace folder. The stack registers **no** `DocumentFormattingEditProvider`: the client registers the provider from the server's `documentFormattingProvider` capability, and adding one by hand would double-register. A config create/change/delete **restarts** the owning folder's server (the server caches its config for its process lifetime and has no config-change message), which is also why the stack watches `RSTACK_CONFIG_GLOB` itself instead of relying on detection — a detection signature records which config files exist, not their contents. A detection pass keeps healthy servers and restarts failed ones in place (`isFailedFmtState`) — lockfile events notify even when the folder set is unchanged, precisely so a completed install or upgrade is retried without a manual restart. There is no stdin fallback below `SUPPORT_MATRIX.rstack`; that is a version gate, not an omission. **Nested workspace folders are a documented limitation, by decision**: when a folder and its subdirectory are both workspace folders and both detect fmt, the parent's per-folder selector also matches the nested folder's files, and which server VS Code hands the request to is not defined — the supported shape is subprojects as _sibling_ workspace folders (or only the subproject opened), not parent-plus-child. Routing (lint's `WorkspaceDocumentRouter` shape) was considered and deferred. Why all of it: `docs/adr/0002-fmt-lsp-on-user-node-runtime.md`. - fmt importing `stacks/lint/LanguageServerProcessOwner.ts` is not a refactor across the copies: that file has no lint imports and no lint behaviour, it only owns the native children of one language client — including the ones vscode-languageclient's automatic restart creates, which is exactly the leak an ad-hoc copy would reintroduce. Lint's `ManagedLanguageClient` is _restated_ in `stacks/fmt/index.ts` instead, because importing it from `Rslint.ts` would couple fmt to the lint stack's runtime graph. Keep that line where it is: shared process ownership yes, shared stack runtime no. - The VSIX is platform-targeted for exactly one reason: the test stack's AST collection loads a native parser binding. Do not add another native dependency — it multiplies the release matrix. - `shared/nodeResolution.ts` takes its shell, its cwd and its notify callback as options instead of importing `vscode` and a stack's `logger` singleton, unlike its neighbours. That is not stylistic: it keeps `resolveUserNode` a pure decision table over its inputs, which is what makes the case-by-case unit tests possible without a `vscode` stub. It sat in `stacks/test/` until fmt became the second stack running project code on a User Node runtime — the exact condition its old note named — and moved on that trigger, not before. Its host-scoped preflight memo is reset by the shell's restart pass only when **no** consumer stack (`USER_NODE_STACKS`) survives the pass — a single-stack `rstack.fmt.restart` beside a live Rstest controller deliberately keeps the memo, since the survivor's existing workers were built on that decision; the full `rstack.restart` always clears it. `stacks/fmt/binEntry.ts` and `stacks/fmt/status.ts` are separate pure modules for the same testability reason — `stacks/fmt/index.ts` evaluates `vscode`, and `status.ts` pins the fold's invariant (a healthy sibling folder never masks another folder's failure) in a unit test the single-folder E2E fixtures cannot. -- The uniform Node floor deliberately exceeds `@rstest/core`'s own `engines` (`^20.19.0 || >=22.12.0`), because the strictest thing any of these processes does — either worker through rstack's shim, or the `rs fmt` server through `@rstackjs/load-config` — is load an `rstack.config.*` with `loader: 'native'`, no jiti fallback, and so needs native type stripping (22.18+; on the 23.x line only from 23.6). Do not specialise the floor per project — that was considered and rejected. Why, and what else was rejected: `docs/adr/0001-node-runtime-selection.md`. +- The uniform Node floor deliberately exceeds `@rstest/core`'s own `engines` (`^20.19.0 || >=22.12.0`) and also mirrors the supported rstack line's `engines.node` (`rstack >= 0.7.0`). Do not specialise the floor per project — that was considered and rejected. Why, and what else was rejected: `docs/adr/0001-node-runtime-selection.md`. - Bun is not a supported worker runtime (it segfaults running `@rstest/core`). If that is ever revisited, gate it on an explicit setting — never on `bun.lock`, since bun-as-package-manager still runs the `rs` bin through its `#!/usr/bin/env node` shebang. ## Testing - E2E suites ported from upstream keep upstream's assertion semantics; every intentional deviation is documented in a comment in the test itself. A failing ported test is a regression, not a test to adjust. -- E2E fixtures install published npm packages (not workspace links): the extension must work against what users actually install. Fixture `node_modules` are disposable and never committed. +- E2E fixtures install exact versions of published npm packages (not workspace links): the extension must work against what users actually install. Renovate updates the exact toolchain pins; generated fixture lockfiles and `node_modules` remain disposable and uncommitted. - Prefer running the E2E slice that covers the change over the full chain: `pnpm test:e2e ` (or the `test:e2e:` aliases). Slices are declared in the `SLICES` table in `e2e/run.mjs` (name, fixtures, entry) — the package.json scripts are thin forwards and carry no slice knowledge. `RSTACK_LINT_E2E_SUITES=` filters lint suites. - Run E2E locally as `VSCODE_CLI=1 pnpm test:e2e `. Without it, the launched VS Code overwrites the extension host's `PATH` with a login-shell snapshot; on a machine whose login-shell `node` is below the runtime floor, the User Node preflight (correctly) refuses and every fmt test times out waiting for a server. CI is unaffected — its PATH `node` is new enough either way. The heavier alternative, `--force-disable-user-env` in `e2e/runTest.ts`, was deliberately not taken: it would change env fidelity for every slice. diff --git a/packages/vscode/README.md b/packages/vscode/README.md index 1b23fc1..11fa3c1 100644 --- a/packages/vscode/README.md +++ b/packages/vscode/README.md @@ -40,7 +40,7 @@ The project-resolved packages are checked against a support matrix at runtime; a | -------------- | --------- | | `@rslint/core` | `>=0.8.0` | | `@rstest/core` | `>=0.6.0` | -| `rstack` | `>=0.6.1` | +| `rstack` | `>=0.7.0` | ## Auto-fix on save (Rslint) diff --git a/packages/vscode/e2e/fixtures/rslint/package.json b/packages/vscode/e2e/fixtures/rslint/package.json index 2cc1fcd..a8f7d8a 100644 --- a/packages/vscode/e2e/fixtures/rslint/package.json +++ b/packages/vscode/e2e/fixtures/rslint/package.json @@ -5,6 +5,6 @@ "type": "module", "description": "E2E fixture: a project detected as Rslint only, installed from the npm registry.", "dependencies": { - "@rslint/core": "^0.8.0" + "@rslint/core": "0.9.0" } } diff --git a/packages/vscode/e2e/fixtures/rstack/package.json b/packages/vscode/e2e/fixtures/rstack/package.json index 155a9af..80cbff4 100644 --- a/packages/vscode/e2e/fixtures/rstack/package.json +++ b/packages/vscode/e2e/fixtures/rstack/package.json @@ -5,7 +5,7 @@ "type": "module", "description": "E2E fixture: an rstack-cli project whose only config is `rstack.config.ts`, which lights all three stacks.", "dependencies": { - "rstack": "0.6.1" + "rstack": "0.7.2" }, "devDependencies": { "jiti": "^2.0.0" diff --git a/packages/vscode/e2e/fixtures/rstest/package.json b/packages/vscode/e2e/fixtures/rstest/package.json index 87fab39..8ed8c99 100644 --- a/packages/vscode/e2e/fixtures/rstest/package.json +++ b/packages/vscode/e2e/fixtures/rstest/package.json @@ -3,8 +3,8 @@ "version": "0.0.0", "private": true, "type": "module", - "description": "E2E fixture: a project detected as Rstest only, pinned to the launch floor `@rstest/core >= 0.6.0`.", + "description": "E2E fixture: a project detected as Rstest only, installed from the npm registry.", "dependencies": { - "@rstest/core": "^0.6.0" + "@rstest/core": "0.11.11" } } diff --git a/packages/vscode/e2e/lint/fixtures/package.json b/packages/vscode/e2e/lint/fixtures/package.json index 711708e..6bd1a10 100644 --- a/packages/vscode/e2e/lint/fixtures/package.json +++ b/packages/vscode/e2e/lint/fixtures/package.json @@ -4,7 +4,7 @@ "private": true, "description": "Shared install root for the Rslint E2E fixture workspaces. The extension ships no binary: every fixture resolves @rslint/core - including its native Go binary, config-loader and eslint-plugin host - from this one published-npm install. jiti backs the config-file-loader's TypeScript-config fallback.", "dependencies": { - "@rslint/core": "^0.8.1", + "@rslint/core": "0.9.0", "jiti": "^2.7.0" } } diff --git a/packages/vscode/e2e/lint/suite-eslint-plugins/plugin-pool.test.ts b/packages/vscode/e2e/lint/suite-eslint-plugins/plugin-pool.test.ts index f8d5ddc..d8830f3 100644 --- a/packages/vscode/e2e/lint/suite-eslint-plugins/plugin-pool.test.ts +++ b/packages/vscode/e2e/lint/suite-eslint-plugins/plugin-pool.test.ts @@ -53,7 +53,7 @@ function request(generation: string): EslintPluginLintRequest { generation, files: [], rules: {}, - fix: false, + collectFixes: false, suggestionsMode: 'off', }; } diff --git a/packages/vscode/e2e/lint/suite-jsconfig/config-transaction.test.ts b/packages/vscode/e2e/lint/suite-jsconfig/config-transaction.test.ts index 1d68af9..cc43d1f 100644 --- a/packages/vscode/e2e/lint/suite-jsconfig/config-transaction.test.ts +++ b/packages/vscode/e2e/lint/suite-jsconfig/config-transaction.test.ts @@ -6,8 +6,8 @@ // constant: `@rslint/core/config-loader` is resolved from the project at // runtime, so the adapter takes the loader's // `CONFIG_DISCOVERY_PROTOCOL_VERSION` as a constructor argument. The tests -// inject the devDependency's constant, which tracks the same `^0.8.0` floor -// as the fixtures. +// inject the devDependency's constant; the fixtures currently pin the same +// 0.9.0 release line. // - The watch-glob test asserts upstream's glob is kept verbatim, lockfiles // included. import * as assert from 'node:assert'; diff --git a/packages/vscode/e2e/rstest/fixtures/workspace-1/package.json b/packages/vscode/e2e/rstest/fixtures/workspace-1/package.json index eb1179f..0cdf478 100644 --- a/packages/vscode/e2e/rstest/fixtures/workspace-1/package.json +++ b/packages/vscode/e2e/rstest/fixtures/workspace-1/package.json @@ -4,6 +4,6 @@ "private": true, "description": "E2E fixture for the ported Rstest suites: upstream `tests/fixtures/workspace-1`, made self-contained on the published `@rstest/core`.", "dependencies": { - "@rstest/core": "^0.11.5" + "@rstest/core": "0.11.11" } } diff --git a/packages/vscode/e2e/rstest/fixtures/workspace-2/package.json b/packages/vscode/e2e/rstest/fixtures/workspace-2/package.json index 0a2c062..dbb82cb 100644 --- a/packages/vscode/e2e/rstest/fixtures/workspace-2/package.json +++ b/packages/vscode/e2e/rstest/fixtures/workspace-2/package.json @@ -4,6 +4,6 @@ "private": true, "description": "E2E fixture for the ported Rstest suites: upstream `tests/fixtures/workspace-2`. One install at the root serves both nested projects via the normal node_modules walk-up.", "dependencies": { - "@rstest/core": "^0.11.5" + "@rstest/core": "0.11.11" } } diff --git a/packages/vscode/e2e/setupFixtures.mjs b/packages/vscode/e2e/setupFixtures.mjs index c591905..8a95cef 100644 --- a/packages/vscode/e2e/setupFixtures.mjs +++ b/packages/vscode/e2e/setupFixtures.mjs @@ -1,10 +1,13 @@ // Installs the E2E fixture workspaces. // -// The fixtures install **published npm versions** of +// The fixtures install **exact published npm versions** of // `@rslint/core` / `@rstest/core` / `rstack` — the extension resolves all three // from the project, so a fixture that linked this repo's own node_modules would -// test nothing. Each fixture is its own independent install; `--ignore-workspace` -// makes sure pnpm never folds them into a parent workspace. +// test nothing. `rstack@0.7.2` itself pins `@rslint/core@0.9.0` exactly, so the +// Rstack fixture pins its lint core transitively. Each fixture is its own +// independent install; `--ignore-workspace` keeps test setup out of the parent +// workspace. Exact toolchain pins make installs reproducible without committed +// lockfiles, and Renovate bumps those pins. // // Idempotent: pnpm is a no-op when the fixture is already up to date, so // `test:e2e` can always run it. @@ -55,8 +58,8 @@ const install = (name) => { // A fixture is a standalone project, never a workspace member of this // repo: the whole point is a plain, published-versions install. '--ignore-workspace', - // Fixtures pin ranges, not a lockfile — a frozen lockfile would fail CI - // the moment a patch release lands. + // Fixtures pin exact toolchain versions rather than committing lockfiles; + // Renovate updates the pins. '--no-frozen-lockfile', '--prefer-offline', // Changing a fixture's install config makes pnpm want to purge @@ -65,10 +68,7 @@ const install = (name) => { '--config.confirmModulesPurge=false', // Fixtures deliberately install pinned published versions of the Rstack // toolchain, which are often hours old — disable pnpm's - // minimum-release-age supply-chain gate for these sandboxes. It must be - // a CLI flag: `--ignore-workspace` also ignores a local - // pnpm-workspace.yaml, and pnpm would otherwise auto-write exclusion - // files into the fixture. + // minimum-release-age supply-chain gate for these sandboxes. '--config.minimumReleaseAge=0', // pnpm's build-script gate exits non-zero on unapproved postinstalls // (e.g. core-js in the rstest fixture). These sandboxes install real diff --git a/packages/vscode/e2e/smoke/rslintPluginHost.mjs b/packages/vscode/e2e/smoke/rslintPluginHost.mjs index f689570..e622f88 100644 --- a/packages/vscode/e2e/smoke/rslintPluginHost.mjs +++ b/packages/vscode/e2e/smoke/rslintPluginHost.mjs @@ -92,7 +92,7 @@ const main = async () => { files: [{ path: SOURCE_PATH, configKey: PROJECT_DIR }], // The rule set Go would have computed from the config for this file. rules: { [RULE_NAME]: { options: [] } }, - fix: false, + collectFixes: false, suggestionsMode: 'off', }); } finally { diff --git a/packages/vscode/package.json b/packages/vscode/package.json index 22f6b9e..6cf9238 100644 --- a/packages/vscode/package.json +++ b/packages/vscode/package.json @@ -439,9 +439,9 @@ "devDependencies": { "@rsbuild/core": "~2.1.9", "@rslib/core": "^1.0.0-beta.1", - "@rslint/core": "^0.8.0", + "@rslint/core": "^0.9.0", "@rstackjs/load-config": "^0.1.2", - "@rstest/core": "^0.11.5", + "@rstest/core": "^0.11.11", "@types/istanbul-lib-report": "^3.0.3", "@types/mocha": "^10.0.10", "@types/node": "^22.16.5", diff --git a/packages/vscode/src/shared/nodeResolution.ts b/packages/vscode/src/shared/nodeResolution.ts index f3430ce..0404e77 100644 --- a/packages/vscode/src/shared/nodeResolution.ts +++ b/packages/vscode/src/shared/nodeResolution.ts @@ -21,10 +21,9 @@ import { * than per-project or per-stack. It is set by the strictest thing any of these * children do — load an `rstack.config.*` — and applying it uniformly, * including to projects whose config an older engine could load, is a - * deliberate simplification. It costs Node 20.19–22.17 — but Node 20 left - * support on 2026-04-30 (`nodejs/Release`), so the users it actually turns away - * sit on 22.12–22.17, a supported LTS line where the remedy is a patch-level - * update within 22.x. See `docs/adr/0001-node-runtime-selection.md`. + * deliberate simplification. It excludes Node 20.19–22.17, and the exact + * exclusions above that follow rstack's engines — see + * `docs/adr/0001-node-runtime-selection.md`. * * There is deliberately NO fallback to the VS Code Node runtime * (`process.execPath` + `ELECTRON_RUN_AS_NODE`). It would silently move the diff --git a/packages/vscode/src/shared/versionCheck.ts b/packages/vscode/src/shared/versionCheck.ts index f51d7fe..39063ed 100644 --- a/packages/vscode/src/shared/versionCheck.ts +++ b/packages/vscode/src/shared/versionCheck.ts @@ -10,23 +10,19 @@ import { readPackageJson } from './packageResolve'; * Launch floors (verified against npm): * - `@rslint/core >= 0.8.0` — explicit protocol-2 config selection. * - `@rstest/core >= 0.6.0` — the existing `MIN_CORE_VERSION` upstream. - * - `rstack >= 0.6.1` — the first release depending on `@rslint/core ~0.8.0`, - * whose lint shim the bridged lint worker pins (protocol 2). It also carries - * `rs fmt --lsp`; there is no stdin fallback for older releases, since the - * editor would then format through a code path it is not tested against. - * The floor is **uniform across consumers by decision**: the Rstest bridge - * checks the same entry, so an older rstack reports `version mismatch` for - * tests too, even when that stack's own API would still work. One matrix - * entry means "which rstack does the extension support?" - * has one answer; per-stack rstack floors were considered and rejected — - * they make the answer depend on which status the user happens to look at, - * for the price of keeping tests alive on releases the toolchain has moved - * past. The status message names the required version either way. + * - `rstack >= 0.7.0` — the first release whose lint shim sets `basePath` and + * itself pins `@rslint/core` 0.9.0, preserving project-relative config + * paths (#431). + * + * The rstack floor is **uniform across consumers by decision**: lint, Rstest + * and fmt all check the same entry, so "which rstack does the extension + * support?" has one answer. Per-stack floors were considered and rejected; + * the status message names the required version either way. */ export const SUPPORT_MATRIX = { '@rslint/core': '>=0.8.0', '@rstest/core': '>=0.6.0', - rstack: '>=0.6.1', + rstack: '>=0.7.0', } as const; export type SupportedPackage = keyof typeof SUPPORT_MATRIX; @@ -63,17 +59,18 @@ export const readPackageVersion = ( * * Native type stripping is what lets a worker load an `rstack.config.*` — * rstack's shim loads it with `loader: 'native'` and no jiti fallback. It was - * unflagged in 23.6.0 and backported to the LTS line in 22.18.0, so 23.0–23.5 - * compare above 22.18.0 yet predate it — hence a disjunction, not a plain - * floor. Verified: 22.17.1 reports `process.features.typescript` false, - * 22.18.0 reports `strip`. See `shared/nodeResolution.ts` for how candidates + * unflagged in 23.6.0 and backported to the LTS line in 22.18.0. The supported + * rstack line declares the same range in `engines.node`: Node 23 is unsupported, + * while Node 24.0–24.2 still emits the experimental type-stripping warning + * (rstackjs/rstack-cli#427). This range intersects the runtime capability with + * that declared contract. See `shared/nodeResolution.ts` for how candidates * are probed. * * `scripts/playgroundNode.mjs` regex-parses this exact declaration (it is a * plain .mjs with no access to TS exports) — keep the single-quoted literal * form if this constant moves or is reformatted. */ -export const NODE_RUNTIME_RANGE = '^22.18.0 || >=23.6.0'; +export const NODE_RUNTIME_RANGE = '^22.18.0 || >=24.3.0'; /** * `NODE_RUNTIME_RANGE` for human eyes, interpolated into the user-facing @@ -82,7 +79,7 @@ export const NODE_RUNTIME_RANGE = '^22.18.0 || >=23.6.0'; * to learn why they were refused. Logs keep the raw range, the precise * register there. Keep the two in lockstep. */ -export const NODE_RUNTIME_LABEL = '22.18+ (excluding 23.0–23.5)'; +export const NODE_RUNTIME_LABEL = '22.18–22.x or 24.3+'; /** * Classifies a version against a range; it does not decide what the classes diff --git a/packages/vscode/src/stacks/lint/CoreResolver.ts b/packages/vscode/src/stacks/lint/CoreResolver.ts index 54f7fcf..b3f33c8 100644 --- a/packages/vscode/src/stacks/lint/CoreResolver.ts +++ b/packages/vscode/src/stacks/lint/CoreResolver.ts @@ -40,11 +40,11 @@ import { RslintVersionMismatchError } from './status'; * One **Rslint core** the extension is willing to run, plus the folder-level * config choice the Lint worker needs on its command line. * - * `shimPath` is part of the runtime's identity, not decoration: protocol 2 - * locks `configPath` for the server's lifetime (ADR 0003), so a folder that - * flips native ↔ bridged must get a *new* runtime even when both modes resolve - * the same physical core. Upstream has no bridged mode and keys on the core - * alone. + * `shimPath` is part of the runtime's identity, not decoration: the supported + * config protocols lock `configPath` for the server's lifetime (ADR 0003), so + * a folder that flips native ↔ bridged must get a *new* runtime even when both + * modes resolve the same physical core. Upstream has no bridged mode and keys + * on the core alone. */ export interface CoreInstallation { /** Stable physical identity. Never merge cores by version text alone. */ diff --git a/packages/vscode/src/stacks/test/master.ts b/packages/vscode/src/stacks/test/master.ts index 462891a..7ec58e4 100644 --- a/packages/vscode/src/stacks/test/master.ts +++ b/packages/vscode/src/stacks/test/master.ts @@ -406,7 +406,7 @@ export class RstestApi { // // The status-aggregation adaptation: the one-shot `showWarningMessage` // becomes the shared `version mismatch` status bar state with actual vs - // required versions. The floor is the same `>= 0.6.0`. + // required versions. The floor comes from the shared support matrix. // Skipped after dispose: the project's status was already forgotten, // and a mismatch re-latched now — for a root that may never come back — // would have nothing left to clear it. diff --git a/packages/vscode/tests/shared/nodeResolution.test.ts b/packages/vscode/tests/shared/nodeResolution.test.ts index 556a002..db72f16 100644 --- a/packages/vscode/tests/shared/nodeResolution.test.ts +++ b/packages/vscode/tests/shared/nodeResolution.test.ts @@ -71,7 +71,7 @@ describe('resolveUserNode', () => { ...base, probe: versionsOf({ node: { kind: 'ok' }, - '/versions/24/bin/node': ok('24.0.0'), + '/versions/24/bin/node': ok('24.3.0'), }), probeShellPath: shellFinds('/versions/24/bin/node'), }); @@ -92,7 +92,7 @@ describe('resolveUserNode', () => { // that the node floor now follows the same rule as every package floor. const resolution = await resolveUserNode({ ...base, - probe: versionsOf({ node: ok('24.0.0-nightly20260101') }), + probe: versionsOf({ node: ok('24.4.0-nightly20260101') }), probeShellPath: never, }); expect(resolution.source).toBe('path'); @@ -103,35 +103,37 @@ describe('resolveUserNode', () => { ...base, probe: versionsOf({ node: ok('20.19.4'), - '/versions/24/bin/node': ok('24.0.0'), + '/versions/24/bin/node': ok('24.3.0'), }), probeShellPath: shellFinds('/versions/24/bin/node'), }); expect(resolution).toEqual({ executable: '/versions/24/bin/node', source: 'shell', - version: '24.0.0', + version: '24.3.0', }); }); - it('falls through a pre-23.6 Node 23, which does not strip types', async () => { - // 23.0–23.5 sit above 22.18.0 yet predate default type stripping — the - // hole `NODE_RUNTIME_RANGE`'s disjunction encodes. + it("falls through a Node 24.0–24.2 that rstack's engines exclude", async () => { const resolution = await resolveUserNode({ ...base, probe: versionsOf({ - node: ok('23.5.0'), - '/versions/24/bin/node': ok('24.0.0'), + node: ok('24.2.0'), + '/versions/24/bin/node': ok('24.3.0'), }), probeShellPath: shellFinds('/versions/24/bin/node'), }); - expect(resolution.source).toBe('shell'); + expect(resolution).toEqual({ + executable: '/versions/24/bin/node', + source: 'shell', + version: '24.3.0', + }); }); it('falls back to the shell node when no PATH node runs at all', async () => { const resolution = await resolveUserNode({ ...base, - probe: versionsOf({ '/versions/24/bin/node': ok('24.0.0') }), + probe: versionsOf({ '/versions/24/bin/node': ok('24.3.0') }), probeShellPath: shellFinds('/versions/24/bin/node'), }); expect(resolution.source).toBe('shell'); @@ -148,7 +150,7 @@ describe('resolveUserNode', () => { return Promise.resolve({ kind: 'not-found' }); calls++; return Promise.resolve( - calls < 3 ? { kind: 'not-found' } : ok('24.0.0'), + calls < 3 ? { kind: 'not-found' } : ok('24.3.0'), ); }, probeShellPath: never, @@ -297,7 +299,7 @@ describe('resolveUserNodeOnce', () => { const options = { ...base, - probe: versionsOf({ node: ok('24.0.0') }), + probe: versionsOf({ node: ok('24.3.0') }), probeShellPath: never, }; @@ -335,7 +337,7 @@ describe('resolveUserNodeOnce', () => { ...base, probe: versionsOf({ node: ok('20.19.4'), - '/versions/24/bin/node': ok('24.0.0'), + '/versions/24/bin/node': ok('24.3.0'), }), probeShellPath: shellFinds('/versions/24/bin/node'), notify: (message: string) => notices.push(message), @@ -365,7 +367,7 @@ describe('resolveUserNodeOnce', () => { probe: () => { calls++; return new Promise((resolve) => - setTimeout(() => resolve(ok('24.0.0')), 10), + setTimeout(() => resolve(ok('24.3.0')), 10), ); }, probeShellPath: never, @@ -390,7 +392,7 @@ describe('configuredNodeBelowFloor', () => { it('passes an explicit executable that clears the floor', async () => { expect( - await configuredNodeBelowFloor(configured, answers(ok('24.0.0'))), + await configuredNodeBelowFloor(configured, answers(ok('24.3.0'))), ).toBeUndefined(); }); @@ -424,7 +426,7 @@ describe('configuredNodeBelowFloor', () => { const counting = { probe: () => { calls++; - return Promise.resolve(ok('24.0.0')); + return Promise.resolve(ok('24.3.0')); }, }; await configuredNodeBelowFloor(configured, counting); @@ -441,7 +443,7 @@ describe('configuredNodeBelowFloor', () => { await configuredNodeBelowFloor('/opt/old/node', answers(ok('20.19.4'))), ).toBeDefined(); expect( - await configuredNodeBelowFloor('/opt/new/node', answers(ok('24.0.0'))), + await configuredNodeBelowFloor('/opt/new/node', answers(ok('24.3.0'))), ).toBeUndefined(); }); }); diff --git a/packages/vscode/tests/stacks/lint/coreResolver.test.ts b/packages/vscode/tests/stacks/lint/coreResolver.test.ts index cd2e802..2434316 100644 --- a/packages/vscode/tests/stacks/lint/coreResolver.test.ts +++ b/packages/vscode/tests/stacks/lint/coreResolver.test.ts @@ -37,9 +37,9 @@ describe('CoreResolver', () => { it('identifies a core by its real path, so a symlink is the copy it points at', async () => { const root = temporaryDirectory(); const store = writePackage( - path.join(root, 'store', 'core-0.8.0'), + path.join(root, 'store', 'core-0.9.0'), '@rslint/core', - '0.8.0', + '0.9.0', ); const link = path.join(root, 'app', 'node_modules', '@rslint', 'core'); fs.mkdirSync(path.dirname(link), { recursive: true }); @@ -59,8 +59,8 @@ describe('CoreResolver', () => { const root = temporaryDirectory(); const left = path.join(root, 'left'); const right = path.join(root, 'right'); - installPackage(left, '@rslint/core', '0.8.0'); - installPackage(right, '@rslint/core', '0.8.0'); + installPackage(left, '@rslint/core', '0.9.0'); + installPackage(right, '@rslint/core', '0.9.0'); const folder = folderOf(root); const resolver = new CoreResolver(); @@ -89,8 +89,8 @@ describe('CoreResolver', () => { // land on the same physical core. Upstream, which has no bridge, keys on // the core alone. const root = temporaryDirectory(); - installPackage(root, '@rslint/core', '0.8.0'); - const rstack = installPackage(root, 'rstack', '0.6.1'); + installPackage(root, '@rslint/core', '0.9.0'); + const rstack = installPackage(root, 'rstack', '0.7.2'); const shimPath = installShim(rstack); const folder = folderOf(root); const resolver = new CoreResolver(); diff --git a/packages/vscode/tests/stacks/test/bridge.test.ts b/packages/vscode/tests/stacks/test/bridge.test.ts index 00aee1e..b5ac5f2 100644 --- a/packages/vscode/tests/stacks/test/bridge.test.ts +++ b/packages/vscode/tests/stacks/test/bridge.test.ts @@ -43,7 +43,7 @@ const makeTmpDir = (): string => { * `dist/rstestConfig.js`. */ const createWorkspace = ({ - version = '0.6.1', + version = '0.7.2', shim = true, }: { version?: string | null; shim?: boolean } = {}): string => { const root = makeTmpDir(); @@ -101,7 +101,7 @@ describe('resolveRstackShim', () => { const shim = resolveRstackShim(configDir); expect(shim).toBeDefined(); - expect(shim?.version).toBe('0.6.1'); + expect(shim?.version).toBe('0.7.2'); // The same file `rs test` injects with `--config`. expect(shim?.configFilePath).toBe( path.join(configDir, 'node_modules', 'rstack', 'dist', 'rstestConfig.js'), @@ -197,14 +197,14 @@ describe('resolveRstackShim', () => { }); it('refuses an rstack older than the support matrix floor', () => { - const configDir = createWorkspace({ version: '0.6.0' }); + const configDir = createWorkspace({ version: '0.6.5' }); expect(resolveRstackShim(configDir)).toBeUndefined(); expect(reported).toEqual([ { kind: 'version-mismatch', detail: - 'rstack 0.6.0 is not supported, this extension requires >=0.6.1', + 'rstack 0.6.5 is not supported, this extension requires >=0.7.0', }, ]); }); diff --git a/packages/vscode/tests/stacks/test/master.test.ts b/packages/vscode/tests/stacks/test/master.test.ts index 03bd7e8..3c65594 100644 --- a/packages/vscode/tests/stacks/test/master.test.ts +++ b/packages/vscode/tests/stacks/test/master.test.ts @@ -399,7 +399,7 @@ describe('RstestApi with a configured nodeExecutable', () => { const settleVerdict = () => configuredNodeBelowFloor(configuredNode); it('should stay silent when the configured executable clears the floor', async () => { - await seedProbe({ kind: 'ok', version: '24.0.0' }); + await seedProbe({ kind: 'ok', version: '24.3.0' }); const { nodeExecutable } = await resolveWorkerNodeCommand(createApi()); await settleVerdict(); expect(nodeExecutable).toBe(configuredNode); @@ -447,7 +447,7 @@ describe('RstestApi with a configured nodeExecutable', () => { // The seed keeps the configured executable's probe off the real spawn // path, so the abort observed is the disposed check and not an earlier // resolution failure. - await seedProbe({ kind: 'ok', version: '24.0.0' }); + await seedProbe({ kind: 'ok', version: '24.3.0' }); const api = createApi(packageDir); const spawning = api.createChildProcess(); api.dispose(); @@ -466,7 +466,7 @@ describe('RstestApi worker spawn failures', () => { const seedConfiguredNode = (executable: string) => { settings['rstack.nodeExecutable'] = executable; - return seedNodeProbe(executable, { kind: 'ok', version: '24.0.0' }); + return seedNodeProbe(executable, { kind: 'ok', version: '24.3.0' }); }; beforeEach(() => { diff --git a/packages/vscode/tests/versionCheck.test.ts b/packages/vscode/tests/versionCheck.test.ts index 4db18ff..1a44685 100644 --- a/packages/vscode/tests/versionCheck.test.ts +++ b/packages/vscode/tests/versionCheck.test.ts @@ -1,8 +1,12 @@ +import fs from 'node:fs'; +import { createRequire } from 'node:module'; import { describe, expect, it } from '@rstest/core'; +import semver from 'semver'; import { checkPackageVersion, checkVersion, formatVersionMismatch, + NODE_RUNTIME_LABEL, NODE_RUNTIME_RANGE, SUPPORT_MATRIX, } from '../src/shared/versionCheck'; @@ -12,7 +16,7 @@ describe('support matrix', () => { expect(SUPPORT_MATRIX).toEqual({ '@rslint/core': '>=0.8.0', '@rstest/core': '>=0.6.0', - rstack: '>=0.6.1', + rstack: '>=0.7.0', }); }); }); @@ -22,7 +26,7 @@ describe('checkPackageVersion', () => { expect(checkPackageVersion('@rslint/core', '0.8.0').kind).toBe('ok'); expect(checkPackageVersion('@rslint/core', '1.2.3').kind).toBe('ok'); expect(checkPackageVersion('@rstest/core', '0.11.5').kind).toBe('ok'); - expect(checkPackageVersion('rstack', '0.6.1').kind).toBe('ok'); + expect(checkPackageVersion('rstack', '0.7.0').kind).toBe('ok'); }); it('accepts prereleases of a supported range', () => { @@ -46,10 +50,30 @@ describe('checkPackageVersion', () => { }); describe('node runtime range', () => { - it('pins every edge, including the 23.x type-stripping hole', () => { + it('pins every edge, including the rstack engine exclusions', () => { expect(checkVersion('22.17.1', NODE_RUNTIME_RANGE).kind).toBe('mismatch'); expect(checkVersion('22.18.0', NODE_RUNTIME_RANGE).kind).toBe('ok'); - expect(checkVersion('23.5.0', NODE_RUNTIME_RANGE).kind).toBe('mismatch'); - expect(checkVersion('23.6.0', NODE_RUNTIME_RANGE).kind).toBe('ok'); + expect(checkVersion('23.6.0', NODE_RUNTIME_RANGE).kind).toBe('mismatch'); + expect(checkVersion('24.2.0', NODE_RUNTIME_RANGE).kind).toBe('mismatch'); + expect(checkVersion('24.3.0', NODE_RUNTIME_RANGE).kind).toBe('ok'); + }); + + it("never admits a runtime the development rstack's engines reject", () => { + const require = createRequire(__filename); + const packageJson = JSON.parse( + fs.readFileSync(require.resolve('rstack/package.json'), 'utf8'), + ) as { engines?: { node?: string } }; + const engineRange = packageJson.engines?.node; + if (!engineRange) throw new Error('rstack does not declare engines.node'); + + // This is an alarm, not an auto-move: the floor remains an ADR 0001 + // decision; this only proves it never admits a runtime rstack rejects. + expect(semver.subset(NODE_RUNTIME_RANGE, engineRange)).toBe(true); + }); + + it('keeps the human label aligned with the range', () => { + expect(NODE_RUNTIME_LABEL).toContain('22.18'); + expect(NODE_RUNTIME_LABEL).toContain('24.3'); + expect(NODE_RUNTIME_LABEL).not.toContain('23.'); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 749d6fe..d96a4dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^11.1.0 version: 11.1.0 rstack: - specifier: ^0.6.4 - version: 0.6.4(jiti@2.7.0)(typescript@5.9.3) + specifier: ^0.7.2 + version: 0.7.2(jiti@2.7.0)(typescript@5.9.3) packages/vscode: devDependencies: @@ -24,14 +24,14 @@ importers: specifier: ^1.0.0-beta.1 version: 1.0.0-beta.1(typescript@5.9.3) '@rslint/core': - specifier: ^0.8.0 - version: 0.8.0(jiti@2.7.0) + specifier: ^0.9.0 + version: 0.9.0(jiti@2.7.0) '@rstackjs/load-config': specifier: ^0.1.2 version: 0.1.2(jiti@2.7.0) '@rstest/core': - specifier: ^0.11.5 - version: 0.11.5 + specifier: ^0.11.11 + version: 0.11.11 '@types/istanbul-lib-report': specifier: ^3.0.3 version: 3.0.3 @@ -104,8 +104,8 @@ packages: cpu: [arm64] os: [darwin] - '@ast-grep/napi-darwin-arm64@0.45.1': - resolution: {integrity: sha512-CthYcA0H3z5A2EHKH4rhSuFzpYUtxqUMnohmejxtMS6wiAgriKhOCopxN8XKclspYMtQyX2GC/PbvcU3dIbQHw==} + '@ast-grep/napi-darwin-arm64@0.45.2': + resolution: {integrity: sha512-29+sfXTJ7xxqgTuWAHA89gDAQIiJyAZ1ZiHoupjKIqyn0mhXrktO1WOghlDzyYs++hITEPOeXftxy48Y0tDGDQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -116,8 +116,8 @@ packages: cpu: [x64] os: [darwin] - '@ast-grep/napi-darwin-x64@0.45.1': - resolution: {integrity: sha512-PhlXMDEEH5fMjXjYcrbeNgGqrojj4zN8C7eMQC6M4pVkuW74uPhrblD4KUbNunp5I2LkWCdKOs36jhBaZe1iPw==} + '@ast-grep/napi-darwin-x64@0.45.2': + resolution: {integrity: sha512-PUjh7Zf4dKNzYLOYhX5wU6O4BgRPdJnD9zkS1n+/5SeK0U1L5YL486RjNgFt9Xyff0PGtP/wDeoHMF5PhKEwsw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -129,8 +129,8 @@ packages: os: [linux] libc: [glibc] - '@ast-grep/napi-linux-arm64-gnu@0.45.1': - resolution: {integrity: sha512-XScjs95/SrsV6kLl9MnF2qbqwKU79bcBA3JHi6xUu+hf0uZ0lc6MsZ595cEy5yw9PYRhgqwrT3wta9p4qU4jpg==} + '@ast-grep/napi-linux-arm64-gnu@0.45.2': + resolution: {integrity: sha512-bnGKLLHWO13pjPChOFq7Ifqj3HJdOAxMQAGDCUC2JSJhO2YL8/xBZrpN0cHIWNuoUNSAXjCtr5AsCnPz/3jlFg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -143,8 +143,8 @@ packages: os: [linux] libc: [musl] - '@ast-grep/napi-linux-arm64-musl@0.45.1': - resolution: {integrity: sha512-qjH5CN5KIUdJW2dHfp8W57QsP6H0mA6E/rboKEzAxw6Ant1q2ZKqE3bLHUZMDoZXOBGdCODSZm0bTDcctiP49g==} + '@ast-grep/napi-linux-arm64-musl@0.45.2': + resolution: {integrity: sha512-FXVb4/V55THjhKxi5zWVrAO8JQj+/DiYP7JLsqenkm5V3UNuC8p2opGOyQpUvNpvcqJiZA9Hl+Onj/yfwSVr/A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -157,8 +157,8 @@ packages: os: [linux] libc: [glibc] - '@ast-grep/napi-linux-x64-gnu@0.45.1': - resolution: {integrity: sha512-nPP0y5EnehCgmYqvVDKSvH4vHbEFdAi8L+Kq2Sz94vK32yv4eOWf9vWhgoPscWpw76GWuwhpDvME8SZARnS3DQ==} + '@ast-grep/napi-linux-x64-gnu@0.45.2': + resolution: {integrity: sha512-mtEIPLV9MW2PBswFcp3ydM4T5Ub73s89SRd0QMT2+DfA9XBLCLhnC+r/Yt4eRgnf8FyNx49bFTPxXvFKscr9hw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -171,8 +171,8 @@ packages: os: [linux] libc: [musl] - '@ast-grep/napi-linux-x64-musl@0.45.1': - resolution: {integrity: sha512-sg50LKH7TskWd/boWVFp9gwKc3Jd8sg0f8P6T2VQemX/EOj+OFaMJ2+y7Ok17WI/dODkrZgAPUwq7RAvMzLtqg==} + '@ast-grep/napi-linux-x64-musl@0.45.2': + resolution: {integrity: sha512-WLLHxDmuXkb/e3mz/xDCrB2dZPzv1ntsepuRTtpaIGczxnQTgFSzX/CXPD0e1MfsU/QL1AiXxxni8w+NGy/ZpQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -184,8 +184,8 @@ packages: cpu: [arm64] os: [win32] - '@ast-grep/napi-win32-arm64-msvc@0.45.1': - resolution: {integrity: sha512-wnTmD34OD9bUpdBVTb58P0y+YPb/2C2g07zj96LSk5R4pdcEMrCFsrWZlaNwtEV4q7L9BfLgrxq3MBGI8c6doA==} + '@ast-grep/napi-win32-arm64-msvc@0.45.2': + resolution: {integrity: sha512-04iOFaMzD2nf8CKw3nURWN42900wqPtUTQaMo1I2KRk3qbgtHSJjJoVJGAWUXkCq4LhPg3Xlk1s+ssWf4rNm2A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -196,8 +196,8 @@ packages: cpu: [ia32] os: [win32] - '@ast-grep/napi-win32-ia32-msvc@0.45.1': - resolution: {integrity: sha512-gRyJwRPY1mWRtnJ6AMncV2pNU+B2indjLCb9z/+aZrUN5u/gOxYryEzvRatyC9rVUMeQGJD+k0htpsqIwgXVbA==} + '@ast-grep/napi-win32-ia32-msvc@0.45.2': + resolution: {integrity: sha512-tE3y0RQcajocKwpYLbgHKd4lzGGAx1wGMA0bGPsWdoFK8VSob6ZDuYdSlSdnaRs8jAc4F3axToNRKn15p+0/Dg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -208,8 +208,8 @@ packages: cpu: [x64] os: [win32] - '@ast-grep/napi-win32-x64-msvc@0.45.1': - resolution: {integrity: sha512-mzfMmCO7tSNks+NGkGkSnDBKxBjHoOLAMJt2IbAkMYATxHC0RqfBoN7Qtd02VGhHWEfwWLPv/wU6MrvweZ3jdQ==} + '@ast-grep/napi-win32-x64-msvc@0.45.2': + resolution: {integrity: sha512-o8Z5Z42TAJe0fPnb11rrjtte58wlw/MuR4KpVMHl8IhJLBBR7gHR0E8wfMz88TxzsQz0U2KYev0k0a2fV4i0sQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -218,8 +218,8 @@ packages: resolution: {integrity: sha512-Hb4o6h1Pf6yRUAX07DR4JVY7dmQw+RVQMW5/m55GoiAT/VRoKCWBtIUPPOnqDVhbx1Cjfil9b6EDrgJsUAujEQ==} engines: {node: '>= 10'} - '@ast-grep/napi@0.45.1': - resolution: {integrity: sha512-4cmGQEHoP9GLHEhGvd1vgSzO3Y6KF7FczDk4+q/VfXV9/9sNxNVgNHC8t3BglhIADDcoHrCMc9aw4lHG+M240A==} + '@ast-grep/napi@0.45.2': + resolution: {integrity: sha512-hBA5c7JV6OM7zFWoLjUNZhsDpxEIEIeew5S3z1giwK5tPQqobuFfM2OhS45bN3E0+yQtgCX/o8/AEHKbGD3ykg==} engines: {node: '>= 10'} '@azu/format-text@1.0.2': @@ -636,16 +636,6 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@rsbuild/core@2.1.13': - resolution: {integrity: sha512-Z+6MzmjOio4+bFZQ24k+7ge/oNCOdXIunAssrswTNE8AIf6mcyXpJZevRXRiOEMZasRPA8VNyh+9JngQLg729Q==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - core-js: '>= 3.0.0' - peerDependenciesMeta: - core-js: - optional: true - '@rsbuild/core@2.1.9': resolution: {integrity: sha512-yqf1hFZ3wbMYI431LqsxLH3r0VZkfyarVKTf7kMeIiGe0YLwsrgsfp+sKpIyVkQkq60J0qyp6l/CoqqsQZqEwQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -656,8 +646,8 @@ packages: core-js: optional: true - '@rsbuild/core@2.2.0-rc.0': - resolution: {integrity: sha512-f6orjv+wOR1u7KchE/vANGP0Eg7AP0UaiM0qn4n+5I0HOUdkVVbNCA1eZSpyX+TJ9bIdZtkbR6T47vBdoFr1MA==} + '@rsbuild/core@2.2.3': + resolution: {integrity: sha512-oJrYtYDhb7AMwY8HIda2hgMuuxHkYPYar4svdS5uTq0fXY0M1wLfllkTQz0d729pNJ4S//6GUM1WX5LsW2mFLw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -666,8 +656,8 @@ packages: core-js: optional: true - '@rslib/core@1.0.0-beta.1': - resolution: {integrity: sha512-HHPZ+wTUKT/3bEhw2y0JB0O62wMuljkSHVZelLbSGhBflCaUt+D3LohBcIxYW6bhzPbUp4gkJXo1pdTpxiuNLQ==} + '@rslib/core@1.0.0': + resolution: {integrity: sha512-eZNXCWU1v5oti4+DKCunc76DkNnYqMgRtks9UyZRRFlmaK4pKAxhejeCUS+XkbMurGIAa+aDyVynQD7DXEgK1w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -679,8 +669,8 @@ packages: typescript: optional: true - '@rslib/core@1.0.0-rc.1': - resolution: {integrity: sha512-xKK79mKdxhqi+tNpbIaJgAUWv1RkH5En+W6eBflXUJGhoSacx97iCoLLQl9mAIti0c7l3zpGlvOlnwxTP2llaQ==} + '@rslib/core@1.0.0-beta.1': + resolution: {integrity: sha512-HHPZ+wTUKT/3bEhw2y0JB0O62wMuljkSHVZelLbSGhBflCaUt+D3LohBcIxYW6bhzPbUp4gkJXo1pdTpxiuNLQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -692,17 +682,8 @@ packages: typescript: optional: true - '@rslint/core@0.8.0': - resolution: {integrity: sha512-MfMC6lxiXoKPWsYRu9fuAxWA9mCD/I4E5Aa6Sl20a6q5w8r2C12fJM+bceC01AMGYuvWygKHqS3QBJdJHjniRw==} - hasBin: true - peerDependencies: - jiti: ^2.7.0 - peerDependenciesMeta: - jiti: - optional: true - - '@rslint/core@0.8.1': - resolution: {integrity: sha512-cqpDcgJ8TgBC+I/OZkICze0sSNcsdjtxNCv01fQTYvgIvBkwbhNlg4celD3XEPfA8B2B2H/woYgeaX0IPEeTMA==} + '@rslint/core@0.9.0': + resolution: {integrity: sha512-rY8F6kdQ/XkBiflaNzglJdMfxl0Lv/NFXppK0kAhx2P2CvogsXIA/z82Wxtk+Cg9uFHou67N9/iqmWXgdtSoDw==} hasBin: true peerDependencies: jiti: ^2.7.0 @@ -710,333 +691,197 @@ packages: jiti: optional: true - '@rslint/native-darwin-arm64@0.8.0': - resolution: {integrity: sha512-Bo6kXL1/TkjVUl6maZ3Sw+JEnZUkgpUD35v06jyBTcjpxlXE6yqFj66NAzB/G2CVu220ADp/FEE7l2Kocrefhg==} + '@rslint/native-darwin-arm64@0.9.0': + resolution: {integrity: sha512-xhdBrVALZTX0v4ZghKY7RGO87DpItk4DVvKm3MGih4w1o2WF2u+6n/mohvG7/ts7c8T88HIbLfK4luQ8kMDCsg==} cpu: [arm64] os: [darwin] - '@rslint/native-darwin-arm64@0.8.1': - resolution: {integrity: sha512-HlucYn3RLELMHRjlvKcr0vPlE/2RUs6BVn5ClRKFcLShON4j+q8NWaIPHwY5zrQjqq7GJxX3b/7G9skU+TrQ2w==} - cpu: [arm64] - os: [darwin] - - '@rslint/native-darwin-x64@0.8.0': - resolution: {integrity: sha512-F5pabdH7dluxoj7PGuQjPYuoNU+yxnctcJzqrb/CZ122FLP3uJPrbiLufh+ZF9e5ui700rNyb7macJqnHlBV2w==} - cpu: [x64] - os: [darwin] - - '@rslint/native-darwin-x64@0.8.1': - resolution: {integrity: sha512-HV4FOwq3ofuoMkUxjEyGvaOGyr79OzFhAIpMcT9uOO6BxEA/PndepwBAPmkBt33aewm2oPKM2khsC582XTsxew==} + '@rslint/native-darwin-x64@0.9.0': + resolution: {integrity: sha512-xuluXYUKizRZD/70WILvn+OeNdBT6izU81vhiNHVYdEQmfsqaqE8fthKGmQvaRu/DNL3CgVRPR+PzOAcQzPpOw==} cpu: [x64] os: [darwin] - '@rslint/native-linux-arm64-gnu@0.8.0': - resolution: {integrity: sha512-SSgSjyaeXI032Wk8bq6VmkLQTWOEqHZH5MWAk3831pd/G2rWr2XcoDi5Wf6w0o2rSCeYzkYbIejOePYwIKT4Lg==} + '@rslint/native-linux-arm64-gnu@0.9.0': + resolution: {integrity: sha512-J9uHBg/8Z9WanEKBXaPNZz0h+P8qtOLwjVqwEcOwYm1yLHRY70A7XqI6cRVIx72gXKGWtNBT2BRw9p8CWQUhgg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rslint/native-linux-arm64-gnu@0.8.1': - resolution: {integrity: sha512-O9kvvw2O7WAzeBAp7KSfXVbyl4Q4hAY1rUSRpeJp9hOY3yQUipE98qF29QicbXTRsoZZooMTmrjV/0EiYGL8OA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rslint/native-linux-arm64-musl@0.8.0': - resolution: {integrity: sha512-50VDZQFAc9kp6rbOUOjyppVjC3d3AdbOJyA6JxlhK3mp8a/8sPIqWG0BlfcN/7ZpwdZrFsQt2Ds+0yMXITfu5A==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rslint/native-linux-arm64-musl@0.8.1': - resolution: {integrity: sha512-I92YjEMPcdeXz29rGuWR7kKjlek3LG/kcLHaBop6ucYkAXbuwdCwALM/JKxjcnRjoEZA3qR4QCRu92Llbzh+Ig==} + '@rslint/native-linux-arm64-musl@0.9.0': + resolution: {integrity: sha512-3ICIPH1oZOuMuZp+4hRhU+Af34U/2MNFB1yN+yi/jfJP+qBEExQbeBOS4J6HOecx9RJXcFvPF2ZI68l4g8/DPQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rslint/native-linux-x64-gnu@0.8.0': - resolution: {integrity: sha512-wfc/UfnuTBAofwLPK5MLB2Hus1YYnsxP2MVchp380fUvMfQuGFPzz1WOAUY66zqrsrDKpUJsh3V1bx7c8DTlJA==} + '@rslint/native-linux-x64-gnu@0.9.0': + resolution: {integrity: sha512-vlzcruA/t+0XvdK2S0bIS00H9Mpkrwo/hIFvpyUONgxi2WaO7XNDtgTWAsajB40WmvezYYLKs45LgkVXpxSCFA==} cpu: [x64] os: [linux] libc: [glibc] - '@rslint/native-linux-x64-gnu@0.8.1': - resolution: {integrity: sha512-9uh4XygsKs2lj7JWM2yi92qjrgrXM7slppAgTQnFfkiRoKASVt4M2anSiJfs2v5hU3UhsmVotXAOYtWoV5Hd3g==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rslint/native-linux-x64-musl@0.8.0': - resolution: {integrity: sha512-MTYcAMz6IZWb6ZmLo12pakCBA8mS3EW9cOI0jd3At6vs0Yia9YbeOAUiWbIC4Z9yyp75b8ZQCQMRSnY6rDnbaA==} + '@rslint/native-linux-x64-musl@0.9.0': + resolution: {integrity: sha512-+gPExuOtSPaP7jAWeMRnTobvQOhaqo9857K/7T2qvc15ksnYqqygMhzcVzm9Wt7L4KBoW6PR1uvwgmPaK4B0IA==} cpu: [x64] os: [linux] libc: [musl] - '@rslint/native-linux-x64-musl@0.8.1': - resolution: {integrity: sha512-pcWlxs9ZLaETAoDaYcO6f8jeuE+nZliIVrhCJ1eWX+aTB+WPKHVHK6dFMPjxqsvUtwbK1zfpTeo8rOaeGRrSfQ==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rslint/native-win32-arm64-msvc@0.8.0': - resolution: {integrity: sha512-hids2jgNWBxZf2mSBLZJxubWRLWlJapEfeJHVokzjpRpBZZNv7O06enoyXSb4Lswff9WaHssIqu1sfZIc9lC2g==} - cpu: [arm64] - os: [win32] - - '@rslint/native-win32-arm64-msvc@0.8.1': - resolution: {integrity: sha512-GGRcKGBOQs7WsxSfXWRQnY15nRyikaDajWoefhKnYVj+AMg6BEWWsdH3Q2xOOuVMGNCC/SoXUAGb9cGpV7Smdg==} + '@rslint/native-win32-arm64-msvc@0.9.0': + resolution: {integrity: sha512-YK5uTuk6zNXru2cOwivbZPH25C7u8RSQlKm5tOqwhaQ0ShCVDdh7z0SXvHvLdQ2VJen+30Vp1izAMZ7Zp/8KaQ==} cpu: [arm64] os: [win32] - '@rslint/native-win32-x64-msvc@0.8.0': - resolution: {integrity: sha512-bun7uURKl6NdChwmw/i2mk3Yj9klZQyh1uRbIQG0RDEJ9oTIbU5M3c7K5sd/Rukat0TVCGgbBAzR+YB0DAXPZQ==} - cpu: [x64] - os: [win32] - - '@rslint/native-win32-x64-msvc@0.8.1': - resolution: {integrity: sha512-rokvuC3MKTNMbGU5eh/p6a715xzl1yZvjh9gQByNPKGHrF3OUmqN1c6QGCtlNU8HGHekvMS9dUNzjTCoMenZjQ==} + '@rslint/native-win32-x64-msvc@0.9.0': + resolution: {integrity: sha512-7elW5V8zm3McqA0LCjBBR7SDwQ5hRW+hrnJcCmrspSnBeUPFqnJfvUvsQPgbJz3pdrkBzzjZMvUgEYyBQ9dl8A==} cpu: [x64] os: [win32] - '@rspack/binding-darwin-arm64@2.1.10': - resolution: {integrity: sha512-DZlcTpbIb2mjeS1aSG4k01UH33Zj7T+k8ZylPK6HmsKs4JvK4wgpWFC78WVv3p/Aj3MZS6DwtDLwpZ2Ihj/fpg==} - cpu: [arm64] - os: [darwin] - '@rspack/binding-darwin-arm64@2.1.7': resolution: {integrity: sha512-DwxzrXRctueP/3Pyom9JHcIsRShuEAlHb+mrE5OPT+4cdHI1UnJpbzEvEDLTo4IKJhDb3vjXdHLtjqtL0SYbeA==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-arm64@2.2.0-rc.0': - resolution: {integrity: sha512-Uvy3YnN1pCLe+2/8hF06KiCPegf8ztOuM3VE/p0MJKRitkL5DPoZVHyc40zl6e+O5WB/9tJ5tnEgRG9pDWxFng==} + '@rspack/binding-darwin-arm64@2.2.2': + resolution: {integrity: sha512-/le/AvV4HSinXTPs2Lqpujxt189Z5T10Ggt96QzckLRPvIchzqoavVDDjltzC7XcaZ87XCH/X06jNKgzkcBBNA==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@2.1.10': - resolution: {integrity: sha512-my/0h2LwxCRT6cg3oDDC2e0ZOxQLVajAdIcv0fqnQk5JRNvVuL89PuTutitnSqie1A0/JSL8OQz5XHwmoS3kow==} - cpu: [x64] - os: [darwin] - '@rspack/binding-darwin-x64@2.1.7': resolution: {integrity: sha512-kPbrYvR/XUHfAMgRVq3QnC71DW/qjwsPj+3hEUuEnRmlploPNy9u8Szf1IHKSVUSrVZBTgDyMoZQdxYLfhResw==} cpu: [x64] os: [darwin] - '@rspack/binding-darwin-x64@2.2.0-rc.0': - resolution: {integrity: sha512-UQO0PgLarsA0lv96uqCTAH1eAnAIPHb+qhMfds5ubWKZgKlr0taGQl253C3DN5pfzbHWfNQgAfVUaVMydm9czw==} + '@rspack/binding-darwin-x64@2.2.2': + resolution: {integrity: sha512-uFIcUPUXiPxM6ljenLafp5TemT8eLZm1riRn8fJYmpqNCK+aCcTaud18XHZpI5SjzzcY+xUHfVShgvNzKXuf2g==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@2.1.10': - resolution: {integrity: sha512-laevn9g+E5PAUEGqiKe6Ju5KApsuQYp+bPI17XS3Lkl8eqL5pS/BmHYU7QMlst4GzV8+wlruVTMh//+st6Vqzg==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rspack/binding-linux-arm64-gnu@2.1.7': resolution: {integrity: sha512-VFB+YXM3kZ6IIuLV64H3vgnwqvQIIaqfR/aeGwuxYvwcZsrgblSBmXMeDULdgDjqP8Yr0VaFMBBiD9OtG5KdFw==} cpu: [arm64] os: [linux] libc: [glibc] - '@rspack/binding-linux-arm64-gnu@2.2.0-rc.0': - resolution: {integrity: sha512-ZggL6W9ckpvhqIPi7K3zDRiEaQd5Co2qRnN5J8OMmBkQlvYQek0CE/SZHFcZsDM0//6+0mkI+VjaTeWdvqJsaQ==} + '@rspack/binding-linux-arm64-gnu@2.2.2': + resolution: {integrity: sha512-Pjby4pDSMNJQK2VBzpgCj6lb+DGuenS1fEDb6xi5/apbJb9v5WE+e43Mz7i+XqgXS8e846pjaONV3KM5WKB1LQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@rspack/binding-linux-arm64-musl@2.1.10': - resolution: {integrity: sha512-V71+Qz5G72+ROZXrJn5zxOszdG1AEbO8pcC/itXXtf4yRR6a3bVHKNKGhipBNxb8eI6cnD/01FH1h3ZG655jLw==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rspack/binding-linux-arm64-musl@2.1.7': resolution: {integrity: sha512-Mzbxyg0aJ+ITj526Iuz0enEDYY6WxhFIwEKXqwjQh+Vpd5v/+aPzPo83sSQVX/3puBV1sbmviTURbh6N9e1fvA==} cpu: [arm64] os: [linux] libc: [musl] - '@rspack/binding-linux-arm64-musl@2.2.0-rc.0': - resolution: {integrity: sha512-MfDTg9fn/17lRtGMsHLK8BQJs+AEtTsVMWOg1CMou/ls8IrucXoFZ9Ux0i2Jq1ph1ZiKgr4l7pMzdk3SXpNiQg==} + '@rspack/binding-linux-arm64-musl@2.2.2': + resolution: {integrity: sha512-0u9O7tTVT2z+F6o/eEY6f6+My8Jn9U56QiBwkfy90ZaoAfZyQSSTxqaK/zA7W43oFxQefeCpiPas27VUzrSakw==} cpu: [arm64] os: [linux] libc: [musl] - '@rspack/binding-linux-ppc64-gnu@2.1.10': - resolution: {integrity: sha512-U7HlNzHcDtZ+LYOtOJmtx67kHEybZzUUAaP7aEXjGYO5WTCgh/176sW2UYP0rmZLrgUNFUuzn+B98RLaClNaVg==} + '@rspack/binding-linux-ppc64-gnu@2.2.2': + resolution: {integrity: sha512-N3lVnhq5qOvpmP5n386JzR1GcE8HzAqq4/r440Z6yle9m7PhVFJ6oXVWxgaDTYV0mtv9YLJmaG+YrjYfUa1vuA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rspack/binding-linux-ppc64-gnu@2.2.0-rc.0': - resolution: {integrity: sha512-n84s99eIMr/4xQ1XCctxtu4AnchukynuyJ4DaJ4vlcRKVdFAnPSpUH669rAxztsby5xa3ftAASmxwXhMUFzMsg==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rspack/binding-linux-riscv64-gnu@2.1.10': - resolution: {integrity: sha512-GMGTJpy9/ecE+5F5IfxZH4bXv0Wx/b2TiehTlCbTksbL+pKpLHYy0rwGdjWDKbmBkhxMMqPiC7PDnn9LbdnnLA==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@rspack/binding-linux-riscv64-gnu@2.1.7': resolution: {integrity: sha512-mpazwgT/Pse1720mvEJsoXfPkJ+enj0xUqpbe/wL6aedwjGT+9jJNB8HTJXE4XBX0UO7umGqcJMeKA6YsD2CDA==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rspack/binding-linux-riscv64-gnu@2.2.0-rc.0': - resolution: {integrity: sha512-s5bg/LlwnMSVXZfR16KGO3jVWUpobbPp90qE2DXwfaFpcLmMweUnANERM2mCpIiW3MuVnTAXTEjvEcxfB4mXEw==} + '@rspack/binding-linux-riscv64-gnu@2.2.2': + resolution: {integrity: sha512-ReClZyp32/rJkUDV/oGDU0X6BCFyEkTR6r4stFwm/qOOaG6mUMRzZe4gur8Yh979p4Hiz9EdkmfEHY02GBXcaQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rspack/binding-linux-riscv64-musl@2.1.10': - resolution: {integrity: sha512-rkurnAWc04vIbzG1QCrPBWSJadZvaOt1mazFH3EdiJO8VUiu0I1T9zdiwuDOPrd50lOKIZlcTXbd5aaAkWEnvQ==} - cpu: [riscv64] - os: [linux] - libc: [musl] - '@rspack/binding-linux-riscv64-musl@2.1.7': resolution: {integrity: sha512-oU/l3soPRsDEWn7KZic+npyTMM2N1kRdHjoJ+L5IUBXs8bjdTXPLoyTbTdIOza5ZSoT4+UeEiEryj4BB0tQE5w==} cpu: [riscv64] os: [linux] libc: [musl] - '@rspack/binding-linux-riscv64-musl@2.2.0-rc.0': - resolution: {integrity: sha512-XNjEnkrNv67CZ4/IhkPQVfNkz9JHevelgZspzuuJOOyn+Z9b1m8JN+shv5Kq06sSudN9aQpLLa6slbHlKGv9lA==} + '@rspack/binding-linux-riscv64-musl@2.2.2': + resolution: {integrity: sha512-mqsorvTNerr3r8zI35NFTPYATPDlhepdiUhZjKT6ylqpHlP7vLU9fp4aEMK/CuTv2f+IVsa0+iZqtMxHs2tSjw==} cpu: [riscv64] os: [linux] libc: [musl] - '@rspack/binding-linux-s390x-gnu@2.1.10': - resolution: {integrity: sha512-X+DyxkriZEAF/wihI7ERDv+CAS0mbMv36aEuQ+vXzTlvS6cSmpou/r29AHbvIF3NlG1UeAbDVlOs9QrMBZjpUQ==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rspack/binding-linux-s390x-gnu@2.2.0-rc.0': - resolution: {integrity: sha512-OQpj1j6Jfy+YBYDSGwJisZZEXS3g0Y/M5xlb26yqlZBKA/7kamCMDccUPTKNpuJaRQXK1DUerBsA+AK8TELG3g==} + '@rspack/binding-linux-s390x-gnu@2.2.2': + resolution: {integrity: sha512-ql2Jub8QYWSugBppmj2u0SjcIj6fOQuAaLCYQOqU7zbvz/uuWTfoqmdWKExwrxeCU9Tzt7emVM0ETuVEpoca+A==} cpu: [s390x] os: [linux] libc: [glibc] - '@rspack/binding-linux-x64-gnu@2.1.10': - resolution: {integrity: sha512-Fat09V6jUuyo9qG7Wyj9cQ31VDfLmokXyBtGqKxY5OvSWHereB7QUub5btbPXHwbp6Iq4aAQyUbbLTzvR1YaBw==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rspack/binding-linux-x64-gnu@2.1.7': resolution: {integrity: sha512-7Gtpl3h3jtnOpk1mYQE8mRndXAO2ibI8mnAbs7klevdKey+ZHneWMoMi2yOMQhhI/ifWEFxDzyGJ8bdxo0XTsA==} cpu: [x64] os: [linux] libc: [glibc] - '@rspack/binding-linux-x64-gnu@2.2.0-rc.0': - resolution: {integrity: sha512-1QoW+7zjApCgL4v5P14AmnxfvOMCk131abSBCl/+u6h/aIainSwpf+O3ar0FqvkQaSPPOQJrg03ys57WyEwlAQ==} + '@rspack/binding-linux-x64-gnu@2.2.2': + resolution: {integrity: sha512-MNYKYEHrtIVEno2q5rgpou/JVffRwn109xPK3kxct95EojHsniNa8jwy6eEHeOazP4EN60Si7NElE3aQ6JssHw==} cpu: [x64] os: [linux] libc: [glibc] - '@rspack/binding-linux-x64-musl@2.1.10': - resolution: {integrity: sha512-lhHOnIJ4ClpIlA1f1L8aoxEZivYLjnjq5A6jKKz7BKsm+cHK8kqqEm6lO5KqA5xQT0Lonq1o28bmKHEj6JHInw==} - cpu: [x64] - os: [linux] - libc: [musl] - '@rspack/binding-linux-x64-musl@2.1.7': resolution: {integrity: sha512-w+whI2Uy+DYkGN+MVkzMFWweL7B/s1gMqX+nvTE1vhOy3hGV0VyA9H6lqWjSD3I+eGkpYhN9Pr244cYnLpZOUQ==} cpu: [x64] os: [linux] libc: [musl] - '@rspack/binding-linux-x64-musl@2.2.0-rc.0': - resolution: {integrity: sha512-KLN4bIC3M1dSEuPBX1SPOEkBRyZnnIx8vBjfIFFpKa1bw/CsOHDF7Y6IAAsf9hir7dH3cUd4vaPSCVRM4KiTDw==} + '@rspack/binding-linux-x64-musl@2.2.2': + resolution: {integrity: sha512-y9/9CmE8lrECaF17GAhacibTL+SvlEPEotQnUuBFC/WFtXh8hU2E7a7bAkpYGSLH6kM0nrJZHO3hTvM1wdWOJw==} cpu: [x64] os: [linux] libc: [musl] - '@rspack/binding-wasm32-wasi@2.1.10': - resolution: {integrity: sha512-KY5YbWbuvYcoaLXnV+vzZOvGRCeb6jt4EpVpKdph1h1IJjwX/ju15EQ+GOe3iecZEdf0OttQcNVcwBkLkFT9ag==} - cpu: [wasm32] - '@rspack/binding-wasm32-wasi@2.1.7': resolution: {integrity: sha512-cDVgvzRdTgxaeM+a5Lx0+7/VAvunvwO0wNtQ3ATQGOtFCW5b7cUzhNPcytH5ZSJTnFWuxinlGwtar5yfcnkdZQ==} cpu: [wasm32] - '@rspack/binding-wasm32-wasi@2.2.0-rc.0': - resolution: {integrity: sha512-2Vvtckz5DNghQKQKwghfM4j30MOu7t9J7mbUCCi7mTUccpy7Cnr0HPmSV9Jx4sUj6vgQEV+8lIAIxNDNtr0Vhg==} + '@rspack/binding-wasm32-wasi@2.2.2': + resolution: {integrity: sha512-VbDIjjeFwZvMSKAOGY5IbU6lLzt6AHHHncTdMMkZ94Xk7O2BOHe9BXDV32Ln29TIW2C8m1fdxfPZWDiecVghUQ==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@2.1.10': - resolution: {integrity: sha512-z4GWzMLofaDGpAt9Z+MlN88LlUBDm+zM6R2GdOOPM6/4g/h3/+47OP7casmSL3AwTGYBEJqogwt08sRSosB6Cg==} - cpu: [arm64] - os: [win32] - '@rspack/binding-win32-arm64-msvc@2.1.7': resolution: {integrity: sha512-JDd85+iYwUvaG9Zrt5X7oIxRZRiTW+76FwkRakoXNy/5VAWQW32Jq4ESjSVz6l6mh0KnZxPq3TLMugacCPnLjw==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-arm64-msvc@2.2.0-rc.0': - resolution: {integrity: sha512-enPqTT2sdt6HgItyk6SA6ubvZ2UXkFIpwhsCuoL83z9vHoDw/Y8obC8L92nIuK6FDP17tokm/r1SFPhDZJIYcg==} + '@rspack/binding-win32-arm64-msvc@2.2.2': + resolution: {integrity: sha512-rfcNg0W3ZPZvXma1gTyEt9/Z8FxASIaQr+sMWTSaTPPaeU3xY1+0hYcrD0kUFNs3/5L4u63myI4R8qRXiuW3pA==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@2.1.10': - resolution: {integrity: sha512-7qcWdsZ+GuGtzKjqgy7wTN7Dso/ezIY8yhx1r2yIbcczdmXj4FhaEampMDp/25HwtKwIGBBoh6HHSt3JWxpTUg==} - cpu: [ia32] - os: [win32] - '@rspack/binding-win32-ia32-msvc@2.1.7': resolution: {integrity: sha512-y9PKEs6v9BLHV0i/4eaIRtxpATvSgcf/VYQkMT8mp+qWlPjUwDQNwU2ueWVGpff6INO+YAa7zobzziNFRgO7Lg==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-ia32-msvc@2.2.0-rc.0': - resolution: {integrity: sha512-qYeZLJDfboqkWmNcqazjUcld2QegyErDJVaCfAPm2mnneMmKhQWsOs/DmlqRfC4ePaQN9uOtu26iLwKy2o1sgw==} + '@rspack/binding-win32-ia32-msvc@2.2.2': + resolution: {integrity: sha512-TFPvr9RZw9oHIhooDhXHzWjKcHpGPTxkznSeM2poIWU0CdEuua2rVUfsrriTF1Dmx+9kMly61DQmyOHCbb+b2g==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@2.1.10': - resolution: {integrity: sha512-pgp23pLrzfhGnKycxzr7ifP17lAbWZEfnx1bX8gXtYrnpJ66DRNyTKSzxB6sa/HBWjS1L8PX5TjMZ44WfPydqQ==} - cpu: [x64] - os: [win32] - '@rspack/binding-win32-x64-msvc@2.1.7': resolution: {integrity: sha512-BjkOzcPY/K8YlRRvyywz0mDWk89MMxqAMhDmgBXCWorh1IjgKTsWDJ2lCGIM8M9CZXUG3khom8AfrOGwRT2I+g==} cpu: [x64] os: [win32] - '@rspack/binding-win32-x64-msvc@2.2.0-rc.0': - resolution: {integrity: sha512-bvzp27ZvpZW1vcCG/srk/K/6cffcR/kqDUcW8dWEMFlntPSBTml9lOC4ouSBpU7n/qIwG6hKE56FaTWWapc3Lw==} + '@rspack/binding-win32-x64-msvc@2.2.2': + resolution: {integrity: sha512-GvEGyL594dtWN9SoVnKWh0exrM8WLInaUjwcuA2JKbCi1ak/9iHxip/U1dY3DuVqBYBhmvYq96JPbl91xnzFjg==} cpu: [x64] os: [win32] - '@rspack/binding@2.1.10': - resolution: {integrity: sha512-vnu/UP5HnrND15lO9+VeG6eUrbTyycHNQNQ3XEiRiFojuoiGZkIZC3Hbzr8qQH44C6vScPODEPvvIVvLcO2LpQ==} - '@rspack/binding@2.1.7': resolution: {integrity: sha512-wYqi8TY30hsIzLry503o/Uqu7y9Ec7pEwN5TVmB7Pb3xHrR2eHsQPzdpF/GkCLUjQSgD2Es3CDVV1mr6zO/78g==} - '@rspack/binding@2.2.0-rc.0': - resolution: {integrity: sha512-/Q9ysTd5ajEbIS+Sv61trElR7pWAa5LvcWNrYT+AKI9APsVwy4Y3CIPjEkd7jYeNHl1PJWSLCOUy+BzRUICDUg==} - - '@rspack/core@2.1.10': - resolution: {integrity: sha512-YSS2/Xxz8uiG/KXDkqOoA3dTetNo/vysk7bAexQOrU8iuq7JuzDTTAwLKvWZnwmvME8M8m5wcM4YvfIwYmidHA==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 - '@swc/helpers': ^0.5.23 - peerDependenciesMeta: - '@module-federation/runtime-tools': - optional: true - '@swc/helpers': - optional: true + '@rspack/binding@2.2.2': + resolution: {integrity: sha512-gWjKDQfVQJSBh/I+y9WTlyERsiShSJ7eI6Yl0SJs/6gjx8t4ixuwWCsaEFFjwSL4nSn6ML5hNQ7UFY3gj72BWA==} '@rspack/core@2.1.7': resolution: {integrity: sha512-d5Ju3zXzGgbqQWvlMlLUtek2eFPIzsFe2QOF4nwTAknxo/4OZ64t+kPT9nM6fr3aZX93VK0R3v02/kZYIRrV9Q==} @@ -1050,8 +895,8 @@ packages: '@swc/helpers': optional: true - '@rspack/core@2.2.0-rc.0': - resolution: {integrity: sha512-2LAdAFF/ZdnBRltI+IievGhysby9LESxvELxS1ZVkPc1F6ZAJ1skIcCNOLmfZeoYwQ5nXZjdUCbCf9MFDMWJjg==} + '@rspack/core@2.2.2': + resolution: {integrity: sha512-/yztfDZR5syIPBrUpzBpL+6fhhl0IHBPcXlNr4tOMBULbocFIz7Z4/cqvf1ix0DBbKpIGx99v6N1IDbk2gi8hw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 @@ -1062,89 +907,89 @@ packages: '@swc/helpers': optional: true - '@rstackjs/cli-darwin-arm64@0.6.4': - resolution: {integrity: sha512-mr+vVKE3uNzj9n7jzvWVDsEeDpoCCtk0pJN3evro1EVSsi703vzZuR0KNYI1VgjHvzO7re55cHCuQ0GhQHXPGw==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-darwin-arm64@0.7.2': + resolution: {integrity: sha512-po/JUgHx7DZ+Kmrbyy3L0/xr3rlZfVEk0Oy4D2xsjmAa3bHhP63B5XCOCyArLAZeMOqYPze9VaOcgWmGN5qWwQ==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [arm64] os: [darwin] - '@rstackjs/cli-darwin-x64@0.6.4': - resolution: {integrity: sha512-jmpV9ca1ftYh3kKsR4/7k5NlKjghBnQGOvvHvB6KxOWUF7Wwk/3Tntd49ERImtIEIV6DSqsnSXOCCwLftUjlMw==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-darwin-x64@0.7.2': + resolution: {integrity: sha512-RFgUgUUXC3ZLF2iKJplsK2Ty49VkVw+rR8y5Hgf+3BAUn9ffRCUAqscWQGPCrJZENVbTEUWDyEVCMNnUpM6+Ww==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [x64] os: [darwin] - '@rstackjs/cli-linux-arm64-gnu@0.6.4': - resolution: {integrity: sha512-U+X+Fjp1H/sE3uaZPkNadmSxLkJzqK+iQ9TaUWIBfvE2pM5OnXTwlRLEy4r9nswFdIA/FoU1ysDGr8amreBU6Q==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-arm64-gnu@0.7.2': + resolution: {integrity: sha512-pNUbP/Bd962FznXLiJHnCcxpP/l1L9wmLsdIh43T8MQkY4m0Rv/s5tpA1rRcoqYHymhnVqWFcBAWxAPTSnOFFQ==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rstackjs/cli-linux-arm64-musl@0.6.4': - resolution: {integrity: sha512-98Jjp99CSmiKk+omjdJd4FE6HWfP3ieShzhbDd09LagpTP86eVnCL9UbRT7u5zed3G8IEQavOAHOiCDrkI9pgw==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-arm64-musl@0.7.2': + resolution: {integrity: sha512-cOC1WNNAZEeUxA0Lvbkk0ZBGMQIhKcjlZZinwGkg6zHJ7jxW42/SvwjNdnXv1xEpQd59OGJ1aSR1/Gt7PpItzw==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [arm64] os: [linux] libc: [musl] - '@rstackjs/cli-linux-ppc64-gnu@0.6.4': - resolution: {integrity: sha512-Cak8uSTUEXLtWMRNswAh7B1ikQ6TtTP5bthEroeTQhRMYAmA1a5KeVnVNm7wttE5PDHKG0GsSHf8SgwxnuwNUA==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-ppc64-gnu@0.7.2': + resolution: {integrity: sha512-jOk/KA3gpNapZO8y0Pc99XG7kjtgz6ndOGqKczgYD7VWBZcnMvD2KKI1GmeLxLf+9v0NiLtefj1CCtFEbqwXKg==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rstackjs/cli-linux-riscv64-gnu@0.6.4': - resolution: {integrity: sha512-9Oe2yXxYI9iEPbiPMhh94nXUTqmptdIij6gD/F//i1w+uXBqVGw+li6FTvtAsqUjMFO3AowbCYzhExHO8bYAfw==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-riscv64-gnu@0.7.2': + resolution: {integrity: sha512-8fukS3qf1nrvYDQ4886gWphHsg9gyktSkUUudSEFkamKKKOCmdZn+tDUvEebxYiqQCUEC/mqkUc/jg7EQKvP7Q==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@rstackjs/cli-linux-riscv64-musl@0.6.4': - resolution: {integrity: sha512-oPX7MhLNQG/rm+Z23u13zrxrjkfg5iqO9Y9ot7xrpeBWpxxH4wm1kPpMTL3tY+bMihJy/IMhc4WOjDgQe6WqEA==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-riscv64-musl@0.7.2': + resolution: {integrity: sha512-AciMUbdFgC/bDP05iuC13x4uPDISkyx2S9KiWDnjhs7bCjHv19bhPeOGLnpUWjAL86LxbHNuk+rM8wdt1da4gg==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [riscv64] os: [linux] libc: [musl] - '@rstackjs/cli-linux-s390x-gnu@0.6.4': - resolution: {integrity: sha512-hGlu3ZK6JjCxi2yrBhZhfWWBPrwpV1229/owDQDXYo/nvKZubp7+o8mrJoC0oFUdyvYvCQKGonWFimLOKjhDOw==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-s390x-gnu@0.7.2': + resolution: {integrity: sha512-pj5V7Thbdc0FfK7Ngl3wLish7S0Yyy/ZmlH0Qd9UEMrNwMyMoyR+ZAJaWRjv7LFJQegPZNKBEgXfDc6Yeg7KjA==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rstackjs/cli-linux-x64-gnu@0.6.4': - resolution: {integrity: sha512-YCpS6zHFtJkYw4kwrYxSgjIMA6AuwkNxTIXaYkU59bvAzSJw0CZNpjbbvL6lielVrgJZ+majogBFIJJNHW38Qg==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-x64-gnu@0.7.2': + resolution: {integrity: sha512-25Xzm2SXyDA1WkXrcHQym1ZI71ZK4n9AD32+0UT8IhVF+FGDBw0WG2UeOIr5XcaCCxgjGw1qec4aZ4GEd0/6vg==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [x64] os: [linux] libc: [glibc] - '@rstackjs/cli-linux-x64-musl@0.6.4': - resolution: {integrity: sha512-4Goc9RT5xb3D4xfHVnymAyhL92BkhCm5IIJ6EvNl0HqcgMEC9Tpf3uu4S1fqnNZxtqwrCyk6CxEkpJ7rUHZlAQ==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-linux-x64-musl@0.7.2': + resolution: {integrity: sha512-77E3zZ5nrIP86nh40mMOvAu547a8qPDfTcKUQU/4fVjcE7g7zX17gQGGOHubzoqWRxv5abTABkG/ovhxqZ8bwQ==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [x64] os: [linux] libc: [musl] - '@rstackjs/cli-win32-arm64-msvc@0.6.4': - resolution: {integrity: sha512-NJAXOMz6fbWaXwf+M+Z3yPddsh4xdXKFXVIwwZgu5LtzDTndBpGZIGqfWKRorsizrF8dVOb/0WL/YzdXKPP0RQ==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-win32-arm64-msvc@0.7.2': + resolution: {integrity: sha512-fg8vRphmnXZQIC0lo757rwbFJS1s7Ft9RT9BzaJrqEcMWinxHx9HtKCddJ1scEpgu5Al8Vws74KYu2XNcUFUbA==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [arm64] os: [win32] - '@rstackjs/cli-win32-ia32-msvc@0.6.4': - resolution: {integrity: sha512-sjDfDaPJtZED5F8uz1fohECOUCyd7WXdXYl3vEiY+juuAxyPG6GK/cqUq5NtXNO1JNlCJaxnpCYnZBUAW7cF6w==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-win32-ia32-msvc@0.7.2': + resolution: {integrity: sha512-veUcxZ+ZqGzkkRYfkKj0GHlIKxR3NKm/Va4taifZLFXcqDFrSAmoueXTfhIzsLrNII+g85gizyaMdjytWhw8Lw==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [ia32] os: [win32] - '@rstackjs/cli-win32-x64-msvc@0.6.4': - resolution: {integrity: sha512-C8O/i8n8UW3UUvGbIbVy6m1yf08bGFDA2LirJ3F1f5Ihl78AKQj78eLHjwQW+PFmpmUMP/Jwk3zaUvTRiC4GYw==} - engines: {node: '>=22.12.0'} + '@rstackjs/cli-win32-x64-msvc@0.7.2': + resolution: {integrity: sha512-E/+K2W+GtezTLaOZ87erMyWOEbivKZiN/m/Iqeg8UJrfp9Zkqm7yIhQnYwG+KxN0gp3qjB/zxlcYdN5fnnhOWQ==} + engines: {node: ^22.18.0 || >=24.3.0} cpu: [x64] os: [win32] @@ -1156,21 +1001,8 @@ packages: jiti: optional: true - '@rstest/core@0.11.5': - resolution: {integrity: sha512-ySXZaFqU1mJonm79ko7OwagG2AurULg1dLDErJguhv/sepEyjt39sq2Bpt42mOxHehiFcl0Pr0PrlaPltmYbbA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - happy-dom: ^20.8.3 - jsdom: '*' - peerDependenciesMeta: - happy-dom: - optional: true - jsdom: - optional: true - - '@rstest/core@0.11.9': - resolution: {integrity: sha512-bU8jL1TruGsqHs0innQ4CheBmCLclBkifQ/6KhjofZe6ZQNv9/lsDUarnvUjF7ElByDju2rVyCuiQeDTQRatFg==} + '@rstest/core@0.11.11': + resolution: {integrity: sha512-7Ii2/2/ex1Oa0Kg5Qk5RKx2+e0I83BHLwH0/gn1B7IDwXCh5msFCF7yTyVGFuMltlm3E8Cf4QD7jadOEaBfXfw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1352,8 +1184,8 @@ packages: cpu: [arm64] os: [android] - '@yuku-parser/binding-android-arm64@0.9.0': - resolution: {integrity: sha512-Wm/kEWpUkB1etH6N8+4Rcv3dlYO5asapNlaOEQBqsZc2LAl0TrCYMrx+pQTV+AmQE+JDbSYLzFjtHfLLvJ4W1Q==} + '@yuku-parser/binding-android-arm64@0.9.3': + resolution: {integrity: sha512-z3tDGTaUXD5Q4IuebFOY/QHxhR/SqujMhkMv9C5bh25upyFEXdafp0MsXQIIheWhVZzn5VMOniyxFni/7s9LgQ==} cpu: [arm64] os: [android] @@ -1362,8 +1194,8 @@ packages: cpu: [arm64] os: [darwin] - '@yuku-parser/binding-darwin-arm64@0.9.0': - resolution: {integrity: sha512-6OAkwsfjIwLE8f/Seu61MjoK3+WHl2KfdkUFxBq2kuz2+H1e1CFFRL5SXQb2WV1BA8kVbl6JFFsS48XJcUzxOQ==} + '@yuku-parser/binding-darwin-arm64@0.9.3': + resolution: {integrity: sha512-hzKvKSKS7z3ufnu1VkQYEoxmS6A5uNnkwukKnc2atxpWdq648nLVOqut4h1jUXjbM2WcoTfuZLF6AHAGFf8cmg==} cpu: [arm64] os: [darwin] @@ -1372,8 +1204,8 @@ packages: cpu: [x64] os: [darwin] - '@yuku-parser/binding-darwin-x64@0.9.0': - resolution: {integrity: sha512-TIR+Tkm56bDPl5U1QKR3NaAt5Rrr9TmvEX6/j4Nz1bGgWBcRkaWaPNm5ear+M+obMQqNsKhCGSUtpE0wTKzv1w==} + '@yuku-parser/binding-darwin-x64@0.9.3': + resolution: {integrity: sha512-OM2PiVlPATvzlj/KGHNlu+t8FC3YzM5joVNjhsz/EaigQ8x2UUQ1Q0agQLiv5GZ2L8TSzrLUwBCZ7YOvP8q+tw==} cpu: [x64] os: [darwin] @@ -1382,8 +1214,8 @@ packages: cpu: [x64] os: [freebsd] - '@yuku-parser/binding-freebsd-x64@0.9.0': - resolution: {integrity: sha512-KWUk89CD+ldIDl5Wa0cVEq5o/PY3MtcfrzEzy2yYFbezzaE/J7k9ioOBof7YwFSzPGDWgt2WZwC/DufwjSIifA==} + '@yuku-parser/binding-freebsd-x64@0.9.3': + resolution: {integrity: sha512-WMn9M4LHNVysGNwsAJ9gpRPqQIW2lcPrDNGcyk0agx3IYqCJq1MQugh6Be8Otc5U08eGdE39o8Kx9YWJmXz7GA==} cpu: [x64] os: [freebsd] @@ -1393,8 +1225,8 @@ packages: os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-arm-gnu@0.9.0': - resolution: {integrity: sha512-T3xhIVqrjeOn+rEURRZnUg+T34wvB6hCKWg+rIhkAE14pjnCQ/8oUussDk68tGBdq4pZUPhtksw0D2As7xIq1Q==} + '@yuku-parser/binding-linux-arm-gnu@0.9.3': + resolution: {integrity: sha512-vqKjwiyW1FWvbykYMEQIcAJwA17WxK3rxxqDuyCvQwcNVaLEUxI4BXiUdlF3kHucc7MnoFQhoRPkySgOzlLM+Q==} cpu: [arm] os: [linux] libc: [glibc] @@ -1405,8 +1237,8 @@ packages: os: [linux] libc: [musl] - '@yuku-parser/binding-linux-arm-musl@0.9.0': - resolution: {integrity: sha512-g3EEh5tYUqhhrcJr+VLjHAKu91PlIq1WwWnlcy9UTVd9TjGX0ZZ8QA4HeYeEb/WwjAscITXF7viHMLHEkqVbzw==} + '@yuku-parser/binding-linux-arm-musl@0.9.3': + resolution: {integrity: sha512-qohilhYOT+zkt2gYzym4F1T6BzRdvPqS9/sFB03pmnVV8LrvjOXVsGwEBAa3CEvzJKhAZjdTmVz7zsVdjyHWLg==} cpu: [arm] os: [linux] libc: [musl] @@ -1417,8 +1249,8 @@ packages: os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-arm64-gnu@0.9.0': - resolution: {integrity: sha512-/iubliwkPbZPMVV/REE+MjZ0O55RzJs1Qt8eTDWfqsGefJzCqbBEN2F63KP/Oryu6ZJaPLQ/VSYvPFjTeXfV9w==} + '@yuku-parser/binding-linux-arm64-gnu@0.9.3': + resolution: {integrity: sha512-tvTIyUvTGkeee68i4JIo9o27As+Ug6LXOZvElGgFbTs6+KBdb5LGhvugaIQljdfIsm2XnIbOLG6OnQSXHMLB9w==} cpu: [arm64] os: [linux] libc: [glibc] @@ -1429,8 +1261,8 @@ packages: os: [linux] libc: [musl] - '@yuku-parser/binding-linux-arm64-musl@0.9.0': - resolution: {integrity: sha512-F1hgfSXcPEl3F6fDi6f5arPfm3wrTitVHWWCVf9VUP33ZGlxeFfbc+8qDRARHnNT48OwIFmgrGhm13WmKFRWOw==} + '@yuku-parser/binding-linux-arm64-musl@0.9.3': + resolution: {integrity: sha512-OWZBHW1wuChBpFlrF+On1yiBcFPMRrj2g0VKsM/PCBGffu1OM0ORkS+vLS3Snu6wYwndM5Dd9Ctvux6eUlrQjA==} cpu: [arm64] os: [linux] libc: [musl] @@ -1441,8 +1273,8 @@ packages: os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-x64-gnu@0.9.0': - resolution: {integrity: sha512-FNLAkP2WB/M3mnnG18f6Bm+CZtId6377g2tcQk79zDeGP2yssaQyXOFKji5lRqop/AVoZWNo8m45zPxxoEsJbw==} + '@yuku-parser/binding-linux-x64-gnu@0.9.3': + resolution: {integrity: sha512-/tbk1h0dlADOCngbiQO9V3SHwBIJkoGBq8BDEraSw2CC3nGxPEPTCCYUDp5738Ij2FxVwy1FWVuhFkHvpMrPbQ==} cpu: [x64] os: [linux] libc: [glibc] @@ -1453,8 +1285,8 @@ packages: os: [linux] libc: [musl] - '@yuku-parser/binding-linux-x64-musl@0.9.0': - resolution: {integrity: sha512-q4fxNn9dZWbKRl79NuekdXNNGz58gu2uy3GjJmghDghDPVukEGhaNqNjYN5XZq7mo7L6EDj5IcUtyMPQlhTWqg==} + '@yuku-parser/binding-linux-x64-musl@0.9.3': + resolution: {integrity: sha512-u3+0sCso/mcjDvtc3866D2giV7l34PDyDVBkMesAWa3DWbIWPlybehi2SSnmScgArV22ctqSSgUzdBBVJ6zYAg==} cpu: [x64] os: [linux] libc: [musl] @@ -1464,8 +1296,8 @@ packages: cpu: [arm64] os: [win32] - '@yuku-parser/binding-win32-arm64@0.9.0': - resolution: {integrity: sha512-tVzfdCycadoBrtONw9O2skhjGozQDJKHt/PLfH7pf5jVsCpi5OpWI4ZKNxQKhPI91CqUCqR2kVtXebFML0c7Zw==} + '@yuku-parser/binding-win32-arm64@0.9.3': + resolution: {integrity: sha512-xnGEvdhyjRkXozHtpXVpEEkyGZWAxJ3RoILv7XRV5SvTEztaTCk5GQyfcOzI9An/EJtcL4ERCI8QmS0TpDPJiA==} cpu: [arm64] os: [win32] @@ -1474,16 +1306,16 @@ packages: cpu: [x64] os: [win32] - '@yuku-parser/binding-win32-x64@0.9.0': - resolution: {integrity: sha512-mVXePNGj/N2MMQvtks3wE53QCpg0D2I6SpFwmVHT5gsAdOvlK2onLyFOkNCpIWDjpEu749z3QQZzBeIymkLsGA==} + '@yuku-parser/binding-win32-x64@0.9.3': + resolution: {integrity: sha512-N5eShGcuwnrXEprePFmEjtng6acZmtnC4zgazK9xxkavcx1q1uX8Nz8lU5RS973EMlNr902cIc6Cd2D4tqZDBg==} cpu: [x64] os: [win32] '@yuku-toolchain/types@0.8.3': resolution: {integrity: sha512-9LN3HYs3A9qSPVFunsxlbfwBcUgexti3TmhOzIxB/UH8zFuaHQJXTRDcN17DW6cp1GsyZtiZA7f18uIra36Jag==} - '@yuku-toolchain/types@0.9.1': - resolution: {integrity: sha512-GhfAIaKmtC4fCKJVnzP6bdGhWZSd7U9Sk7/lexEfROQPDNzuFE9lZKrcIWqzgGVcIMqKvtvFxnfEIaZ5WiroyQ==} + '@yuku-toolchain/types@0.9.3': + resolution: {integrity: sha512-rFE+5P4g2wxko5C85MugJOlVjBHEQq87dIkhLkniLXLp63PEtgaFjD954i5HXlfnyzLxPcZHsSOVDVgmo1HToA==} agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} @@ -2475,8 +2307,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rsbuild-plugin-dts@1.0.0-beta.1: - resolution: {integrity: sha512-hAEjOXhfIHR4erqjsqjRvA9Yqzc6Thry06tHheXDJUVwmR3VbN8BSMDC8kBZzyKdypDF0IJ98FmLQRiC194sMA==} + rsbuild-plugin-dts@1.0.0: + resolution: {integrity: sha512-FVoTsiTfSc0LPeSjrVhpvFOBRig0YXJq3Hp+bVxzh9/bzFvODzLRWOEux8q1Phe1oVCIIVSc2+Nb7kDcxIhosw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@microsoft/api-extractor': ^7 @@ -2488,8 +2320,8 @@ packages: typescript: optional: true - rsbuild-plugin-dts@1.0.0-rc.1: - resolution: {integrity: sha512-erD9AHYfEr5I7yCI9z2qR3NJTnwl1JgmFErjiVeOo7cKjItzaG2QrOqmlYM0DAfzPTktTznPaqpmqkr1kI6pqA==} + rsbuild-plugin-dts@1.0.0-beta.1: + resolution: {integrity: sha512-hAEjOXhfIHR4erqjsqjRvA9Yqzc6Thry06tHheXDJUVwmR3VbN8BSMDC8kBZzyKdypDF0IJ98FmLQRiC194sMA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@microsoft/api-extractor': ^7 @@ -2501,9 +2333,9 @@ packages: typescript: optional: true - rstack@0.6.4: - resolution: {integrity: sha512-pDSqK4dPHpWmiLRmqBstJQ32WLFrWaRnWEgU03ev4ejC3uI9kuV2P6kXyNEuavCrYEXlBWL0Yl41lxljNRRq9w==} - engines: {node: '>=22.12.0'} + rstack@0.7.2: + resolution: {integrity: sha512-A0nL89XfrcA1tqhX7WmA+6p7ogMr4oWSYaPH1h+Kybl/e4+mEQAO/GCVA2BPsoUsSx8KltC3wUkmuhkKtoQojQ==} + engines: {node: ^22.18.0 || >=24.3.0} hasBin: true peerDependencies: '@rspress/core': ^2.0.17 @@ -2696,8 +2528,8 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@2.1.0: - resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + tinypool@2.1.2: + resolution: {integrity: sha512-9YodfrxS9g9IbFr/KOjE5bAeJ0p61n3bW6mqvy0jtoeKd1kTW1Cxm0oulm6KX2lyM9Gl6WIe8nEbY7LWv5ZJww==} engines: {node: ^20.0.0 || >=22.0.0} tmp@0.2.7: @@ -2890,69 +2722,69 @@ packages: yuku-ast@0.8.3: resolution: {integrity: sha512-8x34yU5uhHUnJXzy2Qvjvec/vE9BzS0/2khVT1MsLmSLO/P8Q1Wp8IxHv+IhD+HMYETk6kherOSvP4JPWw2joQ==} - yuku-ast@0.9.1: - resolution: {integrity: sha512-JN45kc3sxzv/bDGug063IsIHu6LTkL1vDQUL/m1zvIFBIvMRtYivyRp5LjtMbZtIWnNjV6jaAvHPA1f70yD6gg==} + yuku-ast@0.9.3: + resolution: {integrity: sha512-Kt0PXlPCXdKF1fWFTl7N3DaxsVk6DHF8VAXHJMkwPtJnWYgbx20pYgGSweuC/86mIM7k1NUITQ4JffgOLUWTCw==} yuku-parser@0.8.3: resolution: {integrity: sha512-KPQcpF9aj77ywlJBIkQWCQ9DObdxnCA8AJdUOmA5CZZx042Xt4+dvbQmPJfWxF3E+KG5dVAZ2fBKuDJ8VsKWgA==} - yuku-parser@0.9.0: - resolution: {integrity: sha512-B8azpS7EuyRyNBRYHPhMiBDsvlI01mxDapQqkEjd3QjTdx6d+io9xiAx52xl0IIHV53GPseo39LUlsbKK/CS6g==} + yuku-parser@0.9.3: + resolution: {integrity: sha512-96wPoHnwaXfkZv7UIOUkDb+s7ZH8lv8Qtg+MxdvHUV1LFa5jV9iKOaams1942YQt+krFQrWiD6lSg2ermv5kHA==} snapshots: '@ast-grep/napi-darwin-arm64@0.37.0': optional: true - '@ast-grep/napi-darwin-arm64@0.45.1': + '@ast-grep/napi-darwin-arm64@0.45.2': optional: true '@ast-grep/napi-darwin-x64@0.37.0': optional: true - '@ast-grep/napi-darwin-x64@0.45.1': + '@ast-grep/napi-darwin-x64@0.45.2': optional: true '@ast-grep/napi-linux-arm64-gnu@0.37.0': optional: true - '@ast-grep/napi-linux-arm64-gnu@0.45.1': + '@ast-grep/napi-linux-arm64-gnu@0.45.2': optional: true '@ast-grep/napi-linux-arm64-musl@0.37.0': optional: true - '@ast-grep/napi-linux-arm64-musl@0.45.1': + '@ast-grep/napi-linux-arm64-musl@0.45.2': optional: true '@ast-grep/napi-linux-x64-gnu@0.37.0': optional: true - '@ast-grep/napi-linux-x64-gnu@0.45.1': + '@ast-grep/napi-linux-x64-gnu@0.45.2': optional: true '@ast-grep/napi-linux-x64-musl@0.37.0': optional: true - '@ast-grep/napi-linux-x64-musl@0.45.1': + '@ast-grep/napi-linux-x64-musl@0.45.2': optional: true '@ast-grep/napi-win32-arm64-msvc@0.37.0': optional: true - '@ast-grep/napi-win32-arm64-msvc@0.45.1': + '@ast-grep/napi-win32-arm64-msvc@0.45.2': optional: true '@ast-grep/napi-win32-ia32-msvc@0.37.0': optional: true - '@ast-grep/napi-win32-ia32-msvc@0.45.1': + '@ast-grep/napi-win32-ia32-msvc@0.45.2': optional: true '@ast-grep/napi-win32-x64-msvc@0.37.0': optional: true - '@ast-grep/napi-win32-x64-msvc@0.45.1': + '@ast-grep/napi-win32-x64-msvc@0.45.2': optional: true '@ast-grep/napi@0.37.0': @@ -2967,17 +2799,17 @@ snapshots: '@ast-grep/napi-win32-ia32-msvc': 0.37.0 '@ast-grep/napi-win32-x64-msvc': 0.37.0 - '@ast-grep/napi@0.45.1': + '@ast-grep/napi@0.45.2': optionalDependencies: - '@ast-grep/napi-darwin-arm64': 0.45.1 - '@ast-grep/napi-darwin-x64': 0.45.1 - '@ast-grep/napi-linux-arm64-gnu': 0.45.1 - '@ast-grep/napi-linux-arm64-musl': 0.45.1 - '@ast-grep/napi-linux-x64-gnu': 0.45.1 - '@ast-grep/napi-linux-x64-musl': 0.45.1 - '@ast-grep/napi-win32-arm64-msvc': 0.45.1 - '@ast-grep/napi-win32-ia32-msvc': 0.45.1 - '@ast-grep/napi-win32-x64-msvc': 0.45.1 + '@ast-grep/napi-darwin-arm64': 0.45.2 + '@ast-grep/napi-darwin-x64': 0.45.2 + '@ast-grep/napi-linux-arm64-gnu': 0.45.2 + '@ast-grep/napi-linux-arm64-musl': 0.45.2 + '@ast-grep/napi-linux-x64-gnu': 0.45.2 + '@ast-grep/napi-linux-x64-musl': 0.45.2 + '@ast-grep/napi-win32-arm64-msvc': 0.45.2 + '@ast-grep/napi-win32-ia32-msvc': 0.45.2 + '@ast-grep/napi-win32-x64-msvc': 0.45.2 '@azu/format-text@1.0.2': {} @@ -3394,13 +3226,6 @@ snapshots: dependencies: quansync: 1.0.0 - '@rsbuild/core@2.1.13': - dependencies: - '@rspack/core': 2.1.10(@swc/helpers@0.5.23) - '@swc/helpers': 0.5.23 - transitivePeerDependencies: - - '@module-federation/runtime-tools' - '@rsbuild/core@2.1.9': dependencies: '@rspack/core': 2.1.7(@swc/helpers@0.5.23) @@ -3408,198 +3233,123 @@ snapshots: transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.2.0-rc.0': + '@rsbuild/core@2.2.3': dependencies: - '@rspack/core': 2.2.0-rc.0(@swc/helpers@0.5.23) + '@rspack/core': 2.2.2(@swc/helpers@0.5.23) '@swc/helpers': 0.5.23 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rslib/core@1.0.0-beta.1(typescript@5.9.3)': + '@rslib/core@1.0.0(typescript@5.9.3)': dependencies: - '@rsbuild/core': 2.1.9 - rsbuild-plugin-dts: 1.0.0-beta.1(@rsbuild/core@2.1.9)(typescript@5.9.3) + '@rsbuild/core': 2.2.3 + rsbuild-plugin-dts: 1.0.0(@rsbuild/core@2.2.3)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@module-federation/runtime-tools' - core-js - '@rslib/core@1.0.0-rc.1(typescript@5.9.3)': + '@rslib/core@1.0.0-beta.1(typescript@5.9.3)': dependencies: - '@rsbuild/core': 2.2.0-rc.0 - rsbuild-plugin-dts: 1.0.0-rc.1(@rsbuild/core@2.2.0-rc.0)(typescript@5.9.3) + '@rsbuild/core': 2.1.9 + rsbuild-plugin-dts: 1.0.0-beta.1(@rsbuild/core@2.1.9)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@module-federation/runtime-tools' - core-js - '@rslint/core@0.8.0(jiti@2.7.0)': + '@rslint/core@0.9.0(jiti@2.7.0)': dependencies: picomatch: 4.0.5 optionalDependencies: - '@rslint/native-darwin-arm64': 0.8.0 - '@rslint/native-darwin-x64': 0.8.0 - '@rslint/native-linux-arm64-gnu': 0.8.0 - '@rslint/native-linux-arm64-musl': 0.8.0 - '@rslint/native-linux-x64-gnu': 0.8.0 - '@rslint/native-linux-x64-musl': 0.8.0 - '@rslint/native-win32-arm64-msvc': 0.8.0 - '@rslint/native-win32-x64-msvc': 0.8.0 + '@rslint/native-darwin-arm64': 0.9.0 + '@rslint/native-darwin-x64': 0.9.0 + '@rslint/native-linux-arm64-gnu': 0.9.0 + '@rslint/native-linux-arm64-musl': 0.9.0 + '@rslint/native-linux-x64-gnu': 0.9.0 + '@rslint/native-linux-x64-musl': 0.9.0 + '@rslint/native-win32-arm64-msvc': 0.9.0 + '@rslint/native-win32-x64-msvc': 0.9.0 jiti: 2.7.0 - '@rslint/core@0.8.1(jiti@2.7.0)': - dependencies: - picomatch: 4.0.5 - optionalDependencies: - '@rslint/native-darwin-arm64': 0.8.1 - '@rslint/native-darwin-x64': 0.8.1 - '@rslint/native-linux-arm64-gnu': 0.8.1 - '@rslint/native-linux-arm64-musl': 0.8.1 - '@rslint/native-linux-x64-gnu': 0.8.1 - '@rslint/native-linux-x64-musl': 0.8.1 - '@rslint/native-win32-arm64-msvc': 0.8.1 - '@rslint/native-win32-x64-msvc': 0.8.1 - jiti: 2.7.0 - - '@rslint/native-darwin-arm64@0.8.0': + '@rslint/native-darwin-arm64@0.9.0': optional: true - '@rslint/native-darwin-arm64@0.8.1': + '@rslint/native-darwin-x64@0.9.0': optional: true - '@rslint/native-darwin-x64@0.8.0': + '@rslint/native-linux-arm64-gnu@0.9.0': optional: true - '@rslint/native-darwin-x64@0.8.1': + '@rslint/native-linux-arm64-musl@0.9.0': optional: true - '@rslint/native-linux-arm64-gnu@0.8.0': + '@rslint/native-linux-x64-gnu@0.9.0': optional: true - '@rslint/native-linux-arm64-gnu@0.8.1': + '@rslint/native-linux-x64-musl@0.9.0': optional: true - '@rslint/native-linux-arm64-musl@0.8.0': + '@rslint/native-win32-arm64-msvc@0.9.0': optional: true - '@rslint/native-linux-arm64-musl@0.8.1': - optional: true - - '@rslint/native-linux-x64-gnu@0.8.0': - optional: true - - '@rslint/native-linux-x64-gnu@0.8.1': - optional: true - - '@rslint/native-linux-x64-musl@0.8.0': - optional: true - - '@rslint/native-linux-x64-musl@0.8.1': - optional: true - - '@rslint/native-win32-arm64-msvc@0.8.0': - optional: true - - '@rslint/native-win32-arm64-msvc@0.8.1': - optional: true - - '@rslint/native-win32-x64-msvc@0.8.0': - optional: true - - '@rslint/native-win32-x64-msvc@0.8.1': - optional: true - - '@rspack/binding-darwin-arm64@2.1.10': + '@rslint/native-win32-x64-msvc@0.9.0': optional: true '@rspack/binding-darwin-arm64@2.1.7': optional: true - '@rspack/binding-darwin-arm64@2.2.0-rc.0': - optional: true - - '@rspack/binding-darwin-x64@2.1.10': + '@rspack/binding-darwin-arm64@2.2.2': optional: true '@rspack/binding-darwin-x64@2.1.7': optional: true - '@rspack/binding-darwin-x64@2.2.0-rc.0': - optional: true - - '@rspack/binding-linux-arm64-gnu@2.1.10': + '@rspack/binding-darwin-x64@2.2.2': optional: true '@rspack/binding-linux-arm64-gnu@2.1.7': optional: true - '@rspack/binding-linux-arm64-gnu@2.2.0-rc.0': - optional: true - - '@rspack/binding-linux-arm64-musl@2.1.10': + '@rspack/binding-linux-arm64-gnu@2.2.2': optional: true '@rspack/binding-linux-arm64-musl@2.1.7': optional: true - '@rspack/binding-linux-arm64-musl@2.2.0-rc.0': - optional: true - - '@rspack/binding-linux-ppc64-gnu@2.1.10': - optional: true - - '@rspack/binding-linux-ppc64-gnu@2.2.0-rc.0': + '@rspack/binding-linux-arm64-musl@2.2.2': optional: true - '@rspack/binding-linux-riscv64-gnu@2.1.10': + '@rspack/binding-linux-ppc64-gnu@2.2.2': optional: true '@rspack/binding-linux-riscv64-gnu@2.1.7': optional: true - '@rspack/binding-linux-riscv64-gnu@2.2.0-rc.0': - optional: true - - '@rspack/binding-linux-riscv64-musl@2.1.10': + '@rspack/binding-linux-riscv64-gnu@2.2.2': optional: true '@rspack/binding-linux-riscv64-musl@2.1.7': optional: true - '@rspack/binding-linux-riscv64-musl@2.2.0-rc.0': - optional: true - - '@rspack/binding-linux-s390x-gnu@2.1.10': - optional: true - - '@rspack/binding-linux-s390x-gnu@2.2.0-rc.0': + '@rspack/binding-linux-riscv64-musl@2.2.2': optional: true - '@rspack/binding-linux-x64-gnu@2.1.10': + '@rspack/binding-linux-s390x-gnu@2.2.2': optional: true '@rspack/binding-linux-x64-gnu@2.1.7': optional: true - '@rspack/binding-linux-x64-gnu@2.2.0-rc.0': - optional: true - - '@rspack/binding-linux-x64-musl@2.1.10': + '@rspack/binding-linux-x64-gnu@2.2.2': optional: true '@rspack/binding-linux-x64-musl@2.1.7': optional: true - '@rspack/binding-linux-x64-musl@2.2.0-rc.0': - optional: true - - '@rspack/binding-wasm32-wasi@2.1.10': - dependencies: - '@emnapi/core': 1.11.3 - '@emnapi/runtime': 1.11.3 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + '@rspack/binding-linux-x64-musl@2.2.2': optional: true '@rspack/binding-wasm32-wasi@2.1.7': @@ -3609,57 +3359,31 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true - '@rspack/binding-wasm32-wasi@2.2.0-rc.0': + '@rspack/binding-wasm32-wasi@2.2.2': dependencies: '@emnapi/core': 1.11.3 '@emnapi/runtime': 1.11.3 '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true - '@rspack/binding-win32-arm64-msvc@2.1.10': - optional: true - '@rspack/binding-win32-arm64-msvc@2.1.7': optional: true - '@rspack/binding-win32-arm64-msvc@2.2.0-rc.0': - optional: true - - '@rspack/binding-win32-ia32-msvc@2.1.10': + '@rspack/binding-win32-arm64-msvc@2.2.2': optional: true '@rspack/binding-win32-ia32-msvc@2.1.7': optional: true - '@rspack/binding-win32-ia32-msvc@2.2.0-rc.0': - optional: true - - '@rspack/binding-win32-x64-msvc@2.1.10': + '@rspack/binding-win32-ia32-msvc@2.2.2': optional: true '@rspack/binding-win32-x64-msvc@2.1.7': optional: true - '@rspack/binding-win32-x64-msvc@2.2.0-rc.0': + '@rspack/binding-win32-x64-msvc@2.2.2': optional: true - '@rspack/binding@2.1.10': - optionalDependencies: - '@rspack/binding-darwin-arm64': 2.1.10 - '@rspack/binding-darwin-x64': 2.1.10 - '@rspack/binding-linux-arm64-gnu': 2.1.10 - '@rspack/binding-linux-arm64-musl': 2.1.10 - '@rspack/binding-linux-ppc64-gnu': 2.1.10 - '@rspack/binding-linux-riscv64-gnu': 2.1.10 - '@rspack/binding-linux-riscv64-musl': 2.1.10 - '@rspack/binding-linux-s390x-gnu': 2.1.10 - '@rspack/binding-linux-x64-gnu': 2.1.10 - '@rspack/binding-linux-x64-musl': 2.1.10 - '@rspack/binding-wasm32-wasi': 2.1.10 - '@rspack/binding-win32-arm64-msvc': 2.1.10 - '@rspack/binding-win32-ia32-msvc': 2.1.10 - '@rspack/binding-win32-x64-msvc': 2.1.10 - '@rspack/binding@2.1.7': optionalDependencies: '@rspack/binding-darwin-arm64': 2.1.7 @@ -3675,28 +3399,22 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 2.1.7 '@rspack/binding-win32-x64-msvc': 2.1.7 - '@rspack/binding@2.2.0-rc.0': + '@rspack/binding@2.2.2': optionalDependencies: - '@rspack/binding-darwin-arm64': 2.2.0-rc.0 - '@rspack/binding-darwin-x64': 2.2.0-rc.0 - '@rspack/binding-linux-arm64-gnu': 2.2.0-rc.0 - '@rspack/binding-linux-arm64-musl': 2.2.0-rc.0 - '@rspack/binding-linux-ppc64-gnu': 2.2.0-rc.0 - '@rspack/binding-linux-riscv64-gnu': 2.2.0-rc.0 - '@rspack/binding-linux-riscv64-musl': 2.2.0-rc.0 - '@rspack/binding-linux-s390x-gnu': 2.2.0-rc.0 - '@rspack/binding-linux-x64-gnu': 2.2.0-rc.0 - '@rspack/binding-linux-x64-musl': 2.2.0-rc.0 - '@rspack/binding-wasm32-wasi': 2.2.0-rc.0 - '@rspack/binding-win32-arm64-msvc': 2.2.0-rc.0 - '@rspack/binding-win32-ia32-msvc': 2.2.0-rc.0 - '@rspack/binding-win32-x64-msvc': 2.2.0-rc.0 - - '@rspack/core@2.1.10(@swc/helpers@0.5.23)': - dependencies: - '@rspack/binding': 2.1.10 - optionalDependencies: - '@swc/helpers': 0.5.23 + '@rspack/binding-darwin-arm64': 2.2.2 + '@rspack/binding-darwin-x64': 2.2.2 + '@rspack/binding-linux-arm64-gnu': 2.2.2 + '@rspack/binding-linux-arm64-musl': 2.2.2 + '@rspack/binding-linux-ppc64-gnu': 2.2.2 + '@rspack/binding-linux-riscv64-gnu': 2.2.2 + '@rspack/binding-linux-riscv64-musl': 2.2.2 + '@rspack/binding-linux-s390x-gnu': 2.2.2 + '@rspack/binding-linux-x64-gnu': 2.2.2 + '@rspack/binding-linux-x64-musl': 2.2.2 + '@rspack/binding-wasm32-wasi': 2.2.2 + '@rspack/binding-win32-arm64-msvc': 2.2.2 + '@rspack/binding-win32-ia32-msvc': 2.2.2 + '@rspack/binding-win32-x64-msvc': 2.2.2 '@rspack/core@2.1.7(@swc/helpers@0.5.23)': dependencies: @@ -3704,66 +3422,58 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.23 - '@rspack/core@2.2.0-rc.0(@swc/helpers@0.5.23)': + '@rspack/core@2.2.2(@swc/helpers@0.5.23)': dependencies: - '@rspack/binding': 2.2.0-rc.0 + '@rspack/binding': 2.2.2 optionalDependencies: '@swc/helpers': 0.5.23 - '@rstackjs/cli-darwin-arm64@0.6.4': + '@rstackjs/cli-darwin-arm64@0.7.2': optional: true - '@rstackjs/cli-darwin-x64@0.6.4': + '@rstackjs/cli-darwin-x64@0.7.2': optional: true - '@rstackjs/cli-linux-arm64-gnu@0.6.4': + '@rstackjs/cli-linux-arm64-gnu@0.7.2': optional: true - '@rstackjs/cli-linux-arm64-musl@0.6.4': + '@rstackjs/cli-linux-arm64-musl@0.7.2': optional: true - '@rstackjs/cli-linux-ppc64-gnu@0.6.4': + '@rstackjs/cli-linux-ppc64-gnu@0.7.2': optional: true - '@rstackjs/cli-linux-riscv64-gnu@0.6.4': + '@rstackjs/cli-linux-riscv64-gnu@0.7.2': optional: true - '@rstackjs/cli-linux-riscv64-musl@0.6.4': + '@rstackjs/cli-linux-riscv64-musl@0.7.2': optional: true - '@rstackjs/cli-linux-s390x-gnu@0.6.4': + '@rstackjs/cli-linux-s390x-gnu@0.7.2': optional: true - '@rstackjs/cli-linux-x64-gnu@0.6.4': + '@rstackjs/cli-linux-x64-gnu@0.7.2': optional: true - '@rstackjs/cli-linux-x64-musl@0.6.4': + '@rstackjs/cli-linux-x64-musl@0.7.2': optional: true - '@rstackjs/cli-win32-arm64-msvc@0.6.4': + '@rstackjs/cli-win32-arm64-msvc@0.7.2': optional: true - '@rstackjs/cli-win32-ia32-msvc@0.6.4': + '@rstackjs/cli-win32-ia32-msvc@0.7.2': optional: true - '@rstackjs/cli-win32-x64-msvc@0.6.4': + '@rstackjs/cli-win32-x64-msvc@0.7.2': optional: true '@rstackjs/load-config@0.1.2(jiti@2.7.0)': optionalDependencies: jiti: 2.7.0 - '@rstest/core@0.11.5': + '@rstest/core@0.11.11': dependencies: - '@rsbuild/core': 2.1.9 - '@types/chai': 5.2.3 - transitivePeerDependencies: - - '@module-federation/runtime-tools' - - core-js - - '@rstest/core@0.11.9': - dependencies: - '@rsbuild/core': 2.1.13 + '@rsbuild/core': 2.2.3 '@types/chai': 5.2.3 transitivePeerDependencies: - '@module-federation/runtime-tools' @@ -4007,78 +3717,78 @@ snapshots: '@yuku-parser/binding-android-arm64@0.8.3': optional: true - '@yuku-parser/binding-android-arm64@0.9.0': + '@yuku-parser/binding-android-arm64@0.9.3': optional: true '@yuku-parser/binding-darwin-arm64@0.8.3': optional: true - '@yuku-parser/binding-darwin-arm64@0.9.0': + '@yuku-parser/binding-darwin-arm64@0.9.3': optional: true '@yuku-parser/binding-darwin-x64@0.8.3': optional: true - '@yuku-parser/binding-darwin-x64@0.9.0': + '@yuku-parser/binding-darwin-x64@0.9.3': optional: true '@yuku-parser/binding-freebsd-x64@0.8.3': optional: true - '@yuku-parser/binding-freebsd-x64@0.9.0': + '@yuku-parser/binding-freebsd-x64@0.9.3': optional: true '@yuku-parser/binding-linux-arm-gnu@0.8.3': optional: true - '@yuku-parser/binding-linux-arm-gnu@0.9.0': + '@yuku-parser/binding-linux-arm-gnu@0.9.3': optional: true '@yuku-parser/binding-linux-arm-musl@0.8.3': optional: true - '@yuku-parser/binding-linux-arm-musl@0.9.0': + '@yuku-parser/binding-linux-arm-musl@0.9.3': optional: true '@yuku-parser/binding-linux-arm64-gnu@0.8.3': optional: true - '@yuku-parser/binding-linux-arm64-gnu@0.9.0': + '@yuku-parser/binding-linux-arm64-gnu@0.9.3': optional: true '@yuku-parser/binding-linux-arm64-musl@0.8.3': optional: true - '@yuku-parser/binding-linux-arm64-musl@0.9.0': + '@yuku-parser/binding-linux-arm64-musl@0.9.3': optional: true '@yuku-parser/binding-linux-x64-gnu@0.8.3': optional: true - '@yuku-parser/binding-linux-x64-gnu@0.9.0': + '@yuku-parser/binding-linux-x64-gnu@0.9.3': optional: true '@yuku-parser/binding-linux-x64-musl@0.8.3': optional: true - '@yuku-parser/binding-linux-x64-musl@0.9.0': + '@yuku-parser/binding-linux-x64-musl@0.9.3': optional: true '@yuku-parser/binding-win32-arm64@0.8.3': optional: true - '@yuku-parser/binding-win32-arm64@0.9.0': + '@yuku-parser/binding-win32-arm64@0.9.3': optional: true '@yuku-parser/binding-win32-x64@0.8.3': optional: true - '@yuku-parser/binding-win32-x64@0.9.0': + '@yuku-parser/binding-win32-x64@0.9.3': optional: true '@yuku-toolchain/types@0.8.3': {} - '@yuku-toolchain/types@0.9.1': {} + '@yuku-toolchain/types@0.9.3': {} agent-base@7.1.4: {} @@ -5102,43 +4812,43 @@ snapshots: reusify@1.1.0: {} - rsbuild-plugin-dts@1.0.0-beta.1(@rsbuild/core@2.1.9)(typescript@5.9.3): + rsbuild-plugin-dts@1.0.0(@rsbuild/core@2.2.3)(typescript@5.9.3): dependencies: - '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 2.1.9 + '@ast-grep/napi': 0.45.2 + '@rsbuild/core': 2.2.3 optionalDependencies: typescript: 5.9.3 - rsbuild-plugin-dts@1.0.0-rc.1(@rsbuild/core@2.2.0-rc.0)(typescript@5.9.3): + rsbuild-plugin-dts@1.0.0-beta.1(@rsbuild/core@2.1.9)(typescript@5.9.3): dependencies: - '@ast-grep/napi': 0.45.1 - '@rsbuild/core': 2.2.0-rc.0 + '@ast-grep/napi': 0.37.0 + '@rsbuild/core': 2.1.9 optionalDependencies: typescript: 5.9.3 - rstack@0.6.4(jiti@2.7.0)(typescript@5.9.3): + rstack@0.7.2(jiti@2.7.0)(typescript@5.9.3): dependencies: - '@rsbuild/core': 2.1.13 - '@rslib/core': 1.0.0-rc.1(typescript@5.9.3) - '@rslint/core': 0.8.1(jiti@2.7.0) - '@rstest/core': 0.11.9 + '@rsbuild/core': 2.2.3 + '@rslib/core': 1.0.0(typescript@5.9.3) + '@rslint/core': 0.9.0(jiti@2.7.0) + '@rstest/core': 0.11.11 prettier: 3.9.6 - tinypool: 2.1.0 - yuku-parser: 0.9.0 + tinypool: 2.1.2 + yuku-parser: 0.9.3 optionalDependencies: - '@rstackjs/cli-darwin-arm64': 0.6.4 - '@rstackjs/cli-darwin-x64': 0.6.4 - '@rstackjs/cli-linux-arm64-gnu': 0.6.4 - '@rstackjs/cli-linux-arm64-musl': 0.6.4 - '@rstackjs/cli-linux-ppc64-gnu': 0.6.4 - '@rstackjs/cli-linux-riscv64-gnu': 0.6.4 - '@rstackjs/cli-linux-riscv64-musl': 0.6.4 - '@rstackjs/cli-linux-s390x-gnu': 0.6.4 - '@rstackjs/cli-linux-x64-gnu': 0.6.4 - '@rstackjs/cli-linux-x64-musl': 0.6.4 - '@rstackjs/cli-win32-arm64-msvc': 0.6.4 - '@rstackjs/cli-win32-ia32-msvc': 0.6.4 - '@rstackjs/cli-win32-x64-msvc': 0.6.4 + '@rstackjs/cli-darwin-arm64': 0.7.2 + '@rstackjs/cli-darwin-x64': 0.7.2 + '@rstackjs/cli-linux-arm64-gnu': 0.7.2 + '@rstackjs/cli-linux-arm64-musl': 0.7.2 + '@rstackjs/cli-linux-ppc64-gnu': 0.7.2 + '@rstackjs/cli-linux-riscv64-gnu': 0.7.2 + '@rstackjs/cli-linux-riscv64-musl': 0.7.2 + '@rstackjs/cli-linux-s390x-gnu': 0.7.2 + '@rstackjs/cli-linux-x64-gnu': 0.7.2 + '@rstackjs/cli-linux-x64-musl': 0.7.2 + '@rstackjs/cli-win32-arm64-msvc': 0.7.2 + '@rstackjs/cli-win32-ia32-msvc': 0.7.2 + '@rstackjs/cli-win32-x64-msvc': 0.7.2 transitivePeerDependencies: - '@microsoft/api-extractor' - '@module-federation/runtime-tools' @@ -5360,7 +5070,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 - tinypool@2.1.0: {} + tinypool@2.1.2: {} tmp@0.2.7: {} @@ -5537,9 +5247,9 @@ snapshots: dependencies: '@yuku-toolchain/types': 0.8.3 - yuku-ast@0.9.1: + yuku-ast@0.9.3: dependencies: - '@yuku-toolchain/types': 0.9.1 + '@yuku-toolchain/types': 0.9.3 yuku-parser@0.8.3: dependencies: @@ -5559,20 +5269,20 @@ snapshots: '@yuku-parser/binding-win32-arm64': 0.8.3 '@yuku-parser/binding-win32-x64': 0.8.3 - yuku-parser@0.9.0: + yuku-parser@0.9.3: dependencies: - '@yuku-toolchain/types': 0.9.1 - yuku-ast: 0.9.1 + '@yuku-toolchain/types': 0.9.3 + yuku-ast: 0.9.3 optionalDependencies: - '@yuku-parser/binding-android-arm64': 0.9.0 - '@yuku-parser/binding-darwin-arm64': 0.9.0 - '@yuku-parser/binding-darwin-x64': 0.9.0 - '@yuku-parser/binding-freebsd-x64': 0.9.0 - '@yuku-parser/binding-linux-arm-gnu': 0.9.0 - '@yuku-parser/binding-linux-arm-musl': 0.9.0 - '@yuku-parser/binding-linux-arm64-gnu': 0.9.0 - '@yuku-parser/binding-linux-arm64-musl': 0.9.0 - '@yuku-parser/binding-linux-x64-gnu': 0.9.0 - '@yuku-parser/binding-linux-x64-musl': 0.9.0 - '@yuku-parser/binding-win32-arm64': 0.9.0 - '@yuku-parser/binding-win32-x64': 0.9.0 + '@yuku-parser/binding-android-arm64': 0.9.3 + '@yuku-parser/binding-darwin-arm64': 0.9.3 + '@yuku-parser/binding-darwin-x64': 0.9.3 + '@yuku-parser/binding-freebsd-x64': 0.9.3 + '@yuku-parser/binding-linux-arm-gnu': 0.9.3 + '@yuku-parser/binding-linux-arm-musl': 0.9.3 + '@yuku-parser/binding-linux-arm64-gnu': 0.9.3 + '@yuku-parser/binding-linux-arm64-musl': 0.9.3 + '@yuku-parser/binding-linux-x64-gnu': 0.9.3 + '@yuku-parser/binding-linux-x64-musl': 0.9.3 + '@yuku-parser/binding-win32-arm64': 0.9.3 + '@yuku-parser/binding-win32-x64': 0.9.3