Setting the file. One moment. Package Loader Test · Hyperframes Creative · heygen-com/hyperframes · Skills Docs22.10
Narration
(opens in a new tab)
scripts/package-loader.test.mjs
JavaScript·114 lines·4 KB
from
"node:url"
;
8import { resolveNpmSpawnCommand } from "./package-loader.mjs";
9
10const HERE = dirname(fileURLToPath(import.meta.url));
11const ENV = "HYPERFRAMES_SKILL_PKG_VERSION";
12
13test("resolveNpmSpawnCommand routes Windows npm through node and npm-cli.js", () => {
14 const npmCli = "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js";
15 const node = "C:\\Program Files\\nodejs\\node.exe";
16 const resolved = resolveNpmSpawnCommand(
17 ["install", "@hyperframes/producer@0.7.55", "value & calc"],
18 "win32",
19 { npm_execpath: npmCli, npm_node_execpath: node },
20 node,
21 (path) => path === npmCli,
22 );
23
24 assert.deepEqual(resolved, {
25 cmd: node,
26 args: [npmCli, "install", "@hyperframes/producer@0.7.55", "value & calc"],
27 opts: { stdio: "inherit", windowsHide: true },
28 });
29 assert.equal(resolved.opts.shell, undefined);
30});
31
32test("resolveNpmSpawnCommand finds npm-cli.js beside node for direct Windows runs", () => {
33 const node = "C:\\Program Files\\nodejs\\node.exe";
34 const npmCli = "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js";
35 const resolved = resolveNpmSpawnCommand(
36 ["install", "@hyperframes/producer@0.7.55"],
37 "win32",
38 {},
39 node,
40 (path) => path === npmCli,
41 );
42
43 assert.equal(resolved?.cmd, node);
44 assert.deepEqual(resolved?.args, [npmCli, "install", "@hyperframes/producer@0.7.55"]);
45});
46
47test(
48 "resolveNpmSpawnCommand launches the installed npm CLI on Windows",
49 { skip: process.platform !== "win32" },
50 () => {
51 const resolved = resolveNpmSpawnCommand(["--version"]);
52 assert.ok(resolved);
53
54 const result = spawnSync(resolved.cmd, resolved.args, {
55 encoding: "utf8",
56 windowsHide: true,
57 });
58
59 assert.equal(result.status, 0, result.stderr);
60 assert.match(result.stdout.trim(), /^\d+\./);
61 },
62);
63
64// (a) env override wins — no ancestor lookup, exact version echoed back.
65test("hyperframesPackageSpec: env override wins", async () => {
66 const prev = process.env[ENV];
67 process.env[ENV] = "9.9.9";
68 try {
69 const { hyperframesPackageSpec } = await import("./package-loader.mjs");
70 assert.equal(hyperframesPackageSpec("@hyperframes/producer"), "@hyperframes/producer@9.9.9");
71 } finally {
72 if (prev === undefined) delete process.env[ENV];
73 else process.env[ENV] = prev;
74 }
75});
76
77// (b) resolvable version (in-repo) pins the bundled hyperframes/@hyperframes/cli version.
78test("hyperframesPackageSpec: resolvable in-repo version pins it", async () => {
79 const prev = process.env[ENV];
80 delete process.env[ENV];
81 try {
82 const { hyperframesPackageSpec } = await import("./package-loader.mjs");
83 const spec = hyperframesPackageSpec("@hyperframes/producer");
84 assert.match(spec, /^@hyperframes\/producer@\d+\.\d+\.\d+/);
85 } finally {
86 if (prev !== undefined) process.env[ENV] = prev;
87 }
88});
89
90// (c) unresolvable + no override -> @latest fallback, no throw (global-install case).
91// Copy the loader into an isolated temp dir whose ancestor chain has no hyperframes
92// package.json, and run node from there so cwd cannot resolve one either.
93test("hyperframesPackageSpec: unresolvable falls back to @latest without throwing", () => {
94 const dir = mkdtempSync(join(tmpdir(), "hf-pkgloader-"));
95 try {
96 copyFileSync(join(HERE, "package-loader.mjs"), join(dir, "package-loader.mjs"));
97 const probe = join(dir, "probe.mjs");
98 writeFileSync(
99 probe,
100 [
101 'import { hyperframesPackageSpec } from "./package-loader.mjs";',
102 'process.stdout.write(hyperframesPackageSpec("@hyperframes/producer"));',
103 "",
104 ].join("\n"),
105 );
106 const res = spawnSync(process.execPath, [probe], { cwd: dir, encoding: "utf8" });
107 assert.equal(res.status, 0, res.stderr);
108 assert.equal(res.stdout.trim(), "@hyperframes/producer@latest");
109 assert.match(res.stderr, /using @latest/);
110 assert.match(res.stderr, new RegExp(ENV));
111 } finally {
112 rmSync(dir, { recursive: true, force: true });
113 }
114});