everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
1 lines • 67.5 kB
Source Map (JSON)
{"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { glob } from \"glob\";\nimport { loadResolvedConfig } from \"../config\";\nimport type { PhaseTiming, UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { syncResolvedSharedDeps } from \"../shared-deps\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { readInstalledFrameworkVersion } from \"./framework-version\";\nimport {\n buildChildRootScripts,\n fetchParentConfig,\n getParentOnlyScriptKeys,\n resolveCatalogChainSource,\n runBunInstallForUpgrade,\n runTypesGen,\n} from \"./init\";\nimport { syncTemplate } from \"./sync\";\nimport { timePhase } from \"./timing\";\nimport { getExtendsRef, parseBosRef, readJsonFile } from \"./utils/helpers\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\nconst AUTH_CORE_PACKAGE = \"@better-auth/core\";\nconst AUTH_CORE_TRIGGER_PACKAGES = [\n \"better-auth\",\n \"better-near-auth\",\n \"@better-auth/api-key\",\n \"@better-auth/passkey\",\n] as const;\nconst LEGACY_UI_IMPORT_REWRITES = [\n ['from \"@/auth\"', 'from \"@/app\"'],\n [\"from '@/auth'\", \"from '@/app'\"],\n ['from \"@/lib/auth-utils\"', 'from \"@/lib/auth\"'],\n [\"from '@/lib/auth-utils'\", \"from '@/lib/auth'\"],\n ['from \"@/lib/use-api-client\"', 'from \"@/app\"'],\n [\"from '@/lib/use-api-client'\", \"from '@/app'\"],\n ['from \"@/lib/api-client\"', 'from \"@/app\"'],\n [\"from '@/lib/api-client'\", \"from '@/app'\"],\n] as const;\nconst OBSOLETE_FILES = [\n \"api/src/lib/plugins.ts\",\n \"ui/src/auth.ts\",\n \"ui/src/auth-types.gen.ts\",\n \"ui/src/lib/api-client.ts\",\n \"ui/src/lib/use-api-client.ts\",\n \"ui/src/lib/auth-utils.ts\",\n \"ui/src/api-contract.ts\",\n \"ui/src/api-contract.gen.ts\",\n \"ui/src/lib/auth-client.ts\",\n \"ui/src/lib/session.ts\",\n \"ui/scripts/generate-metadata.ts\",\n \".github/dependabot.yml\",\n \".github/templates/dependabot.yml\",\n \".github/workflows/packages-release.yml\",\n \".github/workflows/publish.yml\",\n \".github/workflows/release-sync.yml\",\n \"api/src/db/migrator.ts\",\n \"api/src/db/load-migrations.ts\",\n \"packages/everything-dev/cli.js\",\n \".templatekeep\",\n \".templatesync-exclude\",\n];\n\ninterface ExtendedRootSource {\n catalog: Record<string, string>;\n repository?: string;\n extendsChain: string[];\n}\n\nfunction extractSemver(value: string | undefined): string | null {\n if (!value) return null;\n const match = value.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match?.[0] ?? null;\n}\n\nfunction readRootPackageJson(projectDir: string): Record<string, unknown> {\n return readJsonFile<Record<string, unknown>>(join(projectDir, \"package.json\"));\n}\n\nfunction readRootCatalogEntry(projectDir: string, packageName: string): string | undefined {\n const pkg = readRootPackageJson(projectDir) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n return pkg.workspaces?.catalog?.[packageName];\n}\n\nfunction readCurrentPackageSpecifier(projectDir: string, packageName: string): string | undefined {\n const pkg = readRootPackageJson(projectDir);\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n const value = field?.[packageName];\n if (!value) continue;\n\n if (value === \"catalog:\") {\n return (\n readRootCatalogEntry(projectDir, packageName) ??\n readInstalledVersion(projectDir, packageName)\n );\n }\n\n if (value.startsWith(\"workspace:\") || value.startsWith(\"file:\") || value.startsWith(\"link:\")) {\n return readInstalledVersion(projectDir, packageName);\n }\n\n return value;\n }\n\n return (\n readRootCatalogEntry(projectDir, packageName) ?? readInstalledVersion(projectDir, packageName)\n );\n}\n\nfunction setCatalogRefs(\n field: Record<string, string> | undefined,\n packageNames: ReadonlyArray<string>,\n): boolean {\n if (!field) return false;\n\n let modified = false;\n for (const packageName of packageNames) {\n if (setCatalogRef(field, packageName)) {\n modified = true;\n }\n }\n\n return modified;\n}\n\nfunction syncPackageObjectCatalogRefs(\n pkg: Record<string, unknown>,\n packageNames: ReadonlyArray<string>,\n): boolean {\n let modified = false;\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (setCatalogRefs(field, packageNames)) {\n modified = true;\n }\n }\n\n return modified;\n}\n\nfunction findPackageFieldWithAnyDependency(\n pkg: Record<string, unknown>,\n packageNames: ReadonlyArray<string>,\n): Record<string, string> | undefined {\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (!field) continue;\n if (packageNames.some((packageName) => typeof field[packageName] === \"string\")) {\n return field;\n }\n }\n\n return undefined;\n}\n\nfunction packageObjectNeedsAuthCoreCatalogRef(pkg: Record<string, unknown>): boolean {\n const targetField = findPackageFieldWithAnyDependency(pkg, AUTH_CORE_TRIGGER_PACKAGES);\n if (!targetField) return false;\n\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (field?.[AUTH_CORE_PACKAGE]) return false;\n }\n\n return true;\n}\n\nfunction ensureAuthCoreCatalogRef(pkg: Record<string, unknown>): boolean {\n if (!packageObjectNeedsAuthCoreCatalogRef(pkg)) return false;\n\n const targetField = findPackageFieldWithAnyDependency(pkg, AUTH_CORE_TRIGGER_PACKAGES);\n if (!targetField) return false;\n\n targetField[AUTH_CORE_PACKAGE] = \"catalog:\";\n return true;\n}\n\nfunction packageObjectNeedsCatalogRefs(\n pkg: Record<string, unknown>,\n packageNames: ReadonlyArray<string>,\n): boolean {\n for (const fieldName of [\"dependencies\", \"devDependencies\", \"peerDependencies\"] as const) {\n const field = pkg[fieldName] as Record<string, string> | undefined;\n if (!field) continue;\n\n for (const packageName of packageNames) {\n const value = field[packageName];\n if (!value) continue;\n if (value !== \"catalog:\" && !value.startsWith(\"file:\") && !value.startsWith(\"link:\")) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nfunction packageFileNeedsCatalogRefs(\n filePath: string,\n packageNames: ReadonlyArray<string>,\n): boolean {\n return packageObjectNeedsCatalogRefs(\n readJsonFile<Record<string, unknown>>(filePath),\n packageNames,\n );\n}\n\nfunction updatePackageFileCatalogRefs(\n filePath: string,\n packageNames: ReadonlyArray<string>,\n): boolean {\n const pkg = readJsonFile<Record<string, unknown>>(filePath);\n const modified = syncPackageObjectCatalogRefs(pkg, packageNames);\n\n if (modified) {\n writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return modified;\n}\n\nfunction updatePackageFileAuthCoreRef(filePath: string): boolean {\n const pkg = readJsonFile<Record<string, unknown>>(filePath);\n const modified = ensureAuthCoreCatalogRef(pkg);\n\n if (modified) {\n writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return modified;\n}\n\nfunction syncRootCatalogWithParent(\n projectDir: string,\n parentCatalog: Record<string, string>,\n): boolean {\n const pkgPath = join(projectDir, \"package.json\");\n const pkg = readJsonFile<Record<string, unknown>>(pkgPath);\n let modified = syncPackageObjectCatalogRefs(pkg, Object.keys(parentCatalog));\n\n if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n pkg.workspaces = { packages: [], catalog: {} };\n modified = true;\n }\n\n const workspaces = pkg.workspaces as { packages?: string[]; catalog?: Record<string, string> };\n if (!workspaces.catalog || typeof workspaces.catalog !== \"object\") {\n workspaces.catalog = {};\n modified = true;\n }\n\n for (const [packageName, version] of Object.entries(parentCatalog)) {\n if (workspaces.catalog[packageName] !== version) {\n workspaces.catalog[packageName] = version;\n modified = true;\n }\n }\n\n if (modified) {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return modified;\n}\n\nasync function readExtendedRootSource(projectDir: string): Promise<ExtendedRootSource> {\n const configPath = join(projectDir, \"bos.config.json\");\n if (!existsSync(configPath)) {\n return { catalog: {}, extendsChain: [] };\n }\n\n const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n let extendsRef = getExtendsRef(localConfig);\n if (!extendsRef?.startsWith(\"bos://\")) {\n return {\n catalog: {},\n repository: typeof localConfig.repository === \"string\" ? localConfig.repository : undefined,\n extendsChain: [],\n };\n }\n\n const extendsChain: string[] = [];\n const visited = new Set<string>();\n let repository = typeof localConfig.repository === \"string\" ? localConfig.repository : undefined;\n let rootRef = extendsRef;\n\n while (extendsRef?.startsWith(\"bos://\")) {\n if (visited.has(extendsRef)) {\n throw new Error(`Circular extends detected while resolving upgrade source: ${extendsRef}`);\n }\n visited.add(extendsRef);\n extendsChain.push(extendsRef);\n\n const parsed = parseBosRef(extendsRef);\n if (!parsed) {\n break;\n }\n\n rootRef = extendsRef;\n\n let parentConfig: Record<string, unknown>;\n try {\n parentConfig = (await fetchParentConfig(parsed.account, parsed.gateway)) as Record<\n string,\n unknown\n >;\n } catch {\n break;\n }\n\n if (typeof parentConfig.repository === \"string\") {\n repository = parentConfig.repository;\n }\n\n const nextExtendsRef = getExtendsRef(parentConfig);\n if (!nextExtendsRef?.startsWith(\"bos://\")) {\n break;\n }\n\n extendsRef = nextExtendsRef;\n }\n\n const parsed = parseBosRef(rootRef);\n if (!parsed) {\n return { catalog: {}, repository, extendsChain };\n }\n\n const source = await resolveCatalogChainSource({\n extendsAccount: parsed.account,\n extendsGateway: parsed.gateway,\n });\n\n return {\n catalog: source.catalog,\n repository: source.repository ?? repository,\n extendsChain: source.extendsChain.length > 0 ? source.extendsChain : extendsChain,\n };\n}\n\nfunction parseTargetedRef(ref: string): { configRef: string; targetPath?: string } {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configRef: ref };\n }\n return {\n configRef: ref.slice(0, hashIndex),\n targetPath: ref.slice(hashIndex + 1) || undefined,\n };\n}\n\nfunction ensureTargetedRef(ref: string, targetPath: string): string {\n const parsed = parseTargetedRef(ref);\n if (parsed.targetPath) return ref;\n return `${parsed.configRef}#${targetPath}`;\n}\n\nfunction rewriteExtendsTarget(\n entry: Record<string, unknown> | undefined,\n targetPath: string,\n): boolean {\n if (!entry?.extends) return false;\n\n if (typeof entry.extends === \"string\") {\n const next = ensureTargetedRef(entry.extends, targetPath);\n if (next === entry.extends) return false;\n entry.extends = next;\n return true;\n }\n\n if (typeof entry.extends === \"object\") {\n let changed = false;\n for (const [key, value] of Object.entries(entry.extends as Record<string, unknown>)) {\n if (typeof value !== \"string\") continue;\n const next = ensureTargetedRef(value, targetPath);\n if (next !== value) {\n (entry.extends as Record<string, unknown>)[key] = next;\n changed = true;\n }\n }\n return changed;\n }\n\n return false;\n}\n\nfunction migrateRootConfigTargets(config: Record<string, unknown>): boolean {\n let changed = false;\n const app =\n config.app && typeof config.app === \"object\"\n ? (config.app as Record<string, unknown>)\n : undefined;\n\n if (app?.api && typeof app.api === \"object\") {\n changed = rewriteExtendsTarget(app.api as Record<string, unknown>, \"app.api\") || changed;\n }\n if (app?.auth && typeof app.auth === \"object\") {\n changed = rewriteExtendsTarget(app.auth as Record<string, unknown>, \"app.auth\") || changed;\n }\n\n if (config.plugins && typeof config.plugins === \"object\") {\n for (const [pluginKey, pluginValue] of Object.entries(\n config.plugins as Record<string, unknown>,\n )) {\n if (typeof pluginValue === \"string\") {\n const next = ensureTargetedRef(pluginValue, `plugins.${pluginKey}`);\n if (next !== pluginValue) {\n (config.plugins as Record<string, unknown>)[pluginKey] = next;\n changed = true;\n }\n continue;\n }\n if (!pluginValue || typeof pluginValue !== \"object\") continue;\n changed =\n rewriteExtendsTarget(pluginValue as Record<string, unknown>, `plugins.${pluginKey}`) ||\n changed;\n }\n }\n\n return changed;\n}\n\nfunction migratePluginProviderConfig(config: Record<string, unknown>, pluginKey: string): boolean {\n let changed = false;\n if (!config.plugins || typeof config.plugins !== \"object\") {\n return false;\n }\n\n const plugins = config.plugins as Record<string, unknown>;\n const entry = plugins[pluginKey];\n if (!entry || typeof entry !== \"object\") return false;\n\n const pluginEntry = entry as Record<string, unknown>;\n\n if (\"name\" in pluginEntry) {\n delete pluginEntry.name;\n changed = true;\n }\n\n if (typeof pluginEntry.development === \"string\" && pluginEntry.development.startsWith(\"local:\")) {\n if (\"extends\" in pluginEntry) {\n delete pluginEntry.extends;\n changed = true;\n }\n }\n\n changed = rewriteExtendsTarget(pluginEntry, `plugins.${pluginKey}`) || changed;\n\n return changed;\n}\n\nfunction mergePluginConfigIntoRoot(\n rootConfig: Record<string, unknown>,\n pluginKey: string,\n pluginConfig: Record<string, unknown>,\n): boolean {\n let changed = false;\n\n if (!rootConfig.plugins || typeof rootConfig.plugins !== \"object\") {\n rootConfig.plugins = {};\n changed = true;\n }\n const plugins = rootConfig.plugins as Record<string, unknown>;\n if (!plugins[pluginKey] || typeof plugins[pluginKey] !== \"object\") {\n plugins[pluginKey] = {};\n changed = true;\n }\n\n const entry = plugins[pluginKey] as Record<string, unknown>;\n\n const pluginData = extractPluginEntry(pluginConfig, pluginKey);\n\n const apiData = getApiEntry(pluginConfig);\n\n if (pluginData) {\n for (const key of [\n \"secrets\",\n \"variables\",\n \"routes\",\n \"production\",\n \"integrity\",\n \"proxy\",\n ] as const) {\n if (pluginData[key] !== undefined && entry[key] === undefined) {\n entry[key] = pluginData[key];\n changed = true;\n }\n }\n\n if (typeof pluginData.development === \"string\" && pluginData.development.startsWith(\"local:\")) {\n pluginData.development = `local:plugins/${pluginKey}`;\n }\n if (entry.development === undefined && pluginData.development !== undefined) {\n entry.development = pluginData.development;\n changed = true;\n }\n }\n\n if (apiData) {\n for (const key of [\n \"production\",\n \"integrity\",\n \"proxy\",\n \"variables\",\n \"secrets\",\n \"routes\",\n ] as const) {\n if (apiData[key] !== undefined && entry[key] === undefined) {\n entry[key] = apiData[key];\n changed = true;\n }\n }\n }\n\n if (\"extends\" in entry) {\n const extendsStr = typeof entry.extends === \"string\" ? entry.extends : undefined;\n if (!extendsStr || extendsStr.includes(`#plugins.${pluginKey}`)) {\n delete entry.extends;\n changed = true;\n }\n }\n\n if (\"name\" in entry) {\n delete entry.name;\n changed = true;\n }\n\n if (configHasTopLevelFields(pluginConfig, pluginKey)) {\n if (entry.routes === undefined && Array.isArray(pluginConfig.routes)) {\n entry.routes = pluginConfig.routes;\n changed = true;\n }\n const api = getApiEntry(pluginConfig);\n if (api) {\n if (entry.routes === undefined && Array.isArray(api.routes)) {\n entry.routes = api.routes;\n changed = true;\n }\n }\n }\n\n return changed;\n}\n\nfunction extractPluginEntry(\n pluginConfig: Record<string, unknown>,\n pluginKey: string,\n): Record<string, unknown> | null {\n if (\n pluginConfig.plugins &&\n typeof pluginConfig.plugins === \"object\" &&\n (pluginConfig.plugins as Record<string, unknown>)[pluginKey] &&\n typeof (pluginConfig.plugins as Record<string, unknown>)[pluginKey] === \"object\"\n ) {\n return (pluginConfig.plugins as Record<string, unknown>)[pluginKey] as Record<string, unknown>;\n }\n\n if (pluginConfig.routes !== undefined) {\n return { routes: pluginConfig.routes };\n }\n\n return null;\n}\n\nfunction configHasTopLevelFields(\n pluginConfig: Record<string, unknown>,\n _pluginKey: string,\n): boolean {\n return (\n (pluginConfig.routes !== undefined && Array.isArray(pluginConfig.routes)) ||\n getApiEntry(pluginConfig) !== null\n );\n}\n\nfunction getApiEntry(pluginConfig: Record<string, unknown>): Record<string, unknown> | null {\n if (!pluginConfig.app || typeof pluginConfig.app !== \"object\") return null;\n const app = pluginConfig.app as Record<string, unknown>;\n if (!app.api || typeof app.api !== \"object\") return null;\n return app.api as Record<string, unknown>;\n}\n\nexport async function migrateBosConfigFiles(projectDir: string): Promise<string[]> {\n const migrated: string[] = [];\n const rootConfigPath = join(projectDir, \"bos.config.json\");\n\n if (existsSync(rootConfigPath)) {\n const rootConfig = JSON.parse(readFileSync(rootConfigPath, \"utf-8\")) as Record<string, unknown>;\n let rootChanged = migrateRootConfigTargets(rootConfig);\n\n const pluginConfigPaths = await glob(\"plugins/*/bos.config.json\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n\n for (const relativePath of pluginConfigPaths) {\n const match = relativePath.match(/^plugins\\/([^/]+)\\/bos\\.config\\.json$/);\n const pluginKey = match?.[1];\n if (!pluginKey) continue;\n\n const filePath = join(projectDir, relativePath);\n try {\n const pluginConfig = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\n rootChanged = mergePluginConfigIntoRoot(rootConfig, pluginKey, pluginConfig) || rootChanged;\n } catch (e) {\n console.warn(`[Upgrade] Failed to parse plugin config at ${filePath}: ${e}`);\n }\n\n try {\n rmSync(filePath);\n migrated.push(relativePath);\n } catch (e) {\n console.warn(`[Upgrade] Failed to remove migrated plugin config at ${filePath}: ${e}`);\n }\n }\n\n if (rootConfig.plugins && typeof rootConfig.plugins === \"object\") {\n for (const pluginKey of Object.keys(rootConfig.plugins as Record<string, unknown>)) {\n rootChanged = migratePluginProviderConfig(rootConfig, pluginKey) || rootChanged;\n }\n }\n\n if (rootChanged || migrated.length > 0) {\n await saveBosConfig(projectDir, rootConfig);\n if (!migrated.includes(\"bos.config.json\")) {\n migrated.push(\"bos.config.json\");\n }\n }\n }\n\n return migrated;\n}\n\nasync function loadParentPluginOptions(projectDir: string): Promise<{\n localConfig: Record<string, unknown>;\n parentPlugins: Record<string, unknown>;\n newPluginKeys: string[];\n} | null> {\n const configPath = join(projectDir, \"bos.config.json\");\n if (!existsSync(configPath)) {\n return null;\n }\n\n const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n const extendsRef = getExtendsRef(localConfig);\n if (!extendsRef?.startsWith(\"bos://\")) {\n return null;\n }\n\n const parsed = parseBosRef(extendsRef);\n if (!parsed) {\n return null;\n }\n\n let parentConfig: Record<string, unknown>;\n try {\n parentConfig = await fetchParentConfig(parsed.account, parsed.gateway);\n } catch {\n return null;\n }\n\n const parentPlugins =\n parentConfig.plugins && typeof parentConfig.plugins === \"object\"\n ? (parentConfig.plugins as Record<string, unknown>)\n : {};\n const localPlugins =\n localConfig.plugins && typeof localConfig.plugins === \"object\"\n ? (localConfig.plugins as Record<string, unknown>)\n : {};\n\n const newPluginKeys = Object.keys(parentPlugins).filter((key) => !(key in localPlugins));\n return { localConfig, parentPlugins, newPluginKeys };\n}\n\nasync function addSelectedParentPlugins(projectDir: string): Promise<string[]> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return [];\n }\n\n const pluginOptions = await loadParentPluginOptions(projectDir);\n if (!pluginOptions || pluginOptions.newPluginKeys.length === 0) {\n return [];\n }\n\n const selectedValue = await p.multiselect({\n message: \"Select new plugins from parent:\",\n options: pluginOptions.newPluginKeys.map((key) => ({ value: key, label: key })),\n required: false,\n });\n\n if (p.isCancel(selectedValue)) {\n process.exit(0);\n }\n\n const selected = selectedValue as string[];\n if (selected.length === 0) {\n return [];\n }\n\n const localPlugins =\n pluginOptions.localConfig.plugins && typeof pluginOptions.localConfig.plugins === \"object\"\n ? (pluginOptions.localConfig.plugins as Record<string, unknown>)\n : {};\n const nextPlugins = { ...localPlugins };\n for (const key of selected) {\n const parentPlugin = pluginOptions.parentPlugins[key];\n if (parentPlugin && typeof parentPlugin === \"object\") {\n const nextPlugin = structuredClone(parentPlugin as Record<string, unknown>);\n rewriteExtendsTarget(nextPlugin, `plugins.${key}`);\n nextPlugins[key] = nextPlugin;\n } else if (typeof parentPlugin === \"string\") {\n nextPlugins[key] = ensureTargetedRef(parentPlugin, `plugins.${key}`);\n } else {\n nextPlugins[key] = parentPlugin;\n }\n }\n\n pluginOptions.localConfig.plugins = nextPlugins;\n await saveBosConfig(projectDir, pluginOptions.localConfig);\n\n return selected;\n}\n\nfunction readInstalledVersion(projectDir: string, packageName: string): string | undefined {\n return readInstalledFrameworkVersion(projectDir, packageName);\n}\n\nfunction setCatalogRef(field: Record<string, string> | undefined, packageName: string): boolean {\n if (!field || !(packageName in field)) return false;\n if (field[packageName] === \"catalog:\" || field[packageName].startsWith(\"file:\")) return false;\n field[packageName] = \"catalog:\";\n return true;\n}\n\nasync function findWorkspacePackageJsons(projectDir: string): Promise<string[]> {\n const rootPkgPath = join(projectDir, \"package.json\");\n if (!existsSync(rootPkgPath)) return [];\n\n const rootPkg = JSON.parse(readFileSync(rootPkgPath, \"utf-8\")) as Record<string, unknown>;\n const workspaceConfig = rootPkg.workspaces as { packages?: string[] } | string[] | undefined;\n\n const patterns: string[] = [];\n if (Array.isArray(workspaceConfig)) {\n patterns.push(...workspaceConfig);\n } else if (workspaceConfig?.packages && Array.isArray(workspaceConfig.packages)) {\n patterns.push(...workspaceConfig.packages);\n }\n\n if (patterns.length === 0) return [];\n\n const pkgPaths: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, { cwd: projectDir, dot: false, absolute: false });\n for (const match of matches) {\n const pkgPath = join(projectDir, match, \"package.json\");\n if (existsSync(pkgPath) && statSync(pkgPath).isFile()) {\n pkgPaths.push(pkgPath);\n }\n }\n }\n\n return [...new Set(pkgPaths)];\n}\n\nexport async function migrateChildRootPackageJson(projectDir: string): Promise<boolean> {\n const configPath = join(projectDir, \"bos.config.json\");\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(configPath) || !existsSync(pkgPath)) {\n return false;\n }\n\n const config = readJsonFile<Record<string, unknown>>(configPath);\n const extendsRef = getExtendsRef(config);\n if (!extendsRef?.startsWith(\"bos://\")) {\n return false;\n }\n\n const pkg = readJsonFile<Record<string, unknown>>(pkgPath);\n let changed = false;\n\n if (pkg.private !== true) {\n pkg.private = true;\n changed = true;\n }\n if (pkg.type !== \"module\") {\n pkg.type = \"module\";\n changed = true;\n }\n if (\"module\" in pkg) {\n delete pkg.module;\n changed = true;\n }\n\n const pluginPackageJsons = await glob(\"plugins/*/package.json\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n const childScripts = buildChildRootScripts({\n ui: existsSync(join(projectDir, \"ui\", \"package.json\")),\n api: existsSync(join(projectDir, \"api\", \"package.json\")),\n host: existsSync(join(projectDir, \"host\", \"package.json\")),\n plugins: pluginPackageJsons.length > 0,\n });\n\n if (!pkg.scripts || typeof pkg.scripts !== \"object\") {\n pkg.scripts = {};\n changed = true;\n }\n const scripts = pkg.scripts as Record<string, string>;\n for (const [key, value] of Object.entries(childScripts)) {\n if (scripts[key] !== value) {\n scripts[key] = value;\n changed = true;\n }\n }\n for (const obsoleteScript of [...getParentOnlyScriptKeys(projectDir), \"sync-catalog\", \"init\"]) {\n if (obsoleteScript in scripts) {\n delete scripts[obsoleteScript];\n changed = true;\n }\n }\n\n const workspaces = pkg.workspaces;\n if (workspaces && typeof workspaces === \"object\") {\n const workspaceConfig = workspaces as { packages?: string[] };\n if (Array.isArray(workspaceConfig.packages)) {\n const nextPackages = workspaceConfig.packages.filter(\n (entry) => entry !== \"packages/everything-dev\" && entry !== \"packages/every-plugin\",\n );\n if (nextPackages.length !== workspaceConfig.packages.length) {\n workspaceConfig.packages = nextPackages;\n changed = true;\n }\n }\n }\n\n if (pkg.overrides && typeof pkg.overrides === \"object\") {\n const overrides = pkg.overrides as Record<string, string>;\n for (const packageName of FRAMEWORK_PACKAGES) {\n const value = overrides[packageName];\n if (typeof value === \"string\" && value.startsWith(\"file:packages/\")) {\n delete overrides[packageName];\n changed = true;\n }\n }\n if (Object.keys(overrides).length === 0) {\n delete pkg.overrides;\n changed = true;\n }\n }\n\n if (ensureAuthCoreCatalogRef(pkg)) {\n changed = true;\n }\n\n const workspacePackageJsons = await findWorkspacePackageJsons(projectDir);\n for (const workspacePkgPath of workspacePackageJsons) {\n if (updatePackageFileAuthCoreRef(workspacePkgPath)) {\n changed = true;\n }\n }\n\n if (changed) {\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n return changed;\n}\n\nfunction buildChangelogUrl(\n oldVersion: string | undefined,\n newVersion: string,\n repository: string | undefined,\n): string | undefined {\n const fromVersion = extractSemver(oldVersion);\n const toVersion = extractSemver(newVersion);\n if (!fromVersion || !toVersion || fromVersion === toVersion) return undefined;\n\n const repoUrl = repository;\n if (!repoUrl) return undefined;\n\n const githubMatch = repoUrl.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!githubMatch) return undefined;\n\n const [, owner, repo] = githubMatch;\n return `https://github.com/${owner}/${repo}/compare/v${fromVersion}...v${toVersion}`;\n}\n\nasync function rewriteLegacyUiImports(projectDir: string): Promise<string[]> {\n const files = await glob(\"ui/src/**/*.{ts,tsx}\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n const migrated: string[] = [];\n\n for (const file of files) {\n const filePath = join(projectDir, file);\n const original = readFileSync(filePath, \"utf-8\");\n let next = original;\n\n for (const [from, to] of LEGACY_UI_IMPORT_REWRITES) {\n next = next.replaceAll(from, to);\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nconst LEGACY_DIST_IMPORT_REWRITES = [\n ['from \"everything-dev/', 'from \"everything-dev/'],\n [\"from 'everything-dev/\", \"from 'everything-dev/\"],\n] as const;\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction balancedParenEnd(source: string, openIdx: number): number {\n let depth = 1;\n let i = openIdx;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i;\n }\n i++;\n }\n return -1;\n}\n\nfunction deriveTagFromLayerExpr(layerExpr: string): string | null {\n const m = layerExpr.match(/^\\s*([A-Z]\\w*)/);\n if (!m) return null;\n const name = m[1];\n if (name.endsWith(\"Live\")) return `${name.slice(0, -4)}Tag`;\n if (name.endsWith(\"Layer\")) return `${name.slice(0, -5)}Tag`;\n return null;\n}\n\ntype PipeProvideCall = {\n argStart: number;\n endIdx: number;\n dotIdx: number;\n pipeCloseEnd: number;\n};\n\nfunction findAllPipeEffectProvideCalls(source: string): PipeProvideCall[] {\n const out: PipeProvideCall[] = [];\n const needle = \"Effect.provide(\";\n let searchFrom = 0;\n while (true) {\n const provideIdx = source.indexOf(needle, searchFrom);\n if (provideIdx === -1) break;\n const argStart = provideIdx + needle.length;\n const endIdx = balancedParenEnd(source, argStart);\n if (endIdx === -1) {\n searchFrom = argStart;\n continue;\n }\n let p = provideIdx - 1;\n while (p >= 0 && /\\s/.test(source[p])) p--;\n if (p < 0 || source[p] !== \"(\") {\n searchFrom = endIdx + 1;\n continue;\n }\n p--;\n const pipeWord = \".pipe\";\n if (p - pipeWord.length + 1 < 0 || source.slice(p - pipeWord.length + 1, p + 1) !== pipeWord) {\n searchFrom = endIdx + 1;\n continue;\n }\n const dotIdx = p - pipeWord.length + 1;\n let q = endIdx + 1;\n while (q < source.length && /\\s/.test(source[q])) q++;\n if (q < source.length && source[q] === \",\") q++;\n while (q < source.length && /\\s/.test(source[q])) q++;\n if (q >= source.length || source[q] !== \")\") {\n searchFrom = endIdx + 1;\n continue;\n }\n out.push({ argStart, endIdx, dotIdx, pipeCloseEnd: q + 1 });\n searchFrom = q + 1;\n }\n return out;\n}\n\nfunction rewritePipeEffectProvideForm(source: string, relPath: string): string {\n const calls = findAllPipeEffectProvideCalls(source);\n if (calls.length === 0) return source;\n\n let result = source;\n\n for (let k = calls.length - 1; k >= 0; k--) {\n const call = calls[k];\n const layerExpr = result.slice(call.argStart, call.endIdx).trim();\n const tagName = deriveTagFromLayerExpr(layerExpr);\n if (!tagName) {\n console.warn(\n `[Upgrade] ${relPath}: found .pipe(Effect.provide(${layerExpr})) but could not derive a tag name — skipping. Migrate manually to tools.buildService(<Tag>, ${layerExpr}).`,\n );\n continue;\n }\n const tagUseRe = new RegExp(`(yield\\\\*\\\\s+)${escapeRegex(tagName)}(\\\\s*;?)`, \"g\");\n const tagMatches = [...result.matchAll(tagUseRe)];\n if (tagMatches.length !== 1) {\n console.warn(\n `[Upgrade] ${relPath}: found .pipe(Effect.provide(${layerExpr})) expecting a single \\`yield* ${tagName}\\`, but found ${tagMatches.length} — skipping. Migrate manually.`,\n );\n continue;\n }\n const tm = tagMatches[0];\n const tagStart = tm.index ?? -1;\n if (tagStart < 0) continue;\n const tagLen = tm[0].length;\n const replacement = `${tm[1]}tools.buildService(${tagName}, ${layerExpr})${tm[2]}`;\n if (tagStart < call.dotIdx) {\n result =\n result.slice(0, tagStart) +\n replacement +\n result.slice(tagStart + tagLen, call.dotIdx) +\n result.slice(call.pipeCloseEnd);\n } else {\n result =\n result.slice(0, call.dotIdx) +\n result.slice(call.pipeCloseEnd, tagStart) +\n replacement +\n result.slice(tagStart + tagLen);\n }\n }\n\n return result;\n}\n\nexport async function rewriteLegacyPluginScopedLayerPatterns(\n projectDir: string,\n): Promise<string[]> {\n const files = await glob([\"plugins/*/src/index.ts\", \"api/src/index.ts\"], {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n\n if (files.length === 0) return [];\n\n const migrated: string[] = [];\n const effectProvidePattern = /\\byield\\*\\s*Effect\\.provide\\(/g;\n\n for (const file of files) {\n const filePath = join(projectDir, file);\n const original = readFileSync(filePath, \"utf-8\");\n let next = original;\n\n // Rewrite yield* Effect.provide(Tag, LayerExpr) → yield* tools.buildService(Tag, LayerExpr)\n next = next.replaceAll(effectProvidePattern, \"yield* tools.buildService(\");\n\n // Rewrite the .pipe(Effect.provide(<LayerExpr>)) form: move <LayerExpr> into a\n // tools.buildService(<Tag>, <LayerExpr>) call replacing the bare `yield* <Tag>`\n // inside the generator, and drop the trailing .pipe(Effect.provide(...)).\n next = rewritePipeEffectProvideForm(next, file);\n\n // Add tools as third argument to initialize if it only has (config) or (config, plugins)\n const hasEffectProvideOrServiceBuild = next.includes(\"tools.buildService(\");\n\n if (hasEffectProvideOrServiceBuild) {\n // Rewrite initialize: (config, plugins) => or initialize: (config) =>\n // to include tools\n next = next.replace(\n /(initialize:\\s*)\\((\\w+)(?:,\\s*(\\w+))?\\s*\\)\\s*=>/g,\n (_match, prefix: string, p1: string, p2: string | undefined) => {\n if (p2) {\n return `${prefix}(${p1}, ${p2}, tools) =>`;\n }\n return `${prefix}(${p1}, _plugins, tools) =>`;\n },\n );\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nasync function rewriteLegacyDistImports(projectDir: string): Promise<string[]> {\n const files = await glob(\"**/*.{ts,tsx,js,jsx,mjs,cjs}\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"node_modules/**\", \"dist/**\"],\n });\n\n const migrated: string[] = [];\n\n for (const file of files) {\n const filePath = join(projectDir, file);\n const original = readFileSync(filePath, \"utf-8\");\n let next = original;\n\n for (const [from, to] of LEGACY_DIST_IMPORT_REWRITES) {\n next = next.replaceAll(from, to);\n }\n\n if (next !== original) {\n writeFileSync(filePath, next);\n migrated.push(file);\n }\n }\n\n return migrated;\n}\n\nasync function runMigrationPhase(\n projectDir: string,\n options: UpgradeOptions,\n parentSource: ExtendedRootSource,\n): Promise<UpgradeResult> {\n const timings: PhaseTiming[] = [];\n\n const migratedBosConfigs = await timePhase(timings, \"migrate bos configs\", () =>\n migrateBosConfigFiles(projectDir),\n );\n const migratedRootPackageJson = await timePhase(timings, \"migrate root package\", () =>\n migrateChildRootPackageJson(projectDir),\n );\n\n let syncResult: UpgradeResult[\"sync\"];\n let addedPlugins: string[] = [];\n if (!options.noSync && parentSource.extendsChain.length > 0) {\n addedPlugins = await timePhase(timings, \"discover parent plugins\", async () => {\n if (options.dryRun) return [];\n return addSelectedParentPlugins(projectDir);\n });\n\n syncResult = await timePhase(timings, \"sync template\", () =>\n syncTemplate(projectDir, {\n dryRun: false,\n noInstall: true,\n json: false,\n }),\n );\n }\n\n await timePhase(timings, \"sync shared deps\", async () => {\n const configResult = await loadResolvedConfig({ cwd: projectDir });\n if (!configResult) {\n throw new Error(\"No bos.config.json found in current directory\");\n }\n\n return syncResolvedSharedDeps({\n configDir: projectDir,\n hostMode: \"local\",\n bosConfig: configResult.config,\n });\n });\n\n if (!options.noInstall) {\n await timePhase(timings, \"generate types\", () => runTypesGen(projectDir));\n }\n\n const migratedFiles = await timePhase(timings, \"clean obsolete files\", async () => {\n const nextMigratedFiles = [\n ...migratedBosConfigs,\n ...(migratedRootPackageJson ? [\"package.json\"] : []),\n ...(await rewriteLegacyUiImports(projectDir)),\n ...(await rewriteLegacyPluginScopedLayerPatterns(projectDir)),\n ...(await rewriteLegacyDistImports(projectDir)),\n ];\n for (const file of OBSOLETE_FILES) {\n const filePath = join(projectDir, file);\n if (existsSync(filePath)) {\n rmSync(filePath);\n nextMigratedFiles.push(file);\n }\n }\n\n const legacyPluginDbFiles = await glob(\"plugins/*/src/db/{migrator,load-migrations}.ts\", {\n cwd: projectDir,\n nodir: true,\n dot: false,\n absolute: false,\n });\n for (const file of legacyPluginDbFiles) {\n rmSync(join(projectDir, file));\n nextMigratedFiles.push(file);\n }\n\n return nextMigratedFiles;\n });\n\n let changelogUrl: string | undefined;\n const mainPkg = parentSource.catalog[\"everything-dev\"];\n if (mainPkg) {\n changelogUrl = buildChangelogUrl(undefined, mainPkg, parentSource.repository);\n }\n\n return {\n status: \"upgraded\",\n packages: [],\n sync: syncResult,\n migrated: migratedFiles.length > 0 ? migratedFiles : undefined,\n selectedPlugins: addedPlugins.length > 0 ? addedPlugins : undefined,\n timings,\n changelogUrl,\n };\n}\n\nexport async function upgradeTemplate(\n projectDir: string,\n options: UpgradeOptions,\n): Promise<UpgradeResult> {\n const timings: PhaseTiming[] = [];\n const pkgPath = join(projectDir, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {\n status: \"error\",\n packages: [],\n timings,\n error: \"No package.json found in current directory\",\n };\n }\n\n const parentSource = await readExtendedRootSource(projectDir);\n const sourceRootCatalog = parentSource.catalog;\n const inheritedCatalogPackageNames = Object.keys(sourceRootCatalog);\n const currentRootCatalog = readRootPackageJson(projectDir) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n const currentCatalogEntries = currentRootCatalog.workspaces?.catalog ?? {};\n const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);\n const hasCatalogRefRewrites =\n inheritedCatalogPackageNames.length > 0 &&\n (packageObjectNeedsCatalogRefs(readRootPackageJson(projectDir), inheritedCatalogPackageNames) ||\n workspacePkgPaths.some((pkgPath) =>\n packageFileNeedsCatalogRefs(pkgPath, inheritedCatalogPackageNames),\n ));\n const hasAuthCoreRefRewrites =\n packageObjectNeedsAuthCoreCatalogRef(readRootPackageJson(projectDir)) ||\n workspacePkgPaths.some((pkgPath) =>\n packageObjectNeedsAuthCoreCatalogRef(readJsonFile<Record<string, unknown>>(pkgPath)),\n );\n\n const { packages, catalogVersionUpdates } = await timePhase(\n timings,\n \"check package versions\",\n async () => {\n const nextPackages: UpgradeResult[\"packages\"] = [];\n\n for (const name of FRAMEWORK_PACKAGES) {\n const current = readCurrentPackageSpecifier(projectDir, name);\n const target = sourceRootCatalog[name] ?? current ?? \"unknown\";\n\n nextPackages.push({ name, from: current, to: target });\n }\n\n const nextCatalogVersionUpdates: Array<{\n name: string;\n from: string | undefined;\n to: string;\n }> = [];\n for (const [name, targetVersion] of Object.entries(sourceRootCatalog)) {\n if (FRAMEWORK_PACKAGES.includes(name)) continue;\n\n const currentVersion = currentCatalogEntries[name];\n if (currentVersion === targetVersion) continue;\n nextCatalogVersionUpdates.push({ name, from: currentVersion, to: targetVersion });\n }\n\n return { packages: nextPackages, catalogVersionUpdates: nextCatalogVersionUpdates };\n },\n );\n\n const hasFrameworkUpdates = packages.some((p) => p.from !== p.to && p.from !== undefined);\n const hasCatalogUpdates = catalogVersionUpdates.length > 0;\n const hasUpdates =\n hasFrameworkUpdates || hasCatalogUpdates || hasCatalogRefRewrites || hasAuthCoreRefRewrites;\n\n if (options.dryRun) {\n let changelogUrl: string | undefined;\n const pluginOptions = options.noSync\n ? null\n : await timePhase(timings, \"discover parent plugins\", () =>\n loadParentPluginOptions(projectDir),\n );\n if (hasUpdates) {\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository);\n }\n }\n\n return {\n status: \"dry-run\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n availablePlugins: pluginOptions?.newPluginKeys,\n timings,\n changelogUrl,\n };\n }\n\n if (options.migrationsOnly) {\n return await runMigrationPhase(projectDir, options, parentSource);\n }\n\n // Phase 1: apply package updates, install, then re-exec migrations from the new package\n await timePhase(timings, \"apply package updates\", async () => {\n if (inheritedCatalogPackageNames.length > 0) {\n syncRootCatalogWithParent(projectDir, sourceRootCatalog);\n }\n\n if (inheritedCatalogPackageNames.length > 0) {\n for (const pkgPath of workspacePkgPaths) {\n updatePackageFileCatalogRefs(pkgPath, inheritedCatalogPackageNames);\n }\n }\n });\n\n const needsInstall = (hasUpdates || hasCatalogUpdates) && !options.noInstall;\n\n if (needsInstall) {\n await timePhase(timings, \"install dependencies\", () => runBunInstallForUpgrade(projectDir));\n }\n\n // If we installed new framework packages, re-exec from the new package so migrations\n // run with the latest code instead of the old cached modules.\n if (needsInstall && hasFrameworkUpdates) {\n const bosPath = join(projectDir, \"node_modules\", \".bin\", \"bos\");\n const childArgs = [\n \"upgrade\",\n \"--migrations-only\",\n \"--no-install\",\n ...(options.noSync ? [\"--no-sync\"] : []),\n \"--json\",\n ];\n\n const childResult = spawnSync(bosPath, childArgs, {\n cwd: projectDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n encoding: \"utf-8\",\n env: { ...process.env, BOS_NO_BANNER: \"1\" },\n });\n\n if (childResult.status !== 0) {\n return {\n status: \"error\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings,\n error: `Migration phase failed: ${childResult.stderr || childResult.stdout || \"Unknown error\"}`,\n };\n }\n\n try {\n const childUpgrade: UpgradeResult = JSON.parse(childResult.stdout);\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n const changelogUrl =\n mainPkg?.from && mainPkg.from !== mainPkg.to\n ? buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository)\n : undefined;\n return {\n ...childUpgrade,\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings: [...timings, ...(childUpgrade.timings ?? [])],\n changelogUrl,\n };\n } catch {\n return {\n status: \"error\",\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings,\n error: \"Failed to parse migration phase output\",\n };\n }\n }\n\n // No framework version change: run migrations inline (same-package, no re-exec needed)\n // runMigrationPhase handles types gen internally — no separate runTypesGen call needed here.\n\n const migrationResult = await runMigrationPhase(projectDir, options, parentSource);\n const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n const changelogUrl =\n mainPkg?.from && mainPkg.from !== mainPkg.to\n ? buildChangelogUrl(mainPkg.from, mainPkg.to, parentSource.repository)\n : undefined;\n return {\n ...migrationResult,\n packages: [\n ...packages,\n ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n ],\n timings: [...timings, ...(migrationResult.timings ?? [])],\n changelogUrl,\n };\n}\n"],"mappings":"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"}