From 320cee2d29a00c80a504c3609955745e595e8353 Mon Sep 17 00:00:00 2001 From: 777genius Date: Mon, 25 May 2026 23:29:11 +0300 Subject: [PATCH] fix(build): guard packaged renderer bundles --- scripts/ci/verify-radix-renderer-bundle.mjs | 7 ++++++- scripts/electron-builder/dist.mjs | 23 ++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/scripts/ci/verify-radix-renderer-bundle.mjs b/scripts/ci/verify-radix-renderer-bundle.mjs index bae2d7f5..527c4763 100644 --- a/scripts/ci/verify-radix-renderer-bundle.mjs +++ b/scripts/ci/verify-radix-renderer-bundle.mjs @@ -7,7 +7,12 @@ const rendererBundles = readdirSync(assetsDir) .sort(); if (rendererBundles.length === 0) { - console.error('No renderer JavaScript bundles found under out/renderer/assets.'); + console.error( + [ + 'No renderer JavaScript bundles found under out/renderer/assets.', + 'Run `pnpm build` before packaging production artifacts.', + ].join('\n') + ); process.exit(1); } diff --git a/scripts/electron-builder/dist.mjs b/scripts/electron-builder/dist.mjs index cc98ed61..da1d8765 100644 --- a/scripts/electron-builder/dist.mjs +++ b/scripts/electron-builder/dist.mjs @@ -1,13 +1,32 @@ #!/usr/bin/env node import { spawn } from 'node:child_process'; import { createRequire } from 'node:module'; -import { pathToFileURL } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; const require = createRequire(import.meta.url); const { buildElectronBuilderInvocations } = require('./dist-invocations.cjs'); export { buildElectronBuilderInvocations }; +async function runRendererBundleGuard() { + const guardPath = fileURLToPath(new URL('../ci/verify-radix-renderer-bundle.mjs', import.meta.url)); + await new Promise((resolve, reject) => { + const child = spawn(process.execPath, [guardPath], { + stdio: 'inherit', + env: process.env, + }); + + child.on('error', reject); + child.on('exit', (code, signal) => { + if (code === 0) { + resolve(); + return; + } + reject(new Error(`renderer bundle guard failed with ${signal ?? `exit code ${code}`}`)); + }); + }); +} + async function runElectronBuilder(args) { const cliPath = require.resolve('electron-builder/cli.js'); await new Promise((resolve, reject) => { @@ -41,6 +60,8 @@ async function main(argv) { return; } + await runRendererBundleGuard(); + for (const invocation of invocations) { await runElectronBuilder(invocation.args); }