@bleedingdev/modern-js-ultramodern-create 3.9.0-ultramodern.2 → 3.9.0-ultramodern.21

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 (442) hide show
  1. package/README.md +43 -74
  2. package/dist/cjs/cli/package-source.cjs +2 -2
  3. package/dist/cjs/cli/project-setup.cjs +2 -22
  4. package/dist/cjs/index.cjs +9 -1
  5. package/dist/cjs/locale/en.cjs +2 -1
  6. package/dist/cjs/locale/zh.cjs +2 -1
  7. package/dist/cjs/ultramodern-package-source.cjs +13 -9
  8. package/dist/cjs/ultramodern-release-cohort.cjs +6 -21
  9. package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +49 -56
  10. package/dist/cjs/ultramodern-tooling/commands/context.cjs +11 -29
  11. package/dist/cjs/ultramodern-tooling/commands/routes-generate-app.cjs +67 -0
  12. package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +24 -53
  13. package/dist/cjs/ultramodern-tooling/commands/validate.cjs +5 -11
  14. package/dist/cjs/ultramodern-tooling/commands.cjs +15 -8
  15. package/dist/cjs/ultramodern-tooling/config/index.cjs +10 -24
  16. package/dist/cjs/ultramodern-tooling/config/load.cjs +12 -10
  17. package/dist/cjs/ultramodern-tooling/config/metadata.cjs +34 -32
  18. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +165 -164
  19. package/dist/cjs/ultramodern-workspace/add-shell.cjs +118 -118
  20. package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +121 -25
  21. package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +14 -160
  22. package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +16 -48
  23. package/dist/cjs/ultramodern-workspace/add-vertical/preview.cjs +78 -0
  24. package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +87 -24
  25. package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +4 -1
  26. package/dist/cjs/ultramodern-workspace/add-vertical/transaction.cjs +378 -45
  27. package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +21 -44
  28. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +0 -9
  29. package/dist/cjs/ultramodern-workspace/api/client.cjs +5 -5
  30. package/dist/cjs/ultramodern-workspace/api/contracts.cjs +2 -2
  31. package/dist/cjs/ultramodern-workspace/api/rpc.cjs +20 -18
  32. package/dist/cjs/ultramodern-workspace/api/service.cjs +49 -24
  33. package/dist/cjs/ultramodern-workspace/api/shared.cjs +28 -18
  34. package/dist/cjs/ultramodern-workspace/app-files.cjs +3 -23
  35. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +27 -27
  36. package/dist/cjs/ultramodern-workspace/contracts.cjs +14 -183
  37. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/surfaces.cjs +85 -0
  38. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/types.cjs +8 -85
  39. package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +16 -4
  40. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +27 -17
  41. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +16 -10
  42. package/dist/cjs/ultramodern-workspace/demo-components.cjs +66 -433
  43. package/dist/cjs/ultramodern-workspace/descriptors.cjs +0 -4
  44. package/dist/cjs/ultramodern-workspace/fs-io.cjs +37 -2
  45. package/dist/cjs/ultramodern-workspace/generation-result.cjs +4 -4
  46. package/dist/cjs/ultramodern-workspace/index.cjs +2 -5
  47. package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +0 -6
  48. package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +6 -6
  49. package/dist/cjs/{ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs → ultramodern-workspace/mf-validation/exposes.cjs} +13 -17
  50. package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +26 -7
  51. package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +21 -122
  52. package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +37 -38
  53. package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +93 -153
  54. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +4 -0
  55. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +24 -29
  56. package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +39 -58
  57. package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +1 -43
  58. package/dist/cjs/ultramodern-workspace/package-json.cjs +63 -37
  59. package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +104 -0
  60. package/dist/cjs/ultramodern-workspace/policy.cjs +3 -577
  61. package/dist/cjs/ultramodern-workspace/public-surface.cjs +3 -3
  62. package/dist/cjs/ultramodern-workspace/routes.cjs +2 -11
  63. package/dist/cjs/ultramodern-workspace/shared-patches.cjs +12 -2
  64. package/dist/cjs/ultramodern-workspace/shells.cjs +0 -70
  65. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +27 -41
  66. package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +8 -2
  67. package/dist/cjs/ultramodern-workspace/validation/architecture.cjs +397 -0
  68. package/dist/cjs/ultramodern-workspace/validation/assertions.cjs +140 -0
  69. package/dist/cjs/ultramodern-workspace/validation/types.cjs +18 -0
  70. package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +344 -0
  71. package/dist/cjs/ultramodern-workspace/versions.cjs +81 -45
  72. package/dist/cjs/ultramodern-workspace/workspace-artifact-ownership.cjs +183 -0
  73. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +36 -25
  74. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +11 -200
  75. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +62 -373
  76. package/dist/cjs/ultramodern-workspace/write-app.cjs +19 -11
  77. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +20 -50
  78. package/dist/cjs/ultramodern-workspace/zerops.cjs +2 -0
  79. package/dist/esm/cli/package-source.js +3 -3
  80. package/dist/esm/cli/project-setup.js +2 -22
  81. package/dist/esm/index.js +10 -2
  82. package/dist/esm/locale/en.js +2 -1
  83. package/dist/esm/locale/zh.js +2 -1
  84. package/dist/esm/ultramodern-package-source.js +14 -4
  85. package/dist/esm/ultramodern-release-cohort.js +5 -14
  86. package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
  87. package/dist/esm/ultramodern-tooling/commands/context.js +10 -26
  88. package/dist/esm/ultramodern-tooling/commands/routes-generate-app.js +35 -0
  89. package/dist/esm/ultramodern-tooling/commands/routes-generate.js +25 -54
  90. package/dist/esm/ultramodern-tooling/commands/validate.js +6 -12
  91. package/dist/esm/ultramodern-tooling/commands.js +15 -9
  92. package/dist/esm/ultramodern-tooling/config/index.js +0 -2
  93. package/dist/esm/ultramodern-tooling/config/load.js +9 -9
  94. package/dist/esm/ultramodern-tooling/config/metadata.js +33 -28
  95. package/dist/esm/ultramodern-tooling/config/normalize.js +159 -156
  96. package/dist/esm/ultramodern-workspace/add-shell.js +124 -123
  97. package/dist/esm/ultramodern-workspace/add-vertical/execute.js +119 -27
  98. package/dist/esm/ultramodern-workspace/add-vertical/plan.js +16 -150
  99. package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +15 -47
  100. package/dist/esm/ultramodern-workspace/add-vertical/preview.js +40 -0
  101. package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +87 -25
  102. package/dist/esm/ultramodern-workspace/add-vertical/topology.js +4 -1
  103. package/dist/esm/ultramodern-workspace/add-vertical/transaction.js +373 -46
  104. package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
  105. package/dist/esm/ultramodern-workspace/add-vertical.js +1 -1
  106. package/dist/esm/ultramodern-workspace/api/client.js +5 -5
  107. package/dist/esm/ultramodern-workspace/api/contracts.js +2 -2
  108. package/dist/esm/ultramodern-workspace/api/rpc.js +20 -18
  109. package/dist/esm/ultramodern-workspace/api/service.js +49 -24
  110. package/dist/esm/ultramodern-workspace/api/shared.js +28 -18
  111. package/dist/esm/ultramodern-workspace/app-files.js +3 -23
  112. package/dist/esm/ultramodern-workspace/backend-federation.js +5 -5
  113. package/dist/esm/ultramodern-workspace/contracts.js +14 -180
  114. package/dist/esm/ultramodern-workspace/delivery-unit-schema/surfaces.js +41 -0
  115. package/dist/esm/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
  116. package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +16 -4
  117. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +28 -18
  118. package/dist/esm/ultramodern-workspace/delivery-unit.js +12 -6
  119. package/dist/esm/ultramodern-workspace/demo-components.js +67 -428
  120. package/dist/esm/ultramodern-workspace/descriptors.js +1 -2
  121. package/dist/esm/ultramodern-workspace/fs-io.js +37 -2
  122. package/dist/esm/ultramodern-workspace/generation-result.js +3 -3
  123. package/dist/esm/ultramodern-workspace/index.js +1 -1
  124. package/dist/esm/ultramodern-workspace/mf-validation/constants.js +1 -4
  125. package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +7 -7
  126. package/dist/esm/ultramodern-workspace/mf-validation/exposes.js +14 -0
  127. package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +27 -8
  128. package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +22 -123
  129. package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +36 -34
  130. package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +83 -143
  131. package/dist/esm/ultramodern-workspace/mf-validation.js +1 -0
  132. package/dist/esm/ultramodern-workspace/module-federation/config.js +25 -30
  133. package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +39 -58
  134. package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +1 -43
  135. package/dist/esm/ultramodern-workspace/package-json.js +58 -32
  136. package/dist/esm/ultramodern-workspace/patch-inventory.js +66 -0
  137. package/dist/esm/ultramodern-workspace/policy.js +2 -564
  138. package/dist/esm/ultramodern-workspace/public-surface.js +3 -3
  139. package/dist/esm/ultramodern-workspace/routes.js +2 -11
  140. package/dist/esm/ultramodern-workspace/shared-patches.js +2 -2
  141. package/dist/esm/ultramodern-workspace/shells.js +3 -67
  142. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +22 -37
  143. package/dist/esm/ultramodern-workspace/tsconfigs.js +9 -3
  144. package/dist/esm/ultramodern-workspace/validation/architecture.js +348 -0
  145. package/dist/esm/ultramodern-workspace/validation/assertions.js +65 -0
  146. package/dist/esm/ultramodern-workspace/validation/types.js +0 -0
  147. package/dist/esm/ultramodern-workspace/validation/workspace.js +286 -0
  148. package/dist/esm/ultramodern-workspace/versions.js +74 -29
  149. package/dist/esm/ultramodern-workspace/workspace-artifact-ownership.js +128 -0
  150. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +35 -27
  151. package/dist/esm/ultramodern-workspace/workspace-scripts.js +10 -190
  152. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +65 -376
  153. package/dist/esm/ultramodern-workspace/write-app.js +18 -10
  154. package/dist/esm/ultramodern-workspace/write-workspace.js +25 -52
  155. package/dist/esm/ultramodern-workspace/zerops.js +2 -0
  156. package/dist/esm-node/cli/package-source.js +3 -3
  157. package/dist/esm-node/cli/project-setup.js +2 -22
  158. package/dist/esm-node/index.js +10 -2
  159. package/dist/esm-node/locale/en.js +2 -1
  160. package/dist/esm-node/locale/zh.js +2 -1
  161. package/dist/esm-node/ultramodern-package-source.js +14 -4
  162. package/dist/esm-node/ultramodern-release-cohort.js +5 -14
  163. package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
  164. package/dist/esm-node/ultramodern-tooling/commands/context.js +10 -26
  165. package/dist/esm-node/ultramodern-tooling/commands/routes-generate-app.js +36 -0
  166. package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +25 -54
  167. package/dist/esm-node/ultramodern-tooling/commands/validate.js +6 -12
  168. package/dist/esm-node/ultramodern-tooling/commands.js +15 -9
  169. package/dist/esm-node/ultramodern-tooling/config/index.js +0 -2
  170. package/dist/esm-node/ultramodern-tooling/config/load.js +9 -9
  171. package/dist/esm-node/ultramodern-tooling/config/metadata.js +33 -28
  172. package/dist/esm-node/ultramodern-tooling/config/normalize.js +159 -156
  173. package/dist/esm-node/ultramodern-workspace/add-shell.js +124 -123
  174. package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +119 -27
  175. package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +16 -150
  176. package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +15 -47
  177. package/dist/esm-node/ultramodern-workspace/add-vertical/preview.js +41 -0
  178. package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +87 -25
  179. package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +4 -1
  180. package/dist/esm-node/ultramodern-workspace/add-vertical/transaction.js +373 -46
  181. package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
  182. package/dist/esm-node/ultramodern-workspace/add-vertical.js +1 -1
  183. package/dist/esm-node/ultramodern-workspace/api/client.js +5 -5
  184. package/dist/esm-node/ultramodern-workspace/api/contracts.js +2 -2
  185. package/dist/esm-node/ultramodern-workspace/api/rpc.js +20 -18
  186. package/dist/esm-node/ultramodern-workspace/api/service.js +49 -24
  187. package/dist/esm-node/ultramodern-workspace/api/shared.js +28 -18
  188. package/dist/esm-node/ultramodern-workspace/app-files.js +3 -23
  189. package/dist/esm-node/ultramodern-workspace/backend-federation.js +5 -5
  190. package/dist/esm-node/ultramodern-workspace/contracts.js +14 -180
  191. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/surfaces.js +42 -0
  192. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
  193. package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +16 -4
  194. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +28 -18
  195. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +12 -6
  196. package/dist/esm-node/ultramodern-workspace/demo-components.js +67 -428
  197. package/dist/esm-node/ultramodern-workspace/descriptors.js +1 -2
  198. package/dist/esm-node/ultramodern-workspace/fs-io.js +37 -2
  199. package/dist/esm-node/ultramodern-workspace/generation-result.js +3 -3
  200. package/dist/esm-node/ultramodern-workspace/index.js +1 -1
  201. package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +1 -4
  202. package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +7 -7
  203. package/dist/esm-node/ultramodern-workspace/mf-validation/exposes.js +15 -0
  204. package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +27 -8
  205. package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +22 -123
  206. package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +36 -34
  207. package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +83 -143
  208. package/dist/esm-node/ultramodern-workspace/mf-validation.js +1 -0
  209. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +25 -30
  210. package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +39 -58
  211. package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +1 -43
  212. package/dist/esm-node/ultramodern-workspace/package-json.js +58 -32
  213. package/dist/esm-node/ultramodern-workspace/patch-inventory.js +67 -0
  214. package/dist/esm-node/ultramodern-workspace/policy.js +2 -564
  215. package/dist/esm-node/ultramodern-workspace/public-surface.js +3 -3
  216. package/dist/esm-node/ultramodern-workspace/routes.js +2 -11
  217. package/dist/esm-node/ultramodern-workspace/shared-patches.js +2 -2
  218. package/dist/esm-node/ultramodern-workspace/shells.js +3 -67
  219. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +22 -37
  220. package/dist/esm-node/ultramodern-workspace/tsconfigs.js +9 -3
  221. package/dist/esm-node/ultramodern-workspace/validation/architecture.js +349 -0
  222. package/dist/esm-node/ultramodern-workspace/validation/assertions.js +66 -0
  223. package/dist/esm-node/ultramodern-workspace/validation/types.js +1 -0
  224. package/dist/esm-node/ultramodern-workspace/validation/workspace.js +287 -0
  225. package/dist/esm-node/ultramodern-workspace/versions.js +74 -29
  226. package/dist/esm-node/ultramodern-workspace/workspace-artifact-ownership.js +129 -0
  227. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +35 -27
  228. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +10 -190
  229. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +65 -376
  230. package/dist/esm-node/ultramodern-workspace/write-app.js +18 -10
  231. package/dist/esm-node/ultramodern-workspace/write-workspace.js +25 -52
  232. package/dist/esm-node/ultramodern-workspace/zerops.js +2 -0
  233. package/dist/types/cli/project-setup.d.ts +1 -1
  234. package/dist/types/locale/en.d.ts +1 -0
  235. package/dist/types/locale/index.d.ts +2 -0
  236. package/dist/types/locale/zh.d.ts +1 -0
  237. package/dist/types/ultramodern-package-source.d.ts +2 -4
  238. package/dist/types/ultramodern-release-cohort.d.ts +1 -3
  239. package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -2
  240. package/dist/types/ultramodern-tooling/commands/context.d.ts +4 -1
  241. package/dist/types/ultramodern-tooling/commands/routes-generate-app.d.ts +1 -0
  242. package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +1 -1
  243. package/dist/types/ultramodern-tooling/commands/validate.d.ts +1 -1
  244. package/dist/types/ultramodern-tooling/config/index.d.ts +0 -2
  245. package/dist/types/ultramodern-tooling/config/load.d.ts +10 -2
  246. package/dist/types/ultramodern-tooling/config/metadata.d.ts +2 -2
  247. package/dist/types/ultramodern-tooling/config/normalize.d.ts +19 -19
  248. package/dist/types/ultramodern-tooling/config/types.d.ts +2 -9
  249. package/dist/types/ultramodern-workspace/add-shell.d.ts +1 -1
  250. package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +1 -0
  251. package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +4 -3
  252. package/dist/types/ultramodern-workspace/add-vertical/preview.d.ts +4 -0
  253. package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +7 -2
  254. package/dist/types/ultramodern-workspace/add-vertical/transaction.d.ts +32 -6
  255. package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +10 -7
  256. package/dist/types/ultramodern-workspace/add-vertical.d.ts +1 -1
  257. package/dist/types/ultramodern-workspace/api/client.d.ts +3 -1
  258. package/dist/types/ultramodern-workspace/api/rpc.d.ts +1 -1
  259. package/dist/types/ultramodern-workspace/api/service.d.ts +3 -1
  260. package/dist/types/ultramodern-workspace/api/shared.d.ts +2 -0
  261. package/dist/types/ultramodern-workspace/backend-federation.d.ts +1 -1
  262. package/dist/types/ultramodern-workspace/contracts.d.ts +1 -3
  263. package/dist/types/ultramodern-workspace/delivery-unit-schema/surfaces.d.ts +17 -0
  264. package/dist/types/ultramodern-workspace/delivery-unit-schema/types.d.ts +3 -68
  265. package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +2 -2
  266. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +3 -3
  267. package/dist/types/ultramodern-workspace/demo-components.d.ts +0 -3
  268. package/dist/types/ultramodern-workspace/descriptors.d.ts +0 -1
  269. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -1
  270. package/dist/types/ultramodern-workspace/index.d.ts +1 -1
  271. package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +0 -1
  272. package/dist/types/ultramodern-workspace/mf-validation/exposes.d.ts +11 -0
  273. package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +2 -3
  274. package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +4 -3
  275. package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +1 -0
  276. package/dist/types/ultramodern-workspace/mf-validation.d.ts +1 -0
  277. package/dist/types/ultramodern-workspace/module-federation/config.d.ts +1 -1
  278. package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +2 -2
  279. package/dist/types/ultramodern-workspace/package-json.d.ts +1 -1
  280. package/dist/types/ultramodern-workspace/patch-inventory.d.ts +10 -0
  281. package/dist/types/ultramodern-workspace/policy.d.ts +31 -209
  282. package/dist/types/ultramodern-workspace/routes.d.ts +6 -1
  283. package/dist/types/ultramodern-workspace/shells.d.ts +2 -15
  284. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +8 -7
  285. package/dist/types/ultramodern-workspace/types.d.ts +9 -9
  286. package/dist/types/ultramodern-workspace/validation/architecture.d.ts +2 -0
  287. package/dist/types/ultramodern-workspace/validation/assertions.d.ts +14 -0
  288. package/dist/types/ultramodern-workspace/validation/types.d.ts +9 -0
  289. package/dist/types/ultramodern-workspace/validation/workspace.d.ts +6 -0
  290. package/dist/types/ultramodern-workspace/versions.d.ts +73 -28
  291. package/dist/types/ultramodern-workspace/workspace-artifact-ownership.d.ts +18 -0
  292. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +4 -5
  293. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +8 -13
  294. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +22 -188
  295. package/dist/types/ultramodern-workspace/write-workspace.d.ts +1 -3
  296. package/package.json +18 -11
  297. package/{template-workspace/.modernjs/release-cohort.json → release-cohort.json} +88 -40
  298. package/template-workspace/.codex/skills/rspack-tracing/scripts/analyze_trace.js +1 -1
  299. package/template-workspace/README.md.handlebars +20 -35
  300. package/template-workspace/oxfmt.config.ts +3 -0
  301. package/template-workspace/pnpm-workspace.yaml.handlebars +0 -24
  302. package/template-workspace/scripts/bootstrap-agent-skills.mjs +4 -4
  303. package/templates/packages/shared-contracts-index.ts +4 -332
  304. package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +10 -0
  305. package/templates/workspace/apps/modern.config.ts.handlebars +13 -27
  306. package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -11
  307. package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +20 -20
  308. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +4 -6
  309. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +2 -2
  310. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +11 -11
  311. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.helpers.tsx.handlebars +1 -1
  312. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.imports.tsx.handlebars +1 -1
  313. package/templates/workspace-scripts/generate-node-backend-federation.mjs +68 -77
  314. package/templates/workspace-scripts/generate-public-surface-assets.mjs +107 -207
  315. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +12 -19
  316. package/templates/workspace-scripts/proof-cloudflare-version.mjs +53 -444
  317. package/templates/workspace-scripts/proof-node-backend-federation.mjs +212 -91
  318. package/templates/workspace-scripts/{proof-workerd-ssr.mts → proof-workerd-ssr.mjs} +434 -239
  319. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +25 -7
  320. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +45 -147
  321. package/templates/workspace-scripts/ultramodern-typecheck.mjs +1 -1
  322. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +0 -212
  323. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +0 -47
  324. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +0 -112
  325. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +0 -55
  326. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +0 -102
  327. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +0 -195
  328. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +0 -146
  329. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.cjs +0 -110
  330. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +0 -67
  331. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +0 -307
  332. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +0 -58
  333. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +0 -71
  334. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.cjs +0 -151
  335. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +0 -67
  336. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +0 -52
  337. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +0 -447
  338. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +0 -323
  339. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +0 -87
  340. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +0 -612
  341. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +0 -376
  342. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +0 -73
  343. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.cjs +0 -215
  344. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +0 -135
  345. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +0 -454
  346. package/dist/cjs/ultramodern-tooling/config/constants.cjs +0 -48
  347. package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +0 -157
  348. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/up-projection.cjs +0 -188
  349. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -154
  350. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -9
  351. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -63
  352. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -7
  353. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -47
  354. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -146
  355. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -97
  356. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -61
  357. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -16
  358. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -258
  359. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -10
  360. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -8
  361. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -15
  362. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -100
  363. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -29
  364. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -14
  365. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -385
  366. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -276
  367. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -49
  368. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -559
  369. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -329
  370. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -19
  371. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -148
  372. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -80
  373. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +0 -405
  374. package/dist/esm/ultramodern-tooling/config/constants.js +0 -4
  375. package/dist/esm/ultramodern-tooling/config/synthesize.js +0 -108
  376. package/dist/esm/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -129
  377. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -155
  378. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -10
  379. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -64
  380. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -8
  381. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -48
  382. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -147
  383. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -98
  384. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -62
  385. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -17
  386. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -259
  387. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -11
  388. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -9
  389. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -16
  390. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -101
  391. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -30
  392. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -15
  393. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -386
  394. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -277
  395. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -50
  396. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -560
  397. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -330
  398. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -20
  399. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -149
  400. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -81
  401. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +0 -406
  402. package/dist/esm-node/ultramodern-tooling/config/constants.js +0 -5
  403. package/dist/esm-node/ultramodern-tooling/config/synthesize.js +0 -109
  404. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -130
  405. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +0 -12
  406. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +0 -4
  407. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +0 -1
  408. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +0 -3
  409. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +0 -5
  410. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +0 -3
  411. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +0 -2
  412. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.d.ts +0 -2
  413. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +0 -4
  414. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +0 -3
  415. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +0 -3
  416. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +0 -8
  417. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +0 -3
  418. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.d.ts +0 -3
  419. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +0 -1
  420. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +0 -2
  421. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +0 -26
  422. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +0 -25
  423. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +0 -3
  424. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +0 -26
  425. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +0 -26
  426. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +0 -6
  427. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.d.ts +0 -37
  428. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.d.ts +0 -4
  429. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +0 -2
  430. package/dist/types/ultramodern-tooling/config/constants.d.ts +0 -3
  431. package/dist/types/ultramodern-tooling/config/synthesize.d.ts +0 -5
  432. package/dist/types/ultramodern-workspace/delivery-unit-schema/up-projection.d.ts +0 -189
  433. package/template-workspace/patches/@module-federation__bridge-react@2.9.0.patch +0 -47
  434. package/template-workspace/patches/@module-federation__dts-plugin@2.9.0.patch +0 -26
  435. package/template-workspace/patches/@module-federation__modern-js-v3@2.9.0.patch +0 -268
  436. package/template-workspace/patches/@module-federation__runtime-core@2.9.0.patch +0 -13
  437. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +0 -471
  438. package/template-workspace/patches/msgpackr@2.1.0.patch +0 -30
  439. package/template-workspace/patches/zod@4.5.4.patch +0 -56
  440. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +0 -779
  441. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mts +0 -9
  442. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +0 -4109
@@ -1,52 +1,50 @@
1
1
  import "node:module";
2
2
  import node_fs from "node:fs";
3
- import node_os from "node:os";
4
3
  import node_path from "node:path";
5
- import { DEVELOPMENT_OVERLAY_PATH, TOPOLOGY_PATH } from "./add-vertical/constants.js";
6
- import { createPrimaryShellDescriptor } from "./add-vertical/preflight.js";
7
- import { verticalsFromTopology } from "./add-vertical/topology.js";
4
+ import { normalizeWorkspaceInputs } from "../ultramodern-tooling/config.js";
5
+ import { DEVELOPMENT_OVERLAY_PATH, OWNERSHIP_PATH, TOPOLOGY_PATH } from "./add-vertical/constants.js";
6
+ import { readRequiredJsonObject } from "./add-vertical/preflight.js";
7
+ import { describeJsonChanges } from "./add-vertical/preview.js";
8
+ import { updateRootWorkspaceScripts } from "./add-vertical/shell-files.js";
9
+ import { ownershipEntry } from "./add-vertical/topology.js";
8
10
  import { runWorkspaceTransaction } from "./add-vertical/transaction.js";
9
- import { assertGlobalPortUniqueness, configuredDevelopmentPorts, existingBridgeConfig, existingPackageSource, existingTailwindEnabled, nextAvailablePort } from "./add-vertical/workspace-state.js";
10
- import { ULTRAMODERN_CONFIG_PATH, appEmitsBrowserUi, shellApp } from "./descriptors.js";
11
- import { formatGeneratedWorkspaceFiles, readJsonFile, writeFileReplacing, writeJsonFile } from "./fs-io.js";
11
+ import { assertGlobalPortUniqueness, nextAvailablePort, workspaceOperationSettings } from "./add-vertical/workspace-state.js";
12
+ import { appEmitsBrowserUi, resolveRemoteRefs, shellApp } from "./descriptors.js";
13
+ import { formatGeneratedWorkspaceFiles, writeJsonFile } from "./fs-io.js";
12
14
  import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
13
- import { assertUniqueTailwindPrefixes, toPackageScope } from "./naming.js";
14
- import { createRootPackageJson } from "./package-json.js";
15
- import { FIRST_ADDITIONAL_SHELL_PORT, PRIMARY_SHELL_ID, assertValidShellName, createAdditionalShellConfigEntry, createShellDescriptor, resolveConfiguredAdditionalShells } from "./shells.js";
15
+ import { createAppModernConfig } from "./module-federation.js";
16
+ import { assertUniqueTailwindPrefixes, packageName, toPackageScope } from "./naming.js";
17
+ import { createCloudflareDeployContract } from "./policy.js";
18
+ import { FIRST_ADDITIONAL_SHELL_PORT, PRIMARY_SHELL_ID, assertValidShellName, createShellDescriptor, shellDeliveryUnitBlock } from "./shells.js";
16
19
  import { createRootTsConfig } from "./tsconfigs.js";
17
- import { isRecord } from "./types.js";
20
+ import { preserveConsumerWorkspaceArtifacts, workspaceArtifactCandidates, workspaceDevelopmentPorts } from "./workspace-artifact-ownership.js";
18
21
  import { writeGeneratedWorkspaceScripts } from "./workspace-scripts.js";
19
- import { rewriteAppModernConfig, writeApp } from "./write-app.js";
22
+ import { writeApp } from "./write-app.js";
20
23
  import { createZeropsYaml } from "./zerops.js";
21
- function readRequiredJsonObject(filePath) {
22
- if (!node_fs.existsSync(filePath)) throw new Error(`Missing UltraModern workspace file: ${filePath}`);
23
- const value = readJsonFile(filePath);
24
- if (!isRecord(value)) throw new Error(`UltraModern workspace file must contain a JSON object: ${filePath}`);
25
- return value;
26
- }
27
24
  function prepareAddUltramodernShell(options) {
28
25
  const name = assertValidShellName(options.name);
29
- const configPath = node_path.join(options.workspaceRoot, ULTRAMODERN_CONFIG_PATH);
30
26
  const overlayPath = node_path.join(options.workspaceRoot, DEVELOPMENT_OVERLAY_PATH);
31
27
  const topologyPath = node_path.join(options.workspaceRoot, TOPOLOGY_PATH);
28
+ const ownershipPath = node_path.join(options.workspaceRoot, OWNERSHIP_PATH);
32
29
  const rootPackage = readRequiredJsonObject(node_path.join(options.workspaceRoot, 'package.json'));
33
- const config = readRequiredJsonObject(configPath);
34
30
  const overlay = readRequiredJsonObject(overlayPath);
35
31
  const topology = readRequiredJsonObject(topologyPath);
32
+ const ownership = readRequiredJsonObject(ownershipPath);
36
33
  overlay.ports ??= {};
37
34
  const scope = toPackageScope(String(rootPackage.name ?? node_path.basename(options.workspaceRoot)));
38
- const packageSource = existingPackageSource(options.workspaceRoot, options.modernVersion, options.packageSource);
39
- const enableTailwind = options.enableTailwind ?? existingTailwindEnabled(options.workspaceRoot);
40
- const bridge = existingBridgeConfig(options.workspaceRoot);
41
- const existingVerticals = verticalsFromTopology(topology, overlay.ports);
42
- const existingAdditionalShells = resolveConfiguredAdditionalShells(config);
35
+ const workspace = normalizeWorkspaceInputs(options.workspaceRoot, {
36
+ topology,
37
+ overlay
38
+ });
39
+ const { packageSource, enableTailwind, bridge } = workspaceOperationSettings(options, workspace.config);
40
+ const { primaryShell: resolvedPrimaryShell, verticals: existingVerticals, additionalShells: existingAdditionalShells } = workspace;
41
+ const primaryShell = resolvedPrimaryShell;
43
42
  const shellId = `shell-${name}`;
44
43
  if (shellId === PRIMARY_SHELL_ID || existingAdditionalShells.some((existing)=>existing.id === shellId)) throw new Error(`Shell "${shellId}" already exists in this workspace.`);
45
44
  if (node_fs.existsSync(node_path.join(options.workspaceRoot, `apps/${shellId}`))) throw new Error(`Refusing to overwrite existing path: apps/${shellId}`);
46
- const overlayPorts = overlay.ports ?? {};
47
45
  const portsWithPrimary = {
48
- ...overlayPorts,
49
- [shellApp.id]: 'number' == typeof overlayPorts[shellApp.id] ? overlayPorts[shellApp.id] : shellApp.port
46
+ ...overlay.ports,
47
+ [primaryShell.id]: primaryShell.port
50
48
  };
51
49
  assertGlobalPortUniqueness(portsWithPrimary, existingAdditionalShells);
52
50
  const shell = createShellDescriptor(name, nextAvailablePort(portsWithPrimary, existingAdditionalShells, FIRST_ADDITIONAL_SHELL_PORT));
@@ -72,17 +70,20 @@ function prepareAddUltramodernShell(options) {
72
70
  ]);
73
71
  return {
74
72
  scope,
75
- configPath,
73
+ topologyPath,
74
+ ownershipPath,
76
75
  overlayPath,
77
- config,
76
+ config: workspace.config,
77
+ topology,
78
+ ownership,
78
79
  overlay,
79
80
  packageSource,
80
81
  enableTailwind,
81
82
  bridge,
83
+ primaryShell,
82
84
  existingVerticals,
83
85
  existingAdditionalShells,
84
- shell,
85
- composedVerticals
86
+ shell
86
87
  };
87
88
  }
88
89
  function addUltramodernShell(options) {
@@ -94,43 +95,74 @@ function addUltramodernShell(options) {
94
95
  function executeAddUltramodernShell(options, logicalWorkspaceRoot = options.workspaceRoot) {
95
96
  const beforeFiles = createFileSnapshot(options.workspaceRoot);
96
97
  const preflight = prepareAddUltramodernShell(options);
97
- const { scope, configPath, config, packageSource, enableTailwind, bridge, existingVerticals, existingAdditionalShells, shell, composedVerticals } = preflight;
98
- const configuredPrimary = createPrimaryShellDescriptor({}, config);
99
- const primaryRefsConfigured = Array.isArray(config.topology?.apps?.find((app)=>app?.id === shellApp.id)?.moduleFederation?.verticalRefs);
100
- const primaryShell = {
101
- ...configuredPrimary,
102
- verticalRefs: primaryRefsConfigured ? configuredPrimary.verticalRefs : existingVerticals.filter(appEmitsBrowserUi).map((v)=>v.id)
103
- };
98
+ const { scope, topologyPath, ownershipPath, topology, ownership, config, packageSource, enableTailwind, bridge, primaryShell, existingVerticals, existingAdditionalShells, shell } = preflight;
104
99
  const allAdditionalShells = [
105
100
  ...existingAdditionalShells,
106
101
  shell
107
102
  ];
108
- const configuredDevPorts = configuredDevelopmentPorts({
109
- ...preflight.overlay.ports,
110
- [shell.id]: shell.port
111
- }, allAdditionalShells).toSorted((left, right)=>left - right);
112
- writeApp(options.workspaceRoot, scope, shell, packageSource, enableTailwind, composedVerticals, bridge, configuredDevPorts);
113
- const shellsCollection = Array.isArray(config.shells) ? config.shells.filter((entry)=>entry?.id !== shell.id) : [];
114
- shellsCollection.push(createAdditionalShellConfigEntry(scope, shell, existingVerticals));
115
- config.shells = shellsCollection;
116
- writeJsonFile(configPath, config);
117
- for (const app of [
103
+ const configuredDevPorts = workspaceDevelopmentPorts([
104
+ primaryShell,
105
+ ...existingVerticals,
106
+ ...allAdditionalShells
107
+ ], preflight.overlay.ports);
108
+ const previousApps = [
118
109
  primaryShell,
119
110
  ...existingVerticals,
120
111
  ...existingAdditionalShells
121
- ])rewriteAppModernConfig(options.workspaceRoot, scope, app, existingVerticals, enableTailwind, configuredDevPorts);
122
- const rootPackagePath = node_path.join(options.workspaceRoot, 'package.json');
123
- const rootPackage = readJsonFile(rootPackagePath);
124
- const generatedRootPackage = createRootPackageJson(scope, packageSource, existingVerticals, bridge, allAdditionalShells);
125
- rootPackage.scripts = generatedRootPackage.scripts;
126
- writeJsonFile(rootPackagePath, rootPackage);
127
- writeJsonFile(node_path.join(options.workspaceRoot, 'tsconfig.json'), createRootTsConfig([
112
+ ];
113
+ const { io: ownedIo } = preserveConsumerWorkspaceArtifacts(options.workspaceRoot, workspaceArtifactCandidates(scope, previousApps, enableTailwind, previousApps));
114
+ writeApp(options.workspaceRoot, scope, shell, packageSource, enableTailwind, existingVerticals, bridge, configuredDevPorts);
115
+ topology.shells ??= [];
116
+ topology.shells.push({
117
+ id: shell.id,
118
+ kind: 'shell',
119
+ package: packageName(scope, shell.packageSuffix),
120
+ path: shell.directory,
121
+ displayName: shell.displayName,
122
+ portEnv: shell.portEnv,
123
+ verticalRefs: shell.verticalRefs,
124
+ moduleFederation: {
125
+ role: 'host',
126
+ name: shell.mfName,
127
+ verticalRefs: shell.verticalRefs,
128
+ remotes: resolveRemoteRefs(shell, existingVerticals).map((remote)=>({
129
+ id: remote.id,
130
+ name: remote.mfName,
131
+ manifestUrl: `http://localhost:${remote.port}/mf-manifest.json`
132
+ })),
133
+ ssr: true,
134
+ sharedContractVersion: 'mf-ssr-contract-v1'
135
+ },
136
+ deliveryUnit: shellDeliveryUnitBlock(scope, shell),
137
+ cloudflare: createCloudflareDeployContract(scope, shell),
138
+ ownership: shell.ownership
139
+ });
140
+ writeJsonFile(topologyPath, topology);
141
+ ownership.owners ??= [];
142
+ ownership.owners.push(ownershipEntry(scope, shell));
143
+ writeJsonFile(ownershipPath, ownership);
144
+ preflight.overlay.ports[shell.id] = shell.port;
145
+ writeJsonFile(preflight.overlayPath, preflight.overlay);
146
+ const newPackagePath = node_path.join(options.workspaceRoot, shell.directory, 'package.json');
147
+ const newPackage = readRequiredJsonObject(newPackagePath);
148
+ newPackage.dependencies = {
149
+ ...newPackage.dependencies,
150
+ ...config.inheritedWorkspaceDependencies
151
+ };
152
+ writeJsonFile(newPackagePath, newPackage);
153
+ for (const app of previousApps)ownedIo.write(node_path.join(options.workspaceRoot, app.directory, 'modern.config.ts'), createAppModernConfig(scope, app, 'shell' === app.kind ? resolveRemoteRefs(app, existingVerticals) : existingVerticals, enableTailwind, configuredDevPorts));
154
+ updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, existingVerticals, bridge, allAdditionalShells, existingVerticals, primaryShell, existingAdditionalShells);
155
+ ownedIo.write(node_path.join(options.workspaceRoot, 'tsconfig.json'), `${JSON.stringify(createRootTsConfig([
128
156
  primaryShell,
129
157
  ...existingVerticals,
130
158
  ...allAdditionalShells
131
- ]));
132
- writeGeneratedWorkspaceScripts(options.workspaceRoot, scope, enableTailwind, existingVerticals, void 0, allAdditionalShells, primaryShell);
133
- writeFileReplacing(options.workspaceRoot, 'zerops.yaml', `${createZeropsYaml(scope, [
159
+ ]), null, 2)}\n`);
160
+ writeGeneratedWorkspaceScripts(options.workspaceRoot, {
161
+ io: {
162
+ writeGenerated: ownedIo.write
163
+ }
164
+ });
165
+ ownedIo.write(node_path.join(options.workspaceRoot, 'zerops.yaml'), `${createZeropsYaml(scope, [
134
166
  primaryShell,
135
167
  ...existingVerticals,
136
168
  ...allAdditionalShells
@@ -156,70 +188,39 @@ function executeAddUltramodernShell(options, logicalWorkspaceRoot = options.work
156
188
  });
157
189
  }
158
190
  function planUltramodernShell(options) {
159
- prepareAddUltramodernShell(options);
160
- const tempRoot = node_fs.mkdtempSync(node_path.join(node_os.tmpdir(), 'um-shell-plan-'));
161
- const copiedWorkspaceRoot = node_path.join(tempRoot, 'workspace');
162
- const skippedDirectories = new Set([
163
- '.git',
164
- '.nx',
165
- '.output',
166
- 'coverage',
167
- 'dist',
168
- 'node_modules'
169
- ]);
170
- try {
171
- node_fs.cpSync(options.workspaceRoot, copiedWorkspaceRoot, {
172
- recursive: true,
173
- filter: (sourcePath)=>!skippedDirectories.has(node_path.basename(sourcePath))
174
- });
175
- const plannedResult = addUltramodernShell({
191
+ const preflight = prepareAddUltramodernShell(options);
192
+ let jsonMutations = [];
193
+ const plannedResult = runWorkspaceTransaction(options.workspaceRoot, (stagingRoot)=>executeAddUltramodernShell({
176
194
  ...options,
177
- workspaceRoot: copiedWorkspaceRoot
178
- });
179
- const shell = plannedResult.createdApps[0];
180
- return {
181
- ...plannedResult,
182
- workspaceRoot: options.workspaceRoot,
183
- dryRun: true,
184
- selectedPort: shell?.port ?? 0,
185
- moduleFederationRemote: {
186
- id: shell?.id ?? '',
187
- name: shell?.moduleFederationName ?? '',
188
- manifestUrl: `http://localhost:${shell?.port ?? 0}/mf-manifest.json`
189
- },
190
- jsonMutations: [
191
- {
192
- path: ULTRAMODERN_CONFIG_PATH,
193
- pointer: '/shells/-',
194
- description: `Register additional shell ${shell?.id}`
195
- },
196
- {
197
- path: 'package.json',
198
- pointer: "/scripts",
199
- description: "Enumerate all configured shells in workspace scripts"
200
- },
201
- {
202
- path: 'tsconfig.json',
203
- pointer: '/references',
204
- description: `Add ${shell?.id} to the root TS-Go build graph`
205
- }
206
- ],
207
- shellDependencyChanges: [],
208
- generatedContractChanges: [
209
- {
210
- path: ULTRAMODERN_CONFIG_PATH,
211
- addedAppIds: [
212
- shell?.id ?? ''
213
- ],
214
- shellVerticalRefs: options.verticals ?? []
215
- }
216
- ]
217
- };
218
- } finally{
219
- node_fs.rmSync(tempRoot, {
220
- recursive: true,
221
- force: true
222
- });
223
- }
195
+ workspaceRoot: stagingRoot
196
+ }, options.workspaceRoot), {
197
+ mode: 'preview',
198
+ inspectChanges: (changes)=>{
199
+ jsonMutations = describeJsonChanges(changes);
200
+ }
201
+ });
202
+ const shell = plannedResult.createdApps[0];
203
+ return {
204
+ ...plannedResult,
205
+ workspaceRoot: options.workspaceRoot,
206
+ dryRun: true,
207
+ selectedPort: shell?.port ?? 0,
208
+ moduleFederationRemote: {
209
+ id: shell?.id ?? '',
210
+ name: shell?.moduleFederationName ?? '',
211
+ manifestUrl: `http://localhost:${shell?.port ?? 0}/mf-manifest.json`
212
+ },
213
+ jsonMutations,
214
+ shellDependencyChanges: [],
215
+ generatedContractChanges: [
216
+ {
217
+ path: 'topology/reference-topology.json',
218
+ addedAppIds: [
219
+ shell?.id ?? ''
220
+ ],
221
+ shellVerticalRefs: preflight.shell.verticalRefs ?? []
222
+ }
223
+ ]
224
+ };
224
225
  }
225
226
  export { addUltramodernShell, planUltramodernShell };
@@ -1,22 +1,25 @@
1
1
  import "node:module";
2
+ import node_fs from "node:fs";
2
3
  import node_path from "node:path";
4
+ import { normalizeWorkspaceInputs, preserveUnknownProjectionFields, reconcileGeneratedOverlayUrls } from "../../ultramodern-tooling/config.js";
3
5
  import { rpcPath } from "../api/rpc.js";
4
6
  import { createServerExecutionOverlay } from "../backend-federation.js";
7
+ import { createDevelopmentOverlay } from "../contracts.js";
5
8
  import { createDeliveryUnitRecord, deliveryUnitContractBlock } from "../delivery-unit.js";
6
- import { ULTRAMODERN_CONFIG_PATH, appEmitsBrowserUi, appHasApi, createModuleFederationRemoteContracts, resolveApiPrefix, resolveApiProtocol, shellApp } from "../descriptors.js";
7
- import { formatGeneratedWorkspaceFiles, writeFileReplacing, writeJsonFile } from "../fs-io.js";
9
+ import { appEmitsBrowserUi, appHasApi, createModuleFederationRemoteContracts, resolveApiPrefix, resolveApiProtocol, resolveRemoteRefs } from "../descriptors.js";
10
+ import { formatGeneratedWorkspaceFiles, writeJsonFile } from "../fs-io.js";
8
11
  import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "../generation-result.js";
12
+ import { createAppModernConfig } from "../module-federation.js";
9
13
  import { runCodeSmithOverlays } from "../overlays.js";
10
14
  import { createRootTsConfig } from "../package-json.js";
15
+ import { preserveConsumerWorkspaceArtifacts, workspaceArtifactCandidates, workspaceDevelopmentPorts } from "../workspace-artifact-ownership.js";
11
16
  import { writeGeneratedWorkspaceScripts } from "../workspace-scripts.js";
12
- import { rewriteAppModernConfig } from "../write-app.js";
13
- import { createCompactUltramodernConfig, writeApp } from "../write-workspace.js";
17
+ import { writeApp } from "../write-workspace.js";
14
18
  import { createZeropsYaml } from "../zerops.js";
15
19
  import { prepareAddUltramodernVertical } from "./preflight.js";
16
20
  import { rewriteShellAppFiles, updateRootWorkspaceScripts } from "./shell-files.js";
17
21
  import { ownershipEntry, verticalTopologyEntry } from "./topology.js";
18
22
  import { runWorkspaceTransaction } from "./transaction.js";
19
- import { configuredDevelopmentPorts } from "./workspace-state.js";
20
23
  function addUltramodernVertical(options) {
21
24
  return runWorkspaceTransaction(options.workspaceRoot, (stagingRoot)=>executeAddUltramodernVertical({
22
25
  ...options,
@@ -25,7 +28,24 @@ function addUltramodernVertical(options) {
25
28
  }
26
29
  function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.workspaceRoot) {
27
30
  const beforeFiles = createFileSnapshot(options.workspaceRoot);
28
- const { scope, topologyPath, ownershipPath, overlayPath, topology, ownership, overlay, packageSource, enableTailwind, bridge, primaryShell, additionalShells, targetShell, targetVerticals, vertical, updatedVerticals } = prepareAddUltramodernVertical(options);
31
+ const { scope, config, topologyPath, ownershipPath, overlayPath, topology, ownership, overlay, packageSource, enableTailwind, bridge, primaryShell, additionalShells, targetShell, targetVerticals, vertical, updatedVerticals } = prepareAddUltramodernVertical(options);
32
+ const previousTailwind = config.features?.tailwind !== false;
33
+ const existingVerticals = updatedVerticals.filter((app)=>app.id !== vertical.id);
34
+ const existingIds = new Set(existingVerticals.map((app)=>app.id));
35
+ const previousProjection = (apps)=>apps.map((app)=>app.id === targetShell.id ? {
36
+ ...app,
37
+ verticalRefs: app.verticalRefs?.filter((id)=>existingIds.has(id))
38
+ } : app);
39
+ const previousApps = normalizeWorkspaceInputs(options.workspaceRoot, {
40
+ topology,
41
+ overlay
42
+ }).apps;
43
+ const previousDevPorts = workspaceDevelopmentPorts(previousApps);
44
+ const { io: ownedIo } = preserveConsumerWorkspaceArtifacts(options.workspaceRoot, workspaceArtifactCandidates(scope, previousProjection(previousApps), previousTailwind, previousProjection([
45
+ primaryShell,
46
+ ...existingVerticals,
47
+ ...additionalShells
48
+ ])));
29
49
  const nextTargetShell = {
30
50
  ...targetShell,
31
51
  verticalRefs: targetVerticals.filter(appEmitsBrowserUi).map((remote)=>remote.id)
@@ -35,27 +55,56 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
35
55
  verticalRefs: nextTargetShell.verticalRefs
36
56
  } : primaryShell;
37
57
  const nextAdditionalShells = additionalShells.map((shell)=>shell.id === nextTargetShell.id ? nextTargetShell : shell);
38
- const configuredDevPorts = nextAdditionalShells.length > 0 ? configuredDevelopmentPorts({
39
- ...overlay.ports,
40
- [primaryShell.id]: primaryShell.port,
41
- [vertical.id]: vertical.port
42
- }, nextAdditionalShells).toSorted((left, right)=>left - right) : void 0;
58
+ const configuredDevPorts = workspaceDevelopmentPorts([
59
+ nextPrimaryShell,
60
+ ...updatedVerticals,
61
+ ...nextAdditionalShells
62
+ ], overlay.ports);
43
63
  writeApp(options.workspaceRoot, scope, vertical, packageSource, enableTailwind, updatedVerticals, bridge, configuredDevPorts);
64
+ const newPackagePath = node_path.join(options.workspaceRoot, vertical.directory, 'package.json');
65
+ const newPackage = JSON.parse(node_fs.readFileSync(newPackagePath, 'utf-8'));
66
+ newPackage.dependencies = {
67
+ ...newPackage.dependencies,
68
+ ...config.inheritedWorkspaceDependencies
69
+ };
70
+ writeJsonFile(newPackagePath, newPackage);
44
71
  if (targetShell.id === primaryShell.id) {
45
72
  topology.shell ??= {};
46
- topology.shell.deliveryUnit = deliveryUnitContractBlock(createDeliveryUnitRecord(scope, shellApp));
73
+ topology.shell.deliveryUnit = {
74
+ ...deliveryUnitContractBlock(createDeliveryUnitRecord(scope, primaryShell)),
75
+ ...primaryShell.deliveryUnit,
76
+ ...topology.shell.deliveryUnit
77
+ };
47
78
  topology.shell.verticalRefs = nextTargetShell.verticalRefs;
48
79
  topology.shell.moduleFederation ??= {};
49
- topology.shell.moduleFederation.remotes = createModuleFederationRemoteContracts(nextPrimaryShell, updatedVerticals).map((remote)=>({
80
+ topology.shell.moduleFederation.remotes = preserveAuthoredRemoteUrls(topology.shell.moduleFederation.remotes, createModuleFederationRemoteContracts({
81
+ ...primaryShell,
82
+ verticalRefs: primaryShell.verticalRefs?.filter((id)=>existingIds.has(id))
83
+ }, existingVerticals), createModuleFederationRemoteContracts(nextPrimaryShell, updatedVerticals)).map((remote)=>({
50
84
  id: remote.id,
51
85
  name: remote.name,
52
86
  manifestUrl: remote.manifestUrl
53
87
  }));
54
88
  }
55
89
  topology.verticals ??= [];
90
+ topology.verticals = topology.verticals.map((entry)=>{
91
+ const app = existingVerticals.find((app)=>app.id === entry.id);
92
+ if (!app) return entry;
93
+ const projected = verticalTopologyEntry(scope, app, updatedVerticals);
94
+ return {
95
+ ...entry,
96
+ moduleFederation: preserveUnknownProjectionFields(entry.moduleFederation, projected.moduleFederation),
97
+ ...projected.backendFederation ? {
98
+ backendFederation: preserveUnknownProjectionFields(entry.backendFederation, projected.backendFederation)
99
+ } : {}
100
+ };
101
+ });
56
102
  topology.verticals.push(verticalTopologyEntry(scope, vertical));
57
103
  ownership.owners ??= [];
58
104
  ownership.owners.push(ownershipEntry(scope, vertical));
105
+ const projectedOverlay = createDevelopmentOverlay(scope, existingVerticals);
106
+ Object.assign(overlay, reconcileGeneratedOverlayUrls(overlay, createDevelopmentOverlay(scope, previousApps.filter((app)=>'shell' !== app.kind)), projectedOverlay));
107
+ overlay.serverExecution = preserveUnknownProjectionFields(overlay.serverExecution, projectedOverlay.serverExecution);
59
108
  overlay.ports[vertical.id] = vertical.port;
60
109
  overlay.manifests ??= {};
61
110
  if (appEmitsBrowserUi(vertical)) overlay.manifests[vertical.id] = `http://localhost:${vertical.port}/mf-manifest.json`;
@@ -69,13 +118,20 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
69
118
  writeJsonFile(topologyPath, topology);
70
119
  writeJsonFile(ownershipPath, ownership);
71
120
  writeJsonFile(overlayPath, overlay);
72
- writeJsonFile(node_path.join(options.workspaceRoot, ULTRAMODERN_CONFIG_PATH), createCompactUltramodernConfig(scope, options.modernVersion, packageSource, [
73
- {
74
- ...nextPrimaryShell
75
- },
76
- ...updatedVerticals
77
- ], enableTailwind, bridge, nextAdditionalShells, nextPrimaryShell));
78
- writeFileReplacing(options.workspaceRoot, 'zerops.yaml', `${createZeropsYaml(scope, [
121
+ if (targetShell.id !== primaryShell.id) {
122
+ topology.shells = (topology.shells ?? []).map((entry)=>entry.id === nextTargetShell.id ? updateShellComposition(entry, {
123
+ verticalRefs: nextTargetShell.verticalRefs,
124
+ moduleFederation: {
125
+ verticalRefs: nextTargetShell.verticalRefs,
126
+ remotes: preserveAuthoredRemoteUrls(entry.moduleFederation?.remotes, createModuleFederationRemoteContracts({
127
+ ...targetShell,
128
+ verticalRefs: targetShell.verticalRefs?.filter((id)=>existingIds.has(id))
129
+ }, existingVerticals), createModuleFederationRemoteContracts(nextTargetShell, updatedVerticals))
130
+ }
131
+ }) : entry);
132
+ writeJsonFile(topologyPath, topology);
133
+ }
134
+ ownedIo.write(node_path.join(options.workspaceRoot, 'zerops.yaml'), `${createZeropsYaml(scope, [
79
135
  nextPrimaryShell,
80
136
  ...updatedVerticals,
81
137
  ...nextAdditionalShells
@@ -83,20 +139,29 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
83
139
  for (const shellToRefresh of [
84
140
  nextPrimaryShell,
85
141
  ...nextAdditionalShells
86
- ])rewriteShellAppFiles(options.workspaceRoot, scope, packageSource, enableTailwind, updatedVerticals, bridge, shellToRefresh.id === nextTargetShell.id ? nextTargetShell : shellToRefresh, configuredDevPorts);
87
- writeGeneratedWorkspaceScripts(options.workspaceRoot, scope, enableTailwind, updatedVerticals, void 0, nextAdditionalShells, nextPrimaryShell);
88
- updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, updatedVerticals, bridge, nextAdditionalShells);
89
- writeJsonFile(node_path.join(options.workspaceRoot, 'tsconfig.json'), createRootTsConfig([
142
+ ])rewriteShellAppFiles(options.workspaceRoot, scope, packageSource, enableTailwind, updatedVerticals, bridge, shellToRefresh.id === nextTargetShell.id ? nextTargetShell : shellToRefresh, configuredDevPorts, {
143
+ shell: previousProjection(previousApps).find((app)=>app.id === shellToRefresh.id),
144
+ remotes: existingVerticals,
145
+ devPorts: previousDevPorts,
146
+ enableTailwind: previousTailwind
147
+ });
148
+ writeGeneratedWorkspaceScripts(options.workspaceRoot, {
149
+ io: {
150
+ writeGenerated: ownedIo.write
151
+ }
152
+ });
153
+ updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, updatedVerticals, bridge, nextAdditionalShells, existingVerticals, nextPrimaryShell);
154
+ ownedIo.write(node_path.join(options.workspaceRoot, 'tsconfig.json'), `${JSON.stringify(createRootTsConfig([
90
155
  nextPrimaryShell,
91
156
  ...updatedVerticals,
92
157
  ...nextAdditionalShells
93
- ]));
158
+ ]), null, 2)}\n`);
94
159
  if (configuredDevPorts) {
95
160
  for (const app of [
96
161
  nextPrimaryShell,
97
162
  ...updatedVerticals,
98
163
  ...nextAdditionalShells
99
- ])if (app.id !== vertical.id && app.id !== nextTargetShell.id) rewriteAppModernConfig(options.workspaceRoot, scope, app, updatedVerticals, enableTailwind, configuredDevPorts);
164
+ ])if (app.id !== vertical.id && app.id !== nextTargetShell.id) ownedIo.write(node_path.join(options.workspaceRoot, app.directory, 'modern.config.ts'), createAppModernConfig(scope, app, 'shell' === app.kind ? resolveRemoteRefs(app, updatedVerticals) : updatedVerticals, enableTailwind, configuredDevPorts));
100
165
  }
101
166
  const preliminaryAfterFiles = createFileSnapshot(options.workspaceRoot);
102
167
  const preliminaryDiff = diffFileSnapshots(beforeFiles, preliminaryAfterFiles);
@@ -136,4 +201,31 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
136
201
  rewrittenPaths
137
202
  });
138
203
  }
139
- export { addUltramodernVertical };
204
+ function updateShellComposition(current, generated) {
205
+ const previousRemotes = Array.isArray(current.moduleFederation?.remotes) ? current.moduleFederation.remotes : [];
206
+ return {
207
+ ...current,
208
+ ...Array.isArray(generated.verticalRefs) ? {
209
+ verticalRefs: generated.verticalRefs
210
+ } : {},
211
+ moduleFederation: {
212
+ ...current.moduleFederation,
213
+ verticalRefs: generated.moduleFederation.verticalRefs,
214
+ remotes: generated.moduleFederation.remotes.map((remote)=>({
215
+ ...previousRemotes.find((previous)=>previous.id === remote.id),
216
+ ...remote
217
+ }))
218
+ }
219
+ };
220
+ }
221
+ function preserveAuthoredRemoteUrls(current, previousGenerated, nextGenerated) {
222
+ return nextGenerated.map((remote)=>{
223
+ const previous = Array.isArray(current) ? current.find((entry)=>entry.id === remote.id) : void 0;
224
+ const generated = previousGenerated.find((entry)=>entry.id === remote.id);
225
+ return previous?.manifestUrl && previous.manifestUrl !== generated?.manifestUrl ? {
226
+ ...remote,
227
+ manifestUrl: previous.manifestUrl
228
+ } : remote;
229
+ });
230
+ }
231
+ export { addUltramodernVertical, executeAddUltramodernVertical };