mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-25 06:24:27 +08:00
- Compile JavaScript instance fields with native undefined initialization and ordered resets. - Support prefix and postfix updates to numeric static fields through exact class bindings.
32 lines
1.5 KiB
TypeScript
32 lines
1.5 KiB
TypeScript
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import { expect, test } from "vitest";
|
|
import { analyze } from "../src/index.js";
|
|
|
|
test.each(["Child.count++", "++Child.count", "Child.count--", "--Child.count"])("refuses inherited static updates: %s", (update) => {
|
|
const dir = mkdtempSync(join(tmpdir(), "scriptc-static-update-"));
|
|
try {
|
|
const entry = join(dir, "main.cjs");
|
|
writeFileSync(entry, `class Base { static count = 1; } class Child extends Base {} console.log(${update}); ${update};`);
|
|
const { coverage } = analyze(entry);
|
|
const diagnostics = [...coverage.diagnostics, ...(coverage.runtimeFences ?? [])];
|
|
expect(diagnostics.filter((d) => d.code === "SC1090" && d.message.includes("assigning the inherited static")).length).toBe(2);
|
|
expect(coverage.stats.statementsIsland).toBe(0);
|
|
} finally {
|
|
rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("refuses updates to readonly static fields", () => {
|
|
const dir = mkdtempSync(join(tmpdir(), "scriptc-static-readonly-"));
|
|
try {
|
|
const entry = join(dir, "main.ts");
|
|
writeFileSync(entry, 'class C { static readonly count = 1; }\n// @ts-expect-error Exercise the compiler backstop too.\nconsole.log(C.count++);\n');
|
|
const { coverage } = analyze(entry);
|
|
expect([...coverage.diagnostics, ...(coverage.runtimeFences ?? [])].some((d) => d.code === "SC1090" && d.message.includes("readonly static"))).toBe(true);
|
|
} finally {
|
|
rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|