claude-code-router/build/macos-release-preflight.mjs

72 lines
2.3 KiB
JavaScript

import { execFileSync } from "node:child_process";
const errors = [];
function reportAndExit() {
if (errors.length === 0) {
return;
}
console.error("macOS release preflight failed:");
for (const error of errors) {
console.error(`- ${error}`);
}
process.exit(1);
}
function run(command, args) {
try {
return execFileSync(command, args, { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
} catch (error) {
const stderr = error.stderr?.toString().trim();
const stdout = error.stdout?.toString().trim();
const details = stderr || stdout || error.message;
errors.push(`cannot run ${command} ${args.join(" ")}: ${details}`);
return "";
}
}
function hasCompleteNotaryCredentials() {
const hasAppPassword =
Boolean(process.env.APPLE_ID) &&
Boolean(process.env.APPLE_APP_SPECIFIC_PASSWORD) &&
Boolean(process.env.APPLE_TEAM_ID);
const hasApiKey =
Boolean(process.env.APPLE_API_KEY) &&
Boolean(process.env.APPLE_API_KEY_ID) &&
Boolean(process.env.APPLE_API_ISSUER);
const hasKeychainProfile = Boolean(process.env.APPLE_KEYCHAIN_PROFILE);
return hasAppPassword || hasApiKey || hasKeychainProfile;
}
if (process.platform !== "darwin") {
errors.push("macOS release builds must run on macOS.");
reportAndExit();
}
const developerDir = run("xcode-select", ["-p"]).trim();
if (developerDir.endsWith("/CommandLineTools")) {
errors.push("notarization stapling requires full Xcode. Install Xcode and run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`.");
}
run("xcrun", ["notarytool", "--version"]);
run("xcrun", ["-f", "stapler"]);
if (!process.env.CSC_LINK) {
const identities = run("security", ["find-identity", "-v", "-p", "codesigning"]);
if (!/"Developer ID Application: .+ \([A-Z0-9]+\)"/.test(identities)) {
errors.push("no Developer ID Application signing identity was found in the keychain. Install a Developer ID Application certificate or provide CSC_LINK/CSC_KEY_PASSWORD.");
}
}
if (!hasCompleteNotaryCredentials()) {
errors.push(
"missing notarization credentials. Set APPLE_API_KEY + APPLE_API_KEY_ID + APPLE_API_ISSUER, or APPLE_ID + APPLE_APP_SPECIFIC_PASSWORD + APPLE_TEAM_ID, or APPLE_KEYCHAIN_PROFILE."
);
}
reportAndExit();
console.log("macOS release preflight passed.");