everything-dev 1.22.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/init.mjs CHANGED
@@ -58,7 +58,9 @@ async function resolveSourceDir(opts) {
58
58
  async function readTemplatekeep(sourceDir) {
59
59
  const keepFile = join(sourceDir, ".templatekeep");
60
60
  if (!existsSync(keepFile)) return [];
61
- return readFileSync(keepFile, "utf-8").split("\n").map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#"));
61
+ const patterns = readFileSync(keepFile, "utf-8").split("\n").map((line) => line.trim()).filter((line) => line.length > 0 && !line.startsWith("#"));
62
+ if (!patterns.includes(".templatekeep")) patterns.unshift(".templatekeep");
63
+ return patterns;
62
64
  }
63
65
  async function fetchParentConfig(extendsAccount, extendsGateway) {
64
66
  return fetchBosConfigFromFastKv(`bos://${extendsAccount}/${extendsGateway}`);
@@ -261,6 +263,15 @@ async function personalizeConfig(destination, opts) {
261
263
  if (opts.account) config.account = opts.account;
262
264
  if (opts.domain) config.domain = opts.domain;
263
265
  if (opts.repository) config.repository = opts.repository;
266
+ else if (isInit) delete config.repository;
267
+ if (isInit) {
268
+ for (const field of [
269
+ "title",
270
+ "description",
271
+ "testnet",
272
+ "staging"
273
+ ]) if (!(field in opts)) delete config[field];
274
+ }
264
275
  if (isInit && config.app && typeof config.app === "object") {
265
276
  const app = config.app;
266
277
  for (const entryKey of Object.keys(app)) {
@@ -326,6 +337,7 @@ async function personalizeConfig(destination, opts) {
326
337
  scripts.typecheck = scripts.typecheck.replace("bun run types:gen && ", "").replace(/bun run --cwd packages\/everything-dev typecheck & ?/, "");
327
338
  if (!has("host")) scripts.typecheck = scripts.typecheck.replace(/bun run --cwd host tsc --noEmit & ?/, "");
328
339
  }
340
+ if (!scripts.bos) scripts.bos = "node_modules/.bin/bos";
329
341
  }
330
342
  if (pkg.devDependencies && typeof pkg.devDependencies === "object") {
331
343
  const deps = pkg.devDependencies;
@@ -345,8 +357,10 @@ async function personalizeConfig(destination, opts) {
345
357
  workspaces.catalog["everything-dev"] = spec.rootCatalog["everything-dev"];
346
358
  workspaces.catalog["every-plugin"] = spec.rootCatalog["every-plugin"];
347
359
  }
348
- if (!deps["everything-dev"] && spec) deps["everything-dev"] = "catalog:";
349
- if (!deps["every-plugin"] && spec) deps["every-plugin"] = "catalog:";
360
+ const frameworkCatalog = resolveFrameworkCatalog();
361
+ for (const [name, version] of Object.entries(frameworkCatalog)) workspaces.catalog[name] = version;
362
+ if (!deps["everything-dev"]) deps["everything-dev"] = "catalog:";
363
+ if (!deps["every-plugin"]) deps["every-plugin"] = "catalog:";
350
364
  writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
351
365
  }
352
366
  const apiTsConfigPath = join(destination, "api", "tsconfig.json");
@@ -436,11 +450,16 @@ export interface AuthServices {
436
450
  }
437
451
  `;
438
452
  }
439
- async function runBunInstall(destination) {
440
- await execCommand("bun", ["install", "--ignore-scripts"], destination, { stdio: "inherit" });
453
+ async function runBunInstall(destination, spinner) {
454
+ await runWithProgress("bun", ["install", "--ignore-scripts"], destination, spinner, "Installing dependencies");
455
+ }
456
+ async function runBunInstallForUpgrade(destination, spinner) {
457
+ const lockfilePath = join(destination, "bun.lock");
458
+ if (existsSync(lockfilePath)) rmSync(lockfilePath, { force: true });
459
+ await runWithProgress("bun", ["install"], destination, spinner, "Installing dependencies");
441
460
  }
442
- async function runTypesGen(destination) {
443
- await execCommand("node_modules/.bin/bos", ["types", "gen"], destination, { stdio: "inherit" });
461
+ async function runTypesGen(destination, spinner) {
462
+ await runWithProgress("node_modules/.bin/bos", ["types", "gen"], destination, spinner, "Generating types");
444
463
  }
445
464
  async function runDockerComposeUp(destination) {
446
465
  await execCommand("docker", [
@@ -450,12 +469,71 @@ async function runDockerComposeUp(destination) {
450
469
  "--wait"
451
470
  ], destination, { stdio: "inherit" });
452
471
  }
472
+ async function runWithProgress(command, args, cwd, spinner, label) {
473
+ const child = execa(command, args, {
474
+ cwd,
475
+ stdio: "inherit",
476
+ timeout: COMMAND_TIMEOUTS[command] ?? 2 * 6e4
477
+ });
478
+ if (spinner) {
479
+ const start = Date.now();
480
+ const interval = setInterval(() => {
481
+ const elapsed = Math.round((Date.now() - start) / 1e3);
482
+ spinner.message(`${label}... (${elapsed}s)`);
483
+ }, 2e3);
484
+ try {
485
+ await child;
486
+ } finally {
487
+ clearInterval(interval);
488
+ }
489
+ } else await child;
490
+ }
491
+ function stripOrphanedWorkspacesFromLockfile(lockfilePath, allowedWorkspaces) {
492
+ if (!existsSync(lockfilePath)) return;
493
+ const content = readFileSync(lockfilePath, "utf-8");
494
+ let lockfile;
495
+ try {
496
+ lockfile = JSON.parse(content);
497
+ } catch {
498
+ return;
499
+ }
500
+ const workspaces = lockfile.workspaces;
501
+ if (!workspaces || typeof workspaces !== "object") return;
502
+ const workspaceMap = workspaces;
503
+ const allowed = new Set(["", ...allowedWorkspaces]);
504
+ const keys = Object.keys(workspaceMap);
505
+ let changed = false;
506
+ for (const key of keys) if (!allowed.has(key)) {
507
+ delete workspaceMap[key];
508
+ changed = true;
509
+ }
510
+ if (changed) writeFileSync(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\n`);
511
+ }
453
512
  const WORKSPACE_LOCAL_PATHS = {
454
513
  "everything-dev": "packages/everything-dev",
455
514
  "every-plugin": "packages/every-plugin"
456
515
  };
457
516
  function resolveFrameworkCatalog() {
458
517
  const catalog = {};
518
+ try {
519
+ const monorepoPkgPath = join(dirname(require.resolve("everything-dev/package.json")), "..", "..", "package.json");
520
+ if (existsSync(monorepoPkgPath)) {
521
+ const sourceCatalog = JSON.parse(readFileSync(monorepoPkgPath, "utf-8")).workspaces?.catalog;
522
+ if (sourceCatalog && typeof sourceCatalog === "object") {
523
+ for (const [name, version] of Object.entries(sourceCatalog)) if (typeof version === "string") catalog[name] = version;
524
+ }
525
+ }
526
+ } catch {}
527
+ try {
528
+ const selfPkgPath = require.resolve("everything-dev/package.json");
529
+ const selfPkg = JSON.parse(readFileSync(selfPkgPath, "utf-8"));
530
+ if (selfPkg.version && !catalog["everything-dev"]) catalog["everything-dev"] = `^${selfPkg.version}`;
531
+ const sourceCatalog = selfPkg.workspaces?.catalog;
532
+ if (sourceCatalog && typeof sourceCatalog === "object") {
533
+ for (const [name, version] of Object.entries(sourceCatalog)) if (typeof version === "string" && !catalog[name]) catalog[name] = version;
534
+ }
535
+ } catch {}
536
+ if (Object.keys(catalog).length > 0) return catalog;
459
537
  for (const packageName of FRAMEWORK_PACKAGES) try {
460
538
  const resolved = require.resolve(`${packageName}/package.json`);
461
539
  const pkg = JSON.parse(readFileSync(resolved, "utf-8"));
@@ -470,7 +548,9 @@ async function scaffoldMinimalProject(destination, parentConfig, opts) {
470
548
  extends: `bos://${opts.extendsAccount}/${opts.extendsGateway}`,
471
549
  account: opts.account || opts.extendsAccount,
472
550
  ...opts.domain ? { domain: opts.domain } : {},
473
- ...opts.repository ? { repository: opts.repository } : {}
551
+ ...opts.repository ? { repository: opts.repository } : {},
552
+ ...opts.title ? { title: opts.title } : {},
553
+ ...opts.description ? { description: opts.description } : {}
474
554
  };
475
555
  if (parentConfig.app && typeof parentConfig.app === "object") {
476
556
  const app = {};
@@ -525,7 +605,8 @@ async function scaffoldMinimalProject(destination, parentConfig, opts) {
525
605
  start: "node_modules/.bin/bos start",
526
606
  typecheck: "node_modules/.bin/bos types gen && tsc --noEmit",
527
607
  postinstall: "node_modules/.bin/bos types gen || true",
528
- "types:gen": "node_modules/.bin/bos types gen"
608
+ "types:gen": "node_modules/.bin/bos types gen",
609
+ bos: "node_modules/.bin/bos"
529
610
  },
530
611
  dependencies: {
531
612
  "everything-dev": "catalog:",
@@ -697,5 +778,5 @@ dist/
697
778
  }
698
779
 
699
780
  //#endregion
700
- export { copyFilteredFiles, detectGitRemoteUrl, downloadTarball, execCommand, fetchParentConfig, generateDatabaseMigrations, personalizeConfig, readTemplatekeep, resolveRepositoryViaExtendsChain, resolveSourceDir, runBunInstall, runDockerComposeUp, runTypesGen, scaffoldMinimalProject, writeInitSnapshot };
781
+ export { copyFilteredFiles, detectGitRemoteUrl, downloadTarball, execCommand, fetchParentConfig, generateDatabaseMigrations, personalizeConfig, readTemplatekeep, resolveRepositoryViaExtendsChain, resolveSourceDir, runBunInstall, runBunInstallForUpgrade, runDockerComposeUp, runTypesGen, scaffoldMinimalProject, stripOrphanedWorkspacesFromLockfile, writeInitSnapshot };
701
782
  //# sourceMappingURL=init.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.mjs","names":[],"sources":["../../src/cli/init.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport type { OverrideSection } from \"../contract\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport type { BosConfig, BosConfigInput } from \"../types\";\nimport { isPathExcluded } from \"../utils/path-match\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { writeSnapshot } from \"./snapshot\";\n\nconst require = createRequire(import.meta.url);\n\nconst FRAMEWORK_PACKAGES = [\"every-plugin\", \"everything-dev\"] as const;\n\nconst _DEFAULT_OVERRIDES: OverrideSection[] = [\"ui\", \"api\"];\n\nconst OVERRIDE_WORKSPACE_MAP: Record<OverrideSection, string[]> = {\n ui: [\"ui\"],\n api: [\"api\"],\n host: [\"host\"],\n plugins: [],\n};\n\ninterface SourceResult {\n sourceDir: string;\n parentConfig: BosConfig;\n cleanup: () => Promise<void>;\n}\n\nexport async function resolveSourceDir(opts: {\n extendsAccount: string;\n extendsGateway: string;\n source?: string;\n}): Promise<SourceResult> {\n if (opts.source) {\n const sourceDir = resolve(opts.source);\n if (!existsSync(join(sourceDir, \"bos.config.json\"))) {\n throw new Error(`No bos.config.json found in source directory: ${sourceDir}`);\n }\n const parentConfig = JSON.parse(\n readFileSync(join(sourceDir, \"bos.config.json\"), \"utf-8\"),\n ) as BosConfig;\n return { sourceDir, parentConfig, cleanup: async () => {} };\n }\n\n const parentConfig = await fetchParentConfig(opts.extendsAccount, opts.extendsGateway);\n\n if (parentConfig.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(parentConfig.repository);\n return { sourceDir, parentConfig, cleanup };\n }\n\n const chainResult = await resolveRepositoryViaExtendsChain(\n opts.extendsAccount,\n opts.extendsGateway,\n );\n if (chainResult?.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(chainResult.repository);\n return { sourceDir, parentConfig: chainResult.config, cleanup };\n }\n\n return {\n sourceDir: \"\",\n parentConfig,\n cleanup: async () => {},\n };\n}\n\nexport async function readTemplatekeep(sourceDir: string): Promise<string[]> {\n const keepFile = join(sourceDir, \".templatekeep\");\n if (!existsSync(keepFile)) {\n return [];\n }\n\n const content = readFileSync(keepFile, \"utf-8\");\n return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\"));\n}\n\nexport async function fetchParentConfig(\n extendsAccount: string,\n extendsGateway: string,\n): Promise<BosConfig> {\n const bosUrl = `bos://${extendsAccount}/${extendsGateway}`;\n return fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n}\n\nexport async function resolveRepositoryViaExtendsChain(\n extendsAccount: string,\n extendsGateway: string,\n visited = new Set<string>(),\n): Promise<{ repository: string; config: BosConfig } | null> {\n const key = `bos://${extendsAccount}/${extendsGateway}`;\n if (visited.has(key)) return null;\n visited.add(key);\n\n try {\n const config = await fetchParentConfig(extendsAccount, extendsGateway);\n if (config.repository) {\n return { repository: config.repository, config };\n }\n\n const extendsRef = config.extends;\n if (extendsRef && typeof extendsRef === \"string\") {\n const normalized = extendsRef.startsWith(\"bos://\") ? extendsRef : `bos://${extendsRef}`;\n const match = normalized.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (match) {\n const result = await resolveRepositoryViaExtendsChain(match[1], match[2], visited);\n if (result) return result;\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function detectGitRemoteUrl(directory: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: directory,\n stdio: \"pipe\",\n });\n const url = stdout.trim();\n if (!url) return undefined;\n return normalizeGitUrl(url);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeGitUrl(url: string): string | undefined {\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return `https://github.com/${sshMatch[1]}/${sshMatch[2]}`;\n }\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return `https://github.com/${httpsMatch[1]}/${httpsMatch[2]}`;\n }\n return url.endsWith(\".git\") ? url.slice(0, -4) : url;\n}\n\nexport async function downloadTarball(\n repoUrl: string,\n): Promise<{ dir: string; cleanup: () => Promise<void> }> {\n const parsed = parseGitHubUrl(repoUrl);\n if (!parsed) {\n throw new Error(`Cannot parse repository URL: ${repoUrl}`);\n }\n\n const { owner, repo, branch } = parsed;\n const tarballUrl = `https://api.github.com/repos/${owner}/${repo}/tarball/${branch}`;\n\n const tmpDir = mkTmpDir(\"bos-init-tarball-\");\n const tarballPath = join(tmpDir, \"source.tar.gz\");\n\n const response = await fetch(tarballUrl, {\n headers: { \"User-Agent\": \"everything-dev\" },\n redirect: \"follow\",\n });\n\n if (!response.ok) {\n rmSync(tmpDir, { recursive: true, force: true });\n throw new Error(`GitHub tarball download failed: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n rmSync(tmpDir, { recursive: true, force: true });\n throw new Error(\"GitHub tarball download returned empty body\");\n }\n\n const fileStream = createWriteStream(tarballPath);\n const reader = response.body as unknown as NodeJS.ReadableStream;\n await pipeline(reader, fileStream);\n\n const extractDir = mkTmpDir(\"bos-init-extract-\");\n try {\n const tar = require(\"tar\") as {\n extract: (opts: { cwd: string; file: string; strip: number }) => Promise<void>;\n };\n await tar.extract({ cwd: extractDir, file: tarballPath, strip: 1 });\n } catch {\n await execCommand(\"tar\", [\"-xzf\", tarballPath, \"--strip-components=1\", \"-C\", extractDir]);\n }\n\n rmSync(tmpDir, { recursive: true, force: true });\n\n return {\n dir: extractDir,\n cleanup: async () => {\n rmSync(extractDir, { recursive: true, force: true });\n },\n };\n}\n\nfunction parseGitHubUrl(url: string): { owner: string; repo: string; branch: string } | null {\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return { owner: httpsMatch[1], repo: httpsMatch[2], branch: \"main\" };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2], branch: \"main\" };\n }\n\n return null;\n}\n\nfunction filterPatternsByOverrides(\n patterns: string[],\n overrides: OverrideSection[],\n _plugins?: string[],\n): string[] {\n const has = (section: OverrideSection) => overrides.includes(section);\n let filtered = [...patterns];\n\n if (!has(\"host\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"host/\") && p !== \"host/**\");\n }\n if (!has(\"ui\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"ui/\") && p !== \"ui/**\");\n }\n if (!has(\"api\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"api/\") && p !== \"api/**\");\n }\n if (!has(\"plugins\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"plugins/\") && p !== \"plugins/**\");\n }\n\n return filtered;\n}\n\nexport async function copyFilteredFiles(\n sourceDir: string,\n destination: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n pluginRoutes?: Record<string, string[]>;\n },\n): Promise<number> {\n if (patterns.length === 0) {\n return 0;\n }\n\n const has = (section: OverrideSection) => options.overrides.includes(section);\n\n const effectivePatterns = filterPatternsByOverrides(patterns, options.overrides, options.plugins);\n\n if (has(\"host\") && !effectivePatterns.some((p) => p.startsWith(\"host/\") || p === \"host/**\")) {\n effectivePatterns.push(\"host/**\");\n }\n\n const excludedRoutePatterns: string[] = [];\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) {\n excludedRoutePatterns.push(...routePatterns);\n }\n }\n }\n\n const allFiles = new Set<string>();\n for (const pattern of effectivePatterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n const pluginMatch = match.match(/^plugins\\/([^/]+)/);\n if (pluginMatch) {\n const pluginName = pluginMatch[1];\n if (!(options.plugins?.includes(pluginName) ?? true)) continue;\n }\n if (isPathExcluded(match, excludedRoutePatterns)) continue;\n allFiles.add(match);\n }\n }\n\n const routeFiles = new Set<string>();\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) continue;\n for (const rp of routePatterns) {\n const matches = await glob(rp, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n if (!isPathExcluded(match, excludedRoutePatterns)) {\n routeFiles.add(match);\n }\n }\n }\n }\n }\n\n for (const f of routeFiles) allFiles.add(f);\n\n mkdirSync(destination, { recursive: true });\n\n let count = 0;\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n\n const destPath = filePath.startsWith(\".github/templates/\")\n ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n : filePath;\n const dest = join(destination, destPath);\n mkdirSync(dirname(dest), { recursive: true });\n const content = readFileSync(src);\n writeFileSync(dest, content);\n count++;\n }\n\n return count;\n}\n\nfunction stripProductionFields(entry: Record<string, unknown>): void {\n delete entry.production;\n delete entry.integrity;\n delete entry.ssr;\n delete entry.ssrIntegrity;\n}\n\nexport async function personalizeConfig(\n destination: string,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n pluginRoutes?: Record<string, string[]>;\n workspaceOpts?: { localOverrides?: boolean; sourceDir?: string };\n mode?: \"init\" | \"sync\";\n repository?: string;\n },\n): Promise<void> {\n const isInit = opts.mode !== \"sync\";\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n\n const configPath = join(destination, \"bos.config.json\");\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n\n config.extends = `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n\n if (opts.account) {\n config.account = opts.account;\n }\n if (opts.domain) {\n config.domain = opts.domain;\n }\n if (opts.repository) {\n config.repository = opts.repository;\n }\n\n if (isInit && config.app && typeof config.app === \"object\") {\n const app = config.app as Record<string, unknown>;\n\n for (const entryKey of Object.keys(app)) {\n if (\n !has(entryKey as OverrideSection) &&\n (entryKey === \"host\" || entryKey === \"ui\" || entryKey === \"api\" || entryKey === \"auth\")\n ) {\n delete app[entryKey];\n continue;\n }\n const entry = app[entryKey];\n if (entry && typeof entry === \"object\") {\n stripProductionFields(entry as Record<string, unknown>);\n }\n }\n }\n\n if (has(\"plugins\")) {\n if (config.plugins && typeof config.plugins === \"object\") {\n const plugins = config.plugins as Record<string, unknown>;\n\n if (opts.plugins !== undefined) {\n for (const pluginKey of Object.keys(plugins)) {\n if (!opts.plugins.includes(pluginKey)) {\n delete plugins[pluginKey];\n }\n }\n }\n\n for (const pluginKey of Object.keys(plugins)) {\n const plugin = plugins[pluginKey];\n let pluginObj: Record<string, unknown>;\n\n if (typeof plugin === \"string\") {\n pluginObj = { extends: plugin };\n plugins[pluginKey] = pluginObj;\n } else if (plugin && typeof plugin === \"object\") {\n pluginObj = { ...(plugin as Record<string, unknown>) };\n } else {\n continue;\n }\n\n stripProductionFields(pluginObj);\n }\n\n if (Object.keys(plugins).length === 0) {\n config.plugins = {};\n }\n }\n } else {\n delete config.plugins;\n }\n\n await saveBosConfig(destination, config);\n }\n\n const pkgPath = join(destination, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n\n if (pkg.workspaces && typeof pkg.workspaces === \"object\") {\n const ws = pkg.workspaces as { packages?: string[] };\n if (Array.isArray(ws.packages)) {\n ws.packages = ws.packages.filter((p: string) => {\n if (p.startsWith(\"packages/\")) return false;\n if (p === \"host\") return has(\"host\");\n if (p === \"plugins/*\") return has(\"plugins\") && (opts.plugins?.length ?? 0) > 0;\n const pluginMatch = p.match(/^plugins\\/([^/]+)/);\n if (pluginMatch)\n return has(\"plugins\") && (opts.plugins?.includes(pluginMatch[1]) ?? true);\n return true;\n });\n }\n }\n\n if (pkg.scripts && typeof pkg.scripts === \"object\") {\n const scripts = pkg.scripts as Record<string, string>;\n const rewrite = (key: string, from: string, to: string) => {\n if (scripts[key]?.includes(from)) {\n scripts[key] = scripts[key].replaceAll(from, to);\n }\n };\n rewrite(\"dev\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"dev:ui\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"dev:api\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"dev:proxy\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"build\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"deploy\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"publish\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"start\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n\n scripts.postinstall = \"node_modules/.bin/bos types gen || true\";\n scripts[\"types:gen\"] = \"node_modules/.bin/bos types gen\";\n if (scripts.typecheck) {\n scripts.typecheck = scripts.typecheck\n .replace(\"bun run types:gen && \", \"\")\n .replace(/bun run --cwd packages\\/everything-dev typecheck & ?/, \"\");\n if (!has(\"host\")) {\n scripts.typecheck = scripts.typecheck.replace(/bun run --cwd host tsc --noEmit & ?/, \"\");\n }\n }\n }\n\n if (pkg.devDependencies && typeof pkg.devDependencies === \"object\") {\n const deps = pkg.devDependencies as Record<string, string>;\n delete deps[\"every-plugin\"];\n delete deps[\"everything-dev\"];\n }\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 if (!pkg.dependencies) pkg.dependencies = {};\n const deps = pkg.dependencies as Record<string, string>;\n const spec = opts.workspaceOpts?.sourceDir\n ? loadManifestNormalizationSpec(opts.workspaceOpts.sourceDir)\n : null;\n if (spec) {\n workspaces.catalog[\"everything-dev\"] = spec.rootCatalog[\"everything-dev\"];\n workspaces.catalog[\"every-plugin\"] = spec.rootCatalog[\"every-plugin\"];\n }\n if (!deps[\"everything-dev\"] && spec) deps[\"everything-dev\"] = \"catalog:\";\n if (!deps[\"every-plugin\"] && spec) deps[\"every-plugin\"] = \"catalog:\";\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n const apiTsConfigPath = join(destination, \"api\", \"tsconfig.json\");\n if (existsSync(apiTsConfigPath)) {\n const apiTsConfig = JSON.parse(readFileSync(apiTsConfigPath, \"utf-8\")) as {\n files?: string[];\n [key: string]: unknown;\n };\n if (apiTsConfig.files) {\n const validFiles = apiTsConfig.files.filter((f) => existsSync(join(destination, \"api\", f)));\n if (validFiles.length !== apiTsConfig.files.length) {\n if (validFiles.length === 0) {\n delete apiTsConfig.files;\n } else {\n apiTsConfig.files = validFiles;\n }\n writeFileSync(apiTsConfigPath, `${JSON.stringify(apiTsConfig, null, 2)}\\n`);\n }\n }\n }\n\n await resolveWorkspaceRefs(destination, opts.workspaceOpts);\n\n if (has(\"ui\")) {\n const genContractPath = join(destination, \"ui\", \"src\", \"lib\", \"api-types.gen.ts\");\n if (!existsSync(genContractPath)) {\n mkdirSync(dirname(genContractPath), { recursive: true });\n writeFileSync(genContractPath, `export type ApiContract = Record<string, never>;\\n`);\n }\n }\n\n if (has(\"api\")) {\n const pluginsClientGenPath = join(destination, \"api\", \"src\", \"lib\", \"plugins-types.gen.ts\");\n if (!existsSync(pluginsClientGenPath)) {\n mkdirSync(dirname(pluginsClientGenPath), { recursive: true });\n writeFileSync(\n pluginsClientGenPath,\n `import type { ContractRouterClient, AnyContractRouter } from \"@orpc/contract\";\\ntype ClientFactory<C extends AnyContractRouter> = (context?: Record<string, unknown>) => ContractRouterClient<C>;\\nexport type PluginsClient = Record<string, never>;\\n`,\n );\n }\n }\n\n const authTypesContent = generateAuthTypesTemplate();\n const authTypesPaths: string[] = [];\n if (has(\"ui\")) {\n authTypesPaths.push(join(destination, \"ui\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"api\")) {\n authTypesPaths.push(join(destination, \"api\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"host\") && existsSync(join(destination, \"host\", \"src\"))) {\n authTypesPaths.push(join(destination, \"host\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n for (const authTypesGenPath of authTypesPaths) {\n if (!existsSync(authTypesGenPath)) {\n mkdirSync(dirname(authTypesGenPath), { recursive: true });\n writeFileSync(authTypesGenPath, authTypesContent);\n }\n }\n}\n\nfunction generateAuthTypesTemplate(): string {\n return `import type { Auth } from \"better-auth\";\nexport type { Auth } from \"better-auth\";\nexport type AuthSessionUser = NonNullable<Auth[\"$Infer\"][\"Session\"][\"user\"]> & {\n role?: string | null;\n isAnonymous?: boolean | null;\n walletAddress?: string | null;\n banned?: boolean | null;\n};\nexport type AuthSessionData = NonNullable<Auth[\"$Infer\"][\"Session\"][\"session\"]> & {\n activeOrganizationId?: string | null;\n};\nexport type AuthSession = {\n user: AuthSessionUser | null;\n session: AuthSessionData | null;\n};\nexport interface AuthOrganizationContext {\n activeOrganizationId: string | null;\n organization: { id: string; name: string; slug: string; logo?: string | null; metadata?: Record<string, unknown> } | null;\n member: { id: string; role: string } | null;\n isPersonal: boolean;\n hasOrganization: boolean;\n}\nexport interface AuthRequestContext {\n user: AuthSessionUser | null;\n userId: string | null;\n isAuthenticated: boolean;\n authMethod: \"session\" | \"apiKey\" | \"anonymous\" | \"none\";\n near: {\n primaryAccountId: string | null;\n linkedAccounts: Array<{ accountId: string; network: string; publicKey: string; isPrimary: boolean }>;\n hasNearAccount: boolean;\n };\n organization: AuthOrganizationContext;\n organizations?: Array<{ id: string; role: string; name?: string; slug?: string }>;\n}\nexport type AuthActiveMember = { id: string | null; role: string | null; organizationId: string | null };\nexport type AuthOrganization = NonNullable<AuthOrganizationContext[\"organization\"]>;\nexport type AuthOrganizationMember = NonNullable<AuthOrganizationContext[\"member\"]>;\nexport type AuthOrganizationSummary = NonNullable<AuthRequestContext[\"organizations\"]>[number];\nexport type AuthBaseSession = Auth[\"$Infer\"][\"Session\"];\nexport type createAuthInstance = never;\nexport interface AuthServices {\n auth: Auth;\n db: unknown;\n driver: { close(): Promise<void> };\n handler: (req: Request) => Promise<Response>;\n}\n`;\n}\n\nexport async function runBunInstall(destination: string): Promise<void> {\n await execCommand(\"bun\", [\"install\", \"--ignore-scripts\"], destination, { stdio: \"inherit\" });\n}\n\nexport async function runTypesGen(destination: string): Promise<void> {\n await execCommand(\"node_modules/.bin/bos\", [\"types\", \"gen\"], destination, { stdio: \"inherit\" });\n}\n\nexport async function runDockerComposeUp(destination: string): Promise<void> {\n await execCommand(\"docker\", [\"compose\", \"up\", \"-d\", \"--wait\"], destination, { stdio: \"inherit\" });\n}\n\nconst WORKSPACE_LOCAL_PATHS: Record<string, string> = {\n \"everything-dev\": \"packages/everything-dev\",\n \"every-plugin\": \"packages/every-plugin\",\n};\n\nfunction resolveFrameworkCatalog(): Record<string, string> {\n const catalog: Record<string, string> = {};\n for (const packageName of FRAMEWORK_PACKAGES) {\n try {\n const resolved = require.resolve(`${packageName}/package.json`);\n const pkg = JSON.parse(readFileSync(resolved, \"utf-8\")) as { version?: string };\n if (pkg.version) {\n catalog[packageName] = `^${pkg.version}`;\n }\n } catch {}\n }\n return catalog;\n}\n\nexport async function scaffoldMinimalProject(\n destination: string,\n parentConfig: BosConfigInput,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n repository?: string;\n },\n): Promise<number> {\n mkdirSync(destination, { recursive: true });\n\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n\n const config: Record<string, unknown> = {\n extends: `bos://${opts.extendsAccount}/${opts.extendsGateway}`,\n account: opts.account || opts.extendsAccount,\n ...(opts.domain ? { domain: opts.domain } : {}),\n ...(opts.repository ? { repository: opts.repository } : {}),\n };\n\n if (parentConfig.app && typeof parentConfig.app === \"object\") {\n const app: Record<string, unknown> = {};\n const parentApp = parentConfig.app as Record<string, Record<string, unknown>>;\n\n if (has(\"host\") && parentApp.host) {\n app.host = { ...parentApp.host };\n stripProductionFields(app.host as Record<string, unknown>);\n }\n\n if (has(\"ui\") && parentApp.ui) {\n app.ui = { ...parentApp.ui };\n stripProductionFields(app.ui as Record<string, unknown>);\n }\n\n if (has(\"api\") && parentApp.api) {\n app.api = { ...parentApp.api };\n stripProductionFields(app.api as Record<string, unknown>);\n }\n\n if (has(\"plugins\") && parentApp.auth) {\n app.auth = { ...parentApp.auth };\n stripProductionFields(app.auth as Record<string, unknown>);\n }\n\n if (Object.keys(app).length > 0) {\n config.app = app;\n }\n }\n\n if (has(\"plugins\") && opts.plugins && opts.plugins.length > 0 && parentConfig.plugins) {\n const plugins: Record<string, unknown> = {};\n for (const key of opts.plugins) {\n const parentPlugin = (parentConfig.plugins as Record<string, unknown>)?.[key];\n if (parentPlugin) {\n if (typeof parentPlugin === \"string\") {\n plugins[key] = { extends: parentPlugin };\n } else {\n const pluginCopy = { ...(parentPlugin as Record<string, unknown>) };\n stripProductionFields(pluginCopy);\n plugins[key] = pluginCopy;\n }\n }\n }\n config.plugins = plugins;\n }\n\n await saveBosConfig(destination, config);\n\n const workspacePackages: string[] = [];\n for (const section of opts.overrides) {\n workspacePackages.push(...OVERRIDE_WORKSPACE_MAP[section]);\n }\n if (has(\"plugins\") && opts.plugins) {\n for (const plugin of opts.plugins) {\n workspacePackages.push(`plugins/${plugin}`);\n }\n }\n\n const catalog = resolveFrameworkCatalog();\n\n const pkg: Record<string, unknown> = {\n name: opts.domain || opts.extendsGateway,\n private: true,\n type: \"module\",\n scripts: {\n dev: \"node_modules/.bin/bos dev --host remote\",\n \"dev:ui\": \"node_modules/.bin/bos dev --ui local --api remote\",\n \"dev:api\": \"node_modules/.bin/bos dev --ui remote --api local\",\n build: \"node_modules/.bin/bos build\",\n deploy: \"node_modules/.bin/bos build --deploy\",\n publish: \"node_modules/.bin/bos publish\",\n start: \"node_modules/.bin/bos start\",\n typecheck: \"node_modules/.bin/bos types gen && tsc --noEmit\",\n postinstall: \"node_modules/.bin/bos types gen || true\",\n \"types:gen\": \"node_modules/.bin/bos types gen\",\n },\n dependencies: {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n },\n devDependencies: {},\n workspaces: {\n packages: workspacePackages,\n catalog,\n },\n };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n const envExample = generateEnvExample(parentConfig, opts.overrides);\n if (envExample) {\n writeFileSync(join(destination, \".env.example\"), envExample);\n }\n\n writeFileSync(join(destination, \".gitignore\"), generateGitignore());\n\n return 4;\n}\n\nasync function resolveWorkspaceRefs(\n destination: string,\n options?: { localOverrides?: boolean; sourceDir?: string },\n): Promise<void> {\n await normalizePackageManifestsInTree({\n sourceRootDir: options?.sourceDir ?? destination,\n targetDir: destination,\n resolveCatalogRefs: false,\n preserveCatalogRefs: true,\n removeWorkspaceDeps: [\"host\"],\n });\n\n if (options?.localOverrides && options.sourceDir) {\n const rootPkgPath = join(destination, \"package.json\");\n if (existsSync(rootPkgPath)) {\n const pkg = JSON.parse(readFileSync(rootPkgPath, \"utf-8\")) as Record<string, unknown>;\n if (!pkg.overrides) pkg.overrides = {};\n const overrides = pkg.overrides as Record<string, string>;\n\n const rootWorkspaces = ((pkg.workspaces as Record<string, string[]>)?.packages ?? []).filter(\n Boolean,\n );\n\n for (const [name, relPath] of Object.entries(WORKSPACE_LOCAL_PATHS)) {\n if (!rootWorkspaces.some((ws) => ws === relPath || ws === `plugins/${name}`)) {\n const srcPkgPath = join(options.sourceDir, relPath, \"package.json\");\n if (existsSync(srcPkgPath)) {\n overrides[name] = `file:${relPath}`;\n rootWorkspaces.push(relPath);\n }\n }\n }\n\n if (rootWorkspaces.length > 0) {\n if (!pkg.workspaces) pkg.workspaces = {};\n (pkg.workspaces as Record<string, string[]>).packages = rootWorkspaces;\n }\n\n writeFileSync(rootPkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n }\n}\n\nexport async function writeInitSnapshot(\n destination: string,\n extendsAccount: string,\n extendsGateway: string,\n sourceDir: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n pluginRoutes?: Record<string, string[]>;\n },\n): Promise<void> {\n const effectivePatterns = filterPatternsByOverrides(patterns, options.overrides, options.plugins);\n\n const has = (section: OverrideSection) => options.overrides.includes(section);\n if (has(\"host\") && !effectivePatterns.some((p) => p.startsWith(\"host/\") || p === \"host/**\")) {\n effectivePatterns.push(\"host/**\");\n }\n\n const excludedRoutePatterns: string[] = [];\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) {\n excludedRoutePatterns.push(...routePatterns);\n }\n }\n }\n\n const allFiles = new Set<string>();\n for (const pattern of effectivePatterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n const pluginMatch = match.match(/^plugins\\/([^/]+)/);\n if (pluginMatch && !(options.plugins?.includes(pluginMatch[1]) ?? true)) continue;\n if (isPathExcluded(match, excludedRoutePatterns)) continue;\n allFiles.add(match);\n }\n }\n\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) continue;\n for (const rp of routePatterns) {\n const matches = await glob(rp, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n if (!isPathExcluded(match, excludedRoutePatterns)) {\n allFiles.add(match);\n }\n }\n }\n }\n }\n\n const fileHashes: Record<string, string> = {};\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n const content = readFileSync(src);\n const destPath = filePath.startsWith(\".github/templates/\")\n ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n : filePath;\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n });\n}\n\nfunction computeHash(data: Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\").substring(0, 16);\n}\n\nfunction mkTmpDir(prefix: string): string {\n return mkdtempSync(join(tmpdir(), `${prefix}-`));\n}\n\nexport async function generateDatabaseMigrations(destination: string): Promise<void> {\n const drizzleConfigs = await glob(\"**/drizzle.config.ts\", {\n cwd: destination,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"**/node_modules/**\"],\n });\n\n for (const configPath of drizzleConfigs) {\n const workspaceDir = dirname(configPath);\n const pkgPath = join(destination, workspaceDir, \"package.json\");\n if (!existsSync(pkgPath)) continue;\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const scripts = pkg.scripts as Record<string, string> | undefined;\n if (!scripts?.[\"db:generate\"]) continue;\n\n const cwd = join(destination, workspaceDir);\n await execCommand(\"bun\", [\"run\", \"db:generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n bun: 5 * 60_000,\n docker: 5 * 60_000,\n node_modules: 2 * 60_000,\n tar: 60_000,\n};\n\nexport async function execCommand(\n command: string,\n args: string[],\n cwd?: string,\n options?: { stdio?: \"pipe\" | \"inherit\" },\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n await execa(command, args, { cwd, stdio: options?.stdio ?? \"pipe\", timeout });\n}\n\nfunction generateEnvExample(config: BosConfigInput, overrides: OverrideSection[]): string {\n const has = (section: OverrideSection) => overrides.includes(section);\n\n const lines: string[] = [\"# Environment variables\"];\n const collectSecrets = (\n obj: Record<string, unknown>,\n includeSection: boolean,\n prefix = \"\",\n ): void => {\n for (const [key, value] of Object.entries(obj)) {\n if (!includeSection) continue;\n if (key === \"secrets\" && Array.isArray(value)) {\n for (const secret of value) {\n if (typeof secret === \"string\") {\n lines.push(`${secret}=`);\n }\n }\n } else if (key === \"variables\" && isPlainObject(value)) {\n for (const [varKey, varVal] of Object.entries(value as Record<string, unknown>)) {\n if (typeof varVal === \"string\") {\n lines.push(`${varKey}=${varVal}`);\n }\n }\n } else if (isPlainObject(value) && key !== \"extends\") {\n collectSecrets(value as Record<string, unknown>, includeSection, `${prefix}${key}.`);\n }\n }\n };\n\n if (config.app && typeof config.app === \"object\") {\n const app = config.app as Record<string, unknown>;\n collectSecrets(app, has(\"host\"), \"host.\");\n collectSecrets(app, has(\"ui\"), \"ui.\");\n collectSecrets(app, has(\"api\"), \"api.\");\n collectSecrets(app, has(\"plugins\"), \"auth.\");\n }\n if (has(\"plugins\") && config.plugins && typeof config.plugins === \"object\") {\n for (const [pluginKey, pluginVal] of Object.entries(\n config.plugins as Record<string, unknown>,\n )) {\n if (isPlainObject(pluginVal)) {\n collectSecrets(pluginVal as Record<string, unknown>, true);\n } else if (typeof pluginVal === \"string\") {\n lines.push(`# Plugin '${pluginKey}' extends ${pluginVal}`);\n }\n }\n }\n\n lines.push(\"BETTER_AUTH_SECRET=generate-a-secret-here\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction generateGitignore(): string {\n return `node_modules/\ndist/\n.env\n.bos/\n*.gen.ts\n*.gen.tsx\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA4BA,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,MAAM,qBAAqB,CAAC,gBAAgB,iBAAiB;AAI7D,MAAM,yBAA4D;CAChE,IAAI,CAAC,KAAK;CACV,KAAK,CAAC,MAAM;CACZ,MAAM,CAAC,OAAO;CACd,SAAS,EAAE;CACZ;AAQD,eAAsB,iBAAiB,MAIb;AACxB,KAAI,KAAK,QAAQ;EACf,MAAM,YAAY,QAAQ,KAAK,OAAO;AACtC,MAAI,CAAC,WAAW,KAAK,WAAW,kBAAkB,CAAC,CACjD,OAAM,IAAI,MAAM,iDAAiD,YAAY;AAK/E,SAAO;GAAE;GAAW,cAHC,KAAK,MACxB,aAAa,KAAK,WAAW,kBAAkB,EAAE,QAAQ,CAC1D;GACiC,SAAS,YAAY;GAAI;;CAG7D,MAAM,eAAe,MAAM,kBAAkB,KAAK,gBAAgB,KAAK,eAAe;AAEtF,KAAI,aAAa,YAAY;EAC3B,MAAM,EAAE,KAAK,WAAW,YAAY,MAAM,gBAAgB,aAAa,WAAW;AAClF,SAAO;GAAE;GAAW;GAAc;GAAS;;CAG7C,MAAM,cAAc,MAAM,iCACxB,KAAK,gBACL,KAAK,eACN;AACD,KAAI,aAAa,YAAY;EAC3B,MAAM,EAAE,KAAK,WAAW,YAAY,MAAM,gBAAgB,YAAY,WAAW;AACjF,SAAO;GAAE;GAAW,cAAc,YAAY;GAAQ;GAAS;;AAGjE,QAAO;EACL,WAAW;EACX;EACA,SAAS,YAAY;EACtB;;AAGH,eAAsB,iBAAiB,WAAsC;CAC3E,MAAM,WAAW,KAAK,WAAW,gBAAgB;AACjD,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO,EAAE;AAIX,QADgB,aAAa,UAAU,QAAQ,CAE5C,MAAM,KAAK,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,QAAQ,SAAS,KAAK,SAAS,KAAK,CAAC,KAAK,WAAW,IAAI,CAAC;;AAG/D,eAAsB,kBACpB,gBACA,gBACoB;AAEpB,QAAO,yBADQ,SAAS,eAAe,GAAG,iBACQ;;AAGpD,eAAsB,iCACpB,gBACA,gBACA,0BAAU,IAAI,KAAa,EACgC;CAC3D,MAAM,MAAM,SAAS,eAAe,GAAG;AACvC,KAAI,QAAQ,IAAI,IAAI,CAAE,QAAO;AAC7B,SAAQ,IAAI,IAAI;AAEhB,KAAI;EACF,MAAM,SAAS,MAAM,kBAAkB,gBAAgB,eAAe;AACtE,MAAI,OAAO,WACT,QAAO;GAAE,YAAY,OAAO;GAAY;GAAQ;EAGlD,MAAM,aAAa,OAAO;AAC1B,MAAI,cAAc,OAAO,eAAe,UAAU;GAEhD,MAAM,SADa,WAAW,WAAW,SAAS,GAAG,aAAa,SAAS,cAClD,MAAM,0BAA0B;AACzD,OAAI,OAAO;IACT,MAAM,SAAS,MAAM,iCAAiC,MAAM,IAAI,MAAM,IAAI,QAAQ;AAClF,QAAI,OAAQ,QAAO;;;AAIvB,SAAO;SACD;AACN,SAAO;;;AAIX,eAAsB,mBAAmB,WAAgD;AACvF,KAAI;EACF,MAAM,EAAE,WAAW,MAAM,MAAM,OAAO;GAAC;GAAU;GAAW;GAAS,EAAE;GACrE,KAAK;GACL,OAAO;GACR,CAAC;EACF,MAAM,MAAM,OAAO,MAAM;AACzB,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,gBAAgB,IAAI;SACrB;AACN;;;AAIJ,SAAS,gBAAgB,KAAiC;CACxD,MAAM,WAAW,IAAI,MAAM,gDAAgD;AAC3E,KAAI,SACF,QAAO,sBAAsB,SAAS,GAAG,GAAG,SAAS;CAEvD,MAAM,aAAa,IAAI,MAAM,iEAAiE;AAC9F,KAAI,WACF,QAAO,sBAAsB,WAAW,GAAG,GAAG,WAAW;AAE3D,QAAO,IAAI,SAAS,OAAO,GAAG,IAAI,MAAM,GAAG,GAAG,GAAG;;AAGnD,eAAsB,gBACpB,SACwD;CACxD,MAAM,SAAS,eAAe,QAAQ;AACtC,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,gCAAgC,UAAU;CAG5D,MAAM,EAAE,OAAO,MAAM,WAAW;CAChC,MAAM,aAAa,gCAAgC,MAAM,GAAG,KAAK,WAAW;CAE5E,MAAM,SAAS,SAAS,oBAAoB;CAC5C,MAAM,cAAc,KAAK,QAAQ,gBAAgB;CAEjD,MAAM,WAAW,MAAM,MAAM,YAAY;EACvC,SAAS,EAAE,cAAc,kBAAkB;EAC3C,UAAU;EACX,CAAC;AAEF,KAAI,CAAC,SAAS,IAAI;AAChB,SAAO,QAAQ;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AAChD,QAAM,IAAI,MAAM,mCAAmC,SAAS,OAAO,GAAG,SAAS,aAAa;;AAG9F,KAAI,CAAC,SAAS,MAAM;AAClB,SAAO,QAAQ;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AAChD,QAAM,IAAI,MAAM,8CAA8C;;CAGhE,MAAM,aAAa,kBAAkB,YAAY;CACjD,MAAM,SAAS,SAAS;AACxB,OAAM,SAAS,QAAQ,WAAW;CAElC,MAAM,aAAa,SAAS,oBAAoB;AAChD,KAAI;AAIF,QAHY,QAAQ,MAAM,CAGhB,QAAQ;GAAE,KAAK;GAAY,MAAM;GAAa,OAAO;GAAG,CAAC;SAC7D;AACN,QAAM,YAAY,OAAO;GAAC;GAAQ;GAAa;GAAwB;GAAM;GAAW,CAAC;;AAG3F,QAAO,QAAQ;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAEhD,QAAO;EACL,KAAK;EACL,SAAS,YAAY;AACnB,UAAO,YAAY;IAAE,WAAW;IAAM,OAAO;IAAM,CAAC;;EAEvD;;AAGH,SAAS,eAAe,KAAqE;CAC3F,MAAM,aAAa,IAAI,MAAM,iEAAiE;AAC9F,KAAI,WACF,QAAO;EAAE,OAAO,WAAW;EAAI,MAAM,WAAW;EAAI,QAAQ;EAAQ;CAGtE,MAAM,WAAW,IAAI,MAAM,gDAAgD;AAC3E,KAAI,SACF,QAAO;EAAE,OAAO,SAAS;EAAI,MAAM,SAAS;EAAI,QAAQ;EAAQ;AAGlE,QAAO;;AAGT,SAAS,0BACP,UACA,WACA,UACU;CACV,MAAM,OAAO,YAA6B,UAAU,SAAS,QAAQ;CACrE,IAAI,WAAW,CAAC,GAAG,SAAS;AAE5B,KAAI,CAAC,IAAI,OAAO,CACd,YAAW,SAAS,QAAQ,MAAM,CAAC,EAAE,WAAW,QAAQ,IAAI,MAAM,UAAU;AAE9E,KAAI,CAAC,IAAI,KAAK,CACZ,YAAW,SAAS,QAAQ,MAAM,CAAC,EAAE,WAAW,MAAM,IAAI,MAAM,QAAQ;AAE1E,KAAI,CAAC,IAAI,MAAM,CACb,YAAW,SAAS,QAAQ,MAAM,CAAC,EAAE,WAAW,OAAO,IAAI,MAAM,SAAS;AAE5E,KAAI,CAAC,IAAI,UAAU,CACjB,YAAW,SAAS,QAAQ,MAAM,CAAC,EAAE,WAAW,WAAW,IAAI,MAAM,aAAa;AAGpF,QAAO;;AAGT,eAAsB,kBACpB,WACA,aACA,UACA,SAKiB;AACjB,KAAI,SAAS,WAAW,EACtB,QAAO;CAGT,MAAM,OAAO,YAA6B,QAAQ,UAAU,SAAS,QAAQ;CAE7E,MAAM,oBAAoB,0BAA0B,UAAU,QAAQ,WAAW,QAAQ,QAAQ;AAEjG,KAAI,IAAI,OAAO,IAAI,CAAC,kBAAkB,MAAM,MAAM,EAAE,WAAW,QAAQ,IAAI,MAAM,UAAU,CACzF,mBAAkB,KAAK,UAAU;CAGnC,MAAM,wBAAkC,EAAE;AAC1C,KAAI,QAAQ,cACV;OAAK,MAAM,CAAC,WAAW,kBAAkB,OAAO,QAAQ,QAAQ,aAAa,CAC3E,KAAI,EAAE,QAAQ,SAAS,SAAS,UAAU,IAAI,MAC5C,uBAAsB,KAAK,GAAG,cAAc;;CAKlD,MAAM,2BAAW,IAAI,KAAa;AAClC,MAAK,MAAM,WAAW,mBAAmB;EACvC,MAAM,UAAU,MAAM,KAAK,SAAS;GAClC,KAAK;GACL,OAAO;GACP,KAAK;GACL,UAAU;GACX,CAAC;AACF,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,cAAc,MAAM,MAAM,oBAAoB;AACpD,OAAI,aAAa;IACf,MAAM,aAAa,YAAY;AAC/B,QAAI,EAAE,QAAQ,SAAS,SAAS,WAAW,IAAI,MAAO;;AAExD,OAAI,eAAe,OAAO,sBAAsB,CAAE;AAClD,YAAS,IAAI,MAAM;;;CAIvB,MAAM,6BAAa,IAAI,KAAa;AACpC,KAAI,QAAQ,aACV,MAAK,MAAM,CAAC,WAAW,kBAAkB,OAAO,QAAQ,QAAQ,aAAa,EAAE;AAC7E,MAAI,EAAE,QAAQ,SAAS,SAAS,UAAU,IAAI,MAAO;AACrD,OAAK,MAAM,MAAM,eAAe;GAC9B,MAAM,UAAU,MAAM,KAAK,IAAI;IAC7B,KAAK;IACL,OAAO;IACP,KAAK;IACL,UAAU;IACX,CAAC;AACF,QAAK,MAAM,SAAS,QAClB,KAAI,CAAC,eAAe,OAAO,sBAAsB,CAC/C,YAAW,IAAI,MAAM;;;AAO/B,MAAK,MAAM,KAAK,WAAY,UAAS,IAAI,EAAE;AAE3C,WAAU,aAAa,EAAE,WAAW,MAAM,CAAC;CAE3C,IAAI,QAAQ;AACZ,MAAK,MAAM,YAAY,UAAU;EAC/B,MAAM,MAAM,KAAK,WAAW,SAAS;AAErC,MAAI,CADS,UAAU,IAAI,CACjB,QAAQ,CAAE;EAKpB,MAAM,OAAO,KAAK,aAHD,SAAS,WAAW,qBAAqB,GACtD,SAAS,QAAQ,0BAA0B,WAAW,GACtD,SACoC;AACxC,YAAU,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAE7C,gBAAc,MADE,aAAa,IAAI,CACL;AAC5B;;AAGF,QAAO;;AAGT,SAAS,sBAAsB,OAAsC;AACnE,QAAO,MAAM;AACb,QAAO,MAAM;AACb,QAAO,MAAM;AACb,QAAO,MAAM;;AAGf,eAAsB,kBACpB,aACA,MAYe;CACf,MAAM,SAAS,KAAK,SAAS;CAC7B,MAAM,OAAO,YAA6B,KAAK,UAAU,SAAS,QAAQ;CAE1E,MAAM,aAAa,KAAK,aAAa,kBAAkB;AACvD,KAAI,WAAW,WAAW,EAAE;EAC1B,MAAM,SAAS,KAAK,MAAM,aAAa,YAAY,QAAQ,CAAC;AAE5D,SAAO,UAAU,SAAS,KAAK,eAAe,GAAG,KAAK;AAEtD,MAAI,KAAK,QACP,QAAO,UAAU,KAAK;AAExB,MAAI,KAAK,OACP,QAAO,SAAS,KAAK;AAEvB,MAAI,KAAK,WACP,QAAO,aAAa,KAAK;AAG3B,MAAI,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,UAAU;GAC1D,MAAM,MAAM,OAAO;AAEnB,QAAK,MAAM,YAAY,OAAO,KAAK,IAAI,EAAE;AACvC,QACE,CAAC,IAAI,SAA4B,KAChC,aAAa,UAAU,aAAa,QAAQ,aAAa,SAAS,aAAa,SAChF;AACA,YAAO,IAAI;AACX;;IAEF,MAAM,QAAQ,IAAI;AAClB,QAAI,SAAS,OAAO,UAAU,SAC5B,uBAAsB,MAAiC;;;AAK7D,MAAI,IAAI,UAAU,EAChB;OAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAAU;IACxD,MAAM,UAAU,OAAO;AAEvB,QAAI,KAAK,YAAY,QACnB;UAAK,MAAM,aAAa,OAAO,KAAK,QAAQ,CAC1C,KAAI,CAAC,KAAK,QAAQ,SAAS,UAAU,CACnC,QAAO,QAAQ;;AAKrB,SAAK,MAAM,aAAa,OAAO,KAAK,QAAQ,EAAE;KAC5C,MAAM,SAAS,QAAQ;KACvB,IAAI;AAEJ,SAAI,OAAO,WAAW,UAAU;AAC9B,kBAAY,EAAE,SAAS,QAAQ;AAC/B,cAAQ,aAAa;gBACZ,UAAU,OAAO,WAAW,SACrC,aAAY,EAAE,GAAI,QAAoC;SAEtD;AAGF,2BAAsB,UAAU;;AAGlC,QAAI,OAAO,KAAK,QAAQ,CAAC,WAAW,EAClC,QAAO,UAAU,EAAE;;QAIvB,QAAO,OAAO;AAGhB,QAAM,cAAc,aAAa,OAAO;;CAG1C,MAAM,UAAU,KAAK,aAAa,eAAe;AACjD,KAAI,WAAW,QAAQ,EAAE;EACvB,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC;AAEtD,MAAI,IAAI,cAAc,OAAO,IAAI,eAAe,UAAU;GACxD,MAAM,KAAK,IAAI;AACf,OAAI,MAAM,QAAQ,GAAG,SAAS,CAC5B,IAAG,WAAW,GAAG,SAAS,QAAQ,MAAc;AAC9C,QAAI,EAAE,WAAW,YAAY,CAAE,QAAO;AACtC,QAAI,MAAM,OAAQ,QAAO,IAAI,OAAO;AACpC,QAAI,MAAM,YAAa,QAAO,IAAI,UAAU,KAAK,KAAK,SAAS,UAAU,KAAK;IAC9E,MAAM,cAAc,EAAE,MAAM,oBAAoB;AAChD,QAAI,YACF,QAAO,IAAI,UAAU,KAAK,KAAK,SAAS,SAAS,YAAY,GAAG,IAAI;AACtE,WAAO;KACP;;AAIN,MAAI,IAAI,WAAW,OAAO,IAAI,YAAY,UAAU;GAClD,MAAM,UAAU,IAAI;GACpB,MAAM,WAAW,KAAa,MAAc,OAAe;AACzD,QAAI,QAAQ,MAAM,SAAS,KAAK,CAC9B,SAAQ,OAAO,QAAQ,KAAK,WAAW,MAAM,GAAG;;AAGpD,WAAQ,OAAO,sCAAsC,wBAAwB;AAC7E,WAAQ,UAAU,sCAAsC,wBAAwB;AAChF,WAAQ,WAAW,sCAAsC,wBAAwB;AACjF,WAAQ,aAAa,sCAAsC,wBAAwB;AACnF,WAAQ,SAAS,sCAAsC,wBAAwB;AAC/E,WAAQ,UAAU,sCAAsC,wBAAwB;AAChF,WAAQ,WAAW,sCAAsC,wBAAwB;AACjF,WAAQ,SAAS,sCAAsC,wBAAwB;AAE/E,WAAQ,cAAc;AACtB,WAAQ,eAAe;AACvB,OAAI,QAAQ,WAAW;AACrB,YAAQ,YAAY,QAAQ,UACzB,QAAQ,yBAAyB,GAAG,CACpC,QAAQ,wDAAwD,GAAG;AACtE,QAAI,CAAC,IAAI,OAAO,CACd,SAAQ,YAAY,QAAQ,UAAU,QAAQ,uCAAuC,GAAG;;;AAK9F,MAAI,IAAI,mBAAmB,OAAO,IAAI,oBAAoB,UAAU;GAClE,MAAM,OAAO,IAAI;AACjB,UAAO,KAAK;AACZ,UAAO,KAAK;;AAGd,MAAI,CAAC,IAAI,cAAc,OAAO,IAAI,eAAe,SAC/C,KAAI,aAAa;GAAE,UAAU,EAAE;GAAE,SAAS,EAAE;GAAE;EAEhD,MAAM,aAAa,IAAI;AACvB,MAAI,CAAC,WAAW,WAAW,OAAO,WAAW,YAAY,SACvD,YAAW,UAAU,EAAE;AAGzB,MAAI,CAAC,IAAI,aAAc,KAAI,eAAe,EAAE;EAC5C,MAAM,OAAO,IAAI;EACjB,MAAM,OAAO,KAAK,eAAe,YAC7B,8BAA8B,KAAK,cAAc,UAAU,GAC3D;AACJ,MAAI,MAAM;AACR,cAAW,QAAQ,oBAAoB,KAAK,YAAY;AACxD,cAAW,QAAQ,kBAAkB,KAAK,YAAY;;AAExD,MAAI,CAAC,KAAK,qBAAqB,KAAM,MAAK,oBAAoB;AAC9D,MAAI,CAAC,KAAK,mBAAmB,KAAM,MAAK,kBAAkB;AAE1D,gBAAc,SAAS,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,CAAC,IAAI;;CAG7D,MAAM,kBAAkB,KAAK,aAAa,OAAO,gBAAgB;AACjE,KAAI,WAAW,gBAAgB,EAAE;EAC/B,MAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,QAAQ,CAAC;AAItE,MAAI,YAAY,OAAO;GACrB,MAAM,aAAa,YAAY,MAAM,QAAQ,MAAM,WAAW,KAAK,aAAa,OAAO,EAAE,CAAC,CAAC;AAC3F,OAAI,WAAW,WAAW,YAAY,MAAM,QAAQ;AAClD,QAAI,WAAW,WAAW,EACxB,QAAO,YAAY;QAEnB,aAAY,QAAQ;AAEtB,kBAAc,iBAAiB,GAAG,KAAK,UAAU,aAAa,MAAM,EAAE,CAAC,IAAI;;;;AAKjF,OAAM,qBAAqB,aAAa,KAAK,cAAc;AAE3D,KAAI,IAAI,KAAK,EAAE;EACb,MAAM,kBAAkB,KAAK,aAAa,MAAM,OAAO,OAAO,mBAAmB;AACjF,MAAI,CAAC,WAAW,gBAAgB,EAAE;AAChC,aAAU,QAAQ,gBAAgB,EAAE,EAAE,WAAW,MAAM,CAAC;AACxD,iBAAc,iBAAiB,qDAAqD;;;AAIxF,KAAI,IAAI,MAAM,EAAE;EACd,MAAM,uBAAuB,KAAK,aAAa,OAAO,OAAO,OAAO,uBAAuB;AAC3F,MAAI,CAAC,WAAW,qBAAqB,EAAE;AACrC,aAAU,QAAQ,qBAAqB,EAAE,EAAE,WAAW,MAAM,CAAC;AAC7D,iBACE,sBACA,0PACD;;;CAIL,MAAM,mBAAmB,2BAA2B;CACpD,MAAM,iBAA2B,EAAE;AACnC,KAAI,IAAI,KAAK,CACX,gBAAe,KAAK,KAAK,aAAa,MAAM,OAAO,OAAO,oBAAoB,CAAC;AAEjF,KAAI,IAAI,MAAM,CACZ,gBAAe,KAAK,KAAK,aAAa,OAAO,OAAO,OAAO,oBAAoB,CAAC;AAElF,KAAI,IAAI,OAAO,IAAI,WAAW,KAAK,aAAa,QAAQ,MAAM,CAAC,CAC7D,gBAAe,KAAK,KAAK,aAAa,QAAQ,OAAO,OAAO,oBAAoB,CAAC;AAEnF,MAAK,MAAM,oBAAoB,eAC7B,KAAI,CAAC,WAAW,iBAAiB,EAAE;AACjC,YAAU,QAAQ,iBAAiB,EAAE,EAAE,WAAW,MAAM,CAAC;AACzD,gBAAc,kBAAkB,iBAAiB;;;AAKvD,SAAS,4BAAoC;AAC3C,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,eAAsB,cAAc,aAAoC;AACtE,OAAM,YAAY,OAAO,CAAC,WAAW,mBAAmB,EAAE,aAAa,EAAE,OAAO,WAAW,CAAC;;AAG9F,eAAsB,YAAY,aAAoC;AACpE,OAAM,YAAY,yBAAyB,CAAC,SAAS,MAAM,EAAE,aAAa,EAAE,OAAO,WAAW,CAAC;;AAGjG,eAAsB,mBAAmB,aAAoC;AAC3E,OAAM,YAAY,UAAU;EAAC;EAAW;EAAM;EAAM;EAAS,EAAE,aAAa,EAAE,OAAO,WAAW,CAAC;;AAGnG,MAAM,wBAAgD;CACpD,kBAAkB;CAClB,gBAAgB;CACjB;AAED,SAAS,0BAAkD;CACzD,MAAM,UAAkC,EAAE;AAC1C,MAAK,MAAM,eAAe,mBACxB,KAAI;EACF,MAAM,WAAW,QAAQ,QAAQ,GAAG,YAAY,eAAe;EAC/D,MAAM,MAAM,KAAK,MAAM,aAAa,UAAU,QAAQ,CAAC;AACvD,MAAI,IAAI,QACN,SAAQ,eAAe,IAAI,IAAI;SAE3B;AAEV,QAAO;;AAGT,eAAsB,uBACpB,aACA,cACA,MASiB;AACjB,WAAU,aAAa,EAAE,WAAW,MAAM,CAAC;CAE3C,MAAM,OAAO,YAA6B,KAAK,UAAU,SAAS,QAAQ;CAE1E,MAAM,SAAkC;EACtC,SAAS,SAAS,KAAK,eAAe,GAAG,KAAK;EAC9C,SAAS,KAAK,WAAW,KAAK;EAC9B,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE;EAC9C,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,YAAY,GAAG,EAAE;EAC3D;AAED,KAAI,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;EAC5D,MAAM,MAA+B,EAAE;EACvC,MAAM,YAAY,aAAa;AAE/B,MAAI,IAAI,OAAO,IAAI,UAAU,MAAM;AACjC,OAAI,OAAO,EAAE,GAAG,UAAU,MAAM;AAChC,yBAAsB,IAAI,KAAgC;;AAG5D,MAAI,IAAI,KAAK,IAAI,UAAU,IAAI;AAC7B,OAAI,KAAK,EAAE,GAAG,UAAU,IAAI;AAC5B,yBAAsB,IAAI,GAA8B;;AAG1D,MAAI,IAAI,MAAM,IAAI,UAAU,KAAK;AAC/B,OAAI,MAAM,EAAE,GAAG,UAAU,KAAK;AAC9B,yBAAsB,IAAI,IAA+B;;AAG3D,MAAI,IAAI,UAAU,IAAI,UAAU,MAAM;AACpC,OAAI,OAAO,EAAE,GAAG,UAAU,MAAM;AAChC,yBAAsB,IAAI,KAAgC;;AAG5D,MAAI,OAAO,KAAK,IAAI,CAAC,SAAS,EAC5B,QAAO,MAAM;;AAIjB,KAAI,IAAI,UAAU,IAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,KAAK,aAAa,SAAS;EACrF,MAAM,UAAmC,EAAE;AAC3C,OAAK,MAAM,OAAO,KAAK,SAAS;GAC9B,MAAM,eAAgB,aAAa,UAAsC;AACzE,OAAI,aACF,KAAI,OAAO,iBAAiB,SAC1B,SAAQ,OAAO,EAAE,SAAS,cAAc;QACnC;IACL,MAAM,aAAa,EAAE,GAAI,cAA0C;AACnE,0BAAsB,WAAW;AACjC,YAAQ,OAAO;;;AAIrB,SAAO,UAAU;;AAGnB,OAAM,cAAc,aAAa,OAAO;CAExC,MAAM,oBAA8B,EAAE;AACtC,MAAK,MAAM,WAAW,KAAK,UACzB,mBAAkB,KAAK,GAAG,uBAAuB,SAAS;AAE5D,KAAI,IAAI,UAAU,IAAI,KAAK,QACzB,MAAK,MAAM,UAAU,KAAK,QACxB,mBAAkB,KAAK,WAAW,SAAS;CAI/C,MAAM,UAAU,yBAAyB;CAEzC,MAAM,MAA+B;EACnC,MAAM,KAAK,UAAU,KAAK;EAC1B,SAAS;EACT,MAAM;EACN,SAAS;GACP,KAAK;GACL,UAAU;GACV,WAAW;GACX,OAAO;GACP,QAAQ;GACR,SAAS;GACT,OAAO;GACP,WAAW;GACX,aAAa;GACb,aAAa;GACd;EACD,cAAc;GACZ,kBAAkB;GAClB,gBAAgB;GACjB;EACD,iBAAiB,EAAE;EACnB,YAAY;GACV,UAAU;GACV;GACD;EACF;AACD,eAAc,KAAK,aAAa,eAAe,EAAE,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,CAAC,IAAI;CAErF,MAAM,aAAa,mBAAmB,cAAc,KAAK,UAAU;AACnE,KAAI,WACF,eAAc,KAAK,aAAa,eAAe,EAAE,WAAW;AAG9D,eAAc,KAAK,aAAa,aAAa,EAAE,mBAAmB,CAAC;AAEnE,QAAO;;AAGT,eAAe,qBACb,aACA,SACe;AACf,OAAM,gCAAgC;EACpC,eAAe,SAAS,aAAa;EACrC,WAAW;EACX,oBAAoB;EACpB,qBAAqB;EACrB,qBAAqB,CAAC,OAAO;EAC9B,CAAC;AAEF,KAAI,SAAS,kBAAkB,QAAQ,WAAW;EAChD,MAAM,cAAc,KAAK,aAAa,eAAe;AACrD,MAAI,WAAW,YAAY,EAAE;GAC3B,MAAM,MAAM,KAAK,MAAM,aAAa,aAAa,QAAQ,CAAC;AAC1D,OAAI,CAAC,IAAI,UAAW,KAAI,YAAY,EAAE;GACtC,MAAM,YAAY,IAAI;GAEtB,MAAM,kBAAmB,IAAI,YAAyC,YAAY,EAAE,EAAE,OACpF,QACD;AAED,QAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,sBAAsB,CACjE,KAAI,CAAC,eAAe,MAAM,OAAO,OAAO,WAAW,OAAO,WAAW,OAAO,EAE1E;QAAI,WADe,KAAK,QAAQ,WAAW,SAAS,eAAe,CACzC,EAAE;AAC1B,eAAU,QAAQ,QAAQ;AAC1B,oBAAe,KAAK,QAAQ;;;AAKlC,OAAI,eAAe,SAAS,GAAG;AAC7B,QAAI,CAAC,IAAI,WAAY,KAAI,aAAa,EAAE;AACxC,IAAC,IAAI,WAAwC,WAAW;;AAG1D,iBAAc,aAAa,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,CAAC,IAAI;;;;AAKrE,eAAsB,kBACpB,aACA,gBACA,gBACA,WACA,UACA,SAKe;CACf,MAAM,oBAAoB,0BAA0B,UAAU,QAAQ,WAAW,QAAQ,QAAQ;CAEjG,MAAM,OAAO,YAA6B,QAAQ,UAAU,SAAS,QAAQ;AAC7E,KAAI,IAAI,OAAO,IAAI,CAAC,kBAAkB,MAAM,MAAM,EAAE,WAAW,QAAQ,IAAI,MAAM,UAAU,CACzF,mBAAkB,KAAK,UAAU;CAGnC,MAAM,wBAAkC,EAAE;AAC1C,KAAI,QAAQ,cACV;OAAK,MAAM,CAAC,WAAW,kBAAkB,OAAO,QAAQ,QAAQ,aAAa,CAC3E,KAAI,EAAE,QAAQ,SAAS,SAAS,UAAU,IAAI,MAC5C,uBAAsB,KAAK,GAAG,cAAc;;CAKlD,MAAM,2BAAW,IAAI,KAAa;AAClC,MAAK,MAAM,WAAW,mBAAmB;EACvC,MAAM,UAAU,MAAM,KAAK,SAAS;GAClC,KAAK;GACL,OAAO;GACP,KAAK;GACL,UAAU;GACX,CAAC;AACF,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,cAAc,MAAM,MAAM,oBAAoB;AACpD,OAAI,eAAe,EAAE,QAAQ,SAAS,SAAS,YAAY,GAAG,IAAI,MAAO;AACzE,OAAI,eAAe,OAAO,sBAAsB,CAAE;AAClD,YAAS,IAAI,MAAM;;;AAIvB,KAAI,QAAQ,aACV,MAAK,MAAM,CAAC,WAAW,kBAAkB,OAAO,QAAQ,QAAQ,aAAa,EAAE;AAC7E,MAAI,EAAE,QAAQ,SAAS,SAAS,UAAU,IAAI,MAAO;AACrD,OAAK,MAAM,MAAM,eAAe;GAC9B,MAAM,UAAU,MAAM,KAAK,IAAI;IAC7B,KAAK;IACL,OAAO;IACP,KAAK;IACL,UAAU;IACX,CAAC;AACF,QAAK,MAAM,SAAS,QAClB,KAAI,CAAC,eAAe,OAAO,sBAAsB,CAC/C,UAAS,IAAI,MAAM;;;CAO7B,MAAM,aAAqC,EAAE;AAC7C,MAAK,MAAM,YAAY,UAAU;EAC/B,MAAM,MAAM,KAAK,WAAW,SAAS;AAErC,MAAI,CADS,UAAU,IAAI,CACjB,QAAQ,CAAE;EACpB,MAAM,UAAU,aAAa,IAAI;EACjC,MAAM,WAAW,SAAS,WAAW,qBAAqB,GACtD,SAAS,QAAQ,0BAA0B,WAAW,GACtD;AACJ,aAAW,YAAY,YAAY,QAAQ;;AAG7C,OAAM,cAAc,aAAa;EAC/B,WAAW,SAAS,eAAe,GAAG;EACtC,OAAO;EACR,CAAC;;AAGJ,SAAS,YAAY,MAA0B;AAC7C,QAAO,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM,CAAC,UAAU,GAAG,GAAG;;AAGzE,SAAS,SAAS,QAAwB;AACxC,QAAO,YAAY,KAAK,QAAQ,EAAE,GAAG,OAAO,GAAG,CAAC;;AAGlD,eAAsB,2BAA2B,aAAoC;CACnF,MAAM,iBAAiB,MAAM,KAAK,wBAAwB;EACxD,KAAK;EACL,OAAO;EACP,KAAK;EACL,UAAU;EACV,QAAQ,CAAC,qBAAqB;EAC/B,CAAC;AAEF,MAAK,MAAM,cAAc,gBAAgB;EACvC,MAAM,eAAe,QAAQ,WAAW;EACxC,MAAM,UAAU,KAAK,aAAa,cAAc,eAAe;AAC/D,MAAI,CAAC,WAAW,QAAQ,CAAE;AAI1B,MAAI,CAFQ,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC,CAClC,UACL,eAAgB;AAG/B,QAAM,YAAY,OAAO,CAAC,OAAO,cAAc,EADnC,KAAK,aAAa,aAAa,CACU;;;AAIzD,MAAM,mBAA2C;CAC/C,KAAK,IAAI;CACT,QAAQ,IAAI;CACZ,cAAc,IAAI;CAClB,KAAK;CACN;AAED,eAAsB,YACpB,SACA,MACA,KACA,SACe;CACf,MAAM,UAAU,iBAAiB,YAAY,IAAI;AACjD,OAAM,MAAM,SAAS,MAAM;EAAE;EAAK,OAAO,SAAS,SAAS;EAAQ;EAAS,CAAC;;AAG/E,SAAS,mBAAmB,QAAwB,WAAsC;CACxF,MAAM,OAAO,YAA6B,UAAU,SAAS,QAAQ;CAErE,MAAM,QAAkB,CAAC,0BAA0B;CACnD,MAAM,kBACJ,KACA,gBACA,SAAS,OACA;AACT,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,EAAE;AAC9C,OAAI,CAAC,eAAgB;AACrB,OAAI,QAAQ,aAAa,MAAM,QAAQ,MAAM,EAC3C;SAAK,MAAM,UAAU,MACnB,KAAI,OAAO,WAAW,SACpB,OAAM,KAAK,GAAG,OAAO,GAAG;cAGnB,QAAQ,eAAe,cAAc,MAAM,EACpD;SAAK,MAAM,CAAC,QAAQ,WAAW,OAAO,QAAQ,MAAiC,CAC7E,KAAI,OAAO,WAAW,SACpB,OAAM,KAAK,GAAG,OAAO,GAAG,SAAS;cAG5B,cAAc,MAAM,IAAI,QAAQ,UACzC,gBAAe,OAAkC,gBAAgB,GAAG,SAAS,IAAI,GAAG;;;AAK1F,KAAI,OAAO,OAAO,OAAO,OAAO,QAAQ,UAAU;EAChD,MAAM,MAAM,OAAO;AACnB,iBAAe,KAAK,IAAI,OAAO,EAAE,QAAQ;AACzC,iBAAe,KAAK,IAAI,KAAK,EAAE,MAAM;AACrC,iBAAe,KAAK,IAAI,MAAM,EAAE,OAAO;AACvC,iBAAe,KAAK,IAAI,UAAU,EAAE,QAAQ;;AAE9C,KAAI,IAAI,UAAU,IAAI,OAAO,WAAW,OAAO,OAAO,YAAY,UAChE;OAAK,MAAM,CAAC,WAAW,cAAc,OAAO,QAC1C,OAAO,QACR,CACC,KAAI,cAAc,UAAU,CAC1B,gBAAe,WAAsC,KAAK;WACjD,OAAO,cAAc,SAC9B,OAAM,KAAK,aAAa,UAAU,YAAY,YAAY;;AAKhE,OAAM,KAAK,4CAA4C;AACvD,QAAO,GAAG,MAAM,KAAK,KAAK,CAAC;;AAG7B,SAAS,cAAc,OAAkD;AACvE,QAAO,QAAQ,MAAM,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,oBAA4B;AACnC,QAAO"}
1
+ {"version":3,"file":"init.mjs","names":[],"sources":["../../src/cli/init.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n createWriteStream,\n existsSync,\n lstatSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport { execa } from \"execa\";\nimport { glob } from \"glob\";\nimport type { OverrideSection } from \"../contract\";\nimport { fetchBosConfigFromFastKv } from \"../fastkv\";\nimport {\n loadManifestNormalizationSpec,\n normalizePackageManifestsInTree,\n} from \"../internal/manifest-normalizer\";\nimport type { BosConfig, BosConfigInput } from \"../types\";\nimport { isPathExcluded } from \"../utils/path-match\";\nimport { saveBosConfig } from \"../utils/save-config\";\nimport { writeSnapshot } from \"./snapshot\";\n\nconst require = createRequire(import.meta.url);\n\nconst FRAMEWORK_PACKAGES = [\"every-plugin\", \"everything-dev\"] as const;\n\nconst _DEFAULT_OVERRIDES: OverrideSection[] = [\"ui\", \"api\"];\n\nconst OVERRIDE_WORKSPACE_MAP: Record<OverrideSection, string[]> = {\n ui: [\"ui\"],\n api: [\"api\"],\n host: [\"host\"],\n plugins: [],\n};\n\ninterface SourceResult {\n sourceDir: string;\n parentConfig: BosConfig;\n cleanup: () => Promise<void>;\n}\n\nexport async function resolveSourceDir(opts: {\n extendsAccount: string;\n extendsGateway: string;\n source?: string;\n}): Promise<SourceResult> {\n if (opts.source) {\n const sourceDir = resolve(opts.source);\n if (!existsSync(join(sourceDir, \"bos.config.json\"))) {\n throw new Error(`No bos.config.json found in source directory: ${sourceDir}`);\n }\n const parentConfig = JSON.parse(\n readFileSync(join(sourceDir, \"bos.config.json\"), \"utf-8\"),\n ) as BosConfig;\n return { sourceDir, parentConfig, cleanup: async () => {} };\n }\n\n const parentConfig = await fetchParentConfig(opts.extendsAccount, opts.extendsGateway);\n\n if (parentConfig.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(parentConfig.repository);\n return { sourceDir, parentConfig, cleanup };\n }\n\n const chainResult = await resolveRepositoryViaExtendsChain(\n opts.extendsAccount,\n opts.extendsGateway,\n );\n if (chainResult?.repository) {\n const { dir: sourceDir, cleanup } = await downloadTarball(chainResult.repository);\n return { sourceDir, parentConfig: chainResult.config, cleanup };\n }\n\n return {\n sourceDir: \"\",\n parentConfig,\n cleanup: async () => {},\n };\n}\n\nexport async function readTemplatekeep(sourceDir: string): Promise<string[]> {\n const keepFile = join(sourceDir, \".templatekeep\");\n if (!existsSync(keepFile)) {\n return [];\n }\n\n const content = readFileSync(keepFile, \"utf-8\");\n const patterns = content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith(\"#\"));\n\n if (!patterns.includes(\".templatekeep\")) {\n patterns.unshift(\".templatekeep\");\n }\n\n return patterns;\n}\n\nexport async function fetchParentConfig(\n extendsAccount: string,\n extendsGateway: string,\n): Promise<BosConfig> {\n const bosUrl = `bos://${extendsAccount}/${extendsGateway}`;\n return fetchBosConfigFromFastKv<BosConfig>(bosUrl);\n}\n\nexport async function resolveRepositoryViaExtendsChain(\n extendsAccount: string,\n extendsGateway: string,\n visited = new Set<string>(),\n): Promise<{ repository: string; config: BosConfig } | null> {\n const key = `bos://${extendsAccount}/${extendsGateway}`;\n if (visited.has(key)) return null;\n visited.add(key);\n\n try {\n const config = await fetchParentConfig(extendsAccount, extendsGateway);\n if (config.repository) {\n return { repository: config.repository, config };\n }\n\n const extendsRef = config.extends;\n if (extendsRef && typeof extendsRef === \"string\") {\n const normalized = extendsRef.startsWith(\"bos://\") ? extendsRef : `bos://${extendsRef}`;\n const match = normalized.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (match) {\n const result = await resolveRepositoryViaExtendsChain(match[1], match[2], visited);\n if (result) return result;\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function detectGitRemoteUrl(directory: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: directory,\n stdio: \"pipe\",\n });\n const url = stdout.trim();\n if (!url) return undefined;\n return normalizeGitUrl(url);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeGitUrl(url: string): string | undefined {\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return `https://github.com/${sshMatch[1]}/${sshMatch[2]}`;\n }\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return `https://github.com/${httpsMatch[1]}/${httpsMatch[2]}`;\n }\n return url.endsWith(\".git\") ? url.slice(0, -4) : url;\n}\n\nexport async function downloadTarball(\n repoUrl: string,\n): Promise<{ dir: string; cleanup: () => Promise<void> }> {\n const parsed = parseGitHubUrl(repoUrl);\n if (!parsed) {\n throw new Error(`Cannot parse repository URL: ${repoUrl}`);\n }\n\n const { owner, repo, branch } = parsed;\n const tarballUrl = `https://api.github.com/repos/${owner}/${repo}/tarball/${branch}`;\n\n const tmpDir = mkTmpDir(\"bos-init-tarball-\");\n const tarballPath = join(tmpDir, \"source.tar.gz\");\n\n const response = await fetch(tarballUrl, {\n headers: { \"User-Agent\": \"everything-dev\" },\n redirect: \"follow\",\n });\n\n if (!response.ok) {\n rmSync(tmpDir, { recursive: true, force: true });\n throw new Error(`GitHub tarball download failed: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n rmSync(tmpDir, { recursive: true, force: true });\n throw new Error(\"GitHub tarball download returned empty body\");\n }\n\n const fileStream = createWriteStream(tarballPath);\n const reader = response.body as unknown as NodeJS.ReadableStream;\n await pipeline(reader, fileStream);\n\n const extractDir = mkTmpDir(\"bos-init-extract-\");\n try {\n const tar = require(\"tar\") as {\n extract: (opts: { cwd: string; file: string; strip: number }) => Promise<void>;\n };\n await tar.extract({ cwd: extractDir, file: tarballPath, strip: 1 });\n } catch {\n await execCommand(\"tar\", [\"-xzf\", tarballPath, \"--strip-components=1\", \"-C\", extractDir]);\n }\n\n rmSync(tmpDir, { recursive: true, force: true });\n\n return {\n dir: extractDir,\n cleanup: async () => {\n rmSync(extractDir, { recursive: true, force: true });\n },\n };\n}\n\nfunction parseGitHubUrl(url: string): { owner: string; repo: string; branch: string } | null {\n const httpsMatch = url.match(/^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/);\n if (httpsMatch) {\n return { owner: httpsMatch[1], repo: httpsMatch[2], branch: \"main\" };\n }\n\n const sshMatch = url.match(/^git@github\\.com:([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2], branch: \"main\" };\n }\n\n return null;\n}\n\nfunction filterPatternsByOverrides(\n patterns: string[],\n overrides: OverrideSection[],\n _plugins?: string[],\n): string[] {\n const has = (section: OverrideSection) => overrides.includes(section);\n let filtered = [...patterns];\n\n if (!has(\"host\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"host/\") && p !== \"host/**\");\n }\n if (!has(\"ui\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"ui/\") && p !== \"ui/**\");\n }\n if (!has(\"api\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"api/\") && p !== \"api/**\");\n }\n if (!has(\"plugins\")) {\n filtered = filtered.filter((p) => !p.startsWith(\"plugins/\") && p !== \"plugins/**\");\n }\n\n return filtered;\n}\n\nexport async function copyFilteredFiles(\n sourceDir: string,\n destination: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n pluginRoutes?: Record<string, string[]>;\n },\n): Promise<number> {\n if (patterns.length === 0) {\n return 0;\n }\n\n const has = (section: OverrideSection) => options.overrides.includes(section);\n\n const effectivePatterns = filterPatternsByOverrides(patterns, options.overrides, options.plugins);\n\n if (has(\"host\") && !effectivePatterns.some((p) => p.startsWith(\"host/\") || p === \"host/**\")) {\n effectivePatterns.push(\"host/**\");\n }\n\n const excludedRoutePatterns: string[] = [];\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) {\n excludedRoutePatterns.push(...routePatterns);\n }\n }\n }\n\n const allFiles = new Set<string>();\n for (const pattern of effectivePatterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n const pluginMatch = match.match(/^plugins\\/([^/]+)/);\n if (pluginMatch) {\n const pluginName = pluginMatch[1];\n if (!(options.plugins?.includes(pluginName) ?? true)) continue;\n }\n if (isPathExcluded(match, excludedRoutePatterns)) continue;\n allFiles.add(match);\n }\n }\n\n const routeFiles = new Set<string>();\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) continue;\n for (const rp of routePatterns) {\n const matches = await glob(rp, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n if (!isPathExcluded(match, excludedRoutePatterns)) {\n routeFiles.add(match);\n }\n }\n }\n }\n }\n\n for (const f of routeFiles) allFiles.add(f);\n\n mkdirSync(destination, { recursive: true });\n\n let count = 0;\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n\n const destPath = filePath.startsWith(\".github/templates/\")\n ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n : filePath;\n const dest = join(destination, destPath);\n mkdirSync(dirname(dest), { recursive: true });\n const content = readFileSync(src);\n writeFileSync(dest, content);\n count++;\n }\n\n return count;\n}\n\nfunction stripProductionFields(entry: Record<string, unknown>): void {\n delete entry.production;\n delete entry.integrity;\n delete entry.ssr;\n delete entry.ssrIntegrity;\n}\n\nexport async function personalizeConfig(\n destination: string,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n pluginRoutes?: Record<string, string[]>;\n workspaceOpts?: { localOverrides?: boolean; sourceDir?: string };\n mode?: \"init\" | \"sync\";\n repository?: string;\n title?: string;\n description?: string;\n testnet?: string;\n staging?: unknown;\n },\n): Promise<void> {\n const isInit = opts.mode !== \"sync\";\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n\n const configPath = join(destination, \"bos.config.json\");\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>;\n\n config.extends = `bos://${opts.extendsAccount}/${opts.extendsGateway}`;\n\n if (opts.account) {\n config.account = opts.account;\n }\n if (opts.domain) {\n config.domain = opts.domain;\n }\n if (opts.repository) {\n config.repository = opts.repository;\n } else if (isInit) {\n delete config.repository;\n }\n\n if (isInit) {\n const inheritableFields = [\"title\", \"description\", \"testnet\", \"staging\"] as const;\n for (const field of inheritableFields) {\n if (!(field in opts)) {\n delete config[field];\n }\n }\n }\n\n if (isInit && config.app && typeof config.app === \"object\") {\n const app = config.app as Record<string, unknown>;\n\n for (const entryKey of Object.keys(app)) {\n if (\n !has(entryKey as OverrideSection) &&\n (entryKey === \"host\" || entryKey === \"ui\" || entryKey === \"api\" || entryKey === \"auth\")\n ) {\n delete app[entryKey];\n continue;\n }\n const entry = app[entryKey];\n if (entry && typeof entry === \"object\") {\n stripProductionFields(entry as Record<string, unknown>);\n }\n }\n }\n\n if (has(\"plugins\")) {\n if (config.plugins && typeof config.plugins === \"object\") {\n const plugins = config.plugins as Record<string, unknown>;\n\n if (opts.plugins !== undefined) {\n for (const pluginKey of Object.keys(plugins)) {\n if (!opts.plugins.includes(pluginKey)) {\n delete plugins[pluginKey];\n }\n }\n }\n\n for (const pluginKey of Object.keys(plugins)) {\n const plugin = plugins[pluginKey];\n let pluginObj: Record<string, unknown>;\n\n if (typeof plugin === \"string\") {\n pluginObj = { extends: plugin };\n plugins[pluginKey] = pluginObj;\n } else if (plugin && typeof plugin === \"object\") {\n pluginObj = { ...(plugin as Record<string, unknown>) };\n } else {\n continue;\n }\n\n stripProductionFields(pluginObj);\n }\n\n if (Object.keys(plugins).length === 0) {\n config.plugins = {};\n }\n }\n } else {\n delete config.plugins;\n }\n\n await saveBosConfig(destination, config);\n }\n\n const pkgPath = join(destination, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n\n if (pkg.workspaces && typeof pkg.workspaces === \"object\") {\n const ws = pkg.workspaces as { packages?: string[] };\n if (Array.isArray(ws.packages)) {\n ws.packages = ws.packages.filter((p: string) => {\n if (p.startsWith(\"packages/\")) return false;\n if (p === \"host\") return has(\"host\");\n if (p === \"plugins/*\") return has(\"plugins\") && (opts.plugins?.length ?? 0) > 0;\n const pluginMatch = p.match(/^plugins\\/([^/]+)/);\n if (pluginMatch)\n return has(\"plugins\") && (opts.plugins?.includes(pluginMatch[1]) ?? true);\n return true;\n });\n }\n }\n\n if (pkg.scripts && typeof pkg.scripts === \"object\") {\n const scripts = pkg.scripts as Record<string, string>;\n const rewrite = (key: string, from: string, to: string) => {\n if (scripts[key]?.includes(from)) {\n scripts[key] = scripts[key].replaceAll(from, to);\n }\n };\n rewrite(\"dev\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"dev:ui\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"dev:api\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"dev:proxy\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"build\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"deploy\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"publish\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n rewrite(\"start\", \"packages/everything-dev/src/cli.ts\", \"node_modules/.bin/bos\");\n\n scripts.postinstall = \"node_modules/.bin/bos types gen || true\";\n scripts[\"types:gen\"] = \"node_modules/.bin/bos types gen\";\n if (scripts.typecheck) {\n scripts.typecheck = scripts.typecheck\n .replace(\"bun run types:gen && \", \"\")\n .replace(/bun run --cwd packages\\/everything-dev typecheck & ?/, \"\");\n if (!has(\"host\")) {\n scripts.typecheck = scripts.typecheck.replace(/bun run --cwd host tsc --noEmit & ?/, \"\");\n }\n }\n\n if (!scripts.bos) {\n scripts.bos = \"node_modules/.bin/bos\";\n }\n }\n\n if (pkg.devDependencies && typeof pkg.devDependencies === \"object\") {\n const deps = pkg.devDependencies as Record<string, string>;\n delete deps[\"every-plugin\"];\n delete deps[\"everything-dev\"];\n }\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 if (!pkg.dependencies) pkg.dependencies = {};\n const deps = pkg.dependencies as Record<string, string>;\n const spec = opts.workspaceOpts?.sourceDir\n ? loadManifestNormalizationSpec(opts.workspaceOpts.sourceDir)\n : null;\n if (spec) {\n workspaces.catalog[\"everything-dev\"] = spec.rootCatalog[\"everything-dev\"];\n workspaces.catalog[\"every-plugin\"] = spec.rootCatalog[\"every-plugin\"];\n }\n const frameworkCatalog = resolveFrameworkCatalog();\n for (const [name, version] of Object.entries(frameworkCatalog)) {\n workspaces.catalog[name] = version;\n }\n if (!deps[\"everything-dev\"]) deps[\"everything-dev\"] = \"catalog:\";\n if (!deps[\"every-plugin\"]) deps[\"every-plugin\"] = \"catalog:\";\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n\n const apiTsConfigPath = join(destination, \"api\", \"tsconfig.json\");\n if (existsSync(apiTsConfigPath)) {\n const apiTsConfig = JSON.parse(readFileSync(apiTsConfigPath, \"utf-8\")) as {\n files?: string[];\n [key: string]: unknown;\n };\n if (apiTsConfig.files) {\n const validFiles = apiTsConfig.files.filter((f) => existsSync(join(destination, \"api\", f)));\n if (validFiles.length !== apiTsConfig.files.length) {\n if (validFiles.length === 0) {\n delete apiTsConfig.files;\n } else {\n apiTsConfig.files = validFiles;\n }\n writeFileSync(apiTsConfigPath, `${JSON.stringify(apiTsConfig, null, 2)}\\n`);\n }\n }\n }\n\n await resolveWorkspaceRefs(destination, opts.workspaceOpts);\n\n if (has(\"ui\")) {\n const genContractPath = join(destination, \"ui\", \"src\", \"lib\", \"api-types.gen.ts\");\n if (!existsSync(genContractPath)) {\n mkdirSync(dirname(genContractPath), { recursive: true });\n writeFileSync(genContractPath, `export type ApiContract = Record<string, never>;\\n`);\n }\n }\n\n if (has(\"api\")) {\n const pluginsClientGenPath = join(destination, \"api\", \"src\", \"lib\", \"plugins-types.gen.ts\");\n if (!existsSync(pluginsClientGenPath)) {\n mkdirSync(dirname(pluginsClientGenPath), { recursive: true });\n writeFileSync(\n pluginsClientGenPath,\n `import type { ContractRouterClient, AnyContractRouter } from \"@orpc/contract\";\\ntype ClientFactory<C extends AnyContractRouter> = (context?: Record<string, unknown>) => ContractRouterClient<C>;\\nexport type PluginsClient = Record<string, never>;\\n`,\n );\n }\n }\n\n const authTypesContent = generateAuthTypesTemplate();\n const authTypesPaths: string[] = [];\n if (has(\"ui\")) {\n authTypesPaths.push(join(destination, \"ui\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"api\")) {\n authTypesPaths.push(join(destination, \"api\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n if (has(\"host\") && existsSync(join(destination, \"host\", \"src\"))) {\n authTypesPaths.push(join(destination, \"host\", \"src\", \"lib\", \"auth-types.gen.ts\"));\n }\n for (const authTypesGenPath of authTypesPaths) {\n if (!existsSync(authTypesGenPath)) {\n mkdirSync(dirname(authTypesGenPath), { recursive: true });\n writeFileSync(authTypesGenPath, authTypesContent);\n }\n }\n}\n\nfunction generateAuthTypesTemplate(): string {\n return `import type { Auth } from \"better-auth\";\nexport type { Auth } from \"better-auth\";\nexport type AuthSessionUser = NonNullable<Auth[\"$Infer\"][\"Session\"][\"user\"]> & {\n role?: string | null;\n isAnonymous?: boolean | null;\n walletAddress?: string | null;\n banned?: boolean | null;\n};\nexport type AuthSessionData = NonNullable<Auth[\"$Infer\"][\"Session\"][\"session\"]> & {\n activeOrganizationId?: string | null;\n};\nexport type AuthSession = {\n user: AuthSessionUser | null;\n session: AuthSessionData | null;\n};\nexport interface AuthOrganizationContext {\n activeOrganizationId: string | null;\n organization: { id: string; name: string; slug: string; logo?: string | null; metadata?: Record<string, unknown> } | null;\n member: { id: string; role: string } | null;\n isPersonal: boolean;\n hasOrganization: boolean;\n}\nexport interface AuthRequestContext {\n user: AuthSessionUser | null;\n userId: string | null;\n isAuthenticated: boolean;\n authMethod: \"session\" | \"apiKey\" | \"anonymous\" | \"none\";\n near: {\n primaryAccountId: string | null;\n linkedAccounts: Array<{ accountId: string; network: string; publicKey: string; isPrimary: boolean }>;\n hasNearAccount: boolean;\n };\n organization: AuthOrganizationContext;\n organizations?: Array<{ id: string; role: string; name?: string; slug?: string }>;\n}\nexport type AuthActiveMember = { id: string | null; role: string | null; organizationId: string | null };\nexport type AuthOrganization = NonNullable<AuthOrganizationContext[\"organization\"]>;\nexport type AuthOrganizationMember = NonNullable<AuthOrganizationContext[\"member\"]>;\nexport type AuthOrganizationSummary = NonNullable<AuthRequestContext[\"organizations\"]>[number];\nexport type AuthBaseSession = Auth[\"$Infer\"][\"Session\"];\nexport type createAuthInstance = never;\nexport interface AuthServices {\n auth: Auth;\n db: unknown;\n driver: { close(): Promise<void> };\n handler: (req: Request) => Promise<Response>;\n}\n`;\n}\n\nexport async function runBunInstall(\n destination: string,\n spinner?: { message: (msg: string) => void },\n): Promise<void> {\n await runWithProgress(\n \"bun\",\n [\"install\", \"--ignore-scripts\"],\n destination,\n spinner,\n \"Installing dependencies\",\n );\n}\n\nexport async function runBunInstallForUpgrade(\n destination: string,\n spinner?: { message: (msg: string) => void },\n): Promise<void> {\n const lockfilePath = join(destination, \"bun.lock\");\n if (existsSync(lockfilePath)) {\n rmSync(lockfilePath, { force: true });\n }\n\n await runWithProgress(\"bun\", [\"install\"], destination, spinner, \"Installing dependencies\");\n}\n\nexport async function runTypesGen(\n destination: string,\n spinner?: { message: (msg: string) => void },\n): Promise<void> {\n await runWithProgress(\n \"node_modules/.bin/bos\",\n [\"types\", \"gen\"],\n destination,\n spinner,\n \"Generating types\",\n );\n}\n\nexport async function runDockerComposeUp(destination: string): Promise<void> {\n await execCommand(\"docker\", [\"compose\", \"up\", \"-d\", \"--wait\"], destination, { stdio: \"inherit\" });\n}\n\nasync function runWithProgress(\n command: string,\n args: string[],\n cwd: string,\n spinner: { message: (msg: string) => void } | undefined,\n label: string,\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n const child = execa(command, args, { cwd, stdio: \"inherit\", timeout });\n\n if (spinner) {\n const start = Date.now();\n const interval = setInterval(() => {\n const elapsed = Math.round((Date.now() - start) / 1000);\n spinner.message(`${label}... (${elapsed}s)`);\n }, 2000);\n try {\n await child;\n } finally {\n clearInterval(interval);\n }\n } else {\n await child;\n }\n}\n\nexport function stripOrphanedWorkspacesFromLockfile(\n lockfilePath: string,\n allowedWorkspaces: string[],\n): void {\n if (!existsSync(lockfilePath)) return;\n\n const content = readFileSync(lockfilePath, \"utf-8\");\n let lockfile: Record<string, unknown>;\n try {\n lockfile = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return;\n }\n\n const workspaces = lockfile.workspaces;\n if (!workspaces || typeof workspaces !== \"object\") return;\n\n const workspaceMap = workspaces as Record<string, unknown>;\n const allowed = new Set([\"\", ...allowedWorkspaces]);\n\n const keys = Object.keys(workspaceMap);\n let changed = false;\n for (const key of keys) {\n if (!allowed.has(key)) {\n delete workspaceMap[key];\n changed = true;\n }\n }\n\n if (changed) {\n writeFileSync(lockfilePath, `${JSON.stringify(lockfile, null, 2)}\\n`);\n }\n}\n\nconst WORKSPACE_LOCAL_PATHS: Record<string, string> = {\n \"everything-dev\": \"packages/everything-dev\",\n \"every-plugin\": \"packages/every-plugin\",\n};\n\nfunction resolveFrameworkCatalog(): Record<string, string> {\n const catalog: Record<string, string> = {};\n\n try {\n const selfPkgPath = require.resolve(\"everything-dev/package.json\");\n const selfPkgDir = dirname(selfPkgPath);\n const monorepoPkgPath = join(selfPkgDir, \"..\", \"..\", \"package.json\");\n if (existsSync(monorepoPkgPath)) {\n const monorepoPkg = JSON.parse(readFileSync(monorepoPkgPath, \"utf-8\")) as {\n workspaces?: { catalog?: Record<string, string> };\n };\n const sourceCatalog = monorepoPkg.workspaces?.catalog;\n if (sourceCatalog && typeof sourceCatalog === \"object\") {\n for (const [name, version] of Object.entries(sourceCatalog)) {\n if (typeof version === \"string\") {\n catalog[name] = version;\n }\n }\n }\n }\n } catch {}\n\n try {\n const selfPkgPath = require.resolve(\"everything-dev/package.json\");\n const selfPkg = JSON.parse(readFileSync(selfPkgPath, \"utf-8\")) as {\n version?: string;\n workspaces?: { catalog?: Record<string, string> };\n };\n if (selfPkg.version && !catalog[\"everything-dev\"]) {\n catalog[\"everything-dev\"] = `^${selfPkg.version}`;\n }\n const sourceCatalog = selfPkg.workspaces?.catalog;\n if (sourceCatalog && typeof sourceCatalog === \"object\") {\n for (const [name, version] of Object.entries(sourceCatalog)) {\n if (typeof version === \"string\" && !catalog[name]) {\n catalog[name] = version;\n }\n }\n }\n } catch {}\n\n if (Object.keys(catalog).length > 0) {\n return catalog;\n }\n\n for (const packageName of FRAMEWORK_PACKAGES) {\n try {\n const resolved = require.resolve(`${packageName}/package.json`);\n const pkg = JSON.parse(readFileSync(resolved, \"utf-8\")) as { version?: string };\n if (pkg.version) {\n catalog[packageName] = `^${pkg.version}`;\n }\n } catch {}\n }\n return catalog;\n}\n\nexport async function scaffoldMinimalProject(\n destination: string,\n parentConfig: BosConfigInput,\n opts: {\n extendsAccount: string;\n extendsGateway: string;\n account?: string;\n domain?: string;\n plugins?: string[];\n overrides: OverrideSection[];\n repository?: string;\n title?: string;\n description?: string;\n },\n): Promise<number> {\n mkdirSync(destination, { recursive: true });\n\n const has = (section: OverrideSection) => opts.overrides.includes(section);\n\n const config: Record<string, unknown> = {\n extends: `bos://${opts.extendsAccount}/${opts.extendsGateway}`,\n account: opts.account || opts.extendsAccount,\n ...(opts.domain ? { domain: opts.domain } : {}),\n ...(opts.repository ? { repository: opts.repository } : {}),\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.description ? { description: opts.description } : {}),\n };\n\n if (parentConfig.app && typeof parentConfig.app === \"object\") {\n const app: Record<string, unknown> = {};\n const parentApp = parentConfig.app as Record<string, Record<string, unknown>>;\n\n if (has(\"host\") && parentApp.host) {\n app.host = { ...parentApp.host };\n stripProductionFields(app.host as Record<string, unknown>);\n }\n\n if (has(\"ui\") && parentApp.ui) {\n app.ui = { ...parentApp.ui };\n stripProductionFields(app.ui as Record<string, unknown>);\n }\n\n if (has(\"api\") && parentApp.api) {\n app.api = { ...parentApp.api };\n stripProductionFields(app.api as Record<string, unknown>);\n }\n\n if (has(\"plugins\") && parentApp.auth) {\n app.auth = { ...parentApp.auth };\n stripProductionFields(app.auth as Record<string, unknown>);\n }\n\n if (Object.keys(app).length > 0) {\n config.app = app;\n }\n }\n\n if (has(\"plugins\") && opts.plugins && opts.plugins.length > 0 && parentConfig.plugins) {\n const plugins: Record<string, unknown> = {};\n for (const key of opts.plugins) {\n const parentPlugin = (parentConfig.plugins as Record<string, unknown>)?.[key];\n if (parentPlugin) {\n if (typeof parentPlugin === \"string\") {\n plugins[key] = { extends: parentPlugin };\n } else {\n const pluginCopy = { ...(parentPlugin as Record<string, unknown>) };\n stripProductionFields(pluginCopy);\n plugins[key] = pluginCopy;\n }\n }\n }\n config.plugins = plugins;\n }\n\n await saveBosConfig(destination, config);\n\n const workspacePackages: string[] = [];\n for (const section of opts.overrides) {\n workspacePackages.push(...OVERRIDE_WORKSPACE_MAP[section]);\n }\n if (has(\"plugins\") && opts.plugins) {\n for (const plugin of opts.plugins) {\n workspacePackages.push(`plugins/${plugin}`);\n }\n }\n\n const catalog = resolveFrameworkCatalog();\n\n const pkg: Record<string, unknown> = {\n name: opts.domain || opts.extendsGateway,\n private: true,\n type: \"module\",\n scripts: {\n dev: \"node_modules/.bin/bos dev --host remote\",\n \"dev:ui\": \"node_modules/.bin/bos dev --ui local --api remote\",\n \"dev:api\": \"node_modules/.bin/bos dev --ui remote --api local\",\n build: \"node_modules/.bin/bos build\",\n deploy: \"node_modules/.bin/bos build --deploy\",\n publish: \"node_modules/.bin/bos publish\",\n start: \"node_modules/.bin/bos start\",\n typecheck: \"node_modules/.bin/bos types gen && tsc --noEmit\",\n postinstall: \"node_modules/.bin/bos types gen || true\",\n \"types:gen\": \"node_modules/.bin/bos types gen\",\n bos: \"node_modules/.bin/bos\",\n },\n dependencies: {\n \"everything-dev\": \"catalog:\",\n \"every-plugin\": \"catalog:\",\n },\n devDependencies: {},\n workspaces: {\n packages: workspacePackages,\n catalog,\n },\n };\n writeFileSync(join(destination, \"package.json\"), `${JSON.stringify(pkg, null, 2)}\\n`);\n\n const envExample = generateEnvExample(parentConfig, opts.overrides);\n if (envExample) {\n writeFileSync(join(destination, \".env.example\"), envExample);\n }\n\n writeFileSync(join(destination, \".gitignore\"), generateGitignore());\n\n return 4;\n}\n\nasync function resolveWorkspaceRefs(\n destination: string,\n options?: { localOverrides?: boolean; sourceDir?: string },\n): Promise<void> {\n await normalizePackageManifestsInTree({\n sourceRootDir: options?.sourceDir ?? destination,\n targetDir: destination,\n resolveCatalogRefs: false,\n preserveCatalogRefs: true,\n removeWorkspaceDeps: [\"host\"],\n });\n\n if (options?.localOverrides && options.sourceDir) {\n const rootPkgPath = join(destination, \"package.json\");\n if (existsSync(rootPkgPath)) {\n const pkg = JSON.parse(readFileSync(rootPkgPath, \"utf-8\")) as Record<string, unknown>;\n if (!pkg.overrides) pkg.overrides = {};\n const overrides = pkg.overrides as Record<string, string>;\n\n const rootWorkspaces = ((pkg.workspaces as Record<string, string[]>)?.packages ?? []).filter(\n Boolean,\n );\n\n for (const [name, relPath] of Object.entries(WORKSPACE_LOCAL_PATHS)) {\n if (!rootWorkspaces.some((ws) => ws === relPath || ws === `plugins/${name}`)) {\n const srcPkgPath = join(options.sourceDir, relPath, \"package.json\");\n if (existsSync(srcPkgPath)) {\n overrides[name] = `file:${relPath}`;\n rootWorkspaces.push(relPath);\n }\n }\n }\n\n if (rootWorkspaces.length > 0) {\n if (!pkg.workspaces) pkg.workspaces = {};\n (pkg.workspaces as Record<string, string[]>).packages = rootWorkspaces;\n }\n\n writeFileSync(rootPkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n }\n}\n\nexport async function writeInitSnapshot(\n destination: string,\n extendsAccount: string,\n extendsGateway: string,\n sourceDir: string,\n patterns: string[],\n options: {\n overrides: OverrideSection[];\n plugins?: string[];\n pluginRoutes?: Record<string, string[]>;\n },\n): Promise<void> {\n const effectivePatterns = filterPatternsByOverrides(patterns, options.overrides, options.plugins);\n\n const has = (section: OverrideSection) => options.overrides.includes(section);\n if (has(\"host\") && !effectivePatterns.some((p) => p.startsWith(\"host/\") || p === \"host/**\")) {\n effectivePatterns.push(\"host/**\");\n }\n\n const excludedRoutePatterns: string[] = [];\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) {\n excludedRoutePatterns.push(...routePatterns);\n }\n }\n }\n\n const allFiles = new Set<string>();\n for (const pattern of effectivePatterns) {\n const matches = await glob(pattern, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n const pluginMatch = match.match(/^plugins\\/([^/]+)/);\n if (pluginMatch && !(options.plugins?.includes(pluginMatch[1]) ?? true)) continue;\n if (isPathExcluded(match, excludedRoutePatterns)) continue;\n allFiles.add(match);\n }\n }\n\n if (options.pluginRoutes) {\n for (const [pluginKey, routePatterns] of Object.entries(options.pluginRoutes)) {\n if (!(options.plugins?.includes(pluginKey) ?? true)) continue;\n for (const rp of routePatterns) {\n const matches = await glob(rp, {\n cwd: sourceDir,\n nodir: true,\n dot: true,\n absolute: false,\n });\n for (const match of matches) {\n if (!isPathExcluded(match, excludedRoutePatterns)) {\n allFiles.add(match);\n }\n }\n }\n }\n }\n\n const fileHashes: Record<string, string> = {};\n for (const filePath of allFiles) {\n const src = join(sourceDir, filePath);\n const stat = lstatSync(src);\n if (!stat.isFile()) continue;\n const content = readFileSync(src);\n const destPath = filePath.startsWith(\".github/templates/\")\n ? filePath.replace(/^\\.github\\/templates\\//, \".github/\")\n : filePath;\n fileHashes[destPath] = computeHash(content);\n }\n\n await writeSnapshot(destination, {\n parentRef: `bos://${extendsAccount}/${extendsGateway}`,\n files: fileHashes,\n });\n}\n\nfunction computeHash(data: Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\").substring(0, 16);\n}\n\nfunction mkTmpDir(prefix: string): string {\n return mkdtempSync(join(tmpdir(), `${prefix}-`));\n}\n\nexport async function generateDatabaseMigrations(destination: string): Promise<void> {\n const drizzleConfigs = await glob(\"**/drizzle.config.ts\", {\n cwd: destination,\n nodir: true,\n dot: false,\n absolute: false,\n ignore: [\"**/node_modules/**\"],\n });\n\n for (const configPath of drizzleConfigs) {\n const workspaceDir = dirname(configPath);\n const pkgPath = join(destination, workspaceDir, \"package.json\");\n if (!existsSync(pkgPath)) continue;\n\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as Record<string, unknown>;\n const scripts = pkg.scripts as Record<string, string> | undefined;\n if (!scripts?.[\"db:generate\"]) continue;\n\n const cwd = join(destination, workspaceDir);\n await execCommand(\"bun\", [\"run\", \"db:generate\"], cwd);\n }\n}\n\nconst COMMAND_TIMEOUTS: Record<string, number> = {\n bun: 5 * 60_000,\n docker: 5 * 60_000,\n node_modules: 2 * 60_000,\n tar: 60_000,\n};\n\nexport async function execCommand(\n command: string,\n args: string[],\n cwd?: string,\n options?: { stdio?: \"pipe\" | \"inherit\" },\n): Promise<void> {\n const timeout = COMMAND_TIMEOUTS[command] ?? 2 * 60_000;\n await execa(command, args, { cwd, stdio: options?.stdio ?? \"pipe\", timeout });\n}\n\nfunction generateEnvExample(config: BosConfigInput, overrides: OverrideSection[]): string {\n const has = (section: OverrideSection) => overrides.includes(section);\n\n const lines: string[] = [\"# Environment variables\"];\n const collectSecrets = (\n obj: Record<string, unknown>,\n includeSection: boolean,\n prefix = \"\",\n ): void => {\n for (const [key, value] of Object.entries(obj)) {\n if (!includeSection) continue;\n if (key === \"secrets\" && Array.isArray(value)) {\n for (const secret of value) {\n if (typeof secret === \"string\") {\n lines.push(`${secret}=`);\n }\n }\n } else if (key === \"variables\" && isPlainObject(value)) {\n for (const [varKey, varVal] of Object.entries(value as Record<string, unknown>)) {\n if (typeof varVal === \"string\") {\n lines.push(`${varKey}=${varVal}`);\n }\n }\n } else if (isPlainObject(value) && key !== \"extends\") {\n collectSecrets(value as Record<string, unknown>, includeSection, `${prefix}${key}.`);\n }\n }\n };\n\n if (config.app && typeof config.app === \"object\") {\n const app = config.app as Record<string, unknown>;\n collectSecrets(app, has(\"host\"), \"host.\");\n collectSecrets(app, has(\"ui\"), \"ui.\");\n collectSecrets(app, has(\"api\"), \"api.\");\n collectSecrets(app, has(\"plugins\"), \"auth.\");\n }\n if (has(\"plugins\") && config.plugins && typeof config.plugins === \"object\") {\n for (const [pluginKey, pluginVal] of Object.entries(\n config.plugins as Record<string, unknown>,\n )) {\n if (isPlainObject(pluginVal)) {\n collectSecrets(pluginVal as Record<string, unknown>, true);\n } else if (typeof pluginVal === \"string\") {\n lines.push(`# Plugin '${pluginKey}' extends ${pluginVal}`);\n }\n }\n }\n\n lines.push(\"BETTER_AUTH_SECRET=generate-a-secret-here\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction generateGitignore(): string {\n return `node_modules/\ndist/\n.env\n.bos/\n*.gen.ts\n*.gen.tsx\n`;\n}\n"],"mappings":"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"}
@@ -544,7 +544,7 @@ async function upgradeTemplate(projectDir, options) {
544
544
  }));
545
545
  }
546
546
  if ((hasUpdates || addedPlugins.length > 0) && !options.noInstall) {
547
- await require_timing.timePhase(timings, "install dependencies", () => require_cli_init.runBunInstall(projectDir));
547
+ await require_timing.timePhase(timings, "install dependencies", () => require_cli_init.runBunInstallForUpgrade(projectDir));
548
548
  await require_timing.timePhase(timings, "generate types", () => require_cli_init.runTypesGen(projectDir));
549
549
  }
550
550
  const migratedFiles = await require_timing.timePhase(timings, "clean obsolete files", async () => {