{"version":3,"file":"sync.cjs","names":["sourcePathToDestinationPath","mergeBosConfigWithTemplate","isPlainObjectFromMerge","resolveExtendsRef","resolveSourceDir","writeSnapshot","personalizeConfig","loadConfig","runBunInstall","runTypesGen"],"sources":["../../src/cli/sync.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { glob } from \"glob\";\nimport { loadConfig } from \"../config\";\nimport type { SyncOptions, SyncResult } from \"../contract\";\nimport {\n  isPlainObject as isPlainObjectFromMerge,\n  mergeBosConfigWithTemplate,\n  resolveExtendsRef,\n} from \"../merge\";\nimport { writeGeneratedInfra } from \"./infra\";\nimport {\n  personalizeConfig,\n  resolveSourceDir,\n  runBunInstall,\n  runTypesGen,\n  sourcePathToDestinationPath,\n} from \"./init\";\nimport { writeSnapshot } from \"./snapshot\";\n\nconst FRAMEWORK_OWNED_SYNC_FILES = new Set([\n  \".env.example\",\n  \".gitignore\",\n  \"AGENTS.md\",\n  \"biome.json\",\n  \"bos.config.json\",\n  \"bunfig.toml\",\n  \"CONTRIBUTING.md\",\n  \"package.json\",\n  \".changeset/config.json\",\n  \".changeset/README.md\",\n  \".github/renovate.json\",\n  \".github/workflows/ci.yml\",\n  \".github/workflows/release-sync.yml\",\n  \".opencode/skills/everything-dev/SKILL.md\",\n  \"ui/package.json\",\n  \"ui/postcss.config.mjs\",\n  \"ui/rsbuild.config.ts\",\n  \"ui/tsconfig.json\",\n  \"ui/src/app.ts\",\n  \"ui/src/globals.d.ts\",\n  \"ui/src/hydrate.tsx\",\n  \"ui/src/lib/api.ts\",\n  \"ui/src/lib/auth.ts\",\n  \"ui/src/router.server.tsx\",\n  \"ui/src/router.tsx\",\n  \"ui/src/routes/__root.tsx\",\n  \"api/package.json\",\n  \"api/plugin.dev.ts\",\n  \"api/rspack.config.js\",\n  \"api/tsconfig.contract.json\",\n  \"api/tsconfig.json\",\n  \"api/src/lib/auth.ts\",\n]);\n\ntype PackageJson = Record<string, unknown>;\n\nexport function isFrameworkOwnedSyncFile(filePath: string): boolean {\n  return FRAMEWORK_OWNED_SYNC_FILES.has(filePath);\n}\n\nfunction computeLocalHash(projectDir: string, filePath: string): string | null {\n  const fullPath = join(projectDir, filePath);\n  if (!existsSync(fullPath)) return null;\n  try {\n    const content = readFileSync(fullPath);\n    return createHash(\"sha256\").update(content).digest(\"hex\").substring(0, 16);\n  } catch {\n    return null;\n  }\n}\n\nfunction backupFiles(projectDir: string, filePaths: string[]): string | null {\n  const filesToBackup = filePaths.filter((f) => existsSync(join(projectDir, f)));\n  if (filesToBackup.length === 0) return null;\n\n  const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n  const backupDir = join(projectDir, \".bos\", \"sync-backup\", timestamp);\n\n  for (const filePath of filesToBackup) {\n    const src = join(projectDir, filePath);\n    const dest = join(backupDir, filePath);\n    mkdirSync(dirname(dest), { recursive: true });\n    copyFileSync(src, dest);\n  }\n\n  return backupDir;\n}\n\nfunction mergeStringMaps(\n  local: Record<string, string> | undefined,\n  template: Record<string, string> | undefined,\n): Record<string, string> | undefined {\n  if (!local && !template) return undefined;\n\n  const merged: Record<string, string> = { ...(local ?? {}) };\n  for (const [name, value] of Object.entries(template ?? {})) {\n    merged[name] = value;\n  }\n\n  return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeWorkspacePackages(local: unknown, template: unknown): string[] | undefined {\n  const localPackages = Array.isArray(local) ? local : [];\n  const templatePackages = Array.isArray(template) ? template : [];\n  if (localPackages.length === 0 && templatePackages.length === 0) return undefined;\n\n  const ordered = new Set<string>();\n  for (const entry of templatePackages) {\n    if (typeof entry === \"string\" && entry.length > 0) ordered.add(entry);\n  }\n  for (const entry of localPackages) {\n    if (typeof entry === \"string\" && entry.length > 0) ordered.add(entry);\n  }\n\n  const hasPluginEntry = [...ordered].some((e) => e.startsWith(\"plugins/\") && e !== \"plugins/*\");\n  if (hasPluginEntry) {\n    for (const entry of [...ordered]) {\n      if (entry.startsWith(\"plugins/\") && entry !== \"plugins/*\") {\n        ordered.delete(entry);\n      }\n    }\n    ordered.add(\"plugins/*\");\n  }\n\n  return ordered.size > 0 ? [...ordered] : undefined;\n}\n\nexport function mergePackageJson(\n  filePath: string,\n  local: PackageJson,\n  template: PackageJson,\n): PackageJson {\n  const merged: PackageJson = { ...local, ...template };\n\n  if (filePath === \"package.json\") {\n    for (const key of [\"name\", \"private\", \"version\"] as const) {\n      if (key in local) {\n        merged[key] = local[key];\n      }\n    }\n  } else if (\"version\" in local) {\n    merged.version = local.version;\n  }\n\n  for (const depField of [\n    \"dependencies\",\n    \"devDependencies\",\n    \"peerDependencies\",\n    \"overrides\",\n  ] as const) {\n    const localDeps = local[depField] as Record<string, string> | undefined;\n    const templateDeps = template[depField] as Record<string, string> | undefined;\n\n    const mergedDeps = mergeStringMaps(localDeps, templateDeps);\n    if (mergedDeps) {\n      merged[depField] = mergedDeps;\n    } else {\n      delete merged[depField];\n    }\n  }\n\n  if (\n    (local.scripts && typeof local.scripts === \"object\") ||\n    (template.scripts && typeof template.scripts === \"object\")\n  ) {\n    const mergedScripts = mergeStringMaps(\n      local.scripts as Record<string, string> | undefined,\n      template.scripts as Record<string, string> | undefined,\n    );\n    if (mergedScripts) {\n      merged.scripts = mergedScripts;\n    } else {\n      delete merged.scripts;\n    }\n  }\n\n  if (\n    (local.workspaces && typeof local.workspaces === \"object\") ||\n    (template.workspaces && typeof template.workspaces === \"object\")\n  ) {\n    const localWorkspaces = (local.workspaces ?? {}) as {\n      packages?: string[];\n      catalog?: Record<string, string>;\n    };\n    const templateWorkspaces = (template.workspaces ?? {}) as {\n      packages?: string[];\n      catalog?: Record<string, string>;\n    };\n\n    const mergedWorkspaces: { packages?: string[]; catalog?: Record<string, string> } = {\n      ...localWorkspaces,\n      ...templateWorkspaces,\n    };\n\n    const mergedPackages = mergeWorkspacePackages(\n      localWorkspaces.packages,\n      templateWorkspaces.packages,\n    );\n    if (mergedPackages) {\n      mergedWorkspaces.packages = mergedPackages;\n    } else {\n      delete mergedWorkspaces.packages;\n    }\n\n    const mergedCatalog = mergeStringMaps(localWorkspaces.catalog, templateWorkspaces.catalog);\n    if (mergedCatalog) {\n      mergedWorkspaces.catalog = mergedCatalog;\n    } else {\n      delete mergedWorkspaces.catalog;\n    }\n\n    if (Object.keys(mergedWorkspaces).length > 0) {\n      merged.workspaces = mergedWorkspaces;\n    } else {\n      delete merged.workspaces;\n    }\n  }\n\n  return merged;\n}\n\nfunction toDestPath(filePath: string): string {\n  return sourcePathToDestinationPath(filePath);\n}\n\nfunction toSourcePath(sourceDir: string, destPath: string): string | null {\n  const directPath = join(sourceDir, destPath);\n  if (existsSync(directPath)) {\n    return destPath;\n  }\n\n  if (destPath.startsWith(\".github/\")) {\n    const templatePath = destPath.replace(/^\\.github\\//, \".github/templates/\");\n    if (existsSync(join(sourceDir, templatePath))) {\n      return templatePath;\n    }\n  }\n\n  return null;\n}\n\nfunction writeSyncedFile(sourceDir: string, projectDir: string, filePath: string): void {\n  const src = join(sourceDir, filePath);\n  const destPath = filePath.startsWith(\".github/templates/\")\n    ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n    : filePath;\n  const dest = join(projectDir, destPath);\n  mkdirSync(dirname(dest), { recursive: true });\n\n  if (filePath.endsWith(\"bos.config.json\")) {\n    const localContent = existsSync(dest) ? readFileSync(dest, \"utf-8\") : null;\n    const templateContent = readFileSync(src, \"utf-8\");\n\n    if (localContent) {\n      const local = JSON.parse(localContent) as Record<string, unknown>;\n      const template = JSON.parse(templateContent) as Record<string, unknown>;\n      const merged = mergeBosConfigWithTemplate(local, template);\n      writeFileSync(dest, `${JSON.stringify(merged, null, 2)}\\n`);\n      return;\n    }\n  }\n\n  if (filePath.endsWith(\"package.json\")) {\n    const localContent = existsSync(dest) ? readFileSync(dest, \"utf-8\") : null;\n    const templateContent = readFileSync(src, \"utf-8\");\n\n    if (localContent) {\n      const local = JSON.parse(localContent) as Record<string, unknown>;\n      const template = JSON.parse(templateContent) as Record<string, unknown>;\n      const merged = mergePackageJson(destPath, local, template);\n      writeFileSync(dest, `${JSON.stringify(merged, null, 2)}\\n`);\n      return;\n    }\n  }\n\n  writeFileSync(dest, readFileSync(src));\n}\n\nasync function getSelectedChildPlugins(\n  projectDir: string,\n  localConfig: Record<string, unknown>,\n): Promise<string[]> {\n  if (!localConfig.plugins || typeof localConfig.plugins !== \"object\") {\n    return [];\n  }\n\n  const pluginDirs = new Set(\n    (\n      await glob(\"plugins/*/package.json\", {\n        cwd: projectDir,\n        nodir: true,\n        dot: false,\n        absolute: false,\n      })\n    )\n      .map((file) => file.match(/^plugins\\/([^/]+)\\/package\\.json$/)?.[1])\n      .filter((key): key is string => Boolean(key)),\n  );\n\n  const selected: string[] = [];\n  for (const [pluginKey, rawEntry] of Object.entries(\n    localConfig.plugins as Record<string, unknown>,\n  )) {\n    if (typeof rawEntry === \"string\") {\n      if (!rawEntry.startsWith(\"local:\")) {\n        selected.push(pluginKey);\n        continue;\n      }\n\n      const localPath = join(projectDir, rawEntry.slice(\"local:\".length).trim());\n      if (existsSync(localPath) || pluginDirs.has(pluginKey)) {\n        selected.push(pluginKey);\n      }\n      continue;\n    }\n\n    if (!rawEntry || typeof rawEntry !== \"object\") {\n      selected.push(pluginKey);\n      continue;\n    }\n\n    const entry = rawEntry as Record<string, unknown>;\n    const development = typeof entry.development === \"string\" ? entry.development : undefined;\n    if (!development?.startsWith(\"local:\")) {\n      selected.push(pluginKey);\n      continue;\n    }\n\n    const localPath = join(projectDir, development.slice(\"local:\".length).trim());\n    if (existsSync(localPath) || pluginDirs.has(pluginKey)) {\n      selected.push(pluginKey);\n    }\n  }\n\n  return selected;\n}\n\nexport async function syncTemplate(projectDir: string, options: SyncOptions): Promise<SyncResult> {\n  // Sync reads the raw bos.config.json (not the resolved config) because it needs\n  // the user's explicit local settings: their extends ref, selected plugins, etc.\n  // The resolved config is the merged result and would include inherited parent\n  // values that the user didn't explicitly choose, which would break sync filtering.\n  const localConfig = JSON.parse(\n    readFileSync(join(projectDir, \"bos.config.json\"), \"utf-8\"),\n  ) as Record<string, unknown>;\n\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  if (!extendsRef?.startsWith(\"bos://\")) {\n    return {\n      status: \"error\",\n      updated: [],\n      skipped: [],\n      added: [],\n      error: \"No extends field found in bos.config.json — cannot determine parent\",\n    };\n  }\n\n  const extendsMatch = extendsRef.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n  if (!extendsMatch) {\n    return {\n      status: \"error\",\n      updated: [],\n      skipped: [],\n      added: [],\n      error: `Invalid extends reference: ${extendsRef}`,\n    };\n  }\n\n  const extendsAccount = extendsMatch[1];\n  const extendsGateway = extendsMatch[2];\n\n  const { sourceDir, cleanup } = await resolveSourceDir({\n    extendsAccount,\n    extendsGateway,\n  });\n\n  try {\n    const childPlugins = await getSelectedChildPlugins(projectDir, localConfig);\n    const withUi = existsSync(join(projectDir, \"ui\", \"package.json\"));\n    const withApi = existsSync(join(projectDir, \"api\", \"package.json\"));\n    const withHost = existsSync(join(projectDir, \"host\", \"package.json\"));\n\n    const filteredFiles = new Set<string>();\n    const destToSource = new Map<string, string>();\n    for (const destPath of FRAMEWORK_OWNED_SYNC_FILES) {\n      if (destPath.startsWith(\"ui/\") && !withUi) continue;\n      if (destPath.startsWith(\"api/\") && !withApi) continue;\n      if (destPath.startsWith(\"host/\") && !withHost) continue;\n      const sourcePath = toSourcePath(sourceDir, destPath);\n      if (!sourcePath) continue;\n      filteredFiles.add(sourcePath);\n      destToSource.set(destPath, sourcePath);\n    }\n\n    const updated: string[] = [];\n    const skipped: string[] = [];\n    const added: string[] = [];\n\n    for (const [destPath, filePath] of destToSource.entries()) {\n      const localHash = computeLocalHash(projectDir, destPath);\n      const sourceContent = readFileSync(join(sourceDir, filePath));\n      const sourceHash = createHash(\"sha256\").update(sourceContent).digest(\"hex\").substring(0, 16);\n\n      if (localHash === null) {\n        added.push(destPath);\n        continue;\n      }\n\n      if (localHash !== sourceHash) {\n        updated.push(destPath);\n      }\n    }\n\n    if (options.dryRun) {\n      return {\n        status: \"dry-run\",\n        updated,\n        skipped,\n        added,\n      };\n    }\n\n    const filesToWrite = [...updated, ...added];\n\n    if (filesToWrite.length > 0) {\n      backupFiles(projectDir, filesToWrite);\n\n      for (const destPath of filesToWrite) {\n        const sourcePath = destToSource.get(destPath) ?? destPath;\n        writeSyncedFile(sourceDir, projectDir, sourcePath);\n      }\n    }\n\n    const newSnapshotFiles: Record<string, string> = {};\n    for (const filePath of filteredFiles) {\n      const src = join(sourceDir, filePath);\n      const content = readFileSync(src);\n      newSnapshotFiles[toDestPath(filePath)] = createHash(\"sha256\")\n        .update(content)\n        .digest(\"hex\")\n        .substring(0, 16);\n    }\n\n    await writeSnapshot(projectDir, {\n      parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n      files: newSnapshotFiles,\n    });\n\n    const account = (localConfig.account as string) || extendsAccount;\n    const domain = (localConfig.domain as string) || extendsGateway;\n    const overrides: Array<\"ui\" | \"api\" | \"host\" | \"plugins\"> = [];\n    if (withUi) overrides.push(\"ui\");\n    if (withApi) overrides.push(\"api\");\n    if (withHost) overrides.push(\"host\");\n    if (childPlugins.length > 0) overrides.push(\"plugins\");\n\n    await personalizeConfig(projectDir, {\n      extendsAccount,\n      extendsGateway,\n      account,\n      domain,\n      overrides,\n      plugins: childPlugins,\n      workspaceOpts: { sourceDir },\n      mode: \"sync\",\n      existingConfig: localConfig,\n    });\n\n    const syncedConfig = await loadConfig({ cwd: projectDir });\n    if (syncedConfig?.runtime) {\n      writeGeneratedInfra(projectDir, syncedConfig.runtime);\n    }\n\n    if (!options.noInstall) {\n      await runBunInstall(projectDir);\n      await runTypesGen(projectDir);\n    }\n\n    return {\n      status: \"synced\",\n      updated,\n      skipped,\n      added,\n    };\n  } finally {\n    await cleanup();\n  }\n}\n"],"mappings":"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"}