everything-dev 1.51.5 → 1.51.7

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 (238) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +0 -2
  2. package/dist/api-contract.cjs +0 -1
  3. package/dist/api-contract.cjs.map +1 -1
  4. package/dist/api-contract.mjs.map +1 -1
  5. package/dist/app.cjs +1 -1
  6. package/dist/app.cjs.map +1 -1
  7. package/dist/app.mjs +1 -1
  8. package/dist/app.mjs.map +1 -1
  9. package/dist/build.cjs +16 -22
  10. package/dist/build.cjs.map +1 -1
  11. package/dist/build.mjs +16 -22
  12. package/dist/build.mjs.map +1 -1
  13. package/dist/cli/catalog.cjs.map +1 -1
  14. package/dist/cli/catalog.mjs.map +1 -1
  15. package/dist/cli/db-doctor.cjs +1 -2
  16. package/dist/cli/db-doctor.cjs.map +1 -1
  17. package/dist/cli/db-doctor.mjs +1 -1
  18. package/dist/cli/db-doctor.mjs.map +1 -1
  19. package/dist/cli/db-repair.cjs +1 -2
  20. package/dist/cli/db-repair.cjs.map +1 -1
  21. package/dist/cli/db-repair.mjs +1 -1
  22. package/dist/cli/db-repair.mjs.map +1 -1
  23. package/dist/cli/db-studio.cjs.map +1 -1
  24. package/dist/cli/db-studio.mjs.map +1 -1
  25. package/dist/cli/framework-version.cjs +2 -1
  26. package/dist/cli/framework-version.cjs.map +1 -1
  27. package/dist/cli/framework-version.mjs +1 -1
  28. package/dist/cli/framework-version.mjs.map +1 -1
  29. package/dist/cli/help.cjs.map +1 -1
  30. package/dist/cli/help.mjs.map +1 -1
  31. package/dist/cli/infra.cjs +4 -0
  32. package/dist/cli/infra.cjs.map +1 -1
  33. package/dist/cli/infra.mjs +1 -1
  34. package/dist/cli/infra.mjs.map +1 -1
  35. package/dist/cli/init.cjs +3 -4
  36. package/dist/cli/init.cjs.map +1 -1
  37. package/dist/cli/init.d.cts +0 -1
  38. package/dist/cli/init.d.cts.map +1 -1
  39. package/dist/cli/init.d.mts +0 -1
  40. package/dist/cli/init.d.mts.map +1 -1
  41. package/dist/cli/init.mjs +3 -3
  42. package/dist/cli/init.mjs.map +1 -1
  43. package/dist/cli/parse.cjs.map +1 -1
  44. package/dist/cli/parse.mjs.map +1 -1
  45. package/dist/cli/prompts.cjs.map +1 -1
  46. package/dist/cli/prompts.mjs.map +1 -1
  47. package/dist/cli/snapshot.cjs +0 -1
  48. package/dist/cli/snapshot.cjs.map +1 -1
  49. package/dist/cli/snapshot.mjs.map +1 -1
  50. package/dist/cli/status.cjs +0 -1
  51. package/dist/cli/status.cjs.map +1 -1
  52. package/dist/cli/status.mjs.map +1 -1
  53. package/dist/cli/sync.cjs +2 -2
  54. package/dist/cli/sync.cjs.map +1 -1
  55. package/dist/cli/sync.mjs +2 -2
  56. package/dist/cli/sync.mjs.map +1 -1
  57. package/dist/cli/timing.cjs.map +1 -1
  58. package/dist/cli/timing.mjs.map +1 -1
  59. package/dist/cli/upgrade.cjs +3 -0
  60. package/dist/cli/upgrade.cjs.map +1 -1
  61. package/dist/cli/upgrade.mjs +1 -1
  62. package/dist/cli/upgrade.mjs.map +1 -1
  63. package/dist/cli.cjs.map +1 -1
  64. package/dist/cli.d.cts +1 -1
  65. package/dist/cli.d.mts +1 -1
  66. package/dist/cli.mjs.map +1 -1
  67. package/dist/code-artifacts.cjs +0 -1
  68. package/dist/code-artifacts.cjs.map +1 -1
  69. package/dist/code-artifacts.mjs.map +1 -1
  70. package/dist/components/dev-view.cjs +0 -1
  71. package/dist/components/dev-view.cjs.map +1 -1
  72. package/dist/components/dev-view.mjs.map +1 -1
  73. package/dist/components/streaming-view.cjs.map +1 -1
  74. package/dist/components/streaming-view.mjs.map +1 -1
  75. package/dist/config.cjs +0 -1
  76. package/dist/config.cjs.map +1 -1
  77. package/dist/config.d.cts +0 -1
  78. package/dist/config.d.cts.map +1 -1
  79. package/dist/config.d.mts +0 -1
  80. package/dist/config.d.mts.map +1 -1
  81. package/dist/config.mjs.map +1 -1
  82. package/dist/contract.cjs.map +1 -1
  83. package/dist/contract.d.cts +42 -44
  84. package/dist/contract.d.cts.map +1 -1
  85. package/dist/contract.d.mts +42 -44
  86. package/dist/contract.d.mts.map +1 -1
  87. package/dist/contract.meta.cjs.map +1 -1
  88. package/dist/contract.meta.d.cts.map +1 -1
  89. package/dist/contract.meta.d.mts.map +1 -1
  90. package/dist/contract.meta.mjs.map +1 -1
  91. package/dist/contract.mjs.map +1 -1
  92. package/dist/db.cjs +0 -1
  93. package/dist/db.cjs.map +1 -1
  94. package/dist/db.d.cts.map +1 -1
  95. package/dist/db.d.mts.map +1 -1
  96. package/dist/db.mjs.map +1 -1
  97. package/dist/dev-logs.cjs +2 -1
  98. package/dist/dev-logs.cjs.map +1 -1
  99. package/dist/dev-logs.mjs +1 -1
  100. package/dist/dev-logs.mjs.map +1 -1
  101. package/dist/dev-session.cjs +3 -1
  102. package/dist/dev-session.cjs.map +1 -1
  103. package/dist/dev-session.mjs +3 -2
  104. package/dist/dev-session.mjs.map +1 -1
  105. package/dist/fastkv.cjs +2 -7
  106. package/dist/fastkv.cjs.map +1 -1
  107. package/dist/fastkv.d.cts.map +1 -1
  108. package/dist/fastkv.d.mts.map +1 -1
  109. package/dist/fastkv.mjs +2 -7
  110. package/dist/fastkv.mjs.map +1 -1
  111. package/dist/http-client.cjs +4 -1
  112. package/dist/http-client.cjs.map +1 -1
  113. package/dist/http-client.mjs +1 -1
  114. package/dist/http-client.mjs.map +1 -1
  115. package/dist/index.cjs +0 -1
  116. package/dist/index.d.cts +1 -1
  117. package/dist/index.d.mts +1 -1
  118. package/dist/infra/planner.cjs +5 -1
  119. package/dist/infra/planner.cjs.map +1 -1
  120. package/dist/infra/planner.mjs +1 -1
  121. package/dist/infra/planner.mjs.map +1 -1
  122. package/dist/infra/preflight.cjs +1 -2
  123. package/dist/infra/preflight.cjs.map +1 -1
  124. package/dist/infra/preflight.mjs +1 -1
  125. package/dist/infra/preflight.mjs.map +1 -1
  126. package/dist/infra/types.cjs +0 -1
  127. package/dist/infra/types.cjs.map +1 -1
  128. package/dist/infra/types.mjs.map +1 -1
  129. package/dist/integrity.cjs +0 -1
  130. package/dist/integrity.cjs.map +1 -1
  131. package/dist/integrity.d.cts.map +1 -1
  132. package/dist/integrity.d.mts.map +1 -1
  133. package/dist/integrity.mjs.map +1 -1
  134. package/dist/internal/manifest-normalizer.cjs +2 -2
  135. package/dist/internal/manifest-normalizer.cjs.map +1 -1
  136. package/dist/internal/manifest-normalizer.mjs +2 -2
  137. package/dist/internal/manifest-normalizer.mjs.map +1 -1
  138. package/dist/merge.cjs +1 -2
  139. package/dist/merge.cjs.map +1 -1
  140. package/dist/merge.d.cts.map +1 -1
  141. package/dist/merge.d.mts.map +1 -1
  142. package/dist/merge.mjs +1 -1
  143. package/dist/merge.mjs.map +1 -1
  144. package/dist/mf.cjs +0 -1
  145. package/dist/mf.cjs.map +1 -1
  146. package/dist/mf.d.cts +0 -1
  147. package/dist/mf.d.cts.map +1 -1
  148. package/dist/mf.d.mts +0 -1
  149. package/dist/mf.d.mts.map +1 -1
  150. package/dist/mf.mjs.map +1 -1
  151. package/dist/near-cli.cjs +3 -1
  152. package/dist/near-cli.cjs.map +1 -1
  153. package/dist/near-cli.mjs +1 -1
  154. package/dist/near-cli.mjs.map +1 -1
  155. package/dist/network.cjs.map +1 -1
  156. package/dist/network.mjs.map +1 -1
  157. package/dist/orchestrator.cjs +5 -4
  158. package/dist/orchestrator.cjs.map +1 -1
  159. package/dist/orchestrator.mjs +5 -3
  160. package/dist/orchestrator.mjs.map +1 -1
  161. package/dist/plugin.cjs.map +1 -1
  162. package/dist/plugin.d.cts +43 -46
  163. package/dist/plugin.d.cts.map +1 -1
  164. package/dist/plugin.d.mts +43 -46
  165. package/dist/plugin.d.mts.map +1 -1
  166. package/dist/plugin.mjs.map +1 -1
  167. package/dist/process-registry.cjs +4 -1
  168. package/dist/process-registry.cjs.map +1 -1
  169. package/dist/process-registry.mjs +1 -1
  170. package/dist/process-registry.mjs.map +1 -1
  171. package/dist/publish.cjs +1 -0
  172. package/dist/publish.cjs.map +1 -1
  173. package/dist/publish.mjs +1 -1
  174. package/dist/publish.mjs.map +1 -1
  175. package/dist/sdk.cjs +0 -1
  176. package/dist/service-descriptor.cjs +0 -1
  177. package/dist/service-descriptor.cjs.map +1 -1
  178. package/dist/service-descriptor.d.cts +1 -0
  179. package/dist/service-descriptor.d.cts.map +1 -1
  180. package/dist/service-descriptor.d.mts +0 -1
  181. package/dist/service-descriptor.d.mts.map +1 -1
  182. package/dist/service-descriptor.mjs.map +1 -1
  183. package/dist/shared-deps.cjs +0 -1
  184. package/dist/shared-deps.cjs.map +1 -1
  185. package/dist/shared-deps.mjs.map +1 -1
  186. package/dist/types.cjs.map +1 -1
  187. package/dist/types.d.cts +0 -1
  188. package/dist/types.d.cts.map +1 -1
  189. package/dist/types.d.mts +0 -1
  190. package/dist/types.d.mts.map +1 -1
  191. package/dist/types.mjs.map +1 -1
  192. package/dist/ui/head.cjs.map +1 -1
  193. package/dist/ui/head.d.cts +0 -1
  194. package/dist/ui/head.d.cts.map +1 -1
  195. package/dist/ui/head.d.mts +0 -1
  196. package/dist/ui/head.d.mts.map +1 -1
  197. package/dist/ui/head.mjs.map +1 -1
  198. package/dist/ui/index.d.cts +1 -1
  199. package/dist/ui/index.d.mts +1 -1
  200. package/dist/ui/metadata.cjs +1 -1
  201. package/dist/ui/metadata.cjs.map +1 -1
  202. package/dist/ui/metadata.d.cts.map +1 -1
  203. package/dist/ui/metadata.d.mts.map +1 -1
  204. package/dist/ui/metadata.mjs +1 -1
  205. package/dist/ui/metadata.mjs.map +1 -1
  206. package/dist/ui/router.cjs.map +1 -1
  207. package/dist/ui/router.d.cts +0 -1
  208. package/dist/ui/router.d.cts.map +1 -1
  209. package/dist/ui/router.d.mts +0 -1
  210. package/dist/ui/router.d.mts.map +1 -1
  211. package/dist/ui/router.mjs.map +1 -1
  212. package/dist/ui/runtime.cjs.map +1 -1
  213. package/dist/ui/runtime.d.cts +0 -1
  214. package/dist/ui/runtime.d.cts.map +1 -1
  215. package/dist/ui/runtime.d.mts +0 -1
  216. package/dist/ui/runtime.d.mts.map +1 -1
  217. package/dist/ui/runtime.mjs.map +1 -1
  218. package/dist/ui/types.d.cts +0 -1
  219. package/dist/ui/types.d.cts.map +1 -1
  220. package/dist/ui/types.d.mts +0 -1
  221. package/dist/ui/types.d.mts.map +1 -1
  222. package/dist/utils/banner.cjs +0 -1
  223. package/dist/utils/banner.cjs.map +1 -1
  224. package/dist/utils/banner.mjs.map +1 -1
  225. package/dist/utils/linkify.cjs.map +1 -1
  226. package/dist/utils/linkify.mjs.map +1 -1
  227. package/dist/utils/run.cjs +0 -1
  228. package/dist/utils/run.cjs.map +1 -1
  229. package/dist/utils/run.mjs.map +1 -1
  230. package/dist/utils/save-config.cjs +0 -1
  231. package/dist/utils/save-config.cjs.map +1 -1
  232. package/dist/utils/save-config.mjs.map +1 -1
  233. package/dist/utils/string.cjs.map +1 -1
  234. package/dist/utils/string.mjs.map +1 -1
  235. package/dist/utils/theme.cjs.map +1 -1
  236. package/dist/utils/theme.mjs.map +1 -1
  237. package/package.json +4 -3
  238. package/dist/_virtual/_rolldown/runtime.mjs +0 -32
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-view.mjs","names":[],"sources":["../../src/components/streaming-view.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { linkify } from \"../utils/linkify\";\nimport { colors, icons } from \"../utils/theme\";\nimport type { ProcessState, ProcessStatus } from \"./dev-view\";\n\nconst orange = chalk.hex(\"#ffaa00\");\nconst PLUGIN_PREFIX = \"plugin:\";\n\nexport interface StreamingViewHandle {\n updateProcess: (name: string, status: ProcessStatus, message?: string) => void;\n addLog: (source: string, line: string, isError?: boolean) => void;\n unmount: () => Promise<void> | void;\n}\n\nconst getTimestamp = (): string => {\n const now = new Date();\n return `${now.getHours().toString().padStart(2, \"0\")}:${now.getMinutes().toString().padStart(2, \"0\")}:${now.getSeconds().toString().padStart(2, \"0\")}`;\n};\n\nconst write = (text: string) => process.stdout.write(`${text}\\n`);\n\nconst getServiceColor = (name: string): ((s: string) => string) => {\n if (name.startsWith(PLUGIN_PREFIX)) return orange;\n if (name === \"host\") return colors.cyan;\n if (name === \"ui\" || name === \"ui-ssr\") return colors.magenta;\n if (name === \"api\") return colors.blue;\n return colors.white;\n};\n\nconst getDisplayName = (name: string): string => {\n return name.startsWith(PLUGIN_PREFIX)\n ? name.slice(PLUGIN_PREFIX.length).toUpperCase()\n : name.toUpperCase();\n};\n\nconst isPlugin = (name: string): boolean => name.startsWith(PLUGIN_PREFIX);\n\nconst getSectionedProcesses = (processes: ProcessState[]) => {\n const plugins = processes.filter((p) => isPlugin(p.name));\n const services = processes.filter((p) => !isPlugin(p.name));\n const sections: Array<{ key: string; title: string; processes: ProcessState[] }> = [];\n if (plugins.length > 0) sections.push({ key: \"plugins\", title: \"PLUGINS\", processes: plugins });\n if (services.length > 0)\n sections.push({ key: \"services\", title: \"SERVICES\", processes: services });\n return sections;\n};\n\nconst getColumnWidths = (processes: ProcessState[]) => {\n const name = Math.max(6, ...processes.map((p) => getDisplayName(p.name).length));\n const source = Math.max(10, ...processes.map((p) => (p.source ? ` (${p.source})`.length : 0)));\n return { name, source };\n};\n\nconst getStatusIcon = (status: ProcessStatus): string => {\n switch (status) {\n case \"pending\":\n return icons.pending;\n case \"starting\":\n return icons.scan;\n case \"ready\":\n return icons.ok;\n case \"error\":\n return icons.err;\n }\n};\n\nexport function renderStreamingView(\n initialProcesses: ProcessState[],\n description: string,\n env: Record<string, string>,\n onExit?: () => Promise<void> | void,\n): StreamingViewHandle {\n const processes = new Map<string, ProcessState>();\n for (const p of initialProcesses) {\n processes.set(p.name, { ...p });\n }\n\n let allReadyPrinted = false;\n const hostProcess = initialProcesses.find((p) => p.name === \"host\");\n const hostPort = hostProcess?.port || 3000;\n const proxyTarget = env.API_PROXY;\n const sectionedProcesses = getSectionedProcesses(initialProcesses);\n const columnWidths = getColumnWidths(initialProcesses);\n const lastLogBySource = new Map<string, string>();\n\n const headerLines: string[] = [\n \"\",\n colors.cyan(`${\"─\".repeat(52)}`),\n ` ${icons.run} ${colors.cyan(description.toUpperCase())}`,\n colors.cyan(`${\"─\".repeat(52)}`),\n \"\",\n ];\n\n if (proxyTarget) {\n headerLines.push(orange(` ${icons.arrow} API PROXY → ${proxyTarget}`), \"\");\n }\n\n for (const section of sectionedProcesses) {\n headerLines.push(colors.cyan(` ${section.title}`));\n for (const proc of section.processes) {\n const color = getServiceColor(proc.name);\n const sourceLabel = proc.source ? ` (${proc.source})` : \"\";\n headerLines.push(\n `${colors.dim(`[${getTimestamp()}]`)} ${color(`[${getDisplayName(proc.name).padEnd(columnWidths.name)}]`)} ${icons.pending} waiting${sourceLabel.padEnd(columnWidths.source)}`,\n );\n }\n headerLines.push(\"\");\n }\n console.log(headerLines.join(\"\\n\"));\n\n const checkAllReady = () => {\n if (allReadyPrinted) return;\n const allReady = Array.from(processes.values()).every((p) => p.status === \"ready\");\n if (allReady) {\n allReadyPrinted = true;\n const readyLines = [\n \"\",\n colors.dim(`${\"─\".repeat(52)}`),\n colors.green(`${icons.ok} All ${processes.size} services ready`),\n colors.green(`${icons.arrow} http://localhost:${hostPort}`),\n colors.dim(`${\"─\".repeat(52)}`),\n \"\",\n ];\n console.log(readyLines.join(\"\\n\"));\n }\n };\n\n const updateProcess = (name: string, status: ProcessStatus, message?: string) => {\n const proc = processes.get(name);\n if (!proc) return;\n\n proc.status = status;\n if (message) proc.message = message;\n\n const color = getServiceColor(name);\n const icon = getStatusIcon(status);\n const displayName = getDisplayName(name).padEnd(columnWidths.name);\n const sourceLabel = proc?.source ? ` (${proc.source})` : \"\";\n const isRemote = proc?.source === \"remote\";\n const isHost = name === \"host\";\n const showPort = proc.port > 0 && (isHost || !isRemote) && status === \"ready\";\n const statusText =\n status === \"ready\"\n ? isRemote && !isHost\n ? \"loaded\"\n : \"running\"\n : status === \"starting\"\n ? \"starting\"\n : status === \"error\"\n ? \"failed\"\n : \"waiting\";\n const portStr = showPort ? ` :${proc.port}` : \"\";\n\n write(\n `${colors.dim(`[${getTimestamp()}]`)} ${color(`[${displayName}]`)} ${status === \"ready\" ? colors.green(icon) : status === \"error\" ? colors.error(icon) : icon} ${statusText}${sourceLabel.padEnd(columnWidths.source)}${portStr}`,\n );\n\n checkAllReady();\n };\n\n const addLog = (source: string, line: string, isError = false) => {\n const lastLine = lastLogBySource.get(source);\n const nextLine = `${isError ? \"ERR\" : \"OUT\"}:${line}`;\n if (lastLine === nextLine) return;\n lastLogBySource.set(source, nextLine);\n\n const color = getServiceColor(source);\n const logColor = isError ? colors.error : colors.dim;\n write(\n `${colors.dim(`[${getTimestamp()}]`)} ${color(`[${source.toUpperCase()}]`)} ${colors.dim(\"│\")} ${logColor(linkify(line))}`,\n );\n };\n\n const unmount = () => onExit?.();\n\n return { updateProcess, addLog, unmount };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"streaming-view.mjs","names":[],"sources":["../../src/components/streaming-view.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { linkify } from \"../utils/linkify\";\nimport { colors, icons } from \"../utils/theme\";\nimport type { ProcessState, ProcessStatus } from \"./dev-view\";\n\nconst orange = chalk.hex(\"#ffaa00\");\nconst PLUGIN_PREFIX = \"plugin:\";\n\nexport interface StreamingViewHandle {\n updateProcess: (name: string, status: ProcessStatus, message?: string) => void;\n addLog: (source: string, line: string, isError?: boolean) => void;\n unmount: () => Promise<void> | void;\n}\n\nconst getTimestamp = (): string => {\n const now = new Date();\n return `${now.getHours().toString().padStart(2, \"0\")}:${now.getMinutes().toString().padStart(2, \"0\")}:${now.getSeconds().toString().padStart(2, \"0\")}`;\n};\n\nconst write = (text: string) => process.stdout.write(`${text}\\n`);\n\nconst getServiceColor = (name: string): ((s: string) => string) => {\n if (name.startsWith(PLUGIN_PREFIX)) return orange;\n if (name === \"host\") return colors.cyan;\n if (name === \"ui\" || name === \"ui-ssr\") return colors.magenta;\n if (name === \"api\") return colors.blue;\n return colors.white;\n};\n\nconst getDisplayName = (name: string): string => {\n return name.startsWith(PLUGIN_PREFIX)\n ? name.slice(PLUGIN_PREFIX.length).toUpperCase()\n : name.toUpperCase();\n};\n\nconst isPlugin = (name: string): boolean => name.startsWith(PLUGIN_PREFIX);\n\nconst getSectionedProcesses = (processes: ProcessState[]) => {\n const plugins = processes.filter((p) => isPlugin(p.name));\n const services = processes.filter((p) => !isPlugin(p.name));\n const sections: Array<{ key: string; title: string; processes: ProcessState[] }> = [];\n if (plugins.length > 0) sections.push({ key: \"plugins\", title: \"PLUGINS\", processes: plugins });\n if (services.length > 0)\n sections.push({ key: \"services\", title: \"SERVICES\", processes: services });\n return sections;\n};\n\nconst getColumnWidths = (processes: ProcessState[]) => {\n const name = Math.max(6, ...processes.map((p) => getDisplayName(p.name).length));\n const source = Math.max(10, ...processes.map((p) => (p.source ? ` (${p.source})`.length : 0)));\n return { name, source };\n};\n\nconst getStatusIcon = (status: ProcessStatus): string => {\n switch (status) {\n case \"pending\":\n return icons.pending;\n case \"starting\":\n return icons.scan;\n case \"ready\":\n return icons.ok;\n case \"error\":\n return icons.err;\n }\n};\n\nexport function renderStreamingView(\n initialProcesses: ProcessState[],\n description: string,\n env: Record<string, string>,\n onExit?: () => Promise<void> | void,\n): StreamingViewHandle {\n const processes = new Map<string, ProcessState>();\n for (const p of initialProcesses) {\n processes.set(p.name, { ...p });\n }\n\n let allReadyPrinted = false;\n const hostProcess = initialProcesses.find((p) => p.name === \"host\");\n const hostPort = hostProcess?.port || 3000;\n const proxyTarget = env.API_PROXY;\n const sectionedProcesses = getSectionedProcesses(initialProcesses);\n const columnWidths = getColumnWidths(initialProcesses);\n const lastLogBySource = new Map<string, string>();\n\n const headerLines: string[] = [\n \"\",\n colors.cyan(`${\"─\".repeat(52)}`),\n ` ${icons.run} ${colors.cyan(description.toUpperCase())}`,\n colors.cyan(`${\"─\".repeat(52)}`),\n \"\",\n ];\n\n if (proxyTarget) {\n headerLines.push(orange(` ${icons.arrow} API PROXY → ${proxyTarget}`), \"\");\n }\n\n for (const section of sectionedProcesses) {\n headerLines.push(colors.cyan(` ${section.title}`));\n for (const proc of section.processes) {\n const color = getServiceColor(proc.name);\n const sourceLabel = proc.source ? ` (${proc.source})` : \"\";\n headerLines.push(\n `${colors.dim(`[${getTimestamp()}]`)} ${color(`[${getDisplayName(proc.name).padEnd(columnWidths.name)}]`)} ${icons.pending} waiting${sourceLabel.padEnd(columnWidths.source)}`,\n );\n }\n headerLines.push(\"\");\n }\n console.log(headerLines.join(\"\\n\"));\n\n const checkAllReady = () => {\n if (allReadyPrinted) return;\n const allReady = Array.from(processes.values()).every((p) => p.status === \"ready\");\n if (allReady) {\n allReadyPrinted = true;\n const readyLines = [\n \"\",\n colors.dim(`${\"─\".repeat(52)}`),\n colors.green(`${icons.ok} All ${processes.size} services ready`),\n colors.green(`${icons.arrow} http://localhost:${hostPort}`),\n colors.dim(`${\"─\".repeat(52)}`),\n \"\",\n ];\n console.log(readyLines.join(\"\\n\"));\n }\n };\n\n const updateProcess = (name: string, status: ProcessStatus, message?: string) => {\n const proc = processes.get(name);\n if (!proc) return;\n\n proc.status = status;\n if (message) proc.message = message;\n\n const color = getServiceColor(name);\n const icon = getStatusIcon(status);\n const displayName = getDisplayName(name).padEnd(columnWidths.name);\n const sourceLabel = proc?.source ? ` (${proc.source})` : \"\";\n const isRemote = proc?.source === \"remote\";\n const isHost = name === \"host\";\n const showPort = proc.port > 0 && (isHost || !isRemote) && status === \"ready\";\n const statusText =\n status === \"ready\"\n ? isRemote && !isHost\n ? \"loaded\"\n : \"running\"\n : status === \"starting\"\n ? \"starting\"\n : status === \"error\"\n ? \"failed\"\n : \"waiting\";\n const portStr = showPort ? ` :${proc.port}` : \"\";\n\n write(\n `${colors.dim(`[${getTimestamp()}]`)} ${color(`[${displayName}]`)} ${status === \"ready\" ? colors.green(icon) : status === \"error\" ? colors.error(icon) : icon} ${statusText}${sourceLabel.padEnd(columnWidths.source)}${portStr}`,\n );\n\n checkAllReady();\n };\n\n const addLog = (source: string, line: string, isError = false) => {\n const lastLine = lastLogBySource.get(source);\n const nextLine = `${isError ? \"ERR\" : \"OUT\"}:${line}`;\n if (lastLine === nextLine) return;\n lastLogBySource.set(source, nextLine);\n\n const color = getServiceColor(source);\n const logColor = isError ? colors.error : colors.dim;\n write(\n `${colors.dim(`[${getTimestamp()}]`)} ${color(`[${source.toUpperCase()}]`)} ${colors.dim(\"│\")} ${logColor(linkify(line))}`,\n );\n };\n\n const unmount = () => onExit?.();\n\n return { updateProcess, addLog, unmount };\n}\n"],"mappings":"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"}
package/dist/config.cjs CHANGED
@@ -1,5 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
3
2
  const require_http_client = require('./http-client.cjs');
4
3
  const require_fastkv = require('./fastkv.cjs');
5
4
  const require_merge = require('./merge.cjs');
@@ -1 +1 @@
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 (e) {\n console.warn(\n `[Config] Failed to parse _resolved.json, falling back to bos.config.json: ${e}`,\n );\n }\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:${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: env === \"development\" ? parsePort(hostListeningUrl) : 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 =\n remotePlugins === undefined\n ? undefined\n : remotePlugins.length === 0 || remotePlugins.includes(pluginId)\n ? \"remote\"\n : undefined;\n const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);\n\n if (!pluginRuntime.localPath && !pluginRuntime.url) {\n if (forceSource === \"remote\") {\n emitConfigWarning(\n `[Config] Plugin \"${pluginId}\" has no production URL in bos.config.json and cannot be resolved as remote. Add a \"production\" field or remove it from --remote-plugins.`,\n );\n }\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 (e) {\n console.warn(`[Config] Could not read package.json at ${localPath}: ${e}`);\n }\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 (e) {\n console.warn(\n `[Config] Failed to parse _resolved.json, falling back to bos.config.json: ${e}`,\n );\n }\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:${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: env === \"development\" ? parsePort(hostListeningUrl) : 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 =\n remotePlugins === undefined\n ? undefined\n : remotePlugins.length === 0 || remotePlugins.includes(pluginId)\n ? \"remote\"\n : undefined;\n const pluginRuntime = buildRuntimePluginConfig(pluginId, env, resolvedReference, forceSource);\n\n if (!pluginRuntime.localPath && !pluginRuntime.url) {\n if (forceSource === \"remote\") {\n emitConfigWarning(\n `[Config] Plugin \"${pluginId}\" has no production URL in bos.config.json and cannot be resolved as remote. Add a \"production\" field or remove it from --remote-plugins.`,\n );\n }\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 (e) {\n console.warn(`[Config] Could not read package.json at ${localPath}: ${e}`);\n }\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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"}
package/dist/config.d.cts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { BosConfig, BosConfigInput, BosConfigSchema, BosPluginRef, RuntimeConfig, RuntimePluginConfig } from "./types.cjs";
2
2
  import { BOS_CONFIG_ORDER, BosEnv, mergeBosConfigWithExtends, rebuildOrderedConfig, resolveExtendsRef } from "./merge.cjs";
3
-
4
3
  //#region src/config.d.ts
5
4
  declare const LOCAL_PREFIX = "local:";
6
5
  type RuntimeOverrideTarget = "ui" | "api" | "plugins" | `plugins.${string}`;
@@ -1 +1 @@
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,iBA6GpC,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,iBA6Va,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAyGc,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;KAID;iBAcW;iBAMA;iBAIA;iBAIA;iBAgBA,eAAe;iBAkBf,aAAa;iBAIb;UAOC;EACf,QAAQ;EACR,SAAS;EACT;IACE;IACA;IACA;;EAEF;;UAGe;EACf,QAAQ;EACR;IACE;;;UAIa;EACf,WAAW;EACX,QAAQ;EACR;EACA;;UAGe;EACf,OAAO;EACP;EACA;EACA,eAAe;;iBAQK,gBAAgB;EACpC;EACA;IACE,QAAQ;iBAoBU,mBAAmB;EACvC;EACA;EACA,MAAM;EACN;IACE,QAAQ;iBA+DU,cAAc;EAClC;EACA;EACA,MAAM;IACJ,QAAQ;iBASU,iBACpB,gBACA,MAAK,SACJ,QAAQ;iBAwBK,4BAA4B,wBAAwB;iBAyBpD,yBACd,gBAAgB,cAAc,wBAC9B;iBAaoB,6BACpB,QAAQ,WACR,iBACA,KAAK,SACJ,QAAQ,eAAe;iBA2DJ,+BACpB,QAAQ,WACR,iBACA,KAAK,SACJ,QAAQ;iBAuCK,sBAAsB;iBAItB,4BAA4B,oBAAoB;iBAahD,oBACd,mBACA,QAAQ,WACR,KAAK,QACL,yBACA;iBA6Bc,qBAAqB;iBAMrB,sBAAsB,oBAAoB;iBA6GpC,2BACpB,QAAQ,cACR,iBACA,KAAK,QACL,4BACC,QAAQ;UAmHM;EACf,UAAU,eAAe;EACzB;EACA;EACA;EACA;EACA;;iBAGc,mBACd,QAAQ,WACR,iBACA,KAAK,QACL,UAAU,4BACT;iBA6Va,yBACd,kCACA,+BACA;iBAyGc,yBACd,4BACC,mBAAmB;iBAIN,4BACd,2BACA;iBAUc,0BAA0B;iBAQ1B,uBAAuB;iBAIvB,UAAU"}
package/dist/config.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { BosConfig, BosConfigInput, BosConfigSchema, BosPluginRef, RuntimeConfig, RuntimePluginConfig } from "./types.mjs";
2
2
  import { BOS_CONFIG_ORDER, BosEnv, mergeBosConfigWithExtends, rebuildOrderedConfig, resolveExtendsRef } from "./merge.mjs";
3
-
4
3
  //#region src/config.d.ts
5
4
  declare const LOCAL_PREFIX = "local:";
6
5
  type RuntimeOverrideTarget = "ui" | "api" | "plugins" | `plugins.${string}`;
@@ -1 +1 @@
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,iBA6GpC,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,iBA6Va,wBAAA,CACd,YAAA,sBACA,SAAA,sBACA,QAAA;AAAA,iBAyGc,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;KAID;iBAcW;iBAMA;iBAIA;iBAIA;iBAgBA,eAAe;iBAkBf,aAAa;iBAIb;UAOC;EACf,QAAQ;EACR,SAAS;EACT;IACE;IACA;IACA;;EAEF;;UAGe;EACf,QAAQ;EACR;IACE;;;UAIa;EACf,WAAW;EACX,QAAQ;EACR;EACA;;UAGe;EACf,OAAO;EACP;EACA;EACA,eAAe;;iBAQK,gBAAgB;EACpC;EACA;IACE,QAAQ;iBAoBU,mBAAmB;EACvC;EACA;EACA,MAAM;EACN;IACE,QAAQ;iBA+DU,cAAc;EAClC;EACA;EACA,MAAM;IACJ,QAAQ;iBASU,iBACpB,gBACA,MAAK,SACJ,QAAQ;iBAwBK,4BAA4B,wBAAwB;iBAyBpD,yBACd,gBAAgB,cAAc,wBAC9B;iBAaoB,6BACpB,QAAQ,WACR,iBACA,KAAK,SACJ,QAAQ,eAAe;iBA2DJ,+BACpB,QAAQ,WACR,iBACA,KAAK,SACJ,QAAQ;iBAuCK,sBAAsB;iBAItB,4BAA4B,oBAAoB;iBAahD,oBACd,mBACA,QAAQ,WACR,KAAK,QACL,yBACA;iBA6Bc,qBAAqB;iBAMrB,sBAAsB,oBAAoB;iBA6GpC,2BACpB,QAAQ,cACR,iBACA,KAAK,QACL,4BACC,QAAQ;UAmHM;EACf,UAAU,eAAe;EACzB;EACA;EACA;EACA;EACA;;iBAGc,mBACd,QAAQ,WACR,iBACA,KAAK,QACL,UAAU,4BACT;iBA6Va,yBACd,kCACA,+BACA;iBAyGc,yBACd,4BACC,mBAAmB;iBAIN,4BACd,2BACA;iBAUc,0BAA0B;iBAQ1B,uBAAuB;iBAIvB,UAAU"}