every-plugin 2.10.0 → 3.0.0-rc.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 (462) hide show
  1. package/bin/every-plugin-serve.mjs +12 -0
  2. package/bin/every-plugin.mjs +59 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -2
  4. package/dist/build/artifact-names.cjs +119 -0
  5. package/dist/build/artifact-names.cjs.map +1 -0
  6. package/dist/build/artifact-names.d.cts +68 -0
  7. package/dist/build/artifact-names.d.cts.map +1 -0
  8. package/dist/build/artifact-names.d.mts +68 -0
  9. package/dist/build/artifact-names.d.mts.map +1 -0
  10. package/dist/build/artifact-names.mjs +102 -0
  11. package/dist/build/artifact-names.mjs.map +1 -0
  12. package/dist/build/contract-types.cjs +89 -0
  13. package/dist/build/contract-types.cjs.map +1 -0
  14. package/dist/build/contract-types.mjs +81 -0
  15. package/dist/build/contract-types.mjs.map +1 -0
  16. package/dist/build/rspack/build-report-plugin.cjs +37 -0
  17. package/dist/build/rspack/build-report-plugin.cjs.map +1 -0
  18. package/dist/build/rspack/build-report-plugin.d.cts +18 -0
  19. package/dist/build/rspack/build-report-plugin.d.cts.map +1 -0
  20. package/dist/build/rspack/build-report-plugin.d.mts +18 -0
  21. package/dist/build/rspack/build-report-plugin.d.mts.map +1 -0
  22. package/dist/build/rspack/build-report-plugin.mjs +37 -0
  23. package/dist/build/rspack/build-report-plugin.mjs.map +1 -0
  24. package/dist/build/rspack/chunk-completeness-plugin.cjs +47 -0
  25. package/dist/build/rspack/chunk-completeness-plugin.cjs.map +1 -0
  26. package/dist/build/rspack/chunk-completeness-plugin.mjs +47 -0
  27. package/dist/build/rspack/chunk-completeness-plugin.mjs.map +1 -0
  28. package/dist/build/rspack/compose.cjs +69 -0
  29. package/dist/build/rspack/compose.cjs.map +1 -0
  30. package/dist/build/rspack/compose.d.cts +20 -0
  31. package/dist/build/rspack/compose.d.cts.map +1 -0
  32. package/dist/build/rspack/compose.d.mts +20 -0
  33. package/dist/build/rspack/compose.d.mts.map +1 -0
  34. package/dist/build/rspack/compose.mjs +65 -0
  35. package/dist/build/rspack/compose.mjs.map +1 -0
  36. package/dist/build/rspack/fix-mf-data-uri-plugin.cjs +11 -11
  37. package/dist/build/rspack/fix-mf-data-uri-plugin.cjs.map +1 -1
  38. package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts +2 -0
  39. package/dist/build/rspack/fix-mf-data-uri-plugin.d.cts.map +1 -1
  40. package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts +2 -0
  41. package/dist/build/rspack/fix-mf-data-uri-plugin.d.mts.map +1 -1
  42. package/dist/build/rspack/fix-mf-data-uri-plugin.mjs +11 -10
  43. package/dist/build/rspack/fix-mf-data-uri-plugin.mjs.map +1 -1
  44. package/dist/build/rspack/generated-config.cjs +35 -0
  45. package/dist/build/rspack/generated-config.cjs.map +1 -0
  46. package/dist/build/rspack/generated-config.mjs +32 -0
  47. package/dist/build/rspack/generated-config.mjs.map +1 -0
  48. package/dist/build/rspack/index.cjs +8 -5
  49. package/dist/build/rspack/index.d.cts +5 -3
  50. package/dist/build/rspack/index.d.mts +5 -3
  51. package/dist/build/rspack/index.mjs +5 -3
  52. package/dist/build/rspack/module-federation.cjs +2 -2
  53. package/dist/build/rspack/module-federation.cjs.map +1 -1
  54. package/dist/build/rspack/module-federation.mjs +1 -1
  55. package/dist/build/rspack/module-federation.mjs.map +1 -1
  56. package/dist/build/rspack/plugin.cjs +44 -69
  57. package/dist/build/rspack/plugin.cjs.map +1 -1
  58. package/dist/build/rspack/plugin.d.cts +4 -13
  59. package/dist/build/rspack/plugin.d.cts.map +1 -1
  60. package/dist/build/rspack/plugin.d.mts +4 -13
  61. package/dist/build/rspack/plugin.d.mts.map +1 -1
  62. package/dist/build/rspack/plugin.mjs +44 -69
  63. package/dist/build/rspack/plugin.mjs.map +1 -1
  64. package/dist/build/rspack/utils.cjs +7 -5
  65. package/dist/build/rspack/utils.cjs.map +1 -1
  66. package/dist/build/rspack/utils.mjs +7 -6
  67. package/dist/build/rspack/utils.mjs.map +1 -1
  68. package/dist/build/ui/factory.cjs +88 -0
  69. package/dist/build/ui/factory.cjs.map +1 -0
  70. package/dist/build/ui/factory.d.cts +11 -0
  71. package/dist/build/ui/factory.d.cts.map +1 -0
  72. package/dist/build/ui/factory.d.mts +11 -0
  73. package/dist/build/ui/factory.d.mts.map +1 -0
  74. package/dist/build/ui/factory.mjs +80 -0
  75. package/dist/build/ui/factory.mjs.map +1 -0
  76. package/dist/build/ui/generated-config.cjs +118 -0
  77. package/dist/build/ui/generated-config.cjs.map +1 -0
  78. package/dist/build/ui/generated-config.d.cts +33 -0
  79. package/dist/build/ui/generated-config.d.cts.map +1 -0
  80. package/dist/build/ui/generated-config.d.mts +33 -0
  81. package/dist/build/ui/generated-config.d.mts.map +1 -0
  82. package/dist/build/ui/generated-config.mjs +111 -0
  83. package/dist/build/ui/generated-config.mjs.map +1 -0
  84. package/dist/build/ui/hash-artifacts-plugin.cjs +61 -0
  85. package/dist/build/ui/hash-artifacts-plugin.cjs.map +1 -0
  86. package/dist/build/ui/hash-artifacts-plugin.d.cts +20 -0
  87. package/dist/build/ui/hash-artifacts-plugin.d.cts.map +1 -0
  88. package/dist/build/ui/hash-artifacts-plugin.d.mts +20 -0
  89. package/dist/build/ui/hash-artifacts-plugin.d.mts.map +1 -0
  90. package/dist/build/ui/hash-artifacts-plugin.mjs +58 -0
  91. package/dist/build/ui/hash-artifacts-plugin.mjs.map +1 -0
  92. package/dist/build/ui/index.cjs +90 -0
  93. package/dist/build/ui/index.cjs.map +1 -0
  94. package/dist/build/ui/index.d.cts +29 -0
  95. package/dist/build/ui/index.d.cts.map +1 -0
  96. package/dist/build/ui/index.d.mts +29 -0
  97. package/dist/build/ui/index.d.mts.map +1 -0
  98. package/dist/build/ui/index.mjs +68 -0
  99. package/dist/build/ui/index.mjs.map +1 -0
  100. package/dist/build/ui/manifest-plugin.cjs +37 -0
  101. package/dist/build/ui/manifest-plugin.cjs.map +1 -0
  102. package/dist/build/ui/manifest-plugin.d.cts +19 -0
  103. package/dist/build/ui/manifest-plugin.d.cts.map +1 -0
  104. package/dist/build/ui/manifest-plugin.d.mts +19 -0
  105. package/dist/build/ui/manifest-plugin.d.mts.map +1 -0
  106. package/dist/build/ui/manifest-plugin.mjs +37 -0
  107. package/dist/build/ui/manifest-plugin.mjs.map +1 -0
  108. package/dist/build/ui/rsbuild-config.cjs +203 -0
  109. package/dist/build/ui/rsbuild-config.cjs.map +1 -0
  110. package/dist/build/ui/rsbuild-config.d.cts +45 -0
  111. package/dist/build/ui/rsbuild-config.d.cts.map +1 -0
  112. package/dist/build/ui/rsbuild-config.d.mts +45 -0
  113. package/dist/build/ui/rsbuild-config.d.mts.map +1 -0
  114. package/dist/build/ui/rsbuild-config.mjs +200 -0
  115. package/dist/build/ui/rsbuild-config.mjs.map +1 -0
  116. package/dist/build/ui/stubs.cjs +107 -0
  117. package/dist/build/ui/stubs.cjs.map +1 -0
  118. package/dist/build/ui/stubs.d.cts +25 -0
  119. package/dist/build/ui/stubs.d.cts.map +1 -0
  120. package/dist/build/ui/stubs.d.mts +25 -0
  121. package/dist/build/ui/stubs.d.mts.map +1 -0
  122. package/dist/build/ui/stubs.mjs +106 -0
  123. package/dist/build/ui/stubs.mjs.map +1 -0
  124. package/dist/cli.cjs +83 -0
  125. package/dist/cli.cjs.map +1 -0
  126. package/dist/cli.d.cts +6 -0
  127. package/dist/cli.d.cts.map +1 -0
  128. package/dist/cli.d.mts +6 -0
  129. package/dist/cli.d.mts.map +1 -0
  130. package/dist/cli.mjs +82 -0
  131. package/dist/cli.mjs.map +1 -0
  132. package/dist/dev/serve.cjs +390 -0
  133. package/dist/dev/serve.cjs.map +1 -0
  134. package/dist/dev/serve.d.cts +23 -0
  135. package/dist/dev/serve.d.cts.map +1 -0
  136. package/dist/dev/serve.d.mts +23 -0
  137. package/dist/dev/serve.d.mts.map +1 -0
  138. package/dist/dev/serve.mjs +384 -0
  139. package/dist/dev/serve.mjs.map +1 -0
  140. package/dist/dev/watch-kill.cjs +39 -0
  141. package/dist/dev/watch-kill.cjs.map +1 -0
  142. package/dist/dev/watch-kill.mjs +38 -0
  143. package/dist/dev/watch-kill.mjs.map +1 -0
  144. package/dist/effect-helpers.cjs +23 -0
  145. package/dist/effect-helpers.cjs.map +1 -0
  146. package/dist/effect-helpers.d.cts +20 -0
  147. package/dist/effect-helpers.d.cts.map +1 -0
  148. package/dist/effect-helpers.d.mts +20 -0
  149. package/dist/effect-helpers.d.mts.map +1 -0
  150. package/dist/effect-helpers.mjs +22 -0
  151. package/dist/effect-helpers.mjs.map +1 -0
  152. package/dist/errors.cjs +49 -69
  153. package/dist/errors.cjs.map +1 -1
  154. package/dist/errors.d.cts +13 -96
  155. package/dist/errors.d.cts.map +1 -1
  156. package/dist/errors.d.mts +13 -96
  157. package/dist/errors.d.mts.map +1 -1
  158. package/dist/errors.mjs +16 -34
  159. package/dist/errors.mjs.map +1 -1
  160. package/dist/identity.cjs +19 -0
  161. package/dist/identity.cjs.map +1 -0
  162. package/dist/identity.d.cts +33 -0
  163. package/dist/identity.d.cts.map +1 -0
  164. package/dist/identity.d.mts +33 -0
  165. package/dist/identity.d.mts.map +1 -0
  166. package/dist/identity.mjs +16 -0
  167. package/dist/identity.mjs.map +1 -0
  168. package/dist/index.cjs +8 -5
  169. package/dist/index.d.cts +8 -6
  170. package/dist/index.d.mts +8 -6
  171. package/dist/index.mjs +6 -4
  172. package/dist/plugin.cjs +12 -26
  173. package/dist/plugin.cjs.map +1 -1
  174. package/dist/plugin.d.cts +44 -25
  175. package/dist/plugin.d.cts.map +1 -1
  176. package/dist/plugin.d.mts +45 -26
  177. package/dist/plugin.d.mts.map +1 -1
  178. package/dist/plugin.mjs +15 -29
  179. package/dist/plugin.mjs.map +1 -1
  180. package/dist/remote-entry.cjs +103 -0
  181. package/dist/remote-entry.cjs.map +1 -0
  182. package/dist/remote-entry.d.cts +53 -0
  183. package/dist/remote-entry.d.cts.map +1 -0
  184. package/dist/remote-entry.d.mts +53 -0
  185. package/dist/remote-entry.d.mts.map +1 -0
  186. package/dist/remote-entry.mjs +98 -0
  187. package/dist/remote-entry.mjs.map +1 -0
  188. package/dist/runtime/errors.cjs +140 -34
  189. package/dist/runtime/errors.cjs.map +1 -1
  190. package/dist/runtime/errors.d.cts +42 -7
  191. package/dist/runtime/errors.d.cts.map +1 -1
  192. package/dist/runtime/errors.d.mts +42 -7
  193. package/dist/runtime/errors.d.mts.map +1 -1
  194. package/dist/runtime/errors.mjs +136 -31
  195. package/dist/runtime/errors.mjs.map +1 -1
  196. package/dist/runtime/index.cjs +95 -23
  197. package/dist/runtime/index.cjs.map +1 -1
  198. package/dist/runtime/index.d.cts +16 -0
  199. package/dist/runtime/index.d.cts.map +1 -1
  200. package/dist/runtime/index.d.mts +16 -0
  201. package/dist/runtime/index.d.mts.map +1 -1
  202. package/dist/runtime/index.mjs +98 -26
  203. package/dist/runtime/index.mjs.map +1 -1
  204. package/dist/runtime/mf-config.cjs +3 -78
  205. package/dist/runtime/mf-config.cjs.map +1 -1
  206. package/dist/runtime/mf-config.d.cts +3 -49
  207. package/dist/runtime/mf-config.d.cts.map +1 -1
  208. package/dist/runtime/mf-config.d.mts +3 -49
  209. package/dist/runtime/mf-config.d.mts.map +1 -1
  210. package/dist/runtime/mf-config.mjs +5 -78
  211. package/dist/runtime/mf-config.mjs.map +1 -1
  212. package/dist/runtime/services/module-federation.service.cjs +63 -12
  213. package/dist/runtime/services/module-federation.service.cjs.map +1 -1
  214. package/dist/runtime/services/module-federation.service.d.cts +4 -13
  215. package/dist/runtime/services/module-federation.service.d.mts +4 -13
  216. package/dist/runtime/services/module-federation.service.mjs +63 -14
  217. package/dist/runtime/services/module-federation.service.mjs.map +1 -1
  218. package/dist/runtime/services/normalize.cjs +2 -22
  219. package/dist/runtime/services/normalize.d.cts +2 -21
  220. package/dist/runtime/services/normalize.d.mts +2 -21
  221. package/dist/runtime/services/normalize.mjs +2 -21
  222. package/dist/runtime/services/plugin-lifecycle.service.cjs +9 -11
  223. package/dist/runtime/services/plugin-lifecycle.service.cjs.map +1 -1
  224. package/dist/runtime/services/plugin-lifecycle.service.d.cts +3 -16
  225. package/dist/runtime/services/plugin-lifecycle.service.d.mts +3 -16
  226. package/dist/runtime/services/plugin-lifecycle.service.mjs +10 -13
  227. package/dist/runtime/services/plugin-lifecycle.service.mjs.map +1 -1
  228. package/dist/runtime/services/plugin-loader.service.cjs +30 -29
  229. package/dist/runtime/services/plugin-loader.service.cjs.map +1 -1
  230. package/dist/runtime/services/plugin-loader.service.d.cts +6 -53
  231. package/dist/runtime/services/plugin-loader.service.d.mts +6 -53
  232. package/dist/runtime/services/plugin-loader.service.mjs +29 -30
  233. package/dist/runtime/services/plugin-loader.service.mjs.map +1 -1
  234. package/dist/runtime/services/plugin.service.cjs +10 -12
  235. package/dist/runtime/services/plugin.service.cjs.map +1 -1
  236. package/dist/runtime/services/plugin.service.d.cts +14 -36
  237. package/dist/runtime/services/plugin.service.d.cts.map +1 -1
  238. package/dist/runtime/services/plugin.service.d.mts +14 -36
  239. package/dist/runtime/services/plugin.service.d.mts.map +1 -1
  240. package/dist/runtime/services/plugin.service.mjs +14 -18
  241. package/dist/runtime/services/plugin.service.mjs.map +1 -1
  242. package/dist/runtime/services/secrets.service.cjs +12 -12
  243. package/dist/runtime/services/secrets.service.cjs.map +1 -1
  244. package/dist/runtime/services/secrets.service.d.cts +3 -15
  245. package/dist/runtime/services/secrets.service.d.mts +3 -15
  246. package/dist/runtime/services/secrets.service.mjs +12 -13
  247. package/dist/runtime/services/secrets.service.mjs.map +1 -1
  248. package/dist/runtime/services/shared-identity.cjs +40 -0
  249. package/dist/runtime/services/shared-identity.cjs.map +1 -0
  250. package/dist/runtime/services/shared-identity.mjs +38 -0
  251. package/dist/runtime/services/shared-identity.mjs.map +1 -0
  252. package/dist/runtime/validation.cjs +2 -2
  253. package/dist/runtime/validation.cjs.map +1 -1
  254. package/dist/runtime/validation.mjs +2 -2
  255. package/dist/runtime/validation.mjs.map +1 -1
  256. package/dist/shared-deps-spec.cjs +384 -0
  257. package/dist/shared-deps-spec.cjs.map +1 -0
  258. package/dist/shared-deps-spec.d.cts +182 -0
  259. package/dist/shared-deps-spec.d.cts.map +1 -0
  260. package/dist/shared-deps-spec.d.mts +182 -0
  261. package/dist/shared-deps-spec.d.mts.map +1 -0
  262. package/dist/shared-deps-spec.mjs +368 -0
  263. package/dist/shared-deps-spec.mjs.map +1 -0
  264. package/dist/types.d.cts +22 -41
  265. package/dist/types.d.cts.map +1 -1
  266. package/dist/types.d.mts +22 -41
  267. package/dist/types.d.mts.map +1 -1
  268. package/dist/ui/manifest/construct.cjs +268 -0
  269. package/dist/ui/manifest/construct.cjs.map +1 -0
  270. package/dist/ui/manifest/construct.d.cts +48 -0
  271. package/dist/ui/manifest/construct.d.cts.map +1 -0
  272. package/dist/ui/manifest/construct.d.mts +48 -0
  273. package/dist/ui/manifest/construct.d.mts.map +1 -0
  274. package/dist/ui/manifest/construct.mjs +268 -0
  275. package/dist/ui/manifest/construct.mjs.map +1 -0
  276. package/dist/ui/manifest/contract.cjs +34 -0
  277. package/dist/ui/manifest/contract.cjs.map +1 -0
  278. package/dist/ui/manifest/contract.d.cts +26 -0
  279. package/dist/ui/manifest/contract.d.cts.map +1 -0
  280. package/dist/ui/manifest/contract.d.mts +26 -0
  281. package/dist/ui/manifest/contract.d.mts.map +1 -0
  282. package/dist/ui/manifest/contract.mjs +26 -0
  283. package/dist/ui/manifest/contract.mjs.map +1 -0
  284. package/dist/ui/manifest/descriptor.cjs +64 -0
  285. package/dist/ui/manifest/descriptor.cjs.map +1 -0
  286. package/dist/ui/manifest/descriptor.d.cts +60 -0
  287. package/dist/ui/manifest/descriptor.d.cts.map +1 -0
  288. package/dist/ui/manifest/descriptor.d.mts +60 -0
  289. package/dist/ui/manifest/descriptor.d.mts.map +1 -0
  290. package/dist/ui/manifest/descriptor.mjs +61 -0
  291. package/dist/ui/manifest/descriptor.mjs.map +1 -0
  292. package/dist/ui/manifest/generator.cjs +128 -0
  293. package/dist/ui/manifest/generator.cjs.map +1 -0
  294. package/dist/ui/manifest/generator.d.cts +41 -0
  295. package/dist/ui/manifest/generator.d.cts.map +1 -0
  296. package/dist/ui/manifest/generator.d.mts +41 -0
  297. package/dist/ui/manifest/generator.d.mts.map +1 -0
  298. package/dist/ui/manifest/generator.mjs +125 -0
  299. package/dist/ui/manifest/generator.mjs.map +1 -0
  300. package/dist/ui/manifest/index.cjs +35 -0
  301. package/dist/ui/manifest/index.d.cts +9 -0
  302. package/dist/ui/manifest/index.d.mts +9 -0
  303. package/dist/ui/manifest/index.mjs +9 -0
  304. package/dist/ui/manifest/manifest-schema.cjs +97 -0
  305. package/dist/ui/manifest/manifest-schema.cjs.map +1 -0
  306. package/dist/ui/manifest/manifest-schema.d.cts +132 -0
  307. package/dist/ui/manifest/manifest-schema.d.cts.map +1 -0
  308. package/dist/ui/manifest/manifest-schema.d.mts +132 -0
  309. package/dist/ui/manifest/manifest-schema.d.mts.map +1 -0
  310. package/dist/ui/manifest/manifest-schema.mjs +90 -0
  311. package/dist/ui/manifest/manifest-schema.mjs.map +1 -0
  312. package/dist/ui/manifest/mount-registry.cjs +52 -0
  313. package/dist/ui/manifest/mount-registry.cjs.map +1 -0
  314. package/dist/ui/manifest/mount-registry.d.cts +61 -0
  315. package/dist/ui/manifest/mount-registry.d.cts.map +1 -0
  316. package/dist/ui/manifest/mount-registry.d.mts +61 -0
  317. package/dist/ui/manifest/mount-registry.d.mts.map +1 -0
  318. package/dist/ui/manifest/mount-registry.mjs +48 -0
  319. package/dist/ui/manifest/mount-registry.mjs.map +1 -0
  320. package/dist/ui/manifest/nav.cjs +13 -0
  321. package/dist/ui/manifest/nav.cjs.map +1 -0
  322. package/dist/ui/manifest/nav.d.cts +34 -0
  323. package/dist/ui/manifest/nav.d.cts.map +1 -0
  324. package/dist/ui/manifest/nav.d.mts +34 -0
  325. package/dist/ui/manifest/nav.d.mts.map +1 -0
  326. package/dist/ui/manifest/nav.mjs +13 -0
  327. package/dist/ui/manifest/nav.mjs.map +1 -0
  328. package/dist/ui/manifest/route-config.cjs +33 -0
  329. package/dist/ui/manifest/route-config.cjs.map +1 -0
  330. package/dist/ui/manifest/route-config.d.cts +40 -0
  331. package/dist/ui/manifest/route-config.d.cts.map +1 -0
  332. package/dist/ui/manifest/route-config.d.mts +40 -0
  333. package/dist/ui/manifest/route-config.d.mts.map +1 -0
  334. package/dist/ui/manifest/route-config.mjs +33 -0
  335. package/dist/ui/manifest/route-config.mjs.map +1 -0
  336. package/dist/version-manifest.cjs +65 -0
  337. package/dist/version-manifest.cjs.map +1 -0
  338. package/dist/version-manifest.d.cts +52 -0
  339. package/dist/version-manifest.d.cts.map +1 -0
  340. package/dist/version-manifest.d.mts +52 -0
  341. package/dist/version-manifest.d.mts.map +1 -0
  342. package/dist/version-manifest.mjs +63 -0
  343. package/dist/version-manifest.mjs.map +1 -0
  344. package/package.json +165 -68
  345. package/skills/plugin-client/SKILL.md +24 -5
  346. package/skills/plugin-development/SKILL.md +79 -47
  347. package/skills/plugin-testing/SKILL.md +41 -12
  348. package/src/build/artifact-names.ts +117 -0
  349. package/src/build/contract-types.ts +101 -0
  350. package/src/build/rspack/build-report-plugin.ts +34 -0
  351. package/src/build/rspack/chunk-completeness-plugin.ts +57 -0
  352. package/src/build/rspack/compose.ts +87 -0
  353. package/src/build/rspack/fix-mf-data-uri-plugin.ts +23 -12
  354. package/src/build/rspack/generated-config.ts +35 -0
  355. package/src/build/rspack/index.ts +10 -5
  356. package/src/build/rspack/module-federation.ts +1 -1
  357. package/src/build/rspack/plugin.ts +103 -105
  358. package/src/build/rspack/utils.ts +8 -2
  359. package/src/build/ui/factory.ts +96 -0
  360. package/src/build/ui/generated-config.ts +133 -0
  361. package/src/build/ui/hash-artifacts-plugin.ts +79 -0
  362. package/src/build/ui/index.ts +98 -0
  363. package/src/build/ui/manifest-plugin.ts +54 -0
  364. package/src/build/ui/rsbuild-config.ts +256 -0
  365. package/src/build/ui/stubs.ts +103 -0
  366. package/src/cli.ts +100 -0
  367. package/src/dev/serve.ts +477 -0
  368. package/src/dev/watch-kill.ts +58 -0
  369. package/src/effect-helpers.ts +25 -0
  370. package/src/errors.ts +16 -18
  371. package/src/identity.ts +36 -0
  372. package/src/index.ts +4 -0
  373. package/src/plugin.ts +70 -92
  374. package/src/remote-entry.ts +171 -0
  375. package/src/runtime/errors.ts +186 -27
  376. package/src/runtime/index.ts +132 -43
  377. package/src/runtime/mf-config.ts +12 -107
  378. package/src/runtime/services/module-federation.service.ts +221 -117
  379. package/src/runtime/services/normalize.ts +1 -18
  380. package/src/runtime/services/plugin-lifecycle.service.ts +66 -75
  381. package/src/runtime/services/plugin-loader.service.ts +239 -212
  382. package/src/runtime/services/plugin.service.ts +61 -43
  383. package/src/runtime/services/secrets.service.ts +20 -15
  384. package/src/runtime/services/shared-identity.ts +68 -0
  385. package/src/runtime/validation.ts +5 -7
  386. package/src/shared-deps-spec.ts +478 -0
  387. package/src/types.ts +22 -48
  388. package/src/ui/manifest/construct.ts +403 -0
  389. package/src/ui/manifest/contract.ts +33 -0
  390. package/src/ui/manifest/descriptor.ts +96 -0
  391. package/src/ui/manifest/generator.ts +238 -0
  392. package/src/ui/manifest/index.ts +55 -0
  393. package/src/ui/manifest/manifest-schema.ts +107 -0
  394. package/src/ui/manifest/mount-registry.ts +50 -0
  395. package/src/ui/manifest/nav.ts +43 -0
  396. package/src/ui/manifest/route-config.ts +82 -0
  397. package/src/version-manifest.ts +88 -0
  398. package/dist/build/rspack/dev-server-middleware.cjs +0 -194
  399. package/dist/build/rspack/dev-server-middleware.cjs.map +0 -1
  400. package/dist/build/rspack/dev-server-middleware.mjs +0 -193
  401. package/dist/build/rspack/dev-server-middleware.mjs.map +0 -1
  402. package/dist/build/shared-deps.cjs +0 -83
  403. package/dist/build/shared-deps.cjs.map +0 -1
  404. package/dist/build/shared-deps.d.cts +0 -67
  405. package/dist/build/shared-deps.d.cts.map +0 -1
  406. package/dist/build/shared-deps.d.mts +0 -67
  407. package/dist/build/shared-deps.d.mts.map +0 -1
  408. package/dist/build/shared-deps.mjs +0 -79
  409. package/dist/build/shared-deps.mjs.map +0 -1
  410. package/dist/effect.cjs +0 -9
  411. package/dist/effect.d.cts +0 -1
  412. package/dist/effect.d.mts +0 -1
  413. package/dist/effect.mjs +0 -3
  414. package/dist/orpc-openapi.cjs +0 -17
  415. package/dist/orpc-openapi.d.cts +0 -2
  416. package/dist/orpc-openapi.d.mts +0 -2
  417. package/dist/orpc-openapi.mjs +0 -5
  418. package/dist/orpc.cjs +0 -46
  419. package/dist/orpc.d.cts +0 -7
  420. package/dist/orpc.d.mts +0 -7
  421. package/dist/orpc.mjs +0 -11
  422. package/dist/package.cjs +0 -23
  423. package/dist/package.cjs.map +0 -1
  424. package/dist/package.mjs +0 -17
  425. package/dist/package.mjs.map +0 -1
  426. package/dist/runtime/services/module-federation.service.d.cts.map +0 -1
  427. package/dist/runtime/services/module-federation.service.d.mts.map +0 -1
  428. package/dist/runtime/services/normalize.cjs.map +0 -1
  429. package/dist/runtime/services/normalize.d.cts.map +0 -1
  430. package/dist/runtime/services/normalize.d.mts.map +0 -1
  431. package/dist/runtime/services/normalize.mjs.map +0 -1
  432. package/dist/runtime/services/plugin-lifecycle.service.d.cts.map +0 -1
  433. package/dist/runtime/services/plugin-lifecycle.service.d.mts.map +0 -1
  434. package/dist/runtime/services/plugin-loader.service.d.cts.map +0 -1
  435. package/dist/runtime/services/plugin-loader.service.d.mts.map +0 -1
  436. package/dist/runtime/services/secrets.service.d.cts.map +0 -1
  437. package/dist/runtime/services/secrets.service.d.mts.map +0 -1
  438. package/dist/testing/index.cjs +0 -57
  439. package/dist/testing/index.cjs.map +0 -1
  440. package/dist/testing/index.d.cts +0 -54
  441. package/dist/testing/index.d.cts.map +0 -1
  442. package/dist/testing/index.d.mts +0 -54
  443. package/dist/testing/index.d.mts.map +0 -1
  444. package/dist/testing/index.mjs +0 -55
  445. package/dist/testing/index.mjs.map +0 -1
  446. package/dist/zod-core.cjs +0 -9
  447. package/dist/zod-core.d.cts +0 -1
  448. package/dist/zod-core.d.mts +0 -1
  449. package/dist/zod-core.mjs +0 -3
  450. package/dist/zod.cjs +0 -11
  451. package/dist/zod.d.cts +0 -2
  452. package/dist/zod.d.mts +0 -2
  453. package/dist/zod.mjs +0 -3
  454. package/src/build/rspack/dev-server-middleware.ts +0 -250
  455. package/src/build/shared-deps.ts +0 -102
  456. package/src/effect.ts +0 -1
  457. package/src/orpc-openapi.ts +0 -2
  458. package/src/orpc.ts +0 -9
  459. package/src/testing/index.ts +0 -87
  460. package/src/testing/mocks/module-federation.service.ts +0 -41
  461. package/src/zod-core.ts +0 -1
  462. package/src/zod.ts +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.cjs","names":["DEV_ENTRY_FILENAME","Effect","loadRemoteWithRetry","getPluginInfo","loadDevConfig","path","pluginLayoutKey","spawn","ensureGeneratedRspackConfig","ensureGeneratedUiRsbuildConfig","fs","http","PLUGIN_ERROR_STATUS_MAP","killChildEscalating"],"sources":["../../src/dev/serve.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport path from \"node:path\";\nimport { Effect } from \"effect\";\nimport sirv from \"sirv\";\nimport { DEV_ENTRY_FILENAME } from \"../build/artifact-names\";\nimport { ensureGeneratedRspackConfig } from \"../build/rspack/generated-config\";\nimport { getPluginInfo, loadDevConfig } from \"../build/rspack/utils\";\nimport { ensureGeneratedUiRsbuildConfig, pluginLayoutKey } from \"../build/ui/generated-config\";\nimport { PLUGIN_ERROR_STATUS_MAP } from \"../errors\";\nimport { loadRemoteWithRetry } from \"../remote-entry\";\nimport { killChildEscalating, watchParentDeath } from \"./watch-kill\";\n\nconst corsHeaders = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, PATCH, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"X-Requested-With, content-type, Authorization\",\n};\n\nconst applyCorsHeaders = (res: http.ServerResponse) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return \"\";\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, \"\");\n return cleaned ? `/${cleaned}` : \"\";\n};\n\nconst readRuntimeConfigFromEnv = (): any => {\n const raw = process.env.BOS_RUNTIME_CONFIG;\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst collectSiblingRemotes = (runtimeConfig: any, pluginId: string) => {\n const siblings: Record<string, { remote: string }> = {};\n\n const isApi = pluginId === \"api\" || runtimeConfig?.api?.name === pluginId;\n\n const ownKey = runtimeConfig?.plugins?.[pluginId] ? pluginId : null;\n let dependsOn: string[] = [];\n if (ownKey) {\n dependsOn = runtimeConfig.plugins[ownKey].dependsOn ?? [];\n } else if (isApi) {\n dependsOn = runtimeConfig?.api?.dependsOn ?? [];\n }\n\n for (const depId of dependsOn) {\n const dep = runtimeConfig?.plugins?.[depId];\n if (!dep || dep.source !== \"local\" || !dep.url) continue;\n if (depId === pluginId) continue;\n const base = dep.url.replace(/\\/$/, \"\");\n siblings[depId] = { remote: `${base}/${DEV_ENTRY_FILENAME}` };\n }\n\n return { siblings, dependsOn };\n};\n\nconst loadPluginWithRetry = (\n runtime: any,\n pluginId: string,\n remoteUrl: string,\n options: Record<string, unknown> = { variables: {}, secrets: {} },\n pluginsMap?: Record<string, unknown>,\n timeoutMs = 90000,\n): Promise<any> =>\n Effect.runPromise(\n loadRemoteWithRetry({\n label: pluginId,\n remoteUrl,\n load: () => runtime.usePlugin(pluginId, options, pluginsMap),\n timeoutMs,\n }),\n );\n\nconst sendJson = (res: http.ServerResponse, status: number, body: unknown) => {\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n};\n\nconst sendText = (res: http.ServerResponse, status: number, text: string) => {\n res.statusCode = status;\n res.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n res.end(text);\n};\n\nexport interface PluginDevServeOptions {\n cwd?: string;\n port?: number;\n watch?: boolean;\n}\n\nexport interface PluginDevServerHandle {\n port: number;\n close: () => Promise<void>;\n}\n\n/**\n * The dev server's plugin id — the workspace's npm package name, the same\n * value the host passes as `runtimeId`. Both initialize sites must agree:\n * `registerRemote` derives the MF remote name from it, and the plugin's\n * database layer derives its migration slug from it, so a pre-normalized\n * remote name here would migrate into a different schema than the host\n * expects. plugin.dev.ts no longer carries a pluginId field.\n */\nexport const resolveDevPluginId = (cwd: string): string => getPluginInfo(cwd).name;\n\nexport async function startPluginDevServer(\n options: PluginDevServeOptions = {},\n): Promise<PluginDevServerHandle> {\n process.env.BOS_DEV_SERVER = \"1\";\n const cwd = options.cwd ?? process.cwd();\n const pluginInfo = getPluginInfo(cwd);\n const devConfig = loadDevConfig(path.join(cwd, \"plugin.dev.ts\"));\n const pluginId = resolveDevPluginId(cwd);\n const compositionKey = pluginLayoutKey(cwd) ?? pluginId;\n const port = options.port ?? (Number(process.env.PORT) || devConfig?.port || 3999);\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n const rpcBase = `/api/rpc${rpcPrefix}`;\n\n const distDir = path.join(cwd, \"dist\");\n const serveStatic = sirv(distDir, { dev: true });\n\n // No-watch mode (BOS_NO_WATCH=1): build once, serve the built output.\n // Regression/CI stacks need no hot reload — watchers are the stack's\n // heaviest processes and stall runs freeze under their accumulated\n // footprint. One-shot builds exit; steady state is small static servers.\n const noWatch = options.watch === false || process.env.BOS_NO_WATCH === \"1\";\n\n const runOnce = (cmd: string, args: string[]) =>\n new Promise<void>((resolve, reject) => {\n const child = spawn(cmd, args, { cwd, stdio: \"inherit\", env: process.env });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`❌ ${cmd} ${args.join(\" \")} exited with ${code}`));\n });\n });\n\n let watcher: ReturnType<typeof spawn> | null = null;\n if (noWatch) {\n const generatedConfig = ensureGeneratedRspackConfig(cwd);\n await runOnce(\"rspack\", generatedConfig ? [\"build\", \"--config\", generatedConfig] : [\"build\"]);\n } else if (options.watch !== false) {\n const generatedConfig = ensureGeneratedRspackConfig(cwd);\n watcher = spawn(\n \"rspack\",\n generatedConfig ? [\"build\", \"--watch\", \"--config\", generatedConfig] : [\"build\", \"--watch\"],\n {\n cwd,\n stdio: \"inherit\",\n env: process.env,\n },\n );\n watcher.on(\"error\", (error) => {\n console.error(`❌ Failed to spawn rspack build --watch: ${error.message}`);\n });\n }\n\n let uiWatcher: ReturnType<typeof spawn> | null = null;\n let uiStaticServer: http.Server | null = null;\n const uiPort = process.env.BOS_UI_PORT;\n const uiConfig = ensureGeneratedUiRsbuildConfig(cwd);\n if (uiConfig && noWatch && uiPort) {\n // Folder-form ui: one-shot build, then serve the ui source root's dist\n // (the factory's absolute distPath target) statically on the ui port.\n await runOnce(\"rsbuild\", [\"build\", \"--config\", uiConfig]);\n const uiDistDir =\n path.basename(cwd) === \"ui\" ? path.join(cwd, \"dist\") : path.join(cwd, \"ui\", \"dist\");\n if (!fs.existsSync(path.join(uiDistDir, DEV_ENTRY_FILENAME))) {\n console.error(\n `❌ UI dist is missing at ${uiDistDir} — the ui static server would serve 404s for every asset (build output layout mismatch?)`,\n );\n }\n const serveUiStatic = sirv(uiDistDir, { dev: true });\n uiStaticServer = http.createServer((req, res) => {\n applyCorsHeaders(res);\n serveUiStatic(req, res, () => {\n sendText(res, 404, \"Not Found\");\n });\n });\n await new Promise<void>((resolve, reject) => {\n uiStaticServer!.once(\"error\", reject);\n uiStaticServer!.listen(Number(uiPort), () => resolve());\n });\n console.log(`├─ 🎨 UI: http://localhost:${uiPort} (built, no watch)`);\n } else if (uiConfig) {\n uiWatcher = spawn(\"rsbuild\", [\"dev\", \"--config\", uiConfig], {\n cwd,\n stdio: \"inherit\",\n env: uiPort ? { ...process.env, PORT: uiPort } : process.env,\n });\n uiWatcher.on(\"error\", (error) => {\n console.error(`❌ Failed to spawn rsbuild ui dev: ${error.message}`);\n });\n console.log(`├─ 🎨 UI: ${uiPort ? `http://localhost:${uiPort}` : \"(rsbuild auto port)\"}`);\n }\n\n const handlers: { rpc: any; api: any } = { rpc: null, api: null };\n const effectContextHolder: { context: unknown } = { context: null };\n let runtime: { shutdown: () => Promise<void> } | null = null;\n\n const pathnameOf = (req: http.IncomingMessage): string =>\n ((req.url ?? \"/\").split(\"?\")[0] ?? \"/\").replace(/\\/+$/, \"\") || \"/\";\n\n const buildDevContext = (_req: http.IncomingMessage, webRequest: Request) => {\n const rawClone =\n webRequest.method === \"GET\" || webRequest.method === \"HEAD\" ? null : webRequest.clone();\n let cachedRawBody: string | null = null;\n return {\n reqHeaders: webRequest.headers,\n \"effect/context\": effectContextHolder.context,\n getRawBody: async (): Promise<string> => {\n if (cachedRawBody !== null) return cachedRawBody;\n if (!rawClone) {\n cachedRawBody = \"\";\n return cachedRawBody;\n }\n cachedRawBody = await rawClone.text();\n return cachedRawBody;\n },\n };\n };\n\n const toWebRequest = (req: http.IncomingMessage): Request => {\n const url = `http://localhost:${port}${req.url}`;\n return new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== \"GET\" && req.method !== \"HEAD\" ? req : undefined,\n duplex: req.method !== \"GET\" && req.method !== \"HEAD\" ? \"half\" : undefined,\n } as RequestInit);\n };\n\n const handleOrpc = async (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n handler: any,\n prefix: string,\n errorLabel: string,\n ) => {\n try {\n const webRequest = toWebRequest(req);\n const result = await handler.handle(webRequest, {\n prefix,\n context: buildDevContext(req, webRequest),\n });\n\n if (result.response) {\n res.statusCode = result.response.status;\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n if (!res.getHeader(\"content-length\")) {\n res.setHeader(\"content-length\", Buffer.byteLength(text).toString());\n }\n res.end(text);\n } else {\n sendText(res, 404, \"Not Found\");\n }\n } catch (error) {\n console.error(`${errorLabel} error:`, error);\n sendJson(res, 500, { error: (error as Error).message });\n }\n };\n\n const server = http.createServer((req, res) => {\n applyCorsHeaders(res);\n const pathname = pathnameOf(req);\n\n if (req.method === \"OPTIONS\") {\n res.statusCode = 200;\n res.end();\n return;\n }\n\n if (pathname === \"/\" && (req.method === \"GET\" || req.method === \"HEAD\")) {\n sendJson(res, 200, {\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: handlers.rpc ? \"ready\" : \"loading\",\n endpoints: {\n health: \"/\",\n docs: \"/api\",\n rpc: rpcBase,\n },\n });\n return;\n }\n\n if (pathname === \"/health\" && (req.method === \"GET\" || req.method === \"HEAD\")) {\n sendText(res, 200, \"OK\");\n return;\n }\n\n if (pathname.startsWith(`${rpcBase}/`)) {\n if (!handlers.rpc) {\n sendJson(res, 503, { error: \"Plugin still loading...\" });\n return;\n }\n handleOrpc(req, res, handlers.rpc, rpcBase, \"RPC\").catch(() => {});\n return;\n }\n\n if (pathname === \"/api\" || pathname.startsWith(\"/api/\")) {\n if (!handlers.api) {\n sendJson(res, 503, { error: \"Plugin still loading...\" });\n return;\n }\n handleOrpc(req, res, handlers.api, \"/api\", \"OpenAPI\").catch(() => {});\n return;\n }\n\n serveStatic(req, res, () => {\n sendText(res, 404, \"Not Found\");\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, () => resolve());\n });\n\n console.log(`🚀 ${pluginInfo.name} dev server listening on port ${port}`);\n console.log(`├─ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`├─ 📖 Docs: http://localhost:${port}/api`);\n console.log(`└─ 💚 Health: http://localhost:${port}/`);\n\n const load = async () => {\n try {\n // Import framework internals directly. A package self-import can resolve\n // the published entry while this source-first dev server is running,\n // which leaves the runtime exports unavailable on Windows.\n const { createPluginRuntime } = await import(\"../runtime\");\n const { RPCHandler } = await import(\"@orpc/server/fetch\");\n const { OpenAPIHandler } = await import(\"@orpc/openapi/fetch\");\n const { OpenAPIGenerator } = await import(\"@orpc/openapi\");\n const { OpenAPIReferenceHandlerPlugin } = await import(\"@orpc/openapi/plugins\");\n const { ZodToJsonSchemaConverter } = await import(\"@orpc/zod\");\n const { onError } = await import(\"@orpc/server\");\n const { formatORPCError } = await import(\"../errors\");\n\n const runtimeConfig = readRuntimeConfigFromEnv();\n const { siblings, dependsOn } = collectSiblingRemotes(runtimeConfig, compositionKey);\n\n if (dependsOn.length > 0) {\n console.log(`🔗 Loading sibling plugin(s): ${dependsOn.join(\", \")}`);\n }\n\n const registry: Record<string, { remote: string }> = {\n [pluginId]: {\n remote: `http://localhost:${port}/${DEV_ENTRY_FILENAME}`,\n },\n ...siblings,\n };\n\n const mfRuntime = createPluginRuntime({ registry });\n runtime = mfRuntime;\n\n const pluginsMap: Record<string, unknown> = {};\n const siblingEffectContexts: unknown[] = [];\n for (const depId of Object.keys(siblings)) {\n const dep = await loadPluginWithRetry(mfRuntime, depId, siblings[depId]!.remote);\n pluginsMap[depId] = { client: dep.createClient, router: dep.router };\n if (dep.initialized?.effectContext) {\n siblingEffectContexts.push(dep.initialized.effectContext);\n }\n console.log(`✅ Loaded dependency plugin: ${depId}`);\n }\n\n const loaded: any = await loadPluginWithRetry(\n mfRuntime,\n pluginId,\n registry[pluginId]!.remote,\n (devConfig?.config ?? { variables: {}, secrets: {} }) as Record<string, unknown>,\n Object.keys(pluginsMap).length > 0 ? pluginsMap : undefined,\n );\n\n const { Context } = await import(\"effect\");\n effectContextHolder.context = [loaded.initialized?.effectContext, ...siblingEffectContexts]\n .filter(Boolean)\n .reduce((acc: any, ctx: any) => Context.merge(acc, ctx), Context.empty());\n\n handlers.rpc = new RPCHandler(loaded.router, {\n errorStatusMap: PLUGIN_ERROR_STATUS_MAP,\n interceptors: [\n onError((error: any) => {\n const formatted = formatORPCError(error);\n if (formatted) console.error(formatted);\n }),\n ],\n });\n\n const generator = new OpenAPIGenerator({ converters: [new ZodToJsonSchemaConverter()] });\n\n handlers.api = new OpenAPIHandler(loaded.router, {\n errorStatusMap: PLUGIN_ERROR_STATUS_MAP,\n plugins: [\n new OpenAPIReferenceHandlerPlugin({\n spec: () => generator.generate(loaded.router, { version: \"3.1.1\" }),\n }),\n ],\n interceptors: [\n onError((error: any) => {\n const formatted = formatORPCError(error);\n if (formatted) console.error(formatted);\n }),\n ],\n });\n\n console.log(`✅ Plugin ready: ${pluginId}`);\n } catch (error) {\n console.error(`❌ Failed to load plugin ${pluginId}:`, error);\n console.error(\" Server stays up; fix the build and retry via rebuild.\");\n }\n };\n\n void load();\n\n const close = async () => {\n handlers.rpc = null;\n handlers.api = null;\n effectContextHolder.context = null;\n for (const child of [watcher, uiWatcher]) {\n if (child) {\n await killChildEscalating(child);\n }\n }\n if (uiStaticServer) {\n await new Promise<void>((resolve) => uiStaticServer.close(() => resolve()));\n }\n if (runtime) await runtime.shutdown().catch(() => {});\n await new Promise<void>((resolve) => server.close(() => resolve()));\n };\n\n process.once(\"SIGINT\", async () => {\n const timeout = setTimeout(() => process.exit(0), 3000);\n await close();\n clearTimeout(timeout);\n process.exit(0);\n });\n process.once(\"SIGTERM\", async () => {\n const timeout = setTimeout(() => process.exit(0), 3000);\n await close();\n clearTimeout(timeout);\n process.exit(0);\n });\n\n watchParentDeath(async () => {\n const timeout = setTimeout(() => process.exit(0), 3000);\n await close();\n clearTimeout(timeout);\n process.exit(0);\n });\n\n return { port, close };\n}\n\nconst invokedAsCli = import.meta.main || (process.argv[1] ?? \"\").includes(\"every-plugin-serve\");\n\nif (invokedAsCli) {\n startPluginDevServer().catch((error) => {\n console.error(\"❌ Plugin dev server fatal error:\", error);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ //#region src/dev/serve.d.ts
2
+ interface PluginDevServeOptions {
3
+ cwd?: string;
4
+ port?: number;
5
+ watch?: boolean;
6
+ }
7
+ interface PluginDevServerHandle {
8
+ port: number;
9
+ close: () => Promise<void>;
10
+ }
11
+ /**
12
+ * The dev server's plugin id — the workspace's npm package name, the same
13
+ * value the host passes as `runtimeId`. Both initialize sites must agree:
14
+ * `registerRemote` derives the MF remote name from it, and the plugin's
15
+ * database layer derives its migration slug from it, so a pre-normalized
16
+ * remote name here would migrate into a different schema than the host
17
+ * expects. plugin.dev.ts no longer carries a pluginId field.
18
+ */
19
+ declare const resolveDevPluginId: (cwd: string) => string;
20
+ declare function startPluginDevServer(options?: PluginDevServeOptions): Promise<PluginDevServerHandle>;
21
+ //#endregion
22
+ export { PluginDevServeOptions, PluginDevServerHandle, resolveDevPluginId, startPluginDevServer };
23
+ //# sourceMappingURL=serve.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.cts","names":[],"sources":["../../src/dev/serve.ts"],"mappings":";UA+FiB;EACf;EACA;EACA;;UAGe;EACf;EACA,aAAa;;;;;;;;;;cAWF,qBAAkB;iBAET,qBACpB,UAAS,wBACR,QAAQ"}
@@ -0,0 +1,23 @@
1
+ //#region src/dev/serve.d.ts
2
+ interface PluginDevServeOptions {
3
+ cwd?: string;
4
+ port?: number;
5
+ watch?: boolean;
6
+ }
7
+ interface PluginDevServerHandle {
8
+ port: number;
9
+ close: () => Promise<void>;
10
+ }
11
+ /**
12
+ * The dev server's plugin id — the workspace's npm package name, the same
13
+ * value the host passes as `runtimeId`. Both initialize sites must agree:
14
+ * `registerRemote` derives the MF remote name from it, and the plugin's
15
+ * database layer derives its migration slug from it, so a pre-normalized
16
+ * remote name here would migrate into a different schema than the host
17
+ * expects. plugin.dev.ts no longer carries a pluginId field.
18
+ */
19
+ declare const resolveDevPluginId: (cwd: string) => string;
20
+ declare function startPluginDevServer(options?: PluginDevServeOptions): Promise<PluginDevServerHandle>;
21
+ //#endregion
22
+ export { PluginDevServeOptions, PluginDevServerHandle, resolveDevPluginId, startPluginDevServer };
23
+ //# sourceMappingURL=serve.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.mts","names":[],"sources":["../../src/dev/serve.ts"],"mappings":";UA+FiB;EACf;EACA;EACA;;UAGe;EACf;EACA,aAAa;;;;;;;;;;cAWF,qBAAkB;iBAET,qBACpB,UAAS,wBACR,QAAQ"}
@@ -0,0 +1,384 @@
1
+ #!/usr/bin/env node
2
+ import { PLUGIN_ERROR_STATUS_MAP } from "../errors.mjs";
3
+ import { DEV_ENTRY_FILENAME } from "../build/artifact-names.mjs";
4
+ import { loadRemoteWithRetry } from "../remote-entry.mjs";
5
+ import { getPluginInfo, loadDevConfig } from "../build/rspack/utils.mjs";
6
+ import { ensureGeneratedUiRsbuildConfig, pluginLayoutKey } from "../build/ui/generated-config.mjs";
7
+ import { ensureGeneratedRspackConfig } from "../build/rspack/generated-config.mjs";
8
+ import { killChildEscalating, watchParentDeath } from "./watch-kill.mjs";
9
+ import { Effect } from "effect";
10
+ import fs from "node:fs";
11
+ import path from "node:path";
12
+ import { spawn } from "node:child_process";
13
+ import http from "node:http";
14
+ import sirv from "sirv";
15
+
16
+ //#region src/dev/serve.ts
17
+ const corsHeaders = {
18
+ "Access-Control-Allow-Origin": "*",
19
+ "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
20
+ "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
21
+ };
22
+ const applyCorsHeaders = (res) => {
23
+ Object.entries(corsHeaders).forEach(([key, value]) => {
24
+ res.setHeader(key, value);
25
+ });
26
+ };
27
+ const normalizePrefix = (prefix) => {
28
+ if (!prefix) return "";
29
+ const cleaned = prefix.replace(/^\/+|\/+$/g, "");
30
+ return cleaned ? `/${cleaned}` : "";
31
+ };
32
+ const readRuntimeConfigFromEnv = () => {
33
+ const raw = process.env.BOS_RUNTIME_CONFIG;
34
+ if (!raw) return null;
35
+ try {
36
+ return JSON.parse(raw);
37
+ } catch {
38
+ return null;
39
+ }
40
+ };
41
+ const collectSiblingRemotes = (runtimeConfig, pluginId) => {
42
+ const siblings = {};
43
+ const isApi = pluginId === "api" || runtimeConfig?.api?.name === pluginId;
44
+ const ownKey = runtimeConfig?.plugins?.[pluginId] ? pluginId : null;
45
+ let dependsOn = [];
46
+ if (ownKey) dependsOn = runtimeConfig.plugins[ownKey].dependsOn ?? [];
47
+ else if (isApi) dependsOn = runtimeConfig?.api?.dependsOn ?? [];
48
+ for (const depId of dependsOn) {
49
+ const dep = runtimeConfig?.plugins?.[depId];
50
+ if (!dep || dep.source !== "local" || !dep.url) continue;
51
+ if (depId === pluginId) continue;
52
+ siblings[depId] = { remote: `${dep.url.replace(/\/$/, "")}/${DEV_ENTRY_FILENAME}` };
53
+ }
54
+ return {
55
+ siblings,
56
+ dependsOn
57
+ };
58
+ };
59
+ const loadPluginWithRetry = (runtime, pluginId, remoteUrl, options = {
60
+ variables: {},
61
+ secrets: {}
62
+ }, pluginsMap, timeoutMs = 9e4) => Effect.runPromise(loadRemoteWithRetry({
63
+ label: pluginId,
64
+ remoteUrl,
65
+ load: () => runtime.usePlugin(pluginId, options, pluginsMap),
66
+ timeoutMs
67
+ }));
68
+ const sendJson = (res, status, body) => {
69
+ res.statusCode = status;
70
+ res.setHeader("content-type", "application/json; charset=utf-8");
71
+ res.end(JSON.stringify(body));
72
+ };
73
+ const sendText = (res, status, text) => {
74
+ res.statusCode = status;
75
+ res.setHeader("content-type", "text/plain; charset=utf-8");
76
+ res.end(text);
77
+ };
78
+ /**
79
+ * The dev server's plugin id — the workspace's npm package name, the same
80
+ * value the host passes as `runtimeId`. Both initialize sites must agree:
81
+ * `registerRemote` derives the MF remote name from it, and the plugin's
82
+ * database layer derives its migration slug from it, so a pre-normalized
83
+ * remote name here would migrate into a different schema than the host
84
+ * expects. plugin.dev.ts no longer carries a pluginId field.
85
+ */
86
+ const resolveDevPluginId = (cwd) => getPluginInfo(cwd).name;
87
+ async function startPluginDevServer(options = {}) {
88
+ process.env.BOS_DEV_SERVER = "1";
89
+ const cwd = options.cwd ?? process.cwd();
90
+ const pluginInfo = getPluginInfo(cwd);
91
+ const devConfig = loadDevConfig(path.join(cwd, "plugin.dev.ts"));
92
+ const pluginId = resolveDevPluginId(cwd);
93
+ const compositionKey = pluginLayoutKey(cwd) ?? pluginId;
94
+ const port = options.port ?? (Number(process.env.PORT) || devConfig?.port || 3999);
95
+ const rpcPrefix = normalizePrefix(devConfig?.prefix);
96
+ const rpcBase = `/api/rpc${rpcPrefix}`;
97
+ const distDir = path.join(cwd, "dist");
98
+ const serveStatic = sirv(distDir, { dev: true });
99
+ const noWatch = options.watch === false || process.env.BOS_NO_WATCH === "1";
100
+ const runOnce = (cmd, args) => new Promise((resolve, reject) => {
101
+ const child = spawn(cmd, args, {
102
+ cwd,
103
+ stdio: "inherit",
104
+ env: process.env
105
+ });
106
+ child.on("error", reject);
107
+ child.on("exit", (code) => {
108
+ if (code === 0) resolve();
109
+ else reject(/* @__PURE__ */ new Error(`❌ ${cmd} ${args.join(" ")} exited with ${code}`));
110
+ });
111
+ });
112
+ let watcher = null;
113
+ if (noWatch) {
114
+ const generatedConfig = ensureGeneratedRspackConfig(cwd);
115
+ await runOnce("rspack", generatedConfig ? [
116
+ "build",
117
+ "--config",
118
+ generatedConfig
119
+ ] : ["build"]);
120
+ } else if (options.watch !== false) {
121
+ const generatedConfig = ensureGeneratedRspackConfig(cwd);
122
+ watcher = spawn("rspack", generatedConfig ? [
123
+ "build",
124
+ "--watch",
125
+ "--config",
126
+ generatedConfig
127
+ ] : ["build", "--watch"], {
128
+ cwd,
129
+ stdio: "inherit",
130
+ env: process.env
131
+ });
132
+ watcher.on("error", (error) => {
133
+ console.error(`❌ Failed to spawn rspack build --watch: ${error.message}`);
134
+ });
135
+ }
136
+ let uiWatcher = null;
137
+ let uiStaticServer = null;
138
+ const uiPort = process.env.BOS_UI_PORT;
139
+ const uiConfig = ensureGeneratedUiRsbuildConfig(cwd);
140
+ if (uiConfig && noWatch && uiPort) {
141
+ await runOnce("rsbuild", [
142
+ "build",
143
+ "--config",
144
+ uiConfig
145
+ ]);
146
+ const uiDistDir = path.basename(cwd) === "ui" ? path.join(cwd, "dist") : path.join(cwd, "ui", "dist");
147
+ if (!fs.existsSync(path.join(uiDistDir, "remoteEntry.js"))) console.error(`❌ UI dist is missing at ${uiDistDir} — the ui static server would serve 404s for every asset (build output layout mismatch?)`);
148
+ const serveUiStatic = sirv(uiDistDir, { dev: true });
149
+ uiStaticServer = http.createServer((req, res) => {
150
+ applyCorsHeaders(res);
151
+ serveUiStatic(req, res, () => {
152
+ sendText(res, 404, "Not Found");
153
+ });
154
+ });
155
+ await new Promise((resolve, reject) => {
156
+ uiStaticServer.once("error", reject);
157
+ uiStaticServer.listen(Number(uiPort), () => resolve());
158
+ });
159
+ console.log(`├─ 🎨 UI: http://localhost:${uiPort} (built, no watch)`);
160
+ } else if (uiConfig) {
161
+ uiWatcher = spawn("rsbuild", [
162
+ "dev",
163
+ "--config",
164
+ uiConfig
165
+ ], {
166
+ cwd,
167
+ stdio: "inherit",
168
+ env: uiPort ? {
169
+ ...process.env,
170
+ PORT: uiPort
171
+ } : process.env
172
+ });
173
+ uiWatcher.on("error", (error) => {
174
+ console.error(`❌ Failed to spawn rsbuild ui dev: ${error.message}`);
175
+ });
176
+ console.log(`├─ 🎨 UI: ${uiPort ? `http://localhost:${uiPort}` : "(rsbuild auto port)"}`);
177
+ }
178
+ const handlers = {
179
+ rpc: null,
180
+ api: null
181
+ };
182
+ const effectContextHolder = { context: null };
183
+ let runtime = null;
184
+ const pathnameOf = (req) => ((req.url ?? "/").split("?")[0] ?? "/").replace(/\/+$/, "") || "/";
185
+ const buildDevContext = (_req, webRequest) => {
186
+ const rawClone = webRequest.method === "GET" || webRequest.method === "HEAD" ? null : webRequest.clone();
187
+ let cachedRawBody = null;
188
+ return {
189
+ reqHeaders: webRequest.headers,
190
+ "effect/context": effectContextHolder.context,
191
+ getRawBody: async () => {
192
+ if (cachedRawBody !== null) return cachedRawBody;
193
+ if (!rawClone) {
194
+ cachedRawBody = "";
195
+ return cachedRawBody;
196
+ }
197
+ cachedRawBody = await rawClone.text();
198
+ return cachedRawBody;
199
+ }
200
+ };
201
+ };
202
+ const toWebRequest = (req) => {
203
+ const url = `http://localhost:${port}${req.url}`;
204
+ return new Request(url, {
205
+ method: req.method,
206
+ headers: req.headers,
207
+ body: req.method !== "GET" && req.method !== "HEAD" ? req : void 0,
208
+ duplex: req.method !== "GET" && req.method !== "HEAD" ? "half" : void 0
209
+ });
210
+ };
211
+ const handleOrpc = async (req, res, handler, prefix, errorLabel) => {
212
+ try {
213
+ const webRequest = toWebRequest(req);
214
+ const result = await handler.handle(webRequest, {
215
+ prefix,
216
+ context: buildDevContext(req, webRequest)
217
+ });
218
+ if (result.response) {
219
+ res.statusCode = result.response.status;
220
+ result.response.headers.forEach((value, key) => {
221
+ res.setHeader(key, value);
222
+ });
223
+ const text = await result.response.text();
224
+ if (!res.getHeader("content-length")) res.setHeader("content-length", Buffer.byteLength(text).toString());
225
+ res.end(text);
226
+ } else sendText(res, 404, "Not Found");
227
+ } catch (error) {
228
+ console.error(`${errorLabel} error:`, error);
229
+ sendJson(res, 500, { error: error.message });
230
+ }
231
+ };
232
+ const server = http.createServer((req, res) => {
233
+ applyCorsHeaders(res);
234
+ const pathname = pathnameOf(req);
235
+ if (req.method === "OPTIONS") {
236
+ res.statusCode = 200;
237
+ res.end();
238
+ return;
239
+ }
240
+ if (pathname === "/" && (req.method === "GET" || req.method === "HEAD")) {
241
+ sendJson(res, 200, {
242
+ ok: true,
243
+ plugin: pluginInfo.normalizedName,
244
+ version: pluginInfo.version,
245
+ status: handlers.rpc ? "ready" : "loading",
246
+ endpoints: {
247
+ health: "/",
248
+ docs: "/api",
249
+ rpc: rpcBase
250
+ }
251
+ });
252
+ return;
253
+ }
254
+ if (pathname === "/health" && (req.method === "GET" || req.method === "HEAD")) {
255
+ sendText(res, 200, "OK");
256
+ return;
257
+ }
258
+ if (pathname.startsWith(`${rpcBase}/`)) {
259
+ if (!handlers.rpc) {
260
+ sendJson(res, 503, { error: "Plugin still loading..." });
261
+ return;
262
+ }
263
+ handleOrpc(req, res, handlers.rpc, rpcBase, "RPC").catch(() => {});
264
+ return;
265
+ }
266
+ if (pathname === "/api" || pathname.startsWith("/api/")) {
267
+ if (!handlers.api) {
268
+ sendJson(res, 503, { error: "Plugin still loading..." });
269
+ return;
270
+ }
271
+ handleOrpc(req, res, handlers.api, "/api", "OpenAPI").catch(() => {});
272
+ return;
273
+ }
274
+ serveStatic(req, res, () => {
275
+ sendText(res, 404, "Not Found");
276
+ });
277
+ });
278
+ await new Promise((resolve, reject) => {
279
+ server.once("error", reject);
280
+ server.listen(port, () => resolve());
281
+ });
282
+ console.log(`🚀 ${pluginInfo.name} dev server listening on port ${port}`);
283
+ console.log(`├─ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);
284
+ console.log(`├─ 📖 Docs: http://localhost:${port}/api`);
285
+ console.log(`└─ 💚 Health: http://localhost:${port}/`);
286
+ const load = async () => {
287
+ try {
288
+ const { createPluginRuntime } = await import("../runtime/index.mjs");
289
+ const { RPCHandler } = await import("@orpc/server/fetch");
290
+ const { OpenAPIHandler } = await import("@orpc/openapi/fetch");
291
+ const { OpenAPIGenerator } = await import("@orpc/openapi");
292
+ const { OpenAPIReferenceHandlerPlugin } = await import("@orpc/openapi/plugins");
293
+ const { ZodToJsonSchemaConverter } = await import("@orpc/zod");
294
+ const { onError } = await import("@orpc/server");
295
+ const { formatORPCError } = await import("../errors.mjs");
296
+ const runtimeConfig = readRuntimeConfigFromEnv();
297
+ const { siblings, dependsOn } = collectSiblingRemotes(runtimeConfig, compositionKey);
298
+ if (dependsOn.length > 0) console.log(`🔗 Loading sibling plugin(s): ${dependsOn.join(", ")}`);
299
+ const registry = {
300
+ [pluginId]: { remote: `http://localhost:${port}/${DEV_ENTRY_FILENAME}` },
301
+ ...siblings
302
+ };
303
+ const mfRuntime = createPluginRuntime({ registry });
304
+ runtime = mfRuntime;
305
+ const pluginsMap = {};
306
+ const siblingEffectContexts = [];
307
+ for (const depId of Object.keys(siblings)) {
308
+ const dep = await loadPluginWithRetry(mfRuntime, depId, siblings[depId].remote);
309
+ pluginsMap[depId] = {
310
+ client: dep.createClient,
311
+ router: dep.router
312
+ };
313
+ if (dep.initialized?.effectContext) siblingEffectContexts.push(dep.initialized.effectContext);
314
+ console.log(`✅ Loaded dependency plugin: ${depId}`);
315
+ }
316
+ const loaded = await loadPluginWithRetry(mfRuntime, pluginId, registry[pluginId].remote, devConfig?.config ?? {
317
+ variables: {},
318
+ secrets: {}
319
+ }, Object.keys(pluginsMap).length > 0 ? pluginsMap : void 0);
320
+ const { Context } = await import("effect");
321
+ effectContextHolder.context = [loaded.initialized?.effectContext, ...siblingEffectContexts].filter(Boolean).reduce((acc, ctx) => Context.merge(acc, ctx), Context.empty());
322
+ handlers.rpc = new RPCHandler(loaded.router, {
323
+ errorStatusMap: PLUGIN_ERROR_STATUS_MAP,
324
+ interceptors: [onError((error) => {
325
+ const formatted = formatORPCError(error);
326
+ if (formatted) console.error(formatted);
327
+ })]
328
+ });
329
+ const generator = new OpenAPIGenerator({ converters: [new ZodToJsonSchemaConverter()] });
330
+ handlers.api = new OpenAPIHandler(loaded.router, {
331
+ errorStatusMap: PLUGIN_ERROR_STATUS_MAP,
332
+ plugins: [new OpenAPIReferenceHandlerPlugin({ spec: () => generator.generate(loaded.router, { version: "3.1.1" }) })],
333
+ interceptors: [onError((error) => {
334
+ const formatted = formatORPCError(error);
335
+ if (formatted) console.error(formatted);
336
+ })]
337
+ });
338
+ console.log(`✅ Plugin ready: ${pluginId}`);
339
+ } catch (error) {
340
+ console.error(`❌ Failed to load plugin ${pluginId}:`, error);
341
+ console.error(" Server stays up; fix the build and retry via rebuild.");
342
+ }
343
+ };
344
+ load();
345
+ const close = async () => {
346
+ handlers.rpc = null;
347
+ handlers.api = null;
348
+ effectContextHolder.context = null;
349
+ for (const child of [watcher, uiWatcher]) if (child) await killChildEscalating(child);
350
+ if (uiStaticServer) await new Promise((resolve) => uiStaticServer.close(() => resolve()));
351
+ if (runtime) await runtime.shutdown().catch(() => {});
352
+ await new Promise((resolve) => server.close(() => resolve()));
353
+ };
354
+ process.once("SIGINT", async () => {
355
+ const timeout = setTimeout(() => process.exit(0), 3e3);
356
+ await close();
357
+ clearTimeout(timeout);
358
+ process.exit(0);
359
+ });
360
+ process.once("SIGTERM", async () => {
361
+ const timeout = setTimeout(() => process.exit(0), 3e3);
362
+ await close();
363
+ clearTimeout(timeout);
364
+ process.exit(0);
365
+ });
366
+ watchParentDeath(async () => {
367
+ const timeout = setTimeout(() => process.exit(0), 3e3);
368
+ await close();
369
+ clearTimeout(timeout);
370
+ process.exit(0);
371
+ });
372
+ return {
373
+ port,
374
+ close
375
+ };
376
+ }
377
+ if (import.meta.main || (process.argv[1] ?? "").includes("every-plugin-serve")) startPluginDevServer().catch((error) => {
378
+ console.error("❌ Plugin dev server fatal error:", error);
379
+ process.exit(1);
380
+ });
381
+
382
+ //#endregion
383
+ export { resolveDevPluginId, startPluginDevServer };
384
+ //# sourceMappingURL=serve.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.mjs","names":[],"sources":["../../src/dev/serve.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport http from \"node:http\";\nimport path from \"node:path\";\nimport { Effect } from \"effect\";\nimport sirv from \"sirv\";\nimport { DEV_ENTRY_FILENAME } from \"../build/artifact-names\";\nimport { ensureGeneratedRspackConfig } from \"../build/rspack/generated-config\";\nimport { getPluginInfo, loadDevConfig } from \"../build/rspack/utils\";\nimport { ensureGeneratedUiRsbuildConfig, pluginLayoutKey } from \"../build/ui/generated-config\";\nimport { PLUGIN_ERROR_STATUS_MAP } from \"../errors\";\nimport { loadRemoteWithRetry } from \"../remote-entry\";\nimport { killChildEscalating, watchParentDeath } from \"./watch-kill\";\n\nconst corsHeaders = {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, PATCH, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"X-Requested-With, content-type, Authorization\",\n};\n\nconst applyCorsHeaders = (res: http.ServerResponse) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return \"\";\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, \"\");\n return cleaned ? `/${cleaned}` : \"\";\n};\n\nconst readRuntimeConfigFromEnv = (): any => {\n const raw = process.env.BOS_RUNTIME_CONFIG;\n if (!raw) return null;\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n};\n\nconst collectSiblingRemotes = (runtimeConfig: any, pluginId: string) => {\n const siblings: Record<string, { remote: string }> = {};\n\n const isApi = pluginId === \"api\" || runtimeConfig?.api?.name === pluginId;\n\n const ownKey = runtimeConfig?.plugins?.[pluginId] ? pluginId : null;\n let dependsOn: string[] = [];\n if (ownKey) {\n dependsOn = runtimeConfig.plugins[ownKey].dependsOn ?? [];\n } else if (isApi) {\n dependsOn = runtimeConfig?.api?.dependsOn ?? [];\n }\n\n for (const depId of dependsOn) {\n const dep = runtimeConfig?.plugins?.[depId];\n if (!dep || dep.source !== \"local\" || !dep.url) continue;\n if (depId === pluginId) continue;\n const base = dep.url.replace(/\\/$/, \"\");\n siblings[depId] = { remote: `${base}/${DEV_ENTRY_FILENAME}` };\n }\n\n return { siblings, dependsOn };\n};\n\nconst loadPluginWithRetry = (\n runtime: any,\n pluginId: string,\n remoteUrl: string,\n options: Record<string, unknown> = { variables: {}, secrets: {} },\n pluginsMap?: Record<string, unknown>,\n timeoutMs = 90000,\n): Promise<any> =>\n Effect.runPromise(\n loadRemoteWithRetry({\n label: pluginId,\n remoteUrl,\n load: () => runtime.usePlugin(pluginId, options, pluginsMap),\n timeoutMs,\n }),\n );\n\nconst sendJson = (res: http.ServerResponse, status: number, body: unknown) => {\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n};\n\nconst sendText = (res: http.ServerResponse, status: number, text: string) => {\n res.statusCode = status;\n res.setHeader(\"content-type\", \"text/plain; charset=utf-8\");\n res.end(text);\n};\n\nexport interface PluginDevServeOptions {\n cwd?: string;\n port?: number;\n watch?: boolean;\n}\n\nexport interface PluginDevServerHandle {\n port: number;\n close: () => Promise<void>;\n}\n\n/**\n * The dev server's plugin id — the workspace's npm package name, the same\n * value the host passes as `runtimeId`. Both initialize sites must agree:\n * `registerRemote` derives the MF remote name from it, and the plugin's\n * database layer derives its migration slug from it, so a pre-normalized\n * remote name here would migrate into a different schema than the host\n * expects. plugin.dev.ts no longer carries a pluginId field.\n */\nexport const resolveDevPluginId = (cwd: string): string => getPluginInfo(cwd).name;\n\nexport async function startPluginDevServer(\n options: PluginDevServeOptions = {},\n): Promise<PluginDevServerHandle> {\n process.env.BOS_DEV_SERVER = \"1\";\n const cwd = options.cwd ?? process.cwd();\n const pluginInfo = getPluginInfo(cwd);\n const devConfig = loadDevConfig(path.join(cwd, \"plugin.dev.ts\"));\n const pluginId = resolveDevPluginId(cwd);\n const compositionKey = pluginLayoutKey(cwd) ?? pluginId;\n const port = options.port ?? (Number(process.env.PORT) || devConfig?.port || 3999);\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n const rpcBase = `/api/rpc${rpcPrefix}`;\n\n const distDir = path.join(cwd, \"dist\");\n const serveStatic = sirv(distDir, { dev: true });\n\n // No-watch mode (BOS_NO_WATCH=1): build once, serve the built output.\n // Regression/CI stacks need no hot reload — watchers are the stack's\n // heaviest processes and stall runs freeze under their accumulated\n // footprint. One-shot builds exit; steady state is small static servers.\n const noWatch = options.watch === false || process.env.BOS_NO_WATCH === \"1\";\n\n const runOnce = (cmd: string, args: string[]) =>\n new Promise<void>((resolve, reject) => {\n const child = spawn(cmd, args, { cwd, stdio: \"inherit\", env: process.env });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`❌ ${cmd} ${args.join(\" \")} exited with ${code}`));\n });\n });\n\n let watcher: ReturnType<typeof spawn> | null = null;\n if (noWatch) {\n const generatedConfig = ensureGeneratedRspackConfig(cwd);\n await runOnce(\"rspack\", generatedConfig ? [\"build\", \"--config\", generatedConfig] : [\"build\"]);\n } else if (options.watch !== false) {\n const generatedConfig = ensureGeneratedRspackConfig(cwd);\n watcher = spawn(\n \"rspack\",\n generatedConfig ? [\"build\", \"--watch\", \"--config\", generatedConfig] : [\"build\", \"--watch\"],\n {\n cwd,\n stdio: \"inherit\",\n env: process.env,\n },\n );\n watcher.on(\"error\", (error) => {\n console.error(`❌ Failed to spawn rspack build --watch: ${error.message}`);\n });\n }\n\n let uiWatcher: ReturnType<typeof spawn> | null = null;\n let uiStaticServer: http.Server | null = null;\n const uiPort = process.env.BOS_UI_PORT;\n const uiConfig = ensureGeneratedUiRsbuildConfig(cwd);\n if (uiConfig && noWatch && uiPort) {\n // Folder-form ui: one-shot build, then serve the ui source root's dist\n // (the factory's absolute distPath target) statically on the ui port.\n await runOnce(\"rsbuild\", [\"build\", \"--config\", uiConfig]);\n const uiDistDir =\n path.basename(cwd) === \"ui\" ? path.join(cwd, \"dist\") : path.join(cwd, \"ui\", \"dist\");\n if (!fs.existsSync(path.join(uiDistDir, DEV_ENTRY_FILENAME))) {\n console.error(\n `❌ UI dist is missing at ${uiDistDir} — the ui static server would serve 404s for every asset (build output layout mismatch?)`,\n );\n }\n const serveUiStatic = sirv(uiDistDir, { dev: true });\n uiStaticServer = http.createServer((req, res) => {\n applyCorsHeaders(res);\n serveUiStatic(req, res, () => {\n sendText(res, 404, \"Not Found\");\n });\n });\n await new Promise<void>((resolve, reject) => {\n uiStaticServer!.once(\"error\", reject);\n uiStaticServer!.listen(Number(uiPort), () => resolve());\n });\n console.log(`├─ 🎨 UI: http://localhost:${uiPort} (built, no watch)`);\n } else if (uiConfig) {\n uiWatcher = spawn(\"rsbuild\", [\"dev\", \"--config\", uiConfig], {\n cwd,\n stdio: \"inherit\",\n env: uiPort ? { ...process.env, PORT: uiPort } : process.env,\n });\n uiWatcher.on(\"error\", (error) => {\n console.error(`❌ Failed to spawn rsbuild ui dev: ${error.message}`);\n });\n console.log(`├─ 🎨 UI: ${uiPort ? `http://localhost:${uiPort}` : \"(rsbuild auto port)\"}`);\n }\n\n const handlers: { rpc: any; api: any } = { rpc: null, api: null };\n const effectContextHolder: { context: unknown } = { context: null };\n let runtime: { shutdown: () => Promise<void> } | null = null;\n\n const pathnameOf = (req: http.IncomingMessage): string =>\n ((req.url ?? \"/\").split(\"?\")[0] ?? \"/\").replace(/\\/+$/, \"\") || \"/\";\n\n const buildDevContext = (_req: http.IncomingMessage, webRequest: Request) => {\n const rawClone =\n webRequest.method === \"GET\" || webRequest.method === \"HEAD\" ? null : webRequest.clone();\n let cachedRawBody: string | null = null;\n return {\n reqHeaders: webRequest.headers,\n \"effect/context\": effectContextHolder.context,\n getRawBody: async (): Promise<string> => {\n if (cachedRawBody !== null) return cachedRawBody;\n if (!rawClone) {\n cachedRawBody = \"\";\n return cachedRawBody;\n }\n cachedRawBody = await rawClone.text();\n return cachedRawBody;\n },\n };\n };\n\n const toWebRequest = (req: http.IncomingMessage): Request => {\n const url = `http://localhost:${port}${req.url}`;\n return new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== \"GET\" && req.method !== \"HEAD\" ? req : undefined,\n duplex: req.method !== \"GET\" && req.method !== \"HEAD\" ? \"half\" : undefined,\n } as RequestInit);\n };\n\n const handleOrpc = async (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n handler: any,\n prefix: string,\n errorLabel: string,\n ) => {\n try {\n const webRequest = toWebRequest(req);\n const result = await handler.handle(webRequest, {\n prefix,\n context: buildDevContext(req, webRequest),\n });\n\n if (result.response) {\n res.statusCode = result.response.status;\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n if (!res.getHeader(\"content-length\")) {\n res.setHeader(\"content-length\", Buffer.byteLength(text).toString());\n }\n res.end(text);\n } else {\n sendText(res, 404, \"Not Found\");\n }\n } catch (error) {\n console.error(`${errorLabel} error:`, error);\n sendJson(res, 500, { error: (error as Error).message });\n }\n };\n\n const server = http.createServer((req, res) => {\n applyCorsHeaders(res);\n const pathname = pathnameOf(req);\n\n if (req.method === \"OPTIONS\") {\n res.statusCode = 200;\n res.end();\n return;\n }\n\n if (pathname === \"/\" && (req.method === \"GET\" || req.method === \"HEAD\")) {\n sendJson(res, 200, {\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: handlers.rpc ? \"ready\" : \"loading\",\n endpoints: {\n health: \"/\",\n docs: \"/api\",\n rpc: rpcBase,\n },\n });\n return;\n }\n\n if (pathname === \"/health\" && (req.method === \"GET\" || req.method === \"HEAD\")) {\n sendText(res, 200, \"OK\");\n return;\n }\n\n if (pathname.startsWith(`${rpcBase}/`)) {\n if (!handlers.rpc) {\n sendJson(res, 503, { error: \"Plugin still loading...\" });\n return;\n }\n handleOrpc(req, res, handlers.rpc, rpcBase, \"RPC\").catch(() => {});\n return;\n }\n\n if (pathname === \"/api\" || pathname.startsWith(\"/api/\")) {\n if (!handlers.api) {\n sendJson(res, 503, { error: \"Plugin still loading...\" });\n return;\n }\n handleOrpc(req, res, handlers.api, \"/api\", \"OpenAPI\").catch(() => {});\n return;\n }\n\n serveStatic(req, res, () => {\n sendText(res, 404, \"Not Found\");\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, () => resolve());\n });\n\n console.log(`🚀 ${pluginInfo.name} dev server listening on port ${port}`);\n console.log(`├─ 📡 RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`├─ 📖 Docs: http://localhost:${port}/api`);\n console.log(`└─ 💚 Health: http://localhost:${port}/`);\n\n const load = async () => {\n try {\n // Import framework internals directly. A package self-import can resolve\n // the published entry while this source-first dev server is running,\n // which leaves the runtime exports unavailable on Windows.\n const { createPluginRuntime } = await import(\"../runtime\");\n const { RPCHandler } = await import(\"@orpc/server/fetch\");\n const { OpenAPIHandler } = await import(\"@orpc/openapi/fetch\");\n const { OpenAPIGenerator } = await import(\"@orpc/openapi\");\n const { OpenAPIReferenceHandlerPlugin } = await import(\"@orpc/openapi/plugins\");\n const { ZodToJsonSchemaConverter } = await import(\"@orpc/zod\");\n const { onError } = await import(\"@orpc/server\");\n const { formatORPCError } = await import(\"../errors\");\n\n const runtimeConfig = readRuntimeConfigFromEnv();\n const { siblings, dependsOn } = collectSiblingRemotes(runtimeConfig, compositionKey);\n\n if (dependsOn.length > 0) {\n console.log(`🔗 Loading sibling plugin(s): ${dependsOn.join(\", \")}`);\n }\n\n const registry: Record<string, { remote: string }> = {\n [pluginId]: {\n remote: `http://localhost:${port}/${DEV_ENTRY_FILENAME}`,\n },\n ...siblings,\n };\n\n const mfRuntime = createPluginRuntime({ registry });\n runtime = mfRuntime;\n\n const pluginsMap: Record<string, unknown> = {};\n const siblingEffectContexts: unknown[] = [];\n for (const depId of Object.keys(siblings)) {\n const dep = await loadPluginWithRetry(mfRuntime, depId, siblings[depId]!.remote);\n pluginsMap[depId] = { client: dep.createClient, router: dep.router };\n if (dep.initialized?.effectContext) {\n siblingEffectContexts.push(dep.initialized.effectContext);\n }\n console.log(`✅ Loaded dependency plugin: ${depId}`);\n }\n\n const loaded: any = await loadPluginWithRetry(\n mfRuntime,\n pluginId,\n registry[pluginId]!.remote,\n (devConfig?.config ?? { variables: {}, secrets: {} }) as Record<string, unknown>,\n Object.keys(pluginsMap).length > 0 ? pluginsMap : undefined,\n );\n\n const { Context } = await import(\"effect\");\n effectContextHolder.context = [loaded.initialized?.effectContext, ...siblingEffectContexts]\n .filter(Boolean)\n .reduce((acc: any, ctx: any) => Context.merge(acc, ctx), Context.empty());\n\n handlers.rpc = new RPCHandler(loaded.router, {\n errorStatusMap: PLUGIN_ERROR_STATUS_MAP,\n interceptors: [\n onError((error: any) => {\n const formatted = formatORPCError(error);\n if (formatted) console.error(formatted);\n }),\n ],\n });\n\n const generator = new OpenAPIGenerator({ converters: [new ZodToJsonSchemaConverter()] });\n\n handlers.api = new OpenAPIHandler(loaded.router, {\n errorStatusMap: PLUGIN_ERROR_STATUS_MAP,\n plugins: [\n new OpenAPIReferenceHandlerPlugin({\n spec: () => generator.generate(loaded.router, { version: \"3.1.1\" }),\n }),\n ],\n interceptors: [\n onError((error: any) => {\n const formatted = formatORPCError(error);\n if (formatted) console.error(formatted);\n }),\n ],\n });\n\n console.log(`✅ Plugin ready: ${pluginId}`);\n } catch (error) {\n console.error(`❌ Failed to load plugin ${pluginId}:`, error);\n console.error(\" Server stays up; fix the build and retry via rebuild.\");\n }\n };\n\n void load();\n\n const close = async () => {\n handlers.rpc = null;\n handlers.api = null;\n effectContextHolder.context = null;\n for (const child of [watcher, uiWatcher]) {\n if (child) {\n await killChildEscalating(child);\n }\n }\n if (uiStaticServer) {\n await new Promise<void>((resolve) => uiStaticServer.close(() => resolve()));\n }\n if (runtime) await runtime.shutdown().catch(() => {});\n await new Promise<void>((resolve) => server.close(() => resolve()));\n };\n\n process.once(\"SIGINT\", async () => {\n const timeout = setTimeout(() => process.exit(0), 3000);\n await close();\n clearTimeout(timeout);\n process.exit(0);\n });\n process.once(\"SIGTERM\", async () => {\n const timeout = setTimeout(() => process.exit(0), 3000);\n await close();\n clearTimeout(timeout);\n process.exit(0);\n });\n\n watchParentDeath(async () => {\n const timeout = setTimeout(() => process.exit(0), 3000);\n await close();\n clearTimeout(timeout);\n process.exit(0);\n });\n\n return { port, close };\n}\n\nconst invokedAsCli = import.meta.main || (process.argv[1] ?? \"\").includes(\"every-plugin-serve\");\n\nif (invokedAsCli) {\n startPluginDevServer().catch((error) => {\n console.error(\"❌ Plugin dev server fatal error:\", error);\n process.exit(1);\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ //#region src/dev/watch-kill.ts
2
+ const waitForExit = (child, timeoutMs) => new Promise((resolve) => {
3
+ if (child.exitCode !== null) {
4
+ resolve(true);
5
+ return;
6
+ }
7
+ const onExit = () => {
8
+ clearTimeout(timer);
9
+ resolve(true);
10
+ };
11
+ const timer = setTimeout(() => {
12
+ child.removeListener("exit", onExit);
13
+ resolve(false);
14
+ }, timeoutMs);
15
+ child.addListener("exit", onExit);
16
+ });
17
+ const killChildEscalating = async (child, terminateMs = 2e3) => {
18
+ if (child.exitCode !== null || child.killed) return;
19
+ child.kill("SIGTERM");
20
+ if (!await waitForExit(child, terminateMs)) child.kill("SIGKILL");
21
+ };
22
+ const watchParentDeath = (onParentDeath, opts) => {
23
+ const getPpid = opts?.getPpid ?? (() => process.ppid);
24
+ const intervalMs = opts?.intervalMs ?? 200;
25
+ const initialPpid = getPpid();
26
+ const timer = setInterval(() => {
27
+ if (getPpid() !== initialPpid) {
28
+ clearInterval(timer);
29
+ onParentDeath();
30
+ }
31
+ }, intervalMs);
32
+ timer.unref?.();
33
+ return { stop: () => clearInterval(timer) };
34
+ };
35
+
36
+ //#endregion
37
+ exports.killChildEscalating = killChildEscalating;
38
+ exports.watchParentDeath = watchParentDeath;
39
+ //# sourceMappingURL=watch-kill.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-kill.cjs","names":[],"sources":["../../src/dev/watch-kill.ts"],"sourcesContent":["interface KillableChild {\n pid?: number | undefined;\n kill: (signal?: NodeJS.Signals) => void;\n exitCode: number | null;\n killed: boolean;\n addListener: (event: \"exit\", listener: () => void) => unknown;\n removeListener: (event: \"exit\", listener: () => void) => unknown;\n}\n\nconst waitForExit = (child: KillableChild, timeoutMs: number): Promise<boolean> =>\n new Promise((resolve) => {\n if (child.exitCode !== null) {\n resolve(true);\n return;\n }\n const onExit = () => {\n clearTimeout(timer);\n resolve(true);\n };\n const timer = setTimeout(() => {\n child.removeListener(\"exit\", onExit);\n resolve(false);\n }, timeoutMs);\n child.addListener(\"exit\", onExit);\n });\n\nexport const killChildEscalating = async (\n child: KillableChild,\n terminateMs = 2000,\n): Promise<void> => {\n if (child.exitCode !== null || child.killed) return;\n child.kill(\"SIGTERM\");\n const exited = await waitForExit(child, terminateMs);\n if (!exited) child.kill(\"SIGKILL\");\n};\n\nexport interface WatchParentDeathOptions {\n intervalMs?: number;\n getPpid?: () => number;\n onParentDeath?: () => void | Promise<void>;\n}\n\nexport const watchParentDeath = (\n onParentDeath: () => void | Promise<void>,\n opts?: Omit<WatchParentDeathOptions, \"onParentDeath\">,\n): { stop: () => void } => {\n const getPpid = opts?.getPpid ?? (() => process.ppid);\n const intervalMs = opts?.intervalMs ?? 200;\n const initialPpid = getPpid();\n const timer = setInterval(() => {\n if (getPpid() !== initialPpid) {\n clearInterval(timer);\n void onParentDeath();\n }\n }, intervalMs);\n timer.unref?.();\n return { stop: () => clearInterval(timer) };\n};\n"],"mappings":";AASA,MAAM,eAAe,OAAsB,cACzC,IAAI,SAAS,YAAY;CACvB,IAAI,MAAM,aAAa,MAAM;EAC3B,QAAQ,IAAI;EACZ;CACF;CACA,MAAM,eAAe;EACnB,aAAa,KAAK;EAClB,QAAQ,IAAI;CACd;CACA,MAAM,QAAQ,iBAAiB;EAC7B,MAAM,eAAe,QAAQ,MAAM;EACnC,QAAQ,KAAK;CACf,GAAG,SAAS;CACZ,MAAM,YAAY,QAAQ,MAAM;AAClC,CAAC;AAEH,MAAa,sBAAsB,OACjC,OACA,cAAc,QACI;CAClB,IAAI,MAAM,aAAa,QAAQ,MAAM,QAAQ;CAC7C,MAAM,KAAK,SAAS;CAEpB,IAAI,CAAC,MADgB,YAAY,OAAO,WAAW,GACtC,MAAM,KAAK,SAAS;AACnC;AAQA,MAAa,oBACX,eACA,SACyB;CACzB,MAAM,UAAU,MAAM,kBAAkB,QAAQ;CAChD,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,cAAc,QAAQ;CAC5B,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,QAAQ,MAAM,aAAa;GAC7B,cAAc,KAAK;GACnB,AAAK,cAAc;EACrB;CACF,GAAG,UAAU;CACb,MAAM,QAAQ;CACd,OAAO,EAAE,YAAY,cAAc,KAAK,EAAE;AAC5C"}
@@ -0,0 +1,38 @@
1
+ //#region src/dev/watch-kill.ts
2
+ const waitForExit = (child, timeoutMs) => new Promise((resolve) => {
3
+ if (child.exitCode !== null) {
4
+ resolve(true);
5
+ return;
6
+ }
7
+ const onExit = () => {
8
+ clearTimeout(timer);
9
+ resolve(true);
10
+ };
11
+ const timer = setTimeout(() => {
12
+ child.removeListener("exit", onExit);
13
+ resolve(false);
14
+ }, timeoutMs);
15
+ child.addListener("exit", onExit);
16
+ });
17
+ const killChildEscalating = async (child, terminateMs = 2e3) => {
18
+ if (child.exitCode !== null || child.killed) return;
19
+ child.kill("SIGTERM");
20
+ if (!await waitForExit(child, terminateMs)) child.kill("SIGKILL");
21
+ };
22
+ const watchParentDeath = (onParentDeath, opts) => {
23
+ const getPpid = opts?.getPpid ?? (() => process.ppid);
24
+ const intervalMs = opts?.intervalMs ?? 200;
25
+ const initialPpid = getPpid();
26
+ const timer = setInterval(() => {
27
+ if (getPpid() !== initialPpid) {
28
+ clearInterval(timer);
29
+ onParentDeath();
30
+ }
31
+ }, intervalMs);
32
+ timer.unref?.();
33
+ return { stop: () => clearInterval(timer) };
34
+ };
35
+
36
+ //#endregion
37
+ export { killChildEscalating, watchParentDeath };
38
+ //# sourceMappingURL=watch-kill.mjs.map