Files
scriptc/packages/compiler/test/emitter-flex-events.test.ts
Chris Tate a07998f667 Expand static three.js workflows and host integration (#621)
* 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
2026-10-02 19:56:34 -05:00

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 });
}
});