diff --git a/build.ts b/build.ts index 85b2b20..e63498c 100644 --- a/build.ts +++ b/build.ts @@ -1,5 +1,6 @@ import { readdir, readFile, writeFile } from "fs/promises"; import { join } from "path"; +import { getMacroDefines } from "./scripts/defines.ts"; const outdir = "dist"; @@ -13,6 +14,7 @@ const result = await Bun.build({ outdir, target: "bun", splitting: true, + define: getMacroDefines(), }); if (!result.success) { diff --git a/package.json b/package.json index 8ed6f2d..feba267 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ ], "scripts": { "build": "bun run build.ts", - "dev": "bun run src/entrypoints/cli.tsx", + "dev": "bun run scripts/dev.ts", "prepublishOnly": "bun run build", "lint": "biome lint src/", "lint:fix": "biome lint --fix src/", diff --git a/scripts/defines.ts b/scripts/defines.ts new file mode 100644 index 0000000..33ed2b5 --- /dev/null +++ b/scripts/defines.ts @@ -0,0 +1,18 @@ +/** + * Shared MACRO define map used by both dev.ts (runtime -d flags) + * and build.ts (Bun.build define option). + * + * Each value is a JSON-stringified expression that replaces the + * corresponding MACRO.* identifier at transpile / bundle time. + */ +export function getMacroDefines(): Record { + return { + "MACRO.VERSION": JSON.stringify("2.1.888"), + "MACRO.BUILD_TIME": JSON.stringify(new Date().toISOString()), + "MACRO.FEEDBACK_CHANNEL": JSON.stringify(""), + "MACRO.ISSUES_EXPLAINER": JSON.stringify(""), + "MACRO.NATIVE_PACKAGE_URL": JSON.stringify(""), + "MACRO.PACKAGE_URL": JSON.stringify(""), + "MACRO.VERSION_CHANGELOG": JSON.stringify(""), + }; +} diff --git a/scripts/dev.ts b/scripts/dev.ts new file mode 100644 index 0000000..5a9ec8f --- /dev/null +++ b/scripts/dev.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env bun +/** + * Dev entrypoint — launches cli.tsx with MACRO.* defines injected + * via Bun's -d flag (bunfig.toml [define] doesn't propagate to + * dynamically imported modules at runtime). + */ +import { getMacroDefines } from "./defines.ts"; + +const defines = getMacroDefines(); + +const defineArgs = Object.entries(defines).flatMap(([k, v]) => [ + "-d", + `${k}:${v}`, +]); + +const result = Bun.spawnSync( + ["bun", "run", ...defineArgs, "src/entrypoints/cli.tsx", ...process.argv.slice(2)], + { stdio: ["inherit", "inherit", "inherit"] }, +); + +process.exit(result.exitCode ?? 0); diff --git a/src/entrypoints/cli.tsx b/src/entrypoints/cli.tsx index 2a008c5..0ee6ff3 100644 --- a/src/entrypoints/cli.tsx +++ b/src/entrypoints/cli.tsx @@ -1,21 +1,5 @@ #!/usr/bin/env bun -// Runtime polyfill for bun:bundle (build-time macros) -const feature = (_name: string) => false; -if (typeof globalThis.MACRO === "undefined") { - (globalThis as any).MACRO = { - VERSION: "2.1.888", - BUILD_TIME: new Date().toISOString(), - FEEDBACK_CHANNEL: "", - ISSUES_EXPLAINER: "", - NATIVE_PACKAGE_URL: "", - PACKAGE_URL: "", - VERSION_CHANGELOG: "", - }; -} -// Build-time constants — normally replaced by Bun bundler at compile time -(globalThis as any).BUILD_TARGET = "external"; -(globalThis as any).BUILD_ENV = "production"; -(globalThis as any).INTERFACE_TYPE = "stdio"; +import { feature } from 'bun:bundle' // Bugfix for corepack auto-pinning, which adds yarnpkg to peoples' package.jsons // eslint-disable-next-line custom-rules/no-top-level-side-effects diff --git a/src/types/global.d.ts b/src/types/global.d.ts index ceb2f55..bff3970 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -4,9 +4,8 @@ */ // ============================================================================ -// MACRO — Bun compile-time macro function (from bun:bundle) -// Expands the function body at build time and removes the call in production. -// Also supports property access like MACRO.VERSION (compile-time constants). +// MACRO — Bun compile-time constants injected via bunfig.toml [define] (dev) +// and Bun.build({ define }) (production). See bunfig.toml & build.ts. declare namespace MACRO { export const VERSION: string export const BUILD_TIME: string @@ -16,7 +15,6 @@ declare namespace MACRO { export const PACKAGE_URL: string export const VERSION_CHANGELOG: string } -declare function MACRO(fn: () => T): T // ============================================================================ // Internal Anthropic-only identifiers (dead-code eliminated in open-source) @@ -62,11 +60,7 @@ declare type T = unknown declare function TungstenPill(props?: { key?: string; selected?: boolean }): JSX.Element | null // ============================================================================ -// Build-time constants — replaced by Bun bundler, polyfilled at runtime -// Using `string` (not literal types) so comparisons don't produce TS2367 -declare const BUILD_TARGET: string -declare const BUILD_ENV: string -declare const INTERFACE_TYPE: string +// Build-time constants BUILD_TARGET/BUILD_ENV/INTERFACE_TYPE — removed (zero runtime usage) // ============================================================================ // Ink custom JSX intrinsic elements — see src/types/ink-jsx.d.ts diff --git a/src/types/internal-modules.d.ts b/src/types/internal-modules.d.ts index bf1d214..95ff7a0 100644 --- a/src/types/internal-modules.d.ts +++ b/src/types/internal-modules.d.ts @@ -9,7 +9,6 @@ // ============================================================================ declare module "bun:bundle" { export function feature(name: string): boolean; - export function MACRO(fn: () => T): T; } declare module "bun:ffi" {