{"version":3,"file":"upgrade.mjs","names":["isPlainObjectFromMerge"],"sources":["../../src/cli/upgrade.ts"],"sourcesContent":["import { 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 type { PhaseTiming, UpgradeOptions, UpgradeResult } from \"../contract\";\nimport { isPlainObject as isPlainObjectFromMerge, resolveExtendsRef } from \"../merge\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { readInstalledFrameworkVersion } from \"./framework-version\";\nimport { fetchParentConfig, resolveSourceDir, runBunInstallForUpgrade, runTypesGen } from \"./init\";\nimport { syncTemplate } from \"./sync\";\nimport { timePhase } from \"./timing\";\n\nconst FRAMEWORK_PACKAGES = [\"everything-dev\", \"every-plugin\"];\n\nconst CATALOG_TOOL_PACKAGES = [\n  \"@rspack/core\",\n  \"@rspack/cli\",\n  \"@rsbuild/core\",\n  \"@rsbuild/plugin-react\",\n  \"@module-federation/enhanced\",\n  \"@module-federation/node\",\n  \"@module-federation/rsbuild-plugin\",\n  \"@module-federation/runtime-core\",\n  \"@module-federation/sdk\",\n  \"@module-federation/dts-plugin\",\n] as const;\nconst PINNED_CATALOG_TOOL_VERSIONS: Partial<\n  Record<(typeof CATALOG_TOOL_PACKAGES)[number], string>\n> = {\n  \"@rspack/core\": \"1.7.11\",\n  \"@rspack/cli\": \"1.7.11\",\n  \"@rsbuild/core\": \"1.7.5\",\n  \"@rsbuild/plugin-react\": \"1.4.6\",\n};\nconst LEGACY_UI_IMPORT_REWRITES = [\n  ['from \"@/auth\"', 'from \"@/app\"'],\n  [\"from '@/auth'\", \"from '@/app'\"],\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  \"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/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  \"packages/everything-dev/cli.js\",\n  \".templatekeep\",\n  \".templatesync-exclude\",\n];\n\nfunction extractVersion(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\nasync function readExtendedRootCatalog(projectDir: string): Promise<Record<string, string>> {\n  const configPath = join(projectDir, \"bos.config.json\");\n  if (!existsSync(configPath)) {\n    return {};\n  }\n\n  const localConfig = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n  let extendsRef: string | undefined;\n  if (typeof localConfig.extends === \"string\") {\n    extendsRef = localConfig.extends;\n  } else if (isPlainObjectFromMerge(localConfig.extends)) {\n    extendsRef = resolveExtendsRef(localConfig.extends as Record<string, string>, \"production\");\n  }\n\n  const parsed = extendsRef ? parseBosRef(extendsRef) : null;\n  if (!parsed) {\n    return {};\n  }\n\n  const { sourceDir, cleanup } = await resolveSourceDir({\n    extendsAccount: parsed.account,\n    extendsGateway: parsed.gateway,\n  });\n\n  try {\n    const sourcePkgPath = join(sourceDir, \"package.json\");\n    if (!existsSync(sourcePkgPath)) {\n      return {};\n    }\n\n    const sourcePkg = JSON.parse(readFileSync(sourcePkgPath, \"utf-8\")) as {\n      workspaces?: { catalog?: Record<string, string> };\n    };\n    return { ...(sourcePkg.workspaces?.catalog ?? {}) };\n  } finally {\n    await cleanup();\n  }\n}\n\nfunction getExtendsRef(config: Record<string, unknown>): string | undefined {\n  if (typeof config.extends === \"string\") {\n    return config.extends;\n  }\n\n  if (config.extends && typeof config.extends === \"object\") {\n    return resolveExtendsRef(config.extends as Record<string, string>, \"production\");\n  }\n\n  return undefined;\n}\n\nfunction parseBosRef(ref: string): { account: string; gateway: string } | null {\n  const match = ref.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n  if (!match?.[1] || !match[2]) return null;\n  return { account: match[1], gateway: match[2] };\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      \"sidebar\",\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      \"sidebar\",\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    if (entry.sidebar === undefined && Array.isArray(pluginConfig.sidebar)) {\n      entry.sidebar = pluginConfig.sidebar;\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      if (entry.sidebar === undefined && Array.isArray(api.sidebar)) {\n        entry.sidebar = api.sidebar;\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  const fallback: Record<string, unknown> = {};\n  if (pluginConfig.sidebar !== undefined) {\n    fallback.sidebar = pluginConfig.sidebar;\n  }\n  if (pluginConfig.routes !== undefined) {\n    fallback.routes = pluginConfig.routes;\n  }\n  if (Object.keys(fallback).length > 0) {\n    return fallback;\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    (pluginConfig.sidebar !== undefined && Array.isArray(pluginConfig.sidebar)) ||\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 {}\n\n      try {\n        rmSync(filePath);\n        migrated.push(relativePath);\n      } catch {}\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\nfunction updateWorkspacePackageRefInFile(filePath: string, packageName: string): boolean {\n  const pkg = JSON.parse(readFileSync(filePath, \"utf-8\")) as Record<string, unknown>;\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 (setCatalogRef(field, packageName)) {\n      modified = true;\n    }\n  }\n\n  if (modified) {\n    writeFileSync(filePath, `${JSON.stringify(pkg, null, 2)}\\n`);\n  }\n  return modified;\n}\n\nfunction updateRootPackageVersion(\n  projectDir: string,\n  packageName: string,\n  newVersion: string,\n): boolean {\n  const pkgPath = join(projectDir, \"package.json\");\n  const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\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 (setCatalogRef(field, packageName)) {\n      modified = true;\n    }\n  }\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  const nextVersion = newVersion;\n  if (workspaces.catalog[packageName] !== nextVersion) {\n    workspaces.catalog[packageName] = nextVersion;\n    modified = true;\n  }\n\n  if (modified) {\n    writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n  }\n\n  return modified;\n}\n\nfunction updateRootCatalogVersion(\n  projectDir: string,\n  packageName: string,\n  newVersion: string,\n): boolean {\n  const pkgPath = join(projectDir, \"package.json\");\n  const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n\n  if (!pkg.workspaces || typeof pkg.workspaces !== \"object\") {\n    pkg.workspaces = { packages: [], catalog: {} };\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  }\n\n  const nextVersion = newVersion;\n  if (workspaces.catalog[packageName] === nextVersion) return false;\n\n  workspaces.catalog[packageName] = nextVersion;\n  writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\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\nfunction buildChangelogUrl(\n  oldVersion: string | undefined,\n  newVersion: string,\n  parentConfig: Record<string, unknown> | null,\n): string | undefined {\n  if (!oldVersion || oldVersion === newVersion) return undefined;\n  const repoUrl = parentConfig?.repository as string | undefined;\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${oldVersion}...v${newVersion}`;\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\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 sourceRootCatalog = await readExtendedRootCatalog(projectDir);\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 installed = readInstalledVersion(projectDir, name);\n        const latest = extractVersion(sourceRootCatalog[name]);\n\n        if (!latest) {\n          nextPackages.push({ name, from: installed, to: installed ?? \"unknown\" });\n          continue;\n        }\n\n        nextPackages.push({ name, from: installed, to: latest });\n      }\n\n      const nextCatalogVersionUpdates: Array<{\n        name: string;\n        from: string | undefined;\n        to: string;\n      }> = [];\n      for (const name of CATALOG_TOOL_PACKAGES) {\n        const installed = readInstalledVersion(projectDir, name);\n        if (!installed) continue;\n        const targetVersion =\n          PINNED_CATALOG_TOOL_VERSIONS[name] ??\n          extractVersion(sourceRootCatalog[name]) ??\n          installed;\n        if (installed === targetVersion) continue;\n        nextCatalogVersionUpdates.push({ name, from: installed, 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 = hasFrameworkUpdates || hasCatalogUpdates;\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 configPath = join(projectDir, \"bos.config.json\");\n      let parentConfig: Record<string, unknown> | null = null;\n      if (existsSync(configPath)) {\n        try {\n          parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n        } catch {}\n      }\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, parentConfig);\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  await timePhase(timings, \"apply package updates\", async () => {\n    for (const pkg of packages) {\n      if (pkg.from !== undefined && pkg.from !== pkg.to) {\n        updateRootPackageVersion(projectDir, pkg.name, pkg.to);\n      }\n    }\n\n    for (const update of catalogVersionUpdates) {\n      updateRootCatalogVersion(projectDir, update.name, update.to);\n    }\n\n    const workspacePkgPaths = await findWorkspacePackageJsons(projectDir);\n    for (const pkgPath of workspacePkgPaths) {\n      for (const pkg of packages) {\n        if (pkg.from !== undefined && pkg.from !== pkg.to) {\n          updateWorkspacePackageRefInFile(pkgPath, pkg.name);\n        }\n      }\n      for (const update of catalogVersionUpdates) {\n        updateWorkspacePackageRefInFile(pkgPath, update.name);\n      }\n    }\n  });\n\n  const migratedBosConfigs = await timePhase(timings, \"migrate bos configs\", () =>\n    migrateBosConfigFiles(projectDir),\n  );\n\n  let syncResult: UpgradeResult[\"sync\"];\n  let addedPlugins: string[] = [];\n  if (!options.noSync) {\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        force: options.force,\n        noInstall: true,\n      }),\n    );\n  }\n\n  if ((hasUpdates || addedPlugins.length > 0) && !options.noInstall) {\n    await timePhase(timings, \"install dependencies\", () => runBunInstallForUpgrade(projectDir));\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      ...(await rewriteLegacyUiImports(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    return nextMigratedFiles;\n  });\n\n  let changelogUrl: string | undefined;\n  const mainPkg = packages.find((p) => p.name === \"everything-dev\");\n  if (mainPkg?.from && mainPkg.from !== mainPkg.to) {\n    const configPath = join(projectDir, \"bos.config.json\");\n    let parentConfig: Record<string, unknown> | null = null;\n    if (existsSync(configPath)) {\n      try {\n        parentConfig = JSON.parse(readFileSync(configPath, \"utf-8\"));\n      } catch {}\n    }\n    changelogUrl = buildChangelogUrl(mainPkg.from, mainPkg.to, parentConfig);\n  }\n\n  return {\n    status: \"upgraded\",\n    packages: [\n      ...packages,\n      ...catalogVersionUpdates.map((u) => ({ name: u.name, from: u.from, to: u.to })),\n    ],\n    sync: syncResult,\n    migrated: migratedFiles.length > 0 ? migratedFiles : undefined,\n    selectedPlugins: addedPlugins.length > 0 ? addedPlugins : undefined,\n    timings,\n    changelogUrl,\n  };\n}\n"],"mappings":"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"}