everything-dev 1.43.0 → 1.44.1

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.
Files changed (79) hide show
  1. package/dist/api-contract.cjs +35 -39
  2. package/dist/api-contract.cjs.map +1 -1
  3. package/dist/api-contract.mjs +35 -39
  4. package/dist/api-contract.mjs.map +1 -1
  5. package/dist/cli/catalog.cjs +2 -2
  6. package/dist/cli/catalog.cjs.map +1 -1
  7. package/dist/cli/catalog.mjs +2 -2
  8. package/dist/cli/catalog.mjs.map +1 -1
  9. package/dist/cli/infra.cjs +14 -4
  10. package/dist/cli/infra.cjs.map +1 -1
  11. package/dist/cli/infra.mjs +14 -4
  12. package/dist/cli/infra.mjs.map +1 -1
  13. package/dist/cli/init.cjs +9 -4
  14. package/dist/cli/init.cjs.map +1 -1
  15. package/dist/cli/init.d.cts +1 -1
  16. package/dist/cli/init.d.cts.map +1 -1
  17. package/dist/cli/init.d.mts +1 -1
  18. package/dist/cli/init.d.mts.map +1 -1
  19. package/dist/cli/init.mjs +9 -4
  20. package/dist/cli/init.mjs.map +1 -1
  21. package/dist/cli/status.cjs +13 -29
  22. package/dist/cli/status.cjs.map +1 -1
  23. package/dist/cli/status.mjs +13 -29
  24. package/dist/cli/status.mjs.map +1 -1
  25. package/dist/cli.cjs +9 -4
  26. package/dist/cli.cjs.map +1 -1
  27. package/dist/cli.mjs +9 -4
  28. package/dist/cli.mjs.map +1 -1
  29. package/dist/config.cjs +27 -23
  30. package/dist/config.cjs.map +1 -1
  31. package/dist/config.d.cts.map +1 -1
  32. package/dist/config.d.mts.map +1 -1
  33. package/dist/config.mjs +27 -23
  34. package/dist/config.mjs.map +1 -1
  35. package/dist/contract.cjs +6 -5
  36. package/dist/contract.cjs.map +1 -1
  37. package/dist/contract.d.cts +12 -4
  38. package/dist/contract.d.cts.map +1 -1
  39. package/dist/contract.d.mts +12 -4
  40. package/dist/contract.d.mts.map +1 -1
  41. package/dist/contract.mjs +6 -5
  42. package/dist/contract.mjs.map +1 -1
  43. package/dist/dev-session.cjs +3 -1
  44. package/dist/dev-session.cjs.map +1 -1
  45. package/dist/dev-session.mjs +3 -1
  46. package/dist/dev-session.mjs.map +1 -1
  47. package/dist/fastkv.cjs +13 -29
  48. package/dist/fastkv.cjs.map +1 -1
  49. package/dist/fastkv.mjs +14 -29
  50. package/dist/fastkv.mjs.map +1 -1
  51. package/dist/http-client.cjs +102 -0
  52. package/dist/http-client.cjs.map +1 -0
  53. package/dist/http-client.mjs +100 -0
  54. package/dist/http-client.mjs.map +1 -0
  55. package/dist/integrity.cjs +3 -2
  56. package/dist/integrity.cjs.map +1 -1
  57. package/dist/integrity.d.cts.map +1 -1
  58. package/dist/integrity.d.mts.map +1 -1
  59. package/dist/integrity.mjs +3 -2
  60. package/dist/integrity.mjs.map +1 -1
  61. package/dist/mf.cjs +10 -2
  62. package/dist/mf.cjs.map +1 -1
  63. package/dist/mf.d.cts.map +1 -1
  64. package/dist/mf.d.mts.map +1 -1
  65. package/dist/mf.mjs +10 -2
  66. package/dist/mf.mjs.map +1 -1
  67. package/dist/near-cli.cjs +1 -1
  68. package/dist/near-cli.mjs +1 -1
  69. package/dist/orchestrator.cjs +39 -23
  70. package/dist/orchestrator.cjs.map +1 -1
  71. package/dist/orchestrator.mjs +39 -23
  72. package/dist/orchestrator.mjs.map +1 -1
  73. package/dist/plugin.cjs +57 -65
  74. package/dist/plugin.cjs.map +1 -1
  75. package/dist/plugin.d.cts +4 -0
  76. package/dist/plugin.d.mts +4 -0
  77. package/dist/plugin.mjs +57 -65
  78. package/dist/plugin.mjs.map +1 -1
  79. package/package.json +1 -1
package/dist/config.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
3
+ const require_http_client = require('./http-client.cjs');
3
4
  const require_fastkv = require('./fastkv.cjs');
4
5
  const require_merge = require('./merge.cjs');
5
6
  const require_network = require('./network.cjs');
@@ -35,13 +36,21 @@ function emitConfigWarning(message) {
35
36
  if (suppressConfigWarnings) configWarnings.push(message);
36
37
  else console.warn(message);
37
38
  }
39
+ const configPathCache = /* @__PURE__ */ new Map();
38
40
  function findConfigPath(cwd) {
39
- let dir = cwd ?? process.cwd();
41
+ const cacheKey = cwd ?? process.cwd();
42
+ const cached = configPathCache.get(cacheKey);
43
+ if (cached !== void 0) return cached;
44
+ let dir = cacheKey;
40
45
  while (dir !== "/") {
41
46
  const configPath = (0, node_path.join)(dir, "bos.config.json");
42
- if ((0, node_fs.existsSync)(configPath)) return configPath;
47
+ if ((0, node_fs.existsSync)(configPath)) {
48
+ configPathCache.set(cacheKey, configPath);
49
+ return configPath;
50
+ }
43
51
  dir = (0, node_path.dirname)(dir);
44
52
  }
53
+ configPathCache.set(cacheKey, null);
45
54
  return null;
46
55
  }
47
56
  function getConfig() {
@@ -96,7 +105,8 @@ async function loadResolvedConfig(options) {
96
105
  };
97
106
  } catch (error) {
98
107
  resumeWarnings();
99
- throw new Error(`Failed to load config from ${configPath}: ${error}`);
108
+ if (error instanceof Error) throw new Error(`Failed to load config from ${configPath}: ${error.message}`, { cause: error });
109
+ throw new Error(`Failed to load config from ${configPath}: ${String(error)}`);
100
110
  }
101
111
  }
102
112
  async function loadBosConfig(options) {
@@ -156,8 +166,7 @@ function withAssociatedUi(entry, associatedUi) {
156
166
  };
157
167
  }
158
168
  async function resolveConfigComposableEntries(config, baseDir, env) {
159
- const resolvedApi = await resolveComposableReference(config.app.api, baseDir, env, "app.api");
160
- const resolvedAuth = config.app.auth ? await resolveComposableReference(config.app.auth, baseDir, env, "app.auth") : void 0;
169
+ const [resolvedApi, resolvedAuth] = await Promise.all([resolveComposableReference(config.app.api, baseDir, env, "app.api"), config.app.auth ? resolveComposableReference(config.app.auth, baseDir, env, "app.auth") : Promise.resolve(void 0)]);
161
170
  const resolvedPlugins = config.plugins ? Object.fromEntries(await Promise.all(Object.entries(config.plugins).map(async ([pluginId, pluginValue]) => {
162
171
  const resolvedPlugin = await resolveComposableReference(asComposableEntry(pluginValue), baseDir, env, `plugins.${pluginId}`);
163
172
  return [pluginId, withAssociatedUi(resolvedPlugin.entry, resolvedPlugin.associatedUi)];
@@ -394,6 +403,7 @@ function buildRuntimeConfig(config, baseDir, env, options) {
394
403
  },
395
404
  auth: (() => {
396
405
  if (!authConfig || !authRuntime) return void 0;
406
+ if (!authRuntime.localPath && !authRuntime.url) return void 0;
397
407
  return {
398
408
  name: resolvePluginRuntimeName(authConfig.name, authRuntime.localPath, "auth"),
399
409
  extendsRef: authExtendsRef,
@@ -436,30 +446,24 @@ function normalizePluginEntry(raw) {
436
446
  return raw;
437
447
  }
438
448
  async function resolveRuntimePlugins(plugins, baseDir, env, remotePlugins) {
439
- const out = {};
440
- for (const [pluginId, rawInput] of Object.entries(plugins)) {
441
- const normalized = normalizePluginEntry(rawInput);
442
- if (normalized === null || normalized === false) continue;
449
+ const entries = Object.entries(plugins).map(([pluginId, rawInput]) => ({
450
+ pluginId,
451
+ normalized: normalizePluginEntry(rawInput)
452
+ })).filter((entry) => entry.normalized !== null && entry.normalized !== false);
453
+ const resolved = await Promise.all(entries.map(async ({ pluginId, normalized }) => {
443
454
  const resolvedReference = await resolveComposableReference(normalized, baseDir, env, `plugins.${pluginId}`);
444
455
  const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, remotePlugins?.includes(pluginId) ? "remote" : void 0);
445
- if (!pluginRuntime.localPath && !pluginRuntime.url) continue;
456
+ if (!pluginRuntime.localPath && !pluginRuntime.url) return null;
446
457
  if (pluginRuntime.source === "remote" && pluginRuntime.url && !pluginRuntime.localPath && typeof resolvedReference.entry.name !== "string") pluginRuntime.name = await resolveRemotePluginRuntimeName(pluginRuntime.url, pluginRuntime.name);
447
- out[pluginId] = pluginRuntime;
448
- }
458
+ return [pluginId, pluginRuntime];
459
+ }));
460
+ const out = {};
461
+ for (const entry of resolved) if (entry) out[entry[0]] = entry[1];
449
462
  return out;
450
463
  }
451
464
  async function resolveRemotePluginRuntimeName(baseUrl, fallback) {
452
- try {
453
- const controller = new AbortController();
454
- const timeout = setTimeout(() => controller.abort(), 5e3);
455
- const response = await fetch(`${baseUrl.replace(/\/$/, "")}/plugin.manifest.json`, { signal: controller.signal });
456
- clearTimeout(timeout);
457
- if (!response.ok) return fallback;
458
- const manifest = await response.json();
459
- return typeof manifest.plugin?.name === "string" && manifest.plugin.name.length > 0 ? manifest.plugin.name : fallback;
460
- } catch {
461
- return fallback;
462
- }
465
+ const manifest = await require_http_client.fetchJsonOrNull(`${baseUrl.replace(/\/$/, "")}/plugin.manifest.json`, { retries: 0 });
466
+ return typeof manifest?.plugin?.name === "string" && manifest.plugin.name.length > 0 ? manifest.plugin.name : fallback;
463
467
  }
464
468
  function buildRuntimePluginConfig(pluginId, env, resolved, forceSource) {
465
469
  const source = resolved.entry;
@@ -1 +1 @@
1
- {"version":3,"file":"config.cjs","names":["BosConfigSchema","isPlainObject","bosConfigMerger","rebuildOrderedConfig","resolveExtendsRef","getNetworkIdForAccount","fetchBosConfigFromFastKv","mergeBosConfigWithExtends"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv } from \"./fastkv\";\nimport {\n type BosEnv,\n bosConfigMerger,\n isPlainObject,\n mergeBosConfigWithExtends,\n type ResolvedConfigMeta,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport type {\n BosConfig,\n BosConfigInput,\n BosPluginRef,\n ExtendsConfig,\n JsonObject,\n JsonValue,\n PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n} from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\nconst LOCAL_PREFIX = \"local:\";\nconst DEFAULT_HOST_PORT = 3000;\nconst RESOLVED_CONFIG_FILENAME = \"bos.resolved-config.json\";\n\ntype RuntimeOverrideTarget = \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`;\n\ninterface RuntimeTarget {\n source: \"local\" | \"remote\";\n url: string;\n localPath?: string;\n port?: number;\n}\n\nlet cachedConfig: BosConfig | null = null;\nlet projectRoot: string | null = null;\nlet configWarnings: string[] = [];\nlet suppressConfigWarnings = false;\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n projectRoot = null;\n configWarnings = [];\n}\n\nexport function suppressWarnings(): void {\n suppressConfigWarnings = true;\n}\n\nexport function resumeWarnings(): void {\n suppressConfigWarnings = false;\n}\n\nexport function drainConfigWarnings(): string[] {\n const warnings = [...configWarnings];\n configWarnings = [];\n return warnings;\n}\n\nfunction emitConfigWarning(message: string): void {\n if (suppressConfigWarnings) {\n configWarnings.push(message);\n } else {\n console.warn(message);\n }\n}\n\nexport function findConfigPath(cwd?: string): string | null {\n let dir = cwd ?? process.cwd();\n while (dir !== \"/\") {\n const configPath = join(dir, \"bos.config.json\");\n if (existsSync(configPath)) {\n return configPath;\n }\n dir = dirname(dir);\n }\n return null;\n}\n\nexport function getConfig(): BosConfig | null {\n return cachedConfig;\n}\n\nexport function getProjectRoot(): string {\n if (!projectRoot) {\n throw new Error(\"Config not loaded. Call loadResolvedConfig() first.\");\n }\n return projectRoot;\n}\n\nexport interface ConfigResult {\n config: BosConfig;\n runtime: RuntimeConfig;\n source: {\n path: string;\n extended?: string[];\n remote?: boolean;\n };\n warnings?: string[];\n}\n\nexport interface LocalConfigResult {\n config: BosConfigInput;\n source: {\n path: string;\n };\n}\n\nexport interface RemoteConfigResult {\n rawConfig: BosConfigInput;\n config: BosConfig;\n source: string;\n extendsChain: string[];\n}\n\nexport interface ResolvedComposableReference {\n entry: BosPluginRef;\n providerBaseDir: string;\n targetPath: string;\n associatedUi?: Record<string, unknown>;\n}\n\ninterface ParsedExtendsTarget {\n configPath: string;\n targetPath?: string;\n}\n\nexport async function loadLocalConfig(options?: {\n cwd?: string;\n path?: string;\n}): Promise<LocalConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const config = await loadConfigFile(configPath, baseDir);\n\n projectRoot = baseDir;\n\n return {\n config,\n source: {\n path: configPath,\n },\n };\n}\n\nexport async function loadResolvedConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n remotePlugins?: string[];\n}): Promise<ConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const env = options?.env ?? \"development\";\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n\n try {\n suppressWarnings();\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n baseDir,\n runtimeEnv,\n );\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(\n config.plugins ?? {},\n baseDir,\n runtimeEnv,\n options?.remotePlugins,\n );\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\n plugins: pluginRuntime,\n });\n const warnings = drainConfigWarnings();\n resumeWarnings();\n\n return {\n config,\n runtime,\n source: {\n path: configPath,\n extended: extendedChain.length > 0 ? extendedChain : undefined,\n remote: extendedChain.some((entry) => entry.startsWith(\"bos://\")),\n },\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n } catch (error) {\n resumeWarnings();\n throw new Error(`Failed to load config from ${configPath}: ${error}`);\n }\n}\n\nexport async function loadBosConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n}): Promise<RuntimeConfig> {\n const result = await loadResolvedConfig(options);\n if (!result) {\n throw new Error(\"No bos.config.json found\");\n }\n\n return result.runtime;\n}\n\nexport async function loadRemoteConfig(\n bosUrl: string,\n env: BosEnv = \"production\",\n): Promise<RemoteConfigResult> {\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n bosUrl,\n process.cwd(),\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n process.cwd(),\n runtimeEnv,\n );\n\n return {\n rawConfig: await loadConfigFile(bosUrl, process.cwd()),\n config,\n source: bosUrl,\n extendsChain: extendedChain,\n };\n}\n\nexport function parseRuntimeOverrideTargets(value?: string | null): RuntimeOverrideTarget[] {\n if (!value) {\n return [];\n }\n\n return [\n ...new Set(\n value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n ].map((entry) => {\n if (entry === \"ui\" || entry === \"api\" || entry === \"plugins\") {\n return entry;\n }\n\n if (entry.startsWith(\"plugins.\") && entry.length > \"plugins.\".length) {\n return entry as RuntimeOverrideTarget;\n }\n\n throw new Error(`Invalid runtime override target: ${entry}`);\n });\n}\n\nexport function isRuntimeOverrideAllowed(\n allowedTargets: ReadonlyArray<RuntimeOverrideTarget>,\n target: \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`,\n): boolean {\n if (allowedTargets.includes(target as RuntimeOverrideTarget)) {\n return true;\n }\n\n if (target.startsWith(\"plugins.\")) {\n return allowedTargets.includes(\"plugins.*\");\n }\n\n return false;\n}\n\nexport async function buildRuntimePluginsForConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<Record<string, RuntimePluginConfig> | undefined> {\n const plugins = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, env);\n return Object.keys(plugins).length > 0 ? plugins : undefined;\n}\n\nfunction getEntryAssociatedUi(entry: Partial<BosPluginRef>): Record<string, unknown> | undefined {\n if (!isPlainObject(entry.app)) {\n return undefined;\n }\n\n const app = entry.app as Record<string, unknown>;\n if (!isPlainObject(app.ui)) {\n return undefined;\n }\n\n const ui = app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeAssociatedUi(\n parentUi: Record<string, unknown> | undefined,\n childUi: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!parentUi) {\n return childUi ? { ...childUi } : undefined;\n }\n\n if (!childUi) {\n return { ...parentUi };\n }\n\n return bosConfigMerger({ ...childUi }, parentUi) as Record<string, unknown>;\n}\n\nfunction withAssociatedUi(\n entry: BosPluginRef,\n associatedUi?: Record<string, unknown>,\n): BosPluginRef {\n if (!associatedUi) {\n return entry;\n }\n\n const app = isPlainObject(entry.app)\n ? ({ ...(entry.app as Record<string, unknown>) } as Record<string, unknown>)\n : {};\n app.ui = mergeAssociatedUi(getEntryAssociatedUi(entry), associatedUi);\n\n return {\n ...entry,\n app,\n };\n}\n\nexport async function resolveConfigComposableEntries(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<BosConfig> {\n const resolvedApi = await resolveComposableReference(\n config.app.api as BosPluginRef,\n baseDir,\n env,\n \"app.api\",\n );\n const resolvedAuth = config.app.auth\n ? await resolveComposableReference(config.app.auth as BosPluginRef, baseDir, env, \"app.auth\")\n : undefined;\n\n const resolvedPlugins = config.plugins\n ? Object.fromEntries(\n await Promise.all(\n Object.entries(config.plugins).map(async ([pluginId, pluginValue]) => {\n const resolvedPlugin = await resolveComposableReference(\n asComposableEntry(pluginValue),\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n return [\n pluginId,\n withAssociatedUi(resolvedPlugin.entry, resolvedPlugin.associatedUi),\n ] as const;\n }),\n ),\n )\n : undefined;\n\n return {\n ...config,\n app: {\n ...config.app,\n api: resolvedApi.entry,\n auth: resolvedAuth?.entry,\n },\n plugins: resolvedPlugins,\n };\n}\n\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadGeneratedResolvedConfig(configDir: string): BosConfig | null {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (!existsSync(resolvedPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (!isPlainObject(raw)) return null;\n const { _resolved, ...configData } = raw;\n return BosConfigSchema.parse(configData);\n } catch {\n return null;\n }\n}\n\nexport function writeResolvedConfig(\n configDir: string,\n config: BosConfig,\n env: BosEnv,\n extendsChain?: string[],\n source?: string,\n): void {\n const resolvedPath = getResolvedConfigPath(configDir);\n const resolvedDir = dirname(resolvedPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(config);\n const meta: ResolvedConfigMeta = {\n env,\n resolvedAt: new Date().toISOString(),\n extendsChain: extendsChain ?? [],\n ...(source ? { source } : {}),\n };\n const output = {\n _resolved: meta,\n ...ordered,\n };\n\n const content = `${JSON.stringify(output, null, 2)}\\n`;\n try {\n if (readFileSync(resolvedPath, \"utf-8\") === content) return;\n } catch {\n // file doesn't exist yet\n }\n writeFileSync(resolvedPath, content);\n}\n\nexport function resolveBosConfigPath(configDir: string): string {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) return resolvedPath;\n return join(configDir, \"bos.config.json\");\n}\n\nexport function readBosConfigForBuild(configDir: string): Record<string, unknown> {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) {\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (isPlainObject(raw)) {\n const { _resolved, ...configData } = raw;\n return configData as Record<string, unknown>;\n }\n } catch {}\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction parseExtendsTarget(ref: string): ParsedExtendsTarget {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configPath: ref };\n }\n\n const configPath = ref.slice(0, hashIndex);\n const targetPath = ref.slice(hashIndex + 1);\n return {\n configPath,\n targetPath: targetPath.length > 0 ? targetPath : undefined,\n };\n}\n\nfunction getConfigBaseDir(configPath: string, baseDir: string): string {\n if (configPath.startsWith(\"bos://\")) return baseDir;\n return dirname(isAbsolute(configPath) ? configPath : resolve(baseDir, configPath));\n}\n\nfunction asComposableEntry(value: unknown): BosPluginRef {\n if (value === undefined) {\n return {};\n }\n if (typeof value === \"string\") {\n return { extends: value };\n }\n if (!isPlainObject(value)) {\n throw new Error(`Expected config entry object, received ${typeof value}`);\n }\n return value as BosPluginRef;\n}\n\nfunction getTargetedEntry(config: BosConfigInput, targetPath: string): BosPluginRef {\n if (targetPath.startsWith(\"app.\")) {\n const entryKey = targetPath.slice(\"app.\".length);\n return asComposableEntry(config.app?.[entryKey]);\n }\n\n if (targetPath.startsWith(\"plugins.\")) {\n const pluginId = targetPath.slice(\"plugins.\".length);\n if (pluginId.length === 0) {\n throw new Error(`Invalid plugin target path: ${targetPath}`);\n }\n return asComposableEntry(config.plugins?.[pluginId]);\n }\n\n throw new Error(`Unsupported extends target path: ${targetPath}`);\n}\n\nfunction getAssociatedUi(\n config: BosConfigInput,\n _targetPath: string,\n): Record<string, unknown> | undefined {\n if (!isPlainObject(config.app?.ui)) {\n return undefined;\n }\n\n const ui = config.app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeComposableEntries(\n parent: Partial<BosPluginRef>,\n child: Partial<BosPluginRef>,\n): BosPluginRef {\n return bosConfigMerger({ ...child }, parent) as BosPluginRef;\n}\n\nfunction stripUnsafeLocalDevelopment<T extends Record<string, unknown> | undefined>(\n entry: T,\n allowLocalPaths: boolean,\n): T {\n if (!entry || allowLocalPaths) {\n return entry;\n }\n\n if (typeof entry.development === \"string\" && entry.development.startsWith(LOCAL_PREFIX)) {\n const { development: _ignored, ...rest } = entry;\n return rest as T;\n }\n\n return entry;\n}\n\nexport async function resolveComposableReference(\n source: BosPluginRef,\n baseDir: string,\n env: BosEnv,\n defaultTargetPath: string,\n): Promise<ResolvedComposableReference> {\n let resolvedEntry: BosPluginRef = {};\n let providerBaseDir = baseDir;\n let targetPath = defaultTargetPath;\n let associatedUi = getEntryAssociatedUi(source);\n let allowLocalPaths = false;\n let extendsError: unknown;\n\n const extendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n if (extendsRef) {\n const parsed = parseExtendsTarget(extendsRef);\n targetPath = parsed.targetPath ?? defaultTargetPath;\n const extendsBaseDir = getConfigBaseDir(parsed.configPath, baseDir);\n try {\n const extendedConfig = await resolveConfigWithExtends(\n parsed.configPath,\n extendsBaseDir,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(extendedConfig, targetPath),\n );\n providerBaseDir = extendsBaseDir;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(extendedConfig, targetPath));\n } catch (error) {\n extendsError = error;\n }\n }\n\n const localDevelopment =\n typeof source.development === \"string\" && source.development.startsWith(LOCAL_PREFIX)\n ? source.development\n : undefined;\n const localDevelopmentPath = localDevelopment\n ? resolve(baseDir, localDevelopment.slice(LOCAL_PREFIX.length).trim())\n : undefined;\n const hasUsableLocalDevelopment = Boolean(\n localDevelopmentPath && existsSync(localDevelopmentPath),\n );\n\n if (localDevelopmentPath) {\n const localPath = localDevelopmentPath;\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n const localConfig = await resolveConfigWithExtends(\n localConfigPath,\n localPath,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(localConfig, targetPath),\n );\n providerBaseDir = localPath;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(localConfig, targetPath));\n allowLocalPaths = true;\n }\n }\n\n const sourceOverrides = { ...source };\n if (allowLocalPaths && localDevelopment) {\n delete sourceOverrides.development;\n }\n\n resolvedEntry = mergeComposableEntries(resolvedEntry, sourceOverrides);\n associatedUi = mergeAssociatedUi(associatedUi, getEntryAssociatedUi(sourceOverrides));\n\n if (extendsError && !allowLocalPaths && !hasUsableLocalDevelopment) {\n throw extendsError;\n }\n\n return {\n entry: stripUnsafeLocalDevelopment(resolvedEntry, allowLocalPaths || Boolean(localDevelopment)),\n providerBaseDir,\n targetPath,\n associatedUi: stripUnsafeLocalDevelopment(associatedUi, allowLocalPaths),\n };\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n target?: string,\n extendsRef?: string,\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n if (!development) {\n if (production && target) {\n if (extendsRef) {\n emitConfigWarning(`[Config] Resolving \"${target}\" from ${extendsRef}`);\n } else {\n emitConfigWarning(`[Config] No development target for \"${target}\", using production`);\n }\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\n if (production && target) {\n emitConfigWarning(`[Config] Could not load local target for \"${target}\", using production`);\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n return devTarget;\n}\n\nexport interface BuildRuntimeConfigOptions {\n plugins?: Record<string, RuntimePluginConfig>;\n hostSource?: \"local\" | \"remote\";\n uiSource?: \"local\" | \"remote\";\n apiSource?: \"local\" | \"remote\";\n authSource?: \"local\" | \"remote\";\n proxy?: string;\n}\n\nexport function buildRuntimeConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n options?: BuildRuntimeConfigOptions,\n): RuntimeConfig {\n const uiConfig = config.app.ui;\n const apiConfig = config.app.api;\n const authConfig = config.app.auth;\n const uiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n uiConfig.development,\n uiConfig.production,\n baseDir,\n options?.uiSource,\n \"app.ui\",\n )\n : resolveRuntimeTarget(uiConfig.production, baseDir, \"remote\");\n const apiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n apiConfig.development,\n apiConfig.production,\n baseDir,\n options?.apiSource,\n \"app.api\",\n )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authExtendsRef = authConfig?.extends\n ? resolveExtendsRef(authConfig.extends, env)\n : undefined;\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\n \"app.auth\",\n authExtendsRef,\n )\n : resolveRuntimeTarget(authConfig.production, baseDir, \"remote\")\n : undefined;\n\n const hostConfig = config.app.host;\n const hostRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n hostConfig.development,\n hostConfig.production,\n baseDir,\n options?.hostSource,\n \"app.host\",\n )\n : resolveRuntimeTarget(hostConfig.production, baseDir, \"remote\");\n\n const hostListeningUrl =\n env === \"development\"\n ? resolveDevelopmentHostUrl(hostConfig.development)\n : `http://localhost:${hostRuntime.port ?? DEFAULT_HOST_PORT}`;\n\n const hostIsRemote = hostRuntime.source === \"remote\";\n const uiIsRemote = uiRuntime.source === \"remote\";\n const apiIsRemote = apiRuntime.source === \"remote\";\n const resolvedApiName = resolvePluginRuntimeName(apiConfig.name, apiRuntime.localPath, \"api\");\n\n return {\n env,\n account: config.account,\n domain: config.domain,\n title: config.title,\n description: config.description,\n networkId: getNetworkIdForAccount(config.account),\n repository: config.repository,\n host: {\n name: \"host\",\n url: hostListeningUrl,\n entry: `${hostListeningUrl}/mf-manifest.json`,\n localPath: hostRuntime.localPath,\n port: hostRuntime.port ?? DEFAULT_HOST_PORT,\n secrets: hostConfig.secrets,\n integrity: hostIsRemote ? hostConfig.integrity : undefined,\n source: hostRuntime.source,\n remoteUrl: hostIsRemote ? hostRuntime.url : undefined,\n },\n ui: {\n name: resolvePluginRuntimeName(uiConfig.name, uiRuntime.localPath, \"ui\"),\n url: uiRuntime.url,\n entry: uiRuntime.url ? `${uiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n ssrUrl: uiIsRemote ? uiConfig.ssr : undefined,\n ssrIntegrity: uiIsRemote ? uiConfig.ssrIntegrity : undefined,\n integrity: uiIsRemote ? uiConfig.integrity : undefined,\n source: uiRuntime.source,\n },\n api: {\n name: resolvedApiName,\n url: apiRuntime.url,\n entry: apiRuntime.url ? `${apiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: apiRuntime.localPath,\n port: apiRuntime.port,\n source: apiRuntime.source,\n proxy: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n shared: apiConfig.shared,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n return {\n name: resolvePluginRuntimeName(authConfig.name, authRuntime.localPath, \"auth\"),\n extendsRef: authExtendsRef,\n url: authRuntime.url,\n entry: authRuntime.url ? `${authRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: authRuntime.localPath,\n port: authRuntime.port,\n source: authRuntime.source,\n proxy: authConfig.proxy,\n variables: authConfig.variables,\n secrets: authConfig.secrets,\n integrity: authRuntime.source === \"remote\" ? authConfig.integrity : undefined,\n shared: authConfig.shared,\n };\n })(),\n plugins:\n options?.plugins && Object.keys(options.plugins).length > 0 ? options.plugins : undefined,\n };\n}\n\nasync function loadConfigFile(configPath: string, baseDir: string): Promise<BosConfigInput> {\n if (configPath.startsWith(\"bos://\")) {\n return fetchBosConfigFromFastKv<BosConfigInput>(configPath);\n }\n\n const resolvedPath = isAbsolute(configPath) ? configPath : resolve(baseDir, configPath);\n return JSON.parse(readFileSync(resolvedPath, \"utf-8\")) as BosConfigInput;\n}\n\nasync function resolveConfigWithExtends(\n configPath: string,\n baseDir: string,\n visited: Set<string>,\n chain: string[],\n env: BosEnv = \"development\",\n): Promise<BosConfigInput> {\n if (visited.has(configPath)) {\n throw new Error(`Circular extends detected: ${[...visited, configPath].join(\" -> \")}`);\n }\n\n const config = await loadConfigFile(configPath, baseDir);\n chain.push(configPath);\n\n if (!config.extends) {\n return config;\n }\n\n const extendsRef = resolveExtendsRef(config.extends as string | ExtendsConfig, env);\n if (!extendsRef) {\n return config;\n }\n\n const parsedParentRef = parseExtendsTarget(extendsRef);\n\n const nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = getConfigBaseDir(parsedParentRef.configPath, baseDir);\n const parent = await resolveConfigWithExtends(\n parsedParentRef.configPath,\n parentBaseDir,\n nextVisited,\n chain,\n env,\n );\n\n return mergeBosConfigWithExtends(parent, config);\n}\n\ntype PluginOverrideValue = PluginEntryValue | null | false;\n\nfunction normalizePluginEntry(raw: PluginOverrideValue): BosPluginRef | null | false {\n if (raw === null || raw === false) return raw;\n if (typeof raw === \"string\") {\n return { extends: raw };\n }\n return raw;\n}\n\nasync function resolveRuntimePlugins(\n plugins: Record<string, PluginOverrideValue>,\n baseDir: string,\n env: BosEnv,\n remotePlugins?: string[],\n): Promise<Record<string, RuntimePluginConfig>> {\n const out: Record<string, RuntimePluginConfig> = {};\n\n for (const [pluginId, rawInput] of Object.entries(plugins)) {\n const normalized = normalizePluginEntry(rawInput);\n if (normalized === null || normalized === false) continue;\n\n const resolvedReference = await resolveComposableReference(\n normalized,\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n const forceSource = remotePlugins?.includes(pluginId) ? \"remote\" : undefined;\n const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);\n\n if (!pluginRuntime.localPath && !pluginRuntime.url) {\n continue;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedReference.entry.name !== \"string\"\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n out[pluginId] = pluginRuntime;\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const response = await fetch(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!response.ok) {\n return fallback;\n }\n\n const manifest = (await response.json()) as {\n plugin?: { name?: unknown };\n };\n\n return typeof manifest.plugin?.name === \"string\" && manifest.plugin.name.length > 0\n ? manifest.plugin.name\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nfunction buildRuntimePluginConfig(\n pluginId: string,\n env: BosEnv,\n resolved: ResolvedComposableReference,\n forceSource?: \"local\" | \"remote\",\n): RuntimePluginConfig {\n const source = resolved.entry;\n const development = typeof source.development === \"string\" ? source.development : undefined;\n const production = typeof source.production === \"string\" ? source.production : undefined;\n\n if (production?.startsWith(\"bos://\")) {\n throw new Error(\n `Plugin \"${pluginId}\" has unsupported production target \"${production}\". Use extends: \"bos://account/domain\" for plugin configs or a CDN URL for production.`,\n );\n }\n\n const pluginExtendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(\n development,\n production,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}`,\n pluginExtendsRef,\n )\n : resolveRuntimeTarget(production, resolved.providerBaseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(source.name, runtimeTarget.localPath, pluginId);\n\n const uiConfig = resolved.associatedUi;\n const uiDevelopment =\n typeof uiConfig?.development === \"string\" ? uiConfig.development : undefined;\n const uiProduction = typeof uiConfig?.production === \"string\" ? uiConfig.production : undefined;\n const uiRuntime =\n uiConfig && (uiDevelopment || uiProduction)\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n uiDevelopment,\n uiProduction,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}.ui`,\n )\n : resolveRuntimeTarget(uiProduction, resolved.providerBaseDir, \"remote\")\n : undefined;\n\n const routes = source.routes;\n\n return {\n name: apiName,\n url: runtimeTarget.url,\n entry: runtimeTarget.url\n ? `${runtimeTarget.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: runtimeTarget.source,\n extendsRef: pluginExtendsRef,\n localPath: runtimeTarget.localPath,\n port: runtimeTarget.port,\n proxy: typeof source.proxy === \"string\" ? source.proxy : undefined,\n variables: normalizeJsonRecord(source.variables),\n secrets: normalizeStringArray(source.secrets),\n shared: source.shared,\n integrity: runtimeTarget.source === \"remote\" ? source.integrity : undefined,\n ui: uiRuntime\n ? {\n name: typeof uiConfig?.name === \"string\" ? uiConfig.name : `${apiName}-ui`,\n url: uiRuntime.url,\n entry: uiRuntime.url\n ? `${uiRuntime.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: uiRuntime.source,\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n integrity:\n uiRuntime.source === \"remote\" && typeof uiConfig?.integrity === \"string\"\n ? uiConfig.integrity\n : undefined,\n }\n : undefined,\n routes,\n };\n}\n\nexport function resolvePluginRuntimeName(\n explicitName: string | undefined,\n localPath: string | undefined,\n fallback: string,\n): string {\n if (explicitName) {\n return explicitName;\n }\n\n if (!localPath) {\n return fallback;\n }\n\n try {\n const packageJsonPath = join(localPath, \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { name?: unknown };\n if (typeof packageJson.name === \"string\" && packageJson.name.length > 0) {\n return packageJson.name;\n }\n } catch {}\n\n return fallback;\n}\n\nfunction normalizeJsonValue(value: unknown): JsonValue | undefined {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeJsonValue(item))\n .filter((item): item is JsonValue => item !== undefined);\n }\n\n if (isPlainObject(value)) {\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return out;\n }\n\n return undefined;\n}\n\nfunction normalizeJsonRecord(value: unknown): JsonObject | undefined {\n if (!isPlainObject(value)) return undefined;\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const out = value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\n return out.length > 0 ? out : undefined;\n}\n\nfunction resolveRuntimeTarget(\n value: string | undefined,\n baseDir: string,\n defaultSource: \"local\" | \"remote\" = \"remote\",\n): RuntimeTarget {\n if (!value) {\n return { source: defaultSource, url: \"\" };\n }\n\n if (value.startsWith(LOCAL_PREFIX)) {\n const localTarget = value?.slice(LOCAL_PREFIX.length).trim();\n if (!localTarget) {\n throw new Error(`Invalid local development target: ${value}`);\n }\n\n const localPath = resolve(baseDir, localTarget);\n if (!existsSync(localPath)) {\n return { source: \"local\", url: \"\" };\n }\n\n return {\n source: \"local\",\n url: \"\",\n localPath,\n };\n }\n\n return {\n source: defaultSource,\n url: value.replace(/\\/$/, \"\"),\n port: parsePort(value),\n };\n}\n\nexport function isLocalDevelopmentTarget(\n value: string | undefined,\n): value is `${typeof LOCAL_PREFIX}${string}` {\n return typeof value === \"string\" && value.startsWith(LOCAL_PREFIX);\n}\n\nexport function resolveLocalDevelopmentPath(\n value: string | undefined,\n baseDir: string,\n): string | null {\n if (!isLocalDevelopmentTarget(value)) {\n return null;\n }\n\n const localTarget = value.slice(LOCAL_PREFIX.length).trim();\n return localTarget ? resolve(baseDir, localTarget) : null;\n}\n\nexport function resolveDevelopmentHostUrl(value: string | undefined): string {\n if (!value || isLocalDevelopmentTarget(value)) {\n return `http://localhost:${DEFAULT_HOST_PORT}`;\n }\n\n return value.replace(/\\/$/, \"\");\n}\n\nexport function getHostDevelopmentPort(value: string | undefined): number {\n return parsePort(resolveDevelopmentHostUrl(value));\n}\n\nexport function parsePort(url: string): number {\n try {\n const parsed = new URL(url);\n return parsed.port ? parseInt(parsed.port, 10) : parsed.protocol === \"https:\" ? 443 : 80;\n } catch {\n return 3000;\n }\n}\n\nexport {\n BOS_CONFIG_ORDER,\n mergeBosConfigWithExtends,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.cjs","names":["BosConfigSchema","isPlainObject","bosConfigMerger","rebuildOrderedConfig","resolveExtendsRef","getNetworkIdForAccount","fetchBosConfigFromFastKv","mergeBosConfigWithExtends","fetchJsonOrNull"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fetchBosConfigFromFastKv } from \"./fastkv\";\nimport { fetchJsonOrNull } from \"./http-client\";\nimport {\n type BosEnv,\n bosConfigMerger,\n isPlainObject,\n mergeBosConfigWithExtends,\n type ResolvedConfigMeta,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nimport { getNetworkIdForAccount } from \"./network\";\nimport type {\n BosConfig,\n BosConfigInput,\n BosPluginRef,\n ExtendsConfig,\n JsonObject,\n JsonValue,\n PluginEntryValue,\n RuntimeConfig,\n RuntimePluginConfig,\n} from \"./types\";\nimport { BosConfigSchema } from \"./types\";\n\nconst LOCAL_PREFIX = \"local:\";\nconst DEFAULT_HOST_PORT = 3000;\nconst RESOLVED_CONFIG_FILENAME = \"bos.resolved-config.json\";\n\ntype RuntimeOverrideTarget = \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`;\n\ninterface RuntimeTarget {\n source: \"local\" | \"remote\";\n url: string;\n localPath?: string;\n port?: number;\n}\n\nlet cachedConfig: BosConfig | null = null;\nlet projectRoot: string | null = null;\nlet configWarnings: string[] = [];\nlet suppressConfigWarnings = false;\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n projectRoot = null;\n configWarnings = [];\n}\n\nexport function suppressWarnings(): void {\n suppressConfigWarnings = true;\n}\n\nexport function resumeWarnings(): void {\n suppressConfigWarnings = false;\n}\n\nexport function drainConfigWarnings(): string[] {\n const warnings = [...configWarnings];\n configWarnings = [];\n return warnings;\n}\n\nfunction emitConfigWarning(message: string): void {\n if (suppressConfigWarnings) {\n configWarnings.push(message);\n } else {\n console.warn(message);\n }\n}\n\nconst configPathCache = new Map<string, string | null>();\n\nexport function findConfigPath(cwd?: string): string | null {\n const cacheKey = cwd ?? process.cwd();\n const cached = configPathCache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n let dir = cacheKey;\n while (dir !== \"/\") {\n const configPath = join(dir, \"bos.config.json\");\n if (existsSync(configPath)) {\n configPathCache.set(cacheKey, configPath);\n return configPath;\n }\n dir = dirname(dir);\n }\n configPathCache.set(cacheKey, null);\n return null;\n}\n\nexport function getConfig(): BosConfig | null {\n return cachedConfig;\n}\n\nexport function getProjectRoot(): string {\n if (!projectRoot) {\n throw new Error(\"Config not loaded. Call loadResolvedConfig() first.\");\n }\n return projectRoot;\n}\n\nexport interface ConfigResult {\n config: BosConfig;\n runtime: RuntimeConfig;\n source: {\n path: string;\n extended?: string[];\n remote?: boolean;\n };\n warnings?: string[];\n}\n\nexport interface LocalConfigResult {\n config: BosConfigInput;\n source: {\n path: string;\n };\n}\n\nexport interface RemoteConfigResult {\n rawConfig: BosConfigInput;\n config: BosConfig;\n source: string;\n extendsChain: string[];\n}\n\nexport interface ResolvedComposableReference {\n entry: BosPluginRef;\n providerBaseDir: string;\n targetPath: string;\n associatedUi?: Record<string, unknown>;\n}\n\ninterface ParsedExtendsTarget {\n configPath: string;\n targetPath?: string;\n}\n\nexport async function loadLocalConfig(options?: {\n cwd?: string;\n path?: string;\n}): Promise<LocalConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const config = await loadConfigFile(configPath, baseDir);\n\n projectRoot = baseDir;\n\n return {\n config,\n source: {\n path: configPath,\n },\n };\n}\n\nexport async function loadResolvedConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n remotePlugins?: string[];\n}): Promise<ConfigResult | null> {\n const configPath = options?.path ?? findConfigPath(options?.cwd);\n if (!configPath) {\n projectRoot = options?.cwd ?? process.cwd();\n return null;\n }\n\n const baseDir = dirname(configPath);\n const env = options?.env ?? \"development\";\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n\n try {\n suppressWarnings();\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n configPath,\n baseDir,\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n baseDir,\n runtimeEnv,\n );\n\n cachedConfig = config;\n projectRoot = baseDir;\n\n const pluginRuntime = await resolveRuntimePlugins(\n config.plugins ?? {},\n baseDir,\n runtimeEnv,\n options?.remotePlugins,\n );\n const runtime = buildRuntimeConfig(config, baseDir, runtimeEnv, {\n plugins: pluginRuntime,\n });\n const warnings = drainConfigWarnings();\n resumeWarnings();\n\n return {\n config,\n runtime,\n source: {\n path: configPath,\n extended: extendedChain.length > 0 ? extendedChain : undefined,\n remote: extendedChain.some((entry) => entry.startsWith(\"bos://\")),\n },\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n } catch (error) {\n resumeWarnings();\n if (error instanceof Error) {\n throw new Error(`Failed to load config from ${configPath}: ${error.message}`, {\n cause: error,\n });\n }\n throw new Error(`Failed to load config from ${configPath}: ${String(error)}`);\n }\n}\n\nexport async function loadBosConfig(options?: {\n cwd?: string;\n path?: string;\n env?: BosEnv;\n}): Promise<RuntimeConfig> {\n const result = await loadResolvedConfig(options);\n if (!result) {\n throw new Error(\"No bos.config.json found\");\n }\n\n return result.runtime;\n}\n\nexport async function loadRemoteConfig(\n bosUrl: string,\n env: BosEnv = \"production\",\n): Promise<RemoteConfigResult> {\n const runtimeEnv: BosEnv = env === \"staging\" ? \"production\" : env;\n const extendedChain: string[] = [];\n const parsed = await resolveConfigWithExtends(\n bosUrl,\n process.cwd(),\n new Set(),\n extendedChain,\n env,\n );\n const config = await resolveConfigComposableEntries(\n BosConfigSchema.parse(parsed),\n process.cwd(),\n runtimeEnv,\n );\n\n return {\n rawConfig: await loadConfigFile(bosUrl, process.cwd()),\n config,\n source: bosUrl,\n extendsChain: extendedChain,\n };\n}\n\nexport function parseRuntimeOverrideTargets(value?: string | null): RuntimeOverrideTarget[] {\n if (!value) {\n return [];\n }\n\n return [\n ...new Set(\n value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n ].map((entry) => {\n if (entry === \"ui\" || entry === \"api\" || entry === \"plugins\") {\n return entry;\n }\n\n if (entry.startsWith(\"plugins.\") && entry.length > \"plugins.\".length) {\n return entry as RuntimeOverrideTarget;\n }\n\n throw new Error(`Invalid runtime override target: ${entry}`);\n });\n}\n\nexport function isRuntimeOverrideAllowed(\n allowedTargets: ReadonlyArray<RuntimeOverrideTarget>,\n target: \"ui\" | \"api\" | \"plugins\" | `plugins.${string}`,\n): boolean {\n if (allowedTargets.includes(target as RuntimeOverrideTarget)) {\n return true;\n }\n\n if (target.startsWith(\"plugins.\")) {\n return allowedTargets.includes(\"plugins.*\");\n }\n\n return false;\n}\n\nexport async function buildRuntimePluginsForConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<Record<string, RuntimePluginConfig> | undefined> {\n const plugins = await resolveRuntimePlugins(config.plugins ?? {}, baseDir, env);\n return Object.keys(plugins).length > 0 ? plugins : undefined;\n}\n\nfunction getEntryAssociatedUi(entry: Partial<BosPluginRef>): Record<string, unknown> | undefined {\n if (!isPlainObject(entry.app)) {\n return undefined;\n }\n\n const app = entry.app as Record<string, unknown>;\n if (!isPlainObject(app.ui)) {\n return undefined;\n }\n\n const ui = app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeAssociatedUi(\n parentUi: Record<string, unknown> | undefined,\n childUi: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!parentUi) {\n return childUi ? { ...childUi } : undefined;\n }\n\n if (!childUi) {\n return { ...parentUi };\n }\n\n return bosConfigMerger({ ...childUi }, parentUi) as Record<string, unknown>;\n}\n\nfunction withAssociatedUi(\n entry: BosPluginRef,\n associatedUi?: Record<string, unknown>,\n): BosPluginRef {\n if (!associatedUi) {\n return entry;\n }\n\n const app = isPlainObject(entry.app)\n ? ({ ...(entry.app as Record<string, unknown>) } as Record<string, unknown>)\n : {};\n app.ui = mergeAssociatedUi(getEntryAssociatedUi(entry), associatedUi);\n\n return {\n ...entry,\n app,\n };\n}\n\nexport async function resolveConfigComposableEntries(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n): Promise<BosConfig> {\n const [resolvedApi, resolvedAuth] = await Promise.all([\n resolveComposableReference(config.app.api as BosPluginRef, baseDir, env, \"app.api\"),\n config.app.auth\n ? resolveComposableReference(config.app.auth as BosPluginRef, baseDir, env, \"app.auth\")\n : Promise.resolve(undefined),\n ]);\n\n const resolvedPlugins = config.plugins\n ? Object.fromEntries(\n await Promise.all(\n Object.entries(config.plugins).map(async ([pluginId, pluginValue]) => {\n const resolvedPlugin = await resolveComposableReference(\n asComposableEntry(pluginValue),\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n return [\n pluginId,\n withAssociatedUi(resolvedPlugin.entry, resolvedPlugin.associatedUi),\n ] as const;\n }),\n ),\n )\n : undefined;\n\n return {\n ...config,\n app: {\n ...config.app,\n api: resolvedApi.entry,\n auth: resolvedAuth?.entry,\n },\n plugins: resolvedPlugins,\n };\n}\n\nexport function getResolvedConfigPath(configDir: string): string {\n return join(configDir, \".bos\", RESOLVED_CONFIG_FILENAME);\n}\n\nexport function loadGeneratedResolvedConfig(configDir: string): BosConfig | null {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (!existsSync(resolvedPath)) return null;\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (!isPlainObject(raw)) return null;\n const { _resolved, ...configData } = raw;\n return BosConfigSchema.parse(configData);\n } catch {\n return null;\n }\n}\n\nexport function writeResolvedConfig(\n configDir: string,\n config: BosConfig,\n env: BosEnv,\n extendsChain?: string[],\n source?: string,\n): void {\n const resolvedPath = getResolvedConfigPath(configDir);\n const resolvedDir = dirname(resolvedPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(config);\n const meta: ResolvedConfigMeta = {\n env,\n resolvedAt: new Date().toISOString(),\n extendsChain: extendsChain ?? [],\n ...(source ? { source } : {}),\n };\n const output = {\n _resolved: meta,\n ...ordered,\n };\n\n const content = `${JSON.stringify(output, null, 2)}\\n`;\n try {\n if (readFileSync(resolvedPath, \"utf-8\") === content) return;\n } catch {\n // file doesn't exist yet\n }\n writeFileSync(resolvedPath, content);\n}\n\nexport function resolveBosConfigPath(configDir: string): string {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) return resolvedPath;\n return join(configDir, \"bos.config.json\");\n}\n\nexport function readBosConfigForBuild(configDir: string): Record<string, unknown> {\n const resolvedPath = getResolvedConfigPath(configDir);\n if (existsSync(resolvedPath)) {\n try {\n const raw = JSON.parse(readFileSync(resolvedPath, \"utf-8\"));\n if (isPlainObject(raw)) {\n const { _resolved, ...configData } = raw;\n return configData as Record<string, unknown>;\n }\n } catch {}\n }\n const bosConfigPath = join(configDir, \"bos.config.json\");\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\")) as Record<string, unknown>;\n}\n\nfunction parseExtendsTarget(ref: string): ParsedExtendsTarget {\n const hashIndex = ref.indexOf(\"#\");\n if (hashIndex === -1) {\n return { configPath: ref };\n }\n\n const configPath = ref.slice(0, hashIndex);\n const targetPath = ref.slice(hashIndex + 1);\n return {\n configPath,\n targetPath: targetPath.length > 0 ? targetPath : undefined,\n };\n}\n\nfunction getConfigBaseDir(configPath: string, baseDir: string): string {\n if (configPath.startsWith(\"bos://\")) return baseDir;\n return dirname(isAbsolute(configPath) ? configPath : resolve(baseDir, configPath));\n}\n\nfunction asComposableEntry(value: unknown): BosPluginRef {\n if (value === undefined) {\n return {};\n }\n if (typeof value === \"string\") {\n return { extends: value };\n }\n if (!isPlainObject(value)) {\n throw new Error(`Expected config entry object, received ${typeof value}`);\n }\n return value as BosPluginRef;\n}\n\nfunction getTargetedEntry(config: BosConfigInput, targetPath: string): BosPluginRef {\n if (targetPath.startsWith(\"app.\")) {\n const entryKey = targetPath.slice(\"app.\".length);\n return asComposableEntry(config.app?.[entryKey]);\n }\n\n if (targetPath.startsWith(\"plugins.\")) {\n const pluginId = targetPath.slice(\"plugins.\".length);\n if (pluginId.length === 0) {\n throw new Error(`Invalid plugin target path: ${targetPath}`);\n }\n return asComposableEntry(config.plugins?.[pluginId]);\n }\n\n throw new Error(`Unsupported extends target path: ${targetPath}`);\n}\n\nfunction getAssociatedUi(\n config: BosConfigInput,\n _targetPath: string,\n): Record<string, unknown> | undefined {\n if (!isPlainObject(config.app?.ui)) {\n return undefined;\n }\n\n const ui = config.app.ui as Record<string, unknown>;\n if (\"shared\" in ui) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n return ui;\n}\n\nfunction mergeComposableEntries(\n parent: Partial<BosPluginRef>,\n child: Partial<BosPluginRef>,\n): BosPluginRef {\n return bosConfigMerger({ ...child }, parent) as BosPluginRef;\n}\n\nfunction stripUnsafeLocalDevelopment<T extends Record<string, unknown> | undefined>(\n entry: T,\n allowLocalPaths: boolean,\n): T {\n if (!entry || allowLocalPaths) {\n return entry;\n }\n\n if (typeof entry.development === \"string\" && entry.development.startsWith(LOCAL_PREFIX)) {\n const { development: _ignored, ...rest } = entry;\n return rest as T;\n }\n\n return entry;\n}\n\nexport async function resolveComposableReference(\n source: BosPluginRef,\n baseDir: string,\n env: BosEnv,\n defaultTargetPath: string,\n): Promise<ResolvedComposableReference> {\n let resolvedEntry: BosPluginRef = {};\n let providerBaseDir = baseDir;\n let targetPath = defaultTargetPath;\n let associatedUi = getEntryAssociatedUi(source);\n let allowLocalPaths = false;\n let extendsError: unknown;\n\n const extendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n if (extendsRef) {\n const parsed = parseExtendsTarget(extendsRef);\n targetPath = parsed.targetPath ?? defaultTargetPath;\n const extendsBaseDir = getConfigBaseDir(parsed.configPath, baseDir);\n try {\n const extendedConfig = await resolveConfigWithExtends(\n parsed.configPath,\n extendsBaseDir,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(extendedConfig, targetPath),\n );\n providerBaseDir = extendsBaseDir;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(extendedConfig, targetPath));\n } catch (error) {\n extendsError = error;\n }\n }\n\n const localDevelopment =\n typeof source.development === \"string\" && source.development.startsWith(LOCAL_PREFIX)\n ? source.development\n : undefined;\n const localDevelopmentPath = localDevelopment\n ? resolve(baseDir, localDevelopment.slice(LOCAL_PREFIX.length).trim())\n : undefined;\n const hasUsableLocalDevelopment = Boolean(\n localDevelopmentPath && existsSync(localDevelopmentPath),\n );\n\n if (localDevelopmentPath) {\n const localPath = localDevelopmentPath;\n const localConfigPath = join(localPath, \"bos.config.json\");\n if (existsSync(localConfigPath)) {\n const localConfig = await resolveConfigWithExtends(\n localConfigPath,\n localPath,\n new Set(),\n [],\n env,\n );\n resolvedEntry = mergeComposableEntries(\n resolvedEntry,\n getTargetedEntry(localConfig, targetPath),\n );\n providerBaseDir = localPath;\n associatedUi = mergeAssociatedUi(associatedUi, getAssociatedUi(localConfig, targetPath));\n allowLocalPaths = true;\n }\n }\n\n const sourceOverrides = { ...source };\n if (allowLocalPaths && localDevelopment) {\n delete sourceOverrides.development;\n }\n\n resolvedEntry = mergeComposableEntries(resolvedEntry, sourceOverrides);\n associatedUi = mergeAssociatedUi(associatedUi, getEntryAssociatedUi(sourceOverrides));\n\n if (extendsError && !allowLocalPaths && !hasUsableLocalDevelopment) {\n throw extendsError;\n }\n\n return {\n entry: stripUnsafeLocalDevelopment(resolvedEntry, allowLocalPaths || Boolean(localDevelopment)),\n providerBaseDir,\n targetPath,\n associatedUi: stripUnsafeLocalDevelopment(associatedUi, allowLocalPaths),\n };\n}\n\nfunction resolveDevelopmentTarget(\n development: string | undefined,\n production: string | undefined,\n baseDir: string,\n forceSource?: \"local\" | \"remote\",\n target?: string,\n extendsRef?: string,\n): RuntimeTarget {\n if (forceSource === \"remote\") {\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n if (!development) {\n if (production && target) {\n if (extendsRef) {\n emitConfigWarning(`[Config] Resolving \"${target}\" from ${extendsRef}`);\n } else {\n emitConfigWarning(`[Config] No development target for \"${target}\", using production`);\n }\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n const devTarget = resolveRuntimeTarget(development, baseDir);\n if (devTarget.source === \"local\" && (!devTarget.localPath || !existsSync(devTarget.localPath))) {\n if (production && target) {\n emitConfigWarning(`[Config] Could not load local target for \"${target}\", using production`);\n }\n return resolveRuntimeTarget(production, baseDir, \"remote\");\n }\n return devTarget;\n}\n\nexport interface BuildRuntimeConfigOptions {\n plugins?: Record<string, RuntimePluginConfig>;\n hostSource?: \"local\" | \"remote\";\n uiSource?: \"local\" | \"remote\";\n apiSource?: \"local\" | \"remote\";\n authSource?: \"local\" | \"remote\";\n proxy?: string;\n}\n\nexport function buildRuntimeConfig(\n config: BosConfig,\n baseDir: string,\n env: BosEnv,\n options?: BuildRuntimeConfigOptions,\n): RuntimeConfig {\n const uiConfig = config.app.ui;\n const apiConfig = config.app.api;\n const authConfig = config.app.auth;\n const uiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n uiConfig.development,\n uiConfig.production,\n baseDir,\n options?.uiSource,\n \"app.ui\",\n )\n : resolveRuntimeTarget(uiConfig.production, baseDir, \"remote\");\n const apiRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n apiConfig.development,\n apiConfig.production,\n baseDir,\n options?.apiSource,\n \"app.api\",\n )\n : resolveRuntimeTarget(apiConfig.production, baseDir, \"remote\");\n const authExtendsRef = authConfig?.extends\n ? resolveExtendsRef(authConfig.extends, env)\n : undefined;\n const authRuntime = authConfig\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n authConfig.development,\n authConfig.production,\n baseDir,\n options?.authSource,\n \"app.auth\",\n authExtendsRef,\n )\n : resolveRuntimeTarget(authConfig.production, baseDir, \"remote\")\n : undefined;\n\n const hostConfig = config.app.host;\n const hostRuntime =\n env === \"development\"\n ? resolveDevelopmentTarget(\n hostConfig.development,\n hostConfig.production,\n baseDir,\n options?.hostSource,\n \"app.host\",\n )\n : resolveRuntimeTarget(hostConfig.production, baseDir, \"remote\");\n\n const hostListeningUrl =\n env === \"development\"\n ? resolveDevelopmentHostUrl(hostConfig.development)\n : `http://localhost:${hostRuntime.port ?? DEFAULT_HOST_PORT}`;\n\n const hostIsRemote = hostRuntime.source === \"remote\";\n const uiIsRemote = uiRuntime.source === \"remote\";\n const apiIsRemote = apiRuntime.source === \"remote\";\n const resolvedApiName = resolvePluginRuntimeName(apiConfig.name, apiRuntime.localPath, \"api\");\n\n return {\n env,\n account: config.account,\n domain: config.domain,\n title: config.title,\n description: config.description,\n networkId: getNetworkIdForAccount(config.account),\n repository: config.repository,\n host: {\n name: \"host\",\n url: hostListeningUrl,\n entry: `${hostListeningUrl}/mf-manifest.json`,\n localPath: hostRuntime.localPath,\n port: hostRuntime.port ?? DEFAULT_HOST_PORT,\n secrets: hostConfig.secrets,\n integrity: hostIsRemote ? hostConfig.integrity : undefined,\n source: hostRuntime.source,\n remoteUrl: hostIsRemote ? hostRuntime.url : undefined,\n },\n ui: {\n name: resolvePluginRuntimeName(uiConfig.name, uiRuntime.localPath, \"ui\"),\n url: uiRuntime.url,\n entry: uiRuntime.url ? `${uiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n ssrUrl: uiIsRemote ? uiConfig.ssr : undefined,\n ssrIntegrity: uiIsRemote ? uiConfig.ssrIntegrity : undefined,\n integrity: uiIsRemote ? uiConfig.integrity : undefined,\n source: uiRuntime.source,\n },\n api: {\n name: resolvedApiName,\n url: apiRuntime.url,\n entry: apiRuntime.url ? `${apiRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: apiRuntime.localPath,\n port: apiRuntime.port,\n source: apiRuntime.source,\n proxy: options?.proxy ?? apiConfig.proxy,\n variables: apiConfig.variables,\n secrets: apiConfig.secrets,\n integrity: apiIsRemote ? apiConfig.integrity : undefined,\n shared: apiConfig.shared,\n },\n auth: (() => {\n if (!authConfig || !authRuntime) return undefined;\n if (!authRuntime.localPath && !authRuntime.url) return undefined;\n return {\n name: resolvePluginRuntimeName(authConfig.name, authRuntime.localPath, \"auth\"),\n extendsRef: authExtendsRef,\n url: authRuntime.url,\n entry: authRuntime.url ? `${authRuntime.url}/mf-manifest.json` : \"/mf-manifest.json\",\n localPath: authRuntime.localPath,\n port: authRuntime.port,\n source: authRuntime.source,\n proxy: authConfig.proxy,\n variables: authConfig.variables,\n secrets: authConfig.secrets,\n integrity: authRuntime.source === \"remote\" ? authConfig.integrity : undefined,\n shared: authConfig.shared,\n };\n })(),\n plugins:\n options?.plugins && Object.keys(options.plugins).length > 0 ? options.plugins : undefined,\n };\n}\n\nasync function loadConfigFile(configPath: string, baseDir: string): Promise<BosConfigInput> {\n if (configPath.startsWith(\"bos://\")) {\n return fetchBosConfigFromFastKv<BosConfigInput>(configPath);\n }\n\n const resolvedPath = isAbsolute(configPath) ? configPath : resolve(baseDir, configPath);\n return JSON.parse(readFileSync(resolvedPath, \"utf-8\")) as BosConfigInput;\n}\n\nasync function resolveConfigWithExtends(\n configPath: string,\n baseDir: string,\n visited: Set<string>,\n chain: string[],\n env: BosEnv = \"development\",\n): Promise<BosConfigInput> {\n if (visited.has(configPath)) {\n throw new Error(`Circular extends detected: ${[...visited, configPath].join(\" -> \")}`);\n }\n\n const config = await loadConfigFile(configPath, baseDir);\n chain.push(configPath);\n\n if (!config.extends) {\n return config;\n }\n\n const extendsRef = resolveExtendsRef(config.extends as string | ExtendsConfig, env);\n if (!extendsRef) {\n return config;\n }\n\n const parsedParentRef = parseExtendsTarget(extendsRef);\n\n const nextVisited = new Set(visited);\n nextVisited.add(configPath);\n const parentBaseDir = getConfigBaseDir(parsedParentRef.configPath, baseDir);\n const parent = await resolveConfigWithExtends(\n parsedParentRef.configPath,\n parentBaseDir,\n nextVisited,\n chain,\n env,\n );\n\n return mergeBosConfigWithExtends(parent, config);\n}\n\ntype PluginOverrideValue = PluginEntryValue | null | false;\n\nfunction normalizePluginEntry(raw: PluginOverrideValue): BosPluginRef | null | false {\n if (raw === null || raw === false) return raw;\n if (typeof raw === \"string\") {\n return { extends: raw };\n }\n return raw;\n}\n\nasync function resolveRuntimePlugins(\n plugins: Record<string, PluginOverrideValue>,\n baseDir: string,\n env: BosEnv,\n remotePlugins?: string[],\n): Promise<Record<string, RuntimePluginConfig>> {\n const entries = Object.entries(plugins)\n .map(([pluginId, rawInput]) => ({\n pluginId,\n normalized: normalizePluginEntry(rawInput),\n }))\n .filter(\n (entry): entry is { pluginId: string; normalized: BosPluginRef } =>\n entry.normalized !== null && entry.normalized !== false,\n );\n\n const resolved = await Promise.all(\n entries.map(async ({ pluginId, normalized }) => {\n const resolvedReference = await resolveComposableReference(\n normalized,\n baseDir,\n env,\n `plugins.${pluginId}`,\n );\n\n const forceSource = remotePlugins?.includes(pluginId) ? \"remote\" : undefined;\n const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);\n\n if (!pluginRuntime.localPath && !pluginRuntime.url) {\n return null;\n }\n\n if (\n pluginRuntime.source === \"remote\" &&\n pluginRuntime.url &&\n !pluginRuntime.localPath &&\n typeof resolvedReference.entry.name !== \"string\"\n ) {\n pluginRuntime.name = await resolveRemotePluginRuntimeName(\n pluginRuntime.url,\n pluginRuntime.name,\n );\n }\n\n return [pluginId, pluginRuntime] as const;\n }),\n );\n\n const out: Record<string, RuntimePluginConfig> = {};\n for (const entry of resolved) {\n if (entry) {\n out[entry[0]] = entry[1];\n }\n }\n\n return out;\n}\n\nasync function resolveRemotePluginRuntimeName(baseUrl: string, fallback: string): Promise<string> {\n const manifest = await fetchJsonOrNull<{\n plugin?: { name?: unknown };\n }>(`${baseUrl.replace(/\\/$/, \"\")}/plugin.manifest.json`, { retries: 0 });\n\n return typeof manifest?.plugin?.name === \"string\" && manifest.plugin.name.length > 0\n ? manifest.plugin.name\n : fallback;\n}\n\nfunction buildRuntimePluginConfig(\n pluginId: string,\n env: BosEnv,\n resolved: ResolvedComposableReference,\n forceSource?: \"local\" | \"remote\",\n): RuntimePluginConfig {\n const source = resolved.entry;\n const development = typeof source.development === \"string\" ? source.development : undefined;\n const production = typeof source.production === \"string\" ? source.production : undefined;\n\n if (production?.startsWith(\"bos://\")) {\n throw new Error(\n `Plugin \"${pluginId}\" has unsupported production target \"${production}\". Use extends: \"bos://account/domain\" for plugin configs or a CDN URL for production.`,\n );\n }\n\n const pluginExtendsRef = source.extends ? resolveExtendsRef(source.extends, env) : undefined;\n\n const runtimeTarget =\n env === \"development\"\n ? resolveDevelopmentTarget(\n development,\n production,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}`,\n pluginExtendsRef,\n )\n : resolveRuntimeTarget(production, resolved.providerBaseDir, \"remote\");\n const apiName = resolvePluginRuntimeName(source.name, runtimeTarget.localPath, pluginId);\n\n const uiConfig = resolved.associatedUi;\n const uiDevelopment =\n typeof uiConfig?.development === \"string\" ? uiConfig.development : undefined;\n const uiProduction = typeof uiConfig?.production === \"string\" ? uiConfig.production : undefined;\n const uiRuntime =\n uiConfig && (uiDevelopment || uiProduction)\n ? env === \"development\"\n ? resolveDevelopmentTarget(\n uiDevelopment,\n uiProduction,\n resolved.providerBaseDir,\n forceSource,\n `plugins.${pluginId}.ui`,\n )\n : resolveRuntimeTarget(uiProduction, resolved.providerBaseDir, \"remote\")\n : undefined;\n\n const routes = source.routes;\n\n return {\n name: apiName,\n url: runtimeTarget.url,\n entry: runtimeTarget.url\n ? `${runtimeTarget.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: runtimeTarget.source,\n extendsRef: pluginExtendsRef,\n localPath: runtimeTarget.localPath,\n port: runtimeTarget.port,\n proxy: typeof source.proxy === \"string\" ? source.proxy : undefined,\n variables: normalizeJsonRecord(source.variables),\n secrets: normalizeStringArray(source.secrets),\n shared: source.shared,\n integrity: runtimeTarget.source === \"remote\" ? source.integrity : undefined,\n ui: uiRuntime\n ? {\n name: typeof uiConfig?.name === \"string\" ? uiConfig.name : `${apiName}-ui`,\n url: uiRuntime.url,\n entry: uiRuntime.url\n ? `${uiRuntime.url.replace(/\\/$/, \"\")}/mf-manifest.json`\n : \"/mf-manifest.json\",\n source: uiRuntime.source,\n localPath: uiRuntime.localPath,\n port: uiRuntime.port,\n integrity:\n uiRuntime.source === \"remote\" && typeof uiConfig?.integrity === \"string\"\n ? uiConfig.integrity\n : undefined,\n }\n : undefined,\n routes,\n };\n}\n\nexport function resolvePluginRuntimeName(\n explicitName: string | undefined,\n localPath: string | undefined,\n fallback: string,\n): string {\n if (explicitName) {\n return explicitName;\n }\n\n if (!localPath) {\n return fallback;\n }\n\n try {\n const packageJsonPath = join(localPath, \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { name?: unknown };\n if (typeof packageJson.name === \"string\" && packageJson.name.length > 0) {\n return packageJson.name;\n }\n } catch {}\n\n return fallback;\n}\n\nfunction normalizeJsonValue(value: unknown): JsonValue | undefined {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeJsonValue(item))\n .filter((item): item is JsonValue => item !== undefined);\n }\n\n if (isPlainObject(value)) {\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return out;\n }\n\n return undefined;\n}\n\nfunction normalizeJsonRecord(value: unknown): JsonObject | undefined {\n if (!isPlainObject(value)) return undefined;\n const out: JsonObject = {};\n for (const [key, raw] of Object.entries(value)) {\n const normalized = normalizeJsonValue(raw);\n if (normalized !== undefined) {\n out[key] = normalized;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const out = value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\n return out.length > 0 ? out : undefined;\n}\n\nfunction resolveRuntimeTarget(\n value: string | undefined,\n baseDir: string,\n defaultSource: \"local\" | \"remote\" = \"remote\",\n): RuntimeTarget {\n if (!value) {\n return { source: defaultSource, url: \"\" };\n }\n\n if (value.startsWith(LOCAL_PREFIX)) {\n const localTarget = value?.slice(LOCAL_PREFIX.length).trim();\n if (!localTarget) {\n throw new Error(`Invalid local development target: ${value}`);\n }\n\n const localPath = resolve(baseDir, localTarget);\n if (!existsSync(localPath)) {\n return { source: \"local\", url: \"\" };\n }\n\n return {\n source: \"local\",\n url: \"\",\n localPath,\n };\n }\n\n return {\n source: defaultSource,\n url: value.replace(/\\/$/, \"\"),\n port: parsePort(value),\n };\n}\n\nexport function isLocalDevelopmentTarget(\n value: string | undefined,\n): value is `${typeof LOCAL_PREFIX}${string}` {\n return typeof value === \"string\" && value.startsWith(LOCAL_PREFIX);\n}\n\nexport function resolveLocalDevelopmentPath(\n value: string | undefined,\n baseDir: string,\n): string | null {\n if (!isLocalDevelopmentTarget(value)) {\n return null;\n }\n\n const localTarget = value.slice(LOCAL_PREFIX.length).trim();\n return localTarget ? resolve(baseDir, localTarget) : null;\n}\n\nexport function resolveDevelopmentHostUrl(value: string | undefined): string {\n if (!value || isLocalDevelopmentTarget(value)) {\n return `http://localhost:${DEFAULT_HOST_PORT}`;\n }\n\n return value.replace(/\\/$/, \"\");\n}\n\nexport function getHostDevelopmentPort(value: string | undefined): number {\n return parsePort(resolveDevelopmentHostUrl(value));\n}\n\nexport function parsePort(url: string): number {\n try {\n const parsed = new URL(url);\n return parsed.port ? parseInt(parsed.port, 10) : parsed.protocol === \"https:\" ? 443 : 80;\n } catch {\n return 3000;\n }\n}\n\nexport {\n BOS_CONFIG_ORDER,\n mergeBosConfigWithExtends,\n rebuildOrderedConfig,\n resolveExtendsRef,\n} from \"./merge\";\nexport type { BosConfig, RuntimeConfig } from \"./types\";\nexport { BosConfigSchema } from \"./types\";\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.cts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cA0BM,YAAA;AAAA,KAID,qBAAA;AAAA,iBAcW,gBAAA,CAAA;AAAA,iBAMA,gBAAA,CAAA;AAAA,iBAIA,cAAA,CAAA;AAAA,iBAIA,mBAAA,CAAA;AAAA,iBAcA,cAAA,CAAe,GAAA;AAAA,iBAYf,SAAA,CAAA,GAAa,SAAA;AAAA,iBAIb,cAAA,CAAA;AAAA,UAOC,YAAA;EACf,MAAA,EAAQ,SAAA;EACR,OAAA,EAAS,aAAA;EACT,MAAA;IACE,IAAA;IACA,QAAA;IACA,MAAA;EAAA;EAEF,QAAA;AAAA;AAAA,UAGe,iBAAA;EACf,MAAA,EAAQ,cAAA;EACR,MAAA;IACE,IAAA;EAAA;AAAA;AAAA,UAIa,kBAAA;EACf,SAAA,EAAW,cAAA;EACX,MAAA,EAAQ,SAAA;EACR,MAAA;EACA,YAAA;AAAA;AAAA,UAGe,2BAAA;EACf,KAAA,EAAO,YAAA;EACP,eAAA;EACA,UAAA;EACA,YAAA,GAAe,MAAA;AAAA;AAAA,iBAQK,eAAA,CAAgB,OAAA;EACpC,GAAA;EACA,IAAA;AAAA,IACE,OAAA,CAAQ,iBAAA;AAAA,iBAoBU,kBAAA,CAAmB,OAAA;EACvC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;EACN,aAAA;AAAA,IACE,OAAA,CAAQ,YAAA;AAAA,iBA0DU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,gBAAA,CACpB,MAAA,UACA,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,kBAAA;AAAA,iBAwBK,2BAAA,CAA4B,KAAA,mBAAwB,qBAAA;AAAA,iBAyBpD,wBAAA,CACd,cAAA,EAAgB,aAAA,CAAc,qBAAA,GAC9B,MAAA;AAAA,iBAaoB,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBA2DJ,8BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,SAAA;AAAA,iBA0CK,qBAAA,CAAsB,SAAA;AAAA,iBAItB,2BAAA,CAA4B,SAAA,WAAoB,SAAA;AAAA,iBAahD,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,iBAyGpC,0BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,iBAAA,WACC,OAAA,CAAQ,2BAAA;AAAA,UAmHM,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBAmVa,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAuGc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
1
+ {"version":3,"file":"config.d.cts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cA2BM,YAAA;AAAA,KAID,qBAAA;AAAA,iBAcW,gBAAA,CAAA;AAAA,iBAMA,gBAAA,CAAA;AAAA,iBAIA,cAAA,CAAA;AAAA,iBAIA,mBAAA,CAAA;AAAA,iBAgBA,cAAA,CAAe,GAAA;AAAA,iBAkBf,SAAA,CAAA,GAAa,SAAA;AAAA,iBAIb,cAAA,CAAA;AAAA,UAOC,YAAA;EACf,MAAA,EAAQ,SAAA;EACR,OAAA,EAAS,aAAA;EACT,MAAA;IACE,IAAA;IACA,QAAA;IACA,MAAA;EAAA;EAEF,QAAA;AAAA;AAAA,UAGe,iBAAA;EACf,MAAA,EAAQ,cAAA;EACR,MAAA;IACE,IAAA;EAAA;AAAA;AAAA,UAIa,kBAAA;EACf,SAAA,EAAW,cAAA;EACX,MAAA,EAAQ,SAAA;EACR,MAAA;EACA,YAAA;AAAA;AAAA,UAGe,2BAAA;EACf,KAAA,EAAO,YAAA;EACP,eAAA;EACA,UAAA;EACA,YAAA,GAAe,MAAA;AAAA;AAAA,iBAQK,eAAA,CAAgB,OAAA;EACpC,GAAA;EACA,IAAA;AAAA,IACE,OAAA,CAAQ,iBAAA;AAAA,iBAoBU,kBAAA,CAAmB,OAAA;EACvC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;EACN,aAAA;AAAA,IACE,OAAA,CAAQ,YAAA;AAAA,iBA+DU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,gBAAA,CACpB,MAAA,UACA,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,kBAAA;AAAA,iBAwBK,2BAAA,CAA4B,KAAA,mBAAwB,qBAAA;AAAA,iBAyBpD,wBAAA,CACd,cAAA,EAAgB,aAAA,CAAc,qBAAA,GAC9B,MAAA;AAAA,iBAaoB,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBA2DJ,8BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,SAAA;AAAA,iBAuCK,qBAAA,CAAsB,SAAA;AAAA,iBAItB,2BAAA,CAA4B,SAAA,WAAoB,SAAA;AAAA,iBAahD,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,iBAyGpC,0BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,iBAAA,WACC,OAAA,CAAQ,2BAAA;AAAA,UAmHM,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBAmVa,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAuGc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cA0BM,YAAA;AAAA,KAID,qBAAA;AAAA,iBAcW,gBAAA,CAAA;AAAA,iBAMA,gBAAA,CAAA;AAAA,iBAIA,cAAA,CAAA;AAAA,iBAIA,mBAAA,CAAA;AAAA,iBAcA,cAAA,CAAe,GAAA;AAAA,iBAYf,SAAA,CAAA,GAAa,SAAA;AAAA,iBAIb,cAAA,CAAA;AAAA,UAOC,YAAA;EACf,MAAA,EAAQ,SAAA;EACR,OAAA,EAAS,aAAA;EACT,MAAA;IACE,IAAA;IACA,QAAA;IACA,MAAA;EAAA;EAEF,QAAA;AAAA;AAAA,UAGe,iBAAA;EACf,MAAA,EAAQ,cAAA;EACR,MAAA;IACE,IAAA;EAAA;AAAA;AAAA,UAIa,kBAAA;EACf,SAAA,EAAW,cAAA;EACX,MAAA,EAAQ,SAAA;EACR,MAAA;EACA,YAAA;AAAA;AAAA,UAGe,2BAAA;EACf,KAAA,EAAO,YAAA;EACP,eAAA;EACA,UAAA;EACA,YAAA,GAAe,MAAA;AAAA;AAAA,iBAQK,eAAA,CAAgB,OAAA;EACpC,GAAA;EACA,IAAA;AAAA,IACE,OAAA,CAAQ,iBAAA;AAAA,iBAoBU,kBAAA,CAAmB,OAAA;EACvC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;EACN,aAAA;AAAA,IACE,OAAA,CAAQ,YAAA;AAAA,iBA0DU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,gBAAA,CACpB,MAAA,UACA,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,kBAAA;AAAA,iBAwBK,2BAAA,CAA4B,KAAA,mBAAwB,qBAAA;AAAA,iBAyBpD,wBAAA,CACd,cAAA,EAAgB,aAAA,CAAc,qBAAA,GAC9B,MAAA;AAAA,iBAaoB,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBA2DJ,8BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,SAAA;AAAA,iBA0CK,qBAAA,CAAsB,SAAA;AAAA,iBAItB,2BAAA,CAA4B,SAAA,WAAoB,SAAA;AAAA,iBAahD,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,iBAyGpC,0BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,iBAAA,WACC,OAAA,CAAQ,2BAAA;AAAA,UAmHM,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBAmVa,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAuGc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../src/config.ts"],"mappings":";;;;cA2BM,YAAA;AAAA,KAID,qBAAA;AAAA,iBAcW,gBAAA,CAAA;AAAA,iBAMA,gBAAA,CAAA;AAAA,iBAIA,cAAA,CAAA;AAAA,iBAIA,mBAAA,CAAA;AAAA,iBAgBA,cAAA,CAAe,GAAA;AAAA,iBAkBf,SAAA,CAAA,GAAa,SAAA;AAAA,iBAIb,cAAA,CAAA;AAAA,UAOC,YAAA;EACf,MAAA,EAAQ,SAAA;EACR,OAAA,EAAS,aAAA;EACT,MAAA;IACE,IAAA;IACA,QAAA;IACA,MAAA;EAAA;EAEF,QAAA;AAAA;AAAA,UAGe,iBAAA;EACf,MAAA,EAAQ,cAAA;EACR,MAAA;IACE,IAAA;EAAA;AAAA;AAAA,UAIa,kBAAA;EACf,SAAA,EAAW,cAAA;EACX,MAAA,EAAQ,SAAA;EACR,MAAA;EACA,YAAA;AAAA;AAAA,UAGe,2BAAA;EACf,KAAA,EAAO,YAAA;EACP,eAAA;EACA,UAAA;EACA,YAAA,GAAe,MAAA;AAAA;AAAA,iBAQK,eAAA,CAAgB,OAAA;EACpC,GAAA;EACA,IAAA;AAAA,IACE,OAAA,CAAQ,iBAAA;AAAA,iBAoBU,kBAAA,CAAmB,OAAA;EACvC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;EACN,aAAA;AAAA,IACE,OAAA,CAAQ,YAAA;AAAA,iBA+DU,aAAA,CAAc,OAAA;EAClC,GAAA;EACA,IAAA;EACA,GAAA,GAAM,MAAA;AAAA,IACJ,OAAA,CAAQ,aAAA;AAAA,iBASU,gBAAA,CACpB,MAAA,UACA,GAAA,GAAK,MAAA,GACJ,OAAA,CAAQ,kBAAA;AAAA,iBAwBK,2BAAA,CAA4B,KAAA,mBAAwB,qBAAA;AAAA,iBAyBpD,wBAAA,CACd,cAAA,EAAgB,aAAA,CAAc,qBAAA,GAC9B,MAAA;AAAA,iBAaoB,4BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,MAAA,SAAe,mBAAA;AAAA,iBA2DJ,8BAAA,CACpB,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,GACJ,OAAA,CAAQ,SAAA;AAAA,iBAuCK,qBAAA,CAAsB,SAAA;AAAA,iBAItB,2BAAA,CAA4B,SAAA,WAAoB,SAAA;AAAA,iBAahD,mBAAA,CACd,SAAA,UACA,MAAA,EAAQ,SAAA,EACR,GAAA,EAAK,MAAA,EACL,YAAA,aACA,MAAA;AAAA,iBA6Bc,oBAAA,CAAqB,SAAA;AAAA,iBAMrB,qBAAA,CAAsB,SAAA,WAAoB,MAAA;AAAA,iBAyGpC,0BAAA,CACpB,MAAA,EAAQ,YAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,iBAAA,WACC,OAAA,CAAQ,2BAAA;AAAA,UAmHM,yBAAA;EACf,OAAA,GAAU,MAAA,SAAe,mBAAA;EACzB,UAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,iBAGc,kBAAA,CACd,MAAA,EAAQ,SAAA,EACR,OAAA,UACA,GAAA,EAAK,MAAA,EACL,OAAA,GAAU,yBAAA,GACT,aAAA;AAAA,iBAmVa,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAuGc,wBAAA,CACd,KAAA,uBACC,KAAA,cAAmB,YAAA;AAAA,iBAIN,2BAAA,CACd,KAAA,sBACA,OAAA;AAAA,iBAUc,yBAAA,CAA0B,KAAA;AAAA,iBAQ1B,sBAAA,CAAuB,KAAA;AAAA,iBAIvB,SAAA,CAAU,GAAA"}
package/dist/config.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import { fetchJsonOrNull } from "./http-client.mjs";
1
2
  import { fetchBosConfigFromFastKv } from "./fastkv.mjs";
2
3
  import { BOS_CONFIG_ORDER, bosConfigMerger, isPlainObject, mergeBosConfigWithExtends, rebuildOrderedConfig, resolveExtendsRef } from "./merge.mjs";
3
4
  import { getNetworkIdForAccount } from "./network.mjs";
@@ -33,13 +34,21 @@ function emitConfigWarning(message) {
33
34
  if (suppressConfigWarnings) configWarnings.push(message);
34
35
  else console.warn(message);
35
36
  }
37
+ const configPathCache = /* @__PURE__ */ new Map();
36
38
  function findConfigPath(cwd) {
37
- let dir = cwd ?? process.cwd();
39
+ const cacheKey = cwd ?? process.cwd();
40
+ const cached = configPathCache.get(cacheKey);
41
+ if (cached !== void 0) return cached;
42
+ let dir = cacheKey;
38
43
  while (dir !== "/") {
39
44
  const configPath = join(dir, "bos.config.json");
40
- if (existsSync(configPath)) return configPath;
45
+ if (existsSync(configPath)) {
46
+ configPathCache.set(cacheKey, configPath);
47
+ return configPath;
48
+ }
41
49
  dir = dirname(dir);
42
50
  }
51
+ configPathCache.set(cacheKey, null);
43
52
  return null;
44
53
  }
45
54
  function getConfig() {
@@ -94,7 +103,8 @@ async function loadResolvedConfig(options) {
94
103
  };
95
104
  } catch (error) {
96
105
  resumeWarnings();
97
- throw new Error(`Failed to load config from ${configPath}: ${error}`);
106
+ if (error instanceof Error) throw new Error(`Failed to load config from ${configPath}: ${error.message}`, { cause: error });
107
+ throw new Error(`Failed to load config from ${configPath}: ${String(error)}`);
98
108
  }
99
109
  }
100
110
  async function loadBosConfig(options) {
@@ -154,8 +164,7 @@ function withAssociatedUi(entry, associatedUi) {
154
164
  };
155
165
  }
156
166
  async function resolveConfigComposableEntries(config, baseDir, env) {
157
- const resolvedApi = await resolveComposableReference(config.app.api, baseDir, env, "app.api");
158
- const resolvedAuth = config.app.auth ? await resolveComposableReference(config.app.auth, baseDir, env, "app.auth") : void 0;
167
+ const [resolvedApi, resolvedAuth] = await Promise.all([resolveComposableReference(config.app.api, baseDir, env, "app.api"), config.app.auth ? resolveComposableReference(config.app.auth, baseDir, env, "app.auth") : Promise.resolve(void 0)]);
159
168
  const resolvedPlugins = config.plugins ? Object.fromEntries(await Promise.all(Object.entries(config.plugins).map(async ([pluginId, pluginValue]) => {
160
169
  const resolvedPlugin = await resolveComposableReference(asComposableEntry(pluginValue), baseDir, env, `plugins.${pluginId}`);
161
170
  return [pluginId, withAssociatedUi(resolvedPlugin.entry, resolvedPlugin.associatedUi)];
@@ -392,6 +401,7 @@ function buildRuntimeConfig(config, baseDir, env, options) {
392
401
  },
393
402
  auth: (() => {
394
403
  if (!authConfig || !authRuntime) return void 0;
404
+ if (!authRuntime.localPath && !authRuntime.url) return void 0;
395
405
  return {
396
406
  name: resolvePluginRuntimeName(authConfig.name, authRuntime.localPath, "auth"),
397
407
  extendsRef: authExtendsRef,
@@ -434,30 +444,24 @@ function normalizePluginEntry(raw) {
434
444
  return raw;
435
445
  }
436
446
  async function resolveRuntimePlugins(plugins, baseDir, env, remotePlugins) {
437
- const out = {};
438
- for (const [pluginId, rawInput] of Object.entries(plugins)) {
439
- const normalized = normalizePluginEntry(rawInput);
440
- if (normalized === null || normalized === false) continue;
447
+ const entries = Object.entries(plugins).map(([pluginId, rawInput]) => ({
448
+ pluginId,
449
+ normalized: normalizePluginEntry(rawInput)
450
+ })).filter((entry) => entry.normalized !== null && entry.normalized !== false);
451
+ const resolved = await Promise.all(entries.map(async ({ pluginId, normalized }) => {
441
452
  const resolvedReference = await resolveComposableReference(normalized, baseDir, env, `plugins.${pluginId}`);
442
453
  const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, remotePlugins?.includes(pluginId) ? "remote" : void 0);
443
- if (!pluginRuntime.localPath && !pluginRuntime.url) continue;
454
+ if (!pluginRuntime.localPath && !pluginRuntime.url) return null;
444
455
  if (pluginRuntime.source === "remote" && pluginRuntime.url && !pluginRuntime.localPath && typeof resolvedReference.entry.name !== "string") pluginRuntime.name = await resolveRemotePluginRuntimeName(pluginRuntime.url, pluginRuntime.name);
445
- out[pluginId] = pluginRuntime;
446
- }
456
+ return [pluginId, pluginRuntime];
457
+ }));
458
+ const out = {};
459
+ for (const entry of resolved) if (entry) out[entry[0]] = entry[1];
447
460
  return out;
448
461
  }
449
462
  async function resolveRemotePluginRuntimeName(baseUrl, fallback) {
450
- try {
451
- const controller = new AbortController();
452
- const timeout = setTimeout(() => controller.abort(), 5e3);
453
- const response = await fetch(`${baseUrl.replace(/\/$/, "")}/plugin.manifest.json`, { signal: controller.signal });
454
- clearTimeout(timeout);
455
- if (!response.ok) return fallback;
456
- const manifest = await response.json();
457
- return typeof manifest.plugin?.name === "string" && manifest.plugin.name.length > 0 ? manifest.plugin.name : fallback;
458
- } catch {
459
- return fallback;
460
- }
463
+ const manifest = await fetchJsonOrNull(`${baseUrl.replace(/\/$/, "")}/plugin.manifest.json`, { retries: 0 });
464
+ return typeof manifest?.plugin?.name === "string" && manifest.plugin.name.length > 0 ? manifest.plugin.name : fallback;
461
465
  }
462
466
  function buildRuntimePluginConfig(pluginId, env, resolved, forceSource) {
463
467
  const source = resolved.entry;