Files
claude-code/scripts/post-build.ts
claude-code-best a8ed0cdce5 fix: 修复构建后 vendor 二进制路径解析错误(ripgrep/audio-capture)
构建后 chunk 文件位于 dist/chunks/(Vite)或 dist/(Bun),vendor 二进制在
dist/vendor/,但 ripgrep 和 audio-capture 的路径解析未考虑 chunks/ 层级,
导致 ENOENT。改用 import.meta.url 路径中 lastIndexOf('dist') 定位 dist 根,
并同步在 build.ts 和 post-build.ts 中添加 ripgrep vendor 文件复制。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-25 14:46:02 +08:00

66 lines
2.2 KiB
TypeScript

#!/usr/bin/env bun
/**
* Post-build processing for Vite build output.
*
* 1. Patch globalThis.Bun destructuring in third-party deps for Node.js compat
* 2. Copy native addon files
* 3. Generate dual entry points (cli-bun.js, cli-node.js)
*/
import { readdir, readFile, writeFile, cp } from "node:fs/promises";
import { chmodSync } from "node:fs";
import { join } from "node:path";
import { execSync } from "node:child_process";
const outdir = "dist";
async function postBuild() {
// Step 1: Patch globalThis.Bun destructuring from third-party deps
const files = await readdir(outdir, { recursive: true });
const BUN_DESTRUCTURE = /var \{([^}]+)\} = globalThis\.Bun;?/g;
const BUN_DESTRUCTURE_SAFE =
'var {$1} = typeof globalThis.Bun !== "undefined" ? globalThis.Bun : {};';
let bunPatched = 0;
for (const file of files) {
const filePath = join(outdir, file);
if (typeof file !== "string" || !file.endsWith(".js")) continue;
const content = await readFile(filePath, "utf-8");
if (BUN_DESTRUCTURE.test(content)) {
await writeFile(
filePath,
content.replace(BUN_DESTRUCTURE, BUN_DESTRUCTURE_SAFE),
);
bunPatched++;
}
BUN_DESTRUCTURE.lastIndex = 0;
}
// Step 2: Copy native addon files
const audioCaptureDir = join(outdir, "vendor", "audio-capture");
await cp("vendor/audio-capture", audioCaptureDir, { recursive: true } as never);
console.log(`Copied vendor/audio-capture/ → ${audioCaptureDir}/`);
const ripgrepDir = join(outdir, "vendor", "ripgrep");
await cp("src/utils/vendor/ripgrep", ripgrepDir, { recursive: true } as never);
console.log(`Copied src/utils/vendor/ripgrep/ → ${ripgrepDir}/`);
// Step 3: Generate dual entry points
const cliBun = join(outdir, "cli-bun.js");
const cliNode = join(outdir, "cli-node.js");
await writeFile(cliBun, '#!/usr/bin/env bun\nimport "./cli.js"\n');
await writeFile(cliNode, '#!/usr/bin/env node\nimport "./cli.js"\n');
chmodSync(cliBun, 0o755);
chmodSync(cliNode, 0o755);
console.log(
`Post-build complete: patched ${bunPatched} Bun destructure, generated entry points`,
);
}
postBuild().catch((err) => {
console.error("Post-build failed:", err);
process.exit(1);
});