Files
reverse-engineering-anything/tests/boundary/cli/runtimeAdmission.test.ts
T
dbfab4a65d fix(cli): refuse an unsupported Node.js release before linking (#9297)
* fix(cli): refuse an unsupported Node.js release before linking

The dispatcher imported the compiled runtime before checking the runtime
range, so a release outside `engines.node` failed while linking a module
that imports `createZstdDecompress`. Callers saw a module-linking stack
trace from every command, including `--version` and `doctor`, instead of
the refusal the installer and `engines` already promise.

Check `engines.node` from the package read the dispatcher already performs,
before the first compiled import. The helper has no imports of its own: the
dispatcher must admit the runtime before any dependency can be resolved.

Fixes #9296

* fix(cli): ship and align runtime admission

* fix(ci): cover packaged runtime admission helper

* test(cli): assert Node admission with structured range results

Export satisfiesNodeRange and cover caret, minimum, union, and
non-release versions. The dispatcher proves the compiled runtime never
loads by the absence of its marker file, and compares stderr to the
helper's own message.

---------

Co-authored-by: 2SinceJuly <202121119+2SinceJuly@users.noreply.github.com>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-11-10 13:53:58 -05:00

38 lines
1.7 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { satisfiesNodeRange } from "../../../scripts/lib/runtime-admission.mjs";
describe("satisfiesNodeRange", () => {
it("admits a caret floor and later patches or minors in that major", () => {
expect(satisfiesNodeRange("^22.23.4", "22.23.4")).toBe(true);
expect(satisfiesNodeRange("^22.23.4", "22.23.5")).toBe(true);
expect(satisfiesNodeRange("^22.23.4", "22.24.0")).toBe(true);
expect(satisfiesNodeRange("^22.23.4", "22.23.3")).toBe(false);
expect(satisfiesNodeRange("^22.23.4", "22.22.9")).toBe(false);
});
it("rejects a higher major under a caret and admits it under a minimum", () => {
expect(satisfiesNodeRange("^22.23.4", "23.0.0")).toBe(false);
expect(satisfiesNodeRange(">=22.23.4", "23.0.0")).toBe(true);
expect(satisfiesNodeRange(">=22.23.4", "22.23.4")).toBe(true);
expect(satisfiesNodeRange(">=22.23.4", "22.23.3")).toBe(false);
expect(satisfiesNodeRange(">=22.23.4", "22.22.0")).toBe(false);
});
it("admits either clause of a union", () => {
const range = "^22.23.4 || >=26.12.1";
expect(satisfiesNodeRange(range, "22.23.4")).toBe(true);
expect(satisfiesNodeRange(range, "26.12.1")).toBe(true);
expect(satisfiesNodeRange(range, "27.0.0")).toBe(true);
expect(satisfiesNodeRange(range, "24.0.0")).toBe(false);
expect(satisfiesNodeRange(range, "26.12.0")).toBe(false);
});
it("rejects prerelease and non-release spellings", () => {
expect(satisfiesNodeRange("^22.23.4", "22.23.4-rc.1")).toBe(false);
expect(satisfiesNodeRange(">=22.23.4", "22.23.4-rc.1")).toBe(false);
expect(satisfiesNodeRange("^22.23.4", "not-a-version")).toBe(false);
expect(satisfiesNodeRange("^22.23.4", "22.23")).toBe(false);
});
});