UNPKG

everything-dev

Version:

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

1 lines • 38.5 kB
{"version":3,"file":"upgrade.cjs","names":["Effect","findConfigPath","MISSING_CONFIG_MESSAGE","resolve","dirname","isV2Tree","maintainV1Tree","auditV1Tree","applyV1Tree","upgradeTemplate","process","openResolution","existsSync","join","relative","generateCodeArtifacts","selectWorkspaceTargets","generateUiManifest","readFileSync","colors","spawnSync","PlatformManifestService","readAuthoredConfigInput","resolvePublishedConfig","checkFederationCompat","checkUiCompositionCompat","findWorkspaceRoot","readInstalledFrameworkVersion","readWorkspaceCatalog"],"sources":["../../src/handlers/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 { Effect } from \"effect\";\nimport { generateUiManifest } from \"every-plugin/ui/manifest-generator\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { generateCodeArtifacts } from \"../services/codegen/artifacts\";\nimport { checkFederationCompat, checkUiCompositionCompat } from \"../services/federation/service\";\nimport { readInstalledFrameworkVersion } from \"../services/framework-version\";\nimport {\n type PlatformCompatViolation,\n PlatformManifestService,\n type ResolvedPlatformManifest,\n} from \"../services/platform/manifest\";\nimport { resolvePublishedConfig } from \"../services/registry/published\";\nimport { openResolution } from \"../services/resolution/session\";\nimport {\n applyV1Tree,\n auditV1Tree,\n isV2Tree,\n maintainV1Tree,\n} from \"../services/scaffold/upgrade-audit\";\nimport { selectWorkspaceTargets } from \"../services/workspace/build-train\";\nimport { readWorkspaceCatalog } from \"../services/workspace/catalog\";\nimport { findWorkspaceRoot } from \"../services/workspace/workspace\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n return {\n upgrade: builder.upgrade.effect(function* (_opts, input) {\n return yield* Effect.tryPromise({\n try: async () => {\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\n if (input.from === \"v1\") {\n if (isV2Tree(projectDir)) {\n return {\n status: \"already-upgraded\" as const,\n packages: [],\n notes: [\n \"bos.app.ts present — this tree is already on the v2 train; nothing to audit or apply\",\n ],\n };\n }\n if (input.maintain && input.maintain.length > 0) {\n const migrated: string[] = [];\n const notes: string[] = [];\n for (const step of input.maintain) {\n const result = await maintainV1Tree(projectDir, step, input.dryRun);\n for (const path of result.writes) migrated.push(`${step}: wrote ${path}`);\n for (const path of result.deletes) migrated.push(`${step}: deleted ${path}`);\n for (const note of result.notes) notes.push(`${step}: ${note}`);\n }\n return {\n status: input.dryRun ? (\"dry-run\" as const) : (\"upgraded\" as const),\n packages: [],\n migrated,\n notes,\n };\n }\n if (input.audit) {\n const outcome = await auditV1Tree(projectDir);\n const auditResult = {\n tier: outcome.tier,\n findings: outcome.findings,\n manifest: outcome.manifest,\n };\n return outcome.gateBlocked\n ? {\n status: \"gate-blocked\" as const,\n packages: [],\n audit: auditResult,\n blockers: outcome.findings.filter((f) => f.severity === \"blocker\"),\n }\n : { status: \"audit\" as const, packages: [], audit: auditResult };\n }\n const outcome = await applyV1Tree(projectDir, input.dryRun);\n if (!outcome.ok) {\n return {\n status: \"gate-blocked\" as const,\n packages: [],\n blockers: outcome.blockers,\n };\n }\n return {\n status: input.dryRun ? (\"dry-run\" as const) : (\"upgraded\" as const),\n packages: [],\n migrated: outcome.outcome.migrated,\n notes: outcome.outcome.notes,\n };\n }\n\n return await upgradeTemplate(projectDir, input);\n },\n catch: (error) => ({\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n }),\n });\n }),\n\n typesGen: builder.typesGen.effect(function* (_opts, input) {\n return yield* Effect.tryPromise({\n try: async () => {\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 = [\n \"ui/src/lib/api-types.gen.ts\",\n \"ui/src/lib/auth-types.gen.ts\",\n \".bos/bos.resolved-config.json\",\n ];\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 env,\n extendsChain: [...refreshed.chain],\n runtimeConfig: runtime,\n forceRouteTree: true,\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: [...generated, \".bos/bos.resolved-config.json\"],\n fetched,\n skipped,\n failed,\n };\n },\n catch: (error) => ({\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.effect(function* (_opts, input) {\n return yield* Effect.tryPromise({\n try: async () => {\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 env: process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n extendsChain: [...refreshed.chain],\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 ui?: boolean;\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 const localPath = plugin.source === \"local\" ? plugin.localPath : undefined;\n if (localPath && existsSync(join(localPath, \"tsconfig.json\"))) {\n workspaceEntries.push({ key, label, dir: localPath });\n } else {\n skipped.push({ key, label });\n }\n // Plugin UIs are not in the plugin root tsconfig — they typecheck\n // through their own ui/tsconfig.json (the typecheck:ui script).\n if (localPath && existsSync(join(localPath, \"ui\", \"tsconfig.json\"))) {\n workspaceEntries.push({ key, label: `${label}/ui`, dir: localPath, ui: true });\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 // Builds keep the plugin ui's routeTree write on a scratch path\n // (the router plugin owns the build-time tree), so typechecking a\n // plugin ui first materializes ui/src/routeTree.gen.ts on disk —\n // without it every createFileRoute call types as `undefined`.\n if (entry.ui && !existsSync(join(entry.dir, \"ui\", \"src\", \"routeTree.gen.ts\"))) {\n try {\n await generateUiManifest({\n workspaceRoot: join(entry.dir, \"ui\"),\n pluginName: entry.key,\n emitRouteTree: true,\n });\n } catch (error) {\n checked.push(entry.label);\n results.push({\n workspace: entry.label,\n passed: false,\n error: `routeTree materialization failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n continue;\n }\n }\n\n const packageJsonPath = join(entry.dir, \"package.json\");\n let args: string[] = entry.ui\n ? [\"exec\", \"tsc\", \"--noEmit\", \"-p\", \"ui/tsconfig.json\"]\n : [\"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 const scriptName = entry.ui ? \"typecheck:ui\" : \"typecheck\";\n if (pkg.scripts?.[scriptName]) {\n args = [\"run\", scriptName];\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 },\n catch: (error) => ({\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.effect(function* (_opts, input) {\n const platformManifest = yield* PlatformManifestService;\n return yield* Effect.promise(async () => {\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 // No local authored config (the universal image carries none): fall\n // back to the registry identity — the same source `bos start` boots\n // from in a runtime container.\n const account = process.env.BOS_ACCOUNT;\n const gateway = process.env.BOS_GATEWAY;\n if (!account || !gateway) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: MISSING_CONFIG_MESSAGE,\n remotes: [],\n };\n }\n try {\n authored = await resolvePublishedConfig(account, gateway);\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: `No config found at bos://${account}/${gateway} — verify BOS_ACCOUNT/BOS_GATEWAY and that the config has been published.`,\n remotes: [],\n };\n }\n }\n\n const report = await checkFederationCompat(authored, {\n timeoutMs: input.timeoutMs,\n });\n\n // #546: the UI composition compat gate — sibling UI manifests must\n // agree on named shared singletons (the mf-check mirror of the\n // host's boot guard). Absent when no UI slots exist.\n const ui = await checkUiCompositionCompat(authored, { timeoutMs: input.timeoutMs });\n\n // ADR 0034 pt 5 — the platform compat gate, additive to the federation\n // check (a sibling, never a relaxation). Absent when no manifest\n // resolves (in-image hosts self-describe; the smoke gate covers them).\n let platform: { ok: boolean; violations: PlatformCompatViolation[] } | undefined;\n try {\n const configPath = findConfigPath();\n if (configPath) {\n const projectDir = resolve(dirname(configPath));\n const resolved = await platformManifest.resolvePlatformManifest({\n configDir: projectDir,\n localConfig: authored as Record<string, unknown>,\n });\n if (resolved) {\n const root = findWorkspaceRoot(projectDir)?.dir ?? projectDir;\n const violations = platformManifest.checkPlatformCompat(resolved.manifest, {\n platformVersion: readInstalledFrameworkVersion(projectDir, \"everything-dev\"),\n catalog: readWorkspaceCatalog(root),\n });\n platform = { ok: violations.length === 0, violations };\n }\n }\n } catch (e) {\n platform = {\n ok: false,\n violations: [\n {\n kind: \"minChild\",\n message: `platform manifest resolution failed: ${e instanceof Error ? e.message : String(e)}`,\n },\n ],\n };\n }\n\n return {\n status: report.ok && (platform?.ok ?? true) ? (\"ok\" as const) : (\"fail\" as const),\n hostVersion: report.hostVersion,\n hostReachable: report.hostReachable,\n hostReason: report.hostReason,\n remotes: report.remotes,\n ...(ui.slots.length > 0 ? { ui: { ok: ui.ok, slots: ui.slots } } : {}),\n ...(platform ? { platform } : {}),\n };\n });\n }),\n\n platformManifest: builder.platformManifest.effect(function* (_opts, input) {\n const platformManifest = yield* PlatformManifestService;\n return yield* Effect.promise(async () => {\n // In-image: the booted host self-describes (ADR 0034 pt 1) — the\n // staged manifest is the release's own bytes; a compat check of the\n // image against itself is trivially consistent.\n const inImage = platformManifest.readInImagePlatformManifest();\n if (inImage) {\n return {\n status: \"ok\" as const,\n version: inImage.frameworkVersion,\n source: \"in-image\",\n ...(input.check ? { compat: { ok: true, violations: [] } } : {}),\n };\n }\n\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"absent\" as const,\n version: null,\n error: `${MISSING_CONFIG_MESSAGE} — and the in-image platform manifest is absent (non-framework image)`,\n };\n }\n const projectDir = resolve(dirname(configPath));\n try {\n const authoredConfig =\n ((await readAuthoredConfigInput()) as Record<string, unknown> | null) ?? {};\n let resolved: ResolvedPlatformManifest | null;\n let drift: { pinned: string; published: string } | undefined;\n try {\n resolved = await platformManifest.resolvePlatformManifest({\n configDir: projectDir,\n localConfig: authoredConfig,\n });\n } catch (pinError) {\n // The pin names a release the chain no longer serves — the root\n // republished past it (issue #546). Resolve the latest published\n // manifest so the report names the drift instead of the cryptic\n // pin-not-found error.\n const latest = await platformManifest.resolvePlatformManifest({\n configDir: projectDir,\n localConfig: { ...authoredConfig, platform: undefined },\n });\n if (!latest) throw pinError;\n resolved = latest;\n const pinned =\n typeof authoredConfig.platform === \"string\" ? authoredConfig.platform : undefined;\n drift = pinned ? { pinned, published: latest.manifest.frameworkVersion } : undefined;\n }\n if (!resolved) {\n return { status: \"absent\" as const, version: null };\n }\n if (drift) {\n return {\n status: \"fail\" as const,\n version: drift.published,\n source: `bos://${resolved.source.account}/${resolved.source.gateway}`,\n drift,\n error: `parent platform is ${drift.published} (published at bos://${resolved.source.account}/${resolved.source.gateway}), you pinned ${drift.pinned} — run \\`bos upgrade\\` to realign`,\n };\n }\n const base = {\n status: \"ok\" as const,\n version: resolved.manifest.frameworkVersion,\n source: `bos://${resolved.source.account}/${resolved.source.gateway}`,\n fromCache: resolved.fromCache,\n };\n if (!input.check) {\n return base;\n }\n const root = findWorkspaceRoot(projectDir)?.dir ?? projectDir;\n const violations = platformManifest.checkPlatformCompat(resolved.manifest, {\n platformVersion: readInstalledFrameworkVersion(projectDir, \"everything-dev\"),\n catalog: readWorkspaceCatalog(root),\n });\n return { ...base, compat: { ok: violations.length === 0, violations } };\n } catch (e) {\n return {\n status: \"fail\" as const,\n version: null,\n error: e instanceof Error ? e.message : String(e),\n };\n }\n });\n }),\n };\n}\n"],"mappings":"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"}