* fix(verifiers): launch npm through Node on Windows * test(verifiers): cover Windows npm fallback
91 lines
3.1 KiB
TypeScript
91 lines
3.1 KiB
TypeScript
import { execFile } from "node:child_process";
|
|
import { copyFile, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import { dirname, join, resolve } from "node:path";
|
|
import { pathToFileURL } from "node:url";
|
|
import { promisify } from "node:util";
|
|
import { expect, it } from "vitest";
|
|
|
|
const execute = promisify(execFile);
|
|
|
|
it("runs the caller-selected npm entry through Node without rewriting its inputs", async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "rea-npm-invocation-"));
|
|
try {
|
|
const npmEntry = join(root, "selected npm entry.mjs");
|
|
await writeFile(
|
|
npmEntry,
|
|
`process.stdout.write(JSON.stringify({ arguments: process.argv.slice(2), cwd: process.cwd(), marker: process.env.REA_NPM_TEST_MARKER }));\n`,
|
|
);
|
|
const helper = pathToFileURL(
|
|
resolve("scripts/lib/verify-package-core.mjs"),
|
|
).href;
|
|
const program = `
|
|
const { execNpm } = await import(${JSON.stringify(helper)});
|
|
const result = await execNpm(["pack", "value with spaces"], {
|
|
cwd: ${JSON.stringify(root)},
|
|
env: { ...process.env, npm_execpath: ${JSON.stringify(npmEntry)}, REA_NPM_TEST_MARKER: "caller-selected" },
|
|
});
|
|
process.stdout.write(result.stdout);
|
|
`;
|
|
const result = await execute(
|
|
process.execPath,
|
|
["--input-type=module", "--eval", program],
|
|
{ windowsHide: true },
|
|
);
|
|
expect(JSON.parse(result.stdout)).toEqual({
|
|
arguments: ["pack", "value with spaces"],
|
|
cwd: root,
|
|
marker: "caller-selected",
|
|
});
|
|
} finally {
|
|
await rm(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
const windowsIt = process.platform === "win32" ? it : it.skip;
|
|
|
|
windowsIt(
|
|
"uses the npm entry adjacent to Node when none is selected",
|
|
async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "rea-adjacent-npm-"));
|
|
try {
|
|
const node = join(root, "node.exe");
|
|
const npmEntry = join(root, "node_modules/npm/bin/npm-cli.js");
|
|
await mkdir(dirname(npmEntry), { recursive: true });
|
|
await Promise.all([
|
|
copyFile(process.execPath, node),
|
|
writeFile(
|
|
npmEntry,
|
|
`process.stdout.write(JSON.stringify({ arguments: process.argv.slice(2), cwd: process.cwd() }));\n`,
|
|
),
|
|
]);
|
|
const helper = pathToFileURL(
|
|
resolve("scripts/lib/verify-package-core.mjs"),
|
|
).href;
|
|
const program = `
|
|
const { execNpm } = await import(${JSON.stringify(helper)});
|
|
const environment = { ...process.env };
|
|
delete environment.npm_execpath;
|
|
const result = await execNpm(["pack", "value with spaces"], {
|
|
cwd: ${JSON.stringify(root)},
|
|
env: environment,
|
|
});
|
|
process.stdout.write(result.stdout);
|
|
`;
|
|
const environment = { ...process.env };
|
|
delete environment.npm_execpath;
|
|
const result = await execute(
|
|
node,
|
|
["--input-type=module", "--eval", program],
|
|
{ env: environment, windowsHide: true },
|
|
);
|
|
expect(JSON.parse(result.stdout)).toEqual({
|
|
arguments: ["pack", "value with spaces"],
|
|
cwd: root,
|
|
});
|
|
} finally {
|
|
await rm(root, { recursive: true, force: true });
|
|
}
|
|
},
|
|
);
|