mirror of
https://github.com/nexu-io/open-design.git
synced 2026-10-27 09:51:12 +01:00
* fix(tools-pack): use junctions for Windows standalone peer deps * fix(desktop): expose IPC during startup * fix(tools-pack): preserve Windows inspect diagnostics * fix(tools-pack): report Windows inspect status errors * fix(packaged): use Electron net fetch for app protocol * fix(packaged): load Windows renderer from web sidecar * fix(desktop): show Windows packaged window during startup * fix(packaged): disable Windows GPU startup * fix(tools-pack): keep Windows core smoke observable * fix(packaged): remove Windows startup probes * fix(tools-pack): trace Windows desktop IPC status * fix(tools-pack): add Windows IPC diagnose loop * fix(release): default beta-s Windows updater feed * chore: clean merged test eof * refactor(release): unify prerelease channel model * chore(release): close prerelease doc escape hatches * refactor(release): converge release channel workflows * fix(release): install toolchain in metadata jobs * fix(release): build release package before contracts * chore(release): bump development version to 0.10.1 * fix(e2e): seed windows packaged smoke runtime config * fix(release): install toolchain for metadata publish * fix(release): materialize betas metadata checkout * chore(release): bump development version to 0.10.2 * fix(release): allow betas metadata cold start from s3 * fix(e2e): support betas packaged update scenarios * fix(release): pass betas channel into packaged smoke * fix(release): set betas channel during self-hosted builds * fix(release): verify counted channel reservations * fix(release): use pnpm cmd for betas windows publish * fix(release): add betas manifest artifact fallback * fix(release): skip beta-s public metadata fetch * fix(release): read beta-s manifests from storage * fix(release): cache beta windows tools-pack builds * fix(release): inline beta mac tools-pack builds * fix(pack): deep sign unsigned mac bundles * docs(pack): document payload-first beta updater validation * fix(release): align preview tools-pack cache flow * fix(release): align prerelease tools-pack cache flow * fix(release): pass github token to prerelease metadata * fix(release): setup pnpm before feishu notify * fix(release): add stable dry-run prepublish flow * fix(release): accept completed prerelease metadata gate * fix(release): require stable release branches * fix(release): converge r2 access checks * fix(updater): use release channel parser for defaults * fix(updater): harden windows payload relaunch * fix(release): converge updater smoke fixture contract * test(e2e): require silent updater fixture output * fix(release): align stable windows smoke build path * fix(ci): include release workspace in validation * fix(ci): repair release validation lanes Generated-By: looper 0.9.10+codex.autoclean (runner=fixer, agent=codex) * fix(ci): restore zero-install Feishu notification Generated-By: looper 0.9.10+codex.autoclean (runner=fixer, agent=codex) --------- Co-authored-by: Looper <looper@noreply.github.com>
111 lines
3.6 KiB
JavaScript
111 lines
3.6 KiB
JavaScript
import { spawnSync } from "node:child_process";
|
|
import { existsSync } from "node:fs";
|
|
import { createRequire } from "node:module";
|
|
import { dirname, extname, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
const repoRoot = resolve(scriptDir, "..");
|
|
|
|
const buildTargets = [
|
|
"packages/release",
|
|
"packages/contracts",
|
|
"packages/components",
|
|
"packages/platform",
|
|
"packages/download",
|
|
"packages/host",
|
|
"packages/registry-protocol",
|
|
"packages/agui-adapter",
|
|
"packages/plugin-runtime",
|
|
"packages/sidecar-proto",
|
|
"packages/launcher-proto",
|
|
"packages/sidecar",
|
|
"packages/diagnostics",
|
|
"apps/daemon",
|
|
"tools/dev",
|
|
"tools/pack",
|
|
"tools/release",
|
|
"tools/serve",
|
|
];
|
|
|
|
const jsExtensions = new Set([".js", ".cjs", ".mjs"]);
|
|
|
|
function resolvePackageManagerInvocation() {
|
|
const pnpmExecPath = process.env.npm_execpath;
|
|
if (pnpmExecPath != null && pnpmExecPath.length > 0) {
|
|
if (jsExtensions.has(extname(pnpmExecPath).toLowerCase())) {
|
|
return { argsPrefix: [pnpmExecPath], command: process.execPath };
|
|
}
|
|
return { argsPrefix: [], command: pnpmExecPath };
|
|
}
|
|
|
|
return { argsPrefix: [], command: process.platform === "win32" ? "pnpm.cmd" : "pnpm" };
|
|
}
|
|
|
|
const packageManager = resolvePackageManagerInvocation();
|
|
|
|
for (const target of buildTargets) {
|
|
// Partial install contexts (e.g. deploy/Dockerfile copies only
|
|
// apps/daemon/package.json before `pnpm install`) lack the target's sources;
|
|
// building there fails `tsc -p tsconfig.json` with TS5058. Skip instead —
|
|
// such contexts run the real build later, once sources are in place.
|
|
if (!existsSync(resolve(repoRoot, target, "tsconfig.json"))) {
|
|
process.stdout.write(`postinstall: skipping ${target} (no tsconfig.json in this context)\n`);
|
|
continue;
|
|
}
|
|
|
|
const result = spawnSync(
|
|
packageManager.command,
|
|
[...packageManager.argsPrefix, "-C", target, "run", "build"],
|
|
{
|
|
cwd: repoRoot,
|
|
stdio: "inherit",
|
|
},
|
|
);
|
|
|
|
if (result.error != null) {
|
|
throw result.error;
|
|
}
|
|
|
|
if (result.status !== 0) {
|
|
process.exit(result.status ?? 1);
|
|
}
|
|
}
|
|
|
|
// Verify the better-sqlite3 native addon loads under the current Node.js ABI.
|
|
// better-sqlite3 is a dep of apps/daemon (not the workspace root), so resolve
|
|
// it from the daemon package context. prebuild-install may have fetched a
|
|
// prebuilt binary for a different ABI (e.g. after switching between Node 22 /
|
|
// 24 / 25). When the addon fails to dlopen, pnpm rebuild handles the rebuild
|
|
// using its own node-gyp lifecycle — no assumptions about where node-gyp lives.
|
|
const req = createRequire(resolve(repoRoot, "apps/daemon/package.json"));
|
|
let needsRebuild = false;
|
|
try {
|
|
req("better-sqlite3");
|
|
} catch (e) {
|
|
// MODULE_NOT_FOUND means daemon deps aren't installed yet — not our problem.
|
|
// Any other error (ERR_DLOPEN_FAILED, ABI mismatch, etc.) warrants a rebuild.
|
|
if (e?.code !== "MODULE_NOT_FOUND") {
|
|
needsRebuild = true;
|
|
}
|
|
}
|
|
|
|
if (needsRebuild) {
|
|
process.stdout.write(
|
|
`postinstall: rebuilding better-sqlite3 for Node.js ${process.version}...\n`,
|
|
);
|
|
const rebuild = spawnSync(
|
|
packageManager.command,
|
|
[...packageManager.argsPrefix, "--filter", "@open-design/daemon", "rebuild", "better-sqlite3"],
|
|
{ cwd: repoRoot, stdio: "inherit" },
|
|
);
|
|
if (rebuild.error != null) throw rebuild.error;
|
|
if (rebuild.status !== 0) {
|
|
process.stderr.write(
|
|
"postinstall: better-sqlite3 rebuild failed.\n" +
|
|
"Install build tools (python3, make, g++ or clang++) then run: pnpm install\n",
|
|
);
|
|
process.exit(rebuild.status ?? 1);
|
|
}
|
|
}
|