UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

1 lines • 21.9 kB
{"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { selectWorkspaceTargets } from \"../build\";\nimport { syncTemplate } from \"../cli/sync\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { generateCodeArtifacts } from \"../code-artifacts\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { checkFederationCompat } from \"../mf\";\nimport { openResolution } from \"../resolution/session\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n return {\n sync: builder.sync.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const result = await syncTemplate(projectDir, input);\n\n if (result.status === \"synced\" || result.status === \"dry-run\") {\n const syncedConfig = await openResolution({ cwd: projectDir });\n if (syncedConfig?.config) {\n await generateCodeArtifacts(projectDir, syncedConfig.config);\n }\n }\n\n return result;\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typesGen: builder.typesGen.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const env =\n input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n const refreshed = await openResolution({\n cwd: projectDir,\n env,\n remotePlugins: input.remotePlugins,\n });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n if (input.dryRun) {\n const pluginEntries = Object.entries(runtime.plugins ?? {});\n const fetched: string[] = [];\n const skipped: string[] = [];\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n if (runtime.api.source !== \"local\") {\n fetched.push(`api remote (${runtime.api.url})`);\n } else {\n const path = runtime.api.localPath\n ? ` (${relative(projectDir, runtime.api.localPath)})`\n : \"\";\n skipped.push(`api local${path}`);\n }\n\n if (runtime.auth) {\n if (runtime.auth.source !== \"local\") {\n fetched.push(`auth remote (${runtime.auth.url})`);\n } else {\n const path = runtime.auth.localPath\n ? ` (${relative(projectDir, runtime.auth.localPath)})`\n : \"\";\n skipped.push(`auth local${path}`);\n }\n }\n\n for (const [key, plugin] of pluginEntries) {\n if (plugin.url && plugin.source !== \"local\") {\n fetched.push(`${key} remote (${plugin.url})`);\n } else if (plugin.localPath) {\n skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n } else {\n skipped.push(`${key} no URL resolved`);\n }\n }\n\n const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of pluginEntries) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed: [],\n };\n }\n\n const artifacts = await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n const generated = [\"ui/src/lib/api-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (runtime.auth && (runtime.auth.source !== \"local\" || runtime.auth.localPath)) {\n generated.push(\"ui/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n const contractStatus = artifacts?.contractStatus ?? [];\n const fetched: string[] = [];\n const skipped: string[] = [];\n const failed: string[] = [];\n for (const entry of contractStatus) {\n if (entry.source === \"remote\") {\n fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n } else if (entry.source === \"local\") {\n const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n skipped.push(`${entry.key} local${path}`);\n } else if (entry.source === \"skipped\") {\n skipped.push(`${entry.key} no URL resolved`);\n } else if (entry.source === \"failed\") {\n const detail = entry.error ? `: ${entry.error}` : \"\";\n failed.push(`${entry.key}${detail}`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typecheck: builder.typecheck.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const refreshed = await openResolution({ cwd: projectDir });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n type AppTarget = { source?: string; localPath?: string };\n const workspaceEntries: Array<{\n key: string;\n label: string;\n dir: string;\n }> = [];\n const skipped: Array<{ key: string; label: string }> = [];\n\n const appTargets: Array<{\n key: string;\n label: string;\n target: AppTarget | undefined;\n }> = [\n { key: \"host\", label: \"host\", target: runtime.host },\n { key: \"ui\", label: \"ui\", target: runtime.ui },\n { key: \"api\", label: \"api\", target: runtime.api },\n ];\n if (runtime.auth) {\n appTargets.push({ key: \"auth\", label: \"auth\", target: runtime.auth });\n }\n\n for (const entry of appTargets) {\n if (\n entry.target?.source === \"local\" &&\n entry.target.localPath &&\n existsSync(join(entry.target.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({\n key: entry.key,\n label: entry.label,\n dir: entry.target.localPath,\n });\n } else {\n skipped.push({ key: entry.key, label: entry.label });\n }\n }\n\n for (const [key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const label = `plugins/${key}`;\n if (\n plugin.source === \"local\" &&\n plugin.localPath &&\n existsSync(join(plugin.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({ key, label, dir: plugin.localPath });\n } else {\n skipped.push({ key, label });\n }\n }\n\n const selected = selectWorkspaceTargets(input.packages, resolvedConfig);\n const targets =\n input.packages === \"all\"\n ? workspaceEntries\n : workspaceEntries.filter((entry) => selected.includes(entry.key));\n const skippedEntries =\n input.packages === \"all\"\n ? skipped\n : skipped.filter((entry) => selected.includes(entry.key));\n\n const checked: string[] = [];\n const results: Array<{\n workspace: string;\n passed: boolean;\n error?: string;\n }> = [];\n\n for (const entry of targets) {\n const packageJsonPath = join(entry.dir, \"package.json\");\n let args: string[] = [\"exec\", \"tsc\", \"--noEmit\"];\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n args = [\"run\", \"typecheck\"];\n }\n } catch {}\n }\n\n console.log(`\\n ${colors.dim(\"Checking\")} ${colors.cyan(entry.label)}`);\n const child = spawnSync(\"pnpm\", args, {\n cwd: entry.dir,\n stdio: \"inherit\",\n });\n const passed = child.status === 0;\n checked.push(entry.label);\n results.push({\n workspace: entry.label,\n passed,\n error: passed ? undefined : `typecheck failed (exit code ${child.status ?? \"n/a\"})`,\n });\n }\n\n return {\n status: \"success\" as const,\n checked,\n skipped: skippedEntries.map((entry) => entry.label),\n results,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n mfCheck: builder.mfCheck.handler(async ({ input }) => {\n let authored: BosConfig | null = null;\n try {\n authored = (await readAuthoredConfigInput()) as BosConfig | null;\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: MISSING_CONFIG_MESSAGE,\n remotes: [],\n };\n }\n\n const report = await checkFederationCompat(authored, {\n timeoutMs: input.timeoutMs,\n });\n return {\n status: report.ok ? (\"ok\" as const) : (\"fail\" as const),\n hostVersion: report.hostVersion,\n hostReachable: report.hostReachable,\n hostReason: report.hostReason,\n remotes: report.remotes,\n };\n }),\n };\n}\n"],"mappings":"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"}