hermes-agent/apps/desktop/scripts/run-electron-builder.mjs

68 lines
2.9 KiB
JavaScript

// Wraps the electron-builder CLI so the arguments compose in one place, in
// the first spawn with no shell in between.
//
// electron-builder downloads and extracts Electron itself (via electronVersion
// + ELECTRON_MIRROR). Earlier revisions passed -c.electronDist to reuse the
// installed node_modules/electron/dist as a dodge for a 26.8.x bug that could
// re-unpack a broken Electron.app (#38673, #47917) — but 27's copyDir of that
// dist mangles the framework symlinks and codesign rejects the bundle, while
// its archive extraction preserves them. The dodge now causes the class of
// bug it prevented, so it is gone.
import fs from "node:fs"
import path from "node:path"
import { spawnSync } from "node:child_process"
import { createRequire } from "node:module"
const require = createRequire(import.meta.url)
function electronBuilderCli() {
// 27 no longer exports ./package.json; resolve the entry module and walk
// up to the package root instead.
const entry = require.resolve("electron-builder")
let dir = path.dirname(entry)
while (!fs.existsSync(path.join(dir, "package.json"))) {
const parent = path.dirname(dir)
if (parent === dir) throw new Error("electron-builder package root not found")
dir = parent
}
const bin = require(path.join(dir, "package.json")).bin
const rel = typeof bin === "string" ? bin : bin["electron-builder"]
return path.join(dir, rel)
}
const args = []
args.push(...process.argv.slice(2))
// The config file wraps package.json's "build" field to add the one option
// JSON cannot express: mac.sign.ignore as a function (Mach-O-only signing).
// package.json's "build" wins over config files unless --config is explicit,
// so name it here.
if (!args.some((a) => a === "--config" || a.startsWith("--config="))) {
args.push("--config", "electron-builder.config.cjs")
}
// Never let electron-builder publish. On a CI tag build it auto-detects
// GitHub and demands GH_TOKEN after the artifacts are already built.
// The release workflow uploads artifacts in its own step.
if (!args.includes("--publish") && !args.some((a) => a.startsWith("-p"))) {
args.push("--publish", "never")
}
// Windows signing config lives in electron-builder.config.cjs, composed from
// the AZURE_SIGN_* variables. It cannot ride through -c arguments: the
// publisherName contains spaces and commas that die in cmd.exe hops. This
// block only announces the decision in the log.
if (args.includes("--win") && process.env.AZURE_SIGN_ENDPOINT && process.env.AZURE_CLIENT_ID) {
console.log(`[run-electron-builder] Windows signing: Azure Trusted Signing at ${process.env.AZURE_SIGN_ENDPOINT}`)
}
const result = spawnSync(process.execPath, [electronBuilderCli(), ...args], {
stdio: "inherit",
})
if (result.error) {
console.error(`[run-electron-builder] spawn failed: ${result.error.message}`)
process.exit(1)
}
process.exit(result.status == null ? 1 : result.status)