mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-24 06:14:01 +08:00
* Expand static three.js workflows and host integration * Preserve JavaScript class state in static three.js workflows * Preserve inferred JavaScript behavior across static workflows * Preserve inferred callables and native compatibility boundaries * Retain annotated JavaScript factory exports and bootstrap-safe call spreads * Preserve Buffer and child callback identities in static packages * Clarify JavaScript symbol spread support
30 lines
1.9 KiB
TypeScript
30 lines
1.9 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([
|
|
["typed listeners", `/** @param {number} value */ function listener(value) { console.log(value); }
|
|
const ee = new EventEmitter(); ee.on('value', listener); ee.emit('value'); ee.emit('value', 1);`, "conflicting argument types"],
|
|
["emit overrides", `class Derived extends EventEmitter { emit(event, ...args) { return super.emit(event, ...args); } }
|
|
const ee = new Derived(); ee.on('value', (value) => console.log(value)); ee.emit('value'); ee.emit('value', 1);`, "variable-arity emit through an EventEmitter subclass overriding emit"],
|
|
["listener arrays", `const ee = new EventEmitter(); ee.on('value', () => {});
|
|
ee.emit('value'); ee.emit('value', 1); console.log(ee.listeners('value'));`, "listeners of the event 'value'"],
|
|
["special error events", `const ee = new EventEmitter(); ee.on('error', (value) => console.log(value)); ee.emit('error');`, "emit('error') with 0 payload arguments"],
|
|
["reserved stream events", `const ee = new EventEmitter(); ee.on('data', (value) => console.log(value));
|
|
ee.emit('data'); ee.emit('data', 1);`, "conflicting argument types"],
|
|
])("keeps named refusals for %s", (_name, source, message) => {
|
|
const dir = mkdtempSync(join(tmpdir(), "scriptc-flex-events-"));
|
|
try {
|
|
const entry = join(dir, "main.cjs");
|
|
writeFileSync(entry, `const { EventEmitter } = require('node:events');\n${source}\n`);
|
|
const { coverage } = analyze(entry, { dynamic: false });
|
|
const diagnostics = [...coverage.diagnostics, ...(coverage.runtimeFences ?? [])];
|
|
expect(diagnostics.some((d) => d.code === "SC2020" && d.message.includes(message!)), JSON.stringify(diagnostics)).toBe(true);
|
|
expect(coverage.stats.statementsIsland).toBe(0);
|
|
} finally {
|
|
rmSync(dir, { recursive: true, force: true });
|
|
}
|
|
});
|