mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-23 06:10:02 +08:00
- Remove C emission, debugging options, and automatic backend fallback. - Complete LLVM lowering and native bootstrap coverage across supported targets. - Link executables and libraries with precompiled C runtime packs, including iOS and Android.
43 lines
2.5 KiB
TypeScript
43 lines
2.5 KiB
TypeScript
// Opt-in smoke against the actual pinned OpenTUI static archive. The ordinary
|
|
// FFI suite uses a small C oracle so the full gate needs no external download.
|
|
import { strict as assert } from "node:assert";
|
|
import { execFileSync, spawnSync } from "node:child_process";
|
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
import { join, resolve } from "node:path";
|
|
import { compile, renderDiagnostics } from "../../packages/compiler/src/index.js";
|
|
|
|
const archive = process.argv[2];
|
|
if (!archive) throw new Error("usage: tsx tests/harness/opentui-native.mts /absolute/path/libopentui.a");
|
|
if (process.platform !== "darwin" && process.platform !== "linux") throw new Error("this probe supports macOS and Linux hosts");
|
|
const root = resolve(import.meta.dirname, "../..");
|
|
const fixtures = join(root, "tests/fixtures/opentui");
|
|
const out = join(root, "node_modules/.cache/scriptc-tests/opentui");
|
|
mkdirSync(out, { recursive: true });
|
|
const object = join(out, "adapter.o");
|
|
execFileSync("clang", ["-std=c11", "-O2", "-c", join(fixtures, "native.c"), "-o", object]);
|
|
const profile = join(out, "ffi.json");
|
|
writeFileSync(profile, JSON.stringify({
|
|
ffi_format: 6,
|
|
libraries: [object, resolve(archive)],
|
|
system_libraries: process.platform === "darwin" ? ["c++"] : ["stdc++", "m", "dl", "pthread"],
|
|
functions: [
|
|
{ name: "nativeCreate", symbol: "probe_create", params: [], returns: "u32" },
|
|
{ name: "nativeDestroy", symbol: "probe_destroy", params: ["u32"], returns: "void" },
|
|
{ name: "nativeAppend", symbol: "probe_append", params: ["u32", "string"], returns: "void" },
|
|
{ name: "nativeRead", symbol: "probe_read", params: ["u32", "mutable-bytes"], returns: "u32" },
|
|
{ name: "nativeRender", symbol: "probe_render", params: ["string", "mutable-bytes"], returns: "u32" },
|
|
],
|
|
}, null, 2));
|
|
for (const backend of ["llvm"] as const) {
|
|
const result = await compile(join(fixtures, "native.ts"), {
|
|
backend, dynamic: false, outDir: join(out, backend), outPath: join(out, `opentui-${backend}`), ffiProfilePath: profile,
|
|
});
|
|
if (!result.ok) throw new Error(renderDiagnostics(result.diagnostics, result.sourceTexts));
|
|
const child = spawnSync(result.binaryPath, [], { encoding: "utf8", timeout: 10_000 });
|
|
assert.ifError(child.error);
|
|
assert.equal(child.status, 0, child.stderr);
|
|
assert.equal(child.stderr, "");
|
|
assert.equal(child.stdout, "Hello, scriptc! café 🎉\n0 0 0\nHello, static OpenTUI!\n");
|
|
console.log(`${backend}: OpenTUI text buffer and renderer passed without a JS engine`);
|
|
}
|