every-plugin 2.10.1 → 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 -248
  399. package/dist/build/rspack/dev-server-middleware.cjs.map +0 -1
  400. package/dist/build/rspack/dev-server-middleware.mjs +0 -247
  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 -324
  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
@@ -1,83 +1,10 @@
1
- import { peerDependencies } from "../package.mjs";
2
- import { createRequire } from "node:module";
3
- import { existsSync, readFileSync } from "node:fs";
4
- import { dirname, join } from "node:path";
1
+ import { buildMfCoreSharedDependencies } from "../shared-deps-spec.mjs";
2
+ import { readFileSync } from "node:fs";
5
3
 
6
4
  //#region src/runtime/mf-config.ts
7
- const require = createRequire(import.meta.url);
8
- function getInstalledPackageVersion(packageName, fallbackRange) {
9
- try {
10
- let currentDir = dirname(require.resolve(packageName));
11
- for (let i = 0; i < 5; i += 1) {
12
- const packageJsonPath = join(currentDir, "package.json");
13
- if (existsSync(packageJsonPath)) return JSON.parse(readFileSync(packageJsonPath, "utf-8")).version;
14
- currentDir = dirname(currentDir);
15
- }
16
- throw new Error(`Could not resolve installed version for ${packageName}`);
17
- } catch {
18
- const match = fallbackRange.match(/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/);
19
- return match ? match[0] : fallbackRange.replace(/^[\^~>=<\s]+/, "");
20
- }
21
- }
22
- const PLUGIN_VERSION = "2.10.1";
23
- const SHARE_CONFIG = {
24
- singleton: true,
25
- requiredVersion: false,
26
- strictVersion: false,
27
- eager: false
28
- };
29
- const MF_CORE_SHARED_DEPS = {
30
- "every-plugin": {
31
- version: PLUGIN_VERSION,
32
- shareScope: "default",
33
- shareConfig: SHARE_CONFIG
34
- },
35
- effect: {
36
- version: getInstalledPackageVersion("effect", peerDependencies.effect),
37
- shareScope: "default",
38
- shareConfig: SHARE_CONFIG
39
- },
40
- zod: {
41
- version: getInstalledPackageVersion("zod", peerDependencies.zod),
42
- shareScope: "default",
43
- shareConfig: SHARE_CONFIG
44
- },
45
- "@orpc/contract": {
46
- version: getInstalledPackageVersion("@orpc/contract", peerDependencies["@orpc/contract"]),
47
- shareScope: "default",
48
- shareConfig: SHARE_CONFIG
49
- },
50
- "@orpc/client": {
51
- version: getInstalledPackageVersion("@orpc/client", peerDependencies["@orpc/client"]),
52
- shareScope: "default",
53
- shareConfig: SHARE_CONFIG
54
- },
55
- "@orpc/server": {
56
- version: getInstalledPackageVersion("@orpc/server", peerDependencies["@orpc/server"]),
57
- shareScope: "default",
58
- shareConfig: SHARE_CONFIG
59
- }
60
- };
61
- function buildMergedSharedDeps(appShared) {
62
- const merged = {};
63
- for (const [name, config] of Object.entries(MF_CORE_SHARED_DEPS)) merged[name] = {
64
- version: config.version,
65
- shareScope: config.shareScope,
66
- shareConfig: config.shareConfig
67
- };
68
- if (appShared) for (const [name, config] of Object.entries(appShared)) merged[name] = {
69
- version: config.version,
70
- shareScope: config.shareScope ?? "default",
71
- shareConfig: {
72
- singleton: config.singleton ?? false,
73
- requiredVersion: config.requiredVersion ?? false,
74
- strictVersion: config.strictVersion ?? false,
75
- eager: config.eager ?? false
76
- }
77
- };
78
- return merged;
79
- }
5
+ const PLUGIN_VERSION = "3.0.0-rc.0";
6
+ const MF_CORE_SHARED_DEPS = buildMfCoreSharedDependencies({ ownVersion: PLUGIN_VERSION });
80
7
 
81
8
  //#endregion
82
- export { MF_CORE_SHARED_DEPS, PLUGIN_VERSION, SHARE_CONFIG, buildMergedSharedDeps };
9
+ export { MF_CORE_SHARED_DEPS, PLUGIN_VERSION };
83
10
  //# sourceMappingURL=mf-config.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mf-config.mjs","names":[],"sources":["../../src/runtime/mf-config.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport pkg from \"../../package.json\";\n\nconst require = createRequire(import.meta.url);\ndeclare const __EVERY_PLUGIN_VERSION__: string | undefined;\n\nfunction readPackageVersion(): string {\n try {\n return (require(\"../../package.json\") as { version: string }).version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction getInstalledPackageVersion(packageName: string, fallbackRange: string): string {\n try {\n let currentDir = dirname(require.resolve(packageName));\n for (let i = 0; i < 5; i += 1) {\n const packageJsonPath = join(currentDir, \"package.json\");\n if (existsSync(packageJsonPath)) {\n return (JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { version: string }).version;\n }\n currentDir = dirname(currentDir);\n }\n\n throw new Error(`Could not resolve installed version for ${packageName}`);\n } catch {\n const match = fallbackRange.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : fallbackRange.replace(/^[\\^~>=<\\s]+/, \"\");\n }\n}\n\nexport const PLUGIN_VERSION =\n typeof __EVERY_PLUGIN_VERSION__ === \"string\" ? __EVERY_PLUGIN_VERSION__ : readPackageVersion();\n\nexport interface SharedConfig {\n singleton: boolean;\n requiredVersion: string | false;\n strictVersion: boolean;\n eager: boolean;\n}\n\nexport const SHARE_CONFIG: SharedConfig = {\n singleton: true,\n requiredVersion: false,\n strictVersion: false,\n eager: false,\n};\n\nexport const MF_CORE_SHARED_DEPS = {\n \"every-plugin\": {\n version: PLUGIN_VERSION,\n shareScope: \"default\",\n shareConfig: SHARE_CONFIG,\n },\n effect: {\n version: getInstalledPackageVersion(\"effect\", pkg.peerDependencies.effect),\n shareScope: \"default\",\n shareConfig: SHARE_CONFIG,\n },\n zod: {\n version: getInstalledPackageVersion(\"zod\", pkg.peerDependencies.zod),\n shareScope: \"default\",\n shareConfig: SHARE_CONFIG,\n },\n \"@orpc/contract\": {\n version: getInstalledPackageVersion(\"@orpc/contract\", pkg.peerDependencies[\"@orpc/contract\"]),\n shareScope: \"default\",\n shareConfig: SHARE_CONFIG,\n },\n \"@orpc/client\": {\n version: getInstalledPackageVersion(\"@orpc/client\", pkg.peerDependencies[\"@orpc/client\"]),\n shareScope: \"default\",\n shareConfig: SHARE_CONFIG,\n },\n \"@orpc/server\": {\n version: getInstalledPackageVersion(\"@orpc/server\", pkg.peerDependencies[\"@orpc/server\"]),\n shareScope: \"default\",\n shareConfig: SHARE_CONFIG,\n },\n} as const;\n\nexport type CoreSharedDepName = keyof typeof MF_CORE_SHARED_DEPS;\n\nexport interface AppSharedDepConfig {\n version: string;\n requiredVersion?: string | false;\n singleton?: boolean;\n strictVersion?: boolean;\n eager?: boolean;\n shareScope?: string;\n}\n\nexport type AppSharedDeps = Record<string, AppSharedDepConfig>;\n\nexport function buildMergedSharedDeps(\n appShared?: AppSharedDeps,\n): Record<string, { version: string; shareScope: string; shareConfig: SharedConfig }> {\n const merged: Record<string, { version: string; shareScope: string; shareConfig: SharedConfig }> =\n {};\n\n for (const [name, config] of Object.entries(MF_CORE_SHARED_DEPS)) {\n merged[name] = {\n version: config.version,\n shareScope: config.shareScope,\n shareConfig: config.shareConfig,\n };\n }\n\n if (appShared) {\n for (const [name, config] of Object.entries(appShared)) {\n merged[name] = {\n version: config.version,\n shareScope: config.shareScope ?? \"default\",\n shareConfig: {\n singleton: config.singleton ?? false,\n requiredVersion: config.requiredVersion ?? false,\n strictVersion: config.strictVersion ?? false,\n eager: config.eager ?? false,\n },\n };\n }\n }\n\n return merged;\n}\n"],"mappings":";;;;;;AAKA,MAAM,UAAU,cAAc,OAAO,KAAK,GAAG;AAW7C,SAAS,2BAA2B,aAAqB,eAA+B;CACtF,IAAI;EACF,IAAI,aAAa,QAAQ,QAAQ,QAAQ,WAAW,CAAC;EACrD,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;GAC7B,MAAM,kBAAkB,KAAK,YAAY,cAAc;GACvD,IAAI,WAAW,eAAe,GAC5B,OAAQ,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC,CAAC,CAAyB;GAErF,aAAa,QAAQ,UAAU;EACjC;EAEA,MAAM,IAAI,MAAM,2CAA2C,aAAa;CAC1E,QAAQ;EACN,MAAM,QAAQ,cAAc,MAAM,mCAAmC;EACrE,OAAO,QAAQ,MAAM,KAAK,cAAc,QAAQ,gBAAgB,EAAE;CACpE;AACF;AAEA,MAAa;AAUb,MAAa,eAA6B;CACxC,WAAW;CACX,iBAAiB;CACjB,eAAe;CACf,OAAO;AACT;AAEA,MAAa,sBAAsB;CACjC,gBAAgB;EACd,SAAS;EACT,YAAY;EACZ,aAAa;CACf;CACA,QAAQ;EACN,SAAS,2BAA2B,2BAA+B,MAAM;EACzE,YAAY;EACZ,aAAa;CACf;CACA,KAAK;EACH,SAAS,2BAA2B,wBAA4B,GAAG;EACnE,YAAY;EACZ,aAAa;CACf;CACA,kBAAkB;EAChB,SAAS,2BAA2B,mCAAuC,iBAAiB;EAC5F,YAAY;EACZ,aAAa;CACf;CACA,gBAAgB;EACd,SAAS,2BAA2B,iCAAqC,eAAe;EACxF,YAAY;EACZ,aAAa;CACf;CACA,gBAAgB;EACd,SAAS,2BAA2B,iCAAqC,eAAe;EACxF,YAAY;EACZ,aAAa;CACf;AACF;AAeA,SAAgB,sBACd,WACoF;CACpF,MAAM,SACJ,CAAC;CAEH,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,mBAAmB,GAC7D,OAAO,QAAQ;EACb,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,aAAa,OAAO;CACtB;CAGF,IAAI,WACF,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,SAAS,GACnD,OAAO,QAAQ;EACb,SAAS,OAAO;EAChB,YAAY,OAAO,cAAc;EACjC,aAAa;GACX,WAAW,OAAO,aAAa;GAC/B,iBAAiB,OAAO,mBAAmB;GAC3C,eAAe,OAAO,iBAAiB;GACvC,OAAO,OAAO,SAAS;EACzB;CACF;CAIJ,OAAO;AACT"}
1
+ {"version":3,"file":"mf-config.mjs","names":[],"sources":["../../src/runtime/mf-config.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { buildMfCoreSharedDependencies, type CoreSharedDepName } from \"../shared-deps-spec\";\n\ndeclare const __EVERY_PLUGIN_VERSION__: string | undefined;\n\nfunction readPackageVersion(): string {\n try {\n // Not createRequire(import.meta.url): under tsx the require's resolution\n // base can come up empty in spawned child processes (\"Cannot find module\n // from ''\"), reading 0.0.0 and tripping the shared-identity check.\n return (\n JSON.parse(readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\")) as {\n version: string;\n }\n ).version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const PLUGIN_VERSION =\n typeof __EVERY_PLUGIN_VERSION__ === \"string\" ? __EVERY_PLUGIN_VERSION__ : readPackageVersion();\n\nexport interface SharedConfig {\n singleton: boolean;\n requiredVersion: string | false;\n strictVersion: boolean;\n eager: boolean;\n}\n\nexport const MF_CORE_SHARED_DEPS = buildMfCoreSharedDependencies({ ownVersion: PLUGIN_VERSION });\n\nexport type { CoreSharedDepName };\n"],"mappings":";;;;AAoBA,MAAa;AAUb,MAAa,sBAAsB,8BAA8B,EAAE,YAAY,eAAe,CAAC"}
@@ -1,13 +1,19 @@
1
1
  const require_errors = require('../errors.cjs');
2
+ const require_build_artifact_names = require('../../build/artifact-names.cjs');
2
3
  const require_runtime_mf_config = require('../mf-config.cjs');
3
- const require_runtime_services_normalize = require('./normalize.cjs');
4
+ const require_identity = require('../../identity.cjs');
5
+ const require_shared_identity = require('./shared-identity.cjs');
4
6
  let effect = require("effect");
5
7
  let _module_federation_enhanced_runtime = require("@module-federation/enhanced/runtime");
6
8
  let _module_federation_runtime_core = require("@module-federation/runtime-core");
7
9
 
8
10
  //#region src/runtime/services/module-federation.service.ts
11
+ function expectedSharedIdentity() {
12
+ return new Map(Object.entries(require_runtime_mf_config.MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]));
13
+ }
14
+ const loadEveryPluginSharedModule = () => Promise.resolve().then(() => require("../../index.cjs"));
9
15
  const coreModuleLoaders = {
10
- "every-plugin": () => Promise.resolve().then(() => require("../../index.cjs")),
16
+ "every-plugin": loadEveryPluginSharedModule,
11
17
  effect: () => import("effect"),
12
18
  zod: () => import("zod"),
13
19
  "@orpc/contract": () => import("@orpc/contract"),
@@ -40,16 +46,54 @@ const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync((
40
46
  } else instance.registerShared(shared);
41
47
  return instance;
42
48
  } catch (error) {
43
- throw new Error(`Failed to initialize Module Federation: ${error}`);
49
+ throw new Error(`Failed to initialize Module Federation: ${String(error)}`);
44
50
  }
45
51
  }));
46
- var ModuleFederationService = class extends effect.Effect.Service()("ModuleFederationService", { effect: effect.Effect.gen(function* () {
52
+ const remoteSelfNames = /* @__PURE__ */ new Map();
53
+ const resolveRemoteSelfName = (pluginId, url) => effect.Effect.gen(function* () {
54
+ const memoKey = `${pluginId}@${url}`;
55
+ const memo = remoteSelfNames.get(memoKey);
56
+ if (memo) return memo;
57
+ let selfName = null;
58
+ try {
59
+ selfName = (yield* effect.Effect.promise(() => require_shared_identity.fetchRemoteIdentityManifest(url)))?.metaData?.name?.trim() || null;
60
+ } catch {
61
+ selfName = null;
62
+ }
63
+ const resolved = selfName ?? require_identity.remoteName(pluginId);
64
+ remoteSelfNames.set(memoKey, resolved);
65
+ return resolved;
66
+ });
67
+ var ModuleFederationService = class extends effect.Context.Service()("ModuleFederationService") {};
68
+ const ModuleFederationServiceDefault = effect.Layer.effect(ModuleFederationService, effect.Effect.gen(function* () {
47
69
  const mf = yield* effect.Effect.flatten(createModuleFederationInstance);
70
+ const expectedIdentity = expectedSharedIdentity();
71
+ const buildSharedIdentityError = async (pluginId, url) => {
72
+ let manifest = null;
73
+ try {
74
+ manifest = await require_shared_identity.fetchRemoteIdentityManifest(url);
75
+ } catch (error) {
76
+ console.warn(`[SharedIdentity] Could not fetch mf-manifest.json for plugin "${pluginId}" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`);
77
+ return null;
78
+ }
79
+ if (!manifest) return null;
80
+ const mismatches = require_shared_identity.compareSharedIdentity(manifest.shared, expectedIdentity);
81
+ if (mismatches.length === 0) return null;
82
+ if (process.env.BOS_MF_IDENTITY === "warn") {
83
+ console.warn(`${require_shared_identity.describeSharedIdentityMismatch(pluginId, mismatches, "this runtime")} (BOS_MF_IDENTITY=warn: loading anyway)`);
84
+ return null;
85
+ }
86
+ return new require_errors.ModuleFederationError({
87
+ pluginId,
88
+ remoteUrl: url,
89
+ cause: new Error(require_shared_identity.describeSharedIdentityMismatch(pluginId, mismatches, "this runtime"))
90
+ });
91
+ };
48
92
  return {
49
93
  registerRemote: (pluginId, url) => effect.Effect.gen(function* () {
50
- yield* effect.Effect.logDebug(`[MF] Registering ${pluginId}`);
51
- const remoteName = require_runtime_services_normalize.getNormalizedRemoteName(pluginId);
52
- const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith("/remoteEntry.js") ? "script" : void 0;
94
+ const remoteName = yield* resolveRemoteSelfName(pluginId, url);
95
+ yield* effect.Effect.logDebug(`[MF][${pluginId}] Registering as "${remoteName}"`);
96
+ const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith(`/${"remoteEntry.js"}`) ? "script" : void 0;
53
97
  yield* effect.Effect.try({
54
98
  try: () => mf.registerRemotes([{
55
99
  name: remoteName,
@@ -62,11 +106,16 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
62
106
  cause: error instanceof Error ? error : new Error(String(error))
63
107
  })
64
108
  });
65
- yield* effect.Effect.logInfo(`[MF] ✅ Registered ${pluginId}`);
109
+ yield* effect.Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);
66
110
  }),
67
111
  loadRemoteConstructor: (pluginId, url) => effect.Effect.gen(function* () {
68
- const remoteName = require_runtime_services_normalize.getNormalizedRemoteName(pluginId);
69
- yield* effect.Effect.logDebug(`[MF] Loading remote ${remoteName}`);
112
+ const remoteName = yield* resolveRemoteSelfName(pluginId, url);
113
+ yield* effect.Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);
114
+ const identityError = yield* effect.Effect.promise(() => buildSharedIdentityError(pluginId, url));
115
+ if (identityError) {
116
+ yield* effect.Effect.logError(`[MF][${pluginId}] ❌ shared identity mismatch: ${identityError.cause instanceof Error ? identityError.cause.message : String(identityError.cause ?? "shared identity mismatch")}`);
117
+ return yield* identityError;
118
+ }
70
119
  const modulePath = `${remoteName}/plugin`;
71
120
  const pluginConstructor = yield* effect.Effect.tryPromise({
72
121
  try: async () => {
@@ -95,12 +144,14 @@ var ModuleFederationService = class extends effect.Effect.Service()("ModuleFeder
95
144
  cause: error instanceof Error ? error : new Error(String(error))
96
145
  })
97
146
  });
98
- yield* effect.Effect.logInfo(`[MF] ✅ Loaded constructor for ${pluginId}`);
147
+ yield* effect.Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);
99
148
  return pluginConstructor;
100
149
  })
101
150
  };
102
- }) }) {};
151
+ }));
103
152
 
104
153
  //#endregion
105
154
  exports.ModuleFederationService = ModuleFederationService;
155
+ exports.ModuleFederationServiceDefault = ModuleFederationServiceDefault;
156
+ exports.loadEveryPluginSharedModule = loadEveryPluginSharedModule;
106
157
  //# sourceMappingURL=module-federation.service.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-federation.service.cjs","names":["MF_CORE_SHARED_DEPS","Effect","getNormalizedRemoteName","ModuleFederationError"],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Effect } from \"effect\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n \"every-plugin\": () => import(\"every-plugin\"),\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${error}`);\n }\n }),\n);\n\nexport class ModuleFederationService extends Effect.Service<ModuleFederationService>()(\n \"ModuleFederationService\",\n {\n effect: Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n yield* Effect.logDebug(`[MF] Registering ${pluginId}`);\n\n const remoteName = getNormalizedRemoteName(pluginId);\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(\"/remoteEntry.js\")\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Registered ${pluginId}`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = getNormalizedRemoteName(pluginId);\n yield* Effect.logDebug(`[MF] Loading remote ${remoteName}`);\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Loaded constructor for ${pluginId}`);\n return pluginConstructor;\n }),\n };\n }),\n },\n) {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"module-federation.service.cjs","names":["MF_CORE_SHARED_DEPS","Effect","getInstance","createInstance","fetchRemoteIdentityManifest","getNormalizedRemoteName","Context","Layer","compareSharedIdentity","describeSharedIdentityMismatch","ModuleFederationError"],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DEV_ENTRY_FILENAME } from \"../../build/artifact-names\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\nimport {\n compareSharedIdentity,\n describeSharedIdentityMismatch,\n fetchRemoteIdentityManifest,\n} from \"./shared-identity\";\n\nfunction expectedSharedIdentity(): Map<string, string> {\n return new Map(\n Object.entries(MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]),\n );\n}\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nexport const loadEveryPluginSharedModule = () => import(\"../../index\");\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n // Keep the host-provided framework share on the same source graph as the\n // runtime. A package self-import can resolve the published entry when a\n // workspace script is launched through its package manager shim.\n \"every-plugin\": loadEveryPluginSharedModule,\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${String(error)}`);\n }\n }),\n);\n\n// A built container's runtime code looks up its own chunks through the node\n// runtime's entry-URL fallback keyed by the container's SELF name\n// (`mf-manifest.json` metaData.name — the composition key, e.g.\n// \"everything-dev_registry-plugin\"), while the host registers the remote\n// under the plugin id (\"registry\"). When those differ, the fallback misses,\n// resolveUrl returns null, and the node runtime hands back an empty chunk as\n// if it had loaded — the exposed module then requires ids nothing registered\n// (\"__webpack_modules__[r] is not a function\"). Registering and loading the\n// remote under the container's own name keeps that lookup a hit.\nconst remoteSelfNames = new Map<string, string>();\n\nconst resolveRemoteSelfName = (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const memoKey = `${pluginId}@${url}`;\n const memo = remoteSelfNames.get(memoKey);\n if (memo) return memo;\n\n let selfName: string | null = null;\n try {\n const manifest = yield* Effect.promise(() => fetchRemoteIdentityManifest(url));\n selfName = manifest?.metaData?.name?.trim() || null;\n } catch {\n selfName = null;\n }\n\n const resolved = selfName ?? getNormalizedRemoteName(pluginId);\n remoteSelfNames.set(memoKey, resolved);\n return resolved;\n });\n\nexport interface ModuleFederationServiceShape {\n registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError>;\n loadRemoteConstructor: (\n pluginId: string,\n url: string,\n ) => Effect.Effect<new () => AnyPlugin, ModuleFederationError>;\n}\n\nexport class ModuleFederationService extends Context.Service<\n ModuleFederationService,\n ModuleFederationServiceShape\n>()(\"ModuleFederationService\") {}\n\nexport const ModuleFederationServiceDefault = Layer.effect(\n ModuleFederationService,\n Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n const expectedIdentity = expectedSharedIdentity();\n\n const buildSharedIdentityError = async (\n pluginId: string,\n url: string,\n ): Promise<ModuleFederationError | null> => {\n let manifest: Awaited<ReturnType<typeof fetchRemoteIdentityManifest>> | null = null;\n try {\n manifest = await fetchRemoteIdentityManifest(url);\n } catch (error) {\n console.warn(\n `[SharedIdentity] Could not fetch mf-manifest.json for plugin \"${pluginId}\" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`,\n );\n return null;\n }\n if (!manifest) return null;\n const mismatches = compareSharedIdentity(manifest.shared, expectedIdentity);\n if (mismatches.length === 0) return null;\n const warnOnly = process.env.BOS_MF_IDENTITY === \"warn\";\n if (warnOnly) {\n console.warn(\n `${describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")} (BOS_MF_IDENTITY=warn: loading anyway)`,\n );\n return null;\n }\n return new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")),\n });\n };\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Registering as \"${remoteName}\"`);\n\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(`/${DEV_ENTRY_FILENAME}`)\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);\n\n const identityError = yield* Effect.promise(() =>\n buildSharedIdentityError(pluginId, url),\n );\n if (identityError) {\n yield* Effect.logError(\n `[MF][${pluginId}] ❌ shared identity mismatch: ${\n identityError.cause instanceof Error\n ? identityError.cause.message\n : String(identityError.cause ?? \"shared identity mismatch\")\n }`,\n );\n return yield* identityError;\n }\n\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);\n return pluginConstructor;\n }),\n };\n }),\n);\n"],"mappings":"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"}
@@ -1,13 +1,4 @@
1
- import { ModuleFederationError } from "../errors.cjs";
2
- import { Effect } from "effect";
3
- //#region src/runtime/services/module-federation.service.d.ts
4
- declare const ModuleFederationService_base: Effect.Service.Class<ModuleFederationService, "ModuleFederationService", {
5
- readonly effect: Effect.Effect<{
6
- registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError, never>;
7
- loadRemoteConstructor: (pluginId: string, url: string) => Effect.Effect<any, ModuleFederationError, never>;
8
- }, never, never>;
9
- }>;
10
- declare class ModuleFederationService extends ModuleFederationService_base {}
11
- //#endregion
12
- export { ModuleFederationService };
13
- //# sourceMappingURL=module-federation.service.d.cts.map
1
+ import "../errors.cjs";
2
+ import "../../types.cjs";
3
+ import "../../index.cjs";
4
+ import { Context, Effect, Layer } from "effect";
@@ -1,13 +1,4 @@
1
- import { ModuleFederationError } from "../errors.mjs";
2
- import { Effect } from "effect";
3
- //#region src/runtime/services/module-federation.service.d.ts
4
- declare const ModuleFederationService_base: Effect.Service.Class<ModuleFederationService, "ModuleFederationService", {
5
- readonly effect: Effect.Effect<{
6
- registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError, never>;
7
- loadRemoteConstructor: (pluginId: string, url: string) => Effect.Effect<any, ModuleFederationError, never>;
8
- }, never, never>;
9
- }>;
10
- declare class ModuleFederationService extends ModuleFederationService_base {}
11
- //#endregion
12
- export { ModuleFederationService };
13
- //# sourceMappingURL=module-federation.service.d.mts.map
1
+ import "../errors.mjs";
2
+ import "../../types.mjs";
3
+ import "../../index.mjs";
4
+ import { Context, Effect, Layer } from "effect";
@@ -1,13 +1,19 @@
1
1
  import { ModuleFederationError } from "../errors.mjs";
2
+ import { DEV_ENTRY_FILENAME } from "../../build/artifact-names.mjs";
2
3
  import { MF_CORE_SHARED_DEPS } from "../mf-config.mjs";
3
- import { getNormalizedRemoteName } from "./normalize.mjs";
4
- import { Effect } from "effect";
4
+ import { remoteName } from "../../identity.mjs";
5
+ import { compareSharedIdentity, describeSharedIdentityMismatch, fetchRemoteIdentityManifest } from "./shared-identity.mjs";
6
+ import { Context, Effect, Layer } from "effect";
5
7
  import { createInstance, getInstance } from "@module-federation/enhanced/runtime";
6
8
  import { setGlobalFederationInstance } from "@module-federation/runtime-core";
7
9
 
8
10
  //#region src/runtime/services/module-federation.service.ts
11
+ function expectedSharedIdentity() {
12
+ return new Map(Object.entries(MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]));
13
+ }
14
+ const loadEveryPluginSharedModule = () => import("../../index.mjs");
9
15
  const coreModuleLoaders = {
10
- "every-plugin": () => import("../../index.mjs"),
16
+ "every-plugin": loadEveryPluginSharedModule,
11
17
  effect: () => import("effect"),
12
18
  zod: () => import("zod"),
13
19
  "@orpc/contract": () => import("@orpc/contract"),
@@ -40,16 +46,54 @@ const createModuleFederationInstance = Effect.cached(Effect.sync(() => {
40
46
  } else instance.registerShared(shared);
41
47
  return instance;
42
48
  } catch (error) {
43
- throw new Error(`Failed to initialize Module Federation: ${error}`);
49
+ throw new Error(`Failed to initialize Module Federation: ${String(error)}`);
44
50
  }
45
51
  }));
46
- var ModuleFederationService = class extends Effect.Service()("ModuleFederationService", { effect: Effect.gen(function* () {
52
+ const remoteSelfNames = /* @__PURE__ */ new Map();
53
+ const resolveRemoteSelfName = (pluginId, url) => Effect.gen(function* () {
54
+ const memoKey = `${pluginId}@${url}`;
55
+ const memo = remoteSelfNames.get(memoKey);
56
+ if (memo) return memo;
57
+ let selfName = null;
58
+ try {
59
+ selfName = (yield* Effect.promise(() => fetchRemoteIdentityManifest(url)))?.metaData?.name?.trim() || null;
60
+ } catch {
61
+ selfName = null;
62
+ }
63
+ const resolved = selfName ?? remoteName(pluginId);
64
+ remoteSelfNames.set(memoKey, resolved);
65
+ return resolved;
66
+ });
67
+ var ModuleFederationService = class extends Context.Service()("ModuleFederationService") {};
68
+ const ModuleFederationServiceDefault = Layer.effect(ModuleFederationService, Effect.gen(function* () {
47
69
  const mf = yield* Effect.flatten(createModuleFederationInstance);
70
+ const expectedIdentity = expectedSharedIdentity();
71
+ const buildSharedIdentityError = async (pluginId, url) => {
72
+ let manifest = null;
73
+ try {
74
+ manifest = await fetchRemoteIdentityManifest(url);
75
+ } catch (error) {
76
+ console.warn(`[SharedIdentity] Could not fetch mf-manifest.json for plugin "${pluginId}" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`);
77
+ return null;
78
+ }
79
+ if (!manifest) return null;
80
+ const mismatches = compareSharedIdentity(manifest.shared, expectedIdentity);
81
+ if (mismatches.length === 0) return null;
82
+ if (process.env.BOS_MF_IDENTITY === "warn") {
83
+ console.warn(`${describeSharedIdentityMismatch(pluginId, mismatches, "this runtime")} (BOS_MF_IDENTITY=warn: loading anyway)`);
84
+ return null;
85
+ }
86
+ return new ModuleFederationError({
87
+ pluginId,
88
+ remoteUrl: url,
89
+ cause: new Error(describeSharedIdentityMismatch(pluginId, mismatches, "this runtime"))
90
+ });
91
+ };
48
92
  return {
49
93
  registerRemote: (pluginId, url) => Effect.gen(function* () {
50
- yield* Effect.logDebug(`[MF] Registering ${pluginId}`);
51
- const remoteName = getNormalizedRemoteName(pluginId);
52
- const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith("/remoteEntry.js") ? "script" : void 0;
94
+ const remoteName = yield* resolveRemoteSelfName(pluginId, url);
95
+ yield* Effect.logDebug(`[MF][${pluginId}] Registering as "${remoteName}"`);
96
+ const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith(`/${"remoteEntry.js"}`) ? "script" : void 0;
53
97
  yield* Effect.try({
54
98
  try: () => mf.registerRemotes([{
55
99
  name: remoteName,
@@ -62,11 +106,16 @@ var ModuleFederationService = class extends Effect.Service()("ModuleFederationSe
62
106
  cause: error instanceof Error ? error : new Error(String(error))
63
107
  })
64
108
  });
65
- yield* Effect.logInfo(`[MF] ✅ Registered ${pluginId}`);
109
+ yield* Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);
66
110
  }),
67
111
  loadRemoteConstructor: (pluginId, url) => Effect.gen(function* () {
68
- const remoteName = getNormalizedRemoteName(pluginId);
69
- yield* Effect.logDebug(`[MF] Loading remote ${remoteName}`);
112
+ const remoteName = yield* resolveRemoteSelfName(pluginId, url);
113
+ yield* Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);
114
+ const identityError = yield* Effect.promise(() => buildSharedIdentityError(pluginId, url));
115
+ if (identityError) {
116
+ yield* Effect.logError(`[MF][${pluginId}] ❌ shared identity mismatch: ${identityError.cause instanceof Error ? identityError.cause.message : String(identityError.cause ?? "shared identity mismatch")}`);
117
+ return yield* identityError;
118
+ }
70
119
  const modulePath = `${remoteName}/plugin`;
71
120
  const pluginConstructor = yield* Effect.tryPromise({
72
121
  try: async () => {
@@ -95,12 +144,12 @@ var ModuleFederationService = class extends Effect.Service()("ModuleFederationSe
95
144
  cause: error instanceof Error ? error : new Error(String(error))
96
145
  })
97
146
  });
98
- yield* Effect.logInfo(`[MF] ✅ Loaded constructor for ${pluginId}`);
147
+ yield* Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);
99
148
  return pluginConstructor;
100
149
  })
101
150
  };
102
- }) }) {};
151
+ }));
103
152
 
104
153
  //#endregion
105
- export { ModuleFederationService };
154
+ export { ModuleFederationService, ModuleFederationServiceDefault, loadEveryPluginSharedModule };
106
155
  //# sourceMappingURL=module-federation.service.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-federation.service.mjs","names":[],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Effect } from \"effect\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n \"every-plugin\": () => import(\"every-plugin\"),\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${error}`);\n }\n }),\n);\n\nexport class ModuleFederationService extends Effect.Service<ModuleFederationService>()(\n \"ModuleFederationService\",\n {\n effect: Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n yield* Effect.logDebug(`[MF] Registering ${pluginId}`);\n\n const remoteName = getNormalizedRemoteName(pluginId);\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(\"/remoteEntry.js\")\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Registered ${pluginId}`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = getNormalizedRemoteName(pluginId);\n yield* Effect.logDebug(`[MF] Loading remote ${remoteName}`);\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF] ✅ Loaded constructor for ${pluginId}`);\n return pluginConstructor;\n }),\n };\n }),\n },\n) {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"module-federation.service.mjs","names":["getNormalizedRemoteName"],"sources":["../../../src/runtime/services/module-federation.service.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { Context, Effect, Layer } from \"effect\";\nimport { DEV_ENTRY_FILENAME } from \"../../build/artifact-names\";\nimport type { AnyPlugin } from \"../../types\";\nimport { ModuleFederationError } from \"../errors\";\nimport { type CoreSharedDepName, MF_CORE_SHARED_DEPS } from \"../mf-config\";\nimport { getNormalizedRemoteName } from \"./normalize\";\nimport {\n compareSharedIdentity,\n describeSharedIdentityMismatch,\n fetchRemoteIdentityManifest,\n} from \"./shared-identity\";\n\nfunction expectedSharedIdentity(): Map<string, string> {\n return new Map(\n Object.entries(MF_CORE_SHARED_DEPS).map(([name, config]) => [name, config.version]),\n );\n}\n\ntype RemoteModule = (new () => AnyPlugin) | { default: new () => AnyPlugin };\n\nexport const loadEveryPluginSharedModule = () => import(\"../../index\");\n\nconst coreModuleLoaders: Record<CoreSharedDepName, () => Promise<unknown>> = {\n // Keep the host-provided framework share on the same source graph as the\n // runtime. A package self-import can resolve the published entry when a\n // workspace script is launched through its package manager shim.\n \"every-plugin\": loadEveryPluginSharedModule,\n effect: () => import(\"effect\"),\n zod: () => import(\"zod\"),\n \"@orpc/contract\": () => import(\"@orpc/contract\"),\n \"@orpc/client\": () => import(\"@orpc/client\"),\n \"@orpc/server\": () => import(\"@orpc/server\"),\n};\n\nfunction buildSharedConfig(): Record<\n string,\n {\n version: string;\n shareScope: string;\n get: () => Promise<() => unknown>;\n shareConfig: (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName][\"shareConfig\"];\n }\n> {\n return Object.fromEntries(\n (\n Object.entries(MF_CORE_SHARED_DEPS) as [\n CoreSharedDepName,\n (typeof MF_CORE_SHARED_DEPS)[CoreSharedDepName],\n ][]\n ).map(([name, config]) => {\n const load = coreModuleLoaders[name];\n\n if (!load) {\n throw new Error(`Missing core shared module loader for ${name}`);\n }\n\n return [\n name,\n {\n version: config.version,\n shareScope: config.shareScope,\n get: () => load().then((mod) => () => mod),\n shareConfig: config.shareConfig,\n },\n ];\n }),\n );\n}\n\nconst createModuleFederationInstance = Effect.cached(\n Effect.sync(() => {\n try {\n const shared = buildSharedConfig();\n let instance = getInstance();\n\n if (!instance) {\n instance = createInstance({\n name: \"host\",\n remotes: [],\n shared,\n });\n\n setGlobalFederationInstance(instance);\n } else {\n instance.registerShared(shared);\n }\n\n return instance;\n } catch (error) {\n throw new Error(`Failed to initialize Module Federation: ${String(error)}`);\n }\n }),\n);\n\n// A built container's runtime code looks up its own chunks through the node\n// runtime's entry-URL fallback keyed by the container's SELF name\n// (`mf-manifest.json` metaData.name — the composition key, e.g.\n// \"everything-dev_registry-plugin\"), while the host registers the remote\n// under the plugin id (\"registry\"). When those differ, the fallback misses,\n// resolveUrl returns null, and the node runtime hands back an empty chunk as\n// if it had loaded — the exposed module then requires ids nothing registered\n// (\"__webpack_modules__[r] is not a function\"). Registering and loading the\n// remote under the container's own name keeps that lookup a hit.\nconst remoteSelfNames = new Map<string, string>();\n\nconst resolveRemoteSelfName = (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const memoKey = `${pluginId}@${url}`;\n const memo = remoteSelfNames.get(memoKey);\n if (memo) return memo;\n\n let selfName: string | null = null;\n try {\n const manifest = yield* Effect.promise(() => fetchRemoteIdentityManifest(url));\n selfName = manifest?.metaData?.name?.trim() || null;\n } catch {\n selfName = null;\n }\n\n const resolved = selfName ?? getNormalizedRemoteName(pluginId);\n remoteSelfNames.set(memoKey, resolved);\n return resolved;\n });\n\nexport interface ModuleFederationServiceShape {\n registerRemote: (pluginId: string, url: string) => Effect.Effect<void, ModuleFederationError>;\n loadRemoteConstructor: (\n pluginId: string,\n url: string,\n ) => Effect.Effect<new () => AnyPlugin, ModuleFederationError>;\n}\n\nexport class ModuleFederationService extends Context.Service<\n ModuleFederationService,\n ModuleFederationServiceShape\n>()(\"ModuleFederationService\") {}\n\nexport const ModuleFederationServiceDefault = Layer.effect(\n ModuleFederationService,\n Effect.gen(function* () {\n const mf = yield* Effect.flatten(createModuleFederationInstance);\n const expectedIdentity = expectedSharedIdentity();\n\n const buildSharedIdentityError = async (\n pluginId: string,\n url: string,\n ): Promise<ModuleFederationError | null> => {\n let manifest: Awaited<ReturnType<typeof fetchRemoteIdentityManifest>> | null = null;\n try {\n manifest = await fetchRemoteIdentityManifest(url);\n } catch (error) {\n console.warn(\n `[SharedIdentity] Could not fetch mf-manifest.json for plugin \"${pluginId}\" at ${url} (${error instanceof Error ? error.message : String(error)}); proceeding without identity verification`,\n );\n return null;\n }\n if (!manifest) return null;\n const mismatches = compareSharedIdentity(manifest.shared, expectedIdentity);\n if (mismatches.length === 0) return null;\n const warnOnly = process.env.BOS_MF_IDENTITY === \"warn\";\n if (warnOnly) {\n console.warn(\n `${describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")} (BOS_MF_IDENTITY=warn: loading anyway)`,\n );\n return null;\n }\n return new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: new Error(describeSharedIdentityMismatch(pluginId, mismatches, \"this runtime\")),\n });\n };\n\n return {\n registerRemote: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Registering as \"${remoteName}\"`);\n\n const type = url.endsWith(\"/mf-manifest.json\")\n ? (\"manifest\" as const)\n : url.endsWith(`/${DEV_ENTRY_FILENAME}`)\n ? (\"script\" as const)\n : undefined;\n\n yield* Effect.try({\n try: () =>\n mf.registerRemotes([\n {\n name: remoteName,\n entry: url,\n ...(type ? { type } : {}),\n },\n ]),\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Registered`);\n }),\n\n loadRemoteConstructor: (pluginId: string, url: string) =>\n Effect.gen(function* () {\n const remoteName = yield* resolveRemoteSelfName(pluginId, url);\n yield* Effect.logDebug(`[MF][${pluginId}] Loading remote ${remoteName}`);\n\n const identityError = yield* Effect.promise(() =>\n buildSharedIdentityError(pluginId, url),\n );\n if (identityError) {\n yield* Effect.logError(\n `[MF][${pluginId}] ❌ shared identity mismatch: ${\n identityError.cause instanceof Error\n ? identityError.cause.message\n : String(identityError.cause ?? \"shared identity mismatch\")\n }`,\n );\n return yield* identityError;\n }\n\n const modulePath = `${remoteName}/plugin`;\n\n const pluginConstructor = yield* Effect.tryPromise({\n try: async () => {\n const container = await mf.loadRemote<RemoteModule>(modulePath);\n if (!container) {\n throw new Error(`No container returned for ${modulePath}`);\n }\n\n // Support multiple export patterns: direct function, default export, named exports\n let Constructor: any;\n\n if (typeof container === \"function\") {\n // Direct function export\n Constructor = container;\n } else if (container.default) {\n // Default export\n Constructor = container.default;\n } else {\n // Named export fallback - prioritize exports with 'binding' property (plugin classes)\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && (exp as any).binding !== undefined,\n );\n\n // Fallback to any function export if no binding found\n if (!Constructor) {\n Constructor = Object.values(container).find(\n (exp) => typeof exp === \"function\" && exp.prototype?.constructor === exp,\n );\n }\n }\n\n if (!Constructor || typeof Constructor !== \"function\") {\n const containerInfo =\n typeof container === \"object\"\n ? `Available exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `No valid plugin constructor found for '${pluginId}'.\\n` +\n `Supported patterns:\\n` +\n ` - export const YourPlugin = createPlugin({...})\\n` +\n ` - export default createPlugin({...})\\n` +\n `${containerInfo}`,\n );\n }\n\n // Validate it looks like a plugin constructor (has binding property)\n if (!(Constructor as any).binding) {\n const containerInfo =\n typeof container === \"object\"\n ? `Found exports: ${Object.keys(container).join(\", \")}`\n : `Container type: ${typeof container}`;\n\n throw new Error(\n `Invalid plugin constructor for '${pluginId}'. ` +\n `The exported value must be created with createPlugin(). ` +\n `Found a function but it's missing the required 'binding' property.\\n` +\n `${containerInfo}`,\n );\n }\n\n return Constructor;\n },\n catch: (error): ModuleFederationError =>\n new ModuleFederationError({\n pluginId,\n remoteUrl: url,\n cause: error instanceof Error ? error : new Error(String(error)),\n }),\n });\n\n yield* Effect.logInfo(`[MF][${pluginId}] ✅ Loaded constructor`);\n return pluginConstructor;\n }),\n };\n }),\n);\n"],"mappings":"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"}
@@ -1,24 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_identity = require('../../identity.cjs');
2
3
 
3
- //#region src/runtime/services/normalize.ts
4
- /**
5
- * Normalizes a package name into the module federation remote name.
6
- * This function must produce identical results in both runtime and build contexts.
7
- *
8
- * Normalization rules:
9
- * - Convert to lowercase
10
- * - Strip a single leading '@' symbol
11
- * - Replace '/' with '_'
12
- * - Preserve hyphens and other characters
13
- *
14
- * Examples:
15
- * - "@scope/my-plugin" → "scope_my-plugin"
16
- * - "@SCOPE/Foo/Bar" → "scope_foo_bar"
17
- * - "foo/bar" → "foo_bar"
18
- * - "simple-plugin" → "simple-plugin"
19
- */
20
- const getNormalizedRemoteName = (name) => name.toLowerCase().replace(/^@/, "").replace(/\//g, "_");
21
-
22
- //#endregion
23
- exports.getNormalizedRemoteName = getNormalizedRemoteName;
24
- //# sourceMappingURL=normalize.cjs.map
4
+ exports.getNormalizedRemoteName = require_identity.remoteName;
@@ -1,21 +1,2 @@
1
- //#region src/runtime/services/normalize.d.ts
2
- /**
3
- * Normalizes a package name into the module federation remote name.
4
- * This function must produce identical results in both runtime and build contexts.
5
- *
6
- * Normalization rules:
7
- * - Convert to lowercase
8
- * - Strip a single leading '@' symbol
9
- * - Replace '/' with '_'
10
- * - Preserve hyphens and other characters
11
- *
12
- * Examples:
13
- * - "@scope/my-plugin" → "scope_my-plugin"
14
- * - "@SCOPE/Foo/Bar" → "scope_foo_bar"
15
- * - "foo/bar" → "foo_bar"
16
- * - "simple-plugin" → "simple-plugin"
17
- */
18
- declare const getNormalizedRemoteName: (name: string) => string;
19
- //#endregion
20
- export { getNormalizedRemoteName };
21
- //# sourceMappingURL=normalize.d.cts.map
1
+ import { remoteName } from "../../identity.cjs";
2
+ export { remoteName as getNormalizedRemoteName };
@@ -1,21 +1,2 @@
1
- //#region src/runtime/services/normalize.d.ts
2
- /**
3
- * Normalizes a package name into the module federation remote name.
4
- * This function must produce identical results in both runtime and build contexts.
5
- *
6
- * Normalization rules:
7
- * - Convert to lowercase
8
- * - Strip a single leading '@' symbol
9
- * - Replace '/' with '_'
10
- * - Preserve hyphens and other characters
11
- *
12
- * Examples:
13
- * - "@scope/my-plugin" → "scope_my-plugin"
14
- * - "@SCOPE/Foo/Bar" → "scope_foo_bar"
15
- * - "foo/bar" → "foo_bar"
16
- * - "simple-plugin" → "simple-plugin"
17
- */
18
- declare const getNormalizedRemoteName: (name: string) => string;
19
- //#endregion
20
- export { getNormalizedRemoteName };
21
- //# sourceMappingURL=normalize.d.mts.map
1
+ import { remoteName } from "../../identity.mjs";
2
+ export { remoteName as getNormalizedRemoteName };
@@ -1,22 +1,3 @@
1
- //#region src/runtime/services/normalize.ts
2
- /**
3
- * Normalizes a package name into the module federation remote name.
4
- * This function must produce identical results in both runtime and build contexts.
5
- *
6
- * Normalization rules:
7
- * - Convert to lowercase
8
- * - Strip a single leading '@' symbol
9
- * - Replace '/' with '_'
10
- * - Preserve hyphens and other characters
11
- *
12
- * Examples:
13
- * - "@scope/my-plugin" → "scope_my-plugin"
14
- * - "@SCOPE/Foo/Bar" → "scope_foo_bar"
15
- * - "foo/bar" → "foo_bar"
16
- * - "simple-plugin" → "simple-plugin"
17
- */
18
- const getNormalizedRemoteName = (name) => name.toLowerCase().replace(/^@/, "").replace(/\//g, "_");
1
+ import { remoteName } from "../../identity.mjs";
19
2
 
20
- //#endregion
21
- export { getNormalizedRemoteName };
22
- //# sourceMappingURL=normalize.mjs.map
3
+ export { remoteName as getNormalizedRemoteName };