everything-dev 1.46.0 → 1.46.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/build.cjs CHANGED
@@ -97,27 +97,31 @@ async function runBuildAttempt(cmd, args, cwd, env, verbose, wsKey) {
97
97
  const exitCode = result?.exitCode ?? 0;
98
98
  const output = `${stdout}\n${stderr}`;
99
99
  const deployEntries = require_integrity.parseDeployLines(output);
100
+ if (deployEntries.length > 0) {
101
+ const result = {
102
+ success: true,
103
+ url: deployEntries[0]?.url,
104
+ exitCode: 0,
105
+ output,
106
+ deployEntries
107
+ };
108
+ if (exitCode !== 0) {
109
+ const errorLines = output.split("\n").filter((line) => /\bERROR\b/.test(line) || line.startsWith("Rspack compiled with")).slice(0, 5);
110
+ if (errorLines.length > 0) {
111
+ result.warnings = errorLines.map((l) => l.trim());
112
+ if (!verbose) {
113
+ console.log(` ${require_theme.colors.yellow("⚠")} Build completed with errors (exit code ${exitCode}) — Zephyr deployed successfully`);
114
+ for (const line of errorLines) console.log(` ${require_theme.colors.dim(line.trim())}`);
115
+ }
116
+ }
117
+ }
118
+ return result;
119
+ }
100
120
  if (exitCode !== 0) return {
101
121
  success: false,
102
122
  error: `Build failed (exit code ${exitCode})\n${output.trim().split("\n").slice(-5).join("\n")}`,
103
123
  exitCode,
104
- output,
105
- deployEntries
106
- };
107
- const zeMatch = output.match(/ZE\d+/);
108
- if (zeMatch) return {
109
- success: false,
110
- error: `Zephyr upload failed (${zeMatch[0]})`,
111
- exitCode: 0,
112
- output,
113
- deployEntries
114
- };
115
- if (deployEntries.length > 0) return {
116
- success: true,
117
- url: deployEntries[0]?.url,
118
- exitCode: 0,
119
- output,
120
- deployEntries
124
+ output
121
125
  };
122
126
  const deployMatch = output.match(/🚀.*Deployed:\s*(https?:\S+)/);
123
127
  if (deployMatch) return {
@@ -126,6 +130,13 @@ async function runBuildAttempt(cmd, args, cwd, env, verbose, wsKey) {
126
130
  exitCode: 0,
127
131
  output
128
132
  };
133
+ const zeMatch = output.match(/ZE\d{4,}/);
134
+ if (zeMatch) return {
135
+ success: false,
136
+ error: `Zephyr upload failed (${zeMatch[0]})`,
137
+ exitCode: 0,
138
+ output
139
+ };
129
140
  if (env.DEPLOY === "true") return {
130
141
  success: false,
131
142
  error: "No deploy URL found (Zephyr may have failed)",
@@ -151,10 +162,12 @@ async function buildOneWorkspace(ws, env, opts) {
151
162
  const startTime = Date.now();
152
163
  let attempt = await runBuildAttempt(buildConfig.cmd, buildConfig.args, ws.path, wsEnv, opts.verbose ?? false, ws.key);
153
164
  let retried = false;
165
+ const firstAttempt = attempt.success ? void 0 : { ...attempt };
154
166
  if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {
155
167
  if (!opts.verbose) console.log(` ${require_theme.colors.yellow("↻")} ${require_string.padRight(ws.key, 28)} retrying...`);
156
168
  retried = true;
157
169
  attempt = await runBuildAttempt(buildConfig.cmd, buildConfig.args, ws.path, wsEnv, opts.verbose ?? false, ws.key);
170
+ if (!attempt.success && firstAttempt) attempt.error = `First attempt: ${firstAttempt.error}\nRetry: ${attempt.error}`;
158
171
  }
159
172
  const durationMs = Date.now() - startTime;
160
173
  const result = {
@@ -163,6 +176,7 @@ async function buildOneWorkspace(ws, env, opts) {
163
176
  success: attempt.success,
164
177
  url: attempt.url,
165
178
  error: attempt.error,
179
+ warnings: attempt.warnings,
166
180
  deployEntries: attempt.deployEntries,
167
181
  durationMs,
168
182
  retried: retried ? true : void 0
@@ -1 +1 @@
1
- {"version":3,"file":"build.cjs","names":["resolveLocalDevelopmentPath","run","colors","parseDeployLines","padRight","formatDuration","icons","syncResolvedSharedDeps","process","applyDeployResults"],"sources":["../src/build.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { formatDuration } from \"./cli/timing\";\nimport { resolveLocalDevelopmentPath } from \"./config\";\nimport type { WorkspaceDeployResult } from \"./contract\";\nimport { applyDeployResults, type DeployResultEntry, parseDeployLines } from \"./integrity\";\nimport { syncResolvedSharedDeps } from \"./shared-deps\";\nimport type { BosConfig, BosPluginRef, RuntimeConfig } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { padRight } from \"./utils/string\";\nimport { colors, icons } from \"./utils/theme\";\n\nconst buildCommands: Record<string, { cmd: string; args: string[] }> = {\n host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n api: { cmd: \"bun\", args: [\"run\", \"build\"] },\n};\n\ntype WorkspaceTarget = {\n key: string;\n kind: \"app\" | \"plugin\";\n path: string;\n};\n\nexport function getPluginRef(entry: string | BosPluginRef | undefined | null): BosPluginRef | null {\n if (!entry || typeof entry === \"string\") return null;\n return entry;\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nfunction resolveWorkspaceTarget(\n key: string,\n bosConfig: BosConfig | null,\n runtimeConfig: RuntimeConfig | null,\n configDir: string,\n): WorkspaceTarget | null {\n if (bosConfig?.app && key in bosConfig.app) {\n const appEntry = (bosConfig.app as Record<string, { development?: string }>)[key];\n const devPath = resolveLocalDevelopmentPath(appEntry?.development, configDir);\n if (devPath) {\n return {\n key,\n kind: \"app\",\n path: devPath,\n };\n }\n return {\n key,\n kind: \"app\",\n path: `${configDir}/${key}`,\n };\n }\n\n const runtimePlugin = runtimeConfig?.plugins?.[key];\n const pluginPath =\n runtimePlugin?.localPath ??\n resolveLocalDevelopmentPath(getPluginRef(bosConfig?.plugins?.[key])?.development, configDir);\n if (pluginPath) {\n return {\n key,\n kind: \"plugin\",\n path: pluginPath,\n };\n }\n\n return null;\n}\n\nexport function selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n const allPackages = [\n ...Object.keys(bosConfig?.app ?? {}),\n ...Object.keys(bosConfig?.plugins ?? {}),\n ];\n if (packages === \"all\") {\n return allPackages;\n }\n\n return packages\n .split(\",\")\n .map((pkg) => pkg.trim())\n .filter((pkg) => allPackages.includes(pkg));\n}\n\ninterface BuildAttemptResult {\n success: boolean;\n url?: string;\n error?: string;\n exitCode: number;\n output: string;\n deployEntries?: DeployResultEntry[];\n}\n\nasync function runBuildAttempt(\n cmd: string,\n args: string[],\n cwd: string,\n env: Record<string, string>,\n verbose: boolean,\n wsKey: string,\n): Promise<BuildAttemptResult> {\n let zephyrAuthShown = false;\n const result = await run(cmd, args, {\n cwd,\n env,\n capture: true,\n onChunk: (stream, chunk) => {\n if (verbose) {\n if (stream === \"stdout\") process.stdout.write(chunk);\n else process.stderr.write(chunk);\n }\n if (zephyrAuthShown) return;\n const text = chunk.toString(\"utf-8\");\n if (\n /Authentication required.*log in to Zephyr/i.test(text) ||\n /auth\\.zephyr-cloud\\.io\\/authorize/.test(text)\n ) {\n zephyrAuthShown = true;\n const urlMatch = text.match(/https:\\/\\/auth\\.zephyr-cloud\\.io\\/authorize\\S+/);\n console.log();\n console.log(colors.yellow(` ⚠ Zephyr authentication required for ${wsKey}`));\n if (urlMatch) {\n console.log(` ${colors.cyan(urlMatch[0])}`);\n }\n console.log(colors.dim(\" Waiting for authentication...\"));\n console.log();\n }\n },\n });\n const stdout = result?.stdout ?? \"\";\n const stderr = result?.stderr ?? \"\";\n const exitCode = result?.exitCode ?? 0;\n const output = `${stdout}\\n${stderr}`;\n\n const deployEntries = parseDeployLines(output);\n\n if (exitCode !== 0) {\n const lastLines = output.trim().split(\"\\n\").slice(-5).join(\"\\n\");\n return {\n success: false,\n error: `Build failed (exit code ${exitCode})\\n${lastLines}`,\n exitCode,\n output,\n deployEntries,\n };\n }\n\n const zeMatch = output.match(/ZE\\d+/);\n if (zeMatch) {\n return {\n success: false,\n error: `Zephyr upload failed (${zeMatch[0]})`,\n exitCode: 0,\n output,\n deployEntries,\n };\n }\n\n if (deployEntries.length > 0) {\n return { success: true, url: deployEntries[0]?.url, exitCode: 0, output, deployEntries };\n }\n\n const deployMatch = output.match(/🚀.*Deployed:\\s*(https?:\\S+)/);\n if (deployMatch) {\n return { success: true, url: deployMatch[1], exitCode: 0, output };\n }\n\n if (env.DEPLOY === \"true\") {\n return {\n success: false,\n error: \"No deploy URL found (Zephyr may have failed)\",\n exitCode: 0,\n output,\n };\n }\n return { success: true, exitCode: 0, output };\n}\n\ninterface InternalWorkspaceResult extends WorkspaceDeployResult {\n deployEntries?: DeployResultEntry[];\n}\n\nasync function buildOneWorkspace(\n ws: WorkspaceTarget,\n env: Record<string, string>,\n opts: { deploy: boolean; verbose?: boolean },\n): Promise<InternalWorkspaceResult> {\n const pkgJson = await readJsonFile<{\n scripts?: Record<string, string>;\n }>(`${ws.path}/package.json`);\n const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n const buildConfig = shouldDeployScript\n ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n : (buildCommands[ws.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n const wsEnv = { ...env };\n\n const startTime = Date.now();\n let attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n\n let retried = false;\n\n if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {\n if (!opts.verbose) {\n console.log(` ${colors.yellow(\"↻\")} ${padRight(ws.key, 28)} retrying...`);\n }\n retried = true;\n attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n }\n\n const durationMs = Date.now() - startTime;\n const result: InternalWorkspaceResult = {\n key: ws.key,\n kind: ws.kind,\n success: attempt.success,\n url: attempt.url,\n error: attempt.error,\n deployEntries: attempt.deployEntries,\n durationMs,\n retried: retried ? true : undefined,\n };\n\n if (!opts.verbose) {\n const name = padRight(ws.key, 28);\n if (result.success) {\n const duration = formatDuration(durationMs);\n const retryTag = retried ? \" (retried)\" : \"\";\n console.log(` ${colors.green(icons.ok)} ${name} ${colors.dim(duration + retryTag)}`);\n } else {\n const errorLine = (result.error ?? \"Failed\").split(\"\\n\")[0];\n console.log(` ${colors.error(icons.err)} ${name} ${errorLine}`);\n }\n }\n\n return result;\n}\n\nexport async function buildWorkspaceTargets(opts: {\n configDir: string;\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n targets: string[];\n deploy: boolean;\n verbose?: boolean;\n}): Promise<{\n built: string[];\n skipped: string[];\n deployResults?: WorkspaceDeployResult[];\n}> {\n const existing: WorkspaceTarget[] = [];\n const skipped: string[] = [];\n\n for (const target of opts.targets) {\n const resolved = resolveWorkspaceTarget(\n target,\n opts.bosConfig,\n opts.runtimeConfig,\n opts.configDir,\n );\n if (!resolved) {\n skipped.push(target);\n continue;\n }\n\n const exists = await fileExists(`${resolved.path}/package.json`);\n if (exists) existing.push(resolved);\n else skipped.push(target);\n }\n\n if (existing.length === 0) {\n return { built: [], skipped };\n }\n\n const sharedSync = await syncResolvedSharedDeps({\n configDir: opts.configDir,\n hostMode: \"local\",\n bosConfig: opts.bosConfig ?? undefined,\n extendsChain: [],\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n }\n\n const shouldBuildPlugin = existing.some((entry) => entry.key === \"api\");\n\n const forceRebuild = opts.deploy;\n const buildTasks: Promise<void>[] = [buildEverythingDevQuietly(opts.configDir, forceRebuild)];\n if (shouldBuildPlugin) {\n buildTasks.push(buildEveryPluginQuietly(opts.configDir, forceRebuild));\n }\n await Promise.all(buildTasks);\n\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: opts.deploy ? \"production\" : \"development\",\n };\n if (opts.deploy) {\n env.DEPLOY = \"true\";\n } else {\n delete env.DEPLOY;\n }\n\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n let configSnapshot: string | undefined;\n if (opts.deploy && existsSync(bosConfigPath)) {\n configSnapshot = readFileSync(bosConfigPath, \"utf-8\");\n }\n\n const orderedExisting = opts.deploy\n ? [\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n ...existing.filter((entry) => entry.kind === \"plugin\"),\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n ]\n : existing;\n\n const parallelGroup = opts.deploy\n ? orderedExisting.filter((e) => e.key !== \"host\")\n : orderedExisting;\n const sequentialGroup = opts.deploy ? orderedExisting.filter((e) => e.key === \"host\") : [];\n\n const built: string[] = [];\n const deployResults: WorkspaceDeployResult[] = [];\n\n if (opts.deploy && parallelGroup.length > 0) {\n const total = parallelGroup.length + sequentialGroup.length;\n console.log();\n console.log(` Building ${total} workspace${total > 1 ? \"s\" : \"\"}...`);\n console.log();\n\n const results = await Promise.allSettled(\n parallelGroup.map((ws) => buildOneWorkspace(ws, env, opts)),\n );\n\n const allDeployEntries: DeployResultEntry[] = [];\n for (let i = 0; i < parallelGroup.length; i++) {\n const ws = parallelGroup[i];\n const result = results[i];\n if (result.status === \"fulfilled\") {\n if (result.value.success) {\n built.push(ws.key);\n }\n if (result.value.deployEntries) {\n allDeployEntries.push(...result.value.deployEntries);\n }\n const { deployEntries: _deployEntries, ...deployResult } = result.value;\n deployResults.push(deployResult);\n } else {\n deployResults.push({\n key: ws.key,\n kind: ws.kind,\n success: false,\n error: result.reason?.message ?? \"Unknown error\",\n });\n }\n }\n\n if (configSnapshot && allDeployEntries.length > 0) {\n const config = JSON.parse(configSnapshot) as Record<string, unknown>;\n const merged = applyDeployResults(config, allDeployEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n\n for (const ws of sequentialGroup) {\n const result = await buildOneWorkspace(ws, env, opts);\n if (result.success) {\n built.push(ws.key);\n }\n if (result.deployEntries) {\n const hostEntries = result.deployEntries.filter((r) => r.urlField.startsWith(\"app.host\"));\n if (hostEntries.length > 0 && existsSync(bosConfigPath)) {\n const currentConfig = JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n const merged = applyDeployResults(currentConfig, hostEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n }\n const { deployEntries: _deployEntries, ...sequentialResult } = result;\n deployResults.push(sequentialResult);\n }\n\n console.log();\n } else {\n for (const resolved of orderedExisting) {\n const buildConfig = buildCommands[resolved.key] ?? {\n cmd: \"bun\",\n args: [\"run\", \"build\"],\n };\n\n await run(buildConfig.cmd, buildConfig.args, {\n cwd: resolved.path,\n env,\n });\n built.push(resolved.key);\n }\n }\n\n return { built, skipped, deployResults: opts.deploy ? deployResults : undefined };\n}\n\nexport async function buildEveryPluginQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/every-plugin`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n );\n}\n\nexport async function buildEverythingDevQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/everything-dev`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"build.cjs","names":["resolveLocalDevelopmentPath","run","colors","parseDeployLines","padRight","formatDuration","icons","syncResolvedSharedDeps","process","applyDeployResults"],"sources":["../src/build.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { formatDuration } from \"./cli/timing\";\nimport { resolveLocalDevelopmentPath } from \"./config\";\nimport type { WorkspaceDeployResult } from \"./contract\";\nimport { applyDeployResults, type DeployResultEntry, parseDeployLines } from \"./integrity\";\nimport { syncResolvedSharedDeps } from \"./shared-deps\";\nimport type { BosConfig, BosPluginRef, RuntimeConfig } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { padRight } from \"./utils/string\";\nimport { colors, icons } from \"./utils/theme\";\n\nconst buildCommands: Record<string, { cmd: string; args: string[] }> = {\n host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n api: { cmd: \"bun\", args: [\"run\", \"build\"] },\n};\n\ntype WorkspaceTarget = {\n key: string;\n kind: \"app\" | \"plugin\";\n path: string;\n};\n\nexport function getPluginRef(entry: string | BosPluginRef | undefined | null): BosPluginRef | null {\n if (!entry || typeof entry === \"string\") return null;\n return entry;\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nfunction resolveWorkspaceTarget(\n key: string,\n bosConfig: BosConfig | null,\n runtimeConfig: RuntimeConfig | null,\n configDir: string,\n): WorkspaceTarget | null {\n if (bosConfig?.app && key in bosConfig.app) {\n const appEntry = (bosConfig.app as Record<string, { development?: string }>)[key];\n const devPath = resolveLocalDevelopmentPath(appEntry?.development, configDir);\n if (devPath) {\n return {\n key,\n kind: \"app\",\n path: devPath,\n };\n }\n return {\n key,\n kind: \"app\",\n path: `${configDir}/${key}`,\n };\n }\n\n const runtimePlugin = runtimeConfig?.plugins?.[key];\n const pluginPath =\n runtimePlugin?.localPath ??\n resolveLocalDevelopmentPath(getPluginRef(bosConfig?.plugins?.[key])?.development, configDir);\n if (pluginPath) {\n return {\n key,\n kind: \"plugin\",\n path: pluginPath,\n };\n }\n\n return null;\n}\n\nexport function selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n const allPackages = [\n ...Object.keys(bosConfig?.app ?? {}),\n ...Object.keys(bosConfig?.plugins ?? {}),\n ];\n if (packages === \"all\") {\n return allPackages;\n }\n\n return packages\n .split(\",\")\n .map((pkg) => pkg.trim())\n .filter((pkg) => allPackages.includes(pkg));\n}\n\ninterface BuildAttemptResult {\n success: boolean;\n url?: string;\n error?: string;\n warnings?: string[];\n exitCode: number;\n output: string;\n deployEntries?: DeployResultEntry[];\n}\n\nasync function runBuildAttempt(\n cmd: string,\n args: string[],\n cwd: string,\n env: Record<string, string>,\n verbose: boolean,\n wsKey: string,\n): Promise<BuildAttemptResult> {\n let zephyrAuthShown = false;\n const result = await run(cmd, args, {\n cwd,\n env,\n capture: true,\n onChunk: (stream, chunk) => {\n if (verbose) {\n if (stream === \"stdout\") process.stdout.write(chunk);\n else process.stderr.write(chunk);\n }\n if (zephyrAuthShown) return;\n const text = chunk.toString(\"utf-8\");\n if (\n /Authentication required.*log in to Zephyr/i.test(text) ||\n /auth\\.zephyr-cloud\\.io\\/authorize/.test(text)\n ) {\n zephyrAuthShown = true;\n const urlMatch = text.match(/https:\\/\\/auth\\.zephyr-cloud\\.io\\/authorize\\S+/);\n console.log();\n console.log(colors.yellow(` ⚠ Zephyr authentication required for ${wsKey}`));\n if (urlMatch) {\n console.log(` ${colors.cyan(urlMatch[0])}`);\n }\n console.log(colors.dim(\" Waiting for authentication...\"));\n console.log();\n }\n },\n });\n const stdout = result?.stdout ?? \"\";\n const stderr = result?.stderr ?? \"\";\n const exitCode = result?.exitCode ?? 0;\n const output = `${stdout}\\n${stderr}`;\n\n const deployEntries = parseDeployLines(output);\n\n if (deployEntries.length > 0) {\n const result: BuildAttemptResult = {\n success: true,\n url: deployEntries[0]?.url,\n exitCode: 0,\n output,\n deployEntries,\n };\n if (exitCode !== 0) {\n const errorLines = output\n .split(\"\\n\")\n .filter((line) => /\\bERROR\\b/.test(line) || line.startsWith(\"Rspack compiled with\"))\n .slice(0, 5);\n if (errorLines.length > 0) {\n result.warnings = errorLines.map((l) => l.trim());\n if (!verbose) {\n console.log(\n ` ${colors.yellow(\"⚠\")} Build completed with errors (exit code ${exitCode}) — Zephyr deployed successfully`,\n );\n for (const line of errorLines) {\n console.log(` ${colors.dim(line.trim())}`);\n }\n }\n }\n }\n return result;\n }\n\n if (exitCode !== 0) {\n const lastLines = output.trim().split(\"\\n\").slice(-5).join(\"\\n\");\n return {\n success: false,\n error: `Build failed (exit code ${exitCode})\\n${lastLines}`,\n exitCode,\n output,\n };\n }\n\n const deployMatch = output.match(/🚀.*Deployed:\\s*(https?:\\S+)/);\n if (deployMatch) {\n return { success: true, url: deployMatch[1], exitCode: 0, output };\n }\n\n const zeMatch = output.match(/ZE\\d{4,}/);\n if (zeMatch) {\n return {\n success: false,\n error: `Zephyr upload failed (${zeMatch[0]})`,\n exitCode: 0,\n output,\n };\n }\n\n if (env.DEPLOY === \"true\") {\n return {\n success: false,\n error: \"No deploy URL found (Zephyr may have failed)\",\n exitCode: 0,\n output,\n };\n }\n return { success: true, exitCode: 0, output };\n}\n\ninterface InternalWorkspaceResult extends WorkspaceDeployResult {\n deployEntries?: DeployResultEntry[];\n}\n\nasync function buildOneWorkspace(\n ws: WorkspaceTarget,\n env: Record<string, string>,\n opts: { deploy: boolean; verbose?: boolean },\n): Promise<InternalWorkspaceResult> {\n const pkgJson = await readJsonFile<{\n scripts?: Record<string, string>;\n }>(`${ws.path}/package.json`);\n const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n const buildConfig = shouldDeployScript\n ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n : (buildCommands[ws.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n const wsEnv = { ...env };\n\n const startTime = Date.now();\n let attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n\n let retried = false;\n const firstAttempt: BuildAttemptResult | undefined = attempt.success ? undefined : { ...attempt };\n\n if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {\n if (!opts.verbose) {\n console.log(` ${colors.yellow(\"↻\")} ${padRight(ws.key, 28)} retrying...`);\n }\n retried = true;\n attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n\n if (!attempt.success && firstAttempt) {\n attempt.error = `First attempt: ${firstAttempt.error}\\nRetry: ${attempt.error}`;\n }\n }\n\n const durationMs = Date.now() - startTime;\n const result: InternalWorkspaceResult = {\n key: ws.key,\n kind: ws.kind,\n success: attempt.success,\n url: attempt.url,\n error: attempt.error,\n warnings: attempt.warnings,\n deployEntries: attempt.deployEntries,\n durationMs,\n retried: retried ? true : undefined,\n };\n\n if (!opts.verbose) {\n const name = padRight(ws.key, 28);\n if (result.success) {\n const duration = formatDuration(durationMs);\n const retryTag = retried ? \" (retried)\" : \"\";\n console.log(` ${colors.green(icons.ok)} ${name} ${colors.dim(duration + retryTag)}`);\n } else {\n const errorLine = (result.error ?? \"Failed\").split(\"\\n\")[0];\n console.log(` ${colors.error(icons.err)} ${name} ${errorLine}`);\n }\n }\n\n return result;\n}\n\nexport async function buildWorkspaceTargets(opts: {\n configDir: string;\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n targets: string[];\n deploy: boolean;\n verbose?: boolean;\n}): Promise<{\n built: string[];\n skipped: string[];\n deployResults?: WorkspaceDeployResult[];\n}> {\n const existing: WorkspaceTarget[] = [];\n const skipped: string[] = [];\n\n for (const target of opts.targets) {\n const resolved = resolveWorkspaceTarget(\n target,\n opts.bosConfig,\n opts.runtimeConfig,\n opts.configDir,\n );\n if (!resolved) {\n skipped.push(target);\n continue;\n }\n\n const exists = await fileExists(`${resolved.path}/package.json`);\n if (exists) existing.push(resolved);\n else skipped.push(target);\n }\n\n if (existing.length === 0) {\n return { built: [], skipped };\n }\n\n const sharedSync = await syncResolvedSharedDeps({\n configDir: opts.configDir,\n hostMode: \"local\",\n bosConfig: opts.bosConfig ?? undefined,\n extendsChain: [],\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n }\n\n const shouldBuildPlugin = existing.some((entry) => entry.key === \"api\");\n\n const forceRebuild = opts.deploy;\n const buildTasks: Promise<void>[] = [buildEverythingDevQuietly(opts.configDir, forceRebuild)];\n if (shouldBuildPlugin) {\n buildTasks.push(buildEveryPluginQuietly(opts.configDir, forceRebuild));\n }\n await Promise.all(buildTasks);\n\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: opts.deploy ? \"production\" : \"development\",\n };\n if (opts.deploy) {\n env.DEPLOY = \"true\";\n } else {\n delete env.DEPLOY;\n }\n\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n let configSnapshot: string | undefined;\n if (opts.deploy && existsSync(bosConfigPath)) {\n configSnapshot = readFileSync(bosConfigPath, \"utf-8\");\n }\n\n const orderedExisting = opts.deploy\n ? [\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n ...existing.filter((entry) => entry.kind === \"plugin\"),\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n ]\n : existing;\n\n const parallelGroup = opts.deploy\n ? orderedExisting.filter((e) => e.key !== \"host\")\n : orderedExisting;\n const sequentialGroup = opts.deploy ? orderedExisting.filter((e) => e.key === \"host\") : [];\n\n const built: string[] = [];\n const deployResults: WorkspaceDeployResult[] = [];\n\n if (opts.deploy && parallelGroup.length > 0) {\n const total = parallelGroup.length + sequentialGroup.length;\n console.log();\n console.log(` Building ${total} workspace${total > 1 ? \"s\" : \"\"}...`);\n console.log();\n\n const results = await Promise.allSettled(\n parallelGroup.map((ws) => buildOneWorkspace(ws, env, opts)),\n );\n\n const allDeployEntries: DeployResultEntry[] = [];\n for (let i = 0; i < parallelGroup.length; i++) {\n const ws = parallelGroup[i];\n const result = results[i];\n if (result.status === \"fulfilled\") {\n if (result.value.success) {\n built.push(ws.key);\n }\n if (result.value.deployEntries) {\n allDeployEntries.push(...result.value.deployEntries);\n }\n const { deployEntries: _deployEntries, ...deployResult } = result.value;\n deployResults.push(deployResult);\n } else {\n deployResults.push({\n key: ws.key,\n kind: ws.kind,\n success: false,\n error: result.reason?.message ?? \"Unknown error\",\n });\n }\n }\n\n if (configSnapshot && allDeployEntries.length > 0) {\n const config = JSON.parse(configSnapshot) as Record<string, unknown>;\n const merged = applyDeployResults(config, allDeployEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n\n for (const ws of sequentialGroup) {\n const result = await buildOneWorkspace(ws, env, opts);\n if (result.success) {\n built.push(ws.key);\n }\n if (result.deployEntries) {\n const hostEntries = result.deployEntries.filter((r) => r.urlField.startsWith(\"app.host\"));\n if (hostEntries.length > 0 && existsSync(bosConfigPath)) {\n const currentConfig = JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n const merged = applyDeployResults(currentConfig, hostEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n }\n const { deployEntries: _deployEntries, ...sequentialResult } = result;\n deployResults.push(sequentialResult);\n }\n\n console.log();\n } else {\n for (const resolved of orderedExisting) {\n const buildConfig = buildCommands[resolved.key] ?? {\n cmd: \"bun\",\n args: [\"run\", \"build\"],\n };\n\n await run(buildConfig.cmd, buildConfig.args, {\n cwd: resolved.path,\n env,\n });\n built.push(resolved.key);\n }\n }\n\n return { built, skipped, deployResults: opts.deploy ? deployResults : undefined };\n}\n\nexport async function buildEveryPluginQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/every-plugin`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n );\n}\n\nexport async function buildEverythingDevQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/everything-dev`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n );\n}\n"],"mappings":"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"}
package/dist/build.mjs CHANGED
@@ -95,27 +95,31 @@ async function runBuildAttempt(cmd, args, cwd, env, verbose, wsKey) {
95
95
  const exitCode = result?.exitCode ?? 0;
96
96
  const output = `${stdout}\n${stderr}`;
97
97
  const deployEntries = parseDeployLines(output);
98
+ if (deployEntries.length > 0) {
99
+ const result = {
100
+ success: true,
101
+ url: deployEntries[0]?.url,
102
+ exitCode: 0,
103
+ output,
104
+ deployEntries
105
+ };
106
+ if (exitCode !== 0) {
107
+ const errorLines = output.split("\n").filter((line) => /\bERROR\b/.test(line) || line.startsWith("Rspack compiled with")).slice(0, 5);
108
+ if (errorLines.length > 0) {
109
+ result.warnings = errorLines.map((l) => l.trim());
110
+ if (!verbose) {
111
+ console.log(` ${colors.yellow("⚠")} Build completed with errors (exit code ${exitCode}) — Zephyr deployed successfully`);
112
+ for (const line of errorLines) console.log(` ${colors.dim(line.trim())}`);
113
+ }
114
+ }
115
+ }
116
+ return result;
117
+ }
98
118
  if (exitCode !== 0) return {
99
119
  success: false,
100
120
  error: `Build failed (exit code ${exitCode})\n${output.trim().split("\n").slice(-5).join("\n")}`,
101
121
  exitCode,
102
- output,
103
- deployEntries
104
- };
105
- const zeMatch = output.match(/ZE\d+/);
106
- if (zeMatch) return {
107
- success: false,
108
- error: `Zephyr upload failed (${zeMatch[0]})`,
109
- exitCode: 0,
110
- output,
111
- deployEntries
112
- };
113
- if (deployEntries.length > 0) return {
114
- success: true,
115
- url: deployEntries[0]?.url,
116
- exitCode: 0,
117
- output,
118
- deployEntries
122
+ output
119
123
  };
120
124
  const deployMatch = output.match(/🚀.*Deployed:\s*(https?:\S+)/);
121
125
  if (deployMatch) return {
@@ -124,6 +128,13 @@ async function runBuildAttempt(cmd, args, cwd, env, verbose, wsKey) {
124
128
  exitCode: 0,
125
129
  output
126
130
  };
131
+ const zeMatch = output.match(/ZE\d{4,}/);
132
+ if (zeMatch) return {
133
+ success: false,
134
+ error: `Zephyr upload failed (${zeMatch[0]})`,
135
+ exitCode: 0,
136
+ output
137
+ };
127
138
  if (env.DEPLOY === "true") return {
128
139
  success: false,
129
140
  error: "No deploy URL found (Zephyr may have failed)",
@@ -149,10 +160,12 @@ async function buildOneWorkspace(ws, env, opts) {
149
160
  const startTime = Date.now();
150
161
  let attempt = await runBuildAttempt(buildConfig.cmd, buildConfig.args, ws.path, wsEnv, opts.verbose ?? false, ws.key);
151
162
  let retried = false;
163
+ const firstAttempt = attempt.success ? void 0 : { ...attempt };
152
164
  if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {
153
165
  if (!opts.verbose) console.log(` ${colors.yellow("↻")} ${padRight(ws.key, 28)} retrying...`);
154
166
  retried = true;
155
167
  attempt = await runBuildAttempt(buildConfig.cmd, buildConfig.args, ws.path, wsEnv, opts.verbose ?? false, ws.key);
168
+ if (!attempt.success && firstAttempt) attempt.error = `First attempt: ${firstAttempt.error}\nRetry: ${attempt.error}`;
156
169
  }
157
170
  const durationMs = Date.now() - startTime;
158
171
  const result = {
@@ -161,6 +174,7 @@ async function buildOneWorkspace(ws, env, opts) {
161
174
  success: attempt.success,
162
175
  url: attempt.url,
163
176
  error: attempt.error,
177
+ warnings: attempt.warnings,
164
178
  deployEntries: attempt.deployEntries,
165
179
  durationMs,
166
180
  retried: retried ? true : void 0
@@ -1 +1 @@
1
- {"version":3,"file":"build.mjs","names":[],"sources":["../src/build.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { formatDuration } from \"./cli/timing\";\nimport { resolveLocalDevelopmentPath } from \"./config\";\nimport type { WorkspaceDeployResult } from \"./contract\";\nimport { applyDeployResults, type DeployResultEntry, parseDeployLines } from \"./integrity\";\nimport { syncResolvedSharedDeps } from \"./shared-deps\";\nimport type { BosConfig, BosPluginRef, RuntimeConfig } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { padRight } from \"./utils/string\";\nimport { colors, icons } from \"./utils/theme\";\n\nconst buildCommands: Record<string, { cmd: string; args: string[] }> = {\n host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n api: { cmd: \"bun\", args: [\"run\", \"build\"] },\n};\n\ntype WorkspaceTarget = {\n key: string;\n kind: \"app\" | \"plugin\";\n path: string;\n};\n\nexport function getPluginRef(entry: string | BosPluginRef | undefined | null): BosPluginRef | null {\n if (!entry || typeof entry === \"string\") return null;\n return entry;\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nfunction resolveWorkspaceTarget(\n key: string,\n bosConfig: BosConfig | null,\n runtimeConfig: RuntimeConfig | null,\n configDir: string,\n): WorkspaceTarget | null {\n if (bosConfig?.app && key in bosConfig.app) {\n const appEntry = (bosConfig.app as Record<string, { development?: string }>)[key];\n const devPath = resolveLocalDevelopmentPath(appEntry?.development, configDir);\n if (devPath) {\n return {\n key,\n kind: \"app\",\n path: devPath,\n };\n }\n return {\n key,\n kind: \"app\",\n path: `${configDir}/${key}`,\n };\n }\n\n const runtimePlugin = runtimeConfig?.plugins?.[key];\n const pluginPath =\n runtimePlugin?.localPath ??\n resolveLocalDevelopmentPath(getPluginRef(bosConfig?.plugins?.[key])?.development, configDir);\n if (pluginPath) {\n return {\n key,\n kind: \"plugin\",\n path: pluginPath,\n };\n }\n\n return null;\n}\n\nexport function selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n const allPackages = [\n ...Object.keys(bosConfig?.app ?? {}),\n ...Object.keys(bosConfig?.plugins ?? {}),\n ];\n if (packages === \"all\") {\n return allPackages;\n }\n\n return packages\n .split(\",\")\n .map((pkg) => pkg.trim())\n .filter((pkg) => allPackages.includes(pkg));\n}\n\ninterface BuildAttemptResult {\n success: boolean;\n url?: string;\n error?: string;\n exitCode: number;\n output: string;\n deployEntries?: DeployResultEntry[];\n}\n\nasync function runBuildAttempt(\n cmd: string,\n args: string[],\n cwd: string,\n env: Record<string, string>,\n verbose: boolean,\n wsKey: string,\n): Promise<BuildAttemptResult> {\n let zephyrAuthShown = false;\n const result = await run(cmd, args, {\n cwd,\n env,\n capture: true,\n onChunk: (stream, chunk) => {\n if (verbose) {\n if (stream === \"stdout\") process.stdout.write(chunk);\n else process.stderr.write(chunk);\n }\n if (zephyrAuthShown) return;\n const text = chunk.toString(\"utf-8\");\n if (\n /Authentication required.*log in to Zephyr/i.test(text) ||\n /auth\\.zephyr-cloud\\.io\\/authorize/.test(text)\n ) {\n zephyrAuthShown = true;\n const urlMatch = text.match(/https:\\/\\/auth\\.zephyr-cloud\\.io\\/authorize\\S+/);\n console.log();\n console.log(colors.yellow(` ⚠ Zephyr authentication required for ${wsKey}`));\n if (urlMatch) {\n console.log(` ${colors.cyan(urlMatch[0])}`);\n }\n console.log(colors.dim(\" Waiting for authentication...\"));\n console.log();\n }\n },\n });\n const stdout = result?.stdout ?? \"\";\n const stderr = result?.stderr ?? \"\";\n const exitCode = result?.exitCode ?? 0;\n const output = `${stdout}\\n${stderr}`;\n\n const deployEntries = parseDeployLines(output);\n\n if (exitCode !== 0) {\n const lastLines = output.trim().split(\"\\n\").slice(-5).join(\"\\n\");\n return {\n success: false,\n error: `Build failed (exit code ${exitCode})\\n${lastLines}`,\n exitCode,\n output,\n deployEntries,\n };\n }\n\n const zeMatch = output.match(/ZE\\d+/);\n if (zeMatch) {\n return {\n success: false,\n error: `Zephyr upload failed (${zeMatch[0]})`,\n exitCode: 0,\n output,\n deployEntries,\n };\n }\n\n if (deployEntries.length > 0) {\n return { success: true, url: deployEntries[0]?.url, exitCode: 0, output, deployEntries };\n }\n\n const deployMatch = output.match(/🚀.*Deployed:\\s*(https?:\\S+)/);\n if (deployMatch) {\n return { success: true, url: deployMatch[1], exitCode: 0, output };\n }\n\n if (env.DEPLOY === \"true\") {\n return {\n success: false,\n error: \"No deploy URL found (Zephyr may have failed)\",\n exitCode: 0,\n output,\n };\n }\n return { success: true, exitCode: 0, output };\n}\n\ninterface InternalWorkspaceResult extends WorkspaceDeployResult {\n deployEntries?: DeployResultEntry[];\n}\n\nasync function buildOneWorkspace(\n ws: WorkspaceTarget,\n env: Record<string, string>,\n opts: { deploy: boolean; verbose?: boolean },\n): Promise<InternalWorkspaceResult> {\n const pkgJson = await readJsonFile<{\n scripts?: Record<string, string>;\n }>(`${ws.path}/package.json`);\n const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n const buildConfig = shouldDeployScript\n ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n : (buildCommands[ws.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n const wsEnv = { ...env };\n\n const startTime = Date.now();\n let attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n\n let retried = false;\n\n if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {\n if (!opts.verbose) {\n console.log(` ${colors.yellow(\"↻\")} ${padRight(ws.key, 28)} retrying...`);\n }\n retried = true;\n attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n }\n\n const durationMs = Date.now() - startTime;\n const result: InternalWorkspaceResult = {\n key: ws.key,\n kind: ws.kind,\n success: attempt.success,\n url: attempt.url,\n error: attempt.error,\n deployEntries: attempt.deployEntries,\n durationMs,\n retried: retried ? true : undefined,\n };\n\n if (!opts.verbose) {\n const name = padRight(ws.key, 28);\n if (result.success) {\n const duration = formatDuration(durationMs);\n const retryTag = retried ? \" (retried)\" : \"\";\n console.log(` ${colors.green(icons.ok)} ${name} ${colors.dim(duration + retryTag)}`);\n } else {\n const errorLine = (result.error ?? \"Failed\").split(\"\\n\")[0];\n console.log(` ${colors.error(icons.err)} ${name} ${errorLine}`);\n }\n }\n\n return result;\n}\n\nexport async function buildWorkspaceTargets(opts: {\n configDir: string;\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n targets: string[];\n deploy: boolean;\n verbose?: boolean;\n}): Promise<{\n built: string[];\n skipped: string[];\n deployResults?: WorkspaceDeployResult[];\n}> {\n const existing: WorkspaceTarget[] = [];\n const skipped: string[] = [];\n\n for (const target of opts.targets) {\n const resolved = resolveWorkspaceTarget(\n target,\n opts.bosConfig,\n opts.runtimeConfig,\n opts.configDir,\n );\n if (!resolved) {\n skipped.push(target);\n continue;\n }\n\n const exists = await fileExists(`${resolved.path}/package.json`);\n if (exists) existing.push(resolved);\n else skipped.push(target);\n }\n\n if (existing.length === 0) {\n return { built: [], skipped };\n }\n\n const sharedSync = await syncResolvedSharedDeps({\n configDir: opts.configDir,\n hostMode: \"local\",\n bosConfig: opts.bosConfig ?? undefined,\n extendsChain: [],\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n }\n\n const shouldBuildPlugin = existing.some((entry) => entry.key === \"api\");\n\n const forceRebuild = opts.deploy;\n const buildTasks: Promise<void>[] = [buildEverythingDevQuietly(opts.configDir, forceRebuild)];\n if (shouldBuildPlugin) {\n buildTasks.push(buildEveryPluginQuietly(opts.configDir, forceRebuild));\n }\n await Promise.all(buildTasks);\n\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: opts.deploy ? \"production\" : \"development\",\n };\n if (opts.deploy) {\n env.DEPLOY = \"true\";\n } else {\n delete env.DEPLOY;\n }\n\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n let configSnapshot: string | undefined;\n if (opts.deploy && existsSync(bosConfigPath)) {\n configSnapshot = readFileSync(bosConfigPath, \"utf-8\");\n }\n\n const orderedExisting = opts.deploy\n ? [\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n ...existing.filter((entry) => entry.kind === \"plugin\"),\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n ]\n : existing;\n\n const parallelGroup = opts.deploy\n ? orderedExisting.filter((e) => e.key !== \"host\")\n : orderedExisting;\n const sequentialGroup = opts.deploy ? orderedExisting.filter((e) => e.key === \"host\") : [];\n\n const built: string[] = [];\n const deployResults: WorkspaceDeployResult[] = [];\n\n if (opts.deploy && parallelGroup.length > 0) {\n const total = parallelGroup.length + sequentialGroup.length;\n console.log();\n console.log(` Building ${total} workspace${total > 1 ? \"s\" : \"\"}...`);\n console.log();\n\n const results = await Promise.allSettled(\n parallelGroup.map((ws) => buildOneWorkspace(ws, env, opts)),\n );\n\n const allDeployEntries: DeployResultEntry[] = [];\n for (let i = 0; i < parallelGroup.length; i++) {\n const ws = parallelGroup[i];\n const result = results[i];\n if (result.status === \"fulfilled\") {\n if (result.value.success) {\n built.push(ws.key);\n }\n if (result.value.deployEntries) {\n allDeployEntries.push(...result.value.deployEntries);\n }\n const { deployEntries: _deployEntries, ...deployResult } = result.value;\n deployResults.push(deployResult);\n } else {\n deployResults.push({\n key: ws.key,\n kind: ws.kind,\n success: false,\n error: result.reason?.message ?? \"Unknown error\",\n });\n }\n }\n\n if (configSnapshot && allDeployEntries.length > 0) {\n const config = JSON.parse(configSnapshot) as Record<string, unknown>;\n const merged = applyDeployResults(config, allDeployEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n\n for (const ws of sequentialGroup) {\n const result = await buildOneWorkspace(ws, env, opts);\n if (result.success) {\n built.push(ws.key);\n }\n if (result.deployEntries) {\n const hostEntries = result.deployEntries.filter((r) => r.urlField.startsWith(\"app.host\"));\n if (hostEntries.length > 0 && existsSync(bosConfigPath)) {\n const currentConfig = JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n const merged = applyDeployResults(currentConfig, hostEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n }\n const { deployEntries: _deployEntries, ...sequentialResult } = result;\n deployResults.push(sequentialResult);\n }\n\n console.log();\n } else {\n for (const resolved of orderedExisting) {\n const buildConfig = buildCommands[resolved.key] ?? {\n cmd: \"bun\",\n args: [\"run\", \"build\"],\n };\n\n await run(buildConfig.cmd, buildConfig.args, {\n cwd: resolved.path,\n env,\n });\n built.push(resolved.key);\n }\n }\n\n return { built, skipped, deployResults: opts.deploy ? deployResults : undefined };\n}\n\nexport async function buildEveryPluginQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/every-plugin`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n );\n}\n\nexport async function buildEverythingDevQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/everything-dev`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"build.mjs","names":[],"sources":["../src/build.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport { formatDuration } from \"./cli/timing\";\nimport { resolveLocalDevelopmentPath } from \"./config\";\nimport type { WorkspaceDeployResult } from \"./contract\";\nimport { applyDeployResults, type DeployResultEntry, parseDeployLines } from \"./integrity\";\nimport { syncResolvedSharedDeps } from \"./shared-deps\";\nimport type { BosConfig, BosPluginRef, RuntimeConfig } from \"./types\";\nimport { run } from \"./utils/run\";\nimport { padRight } from \"./utils/string\";\nimport { colors, icons } from \"./utils/theme\";\n\nconst buildCommands: Record<string, { cmd: string; args: string[] }> = {\n host: { cmd: \"bun\", args: [\"run\", \"build\"] },\n ui: { cmd: \"bun\", args: [\"run\", \"build\"] },\n api: { cmd: \"bun\", args: [\"run\", \"build\"] },\n};\n\ntype WorkspaceTarget = {\n key: string;\n kind: \"app\" | \"plugin\";\n path: string;\n};\n\nexport function getPluginRef(entry: string | BosPluginRef | undefined | null): BosPluginRef | null {\n if (!entry || typeof entry === \"string\") return null;\n return entry;\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(path: string): Promise<T> {\n return JSON.parse(await readFile(path, \"utf8\")) as T;\n}\n\nfunction resolveWorkspaceTarget(\n key: string,\n bosConfig: BosConfig | null,\n runtimeConfig: RuntimeConfig | null,\n configDir: string,\n): WorkspaceTarget | null {\n if (bosConfig?.app && key in bosConfig.app) {\n const appEntry = (bosConfig.app as Record<string, { development?: string }>)[key];\n const devPath = resolveLocalDevelopmentPath(appEntry?.development, configDir);\n if (devPath) {\n return {\n key,\n kind: \"app\",\n path: devPath,\n };\n }\n return {\n key,\n kind: \"app\",\n path: `${configDir}/${key}`,\n };\n }\n\n const runtimePlugin = runtimeConfig?.plugins?.[key];\n const pluginPath =\n runtimePlugin?.localPath ??\n resolveLocalDevelopmentPath(getPluginRef(bosConfig?.plugins?.[key])?.development, configDir);\n if (pluginPath) {\n return {\n key,\n kind: \"plugin\",\n path: pluginPath,\n };\n }\n\n return null;\n}\n\nexport function selectWorkspaceTargets(packages: string, bosConfig: BosConfig | null): string[] {\n const allPackages = [\n ...Object.keys(bosConfig?.app ?? {}),\n ...Object.keys(bosConfig?.plugins ?? {}),\n ];\n if (packages === \"all\") {\n return allPackages;\n }\n\n return packages\n .split(\",\")\n .map((pkg) => pkg.trim())\n .filter((pkg) => allPackages.includes(pkg));\n}\n\ninterface BuildAttemptResult {\n success: boolean;\n url?: string;\n error?: string;\n warnings?: string[];\n exitCode: number;\n output: string;\n deployEntries?: DeployResultEntry[];\n}\n\nasync function runBuildAttempt(\n cmd: string,\n args: string[],\n cwd: string,\n env: Record<string, string>,\n verbose: boolean,\n wsKey: string,\n): Promise<BuildAttemptResult> {\n let zephyrAuthShown = false;\n const result = await run(cmd, args, {\n cwd,\n env,\n capture: true,\n onChunk: (stream, chunk) => {\n if (verbose) {\n if (stream === \"stdout\") process.stdout.write(chunk);\n else process.stderr.write(chunk);\n }\n if (zephyrAuthShown) return;\n const text = chunk.toString(\"utf-8\");\n if (\n /Authentication required.*log in to Zephyr/i.test(text) ||\n /auth\\.zephyr-cloud\\.io\\/authorize/.test(text)\n ) {\n zephyrAuthShown = true;\n const urlMatch = text.match(/https:\\/\\/auth\\.zephyr-cloud\\.io\\/authorize\\S+/);\n console.log();\n console.log(colors.yellow(` ⚠ Zephyr authentication required for ${wsKey}`));\n if (urlMatch) {\n console.log(` ${colors.cyan(urlMatch[0])}`);\n }\n console.log(colors.dim(\" Waiting for authentication...\"));\n console.log();\n }\n },\n });\n const stdout = result?.stdout ?? \"\";\n const stderr = result?.stderr ?? \"\";\n const exitCode = result?.exitCode ?? 0;\n const output = `${stdout}\\n${stderr}`;\n\n const deployEntries = parseDeployLines(output);\n\n if (deployEntries.length > 0) {\n const result: BuildAttemptResult = {\n success: true,\n url: deployEntries[0]?.url,\n exitCode: 0,\n output,\n deployEntries,\n };\n if (exitCode !== 0) {\n const errorLines = output\n .split(\"\\n\")\n .filter((line) => /\\bERROR\\b/.test(line) || line.startsWith(\"Rspack compiled with\"))\n .slice(0, 5);\n if (errorLines.length > 0) {\n result.warnings = errorLines.map((l) => l.trim());\n if (!verbose) {\n console.log(\n ` ${colors.yellow(\"⚠\")} Build completed with errors (exit code ${exitCode}) — Zephyr deployed successfully`,\n );\n for (const line of errorLines) {\n console.log(` ${colors.dim(line.trim())}`);\n }\n }\n }\n }\n return result;\n }\n\n if (exitCode !== 0) {\n const lastLines = output.trim().split(\"\\n\").slice(-5).join(\"\\n\");\n return {\n success: false,\n error: `Build failed (exit code ${exitCode})\\n${lastLines}`,\n exitCode,\n output,\n };\n }\n\n const deployMatch = output.match(/🚀.*Deployed:\\s*(https?:\\S+)/);\n if (deployMatch) {\n return { success: true, url: deployMatch[1], exitCode: 0, output };\n }\n\n const zeMatch = output.match(/ZE\\d{4,}/);\n if (zeMatch) {\n return {\n success: false,\n error: `Zephyr upload failed (${zeMatch[0]})`,\n exitCode: 0,\n output,\n };\n }\n\n if (env.DEPLOY === \"true\") {\n return {\n success: false,\n error: \"No deploy URL found (Zephyr may have failed)\",\n exitCode: 0,\n output,\n };\n }\n return { success: true, exitCode: 0, output };\n}\n\ninterface InternalWorkspaceResult extends WorkspaceDeployResult {\n deployEntries?: DeployResultEntry[];\n}\n\nasync function buildOneWorkspace(\n ws: WorkspaceTarget,\n env: Record<string, string>,\n opts: { deploy: boolean; verbose?: boolean },\n): Promise<InternalWorkspaceResult> {\n const pkgJson = await readJsonFile<{\n scripts?: Record<string, string>;\n }>(`${ws.path}/package.json`);\n const shouldDeployScript = opts.deploy && pkgJson.scripts?.deploy;\n const buildConfig = shouldDeployScript\n ? { cmd: \"bun\", args: [\"run\", \"deploy\"] }\n : (buildCommands[ws.key] ?? { cmd: \"bun\", args: [\"run\", \"build\"] });\n\n const wsEnv = { ...env };\n\n const startTime = Date.now();\n let attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n\n let retried = false;\n const firstAttempt: BuildAttemptResult | undefined = attempt.success ? undefined : { ...attempt };\n\n if (!attempt.success && attempt.exitCode === 0 && opts.deploy) {\n if (!opts.verbose) {\n console.log(` ${colors.yellow(\"↻\")} ${padRight(ws.key, 28)} retrying...`);\n }\n retried = true;\n attempt = await runBuildAttempt(\n buildConfig.cmd,\n buildConfig.args,\n ws.path,\n wsEnv,\n opts.verbose ?? false,\n ws.key,\n );\n\n if (!attempt.success && firstAttempt) {\n attempt.error = `First attempt: ${firstAttempt.error}\\nRetry: ${attempt.error}`;\n }\n }\n\n const durationMs = Date.now() - startTime;\n const result: InternalWorkspaceResult = {\n key: ws.key,\n kind: ws.kind,\n success: attempt.success,\n url: attempt.url,\n error: attempt.error,\n warnings: attempt.warnings,\n deployEntries: attempt.deployEntries,\n durationMs,\n retried: retried ? true : undefined,\n };\n\n if (!opts.verbose) {\n const name = padRight(ws.key, 28);\n if (result.success) {\n const duration = formatDuration(durationMs);\n const retryTag = retried ? \" (retried)\" : \"\";\n console.log(` ${colors.green(icons.ok)} ${name} ${colors.dim(duration + retryTag)}`);\n } else {\n const errorLine = (result.error ?? \"Failed\").split(\"\\n\")[0];\n console.log(` ${colors.error(icons.err)} ${name} ${errorLine}`);\n }\n }\n\n return result;\n}\n\nexport async function buildWorkspaceTargets(opts: {\n configDir: string;\n bosConfig: BosConfig | null;\n runtimeConfig: RuntimeConfig | null;\n targets: string[];\n deploy: boolean;\n verbose?: boolean;\n}): Promise<{\n built: string[];\n skipped: string[];\n deployResults?: WorkspaceDeployResult[];\n}> {\n const existing: WorkspaceTarget[] = [];\n const skipped: string[] = [];\n\n for (const target of opts.targets) {\n const resolved = resolveWorkspaceTarget(\n target,\n opts.bosConfig,\n opts.runtimeConfig,\n opts.configDir,\n );\n if (!resolved) {\n skipped.push(target);\n continue;\n }\n\n const exists = await fileExists(`${resolved.path}/package.json`);\n if (exists) existing.push(resolved);\n else skipped.push(target);\n }\n\n if (existing.length === 0) {\n return { built: [], skipped };\n }\n\n const sharedSync = await syncResolvedSharedDeps({\n configDir: opts.configDir,\n hostMode: \"local\",\n bosConfig: opts.bosConfig ?? undefined,\n extendsChain: [],\n });\n if (sharedSync.catalogChanged) {\n await run(\"bun\", [\"install\"], { cwd: opts.configDir });\n }\n\n const shouldBuildPlugin = existing.some((entry) => entry.key === \"api\");\n\n const forceRebuild = opts.deploy;\n const buildTasks: Promise<void>[] = [buildEverythingDevQuietly(opts.configDir, forceRebuild)];\n if (shouldBuildPlugin) {\n buildTasks.push(buildEveryPluginQuietly(opts.configDir, forceRebuild));\n }\n await Promise.all(buildTasks);\n\n const env: Record<string, string> = {\n ...process.env,\n NODE_ENV: opts.deploy ? \"production\" : \"development\",\n };\n if (opts.deploy) {\n env.DEPLOY = \"true\";\n } else {\n delete env.DEPLOY;\n }\n\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n let configSnapshot: string | undefined;\n if (opts.deploy && existsSync(bosConfigPath)) {\n configSnapshot = readFileSync(bosConfigPath, \"utf-8\");\n }\n\n const orderedExisting = opts.deploy\n ? [\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key !== \"host\"),\n ...existing.filter((entry) => entry.kind === \"plugin\"),\n ...existing.filter((entry) => entry.kind === \"app\" && entry.key === \"host\"),\n ]\n : existing;\n\n const parallelGroup = opts.deploy\n ? orderedExisting.filter((e) => e.key !== \"host\")\n : orderedExisting;\n const sequentialGroup = opts.deploy ? orderedExisting.filter((e) => e.key === \"host\") : [];\n\n const built: string[] = [];\n const deployResults: WorkspaceDeployResult[] = [];\n\n if (opts.deploy && parallelGroup.length > 0) {\n const total = parallelGroup.length + sequentialGroup.length;\n console.log();\n console.log(` Building ${total} workspace${total > 1 ? \"s\" : \"\"}...`);\n console.log();\n\n const results = await Promise.allSettled(\n parallelGroup.map((ws) => buildOneWorkspace(ws, env, opts)),\n );\n\n const allDeployEntries: DeployResultEntry[] = [];\n for (let i = 0; i < parallelGroup.length; i++) {\n const ws = parallelGroup[i];\n const result = results[i];\n if (result.status === \"fulfilled\") {\n if (result.value.success) {\n built.push(ws.key);\n }\n if (result.value.deployEntries) {\n allDeployEntries.push(...result.value.deployEntries);\n }\n const { deployEntries: _deployEntries, ...deployResult } = result.value;\n deployResults.push(deployResult);\n } else {\n deployResults.push({\n key: ws.key,\n kind: ws.kind,\n success: false,\n error: result.reason?.message ?? \"Unknown error\",\n });\n }\n }\n\n if (configSnapshot && allDeployEntries.length > 0) {\n const config = JSON.parse(configSnapshot) as Record<string, unknown>;\n const merged = applyDeployResults(config, allDeployEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n\n for (const ws of sequentialGroup) {\n const result = await buildOneWorkspace(ws, env, opts);\n if (result.success) {\n built.push(ws.key);\n }\n if (result.deployEntries) {\n const hostEntries = result.deployEntries.filter((r) => r.urlField.startsWith(\"app.host\"));\n if (hostEntries.length > 0 && existsSync(bosConfigPath)) {\n const currentConfig = JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n const merged = applyDeployResults(currentConfig, hostEntries);\n writeFileSync(bosConfigPath, `${JSON.stringify(merged, null, 2)}\\n`);\n }\n }\n const { deployEntries: _deployEntries, ...sequentialResult } = result;\n deployResults.push(sequentialResult);\n }\n\n console.log();\n } else {\n for (const resolved of orderedExisting) {\n const buildConfig = buildCommands[resolved.key] ?? {\n cmd: \"bun\",\n args: [\"run\", \"build\"],\n };\n\n await run(buildConfig.cmd, buildConfig.args, {\n cwd: resolved.path,\n env,\n });\n built.push(resolved.key);\n }\n }\n\n return { built, skipped, deployResults: opts.deploy ? deployResults : undefined };\n}\n\nexport async function buildEveryPluginQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/every-plugin`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/every-plugin/dist/build/rspack/plugin.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/every-plugin\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/every-plugin build failed with exit code ${result.exitCode}`,\n );\n}\n\nexport async function buildEverythingDevQuietly(cwd: string, force = false) {\n const packageDir = `${cwd}/packages/everything-dev`;\n const packageExists = await fileExists(`${packageDir}/package.json`);\n if (!packageExists) {\n return;\n }\n\n const distPath = `${cwd}/packages/everything-dev/dist/index.mjs`;\n const distExists = await fileExists(distPath);\n\n if (distExists && !force) {\n return;\n }\n\n const result = (await run(\"bun\", [\"run\", \"--cwd\", \"packages/everything-dev\", \"build\"], {\n cwd,\n capture: true,\n })) as { stdout: string; stderr: string; exitCode: number };\n\n if (result.exitCode === 0) {\n return;\n }\n\n if (result.stdout.trim()) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr.trim()) {\n process.stderr.write(result.stderr);\n }\n\n throw new Error(\n `bun run --cwd packages/everything-dev build failed with exit code ${result.exitCode}`,\n );\n}\n"],"mappings":"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"}
package/dist/cli.cjs CHANGED
@@ -496,7 +496,7 @@ async function main() {
496
496
  console.log();
497
497
  return;
498
498
  }
499
- if (result?.status === "error") {
499
+ if (result?.status === "error" && descriptor.key !== "publish" && descriptor.key !== "deploy") {
500
500
  console.error(`[CLI] ${result.error || "Unknown error"}`);
501
501
  process.exit(1);
502
502
  }
@@ -580,6 +580,14 @@ async function main() {
580
580
  if (result.txHash) console.log(` ${require_theme.colors.dim("Transaction:")} ${result.txHash}`);
581
581
  if (result.built && result.built.length > 0) console.log(` ${require_theme.colors.dim("Built:")} ${result.built.join(", ")}`);
582
582
  if (result.skipped && result.skipped.length > 0) console.log(` ${require_theme.colors.dim("Skipped:")} ${result.skipped.join(", ")}`);
583
+ if (result.deployResults) {
584
+ const warnings = result.deployResults.flatMap((r) => r.warnings ?? []);
585
+ if (warnings.length > 0) {
586
+ console.log();
587
+ console.log(` ${require_theme.colors.yellow("⚠")} Build warnings:`);
588
+ for (const w of warnings) console.log(` ${require_theme.colors.dim(w)}`);
589
+ }
590
+ }
583
591
  console.log();
584
592
  return;
585
593
  }
@@ -617,6 +625,14 @@ async function main() {
617
625
  if (deployResult.txHash) console.log(` ${require_theme.colors.dim("Transaction:")} ${deployResult.txHash}`);
618
626
  if (deployResult.built && deployResult.built.length > 0) console.log(` ${require_theme.colors.dim("Built:")} ${deployResult.built.join(", ")}`);
619
627
  if (deployResult.skipped && deployResult.skipped.length > 0) console.log(` ${require_theme.colors.dim("Skipped:")} ${deployResult.skipped.join(", ")}`);
628
+ if (deployResult.deployResults) {
629
+ const warnings = deployResult.deployResults.flatMap((r) => r.warnings ?? []);
630
+ if (warnings.length > 0) {
631
+ console.log();
632
+ console.log(` ${require_theme.colors.yellow("⚠")} Build warnings:`);
633
+ for (const w of warnings) console.log(` ${require_theme.colors.dim(w)}`);
634
+ }
635
+ }
620
636
  if (deployResult.redeployed) console.log(` ${require_theme.colors.dim("Railway:")} redeployed ${deployResult.service ?? "service"}`);
621
637
  else if (!process.env.RAILWAY_TOKEN) console.log(` ${require_theme.colors.yellow("Railway:")} skipped (RAILWAY_TOKEN not set)`);
622
638
  console.log();