mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-08 08:44:37 +08:00
* feat: ship the self-hosted native scriptc CLI - Run the shared compiler and CLI natively, including library builds and compile-time evaluation. - Install native platform packages and ship relocatable standalone distributions. - Preserve program semantics and reuse validated build artifacts for fast rebuilds. * fix: complete native CLI integration and validation - Preserve library diagnostics and run recursive compiler work on the main stack. - Restore packaged helper permissions and exercise native npm and Wasm library builds. - Recover interrupted Sandbox status probes within the original command deadline.
36 lines
1.8 KiB
TypeScript
36 lines
1.8 KiB
TypeScript
import { spawn } from "node:child_process";
|
|
import { existsSync, readFileSync } from "node:fs";
|
|
import { dirname, join } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
import { analyze, compile, compileLibrary, resolveProvenanceSources, sourceTargetPlatform, warmNativeCaches } from "@scriptc/compiler";
|
|
import { runCli } from "./command.js";
|
|
|
|
/** The version of the installed package. Read from the manifest rather than
|
|
* baked in by the build, so a stamped release and a source checkout answer
|
|
* the same way. */
|
|
function version(): string {
|
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
// dist/main.js at install time, src/main.ts under tsx: the manifest is
|
|
// one level up from either.
|
|
const manifest = JSON.parse(readFileSync(join(here, "..", "package.json"), "utf8")) as { version?: string };
|
|
return manifest.version ?? "unknown";
|
|
}
|
|
|
|
process.exitCode = await runCli(process.argv.slice(2), {
|
|
version, analyze: async (entry, options) => analyze(entry, options), compile, compileLibrary, resolveProvenanceSources, sourceTargetPlatform, warmNativeCaches,
|
|
run: (binary) => new Promise<number>((resolveExit) => {
|
|
let child;
|
|
if (sourceTargetPlatform() === "wasi") {
|
|
const builtRunner = fileURLToPath(new URL("./wasi-runner.js", import.meta.url));
|
|
const runner = existsSync(builtRunner) ? builtRunner : fileURLToPath(new URL("./wasi-runner.ts", import.meta.url));
|
|
child = spawn(process.execPath, [...process.execArgv, "--no-warnings", runner, binary], { stdio: "inherit" });
|
|
} else child = spawn(binary, [], { stdio: "inherit" });
|
|
child.on("exit", (code, signal) => {
|
|
if (signal) {
|
|
process.stderr.write(`scriptc: program killed by ${signal}\n`);
|
|
resolveExit(1);
|
|
} else resolveExit(code ?? 0);
|
|
});
|
|
}),
|
|
});
|