mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-01 07:33:12 +08:00
50 lines
2.2 KiB
TypeScript
50 lines
2.2 KiB
TypeScript
/* Static-object specialization, stage 2b (shape-inference/static-objects.ts):
|
|
* with the shape overlay on, the npm case static-objects (through its JavaScript consumer, js-main.cjs) compiles its one
|
|
* indistinguishable constructor function as a class and its `this`-free
|
|
* namespace function as a direct function, keeps every observably
|
|
* different form as written, and prints what Node prints. npm.test.ts runs
|
|
* the same case without the overlay. */
|
|
import { execFile } from "node:child_process";
|
|
import { mkdirSync } from "node:fs";
|
|
import { dirname, join } from "node:path";
|
|
import { promisify } from "node:util";
|
|
import { expect, test } from "vitest";
|
|
import { compile } from "@scriptc/compiler";
|
|
|
|
const execFileAsync = promisify(execFile);
|
|
const repoRoot = join(import.meta.dirname, "../..");
|
|
const entry = join(repoRoot, "tests/fixtures/npm/cases/static-objects/js-main.cjs");
|
|
const outDir = join(repoRoot, "node_modules/.cache/scriptc-tests/static-objects");
|
|
const sanitize = process.env["SCRIPTC_SAN"] === "1";
|
|
|
|
test(
|
|
"constructor functions and namespace functions compile as classes and direct functions",
|
|
{ timeout: 600_000 },
|
|
async () => {
|
|
mkdirSync(outDir, { recursive: true });
|
|
const saved = process.env["SCRIPTC_SHAPE_OVERLAY"];
|
|
process.env["SCRIPTC_SHAPE_OVERLAY"] = "1";
|
|
let result;
|
|
try {
|
|
result = await compile(entry, { outPath: join(outDir, "main"), outDir, sanitize });
|
|
} finally {
|
|
if (saved === undefined) delete process.env["SCRIPTC_SHAPE_OVERLAY"];
|
|
else process.env["SCRIPTC_SHAPE_OVERLAY"] = saved;
|
|
}
|
|
if (!result.ok)
|
|
throw new Error(result.diagnostics.map((d) => `${d.code}: ${d.message}`).join("\n"));
|
|
const report = (result.warnings ?? []).find((w) => w.code === "SC6103");
|
|
expect(report?.message).toMatch(
|
|
/compiled 2 constructor functions as classes and 3 namespace functions as direct functions/,
|
|
);
|
|
const pending = execFileAsync(result.binaryPath, [], { cwd: dirname(entry), encoding: "utf8" });
|
|
pending.child.stdin?.end();
|
|
const { stdout } = await pending;
|
|
const node = await execFileAsync(process.execPath, [entry], {
|
|
cwd: dirname(entry),
|
|
encoding: "utf8",
|
|
});
|
|
expect(stdout).toBe(node.stdout);
|
|
},
|
|
);
|