everything-dev 1.52.0 → 1.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/api-contract.cjs +6 -1
  2. package/dist/api-contract.cjs.map +1 -1
  3. package/dist/api-contract.mjs +6 -1
  4. package/dist/api-contract.mjs.map +1 -1
  5. package/dist/cli/infra.cjs +0 -67
  6. package/dist/cli/infra.cjs.map +1 -1
  7. package/dist/cli/infra.mjs +1 -65
  8. package/dist/cli/infra.mjs.map +1 -1
  9. package/dist/config.cjs +3 -1
  10. package/dist/config.cjs.map +1 -1
  11. package/dist/config.d.cts.map +1 -1
  12. package/dist/config.d.mts.map +1 -1
  13. package/dist/config.mjs +3 -1
  14. package/dist/config.mjs.map +1 -1
  15. package/dist/contract.d.cts +8 -0
  16. package/dist/contract.d.cts.map +1 -1
  17. package/dist/contract.d.mts +8 -0
  18. package/dist/contract.d.mts.map +1 -1
  19. package/dist/dag.cjs +1 -0
  20. package/dist/dag.cjs.map +1 -1
  21. package/dist/dag.d.cts.map +1 -1
  22. package/dist/dag.d.mts.map +1 -1
  23. package/dist/dag.mjs +1 -0
  24. package/dist/dag.mjs.map +1 -1
  25. package/dist/merge.cjs +1 -1
  26. package/dist/merge.cjs.map +1 -1
  27. package/dist/merge.mjs +1 -1
  28. package/dist/merge.mjs.map +1 -1
  29. package/dist/orchestrator.cjs +1 -1
  30. package/dist/orchestrator.cjs.map +1 -1
  31. package/dist/orchestrator.mjs +1 -1
  32. package/dist/orchestrator.mjs.map +1 -1
  33. package/dist/plugin.cjs +1 -12
  34. package/dist/plugin.cjs.map +1 -1
  35. package/dist/plugin.d.cts +10 -0
  36. package/dist/plugin.d.cts.map +1 -1
  37. package/dist/plugin.d.mts +10 -0
  38. package/dist/plugin.d.mts.map +1 -1
  39. package/dist/plugin.mjs +2 -13
  40. package/dist/plugin.mjs.map +1 -1
  41. package/dist/types.cjs +11 -3
  42. package/dist/types.cjs.map +1 -1
  43. package/dist/types.d.cts +13 -0
  44. package/dist/types.d.cts.map +1 -1
  45. package/dist/types.d.mts +13 -0
  46. package/dist/types.d.mts.map +1 -1
  47. package/dist/types.mjs +11 -3
  48. package/dist/types.mjs.map +1 -1
  49. package/package.json +3 -3
@@ -122,6 +122,7 @@ declare const ConfigResultSchema: z.ZodObject<{
122
122
  strictVersion: z.ZodOptional<z.ZodBoolean>;
123
123
  shareScope: z.ZodOptional<z.ZodString>;
124
124
  }, z.core.$strip>>>;
125
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
125
126
  version: z.ZodOptional<z.ZodString>;
126
127
  app: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
127
128
  plugins: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -164,6 +165,8 @@ declare const ConfigResultSchema: z.ZodObject<{
164
165
  strictVersion: z.ZodOptional<z.ZodBoolean>;
165
166
  shareScope: z.ZodOptional<z.ZodString>;
166
167
  }, z.core.$strip>>>;
168
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
169
+ dependsOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
167
170
  }, z.core.$strip>;
168
171
  auth: z.ZodOptional<z.ZodObject<{
169
172
  extends: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
@@ -187,6 +190,7 @@ declare const ConfigResultSchema: z.ZodObject<{
187
190
  strictVersion: z.ZodOptional<z.ZodBoolean>;
188
191
  shareScope: z.ZodOptional<z.ZodString>;
189
192
  }, z.core.$strip>>>;
193
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
190
194
  }, z.core.$strip>>;
191
195
  }, z.core.$strip>;
192
196
  }, z.core.$strip>]>>;
@@ -786,6 +790,7 @@ declare const bosContract: {
786
790
  strictVersion: z.ZodOptional<z.ZodBoolean>;
787
791
  shareScope: z.ZodOptional<z.ZodString>;
788
792
  }, z.core.$strip>>>;
793
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
789
794
  version: z.ZodOptional<z.ZodString>;
790
795
  app: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
791
796
  plugins: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -828,6 +833,8 @@ declare const bosContract: {
828
833
  strictVersion: z.ZodOptional<z.ZodBoolean>;
829
834
  shareScope: z.ZodOptional<z.ZodString>;
830
835
  }, z.core.$strip>>>;
836
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
837
+ dependsOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
831
838
  }, z.core.$strip>;
832
839
  auth: z.ZodOptional<z.ZodObject<{
833
840
  extends: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
@@ -851,6 +858,7 @@ declare const bosContract: {
851
858
  strictVersion: z.ZodOptional<z.ZodBoolean>;
852
859
  shareScope: z.ZodOptional<z.ZodString>;
853
860
  }, z.core.$strip>>>;
861
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
854
862
  }, z.core.$strip>>;
855
863
  }, z.core.$strip>;
856
864
  }, z.core.$strip>]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.cts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
1
+ {"version":3,"file":"contract.d.cts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
@@ -122,6 +122,7 @@ declare const ConfigResultSchema: z.ZodObject<{
122
122
  strictVersion: z.ZodOptional<z.ZodBoolean>;
123
123
  shareScope: z.ZodOptional<z.ZodString>;
124
124
  }, z.core.$strip>>>;
125
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
125
126
  version: z.ZodOptional<z.ZodString>;
126
127
  app: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
127
128
  plugins: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -164,6 +165,8 @@ declare const ConfigResultSchema: z.ZodObject<{
164
165
  strictVersion: z.ZodOptional<z.ZodBoolean>;
165
166
  shareScope: z.ZodOptional<z.ZodString>;
166
167
  }, z.core.$strip>>>;
168
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
169
+ dependsOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
167
170
  }, z.core.$strip>;
168
171
  auth: z.ZodOptional<z.ZodObject<{
169
172
  extends: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
@@ -187,6 +190,7 @@ declare const ConfigResultSchema: z.ZodObject<{
187
190
  strictVersion: z.ZodOptional<z.ZodBoolean>;
188
191
  shareScope: z.ZodOptional<z.ZodString>;
189
192
  }, z.core.$strip>>>;
193
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
190
194
  }, z.core.$strip>>;
191
195
  }, z.core.$strip>;
192
196
  }, z.core.$strip>]>>;
@@ -786,6 +790,7 @@ declare const bosContract: {
786
790
  strictVersion: z.ZodOptional<z.ZodBoolean>;
787
791
  shareScope: z.ZodOptional<z.ZodString>;
788
792
  }, z.core.$strip>>>;
793
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
789
794
  version: z.ZodOptional<z.ZodString>;
790
795
  app: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
791
796
  plugins: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -828,6 +833,8 @@ declare const bosContract: {
828
833
  strictVersion: z.ZodOptional<z.ZodBoolean>;
829
834
  shareScope: z.ZodOptional<z.ZodString>;
830
835
  }, z.core.$strip>>>;
836
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
837
+ dependsOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
831
838
  }, z.core.$strip>;
832
839
  auth: z.ZodOptional<z.ZodObject<{
833
840
  extends: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
@@ -851,6 +858,7 @@ declare const bosContract: {
851
858
  strictVersion: z.ZodOptional<z.ZodBoolean>;
852
859
  shareScope: z.ZodOptional<z.ZodString>;
853
860
  }, z.core.$strip>>>;
861
+ connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
854
862
  }, z.core.$strip>>;
855
863
  }, z.core.$strip>;
856
864
  }, z.core.$strip>]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.mts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
1
+ {"version":3,"file":"contract.d.mts","names":[],"sources":["../src/contract.ts"],"mappings":"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"}
package/dist/dag.cjs CHANGED
@@ -71,6 +71,7 @@ function normalizeToNodes(config) {
71
71
  secrets: plugin.secrets,
72
72
  integrity: plugin.integrity,
73
73
  shared: plugin.shared,
74
+ connectSrc: plugin.connectSrc,
74
75
  ui: plugin.ui,
75
76
  routes: plugin.routes,
76
77
  dependsOn: plugin.dependsOn,
package/dist/dag.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dag.cjs","names":[],"sources":["../src/dag.ts"],"sourcesContent":["import type { JsonObject, RuntimeConfig, RuntimeDependencyNode } from \"./types\";\n\nexport interface DependencyDAG {\n nodes: Map<string, RuntimeDependencyNode>;\n sorted: string[];\n}\n\nexport function normalizeToNodes(config: RuntimeConfig): Map<string, RuntimeDependencyNode> {\n const nodes = new Map<string, RuntimeDependencyNode>();\n\n if (config.api?.url) {\n nodes.set(\"api\", {\n key: \"api\",\n kind: \"api\",\n name: config.api.name,\n url: config.api.url,\n entry: config.api.entry,\n source: config.api.source,\n localPath: config.api.localPath,\n port: config.api.port,\n proxy: config.api.proxy,\n variables: config.api.variables,\n secrets: config.api.secrets,\n integrity: config.api.integrity,\n shared: config.api.shared,\n dependsOn: config.api.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `api:${config.api.url}`,\n });\n }\n\n if (config.auth?.url) {\n nodes.set(\"auth\", {\n key: \"auth\",\n kind: \"auth\",\n name: config.auth.name,\n url: config.auth.url,\n entry: config.auth.entry,\n source: config.auth.source,\n extendsRef: config.auth.extendsRef,\n localPath: config.auth.localPath,\n port: config.auth.port,\n proxy: config.auth.proxy,\n variables: config.auth.variables,\n secrets: config.auth.secrets,\n integrity: config.auth.integrity,\n shared: config.auth.shared,\n dependsOn: config.auth.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `auth:${config.auth.url}`,\n });\n }\n\n if (config.ui?.url) {\n nodes.set(\"ui\", {\n key: \"ui\",\n kind: \"ui\",\n name: config.ui.name,\n url: config.ui.url,\n entry: config.ui.entry,\n source: config.ui.source,\n localPath: config.ui.localPath,\n port: config.ui.port,\n integrity: config.ui.integrity,\n dependsOn: config.ui.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `ui:${config.ui.url}`,\n });\n }\n\n for (const [key, plugin] of Object.entries(config.plugins ?? {})) {\n if (!plugin.url) continue;\n nodes.set(key, {\n key,\n kind: \"plugin\",\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n source: plugin.source,\n extendsRef: plugin.extendsRef,\n localPath: plugin.localPath,\n port: plugin.port,\n proxy: plugin.proxy,\n variables: plugin.variables,\n secrets: plugin.secrets,\n integrity: plugin.integrity,\n shared: plugin.shared,\n ui: plugin.ui,\n routes: plugin.routes,\n dependsOn: plugin.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `plugin:${key}:${plugin.url}`,\n });\n }\n\n return nodes;\n}\n\nexport function manifestPluginsToNodes(\n plugins: Array<{\n key: string;\n name: string;\n url: string;\n dependsOn?: string[];\n secrets?: string[];\n variables?: JsonObject;\n }>,\n): RuntimeDependencyNode[] {\n if (!plugins?.length) return [];\n return plugins.map((p) => ({\n key: p.key,\n kind: \"plugin\" as const,\n name: p.name,\n url: p.url,\n entry: `${p.url}/mf-manifest.json`,\n source: \"remote\" as const,\n dependsOn: p.dependsOn,\n secrets: p.secrets,\n variables: p.variables,\n sourceOrigin: \"manifest\" as const,\n singletonKey: `plugin:${p.key}:${p.url}`,\n }));\n}\n\nexport function buildDependencyDAG(config: RuntimeConfig): DependencyDAG {\n const nodes =\n config.nodes && Object.keys(config.nodes).length > 0\n ? new Map(Object.entries(config.nodes))\n : normalizeToNodes(config);\n const sorted = topologicalSort(nodes);\n return { nodes, sorted };\n}\n\nexport function getImplicitApiDependencies(nodes: Map<string, RuntimeDependencyNode>): string[] {\n return [...nodes.values()].filter((n) => n.kind !== \"api\" && n.kind !== \"ui\").map((n) => n.key);\n}\n\nexport function topologicalSort(nodes: Map<string, RuntimeDependencyNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, Set<string>>();\n\n for (const key of nodes.keys()) {\n inDegree.set(key, 0);\n adjacency.set(key, new Set());\n }\n\n for (const [key, node] of nodes) {\n for (const dep of node.dependsOn ?? []) {\n if (nodes.has(dep)) {\n adjacency.get(dep)!.add(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n }\n\n const apiNode = nodes.get(\"api\");\n if (apiNode && !apiNode.dependsOn?.length) {\n for (const depKey of getImplicitApiDependencies(nodes)) {\n if (!adjacency.get(depKey)!.has(\"api\")) {\n adjacency.get(depKey)!.add(\"api\");\n inDegree.set(\"api\", (inDegree.get(\"api\") ?? 0) + 1);\n }\n }\n }\n\n const queue: string[] = [];\n for (const [key, degree] of inDegree) {\n if (degree === 0) queue.push(key);\n }\n queue.sort();\n\n const result: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n const neighbors = adjacency.get(current);\n if (neighbors) {\n for (const neighbor of neighbors) {\n const newDegree = (inDegree.get(neighbor) ?? 0) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) {\n const insertPos = queue.findIndex((k) => k > neighbor);\n if (insertPos === -1) queue.push(neighbor);\n else queue.splice(insertPos, 0, neighbor);\n }\n }\n }\n }\n\n if (result.length !== nodes.size) {\n const cyclic = [...nodes.keys()].filter((k) => !result.includes(k));\n throw new Error(\n `Circular dependency detected among: ${cyclic.join(\" -> \")}. Check dependsOn declarations in bos.config.json.`,\n );\n }\n\n return result;\n}\n\nexport function mergeManifestNodes(\n configNodes: Map<string, RuntimeDependencyNode>,\n manifestNodes: RuntimeDependencyNode[],\n): Map<string, RuntimeDependencyNode> {\n const merged = new Map(configNodes);\n\n for (const node of manifestNodes) {\n if (merged.has(node.key) && merged.get(node.key)!.sourceOrigin === \"config\") {\n continue;\n }\n merged.set(node.key, node);\n }\n\n return merged;\n}\n\nexport function getDependenciesForNode(\n node: RuntimeDependencyNode,\n allNodes: Map<string, RuntimeDependencyNode>,\n): RuntimeDependencyNode[] {\n if (node.kind === \"api\" && !node.dependsOn?.length) {\n return getImplicitApiDependencies(allNodes)\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n }\n\n const explicitDeps = (node.dependsOn ?? [])\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n\n return explicitDeps;\n}\n\nexport function getSingletonKey(node: RuntimeDependencyNode): string {\n return node.singletonKey ?? `${node.kind}:${node.key}:${node.url}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dag.cjs","names":[],"sources":["../src/dag.ts"],"sourcesContent":["import type { JsonObject, RuntimeConfig, RuntimeDependencyNode } from \"./types\";\n\nexport interface DependencyDAG {\n nodes: Map<string, RuntimeDependencyNode>;\n sorted: string[];\n}\n\nexport function normalizeToNodes(config: RuntimeConfig): Map<string, RuntimeDependencyNode> {\n const nodes = new Map<string, RuntimeDependencyNode>();\n\n if (config.api?.url) {\n nodes.set(\"api\", {\n key: \"api\",\n kind: \"api\",\n name: config.api.name,\n url: config.api.url,\n entry: config.api.entry,\n source: config.api.source,\n localPath: config.api.localPath,\n port: config.api.port,\n proxy: config.api.proxy,\n variables: config.api.variables,\n secrets: config.api.secrets,\n integrity: config.api.integrity,\n shared: config.api.shared,\n dependsOn: config.api.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `api:${config.api.url}`,\n });\n }\n\n if (config.auth?.url) {\n nodes.set(\"auth\", {\n key: \"auth\",\n kind: \"auth\",\n name: config.auth.name,\n url: config.auth.url,\n entry: config.auth.entry,\n source: config.auth.source,\n extendsRef: config.auth.extendsRef,\n localPath: config.auth.localPath,\n port: config.auth.port,\n proxy: config.auth.proxy,\n variables: config.auth.variables,\n secrets: config.auth.secrets,\n integrity: config.auth.integrity,\n shared: config.auth.shared,\n dependsOn: config.auth.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `auth:${config.auth.url}`,\n });\n }\n\n if (config.ui?.url) {\n nodes.set(\"ui\", {\n key: \"ui\",\n kind: \"ui\",\n name: config.ui.name,\n url: config.ui.url,\n entry: config.ui.entry,\n source: config.ui.source,\n localPath: config.ui.localPath,\n port: config.ui.port,\n integrity: config.ui.integrity,\n dependsOn: config.ui.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `ui:${config.ui.url}`,\n });\n }\n\n for (const [key, plugin] of Object.entries(config.plugins ?? {})) {\n if (!plugin.url) continue;\n nodes.set(key, {\n key,\n kind: \"plugin\",\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n source: plugin.source,\n extendsRef: plugin.extendsRef,\n localPath: plugin.localPath,\n port: plugin.port,\n proxy: plugin.proxy,\n variables: plugin.variables,\n secrets: plugin.secrets,\n integrity: plugin.integrity,\n shared: plugin.shared,\n connectSrc: plugin.connectSrc,\n ui: plugin.ui,\n routes: plugin.routes,\n dependsOn: plugin.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `plugin:${key}:${plugin.url}`,\n });\n }\n\n return nodes;\n}\n\nexport function manifestPluginsToNodes(\n plugins: Array<{\n key: string;\n name: string;\n url: string;\n dependsOn?: string[];\n secrets?: string[];\n variables?: JsonObject;\n }>,\n): RuntimeDependencyNode[] {\n if (!plugins?.length) return [];\n return plugins.map((p) => ({\n key: p.key,\n kind: \"plugin\" as const,\n name: p.name,\n url: p.url,\n entry: `${p.url}/mf-manifest.json`,\n source: \"remote\" as const,\n dependsOn: p.dependsOn,\n secrets: p.secrets,\n variables: p.variables,\n sourceOrigin: \"manifest\" as const,\n singletonKey: `plugin:${p.key}:${p.url}`,\n }));\n}\n\nexport function buildDependencyDAG(config: RuntimeConfig): DependencyDAG {\n const nodes =\n config.nodes && Object.keys(config.nodes).length > 0\n ? new Map(Object.entries(config.nodes))\n : normalizeToNodes(config);\n const sorted = topologicalSort(nodes);\n return { nodes, sorted };\n}\n\nexport function getImplicitApiDependencies(nodes: Map<string, RuntimeDependencyNode>): string[] {\n return [...nodes.values()].filter((n) => n.kind !== \"api\" && n.kind !== \"ui\").map((n) => n.key);\n}\n\nexport function topologicalSort(nodes: Map<string, RuntimeDependencyNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, Set<string>>();\n\n for (const key of nodes.keys()) {\n inDegree.set(key, 0);\n adjacency.set(key, new Set());\n }\n\n for (const [key, node] of nodes) {\n for (const dep of node.dependsOn ?? []) {\n if (nodes.has(dep)) {\n adjacency.get(dep)!.add(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n }\n\n const apiNode = nodes.get(\"api\");\n if (apiNode && !apiNode.dependsOn?.length) {\n for (const depKey of getImplicitApiDependencies(nodes)) {\n if (!adjacency.get(depKey)!.has(\"api\")) {\n adjacency.get(depKey)!.add(\"api\");\n inDegree.set(\"api\", (inDegree.get(\"api\") ?? 0) + 1);\n }\n }\n }\n\n const queue: string[] = [];\n for (const [key, degree] of inDegree) {\n if (degree === 0) queue.push(key);\n }\n queue.sort();\n\n const result: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n const neighbors = adjacency.get(current);\n if (neighbors) {\n for (const neighbor of neighbors) {\n const newDegree = (inDegree.get(neighbor) ?? 0) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) {\n const insertPos = queue.findIndex((k) => k > neighbor);\n if (insertPos === -1) queue.push(neighbor);\n else queue.splice(insertPos, 0, neighbor);\n }\n }\n }\n }\n\n if (result.length !== nodes.size) {\n const cyclic = [...nodes.keys()].filter((k) => !result.includes(k));\n throw new Error(\n `Circular dependency detected among: ${cyclic.join(\" -> \")}. Check dependsOn declarations in bos.config.json.`,\n );\n }\n\n return result;\n}\n\nexport function mergeManifestNodes(\n configNodes: Map<string, RuntimeDependencyNode>,\n manifestNodes: RuntimeDependencyNode[],\n): Map<string, RuntimeDependencyNode> {\n const merged = new Map(configNodes);\n\n for (const node of manifestNodes) {\n if (merged.has(node.key) && merged.get(node.key)!.sourceOrigin === \"config\") {\n continue;\n }\n merged.set(node.key, node);\n }\n\n return merged;\n}\n\nexport function getDependenciesForNode(\n node: RuntimeDependencyNode,\n allNodes: Map<string, RuntimeDependencyNode>,\n): RuntimeDependencyNode[] {\n if (node.kind === \"api\" && !node.dependsOn?.length) {\n return getImplicitApiDependencies(allNodes)\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n }\n\n const explicitDeps = (node.dependsOn ?? [])\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n\n return explicitDeps;\n}\n\nexport function getSingletonKey(node: RuntimeDependencyNode): string {\n return node.singletonKey ?? `${node.kind}:${node.key}:${node.url}`;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dag.d.cts","names":[],"sources":["../src/dag.ts"],"mappings":";;UAEiB;EACf,OAAO,YAAY;EACnB;;iBAGc,iBAAiB,QAAQ,gBAAgB,YAAY;iBA2FrD,uBACd,SAAS;EACP;EACA;EACA;EACA;EACA;EACA,YAAY;KAEb;iBAiBa,mBAAmB,QAAQ,gBAAgB;iBAS3C,2BAA2B,OAAO,YAAY;iBAI9C,gBAAgB,OAAO,YAAY;iBA8DnC,mBACd,aAAa,YAAY,wBACzB,eAAe,0BACd,YAAY;iBAaC,uBACd,MAAM,uBACN,UAAU,YAAY,yBACrB;iBAca,gBAAgB,MAAM"}
1
+ {"version":3,"file":"dag.d.cts","names":[],"sources":["../src/dag.ts"],"mappings":";;UAEiB;EACf,OAAO,YAAY;EACnB;;iBAGc,iBAAiB,QAAQ,gBAAgB,YAAY;iBA4FrD,uBACd,SAAS;EACP;EACA;EACA;EACA;EACA;EACA,YAAY;KAEb;iBAiBa,mBAAmB,QAAQ,gBAAgB;iBAS3C,2BAA2B,OAAO,YAAY;iBAI9C,gBAAgB,OAAO,YAAY;iBA8DnC,mBACd,aAAa,YAAY,wBACzB,eAAe,0BACd,YAAY;iBAaC,uBACd,MAAM,uBACN,UAAU,YAAY,yBACrB;iBAca,gBAAgB,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"dag.d.mts","names":[],"sources":["../src/dag.ts"],"mappings":";;UAEiB;EACf,OAAO,YAAY;EACnB;;iBAGc,iBAAiB,QAAQ,gBAAgB,YAAY;iBA2FrD,uBACd,SAAS;EACP;EACA;EACA;EACA;EACA;EACA,YAAY;KAEb;iBAiBa,mBAAmB,QAAQ,gBAAgB;iBAS3C,2BAA2B,OAAO,YAAY;iBAI9C,gBAAgB,OAAO,YAAY;iBA8DnC,mBACd,aAAa,YAAY,wBACzB,eAAe,0BACd,YAAY;iBAaC,uBACd,MAAM,uBACN,UAAU,YAAY,yBACrB;iBAca,gBAAgB,MAAM"}
1
+ {"version":3,"file":"dag.d.mts","names":[],"sources":["../src/dag.ts"],"mappings":";;UAEiB;EACf,OAAO,YAAY;EACnB;;iBAGc,iBAAiB,QAAQ,gBAAgB,YAAY;iBA4FrD,uBACd,SAAS;EACP;EACA;EACA;EACA;EACA;EACA,YAAY;KAEb;iBAiBa,mBAAmB,QAAQ,gBAAgB;iBAS3C,2BAA2B,OAAO,YAAY;iBAI9C,gBAAgB,OAAO,YAAY;iBA8DnC,mBACd,aAAa,YAAY,wBACzB,eAAe,0BACd,YAAY;iBAaC,uBACd,MAAM,uBACN,UAAU,YAAY,yBACrB;iBAca,gBAAgB,MAAM"}
package/dist/dag.mjs CHANGED
@@ -69,6 +69,7 @@ function normalizeToNodes(config) {
69
69
  secrets: plugin.secrets,
70
70
  integrity: plugin.integrity,
71
71
  shared: plugin.shared,
72
+ connectSrc: plugin.connectSrc,
72
73
  ui: plugin.ui,
73
74
  routes: plugin.routes,
74
75
  dependsOn: plugin.dependsOn,
package/dist/dag.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dag.mjs","names":[],"sources":["../src/dag.ts"],"sourcesContent":["import type { JsonObject, RuntimeConfig, RuntimeDependencyNode } from \"./types\";\n\nexport interface DependencyDAG {\n nodes: Map<string, RuntimeDependencyNode>;\n sorted: string[];\n}\n\nexport function normalizeToNodes(config: RuntimeConfig): Map<string, RuntimeDependencyNode> {\n const nodes = new Map<string, RuntimeDependencyNode>();\n\n if (config.api?.url) {\n nodes.set(\"api\", {\n key: \"api\",\n kind: \"api\",\n name: config.api.name,\n url: config.api.url,\n entry: config.api.entry,\n source: config.api.source,\n localPath: config.api.localPath,\n port: config.api.port,\n proxy: config.api.proxy,\n variables: config.api.variables,\n secrets: config.api.secrets,\n integrity: config.api.integrity,\n shared: config.api.shared,\n dependsOn: config.api.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `api:${config.api.url}`,\n });\n }\n\n if (config.auth?.url) {\n nodes.set(\"auth\", {\n key: \"auth\",\n kind: \"auth\",\n name: config.auth.name,\n url: config.auth.url,\n entry: config.auth.entry,\n source: config.auth.source,\n extendsRef: config.auth.extendsRef,\n localPath: config.auth.localPath,\n port: config.auth.port,\n proxy: config.auth.proxy,\n variables: config.auth.variables,\n secrets: config.auth.secrets,\n integrity: config.auth.integrity,\n shared: config.auth.shared,\n dependsOn: config.auth.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `auth:${config.auth.url}`,\n });\n }\n\n if (config.ui?.url) {\n nodes.set(\"ui\", {\n key: \"ui\",\n kind: \"ui\",\n name: config.ui.name,\n url: config.ui.url,\n entry: config.ui.entry,\n source: config.ui.source,\n localPath: config.ui.localPath,\n port: config.ui.port,\n integrity: config.ui.integrity,\n dependsOn: config.ui.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `ui:${config.ui.url}`,\n });\n }\n\n for (const [key, plugin] of Object.entries(config.plugins ?? {})) {\n if (!plugin.url) continue;\n nodes.set(key, {\n key,\n kind: \"plugin\",\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n source: plugin.source,\n extendsRef: plugin.extendsRef,\n localPath: plugin.localPath,\n port: plugin.port,\n proxy: plugin.proxy,\n variables: plugin.variables,\n secrets: plugin.secrets,\n integrity: plugin.integrity,\n shared: plugin.shared,\n ui: plugin.ui,\n routes: plugin.routes,\n dependsOn: plugin.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `plugin:${key}:${plugin.url}`,\n });\n }\n\n return nodes;\n}\n\nexport function manifestPluginsToNodes(\n plugins: Array<{\n key: string;\n name: string;\n url: string;\n dependsOn?: string[];\n secrets?: string[];\n variables?: JsonObject;\n }>,\n): RuntimeDependencyNode[] {\n if (!plugins?.length) return [];\n return plugins.map((p) => ({\n key: p.key,\n kind: \"plugin\" as const,\n name: p.name,\n url: p.url,\n entry: `${p.url}/mf-manifest.json`,\n source: \"remote\" as const,\n dependsOn: p.dependsOn,\n secrets: p.secrets,\n variables: p.variables,\n sourceOrigin: \"manifest\" as const,\n singletonKey: `plugin:${p.key}:${p.url}`,\n }));\n}\n\nexport function buildDependencyDAG(config: RuntimeConfig): DependencyDAG {\n const nodes =\n config.nodes && Object.keys(config.nodes).length > 0\n ? new Map(Object.entries(config.nodes))\n : normalizeToNodes(config);\n const sorted = topologicalSort(nodes);\n return { nodes, sorted };\n}\n\nexport function getImplicitApiDependencies(nodes: Map<string, RuntimeDependencyNode>): string[] {\n return [...nodes.values()].filter((n) => n.kind !== \"api\" && n.kind !== \"ui\").map((n) => n.key);\n}\n\nexport function topologicalSort(nodes: Map<string, RuntimeDependencyNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, Set<string>>();\n\n for (const key of nodes.keys()) {\n inDegree.set(key, 0);\n adjacency.set(key, new Set());\n }\n\n for (const [key, node] of nodes) {\n for (const dep of node.dependsOn ?? []) {\n if (nodes.has(dep)) {\n adjacency.get(dep)!.add(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n }\n\n const apiNode = nodes.get(\"api\");\n if (apiNode && !apiNode.dependsOn?.length) {\n for (const depKey of getImplicitApiDependencies(nodes)) {\n if (!adjacency.get(depKey)!.has(\"api\")) {\n adjacency.get(depKey)!.add(\"api\");\n inDegree.set(\"api\", (inDegree.get(\"api\") ?? 0) + 1);\n }\n }\n }\n\n const queue: string[] = [];\n for (const [key, degree] of inDegree) {\n if (degree === 0) queue.push(key);\n }\n queue.sort();\n\n const result: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n const neighbors = adjacency.get(current);\n if (neighbors) {\n for (const neighbor of neighbors) {\n const newDegree = (inDegree.get(neighbor) ?? 0) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) {\n const insertPos = queue.findIndex((k) => k > neighbor);\n if (insertPos === -1) queue.push(neighbor);\n else queue.splice(insertPos, 0, neighbor);\n }\n }\n }\n }\n\n if (result.length !== nodes.size) {\n const cyclic = [...nodes.keys()].filter((k) => !result.includes(k));\n throw new Error(\n `Circular dependency detected among: ${cyclic.join(\" -> \")}. Check dependsOn declarations in bos.config.json.`,\n );\n }\n\n return result;\n}\n\nexport function mergeManifestNodes(\n configNodes: Map<string, RuntimeDependencyNode>,\n manifestNodes: RuntimeDependencyNode[],\n): Map<string, RuntimeDependencyNode> {\n const merged = new Map(configNodes);\n\n for (const node of manifestNodes) {\n if (merged.has(node.key) && merged.get(node.key)!.sourceOrigin === \"config\") {\n continue;\n }\n merged.set(node.key, node);\n }\n\n return merged;\n}\n\nexport function getDependenciesForNode(\n node: RuntimeDependencyNode,\n allNodes: Map<string, RuntimeDependencyNode>,\n): RuntimeDependencyNode[] {\n if (node.kind === \"api\" && !node.dependsOn?.length) {\n return getImplicitApiDependencies(allNodes)\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n }\n\n const explicitDeps = (node.dependsOn ?? [])\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n\n return explicitDeps;\n}\n\nexport function getSingletonKey(node: RuntimeDependencyNode): string {\n return node.singletonKey ?? `${node.kind}:${node.key}:${node.url}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dag.mjs","names":[],"sources":["../src/dag.ts"],"sourcesContent":["import type { JsonObject, RuntimeConfig, RuntimeDependencyNode } from \"./types\";\n\nexport interface DependencyDAG {\n nodes: Map<string, RuntimeDependencyNode>;\n sorted: string[];\n}\n\nexport function normalizeToNodes(config: RuntimeConfig): Map<string, RuntimeDependencyNode> {\n const nodes = new Map<string, RuntimeDependencyNode>();\n\n if (config.api?.url) {\n nodes.set(\"api\", {\n key: \"api\",\n kind: \"api\",\n name: config.api.name,\n url: config.api.url,\n entry: config.api.entry,\n source: config.api.source,\n localPath: config.api.localPath,\n port: config.api.port,\n proxy: config.api.proxy,\n variables: config.api.variables,\n secrets: config.api.secrets,\n integrity: config.api.integrity,\n shared: config.api.shared,\n dependsOn: config.api.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `api:${config.api.url}`,\n });\n }\n\n if (config.auth?.url) {\n nodes.set(\"auth\", {\n key: \"auth\",\n kind: \"auth\",\n name: config.auth.name,\n url: config.auth.url,\n entry: config.auth.entry,\n source: config.auth.source,\n extendsRef: config.auth.extendsRef,\n localPath: config.auth.localPath,\n port: config.auth.port,\n proxy: config.auth.proxy,\n variables: config.auth.variables,\n secrets: config.auth.secrets,\n integrity: config.auth.integrity,\n shared: config.auth.shared,\n dependsOn: config.auth.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `auth:${config.auth.url}`,\n });\n }\n\n if (config.ui?.url) {\n nodes.set(\"ui\", {\n key: \"ui\",\n kind: \"ui\",\n name: config.ui.name,\n url: config.ui.url,\n entry: config.ui.entry,\n source: config.ui.source,\n localPath: config.ui.localPath,\n port: config.ui.port,\n integrity: config.ui.integrity,\n dependsOn: config.ui.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `ui:${config.ui.url}`,\n });\n }\n\n for (const [key, plugin] of Object.entries(config.plugins ?? {})) {\n if (!plugin.url) continue;\n nodes.set(key, {\n key,\n kind: \"plugin\",\n name: plugin.name,\n url: plugin.url,\n entry: plugin.entry,\n source: plugin.source,\n extendsRef: plugin.extendsRef,\n localPath: plugin.localPath,\n port: plugin.port,\n proxy: plugin.proxy,\n variables: plugin.variables,\n secrets: plugin.secrets,\n integrity: plugin.integrity,\n shared: plugin.shared,\n connectSrc: plugin.connectSrc,\n ui: plugin.ui,\n routes: plugin.routes,\n dependsOn: plugin.dependsOn,\n sourceOrigin: \"config\",\n singletonKey: `plugin:${key}:${plugin.url}`,\n });\n }\n\n return nodes;\n}\n\nexport function manifestPluginsToNodes(\n plugins: Array<{\n key: string;\n name: string;\n url: string;\n dependsOn?: string[];\n secrets?: string[];\n variables?: JsonObject;\n }>,\n): RuntimeDependencyNode[] {\n if (!plugins?.length) return [];\n return plugins.map((p) => ({\n key: p.key,\n kind: \"plugin\" as const,\n name: p.name,\n url: p.url,\n entry: `${p.url}/mf-manifest.json`,\n source: \"remote\" as const,\n dependsOn: p.dependsOn,\n secrets: p.secrets,\n variables: p.variables,\n sourceOrigin: \"manifest\" as const,\n singletonKey: `plugin:${p.key}:${p.url}`,\n }));\n}\n\nexport function buildDependencyDAG(config: RuntimeConfig): DependencyDAG {\n const nodes =\n config.nodes && Object.keys(config.nodes).length > 0\n ? new Map(Object.entries(config.nodes))\n : normalizeToNodes(config);\n const sorted = topologicalSort(nodes);\n return { nodes, sorted };\n}\n\nexport function getImplicitApiDependencies(nodes: Map<string, RuntimeDependencyNode>): string[] {\n return [...nodes.values()].filter((n) => n.kind !== \"api\" && n.kind !== \"ui\").map((n) => n.key);\n}\n\nexport function topologicalSort(nodes: Map<string, RuntimeDependencyNode>): string[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, Set<string>>();\n\n for (const key of nodes.keys()) {\n inDegree.set(key, 0);\n adjacency.set(key, new Set());\n }\n\n for (const [key, node] of nodes) {\n for (const dep of node.dependsOn ?? []) {\n if (nodes.has(dep)) {\n adjacency.get(dep)!.add(key);\n inDegree.set(key, (inDegree.get(key) ?? 0) + 1);\n }\n }\n }\n\n const apiNode = nodes.get(\"api\");\n if (apiNode && !apiNode.dependsOn?.length) {\n for (const depKey of getImplicitApiDependencies(nodes)) {\n if (!adjacency.get(depKey)!.has(\"api\")) {\n adjacency.get(depKey)!.add(\"api\");\n inDegree.set(\"api\", (inDegree.get(\"api\") ?? 0) + 1);\n }\n }\n }\n\n const queue: string[] = [];\n for (const [key, degree] of inDegree) {\n if (degree === 0) queue.push(key);\n }\n queue.sort();\n\n const result: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n const neighbors = adjacency.get(current);\n if (neighbors) {\n for (const neighbor of neighbors) {\n const newDegree = (inDegree.get(neighbor) ?? 0) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) {\n const insertPos = queue.findIndex((k) => k > neighbor);\n if (insertPos === -1) queue.push(neighbor);\n else queue.splice(insertPos, 0, neighbor);\n }\n }\n }\n }\n\n if (result.length !== nodes.size) {\n const cyclic = [...nodes.keys()].filter((k) => !result.includes(k));\n throw new Error(\n `Circular dependency detected among: ${cyclic.join(\" -> \")}. Check dependsOn declarations in bos.config.json.`,\n );\n }\n\n return result;\n}\n\nexport function mergeManifestNodes(\n configNodes: Map<string, RuntimeDependencyNode>,\n manifestNodes: RuntimeDependencyNode[],\n): Map<string, RuntimeDependencyNode> {\n const merged = new Map(configNodes);\n\n for (const node of manifestNodes) {\n if (merged.has(node.key) && merged.get(node.key)!.sourceOrigin === \"config\") {\n continue;\n }\n merged.set(node.key, node);\n }\n\n return merged;\n}\n\nexport function getDependenciesForNode(\n node: RuntimeDependencyNode,\n allNodes: Map<string, RuntimeDependencyNode>,\n): RuntimeDependencyNode[] {\n if (node.kind === \"api\" && !node.dependsOn?.length) {\n return getImplicitApiDependencies(allNodes)\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n }\n\n const explicitDeps = (node.dependsOn ?? [])\n .map((k) => allNodes.get(k))\n .filter(Boolean) as RuntimeDependencyNode[];\n\n return explicitDeps;\n}\n\nexport function getSingletonKey(node: RuntimeDependencyNode): string {\n return node.singletonKey ?? `${node.kind}:${node.key}:${node.url}`;\n}\n"],"mappings":"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"}
package/dist/merge.cjs CHANGED
@@ -14,7 +14,7 @@ const BOS_CONFIG_ORDER = [
14
14
  "app",
15
15
  "plugins"
16
16
  ];
17
- const ARRAY_UNION_KEYS = /* @__PURE__ */ new Set(["secrets"]);
17
+ const ARRAY_UNION_KEYS = /* @__PURE__ */ new Set(["secrets", "connectSrc"]);
18
18
  function isPlainObject(value) {
19
19
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge.cjs","names":[],"sources":["../src/merge.ts"],"sourcesContent":["import { createDefu } from \"defu\";\nimport type { BosConfigInput, ExtendsConfig } from \"./types\";\n\nexport const BOS_CONFIG_ORDER = [\n \"extends\",\n \"account\",\n \"domain\",\n \"title\",\n \"description\",\n \"testnet\",\n \"staging\",\n \"repository\",\n \"ci\",\n \"app\",\n \"plugins\",\n] as const;\n\nexport type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];\n\nexport type BosEnv = \"development\" | \"production\" | \"staging\";\n\nexport interface ResolvedConfigMeta {\n env: BosEnv;\n resolvedAt: string;\n extendsChain: string[];\n source?: string;\n}\n\nconst ARRAY_UNION_KEYS = new Set([\"secrets\"]);\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction unionArrays(a: unknown, b: unknown): unknown[] | undefined {\n const aArr = Array.isArray(a) ? a : [];\n const bArr = Array.isArray(b) ? b : [];\n if (aArr.length === 0 && bArr.length === 0) return undefined;\n const seen = new Set<string>();\n const result: unknown[] = [];\n for (const item of [...aArr, ...bArr]) {\n if (typeof item === \"string\") {\n if (seen.has(item)) continue;\n seen.add(item);\n }\n result.push(item);\n }\n return result;\n}\n\nfunction cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) continue;\n if (isPlainObject(value)) {\n const cleaned = cleanNullSentinels(value);\n if (Object.keys(cleaned).length > 0) {\n out[key] = cleaned;\n }\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {\n if (obj[key] === null) return true;\n if (value === null) {\n obj[key] = null;\n return true;\n }\n if (Array.isArray(obj[key]) && Array.isArray(value)) {\n if (ARRAY_UNION_KEYS.has(key)) {\n obj[key] = unionArrays(obj[key], value);\n } else {\n obj[key] = value;\n }\n return true;\n }\n return false;\n});\n\nexport function resolveExtendsRef(\n extendsField: string | ExtendsConfig | undefined,\n env: BosEnv,\n): string | undefined {\n if (!extendsField) return undefined;\n if (typeof extendsField === \"string\") return extendsField;\n return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);\n}\n\nexport function mergeBosConfigWithExtends(\n parent: BosConfigInput,\n child: BosConfigInput,\n): BosConfigInput {\n const merged = bosConfigMerger(child, parent) as BosConfigInput;\n\n if (child.plugins !== undefined && isPlainObject(child.plugins)) {\n (merged as Record<string, unknown>).plugins = cleanNullSentinels(\n child.plugins as Record<string, unknown>,\n );\n }\n\n const mergedRecord = merged as Record<string, unknown>;\n\n if (isPlainObject(mergedRecord.app)) {\n for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {\n if (!isPlainObject(entryVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(entryVal[secretKey])) {\n entryVal[secretKey] =\n (unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? entryVal[secretKey];\n }\n }\n }\n }\n\n if (isPlainObject(mergedRecord.plugins)) {\n for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {\n if (!isPlainObject(pluginVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(pluginVal[secretKey])) {\n pluginVal[secretKey] =\n (unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? pluginVal[secretKey];\n }\n }\n }\n }\n\n return rebuildOrderedConfig(mergedRecord) as BosConfigInput;\n}\n\nexport function mergeBosConfigWithTemplate(\n local: BosConfigInput,\n template: BosConfigInput,\n): BosConfigInput {\n const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;\n return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;\n}\n\nfunction mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {\n if (isPlainObject(local) && isPlainObject(template)) {\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(local)) {\n merged[key] = mergeJsonValuesPreservingLocalOrder(\n local[key],\n (template as Record<string, unknown>)[key],\n );\n }\n for (const key of Object.keys(template as Record<string, unknown>)) {\n if (!(key in merged)) {\n merged[key] = (template as Record<string, unknown>)[key];\n }\n }\n return merged;\n }\n return local ?? template;\n}\n\nexport function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {\n const ordered: Record<string, unknown> = {};\n\n for (const key of BOS_CONFIG_ORDER) {\n if (key in config) {\n ordered[key] = config[key];\n }\n }\n\n for (const key of Object.keys(config)) {\n if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {\n ordered[key] = config[key];\n }\n }\n\n return ordered as T;\n}\n\nexport { bosConfigMerger };\n"],"mappings":"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"}
1
+ {"version":3,"file":"merge.cjs","names":[],"sources":["../src/merge.ts"],"sourcesContent":["import { createDefu } from \"defu\";\nimport type { BosConfigInput, ExtendsConfig } from \"./types\";\n\nexport const BOS_CONFIG_ORDER = [\n \"extends\",\n \"account\",\n \"domain\",\n \"title\",\n \"description\",\n \"testnet\",\n \"staging\",\n \"repository\",\n \"ci\",\n \"app\",\n \"plugins\",\n] as const;\n\nexport type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];\n\nexport type BosEnv = \"development\" | \"production\" | \"staging\";\n\nexport interface ResolvedConfigMeta {\n env: BosEnv;\n resolvedAt: string;\n extendsChain: string[];\n source?: string;\n}\n\nconst ARRAY_UNION_KEYS = new Set([\"secrets\", \"connectSrc\"]);\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction unionArrays(a: unknown, b: unknown): unknown[] | undefined {\n const aArr = Array.isArray(a) ? a : [];\n const bArr = Array.isArray(b) ? b : [];\n if (aArr.length === 0 && bArr.length === 0) return undefined;\n const seen = new Set<string>();\n const result: unknown[] = [];\n for (const item of [...aArr, ...bArr]) {\n if (typeof item === \"string\") {\n if (seen.has(item)) continue;\n seen.add(item);\n }\n result.push(item);\n }\n return result;\n}\n\nfunction cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) continue;\n if (isPlainObject(value)) {\n const cleaned = cleanNullSentinels(value);\n if (Object.keys(cleaned).length > 0) {\n out[key] = cleaned;\n }\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {\n if (obj[key] === null) return true;\n if (value === null) {\n obj[key] = null;\n return true;\n }\n if (Array.isArray(obj[key]) && Array.isArray(value)) {\n if (ARRAY_UNION_KEYS.has(key)) {\n obj[key] = unionArrays(obj[key], value);\n } else {\n obj[key] = value;\n }\n return true;\n }\n return false;\n});\n\nexport function resolveExtendsRef(\n extendsField: string | ExtendsConfig | undefined,\n env: BosEnv,\n): string | undefined {\n if (!extendsField) return undefined;\n if (typeof extendsField === \"string\") return extendsField;\n return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);\n}\n\nexport function mergeBosConfigWithExtends(\n parent: BosConfigInput,\n child: BosConfigInput,\n): BosConfigInput {\n const merged = bosConfigMerger(child, parent) as BosConfigInput;\n\n if (child.plugins !== undefined && isPlainObject(child.plugins)) {\n (merged as Record<string, unknown>).plugins = cleanNullSentinels(\n child.plugins as Record<string, unknown>,\n );\n }\n\n const mergedRecord = merged as Record<string, unknown>;\n\n if (isPlainObject(mergedRecord.app)) {\n for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {\n if (!isPlainObject(entryVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(entryVal[secretKey])) {\n entryVal[secretKey] =\n (unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? entryVal[secretKey];\n }\n }\n }\n }\n\n if (isPlainObject(mergedRecord.plugins)) {\n for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {\n if (!isPlainObject(pluginVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(pluginVal[secretKey])) {\n pluginVal[secretKey] =\n (unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? pluginVal[secretKey];\n }\n }\n }\n }\n\n return rebuildOrderedConfig(mergedRecord) as BosConfigInput;\n}\n\nexport function mergeBosConfigWithTemplate(\n local: BosConfigInput,\n template: BosConfigInput,\n): BosConfigInput {\n const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;\n return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;\n}\n\nfunction mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {\n if (isPlainObject(local) && isPlainObject(template)) {\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(local)) {\n merged[key] = mergeJsonValuesPreservingLocalOrder(\n local[key],\n (template as Record<string, unknown>)[key],\n );\n }\n for (const key of Object.keys(template as Record<string, unknown>)) {\n if (!(key in merged)) {\n merged[key] = (template as Record<string, unknown>)[key];\n }\n }\n return merged;\n }\n return local ?? template;\n}\n\nexport function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {\n const ordered: Record<string, unknown> = {};\n\n for (const key of BOS_CONFIG_ORDER) {\n if (key in config) {\n ordered[key] = config[key];\n }\n }\n\n for (const key of Object.keys(config)) {\n if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {\n ordered[key] = config[key];\n }\n }\n\n return ordered as T;\n}\n\nexport { bosConfigMerger };\n"],"mappings":"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"}
package/dist/merge.mjs CHANGED
@@ -14,7 +14,7 @@ const BOS_CONFIG_ORDER = [
14
14
  "app",
15
15
  "plugins"
16
16
  ];
17
- const ARRAY_UNION_KEYS = /* @__PURE__ */ new Set(["secrets"]);
17
+ const ARRAY_UNION_KEYS = /* @__PURE__ */ new Set(["secrets", "connectSrc"]);
18
18
  function isPlainObject(value) {
19
19
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge.mjs","names":[],"sources":["../src/merge.ts"],"sourcesContent":["import { createDefu } from \"defu\";\nimport type { BosConfigInput, ExtendsConfig } from \"./types\";\n\nexport const BOS_CONFIG_ORDER = [\n \"extends\",\n \"account\",\n \"domain\",\n \"title\",\n \"description\",\n \"testnet\",\n \"staging\",\n \"repository\",\n \"ci\",\n \"app\",\n \"plugins\",\n] as const;\n\nexport type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];\n\nexport type BosEnv = \"development\" | \"production\" | \"staging\";\n\nexport interface ResolvedConfigMeta {\n env: BosEnv;\n resolvedAt: string;\n extendsChain: string[];\n source?: string;\n}\n\nconst ARRAY_UNION_KEYS = new Set([\"secrets\"]);\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction unionArrays(a: unknown, b: unknown): unknown[] | undefined {\n const aArr = Array.isArray(a) ? a : [];\n const bArr = Array.isArray(b) ? b : [];\n if (aArr.length === 0 && bArr.length === 0) return undefined;\n const seen = new Set<string>();\n const result: unknown[] = [];\n for (const item of [...aArr, ...bArr]) {\n if (typeof item === \"string\") {\n if (seen.has(item)) continue;\n seen.add(item);\n }\n result.push(item);\n }\n return result;\n}\n\nfunction cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) continue;\n if (isPlainObject(value)) {\n const cleaned = cleanNullSentinels(value);\n if (Object.keys(cleaned).length > 0) {\n out[key] = cleaned;\n }\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {\n if (obj[key] === null) return true;\n if (value === null) {\n obj[key] = null;\n return true;\n }\n if (Array.isArray(obj[key]) && Array.isArray(value)) {\n if (ARRAY_UNION_KEYS.has(key)) {\n obj[key] = unionArrays(obj[key], value);\n } else {\n obj[key] = value;\n }\n return true;\n }\n return false;\n});\n\nexport function resolveExtendsRef(\n extendsField: string | ExtendsConfig | undefined,\n env: BosEnv,\n): string | undefined {\n if (!extendsField) return undefined;\n if (typeof extendsField === \"string\") return extendsField;\n return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);\n}\n\nexport function mergeBosConfigWithExtends(\n parent: BosConfigInput,\n child: BosConfigInput,\n): BosConfigInput {\n const merged = bosConfigMerger(child, parent) as BosConfigInput;\n\n if (child.plugins !== undefined && isPlainObject(child.plugins)) {\n (merged as Record<string, unknown>).plugins = cleanNullSentinels(\n child.plugins as Record<string, unknown>,\n );\n }\n\n const mergedRecord = merged as Record<string, unknown>;\n\n if (isPlainObject(mergedRecord.app)) {\n for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {\n if (!isPlainObject(entryVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(entryVal[secretKey])) {\n entryVal[secretKey] =\n (unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? entryVal[secretKey];\n }\n }\n }\n }\n\n if (isPlainObject(mergedRecord.plugins)) {\n for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {\n if (!isPlainObject(pluginVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(pluginVal[secretKey])) {\n pluginVal[secretKey] =\n (unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? pluginVal[secretKey];\n }\n }\n }\n }\n\n return rebuildOrderedConfig(mergedRecord) as BosConfigInput;\n}\n\nexport function mergeBosConfigWithTemplate(\n local: BosConfigInput,\n template: BosConfigInput,\n): BosConfigInput {\n const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;\n return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;\n}\n\nfunction mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {\n if (isPlainObject(local) && isPlainObject(template)) {\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(local)) {\n merged[key] = mergeJsonValuesPreservingLocalOrder(\n local[key],\n (template as Record<string, unknown>)[key],\n );\n }\n for (const key of Object.keys(template as Record<string, unknown>)) {\n if (!(key in merged)) {\n merged[key] = (template as Record<string, unknown>)[key];\n }\n }\n return merged;\n }\n return local ?? template;\n}\n\nexport function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {\n const ordered: Record<string, unknown> = {};\n\n for (const key of BOS_CONFIG_ORDER) {\n if (key in config) {\n ordered[key] = config[key];\n }\n }\n\n for (const key of Object.keys(config)) {\n if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {\n ordered[key] = config[key];\n }\n }\n\n return ordered as T;\n}\n\nexport { bosConfigMerger };\n"],"mappings":"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"}
1
+ {"version":3,"file":"merge.mjs","names":[],"sources":["../src/merge.ts"],"sourcesContent":["import { createDefu } from \"defu\";\nimport type { BosConfigInput, ExtendsConfig } from \"./types\";\n\nexport const BOS_CONFIG_ORDER = [\n \"extends\",\n \"account\",\n \"domain\",\n \"title\",\n \"description\",\n \"testnet\",\n \"staging\",\n \"repository\",\n \"ci\",\n \"app\",\n \"plugins\",\n] as const;\n\nexport type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];\n\nexport type BosEnv = \"development\" | \"production\" | \"staging\";\n\nexport interface ResolvedConfigMeta {\n env: BosEnv;\n resolvedAt: string;\n extendsChain: string[];\n source?: string;\n}\n\nconst ARRAY_UNION_KEYS = new Set([\"secrets\", \"connectSrc\"]);\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction unionArrays(a: unknown, b: unknown): unknown[] | undefined {\n const aArr = Array.isArray(a) ? a : [];\n const bArr = Array.isArray(b) ? b : [];\n if (aArr.length === 0 && bArr.length === 0) return undefined;\n const seen = new Set<string>();\n const result: unknown[] = [];\n for (const item of [...aArr, ...bArr]) {\n if (typeof item === \"string\") {\n if (seen.has(item)) continue;\n seen.add(item);\n }\n result.push(item);\n }\n return result;\n}\n\nfunction cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === null || value === undefined) continue;\n if (isPlainObject(value)) {\n const cleaned = cleanNullSentinels(value);\n if (Object.keys(cleaned).length > 0) {\n out[key] = cleaned;\n }\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {\n if (obj[key] === null) return true;\n if (value === null) {\n obj[key] = null;\n return true;\n }\n if (Array.isArray(obj[key]) && Array.isArray(value)) {\n if (ARRAY_UNION_KEYS.has(key)) {\n obj[key] = unionArrays(obj[key], value);\n } else {\n obj[key] = value;\n }\n return true;\n }\n return false;\n});\n\nexport function resolveExtendsRef(\n extendsField: string | ExtendsConfig | undefined,\n env: BosEnv,\n): string | undefined {\n if (!extendsField) return undefined;\n if (typeof extendsField === \"string\") return extendsField;\n return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);\n}\n\nexport function mergeBosConfigWithExtends(\n parent: BosConfigInput,\n child: BosConfigInput,\n): BosConfigInput {\n const merged = bosConfigMerger(child, parent) as BosConfigInput;\n\n if (child.plugins !== undefined && isPlainObject(child.plugins)) {\n (merged as Record<string, unknown>).plugins = cleanNullSentinels(\n child.plugins as Record<string, unknown>,\n );\n }\n\n const mergedRecord = merged as Record<string, unknown>;\n\n if (isPlainObject(mergedRecord.app)) {\n for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {\n if (!isPlainObject(entryVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(entryVal[secretKey])) {\n entryVal[secretKey] =\n (unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? entryVal[secretKey];\n }\n }\n }\n }\n\n if (isPlainObject(mergedRecord.plugins)) {\n for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {\n if (!isPlainObject(pluginVal)) continue;\n for (const secretKey of ARRAY_UNION_KEYS) {\n if (Array.isArray(pluginVal[secretKey])) {\n pluginVal[secretKey] =\n (unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(\n Boolean,\n ) ?? pluginVal[secretKey];\n }\n }\n }\n }\n\n return rebuildOrderedConfig(mergedRecord) as BosConfigInput;\n}\n\nexport function mergeBosConfigWithTemplate(\n local: BosConfigInput,\n template: BosConfigInput,\n): BosConfigInput {\n const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;\n return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;\n}\n\nfunction mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {\n if (isPlainObject(local) && isPlainObject(template)) {\n const merged: Record<string, unknown> = {};\n for (const key of Object.keys(local)) {\n merged[key] = mergeJsonValuesPreservingLocalOrder(\n local[key],\n (template as Record<string, unknown>)[key],\n );\n }\n for (const key of Object.keys(template as Record<string, unknown>)) {\n if (!(key in merged)) {\n merged[key] = (template as Record<string, unknown>)[key];\n }\n }\n return merged;\n }\n return local ?? template;\n}\n\nexport function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {\n const ordered: Record<string, unknown> = {};\n\n for (const key of BOS_CONFIG_ORDER) {\n if (key in config) {\n ordered[key] = config[key];\n }\n }\n\n for (const key of Object.keys(config)) {\n if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {\n ordered[key] = config[key];\n }\n }\n\n return ordered as T;\n}\n\nexport { bosConfigMerger };\n"],"mappings":"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"}
@@ -188,7 +188,7 @@ const spawnDevProcess = (descriptor, callbacks) => effect.Effect.gen(function* (
188
188
  FORCE_COLOR: "1",
189
189
  ...port > 0 ? { PORT: String(port) } : {}
190
190
  };
191
- if (name === "host") envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);
191
+ envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);
192
192
  const cmd = _effect_platform.Command.make(command, ...args).pipe(_effect_platform.Command.workingDirectory(fullCwd), _effect_platform.Command.env(envVars));
193
193
  const proc = yield* _effect_platform.Command.start(cmd);
194
194
  const markReady = effect.Effect.gen(function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.cjs","names":["Effect","DevRuntimeConfig","Deferred","Ref","Command","Stream","Option","ServiceDescriptorMap"],"sources":["../src/orchestrator.ts"],"sourcesContent":["import { Command } from \"@effect/platform\";\nimport type { ExitCode } from \"@effect/platform/CommandExecutor\";\nimport { Deferred, Effect, Option, Ref, Stream } from \"effect\";\nimport { patchManifestFetchForSsrPublicPath } from \"./mf\";\nimport {\n DevRuntimeConfig,\n type ServiceDescriptor,\n ServiceDescriptorMap,\n} from \"./service-descriptor\";\nimport type { RuntimeConfig } from \"./types\";\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"[Orchestrator] Unhandled rejection:\", reason);\n});\n\nprocess.on(\"uncaughtException\", (err) => {\n console.error(\"[Orchestrator] Uncaught exception:\", err);\n});\n\nexport interface ProcessCallbacks {\n onStatus: (name: string, status: ProcessStatus, message?: string) => void;\n onLog: (name: string, line: string, isError?: boolean) => void;\n}\n\nexport interface ProcessHandle {\n name: string;\n pid: number | undefined;\n kill: Effect.Effect<void, unknown>;\n waitForReady: Effect.Effect<void, Error>;\n waitForExit: Effect.Effect<ExitCode, unknown>;\n}\n\nexport type ProcessStatus = \"pending\" | \"starting\" | \"ready\" | \"error\";\n\nexport interface ProcessState {\n name: string;\n status: ProcessStatus;\n port: number;\n message?: string;\n source?: \"local\" | \"remote\";\n}\n\nconst stripAnsi = (input: string): string => {\n const ESC = String.fromCharCode(27);\n const BEL = String.fromCharCode(7);\n return input\n .replace(new RegExp(`${ESC}\\\\][^${BEL}]*${BEL}`, \"g\"), \"\")\n .replace(new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, \"g\"), \"\");\n};\n\nconst probeHttpOk = (url: string, timeoutMs = 400) =>\n Effect.tryPromise({\n try: async () => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n },\n catch: () => false,\n });\n\nconst LOCAL_PROBE_DEADLINE_MS = 90_000;\nconst LOCAL_PROBE_INTERVAL_MS = 200;\n\nconst REMOTE_PROBE_TIMEOUT_MS = 5000;\nconst REMOTE_PROBE_DEADLINE_MS = 60_000;\nconst REMOTE_PROBE_BACKOFF_INITIAL_MS = 1000;\nconst REMOTE_PROBE_BACKOFF_MAX_MS = 15_000;\n\nconst detectStatus = (\n line: string,\n descriptor: ServiceDescriptor,\n): { status: ProcessStatus; isError: boolean } | null => {\n const cleanLine = stripAnsi(line);\n const errorPatterns = descriptor.errorPatterns ?? [];\n const readyPatterns = descriptor.readyPatterns ?? [];\n for (const pattern of errorPatterns) {\n if (pattern.test(cleanLine)) {\n return { status: \"error\", isError: true };\n }\n }\n for (const pattern of readyPatterns) {\n if (pattern.test(cleanLine)) {\n return { status: \"ready\", isError: false };\n }\n }\n return null;\n};\n\ninterface ServerHandle {\n ready: Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ServerInput {\n config: RuntimeConfig;\n port?: number;\n env?: Record<string, string>;\n}\n\nconst patchConsole = (name: string, callbacks: ProcessCallbacks): (() => void) => {\n const originalLog = console.log;\n const originalError = console.error;\n const originalWarn = console.warn;\n const originalInfo = console.info;\n\n const formatArgs = (args: unknown[], isError = false): string => {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n const parts = [`${arg.name}: ${arg.message}`];\n if (arg.cause instanceof Error)\n parts.push(`(cause: ${arg.cause.name}: ${arg.cause.message})`);\n else if (arg.cause) parts.push(`(cause: ${String(arg.cause)})`);\n if (isError && arg.stack) parts.push(arg.stack);\n return parts.join(\"\\n\");\n }\n return typeof arg === \"object\" ? JSON.stringify(arg, null, 2) : String(arg);\n })\n .join(\" \");\n };\n\n console.log = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args), false);\n };\n console.error = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args, true), true);\n };\n console.warn = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args), false);\n };\n console.info = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args), false);\n };\n\n return () => {\n console.log = originalLog;\n console.error = originalError;\n console.warn = originalWarn;\n console.info = originalInfo;\n };\n};\n\nconst spawnRemoteHost = (descriptor: ServiceDescriptor, callbacks: ProcessCallbacks) =>\n Effect.gen(function* () {\n const runtimeConfig = yield* DevRuntimeConfig;\n const remoteUrl = descriptor.remoteUrl;\n if (!remoteUrl) {\n return yield* Effect.fail(new Error(\"remoteUrl not provided on host descriptor\"));\n }\n\n callbacks.onStatus(descriptor.key, \"starting\");\n callbacks.onLog(descriptor.key, `Remote: ${remoteUrl}`);\n const restoreConsole = patchConsole(descriptor.key, callbacks);\n callbacks.onLog(descriptor.key, \"Loading Module Federation runtime...\");\n\n const mfRuntime = yield* Effect.tryPromise({\n try: () => import(\"@module-federation/enhanced/runtime\"),\n catch: (e) => new Error(`Failed to load MF runtime: ${e}`),\n });\n\n const mfCore = yield* Effect.tryPromise({\n try: () => import(\"@module-federation/runtime-core\"),\n catch: (e) => new Error(`Failed to load MF core: ${e}`),\n });\n\n let mf = mfRuntime.getInstance();\n if (!mf) {\n mf = mfRuntime.createInstance({ name: \"cli-host\", remotes: [] });\n mfCore.setGlobalFederationInstance(mf);\n }\n patchManifestFetchForSsrPublicPath(mf as any);\n\n const baseUrl = remoteUrl\n .replace(/\\/remoteEntry\\.js$/, \"\")\n .replace(/\\/mf-manifest\\.json$/, \"\")\n .replace(/\\/$/, \"\");\n const remoteEntryUrl = `${baseUrl}/remoteEntry.js`;\n const manifestUrl = `${baseUrl}/mf-manifest.json`;\n\n const entryUrl = yield* Effect.tryPromise({\n try: async () => {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10_000);\n let res: Response;\n try {\n res = await fetch(manifestUrl, { signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n if (!res.ok) return remoteEntryUrl;\n const json = (await res.json()) as Record<string, unknown>;\n if (\n json &&\n typeof json === \"object\" &&\n \"metaData\" in json &&\n \"exposes\" in json &&\n \"shared\" in json\n ) {\n return manifestUrl;\n }\n } catch (e) {\n console.warn(\n `[Orchestrator] Failed to fetch or parse manifest from ${manifestUrl}, falling back to remoteEntryUrl: ${e}`,\n );\n }\n return remoteEntryUrl;\n },\n catch: () => remoteEntryUrl,\n });\n\n (mf as any).registerRemotes([{ name: \"host\", entry: entryUrl }]);\n callbacks.onLog(descriptor.key, `Loading host from ${entryUrl}...`);\n\n const hostModule = yield* Effect.tryPromise({\n try: () =>\n (mf as any).loadRemote(\"host/Server\") as Promise<{\n runServer: (input: ServerInput) => ServerHandle;\n }>,\n catch: (e) => new Error(`Failed to load host module: ${e}`),\n });\n\n if (!hostModule?.runServer) {\n return yield* Effect.fail(new Error(\"Host module does not export runServer function\"));\n }\n\n callbacks.onLog(descriptor.key, \"Starting server...\");\n const hostPort = runtimeConfig.host?.port;\n const hostEnv: Record<string, string> | undefined = hostPort\n ? { PORT: String(hostPort) }\n : undefined;\n const serverHandle = hostModule.runServer({\n config: runtimeConfig,\n port: hostPort,\n env: hostEnv,\n });\n yield* Effect.tryPromise({\n try: () => serverHandle.ready,\n catch: (e) => new Error(`Server failed to start: ${e}`),\n });\n\n callbacks.onStatus(descriptor.key, \"ready\");\n\n return {\n name: descriptor.key,\n pid: process.pid,\n kill: Effect.gen(function* () {\n callbacks.onLog(descriptor.key, \"Shutting down remote host...\");\n restoreConsole();\n yield* Effect.tryPromise({\n try: () => serverHandle.shutdown(),\n catch: () => {},\n }).pipe(Effect.ignore);\n }),\n waitForReady: Effect.succeed(undefined),\n waitForExit: Effect.never,\n } satisfies ProcessHandle;\n });\n\nconst spawnDevProcess = (descriptor: ServiceDescriptor, callbacks: ProcessCallbacks) =>\n Effect.gen(function* () {\n const runtimeConfig = yield* DevRuntimeConfig;\n\n if (!descriptor.localPath) {\n return yield* Effect.fail(new Error(`No localPath for local service: ${descriptor.key}`));\n }\n\n const fullCwd = descriptor.localPath;\n const command = descriptor.command ?? \"bun\";\n const args = descriptor.args ?? [\"run\", \"dev\"];\n const port = descriptor.port ?? descriptor.defaultPort;\n const name = descriptor.key;\n\n const readyDeferred = yield* Deferred.make<void, Error>();\n const statusRef = yield* Ref.make<ProcessStatus>(\"starting\");\n\n callbacks.onStatus(name, \"starting\");\n\n const envVars: Record<string, string> = {\n ...(process.env as Record<string, string>),\n FORCE_COLOR: \"1\",\n ...(port > 0 ? { PORT: String(port) } : {}),\n };\n\n if (name === \"host\") {\n envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);\n }\n\n const cmd = Command.make(command, ...args).pipe(\n Command.workingDirectory(fullCwd),\n Command.env(envVars),\n );\n\n const proc = yield* Command.start(cmd);\n\n const markReady = Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"ready\");\n callbacks.onStatus(name, \"ready\");\n yield* Deferred.succeed(readyDeferred, undefined).pipe(Effect.ignore);\n });\n\n const markError = (message: string) =>\n Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"error\");\n callbacks.onStatus(name, \"error\");\n yield* Deferred.fail(readyDeferred, new Error(message)).pipe(Effect.ignore);\n });\n\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const deadline = Date.now() + LOCAL_PROBE_DEADLINE_MS;\n\n if (port > 0) {\n const readinessPath = descriptor.readinessPath;\n const url = `http://127.0.0.1:${port}${readinessPath}`;\n while (Date.now() < deadline) {\n const status = yield* Ref.get(statusRef);\n if (status === \"ready\" || status === \"error\") return;\n const ok = yield* probeHttpOk(url);\n if (ok) {\n yield* markReady;\n return;\n }\n yield* Effect.sleep(`${LOCAL_PROBE_INTERVAL_MS} millis`);\n }\n } else {\n while (Date.now() < deadline) {\n const status = yield* Ref.get(statusRef);\n if (status === \"ready\" || status === \"error\") return;\n yield* Effect.sleep(\"500 millis\");\n }\n }\n\n const status = yield* Ref.get(statusRef);\n if (status !== \"ready\" && status !== \"error\") {\n callbacks.onLog(name, \"Probe deadline exceeded after 90s\", true);\n yield* markError(`Probe deadline exceeded: ${name}`);\n }\n }),\n );\n\n const pid = Number(proc.pid);\n\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const exitCode = yield* proc.exitCode;\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n callbacks.onLog(name, `Process exited before ready (exit code: ${exitCode})`, true);\n yield* markError(`Process exited before ready: ${name}`);\n }),\n );\n\n const handleLine = (line: string, isStderr: boolean) =>\n Effect.gen(function* () {\n if (!line.trim()) return;\n\n const cleanLine = stripAnsi(line);\n const looksLikeError =\n isStderr &&\n /^(error|fail|fatal|exception|unhandled|reject)/i.test(cleanLine) &&\n !/^\\$/.test(cleanLine);\n callbacks.onLog(name, line, looksLikeError);\n\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n\n const detected = detectStatus(line, descriptor);\n if (detected) {\n if (detected.status === \"ready\") {\n yield* markReady;\n } else {\n yield* markError(`Process failed: ${name}`);\n }\n }\n });\n\n yield* Effect.forkScoped(\n Stream.runForEach((line: string) => handleLine(line, false))(\n Stream.splitLines(Stream.decodeText(proc.stdout, \"utf-8\")),\n ),\n );\n\n yield* Effect.forkScoped(\n Stream.runForEach((line: string) => handleLine(line, true))(\n Stream.splitLines(Stream.decodeText(proc.stderr, \"utf-8\")),\n ),\n );\n\n return {\n name,\n pid,\n kill: Effect.gen(function* () {\n const result = yield* proc.kill(\"SIGTERM\").pipe(Effect.timeout(\"3 seconds\"), Effect.option);\n if (Option.isNone(result)) {\n const pid = Number(proc.pid);\n yield* Effect.try(() => process.kill(-pid, \"SIGKILL\")).pipe(Effect.ignore);\n yield* Effect.sleep(\"250 millis\");\n }\n }).pipe(Effect.ignore),\n waitForReady: Deferred.await(readyDeferred),\n waitForExit: proc.exitCode,\n } satisfies ProcessHandle;\n });\n\nconst spawnRemoteProbe = (\n pkg: string,\n descriptor: ServiceDescriptor,\n callbacks: ProcessCallbacks,\n) =>\n Effect.gen(function* () {\n callbacks.onStatus(pkg, \"starting\");\n const readyDeferred = yield* Deferred.make<void, Error>();\n const statusRef = yield* Ref.make<ProcessStatus>(\"starting\");\n\n const markReady = Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"ready\");\n yield* Deferred.succeed(readyDeferred, undefined).pipe(Effect.ignore);\n callbacks.onStatus(pkg, \"ready\", \"loaded\");\n });\n\n const markError = Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"error\");\n yield* Deferred.fail(readyDeferred, new Error(`Remote ${pkg} unreachable`)).pipe(\n Effect.ignore,\n );\n callbacks.onStatus(pkg, \"error\", \"unreachable\");\n });\n\n const baseUrl = descriptor.url.replace(/\\/$/, \"\");\n const manifestUrl = `${baseUrl}/mf-manifest.json`;\n const entryUrl = `${baseUrl}${descriptor.readinessPath}`;\n const probeUrl = descriptor.readinessPath === \"/health\" ? `${baseUrl}/health` : manifestUrl;\n\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const deadline = Date.now() + REMOTE_PROBE_DEADLINE_MS;\n let delay = REMOTE_PROBE_BACKOFF_INITIAL_MS;\n while (Date.now() < deadline) {\n const status = yield* Ref.get(statusRef);\n if (status === \"ready\" || status === \"error\") return;\n\n const ok = yield* probeHttpOk(probeUrl, REMOTE_PROBE_TIMEOUT_MS);\n\n if (ok) {\n yield* markReady;\n return;\n }\n\n const fallbackOk = yield* probeHttpOk(entryUrl, REMOTE_PROBE_TIMEOUT_MS);\n\n if (fallbackOk) {\n yield* markReady;\n return;\n }\n\n yield* Effect.sleep(`${delay} millis`);\n delay = Math.min(Math.round(delay * 1.5), REMOTE_PROBE_BACKOFF_MAX_MS);\n }\n\n const status = yield* Ref.get(statusRef);\n if (status !== \"ready\") {\n yield* markError;\n }\n }),\n );\n\n return {\n name: pkg,\n pid: undefined,\n kill: Effect.gen(function* () {\n yield* Ref.set(statusRef, \"error\");\n yield* Deferred.fail(readyDeferred, new Error(\"Killed\")).pipe(Effect.ignore);\n }),\n waitForReady: Deferred.await(readyDeferred),\n waitForExit: Effect.never,\n } satisfies ProcessHandle;\n });\n\nexport const makeDevProcess = (pkg: string, callbacks: ProcessCallbacks, portOverride?: number) =>\n Effect.gen(function* () {\n const services = yield* ServiceDescriptorMap;\n const descriptor = services.get(pkg);\n\n if (!descriptor) {\n callbacks.onStatus(pkg, \"ready\", \"Remote\");\n return {\n name: pkg,\n pid: undefined,\n kill: Effect.void,\n waitForReady: Effect.void,\n waitForExit: Effect.never,\n } satisfies ProcessHandle;\n }\n\n if (pkg === \"host\" && descriptor.source === \"remote\") {\n return yield* spawnRemoteHost(descriptor, callbacks);\n }\n\n if (descriptor.source === \"remote\" || !descriptor.localPath) {\n return yield* spawnRemoteProbe(pkg, descriptor, callbacks);\n }\n\n const resolvedDescriptor = portOverride ? { ...descriptor, port: portOverride } : descriptor;\n\n return yield* spawnDevProcess(resolvedDescriptor, callbacks);\n });\n\nexport function getProcessStates(\n packages: string[],\n services: Map<string, ServiceDescriptor>,\n portOverride?: number,\n): ProcessState[] {\n return packages.map((pkg) => {\n const descriptor = services.get(pkg);\n return {\n name: pkg,\n status: \"pending\" as const,\n port:\n portOverride && pkg === \"host\"\n ? portOverride\n : (descriptor?.port ?? descriptor?.defaultPort ?? 0),\n source: descriptor?.source,\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.cjs","names":["Effect","DevRuntimeConfig","Deferred","Ref","Command","Stream","Option","ServiceDescriptorMap"],"sources":["../src/orchestrator.ts"],"sourcesContent":["import { Command } from \"@effect/platform\";\nimport type { ExitCode } from \"@effect/platform/CommandExecutor\";\nimport { Deferred, Effect, Option, Ref, Stream } from \"effect\";\nimport { patchManifestFetchForSsrPublicPath } from \"./mf\";\nimport {\n DevRuntimeConfig,\n type ServiceDescriptor,\n ServiceDescriptorMap,\n} from \"./service-descriptor\";\nimport type { RuntimeConfig } from \"./types\";\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\"[Orchestrator] Unhandled rejection:\", reason);\n});\n\nprocess.on(\"uncaughtException\", (err) => {\n console.error(\"[Orchestrator] Uncaught exception:\", err);\n});\n\nexport interface ProcessCallbacks {\n onStatus: (name: string, status: ProcessStatus, message?: string) => void;\n onLog: (name: string, line: string, isError?: boolean) => void;\n}\n\nexport interface ProcessHandle {\n name: string;\n pid: number | undefined;\n kill: Effect.Effect<void, unknown>;\n waitForReady: Effect.Effect<void, Error>;\n waitForExit: Effect.Effect<ExitCode, unknown>;\n}\n\nexport type ProcessStatus = \"pending\" | \"starting\" | \"ready\" | \"error\";\n\nexport interface ProcessState {\n name: string;\n status: ProcessStatus;\n port: number;\n message?: string;\n source?: \"local\" | \"remote\";\n}\n\nconst stripAnsi = (input: string): string => {\n const ESC = String.fromCharCode(27);\n const BEL = String.fromCharCode(7);\n return input\n .replace(new RegExp(`${ESC}\\\\][^${BEL}]*${BEL}`, \"g\"), \"\")\n .replace(new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, \"g\"), \"\");\n};\n\nconst probeHttpOk = (url: string, timeoutMs = 400) =>\n Effect.tryPromise({\n try: async () => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(url, { signal: controller.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n },\n catch: () => false,\n });\n\nconst LOCAL_PROBE_DEADLINE_MS = 90_000;\nconst LOCAL_PROBE_INTERVAL_MS = 200;\n\nconst REMOTE_PROBE_TIMEOUT_MS = 5000;\nconst REMOTE_PROBE_DEADLINE_MS = 60_000;\nconst REMOTE_PROBE_BACKOFF_INITIAL_MS = 1000;\nconst REMOTE_PROBE_BACKOFF_MAX_MS = 15_000;\n\nconst detectStatus = (\n line: string,\n descriptor: ServiceDescriptor,\n): { status: ProcessStatus; isError: boolean } | null => {\n const cleanLine = stripAnsi(line);\n const errorPatterns = descriptor.errorPatterns ?? [];\n const readyPatterns = descriptor.readyPatterns ?? [];\n for (const pattern of errorPatterns) {\n if (pattern.test(cleanLine)) {\n return { status: \"error\", isError: true };\n }\n }\n for (const pattern of readyPatterns) {\n if (pattern.test(cleanLine)) {\n return { status: \"ready\", isError: false };\n }\n }\n return null;\n};\n\ninterface ServerHandle {\n ready: Promise<void>;\n shutdown: () => Promise<void>;\n}\n\ninterface ServerInput {\n config: RuntimeConfig;\n port?: number;\n env?: Record<string, string>;\n}\n\nconst patchConsole = (name: string, callbacks: ProcessCallbacks): (() => void) => {\n const originalLog = console.log;\n const originalError = console.error;\n const originalWarn = console.warn;\n const originalInfo = console.info;\n\n const formatArgs = (args: unknown[], isError = false): string => {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n const parts = [`${arg.name}: ${arg.message}`];\n if (arg.cause instanceof Error)\n parts.push(`(cause: ${arg.cause.name}: ${arg.cause.message})`);\n else if (arg.cause) parts.push(`(cause: ${String(arg.cause)})`);\n if (isError && arg.stack) parts.push(arg.stack);\n return parts.join(\"\\n\");\n }\n return typeof arg === \"object\" ? JSON.stringify(arg, null, 2) : String(arg);\n })\n .join(\" \");\n };\n\n console.log = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args), false);\n };\n console.error = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args, true), true);\n };\n console.warn = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args), false);\n };\n console.info = (...args: unknown[]) => {\n callbacks.onLog(name, formatArgs(args), false);\n };\n\n return () => {\n console.log = originalLog;\n console.error = originalError;\n console.warn = originalWarn;\n console.info = originalInfo;\n };\n};\n\nconst spawnRemoteHost = (descriptor: ServiceDescriptor, callbacks: ProcessCallbacks) =>\n Effect.gen(function* () {\n const runtimeConfig = yield* DevRuntimeConfig;\n const remoteUrl = descriptor.remoteUrl;\n if (!remoteUrl) {\n return yield* Effect.fail(new Error(\"remoteUrl not provided on host descriptor\"));\n }\n\n callbacks.onStatus(descriptor.key, \"starting\");\n callbacks.onLog(descriptor.key, `Remote: ${remoteUrl}`);\n const restoreConsole = patchConsole(descriptor.key, callbacks);\n callbacks.onLog(descriptor.key, \"Loading Module Federation runtime...\");\n\n const mfRuntime = yield* Effect.tryPromise({\n try: () => import(\"@module-federation/enhanced/runtime\"),\n catch: (e) => new Error(`Failed to load MF runtime: ${e}`),\n });\n\n const mfCore = yield* Effect.tryPromise({\n try: () => import(\"@module-federation/runtime-core\"),\n catch: (e) => new Error(`Failed to load MF core: ${e}`),\n });\n\n let mf = mfRuntime.getInstance();\n if (!mf) {\n mf = mfRuntime.createInstance({ name: \"cli-host\", remotes: [] });\n mfCore.setGlobalFederationInstance(mf);\n }\n patchManifestFetchForSsrPublicPath(mf as any);\n\n const baseUrl = remoteUrl\n .replace(/\\/remoteEntry\\.js$/, \"\")\n .replace(/\\/mf-manifest\\.json$/, \"\")\n .replace(/\\/$/, \"\");\n const remoteEntryUrl = `${baseUrl}/remoteEntry.js`;\n const manifestUrl = `${baseUrl}/mf-manifest.json`;\n\n const entryUrl = yield* Effect.tryPromise({\n try: async () => {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10_000);\n let res: Response;\n try {\n res = await fetch(manifestUrl, { signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n if (!res.ok) return remoteEntryUrl;\n const json = (await res.json()) as Record<string, unknown>;\n if (\n json &&\n typeof json === \"object\" &&\n \"metaData\" in json &&\n \"exposes\" in json &&\n \"shared\" in json\n ) {\n return manifestUrl;\n }\n } catch (e) {\n console.warn(\n `[Orchestrator] Failed to fetch or parse manifest from ${manifestUrl}, falling back to remoteEntryUrl: ${e}`,\n );\n }\n return remoteEntryUrl;\n },\n catch: () => remoteEntryUrl,\n });\n\n (mf as any).registerRemotes([{ name: \"host\", entry: entryUrl }]);\n callbacks.onLog(descriptor.key, `Loading host from ${entryUrl}...`);\n\n const hostModule = yield* Effect.tryPromise({\n try: () =>\n (mf as any).loadRemote(\"host/Server\") as Promise<{\n runServer: (input: ServerInput) => ServerHandle;\n }>,\n catch: (e) => new Error(`Failed to load host module: ${e}`),\n });\n\n if (!hostModule?.runServer) {\n return yield* Effect.fail(new Error(\"Host module does not export runServer function\"));\n }\n\n callbacks.onLog(descriptor.key, \"Starting server...\");\n const hostPort = runtimeConfig.host?.port;\n const hostEnv: Record<string, string> | undefined = hostPort\n ? { PORT: String(hostPort) }\n : undefined;\n const serverHandle = hostModule.runServer({\n config: runtimeConfig,\n port: hostPort,\n env: hostEnv,\n });\n yield* Effect.tryPromise({\n try: () => serverHandle.ready,\n catch: (e) => new Error(`Server failed to start: ${e}`),\n });\n\n callbacks.onStatus(descriptor.key, \"ready\");\n\n return {\n name: descriptor.key,\n pid: process.pid,\n kill: Effect.gen(function* () {\n callbacks.onLog(descriptor.key, \"Shutting down remote host...\");\n restoreConsole();\n yield* Effect.tryPromise({\n try: () => serverHandle.shutdown(),\n catch: () => {},\n }).pipe(Effect.ignore);\n }),\n waitForReady: Effect.succeed(undefined),\n waitForExit: Effect.never,\n } satisfies ProcessHandle;\n });\n\nconst spawnDevProcess = (descriptor: ServiceDescriptor, callbacks: ProcessCallbacks) =>\n Effect.gen(function* () {\n const runtimeConfig = yield* DevRuntimeConfig;\n\n if (!descriptor.localPath) {\n return yield* Effect.fail(new Error(`No localPath for local service: ${descriptor.key}`));\n }\n\n const fullCwd = descriptor.localPath;\n const command = descriptor.command ?? \"bun\";\n const args = descriptor.args ?? [\"run\", \"dev\"];\n const port = descriptor.port ?? descriptor.defaultPort;\n const name = descriptor.key;\n\n const readyDeferred = yield* Deferred.make<void, Error>();\n const statusRef = yield* Ref.make<ProcessStatus>(\"starting\");\n\n callbacks.onStatus(name, \"starting\");\n\n const envVars: Record<string, string> = {\n ...(process.env as Record<string, string>),\n FORCE_COLOR: \"1\",\n ...(port > 0 ? { PORT: String(port) } : {}),\n };\n\n envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);\n\n const cmd = Command.make(command, ...args).pipe(\n Command.workingDirectory(fullCwd),\n Command.env(envVars),\n );\n\n const proc = yield* Command.start(cmd);\n\n const markReady = Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"ready\");\n callbacks.onStatus(name, \"ready\");\n yield* Deferred.succeed(readyDeferred, undefined).pipe(Effect.ignore);\n });\n\n const markError = (message: string) =>\n Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"error\");\n callbacks.onStatus(name, \"error\");\n yield* Deferred.fail(readyDeferred, new Error(message)).pipe(Effect.ignore);\n });\n\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const deadline = Date.now() + LOCAL_PROBE_DEADLINE_MS;\n\n if (port > 0) {\n const readinessPath = descriptor.readinessPath;\n const url = `http://127.0.0.1:${port}${readinessPath}`;\n while (Date.now() < deadline) {\n const status = yield* Ref.get(statusRef);\n if (status === \"ready\" || status === \"error\") return;\n const ok = yield* probeHttpOk(url);\n if (ok) {\n yield* markReady;\n return;\n }\n yield* Effect.sleep(`${LOCAL_PROBE_INTERVAL_MS} millis`);\n }\n } else {\n while (Date.now() < deadline) {\n const status = yield* Ref.get(statusRef);\n if (status === \"ready\" || status === \"error\") return;\n yield* Effect.sleep(\"500 millis\");\n }\n }\n\n const status = yield* Ref.get(statusRef);\n if (status !== \"ready\" && status !== \"error\") {\n callbacks.onLog(name, \"Probe deadline exceeded after 90s\", true);\n yield* markError(`Probe deadline exceeded: ${name}`);\n }\n }),\n );\n\n const pid = Number(proc.pid);\n\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const exitCode = yield* proc.exitCode;\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n callbacks.onLog(name, `Process exited before ready (exit code: ${exitCode})`, true);\n yield* markError(`Process exited before ready: ${name}`);\n }),\n );\n\n const handleLine = (line: string, isStderr: boolean) =>\n Effect.gen(function* () {\n if (!line.trim()) return;\n\n const cleanLine = stripAnsi(line);\n const looksLikeError =\n isStderr &&\n /^(error|fail|fatal|exception|unhandled|reject)/i.test(cleanLine) &&\n !/^\\$/.test(cleanLine);\n callbacks.onLog(name, line, looksLikeError);\n\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n\n const detected = detectStatus(line, descriptor);\n if (detected) {\n if (detected.status === \"ready\") {\n yield* markReady;\n } else {\n yield* markError(`Process failed: ${name}`);\n }\n }\n });\n\n yield* Effect.forkScoped(\n Stream.runForEach((line: string) => handleLine(line, false))(\n Stream.splitLines(Stream.decodeText(proc.stdout, \"utf-8\")),\n ),\n );\n\n yield* Effect.forkScoped(\n Stream.runForEach((line: string) => handleLine(line, true))(\n Stream.splitLines(Stream.decodeText(proc.stderr, \"utf-8\")),\n ),\n );\n\n return {\n name,\n pid,\n kill: Effect.gen(function* () {\n const result = yield* proc.kill(\"SIGTERM\").pipe(Effect.timeout(\"3 seconds\"), Effect.option);\n if (Option.isNone(result)) {\n const pid = Number(proc.pid);\n yield* Effect.try(() => process.kill(-pid, \"SIGKILL\")).pipe(Effect.ignore);\n yield* Effect.sleep(\"250 millis\");\n }\n }).pipe(Effect.ignore),\n waitForReady: Deferred.await(readyDeferred),\n waitForExit: proc.exitCode,\n } satisfies ProcessHandle;\n });\n\nconst spawnRemoteProbe = (\n pkg: string,\n descriptor: ServiceDescriptor,\n callbacks: ProcessCallbacks,\n) =>\n Effect.gen(function* () {\n callbacks.onStatus(pkg, \"starting\");\n const readyDeferred = yield* Deferred.make<void, Error>();\n const statusRef = yield* Ref.make<ProcessStatus>(\"starting\");\n\n const markReady = Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"ready\");\n yield* Deferred.succeed(readyDeferred, undefined).pipe(Effect.ignore);\n callbacks.onStatus(pkg, \"ready\", \"loaded\");\n });\n\n const markError = Effect.gen(function* () {\n const currentStatus = yield* Ref.get(statusRef);\n if (currentStatus === \"ready\" || currentStatus === \"error\") return;\n yield* Ref.set(statusRef, \"error\");\n yield* Deferred.fail(readyDeferred, new Error(`Remote ${pkg} unreachable`)).pipe(\n Effect.ignore,\n );\n callbacks.onStatus(pkg, \"error\", \"unreachable\");\n });\n\n const baseUrl = descriptor.url.replace(/\\/$/, \"\");\n const manifestUrl = `${baseUrl}/mf-manifest.json`;\n const entryUrl = `${baseUrl}${descriptor.readinessPath}`;\n const probeUrl = descriptor.readinessPath === \"/health\" ? `${baseUrl}/health` : manifestUrl;\n\n yield* Effect.forkScoped(\n Effect.gen(function* () {\n const deadline = Date.now() + REMOTE_PROBE_DEADLINE_MS;\n let delay = REMOTE_PROBE_BACKOFF_INITIAL_MS;\n while (Date.now() < deadline) {\n const status = yield* Ref.get(statusRef);\n if (status === \"ready\" || status === \"error\") return;\n\n const ok = yield* probeHttpOk(probeUrl, REMOTE_PROBE_TIMEOUT_MS);\n\n if (ok) {\n yield* markReady;\n return;\n }\n\n const fallbackOk = yield* probeHttpOk(entryUrl, REMOTE_PROBE_TIMEOUT_MS);\n\n if (fallbackOk) {\n yield* markReady;\n return;\n }\n\n yield* Effect.sleep(`${delay} millis`);\n delay = Math.min(Math.round(delay * 1.5), REMOTE_PROBE_BACKOFF_MAX_MS);\n }\n\n const status = yield* Ref.get(statusRef);\n if (status !== \"ready\") {\n yield* markError;\n }\n }),\n );\n\n return {\n name: pkg,\n pid: undefined,\n kill: Effect.gen(function* () {\n yield* Ref.set(statusRef, \"error\");\n yield* Deferred.fail(readyDeferred, new Error(\"Killed\")).pipe(Effect.ignore);\n }),\n waitForReady: Deferred.await(readyDeferred),\n waitForExit: Effect.never,\n } satisfies ProcessHandle;\n });\n\nexport const makeDevProcess = (pkg: string, callbacks: ProcessCallbacks, portOverride?: number) =>\n Effect.gen(function* () {\n const services = yield* ServiceDescriptorMap;\n const descriptor = services.get(pkg);\n\n if (!descriptor) {\n callbacks.onStatus(pkg, \"ready\", \"Remote\");\n return {\n name: pkg,\n pid: undefined,\n kill: Effect.void,\n waitForReady: Effect.void,\n waitForExit: Effect.never,\n } satisfies ProcessHandle;\n }\n\n if (pkg === \"host\" && descriptor.source === \"remote\") {\n return yield* spawnRemoteHost(descriptor, callbacks);\n }\n\n if (descriptor.source === \"remote\" || !descriptor.localPath) {\n return yield* spawnRemoteProbe(pkg, descriptor, callbacks);\n }\n\n const resolvedDescriptor = portOverride ? { ...descriptor, port: portOverride } : descriptor;\n\n return yield* spawnDevProcess(resolvedDescriptor, callbacks);\n });\n\nexport function getProcessStates(\n packages: string[],\n services: Map<string, ServiceDescriptor>,\n portOverride?: number,\n): ProcessState[] {\n return packages.map((pkg) => {\n const descriptor = services.get(pkg);\n return {\n name: pkg,\n status: \"pending\" as const,\n port:\n portOverride && pkg === \"host\"\n ? portOverride\n : (descriptor?.port ?? descriptor?.defaultPort ?? 0),\n source: descriptor?.source,\n };\n });\n}\n"],"mappings":"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"}
@@ -188,7 +188,7 @@ const spawnDevProcess = (descriptor, callbacks) => Effect.gen(function* () {
188
188
  FORCE_COLOR: "1",
189
189
  ...port > 0 ? { PORT: String(port) } : {}
190
190
  };
191
- if (name === "host") envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);
191
+ envVars.BOS_RUNTIME_CONFIG = JSON.stringify(runtimeConfig);
192
192
  const cmd = Command.make(command, ...args).pipe(Command.workingDirectory(fullCwd), Command.env(envVars));
193
193
  const proc = yield* Command.start(cmd);
194
194
  const markReady = Effect.gen(function* () {