@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,75 +1,46 @@
1
1
  import "node:module";
2
2
  import node_path from "node:path";
3
3
  import { readUltramodernConfig, workspaceAppsFromToolingConfig } from "../config.js";
4
- import { runRenderedModule } from "./context.js";
4
+ import { spawnNodeScript } from "./context.js";
5
5
  import { readOption } from "./options.js";
6
6
  const resolveRoutesGenerateTargets = (args, context)=>{
7
7
  const appId = readOption(args, '--app');
8
- const targets = workspaceAppsFromToolingConfig(readUltramodernConfig(context.workspaceRoot)).filter((app)=>!appId || app.id === appId).map((app)=>({
8
+ const targets = workspaceAppsFromToolingConfig(readUltramodernConfig(context.workspaceRoot), context.workspaceRoot).filter((app)=>!appId || app.id === appId).map((app)=>({
9
9
  label: app.id,
10
10
  appDirectory: node_path.join(context.workspaceRoot, app.directory)
11
11
  }));
12
12
  if (0 === targets.length) throw new Error(`No generated UltraModern app matched ${appId ?? '<any>'}.`);
13
13
  return targets;
14
14
  };
15
- const renderRoutesGenerateModule = ({ workspaceRoot, targets })=>`
16
- import { createRequire } from 'node:module';
17
- import path from 'node:path';
18
- import { pathToFileURL } from 'node:url';
19
-
20
- const workspaceRoot = ${JSON.stringify(workspaceRoot)};
21
- const targets = ${JSON.stringify(targets, null, 2)};
22
- const appRequire = createRequire(path.join(workspaceRoot, 'package.json'));
23
- const pluginUrl = pathToFileURL(
24
- appRequire.resolve('@modern-js/plugin-tanstack'),
25
- ).href;
26
- const { generateTanstackRouteArtifacts } = await import(pluginUrl);
27
-
28
- let failed = false;
29
- // Sequential — the app-tools cli singleton is not re-entrant.
30
- for (const target of targets) {
31
- try {
32
- await generateTanstackRouteArtifacts({ appDirectory: target.appDirectory });
33
- console.log(\`[ultramodern] TanStack route artifacts generated: \${target.label}\`);
34
- } catch (error) {
35
- failed = true;
36
- console.error(\`[ultramodern] TanStack route generation failed: \${target.label}\`);
37
- // Print the full underlying failure, including the cause chain. The
38
- // route-generate crash is often an opaque node error thrown deep inside
39
- // app-tools/plugin (e.g. a path TypeError), so surfacing only
40
- // \`error.message\` swallows the stack that points at the real culprit.
41
- let current = error;
42
- let depth = 0;
43
- while (current) {
44
- const label = depth === 0 ? '-' : ' caused by:';
45
- const detail =
46
- current instanceof Error
47
- ? current.stack ?? \`\${current.name}: \${current.message}\`
48
- : String(current);
49
- console.error(\`\${label} \${detail}\`);
50
- current = current instanceof Error ? current.cause : undefined;
51
- depth += 1;
52
- }
53
- }
54
- }
55
-
56
- process.exit(failed ? 1 : 0);
57
- `;
58
15
  function runRoutesGenerate(args, context) {
59
16
  if (args.includes('--help') || args.includes('-h')) {
60
17
  process.stdout.write(`Usage:
61
- ultramodern-create ultramodern routes-generate [--app <id>]
18
+ ultramodern-create ultramodern routes-generate [--app <id>] [--manifest-only]
19
+
20
+ Regenerates src/routes/ultramodern-route-metadata.ts from the app's
21
+ route.meta.ts files and the TanStack route artifacts (router.gen.ts,
22
+ register.gen.d.ts) for generated UltraModern apps without running dev or build.
23
+ Without --app, every generated workspace app is regenerated.
62
24
 
63
- Regenerates TanStack route artifacts (router.gen.ts, register.gen.d.ts) for
64
- generated UltraModern apps without running dev or build. Without --app, every
65
- generated workspace app is regenerated.
25
+ --manifest-only writes only the route metadata manifest. It never loads the
26
+ app config, so app dev and build scripts run it before \`modern dev\` and
27
+ \`modern build\`, which regenerate the router artifacts themselves.
66
28
  `);
67
29
  return 0;
68
30
  }
69
- const source = renderRoutesGenerateModule({
70
- workspaceRoot: context.workspaceRoot,
71
- targets: resolveRoutesGenerateTargets(args, context)
72
- });
73
- return runRenderedModule(source, context);
31
+ const targets = resolveRoutesGenerateTargets(args, context);
32
+ const mode = args.includes('--manifest-only') ? 'manifest' : 'all';
33
+ let failed = false;
34
+ for (const target of targets){
35
+ const status = spawnNodeScript('dist/esm-node/ultramodern-tooling/commands/routes-generate-app.js', [
36
+ target.appDirectory,
37
+ target.label,
38
+ mode
39
+ ], context, {
40
+ cwd: target.appDirectory
41
+ });
42
+ failed ||= 0 !== status;
43
+ }
44
+ return failed ? 1 : 0;
74
45
  }
75
46
  export { runRoutesGenerate };
@@ -1,16 +1,10 @@
1
1
  import "node:module";
2
- import { readWorkspaceReleaseCohort } from "../../ultramodern-release-cohort.js";
3
- import { createWorkspaceValidationScript } from "../../ultramodern-workspace/workspace-scripts.js";
4
- import { additionalShellsFromToolingConfig, readUltramodernConfig, workspaceAppsFromToolingConfig } from "../config.js";
5
- import { runRenderedModule } from "./context.js";
2
+ import { validateWorkspace } from "../../ultramodern-workspace/validation/workspace.js";
3
+ import { createWorkspaceValidationContract } from "../../ultramodern-workspace/workspace-validation-contract.js";
4
+ import { readUltramodernWorkspaceInputs } from "../config.js";
6
5
  function runValidate(context) {
7
- const config = readUltramodernConfig(context.workspaceRoot);
8
- const apps = workspaceAppsFromToolingConfig(config);
9
- const remotes = apps.filter((app)=>'shell' !== app.kind);
10
- const primaryShell = apps.find((app)=>'shell' === app.kind);
11
- const additionalShells = additionalShellsFromToolingConfig(config);
12
- const releaseCohort = config.packageSource?.strategy === 'install' ? readWorkspaceReleaseCohort(context.workspaceRoot) : void 0;
13
- const source = createWorkspaceValidationScript(config.workspace.packageScope, config.features.tailwind, remotes, releaseCohort, additionalShells, primaryShell);
14
- return runRenderedModule(source, context);
6
+ const { config, raw, verticals, primaryShell, additionalShells } = readUltramodernWorkspaceInputs(context.workspaceRoot);
7
+ validateWorkspace(context.workspaceRoot, createWorkspaceValidationContract(config.workspace.packageScope, config.features.tailwind, raw.topology.sharedPackages, verticals, additionalShells, primaryShell));
8
+ return 0;
15
9
  }
16
10
  export { runValidate };
@@ -1,10 +1,10 @@
1
1
  import "node:module";
2
+ import node_fs from "node:fs";
2
3
  import node_path from "node:path";
3
4
  import { GENERATED_TOOLING_COMMANDS } from "../ultramodern-workspace/tooling-command-catalog.js";
4
5
  import { runCloudflareOutputVerify } from "./commands/cloudflare-output-verify.js";
5
- import { printHelp, runTemplateBackedToolingCommand } from "./commands/context.js";
6
+ import { AD_HOC_TOOLING_COMMANDS, printHelp, runTemplateBackedToolingCommand } from "./commands/context.js";
6
7
  import { runMfTypes } from "./commands/mf-types.js";
7
- import { runMigrateStrictEffect } from "./commands/migrate-strict-effect.js";
8
8
  import { runRoutesGenerate } from "./commands/routes-generate.js";
9
9
  import { runSkills } from "./commands/skills.js";
10
10
  import { runSyncDeliveryUnit } from "./commands/sync-delivery-unit.js";
@@ -12,8 +12,16 @@ import { runValidate } from "./commands/validate.js";
12
12
  async function runUltramodernToolingCli(args, workspaceRoot = process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd()) {
13
13
  try {
14
14
  const [command, ...rest] = args;
15
+ let discoveredRoot = node_path.resolve(workspaceRoot);
16
+ for(let candidate = discoveredRoot;; candidate = node_path.dirname(candidate)){
17
+ if (node_fs.existsSync(node_path.join(candidate, 'topology/reference-topology.json'))) {
18
+ discoveredRoot = candidate;
19
+ break;
20
+ }
21
+ if (node_path.dirname(candidate) === candidate) break;
22
+ }
15
23
  const context = {
16
- workspaceRoot: node_path.resolve(workspaceRoot),
24
+ workspaceRoot: discoveredRoot,
17
25
  invocationCwd: process.cwd()
18
26
  };
19
27
  switch(command){
@@ -26,15 +34,13 @@ async function runUltramodernToolingCli(args, workspaceRoot = process.env.ULTRAM
26
34
  return runValidate(context);
27
35
  case GENERATED_TOOLING_COMMANDS.mfTypes.command:
28
36
  return runMfTypes(rest, context);
29
- case GENERATED_TOOLING_COMMANDS.migrateStrictEffect.command:
30
- return await runMigrateStrictEffect(rest, context);
31
37
  case GENERATED_TOOLING_COMMANDS.cloudflareOutputVerify.command:
32
- return runCloudflareOutputVerify(rest, context);
38
+ return await runCloudflareOutputVerify(rest, context);
33
39
  case GENERATED_TOOLING_COMMANDS.routesGenerate.command:
34
- return runRoutesGenerate(rest, context);
35
- case 'sync-delivery-unit':
40
+ return await runRoutesGenerate(rest, context);
41
+ case AD_HOC_TOOLING_COMMANDS.syncDeliveryUnit:
36
42
  return runSyncDeliveryUnit(rest, context);
37
- case 'skills':
43
+ case AD_HOC_TOOLING_COMMANDS.skills:
38
44
  return runSkills(rest, context);
39
45
  default:
40
46
  {
@@ -1,8 +1,6 @@
1
1
  import "node:module";
2
- export * from "./constants.js";
3
2
  export * from "./json.js";
4
3
  export * from "./load.js";
5
4
  export * from "./metadata.js";
6
5
  export * from "./normalize.js";
7
- export * from "./synthesize.js";
8
6
  export * from "./types.js";
@@ -1,14 +1,14 @@
1
1
  import "node:module";
2
- import node_fs from "node:fs";
3
2
  import node_path from "node:path";
4
- import { ULTRAMODERN_CONFIG_PATH } from "../../ultramodern-workspace/descriptors.js";
5
- import { LEGACY_GENERATED_CONTRACT_PATH } from "./constants.js";
6
3
  import { readJsonObject } from "./json.js";
7
- import { normalizeCompactConfig } from "./normalize.js";
4
+ import { normalizeWorkspaceInputs } from "./normalize.js";
8
5
  function readUltramodernConfig(workspaceRoot = process.cwd()) {
9
- const compactPath = node_path.join(workspaceRoot, ULTRAMODERN_CONFIG_PATH);
10
- if (node_fs.existsSync(compactPath)) return normalizeCompactConfig(workspaceRoot, compactPath, readJsonObject(compactPath));
11
- if (node_fs.existsSync(node_path.join(workspaceRoot, LEGACY_GENERATED_CONTRACT_PATH))) throw new Error(`Missing ${ULTRAMODERN_CONFIG_PATH}. Legacy UltraModern metadata detected — run \`ultramodern-create ultramodern migrate-strict-effect\` to synthesize it.`);
12
- throw new Error(`Missing UltraModern config. Expected ${ULTRAMODERN_CONFIG_PATH}. Run \`ultramodern-create ultramodern migrate-strict-effect\` if you have legacy UltraModern metadata to migrate.`);
6
+ return readUltramodernWorkspaceInputs(workspaceRoot).config;
13
7
  }
14
- export { readUltramodernConfig };
8
+ function readUltramodernWorkspaceInputs(workspaceRoot = process.cwd(), inputs = {}) {
9
+ return normalizeWorkspaceInputs(workspaceRoot, {
10
+ topology: inputs.topology ?? readJsonObject(node_path.join(workspaceRoot, 'topology/reference-topology.json')),
11
+ overlay: inputs.overlay ?? readJsonObject(node_path.join(workspaceRoot, 'topology/local-overlays/development.json'))
12
+ });
13
+ }
14
+ export { readUltramodernConfig, readUltramodernWorkspaceInputs };
@@ -1,38 +1,43 @@
1
1
  import "node:module";
2
2
  import node_fs from "node:fs";
3
3
  import node_path from "node:path";
4
- import { LEGACY_DEVELOPMENT_OVERLAY_PATH, LEGACY_PACKAGE_SOURCE_METADATA_PATH } from "./constants.js";
5
- import { readJsonObject, readOptionalJsonObject } from "./json.js";
4
+ import { yaml } from "@modern-js/utils";
5
+ import { readOptionalJsonObject } from "./json.js";
6
6
  function packageScopeFromRoot(workspaceRoot) {
7
7
  const rootPackage = readOptionalJsonObject(node_path.join(workspaceRoot, 'package.json'));
8
8
  return 'string' == typeof rootPackage.name && rootPackage.name.length > 0 ? rootPackage.name : node_path.basename(workspaceRoot);
9
9
  }
10
- function packageSourceFromMetadata(workspaceRoot) {
11
- const metadataPath = node_path.join(workspaceRoot, LEGACY_PACKAGE_SOURCE_METADATA_PATH);
12
- if (!node_fs.existsSync(metadataPath)) return;
13
- const metadata = readJsonObject(metadataPath);
14
- const aliases = metadata.modernPackages?.aliases ?? {};
15
- const firstAliasEntry = Object.entries(aliases).find((entry)=>'string' == typeof entry[1]);
16
- const firstPackage = firstAliasEntry?.[0];
17
- const firstAlias = firstAliasEntry?.[1];
18
- const aliasScope = firstAlias?.match(/^@([^/]+)\//u)?.[1];
19
- const unscopedName = firstPackage?.split('/').at(-1) ?? '';
20
- const aliasUnscopedName = firstAlias?.split('/').at(-1) ?? '';
21
- const aliasPackageNamePrefix = aliasUnscopedName && unscopedName && aliasUnscopedName.endsWith(unscopedName) ? aliasUnscopedName.slice(0, -unscopedName.length) : void 0;
10
+ function readWorkspacePackageSource(workspaceRoot) {
11
+ const manifest = readOptionalJsonObject(node_path.join(workspaceRoot, 'package.json'));
12
+ const name = '@modern-js/ultramodern-create';
13
+ let request = manifest.devDependencies?.[name] ?? manifest.dependencies?.[name];
14
+ if ('string' != typeof request) throw new Error(`Missing ${name} dependency in package.json.`);
15
+ if (request.startsWith('catalog:')) {
16
+ const config = yaml.load(node_fs.readFileSync(node_path.join(workspaceRoot, 'pnpm-workspace.yaml'), 'utf8'));
17
+ const catalog = request.slice(8);
18
+ request = (catalog ? config.catalogs?.[catalog] : config.catalog)?.[name];
19
+ if ('string' != typeof request) throw new Error(`Missing ${name} in pnpm catalog ${catalog || 'default'}.`);
20
+ }
21
+ if (request.startsWith('workspace:')) return {
22
+ strategy: 'workspace',
23
+ modernPackageVersion: 'workspace:*'
24
+ };
25
+ const alias = /^npm:@([^/]+)\/([^@]+)@([^@]+)$/u.exec(request);
26
+ if (alias) {
27
+ const [, aliasScope, target, modernPackageVersion] = alias;
28
+ const suffix = 'ultramodern-create';
29
+ if (!target.endsWith(suffix)) throw new Error(`Unsupported framework package alias: ${request}.`);
30
+ return {
31
+ strategy: 'install',
32
+ modernPackageVersion,
33
+ aliasScope,
34
+ aliasPackageNamePrefix: target.slice(0, -suffix.length)
35
+ };
36
+ }
37
+ if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(request)) throw new Error(`Framework dependency must use an exact version or workspace source: ${request}.`);
22
38
  return {
23
- strategy: 'install' === metadata.strategy ? 'install' : 'workspace',
24
- modernPackageVersion: 'string' == typeof metadata.modernPackages?.specifier ? metadata.modernPackages.specifier : 'workspace:*',
25
- registry: 'string' == typeof metadata.modernPackages?.registry ? metadata.modernPackages.registry : void 0,
26
- aliasScope,
27
- aliasPackageNamePrefix
39
+ strategy: 'install',
40
+ modernPackageVersion: request
28
41
  };
29
42
  }
30
- function readOverlayPorts(workspaceRoot) {
31
- const overlayPath = node_path.join(workspaceRoot, LEGACY_DEVELOPMENT_OVERLAY_PATH);
32
- if (!node_fs.existsSync(overlayPath)) return {};
33
- const overlay = readJsonObject(overlayPath);
34
- const ports = overlay.ports;
35
- if (null === ports || 'object' != typeof ports || Array.isArray(ports)) return {};
36
- return Object.fromEntries(Object.entries(ports).filter((entry)=>'number' == typeof entry[1]));
37
- }
38
- export { packageScopeFromRoot, packageSourceFromMetadata, readOverlayPorts };
43
+ export { packageScopeFromRoot, readWorkspacePackageSource };
@@ -1,174 +1,177 @@
1
1
  import "node:module";
2
+ import node_fs from "node:fs";
2
3
  import node_path from "node:path";
3
- import { normalizeUltramodernBridgeConfig } from "../../ultramodern-workspace/bridge-config.js";
4
- import { ULTRAMODERN_CONFIG_PATH, createNeutralOwnership, shellApp } from "../../ultramodern-workspace/descriptors.js";
5
- import { toKebabCase } from "../../ultramodern-workspace/naming.js";
6
- import { resolveConfiguredAdditionalShells } from "../../ultramodern-workspace/shells.js";
7
- import { isVerticalApiProtocol, isVerticalPreset, isWorkspaceDeliveryUnitKind } from "../../ultramodern-workspace/types.js";
8
- import { packageScopeFromRoot } from "./metadata.js";
9
- class UnsupportedUltramodernConfigError extends Error {
10
- constructor(sourcePath, issue){
11
- const value = formatUnsupportedConfigValue(issue.value);
12
- const message = 'schemaVersion' === issue.field ? formatSchemaVersionError(sourcePath, issue.reason, value) : `Unsupported UltraModern config app kind ${value} at ${sourcePath} topology.apps[${issue.index}].kind. Supported kinds: shell, vertical.`;
13
- super(message), this.sourcePath = sourcePath, this.issue = issue;
14
- this.name = 'UnsupportedUltramodernConfigError';
15
- }
16
- }
17
- function normalizeCompactConfig(workspaceRoot, sourcePath, config) {
18
- const schemaVersion = config.schemaVersion;
19
- if (1 !== schemaVersion) throw new UnsupportedUltramodernConfigError(sourcePath, {
20
- field: 'schemaVersion',
21
- value: schemaVersion,
22
- reason: void 0 === schemaVersion ? 'missing' : Number.isInteger(schemaVersion) ? 'unsupported' : 'non-integer'
4
+ import { verticalsFromTopology } from "../../ultramodern-workspace/add-vertical/topology.js";
5
+ import { createNeutralOwnership, shellApp } from "../../ultramodern-workspace/descriptors.js";
6
+ import { readModuleFederationExposePaths } from "../../ultramodern-workspace/mf-validation.js";
7
+ import { toEnvSegment } from "../../ultramodern-workspace/naming.js";
8
+ import { readJsonObject } from "./json.js";
9
+ import { packageScopeFromRoot, readWorkspacePackageSource } from "./metadata.js";
10
+ function normalizeWorkspaceInputs(workspaceRoot, inputs) {
11
+ const { topology, overlay } = inputs;
12
+ if (1 !== topology.schemaVersion || !topology.shell || !Array.isArray(topology.verticals) || void 0 !== topology.shells && !Array.isArray(topology.shells)) throw new Error('Invalid topology/reference-topology.json: expected schemaVersion 1, shell, verticals and optional shells.');
13
+ if (1 !== overlay.schemaVersion || !overlay.ports || 'object' != typeof overlay.ports) throw new Error('Invalid development overlay: expected schemaVersion 1 and ports.');
14
+ const records = [
15
+ topology.shell,
16
+ ...topology.verticals,
17
+ ...topology.shells ?? []
18
+ ];
19
+ const ids = new Set();
20
+ const paths = new Set();
21
+ const ports = new Map();
22
+ const root = node_fs.realpathSync(workspaceRoot);
23
+ const manifests = new Map();
24
+ const apps = records.map((entry, index)=>{
25
+ if ('string' != typeof entry.id || !entry.id || ids.has(entry.id)) throw new Error(`Missing or duplicate topology app id: ${entry.id}.`);
26
+ ids.add(entry.id);
27
+ if ('string' != typeof entry.path || !entry.path || node_path.isAbsolute(entry.path)) throw new Error(`Topology ${entry.id} requires a relative path.`);
28
+ const appRoot = node_fs.realpathSync(node_path.resolve(root, entry.path));
29
+ const relative = node_path.relative(root, appRoot);
30
+ if (!relative || '..' === relative || relative.startsWith(`..${node_path.sep}`) || node_path.isAbsolute(relative) || paths.has(appRoot)) throw new Error(`Topology ${entry.id} has an unsafe or duplicate path: ${entry.path}.`);
31
+ paths.add(appRoot);
32
+ const manifest = readJsonObject(node_path.join(appRoot, 'package.json'));
33
+ if ('string' != typeof manifest.name || !manifest.name || void 0 !== entry.package && manifest.name !== entry.package) throw new Error(`Topology ${entry.id} package identity disagrees with ${entry.path}/package.json.`);
34
+ manifests.set(entry.id, manifest);
35
+ const port = overlay.ports[entry.id];
36
+ if (!Number.isInteger(port) || port < 1 || port > 65535 || ports.has(port)) throw new Error(`Invalid or duplicate development port for ${entry.id}: ${port}.`);
37
+ ports.set(port, entry.id);
38
+ const isShell = 0 === index || index > topology.verticals.length;
39
+ if (entry.kind !== (isShell ? 'shell' : 'vertical')) throw new Error(`Invalid topology app kind for ${entry.id}.`);
40
+ const packageSuffix = manifest.name.split('/').at(-1);
41
+ if (isShell) return {
42
+ ...shellApp,
43
+ id: entry.id,
44
+ directory: entry.path,
45
+ packageSuffix,
46
+ displayName: entry.displayName ?? entry.id,
47
+ port,
48
+ portEnv: entry.portEnv ?? (entry.id === shellApp.id ? shellApp.portEnv : `SHELL_${toEnvSegment(entry.id.replace(/^shell-/u, ''))}_PORT`),
49
+ mfName: entry.moduleFederation?.name ?? entry.id,
50
+ verticalRefs: entry.verticalRefs ?? entry.moduleFederation?.verticalRefs ?? [],
51
+ ...entry.deliveryUnit ? {
52
+ deliveryUnit: entry.deliveryUnit
53
+ } : {},
54
+ ownership: entry.ownership ?? createNeutralOwnership(entry.id, 'tier-0-shell')
55
+ };
56
+ const [app] = verticalsFromTopology({
57
+ verticals: [
58
+ entry
59
+ ]
60
+ }, overlay.ports);
61
+ const actualExposes = readModuleFederationExposePaths(workspaceRoot, entry.path);
62
+ return {
63
+ ...app,
64
+ packageSuffix,
65
+ ...actualExposes ? {
66
+ exposes: actualExposes
67
+ } : {}
68
+ };
23
69
  });
24
- return normalizeCompactConfigV1(workspaceRoot, sourcePath, config);
25
- }
26
- function normalizeCompactConfigV1(workspaceRoot, sourcePath, config) {
27
- const packageSource = config.packageSource && 'object' == typeof config.packageSource ? {
28
- strategy: 'install' === config.packageSource.strategy ? 'install' : 'workspace',
29
- modernPackageVersion: 'string' == typeof config.packageSource.modernPackageVersion ? config.packageSource.modernPackageVersion : 'workspace:*',
30
- registry: 'string' == typeof config.packageSource.registry ? config.packageSource.registry : void 0,
31
- aliasScope: 'string' == typeof config.packageSource.aliasScope ? config.packageSource.aliasScope : void 0,
32
- aliasPackageNamePrefix: 'string' == typeof config.packageSource.aliasPackageNamePrefix ? config.packageSource.aliasPackageNamePrefix : void 0
33
- } : void 0;
34
- return {
35
- schemaVersion: 1,
36
- profile: 'string' == typeof config.profile ? config.profile : void 0,
37
- source: 'compact',
38
- sourcePath,
70
+ const knownPackages = new Set([
71
+ ...[
72
+ ...manifests.values()
73
+ ].map((manifest)=>manifest.name),
74
+ ...(topology.sharedPackages ?? []).map((entry)=>entry.package)
75
+ ]);
76
+ const primaryManifest = manifests.get(apps[0].id);
77
+ const inheritedWorkspaceDependencies = Object.fromEntries(Object.entries(primaryManifest.dependencies ?? {}).filter(([name, value])=>'string' == typeof value && value.startsWith('workspace:') && !name.startsWith('@modern-js/') && !knownPackages.has(name)));
78
+ const config = {
39
79
  workspace: {
40
- packageScope: 'string' == typeof config.workspace?.packageScope ? config.workspace.packageScope : packageScopeFromRoot(workspaceRoot)
80
+ packageScope: packageScopeFromRoot(workspaceRoot)
41
81
  },
42
- packageSource,
82
+ packageSource: readWorkspacePackageSource(workspaceRoot),
43
83
  features: {
44
- tailwind: config.features?.tailwind !== false
84
+ tailwind: Boolean(primaryManifest.devDependencies?.tailwindcss ?? primaryManifest.dependencies?.tailwindcss)
45
85
  },
46
- bridge: normalizeUltramodernBridgeConfig(config.bridge),
86
+ inheritedWorkspaceDependencies,
47
87
  topology: {
48
- apps: Array.isArray(config.topology?.apps) ? config.topology.apps.map((app, index)=>{
49
- if ('shell' !== app.kind && 'vertical' !== app.kind) throw new UnsupportedUltramodernConfigError(sourcePath, {
50
- field: 'topology.apps.kind',
51
- index,
52
- value: app.kind
53
- });
54
- return {
55
- id: String(app.id),
88
+ apps: apps.map((app)=>({
89
+ id: app.id,
56
90
  kind: app.kind,
57
- path: 'string' == typeof app.path ? app.path : '.',
58
- package: 'string' == typeof app.package ? app.package : void 0,
59
- packageSuffix: 'string' == typeof app.packageSuffix ? app.packageSuffix : void 0,
60
- displayName: 'string' == typeof app.displayName ? app.displayName : void 0,
61
- domain: 'string' == typeof app.domain ? app.domain : void 0,
62
- ...isVerticalPreset(app.surfaceProfile) ? {
63
- surfaceProfile: app.surfaceProfile
64
- } : {},
65
- ...isWorkspaceDeliveryUnitKind(app.deliveryUnitKind) ? {
66
- deliveryUnitKind: app.deliveryUnitKind
67
- } : {},
68
- port: 'number' == typeof app.port ? app.port : void 0,
69
- portEnv: 'string' == typeof app.portEnv ? app.portEnv : void 0,
70
- moduleFederation: app.moduleFederation && 'object' == typeof app.moduleFederation ? {
71
- role: 'remote' === app.moduleFederation.role ? 'remote' : 'host',
72
- name: 'string' == typeof app.moduleFederation.name ? app.moduleFederation.name : void 0,
73
- exposes: Array.isArray(app.moduleFederation.exposes) ? app.moduleFederation.exposes.filter((expose)=>'string' == typeof expose) : void 0,
74
- exposePaths: null === app.moduleFederation.exposePaths || 'object' != typeof app.moduleFederation.exposePaths || Array.isArray(app.moduleFederation.exposePaths) ? void 0 : Object.fromEntries(Object.entries(app.moduleFederation.exposePaths).filter((entry)=>'string' == typeof entry[0] && 'string' == typeof entry[1])),
75
- verticalRefs: Array.isArray(app.moduleFederation.verticalRefs) ? app.moduleFederation.verticalRefs.filter((ref)=>'string' == typeof ref) : void 0,
76
- hostOnly: true === app.moduleFederation.hostOnly,
77
- noExposes: true === app.moduleFederation.noExposes
78
- } : void 0,
79
- api: app.api && 'object' == typeof app.api ? {
80
- stem: 'string' == typeof app.api.stem ? app.api.stem : String(app.id),
81
- prefix: 'string' == typeof app.api.prefix ? app.api.prefix : `/${String(app.id)}-api`,
82
- consumedBy: Array.isArray(app.api.consumedBy) ? app.api.consumedBy.filter((consumer)=>'string' == typeof consumer) : [
83
- shellApp.id,
84
- String(app.id)
85
- ],
86
- ...isVerticalApiProtocol(app.api.protocol) ? {
87
- protocol: app.api.protocol
88
- } : {}
89
- } : void 0
90
- };
91
- }) : []
92
- },
93
- ...Array.isArray(config.shells) && config.shells.length > 0 ? {
94
- shells: config.shells.filter((shell)=>null !== shell && 'object' == typeof shell && !Array.isArray(shell))
95
- } : {}
91
+ path: app.directory,
92
+ package: manifests.get(app.id).name,
93
+ packageSuffix: app.packageSuffix,
94
+ displayName: app.displayName,
95
+ domain: app.domain,
96
+ port: app.port,
97
+ portEnv: app.portEnv,
98
+ surfaceProfile: app.surfaceProfile,
99
+ deliveryUnitKind: app.deliveryUnitKind,
100
+ deliveryUnit: app.deliveryUnit,
101
+ moduleFederation: {
102
+ role: 'shell' === app.kind ? 'host' : 'remote',
103
+ name: app.mfName,
104
+ exposes: Object.keys(app.exposes ?? {}),
105
+ exposePaths: app.exposes,
106
+ verticalRefs: app.verticalRefs
107
+ },
108
+ api: app.api
109
+ }))
110
+ }
111
+ };
112
+ return {
113
+ raw: inputs,
114
+ config,
115
+ apps,
116
+ primaryShell: apps[0],
117
+ verticals: apps.filter((app)=>'vertical' === app.kind),
118
+ additionalShells: apps.filter((app, index)=>index > 0 && 'shell' === app.kind)
96
119
  };
97
120
  }
98
- function formatUnsupportedConfigValue(value) {
99
- if (void 0 === value) return 'missing';
100
- return JSON.stringify(value) ?? String(value);
101
- }
102
- function formatSchemaVersionError(sourcePath, reason, value) {
103
- switch(reason){
104
- case 'missing':
105
- return `UltraModern config schemaVersion is required in ${sourcePath}. Versionless v1 configs are not supported; set schemaVersion to the integer 1.`;
106
- case 'non-integer':
107
- return `Invalid UltraModern config schemaVersion ${value} in ${sourcePath}. schemaVersion must be the integer 1; versionless v1 configs are not supported.`;
108
- case 'unsupported':
109
- return `Unsupported UltraModern config schemaVersion ${value} in ${sourcePath}. Supported schema versions: 1. Versionless v1 configs are not supported.`;
110
- }
111
- }
112
- function normalizeCompactUltramodernConfig(workspaceRoot, compact) {
113
- return normalizeCompactConfig(workspaceRoot, node_path.join(workspaceRoot, ULTRAMODERN_CONFIG_PATH), compact);
114
- }
115
- function workspaceAppsFromToolingConfig(config) {
116
- return config.topology.apps.map((app)=>{
117
- if ('shell' === app.kind) return {
118
- ...shellApp,
119
- directory: app.path,
120
- packageSuffix: app.packageSuffix ?? shellApp.packageSuffix,
121
- displayName: app.displayName ?? shellApp.displayName,
122
- port: app.port ?? shellApp.port,
123
- portEnv: app.portEnv ?? shellApp.portEnv,
124
- mfName: app.moduleFederation?.name ?? shellApp.mfName,
125
- verticalRefs: app.moduleFederation?.verticalRefs ?? []
126
- };
127
- const domain = app.domain ?? app.id;
128
- const packageSuffix = app.packageSuffix ?? domain;
129
- const exposePaths = app.moduleFederation?.exposePaths ?? {};
130
- const exposes = Object.fromEntries((app.moduleFederation?.exposes ?? []).map((expose)=>{
131
- const configuredPath = exposePaths[expose];
132
- const inferredPath = './Route' === expose ? './src/federation-entry.tsx' : './Widget' === expose ? `./src/components/${domain}-widget.tsx` : `./src/components/${toKebabCase(expose.replace(/^\.\//u, ''))}.tsx`;
133
- return [
134
- expose,
135
- configuredPath ?? inferredPath
136
- ];
137
- }));
138
- return {
121
+ function workspaceAppsFromToolingConfig(config, _workspaceRoot) {
122
+ return config.topology.apps.map((app)=>({
139
123
  id: app.id,
124
+ kind: app.kind,
140
125
  directory: app.path,
141
- packageSuffix,
142
- displayName: app.displayName ?? `${domain} Vertical`,
143
- kind: 'vertical',
144
- domain,
145
- portEnv: app.portEnv ?? `VERTICAL_${domain.replace(/[^a-zA-Z0-9]+/g, '_').toUpperCase()}_PORT`,
146
- port: app.port ?? 0,
126
+ packageSuffix: app.packageSuffix ?? app.id,
127
+ displayName: app.displayName ?? app.id,
128
+ port: app.port,
129
+ portEnv: app.portEnv,
147
130
  mfName: app.moduleFederation?.name ?? app.id,
148
- exposes,
149
- ...app.moduleFederation?.verticalRefs ? {
150
- verticalRefs: app.moduleFederation.verticalRefs
151
- } : {},
152
- ...void 0 === app.surfaceProfile ? {} : {
153
- surfaceProfile: app.surfaceProfile
154
- },
155
- ...void 0 === app.deliveryUnitKind ? {} : {
156
- deliveryUnitKind: app.deliveryUnitKind
157
- },
158
- ...app.api ? {
159
- api: app.api
160
- } : {},
131
+ domain: app.domain,
132
+ surfaceProfile: app.surfaceProfile,
133
+ deliveryUnitKind: app.deliveryUnitKind,
134
+ deliveryUnit: app.deliveryUnit,
135
+ exposes: app.moduleFederation?.exposePaths,
136
+ verticalRefs: app.moduleFederation?.verticalRefs,
137
+ api: app.api,
161
138
  ownership: createNeutralOwnership(app.id)
162
- };
163
- });
139
+ }));
164
140
  }
165
- function additionalShellsFromToolingConfig(config) {
166
- return resolveConfiguredAdditionalShells(config);
141
+ function allWorkspaceAppsFromToolingConfig(config, workspaceRoot) {
142
+ return workspaceAppsFromToolingConfig(config, workspaceRoot);
167
143
  }
168
- function allWorkspaceAppsFromToolingConfig(config) {
169
- return [
170
- ...workspaceAppsFromToolingConfig(config),
171
- ...additionalShellsFromToolingConfig(config)
172
- ];
144
+ function reconcileGeneratedOverlayUrls(existing, previous, projected) {
145
+ return Object.fromEntries([
146
+ 'manifests',
147
+ 'apis'
148
+ ].map((key)=>{
149
+ const authored = {
150
+ ...existing[key]
151
+ };
152
+ for (const [id, value] of Object.entries(authored))if (value === previous[key]?.[id]) delete authored[id];
153
+ return [
154
+ key,
155
+ {
156
+ ...projected[key],
157
+ ...authored
158
+ }
159
+ ];
160
+ }));
161
+ }
162
+ function preserveUnknownProjectionFields(current, projected) {
163
+ if (Array.isArray(projected)) return projected.map((entry)=>{
164
+ const previous = entry && 'object' == typeof entry && 'string' == typeof entry.id && Array.isArray(current) ? current.find((candidate)=>candidate?.id === entry.id) : void 0;
165
+ return preserveUnknownProjectionFields(previous, entry);
166
+ });
167
+ if (!projected || 'object' != typeof projected) return projected;
168
+ const previous = current && 'object' == typeof current && !Array.isArray(current) ? current : {};
169
+ return {
170
+ ...previous,
171
+ ...Object.fromEntries(Object.entries(projected).map(([key, value])=>[
172
+ key,
173
+ preserveUnknownProjectionFields(previous[key], value)
174
+ ]))
175
+ };
173
176
  }
174
- export { UnsupportedUltramodernConfigError, additionalShellsFromToolingConfig, allWorkspaceAppsFromToolingConfig, normalizeCompactConfig, normalizeCompactUltramodernConfig, workspaceAppsFromToolingConfig };
177
+ export { allWorkspaceAppsFromToolingConfig, normalizeWorkspaceInputs, preserveUnknownProjectionFields, reconcileGeneratedOverlayUrls, workspaceAppsFromToolingConfig };