fix(core,cli,ci): harden runtime resolution + inline constant + smoke test (#458)

Guard buildHyperframesRuntimeScript() against missing entry.ts so it
returns null instead of crashing with esbuild stderr output. Add
getHyperframeRuntimeScript() that returns the pre-built IIFE as a
baked-in string constant — no esbuild, no file I/O, no import.meta.url.

Consolidate CLI runtime source resolution into a single module with
a clear priority chain: esbuild from source (dev) → inlined constant
(production) → pre-built artifact file (fallback).

Add CI smoke test that npm-packs the CLI, installs globally, runs
hyperframes preview, and asserts no stderr errors + runtime endpoint
returns JS.

Bump version to 0.4.16.
This commit is contained in:
Miguel Ángel
2026-04-23 21:44:26 +02:00
committed by GitHub
parent 34db66ef0a
commit 072814e65c
17 changed files with 158 additions and 27 deletions
+1
View File
@@ -139,6 +139,7 @@ export {
HYPERFRAME_CONTROL_ACTIONS,
type HyperframeControlAction,
} from "./inline-scripts/runtimeContract";
export { getHyperframeRuntimeScript } from "./generated/runtime-inline";
export {
buildHyperframesRuntimeScript,
type HyperframesRuntimeBuildOptions,
@@ -17,6 +17,6 @@ export const HYPERFRAME_RUNTIME_CONTRACT: HyperframeRuntimeContract = {
messageSources: HYPERFRAME_BRIDGE_SOURCES,
};
export function loadHyperframeRuntimeSource(): string {
export function loadHyperframeRuntimeSource(): string | null {
return buildHyperframesRuntimeScript();
}
@@ -1,4 +1,5 @@
import { buildSync } from "esbuild";
import { existsSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
@@ -17,10 +18,19 @@ function applyDefaultParityMode(script: string, enabled: boolean): string {
);
}
/**
* Build the runtime IIFE from source via esbuild.
*
* Returns `null` when `entry.ts` does not exist at the resolved path —
* this happens in bundled / published contexts where only `dist/` ships.
* Callers must fall back to the pre-built artifact or the inlined constant.
*/
export function buildHyperframesRuntimeScript(
options: HyperframesRuntimeBuildOptions = {},
): string {
): string | null {
const entryPath = resolve(dirname(fileURLToPath(import.meta.url)), "../runtime/entry.ts");
if (!existsSync(entryPath)) return null;
const result = buildSync({
entryPoints: [entryPath],
bundle: true,