@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
@@ -0,0 +1,66 @@
1
+ import "node:module";
2
+ function assert(condition, message) {
3
+ if (!condition) throw new Error(message);
4
+ }
5
+ const canonicalizeJson = (value)=>{
6
+ if (Array.isArray(value)) {
7
+ const entries = value.map(canonicalizeJson);
8
+ const keyedEntries = entries.every((entry)=>null !== entry && 'object' == typeof entry && !Array.isArray(entry) && 'id' in entry && 'string' == typeof entry.id);
9
+ if (keyedEntries) {
10
+ const ids = entries.map((entry)=>entry.id);
11
+ if (new Set(ids).size === ids.length) return entries.toSorted((left, right)=>left.id.localeCompare(right.id));
12
+ }
13
+ return entries;
14
+ }
15
+ if (null !== value && 'object' == typeof value) return Object.fromEntries(Object.keys(value).toSorted().map((key)=>[
16
+ key,
17
+ canonicalizeJson(value[key])
18
+ ]));
19
+ return value;
20
+ };
21
+ const sameJson = (actual, expected)=>JSON.stringify(canonicalizeJson(actual)) === JSON.stringify(canonicalizeJson(expected));
22
+ const formatJson = (value)=>void 0 === value ? 'undefined' : JSON.stringify(canonicalizeJson(value));
23
+ const selfCheckFailure = (contract, message, fixArea)=>`MicroVertical contract self-check failed: ${contract}. ${message}. Fix area: ${fixArea}.`;
24
+ function assertSelfCheck(condition, contract, message, fixArea) {
25
+ assert(condition, selfCheckFailure(contract, message, fixArea));
26
+ }
27
+ const assertSameJson = (actual, expected, contract, fixArea)=>{
28
+ assertSelfCheck(sameJson(actual, expected), contract, `Expected ${formatJson(expected)}, found ${formatJson(actual)}`, fixArea);
29
+ };
30
+ const assertIncludesJson = (actual, required, contract, fixArea)=>{
31
+ assertArray(actual, contract, fixArea);
32
+ for (const entry of required)assertSelfCheck(actual.some((value)=>sameJson(value, entry)), contract, `Missing required entry ${formatJson(entry)}`, fixArea);
33
+ };
34
+ function assertObject(value, contract, fixArea) {
35
+ assertSelfCheck(null !== value && 'object' == typeof value && !Array.isArray(value), contract, `Expected JSON object, found ${formatJson(value)}`, fixArea);
36
+ }
37
+ function assertArray(value, contract, fixArea) {
38
+ assertSelfCheck(Array.isArray(value), contract, `Expected JSON array, found ${formatJson(value)}`, fixArea);
39
+ }
40
+ const assertUniqueStrings = (values, contract)=>{
41
+ assert(Array.isArray(values), `${contract} must be an array`);
42
+ const seen = new Set();
43
+ for (const value of values){
44
+ assert('string' == typeof value && value.length > 0, `${contract} must contain non-empty strings`);
45
+ assert(!seen.has(value), `Duplicate value "${value}" in ${contract}`);
46
+ seen.add(value);
47
+ }
48
+ };
49
+ const assertUniqueIdEntries = (entries, contract)=>{
50
+ assert(Array.isArray(entries), `${contract} must be an array`);
51
+ const seen = new Set();
52
+ for (const entry of entries){
53
+ const id = entry?.id;
54
+ assert('string' == typeof id && id.length > 0, `${contract} entries must have non-empty string ids`);
55
+ assert(!seen.has(id), `Duplicate id "${id}" in ${contract}`);
56
+ seen.add(id);
57
+ }
58
+ };
59
+ const assertSameIdCohort = (entries, expectedIds, contract, fixArea)=>{
60
+ assert(entries && expectedIds, `${contract} must be an array`);
61
+ assertUniqueIdEntries(entries, contract);
62
+ assertSameJson(entries.map((entry)=>entry.id).toSorted(), [
63
+ ...expectedIds
64
+ ].toSorted(), `${contract} cohort`, fixArea);
65
+ };
66
+ export { assert, assertArray, assertIncludesJson, assertObject, assertSameIdCohort, assertSameJson, assertSelfCheck, assertUniqueIdEntries, assertUniqueStrings, canonicalizeJson, formatJson, sameJson, selfCheckFailure };
@@ -0,0 +1 @@
1
+ import "node:module";
@@ -0,0 +1,287 @@
1
+ import "node:module";
2
+ import node_fs from "node:fs";
3
+ import node_path from "node:path";
4
+ import { yaml } from "@modern-js/utils";
5
+ import { hasCreateReleaseCohort, isCreatePackageSourceCheckout, readCreateReleaseCohort } from "../../ultramodern-release-cohort.js";
6
+ import { assertCompilerArchitecture } from "./architecture.js";
7
+ function assert(condition, message) {
8
+ if (!condition) throw new Error(message);
9
+ }
10
+ function record(value, label) {
11
+ assert(null !== value && 'object' == typeof value && !Array.isArray(value), `${label} must be an object`);
12
+ return value;
13
+ }
14
+ function entries(value, label) {
15
+ assert(Array.isArray(value), `${label} must be an array`);
16
+ return value.map((entry, index)=>record(entry, `${label}[${index}]`));
17
+ }
18
+ function distinct(values, label) {
19
+ assert(new Set(values).size === values.length, `${label} contains duplicate entries`);
20
+ }
21
+ function requiredFile(root, relative, label) {
22
+ assert(node_fs.existsSync(node_path.join(root, relative)), `${label} is missing: ${relative}`);
23
+ }
24
+ function developmentUrl(value, port, label, generatedPath) {
25
+ assert('string' == typeof value, `${label} must be a URL`);
26
+ let parsed;
27
+ try {
28
+ parsed = new URL(value);
29
+ } catch {
30
+ throw new Error(`${label} must be a URL`);
31
+ }
32
+ assert([
33
+ 'http:',
34
+ 'https:'
35
+ ].includes(parsed.protocol) && parsed.hostname.length > 0, `${label} must be an HTTP URL`);
36
+ if (generatedPath && parsed.pathname === generatedPath && ('localhost' === parsed.hostname || '127.0.0.1' === parsed.hostname)) assert(Number(parsed.port) === port, `${label} must use the app development port ${port}`);
37
+ return parsed;
38
+ }
39
+ function safePath(root, relative, label) {
40
+ assert('string' == typeof relative && relative.length > 0 && !node_path.isAbsolute(relative), `${label} must be a relative path`);
41
+ const resolved = node_path.resolve(root, relative);
42
+ assert(resolved.startsWith(`${node_path.resolve(root)}${node_path.sep}`), `${label} leaves the workspace`);
43
+ const realRoot = node_fs.realpathSync(root);
44
+ const real = node_fs.realpathSync(resolved);
45
+ assert(real.startsWith(`${realRoot}${node_path.sep}`), `${label} resolves outside the workspace`);
46
+ return resolved;
47
+ }
48
+ function validateApiClientExports(root, appPath, appId, exports) {
49
+ const clients = [
50
+ './api/client',
51
+ './api/rpc-client'
52
+ ].map((key)=>exports?.[key]).filter((value)=>void 0 !== value);
53
+ assert(clients.length > 0, `${appId} must export its API client`);
54
+ for (const client of clients){
55
+ assert('string' == typeof client && client.startsWith('./') && !client.split(/[\\/]/u).includes('..') && /\.[cm]?[jt]sx?$/u.test(client), `${appId} must export its API client from an app-owned source module`);
56
+ assert(node_fs.existsSync(node_path.join(root, appPath, client)), `${appId} API client is missing: ${client}`);
57
+ const clientFile = safePath(node_path.join(root, appPath), client, `${appId} API client`);
58
+ assert(node_fs.statSync(clientFile).isFile(), `${appId} API client must be a file`);
59
+ }
60
+ }
61
+ function validateApiOnlySourceSurface(root, app) {
62
+ assert(!Object.hasOwn(app.backendFederation?.versionBoundary ?? {}, 'ui'), `topology/reference-topology.json verticals.${app.id}.backendFederation must omit the UI boundary for an api-only unit`);
63
+ for (const relative of [
64
+ 'module-federation.config.ts',
65
+ 'src/federation-entry.tsx',
66
+ `src/components/${app.id}-widget.tsx`,
67
+ 'src/routes/layout.tsx',
68
+ 'src/routes/[lang]/page.tsx',
69
+ 'src/routes/[lang]/route.meta.ts',
70
+ 'src/routes/ultramodern-route-metadata.ts',
71
+ 'src/routes/ultramodern-route-head.tsx',
72
+ 'src/routes/index.css'
73
+ ])assert(!node_fs.existsSync(node_path.join(root, app.path, relative)), `Unexpected ${app.path}/${relative} for a api-only unit`);
74
+ const mfTypesPath = node_path.join(root, app.path, 'tsconfig.mf-types.json');
75
+ if (node_fs.existsSync(mfTypesPath)) {
76
+ const mfTypes = record(JSON.parse(node_fs.readFileSync(mfTypesPath, 'utf8')), `${app.id} tsconfig.mf-types.json`);
77
+ assert(!mfTypes.include?.includes('src/federation-entry.tsx'), `${app.id}: restore the generated MicroVertical Module Federation DTS boundary`);
78
+ }
79
+ }
80
+ function validateBackendFederationEntrypoints(root, appPath, appId) {
81
+ for (const relative of [
82
+ 'backend-federation.config.ts',
83
+ 'api/index.ts',
84
+ 'api/effect-api.ts'
85
+ ])requiredFile(root, `${appPath}/${relative}`, `${appId} API surface`);
86
+ }
87
+ function validateWorkspace(root, expected) {
88
+ const readJson = (relative)=>record(JSON.parse(node_fs.readFileSync(safePath(root, relative, relative), 'utf8')), relative);
89
+ const topology = readJson('topology/reference-topology.json');
90
+ const ownership = readJson('topology/ownership.json');
91
+ const overlay = readJson('topology/local-overlays/development.json');
92
+ const rootManifest = readJson('package.json');
93
+ const workspace = record(yaml.load(node_fs.readFileSync(node_path.join(root, 'pnpm-workspace.yaml'), 'utf8')), 'pnpm-workspace.yaml');
94
+ for (const [label, value] of [
95
+ [
96
+ 'topology',
97
+ topology
98
+ ],
99
+ [
100
+ 'ownership',
101
+ ownership
102
+ ],
103
+ [
104
+ 'overlay',
105
+ overlay
106
+ ]
107
+ ])assert(1 === value.schemaVersion, `${label} schemaVersion must be 1`);
108
+ assert(rootManifest.name === expected.packageScope, 'Root package name disagrees with the workspace scope');
109
+ const shell = record(topology.shell, 'topology.shell');
110
+ const verticals = entries(topology.verticals, 'topology.verticals');
111
+ const shells = [
112
+ shell,
113
+ ...entries(topology.shells ?? [], 'topology.shells')
114
+ ];
115
+ const apps = [
116
+ ...shells,
117
+ ...verticals
118
+ ];
119
+ const shared = entries(topology.sharedPackages ?? [], 'topology.sharedPackages');
120
+ const owners = entries(ownership.owners, 'ownership.owners');
121
+ distinct(apps.map((app)=>app.id), 'topology app ids');
122
+ distinct([
123
+ ...apps,
124
+ ...shared
125
+ ].map((app)=>app.path), 'topology package paths');
126
+ distinct(shared.map((pkg)=>pkg.id), 'topology shared package ids');
127
+ distinct(owners.map((owner)=>owner.id), 'ownership ids');
128
+ assert(shared.length === expected.sharedPackages.length, 'Shared package membership disagrees with canonical inputs');
129
+ for (const expectedShared of expected.sharedPackages){
130
+ const actual = shared.find((entry)=>entry.id === expectedShared.id);
131
+ assert(actual?.path === expectedShared.path && actual?.package === expectedShared.packageName, `${expectedShared.id} shared package identity disagrees with canonical inputs`);
132
+ }
133
+ const expectedApps = new Map(expected.apps.map((app)=>[
134
+ app.id,
135
+ app
136
+ ]));
137
+ assert(apps.length === expectedApps.size, 'Topology app membership disagrees with canonical inputs');
138
+ const verticalIds = new Set(verticals.map((vertical)=>vertical.id));
139
+ const ids = new Set(apps.map((app)=>app.id));
140
+ for (const app of apps){
141
+ const input = expectedApps.get(app.id);
142
+ assert(input, `Unexpected topology app ${app.id}`);
143
+ assert(app.kind === input.kind, `${app.id} kind disagrees with canonical inputs`);
144
+ assert(app.path === input.path, `${app.id} path disagrees with canonical inputs`);
145
+ assert(app.package === input.packageName, `${app.id} package identity disagrees with canonical inputs`);
146
+ const manifest = readJson(`${app.path}/package.json`);
147
+ assert(manifest.name === app.package, `${app.id} package name contradicts topology`);
148
+ assert(manifest.modernjs?.appId === app.id, `${app.id} modernjs.appId contradicts topology`);
149
+ const owner = owners.find((candidate)=>candidate.id === app.id);
150
+ assert(owner?.path === app.path && owner?.package === manifest.name, `${app.id} ownership identity contradicts topology and package.json`);
151
+ const refs = app.moduleFederation?.verticalRefs ?? app.verticalRefs ?? [];
152
+ assert(Array.isArray(refs), `${app.id} verticalRefs must be an array`);
153
+ distinct(refs, `${app.id} verticalRefs`);
154
+ for (const ref of refs)assert(verticalIds.has(ref), `${app.id} references unknown vertical ${ref}`);
155
+ assert(JSON.stringify(refs) === JSON.stringify(input.verticalRefs), `${app.id} verticalRefs disagree with canonical inputs`);
156
+ const port = overlay.ports?.[app.id];
157
+ assert(Number.isInteger(port) && port > 0 && port < 65536, `${app.id} has no development port`);
158
+ requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
159
+ if (input.emitsUi) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
160
+ requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
161
+ const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
162
+ for (const field of [
163
+ 'workerName',
164
+ 'publicUrlEnv'
165
+ ])assert('string' == typeof cloudflare[field] && cloudflare[field].length > 0, `${app.id} cloudflare.${field} is required`);
166
+ const cloudflareRoutes = record(cloudflare.routes, `${app.id} cloudflare.routes`);
167
+ record(cloudflare.security, `${app.id} cloudflare.security`);
168
+ record(cloudflare.qualityGates, `${app.id} cloudflare.qualityGates`);
169
+ if ('shell' === app.kind) assert('string' == typeof cloudflareRoutes.ssr && cloudflareRoutes.ssr.startsWith('/'), `${app.id} cloudflare SSR route is required`);
170
+ if (input.emitsApi) {
171
+ const routeKey = app.api?.protocol === 'rpc' ? 'rpc' : 'apiReadiness';
172
+ assert('string' == typeof cloudflareRoutes[routeKey] && cloudflareRoutes[routeKey].startsWith('/'), `${app.id} cloudflare API ${routeKey} route is required`);
173
+ }
174
+ if (input.emitsUi && 'shell' !== app.kind) {
175
+ assert('string' == typeof overlay.manifests?.[app.id], `${app.id} has no development MF manifest URL`);
176
+ developmentUrl(overlay.manifests[app.id], port, `${app.id} MF manifest URL`, '/mf-manifest.json');
177
+ requiredFile(root, `${app.path}/module-federation.config.ts`, `${app.id} Module Federation config`);
178
+ for (const [expose, relative] of Object.entries(input.exposes)){
179
+ assert('string' == typeof relative && relative.startsWith('./src/'), `${app.id} ${expose} Module Federation expose must target a source file`);
180
+ assert(node_fs.existsSync(node_path.join(root, app.path, relative)), `${app.id} ${expose} Module Federation expose source ${relative} is missing`);
181
+ }
182
+ }
183
+ if (input.emitsApi) assert('string' == typeof overlay.apis?.[app.id], `${app.id} has no development API URL`);
184
+ if (input.emitsApi && 'vertical' === app.kind) {
185
+ const apiUrl = developmentUrl(overlay.apis[app.id], port, `${app.id} API URL`);
186
+ const serverExecution = record(overlay.serverExecution?.[app.id], `${app.id} server execution`);
187
+ assert(serverExecution.apiBaseUrl === apiUrl.href.replace(/\/$/, ''), `${app.id} server execution API URL disagrees with overlay`);
188
+ const backend = record(app.backendFederation, `${app.id} backendFederation`);
189
+ const node = record(backend.executionSurfaces?.node, `${app.id} backendFederation node`);
190
+ developmentUrl(node.manifestUrl, port, `${app.id} backend manifest URL`, '/backend-mf-manifest.json');
191
+ developmentUrl(node.containerEntry, port, `${app.id} backend container URL`, '/backendRemoteEntry.cjs');
192
+ validateBackendFederationEntrypoints(root, app.path, app.id);
193
+ const apiExport = manifest.exports?.['./api'];
194
+ assert('string' == typeof apiExport && apiExport.startsWith('./shared/'), `${app.id} must export its shared API contract`);
195
+ assert(node_fs.existsSync(node_path.join(root, app.path, apiExport)), `${app.id} shared API contract ${apiExport} is missing`);
196
+ validateApiClientExports(root, app.path, app.id, manifest.exports);
197
+ const backendDelivery = record(backend.deliveryUnit, `${app.id} backendFederation.deliveryUnit`);
198
+ assert(backendDelivery.unitId === app.deliveryUnit?.unitId && backendDelivery.packageName === manifest.name && backendDelivery.buildMarker === app.deliveryUnit?.buildMarker, `${app.id} backend federation delivery identity contradicts topology`);
199
+ assert(backend.versionBoundary?.identityRoot === 'deliveryUnit' && backend.versionBoundary?.packageName === manifest.name, `${app.id} backend federation version boundary contradicts topology`);
200
+ assert(node.expected?.unitId === app.deliveryUnit?.unitId && node.expected?.buildMarker === app.deliveryUnit?.buildMarker, `${app.id} backend federation node identity contradicts topology`);
201
+ assert(serverExecution.deliveryUnit?.unitId === app.deliveryUnit?.unitId && serverExecution.deliveryUnit?.buildMarker === app.deliveryUnit?.buildMarker, `${app.id} server execution identity contradicts topology`);
202
+ assert(serverExecution.node?.manifestUrl === node.manifestUrl && serverExecution.node?.containerEntry === node.containerEntry, `${app.id} server execution node endpoints contradict topology`);
203
+ }
204
+ if ('vertical' === app.kind && !input.emitsUi) validateApiOnlySourceSurface(root, app);
205
+ if ('vertical' === app.kind && !input.emitsApi) {
206
+ assert(!Object.hasOwn(overlay.apis ?? {}, app.id) && !Object.hasOwn(overlay.serverExecution ?? {}, app.id), `${app.id} UI-only vertical must not declare API endpoints`);
207
+ assert(!app.backendFederation && !app.api, `${app.id} UI-only vertical must not declare a backend API`);
208
+ for (const relative of [
209
+ 'shared/api.ts',
210
+ 'shared/rpc.ts',
211
+ 'backend-federation.config.ts',
212
+ 'api/index.ts',
213
+ 'api/effect-api.ts',
214
+ 'api/backend-federation.ts',
215
+ `src/api/${app.id}-client.ts`,
216
+ `src/api/${app.id}-rpc-client.ts`
217
+ ])assert(!node_fs.existsSync(node_path.join(root, app.path, relative)), `Unexpected ${app.path}/${relative} for a ui-only unit`);
218
+ }
219
+ const delivery = record(app.deliveryUnit, `${app.id} deliveryUnit`);
220
+ assert('string' == typeof delivery.unitId && delivery.unitId.length > 0 && delivery.packageName === manifest.name, `${app.id} delivery unit identity contradicts package.json`);
221
+ const build = readJson(`${app.path}/shared/ultramodern-build.json`);
222
+ assert(build.deliveryUnit?.unitId === delivery.unitId && build.deliveryUnit?.packageName === manifest.name && build.deliveryUnit?.buildMarker === delivery.buildMarker, `${app.id} build identity contradicts topology`);
223
+ }
224
+ for (const pkg of shared){
225
+ const manifest = readJson(`${pkg.path}/package.json`);
226
+ assert(manifest.name === pkg.package, `${pkg.id} shared package identity contradicts topology`);
227
+ assert(owners.some((owner)=>owner.id === pkg.id && owner.path === pkg.path && owner.package === manifest.name), `${pkg.id} ownership identity contradicts package.json`);
228
+ }
229
+ for (const owner of owners)assert(ids.has(owner.id) || shared.some((pkg)=>pkg.id === owner.id), `Ownership names unknown package ${owner.id}`);
230
+ const catalogs = record(workspace.catalogs ?? {}, 'workspace catalogs');
231
+ const catalog = record(catalogs.ultramodern ?? {}, 'ultramodern catalog');
232
+ const producer = hasCreateReleaseCohort() ? readCreateReleaseCohort() : void 0;
233
+ const sourceCheckout = isCreatePackageSourceCheckout();
234
+ const cohort = new Map(producer?.packages.map((pkg)=>[
235
+ pkg.sourceName,
236
+ pkg
237
+ ]) ?? []);
238
+ const members = [
239
+ ...apps,
240
+ ...shared
241
+ ].map((app)=>`${app.path}/package.json`);
242
+ members.push('package.json');
243
+ for (const member of members){
244
+ const manifest = readJson(member);
245
+ for (const group of [
246
+ 'dependencies',
247
+ 'devDependencies',
248
+ 'optionalDependencies',
249
+ 'peerDependencies'
250
+ ])for (const [name, request] of Object.entries(record(manifest[group] ?? {}, `${member} ${group}`))){
251
+ if (!expected.modernPackages.includes(name)) continue;
252
+ assert('string' == typeof request, `${member} ${name} dependency request must be a string`);
253
+ const catalogRequest = 'catalog:ultramodern' === request ? catalog[name] : void 0;
254
+ const effective = catalogRequest ?? request;
255
+ assert('string' == typeof effective && effective.length > 0, `${member} ${name} has no catalog entry`);
256
+ if ('workspace:*' !== request) assert('catalog:ultramodern' === request, `${member} ${name} must use the ultramodern catalog`);
257
+ assert(producer || sourceCheckout || 'workspace:*' === request, `${member} ${name} uses the ultramodern catalog, but the installed ultramodern-create package is missing release-cohort.json. Install a published ultramodern-create release, or generate with --ultramodern-package-source workspace.`);
258
+ if (producer && 'workspace:*' !== request) {
259
+ const release = cohort.get(name);
260
+ assert(release, `${member} ${name} is absent from the installed release cohort`);
261
+ assert(effective === `npm:${release.targetName}@${release.version}`, `${member} ${name} catalog request disagrees with the installed release cohort`);
262
+ }
263
+ let memberDir = node_path.dirname(node_path.join(root, member));
264
+ let installedPath;
265
+ while(memberDir.startsWith(node_path.resolve(root))){
266
+ const candidate = node_path.join(memberDir, 'node_modules', name, 'package.json');
267
+ if (node_fs.existsSync(candidate)) {
268
+ installedPath = candidate;
269
+ break;
270
+ }
271
+ if (memberDir === node_path.resolve(root)) break;
272
+ memberDir = node_path.dirname(memberDir);
273
+ }
274
+ if ('workspace:*' !== request && node_fs.existsSync(node_path.join(root, 'node_modules'))) assert(installedPath, `${member} ${name} is not installed`);
275
+ if (installedPath && 'workspace:*' !== request) {
276
+ const installed = record(JSON.parse(node_fs.readFileSync(installedPath, 'utf8')), installedPath);
277
+ const aliasMatch = /^npm:(@[^/]+\/[^@]+)@(.+)$/u.exec(effective);
278
+ assert(aliasMatch, `${member} ${name} catalog entry must name an installed package and version`);
279
+ assert(installed.name === aliasMatch[1] && installed.version === aliasMatch[2], `${member} ${name} installed package identity/version disagrees with the catalog`);
280
+ if (producer) assert(installed.version === producer.release.version, `${member} ${name} installed version disagrees with the release cohort`);
281
+ }
282
+ }
283
+ }
284
+ assertCompilerArchitecture(root, expected);
285
+ console.log('UltraModern workspace validated');
286
+ }
287
+ export { validateApiClientExports, validateApiOnlySourceSurface, validateBackendFederationEntrypoints, validateWorkspace };
@@ -1,39 +1,84 @@
1
1
  import "node:module";
2
- const TANSTACK_ROUTER_VERSION = '1.170.33';
3
- const TANSTACK_ROUTER_CORE_VERSION = '1.171.28';
4
- const TANSTACK_HISTORY_VERSION = '1.162.2';
5
- const MODULE_FEDERATION_VERSION = '2.9.0';
6
- const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.2.4';
7
- const ZEPHYR_AGENT_VERSION = '1.2.4';
8
- const WRANGLER_VERSION = '4.116.0';
2
+ const TANSTACK_ROUTER_VERSION = '1.170.39';
3
+ const TANSTACK_ROUTER_CORE_VERSION = '1.171.32';
4
+ const TANSTACK_HISTORY_VERSION = '1.162.4';
5
+ const MODULE_FEDERATION_VERSION = '2.9.2';
6
+ const MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION = '2.9.3';
7
+ const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.4.0';
8
+ const ZEPHYR_AGENT_VERSION = '1.4.0';
9
+ const WRANGLER_VERSION = '4.137.0';
9
10
  const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
10
11
  const TAILWIND_VERSION = '4.3.3';
11
12
  const RSBUILD_PLUGIN_TAILWINDCSS_VERSION = '2.0.3';
12
- const EFFECT_VERSION = '4.0.0-rc.112';
13
- const EFFECT_VITEST_VERSION = '4.0.0-rc.112';
14
- const EFFECT_TSGO_VERSION = '0.41.0';
15
- const MSGPACKR_VERSION = '2.1.0';
16
- const ZOD_VERSION = '4.5.4';
17
- const DRIZZLE_ORM_VERSION = '1.0.0-rc.4';
13
+ const EFFECT_VERSION = '4.0.0-rc.117';
14
+ const EFFECT_TSGO_VERSION = '0.45.0';
18
15
  const TYPESCRIPT_STABLE_VERSION = '7.0.2';
19
16
  const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
20
17
  const TYPESCRIPT_NATIVE_PREVIEW_VERSION = '7.0.0-dev.20260707.2';
21
- const OXLINT_VERSION = '1.81.0';
22
- const OXFMT_VERSION = '0.66.0';
23
- const ULTRACITE_VERSION = '7.11.0';
24
- const CROSS_ENV_VERSION = '10.1.0';
25
- const LEFTHOOK_VERSION = '^2.1.10';
18
+ const OXLINT_VERSION = '1.85.0';
19
+ const OXFMT_VERSION = '0.70.0';
20
+ const ULTRACITE_VERSION = '7.12.0';
21
+ const LEFTHOOK_VERSION = '^2.1.14';
26
22
  const I18NEXT_VERSION = '26.4.2';
27
- const MODULE_FEDERATION_NODE_VERSION = '2.7.50';
28
- const MINIFLARE_VERSION = '4.20260730.0';
29
- const WORKERD_VERSION = '1.20260730.1';
30
- const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20260906.1';
23
+ const MODULE_FEDERATION_NODE_VERSION = '2.7.52';
24
+ const MINIFLARE_VERSION = '5.20260921.0-alpha';
25
+ const WORKERD_VERSION = '1.20260921.1';
26
+ const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20260923.1';
31
27
  const NODE_FETCH_VERSION = '^3.3.2';
32
- const REACT_VERSION = '19.2.8';
33
- const REACT_DOM_VERSION = '19.2.8';
34
- const TYPES_NODE_VERSION = '^26.4.1';
35
- const TYPES_REACT_VERSION = '^19.2.18';
36
- const TYPES_REACT_DOM_VERSION = '^19.2.7';
28
+ const REACT_VERSION = '19.3.0';
29
+ const REACT_DOM_VERSION = '19.3.0';
30
+ const TYPES_NODE_VERSION = '^26.6.2';
31
+ const TYPES_REACT_VERSION = '^19.3.0';
32
+ const TYPES_REACT_DOM_VERSION = '^19.3.0';
37
33
  const NODE_VERSION = '26.7.0';
38
- const PNPM_VERSION = '11.24.0';
39
- export { CLOUDFLARE_COMPATIBILITY_DATE, CLOUDFLARE_WORKERS_TYPES_VERSION, CROSS_ENV_VERSION, DRIZZLE_ORM_VERSION, EFFECT_TSGO_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MINIFLARE_VERSION, MODULE_FEDERATION_NODE_VERSION, MODULE_FEDERATION_VERSION, MSGPACKR_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, REACT_DOM_VERSION, REACT_VERSION, RSBUILD_PLUGIN_TAILWINDCSS_VERSION, TAILWIND_VERSION, TANSTACK_HISTORY_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_NODE_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, WORKERD_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION, ZOD_VERSION };
34
+ const PNPM_VERSION = '11.27.1';
35
+ const ULTRAMODERN_PACKAGE_PINS = {
36
+ appDependencies: {
37
+ '@module-federation/bridge-react': `npm:@bleedingdev/mf-bridge-react@${MODULE_FEDERATION_VERSION}`,
38
+ '@module-federation/modern-js-v3': `npm:@bleedingdev/mf-modern-js-v3@${MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION}`,
39
+ '@module-federation/runtime': `npm:@bleedingdev/mf-runtime@${MODULE_FEDERATION_VERSION}`,
40
+ '@tanstack/react-router': TANSTACK_ROUTER_VERSION,
41
+ i18next: I18NEXT_VERSION,
42
+ 'node-fetch': NODE_FETCH_VERSION,
43
+ react: REACT_VERSION,
44
+ 'react-dom': REACT_DOM_VERSION
45
+ },
46
+ bffEffectDependencies: {
47
+ '@effect/opentelemetry': EFFECT_VERSION,
48
+ effect: EFFECT_VERSION
49
+ },
50
+ appDevDependencies: {
51
+ '@effect/tsgo': EFFECT_TSGO_VERSION,
52
+ '@rsbuild/plugin-tailwindcss': `^${RSBUILD_PLUGIN_TAILWINDCSS_VERSION}`,
53
+ "@typescript/native": `npm:typescript@${TYPESCRIPT_VERSION}`,
54
+ '@types/node': TYPES_NODE_VERSION,
55
+ '@types/react': TYPES_REACT_VERSION,
56
+ '@types/react-dom': TYPES_REACT_DOM_VERSION,
57
+ tailwindcss: `^${TAILWIND_VERSION}`,
58
+ typescript: TYPESCRIPT_VERSION,
59
+ wrangler: WRANGLER_VERSION,
60
+ 'zephyr-rspack-plugin': ZEPHYR_RSPACK_PLUGIN_VERSION
61
+ },
62
+ rootDevDependencies: {
63
+ '@effect/tsgo': EFFECT_TSGO_VERSION,
64
+ "@typescript/native": `npm:typescript@${TYPESCRIPT_VERSION}`,
65
+ '@types/node': TYPES_NODE_VERSION,
66
+ lefthook: LEFTHOOK_VERSION,
67
+ miniflare: MINIFLARE_VERSION,
68
+ oxlint: OXLINT_VERSION,
69
+ oxfmt: OXFMT_VERSION,
70
+ ultracite: ULTRACITE_VERSION,
71
+ wrangler: WRANGLER_VERSION,
72
+ 'zephyr-agent': ZEPHYR_AGENT_VERSION
73
+ },
74
+ transitiveDependencies: {
75
+ '@cloudflare/workers-types': CLOUDFLARE_WORKERS_TYPES_VERSION,
76
+ '@module-federation/node': MODULE_FEDERATION_NODE_VERSION,
77
+ '@tanstack/history': TANSTACK_HISTORY_VERSION,
78
+ '@tanstack/router-core': TANSTACK_ROUTER_CORE_VERSION,
79
+ "@typescript/native-preview": TYPESCRIPT_NATIVE_PREVIEW_VERSION,
80
+ miniflare: MINIFLARE_VERSION,
81
+ workerd: WORKERD_VERSION
82
+ }
83
+ };
84
+ export { CLOUDFLARE_COMPATIBILITY_DATE, CLOUDFLARE_WORKERS_TYPES_VERSION, EFFECT_TSGO_VERSION, EFFECT_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MINIFLARE_VERSION, MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION, MODULE_FEDERATION_NODE_VERSION, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, REACT_DOM_VERSION, REACT_VERSION, RSBUILD_PLUGIN_TAILWINDCSS_VERSION, TAILWIND_VERSION, TANSTACK_HISTORY_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_NODE_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, ULTRAMODERN_PACKAGE_PINS, WORKERD_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION };
@@ -0,0 +1,129 @@
1
+ import "node:module";
2
+ import node_fs from "node:fs";
3
+ import node_path from "node:path";
4
+ import { parse } from "@babel/parser";
5
+ import { configuredDevelopmentPorts } from "./add-vertical/workspace-state.js";
6
+ import { resolveRemoteRefs } from "./descriptors.js";
7
+ import { formatGeneratedSourceCandidates, writeFileReplacing } from "./fs-io.js";
8
+ import { createAppModernConfig } from "./module-federation.js";
9
+ import { createRootTsConfig } from "./tsconfigs.js";
10
+ import { createWorkspaceScriptArtifacts } from "./workspace-scripts.js";
11
+ import { createZeropsYaml } from "./zerops.js";
12
+ function workspaceArtifactCandidates(scope, apps, enableTailwind, alternateApps = []) {
13
+ return [
14
+ ...createWorkspaceScriptArtifacts(),
15
+ {
16
+ relativePath: 'tsconfig.json',
17
+ content: `${JSON.stringify(createRootTsConfig(apps), null, 2)}\n`
18
+ },
19
+ ...[
20
+ apps,
21
+ ...alternateApps.length ? [
22
+ alternateApps
23
+ ] : []
24
+ ].flatMap((projection)=>{
25
+ const verticals = projection.filter((app)=>'vertical' === app.kind);
26
+ const devPorts = workspaceDevelopmentPorts(projection);
27
+ return [
28
+ {
29
+ relativePath: 'zerops.yaml',
30
+ content: `${createZeropsYaml(scope, projection)}\n`
31
+ },
32
+ ...projection.map((app)=>({
33
+ relativePath: `${app.directory}/modern.config.ts`,
34
+ content: createAppModernConfig(scope, app, 'shell' === app.kind ? resolveRemoteRefs(app, verticals) : verticals, enableTailwind, devPorts)
35
+ }))
36
+ ];
37
+ })
38
+ ];
39
+ }
40
+ function workspaceDevelopmentPorts(apps, ports = {}) {
41
+ return apps.filter((app)=>'shell' === app.kind).length > 1 ? configuredDevelopmentPorts({
42
+ ...ports,
43
+ ...Object.fromEntries(apps.map((app)=>[
44
+ app.id,
45
+ app.port
46
+ ]))
47
+ }).toSorted((left, right)=>left - right) : void 0;
48
+ }
49
+ function isLiteralData(node, literalIdentifiers) {
50
+ if (!node) return false;
51
+ if ('Identifier' === node.type) return literalIdentifiers?.has(node.name) ?? false;
52
+ if ([
53
+ 'StringLiteral',
54
+ 'NumericLiteral',
55
+ 'BooleanLiteral',
56
+ 'NullLiteral'
57
+ ].includes(node.type)) return true;
58
+ if ('UnaryExpression' === node.type) return '-' === node.operator && 'NumericLiteral' === node.argument.type;
59
+ if ('ArrayExpression' === node.type) return node.elements.every((element)=>isLiteralData(element, literalIdentifiers));
60
+ return 'ObjectExpression' === node.type && node.properties.every((property)=>'ObjectProperty' === property.type && !property.computed && !property.shorthand && [
61
+ 'Identifier',
62
+ 'StringLiteral',
63
+ 'NumericLiteral'
64
+ ].includes(property.key.type) && isLiteralData(property.value, literalIdentifiers));
65
+ }
66
+ function withoutGeneratedData(source, binding) {
67
+ if (!binding) return source;
68
+ const parsed = parse(source, {
69
+ sourceType: 'module',
70
+ plugins: [
71
+ "typescript"
72
+ ]
73
+ });
74
+ for (const statement of parsed.program.body)if ('VariableDeclaration' === statement.type && 'const' === statement.kind) {
75
+ for (const declaration of statement.declarations)if ('Identifier' === declaration.id.type && declaration.id.name === binding && declaration.init && isLiteralData(declaration.init)) return source.slice(0, declaration.init.start) + '{}' + source.slice(declaration.init.end);
76
+ }
77
+ return source;
78
+ }
79
+ function preserveConsumerWorkspaceArtifacts(workspaceRoot, candidates) {
80
+ const preservedPaths = new Set();
81
+ const recognizedPaths = new Map();
82
+ const physicalRoot = node_fs.realpathSync(workspaceRoot);
83
+ const canonicalSources = formatGeneratedSourceCandidates(candidates.map((candidate, index)=>[
84
+ `canonical/${index}/${candidate.relativePath}`,
85
+ withoutGeneratedData(candidate.content, candidate.generatedDataBinding)
86
+ ]));
87
+ for (const [index, candidate] of candidates.entries()){
88
+ const relativePath = candidate.relativePath;
89
+ const filePath = node_path.join(workspaceRoot, relativePath);
90
+ if (!node_fs.existsSync(filePath)) continue;
91
+ const physicalRelative = node_path.relative(physicalRoot, node_fs.realpathSync(filePath));
92
+ if ('..' === physicalRelative || physicalRelative.startsWith(`..${node_path.sep}`) || node_path.isAbsolute(physicalRelative)) throw new Error(`Refusing to inspect an artifact outside the workspace: ${relativePath}`);
93
+ const source = node_fs.readFileSync(filePath, 'utf8');
94
+ let recognized = source === candidate.content;
95
+ if (!recognized) try {
96
+ const normalized = withoutGeneratedData(source, candidate.generatedDataBinding);
97
+ const canonical = canonicalSources[index];
98
+ recognized = normalized === canonical || formatGeneratedSourceCandidates([
99
+ [
100
+ relativePath,
101
+ normalized
102
+ ]
103
+ ])[0] === canonical;
104
+ } catch {}
105
+ recognizedPaths.set(relativePath, true === recognizedPaths.get(relativePath) || recognized);
106
+ }
107
+ for (const [relativePath, recognized] of recognizedPaths)if (!recognized) preservedPaths.add(relativePath);
108
+ const reported = new Set();
109
+ const isPreserved = (filePath)=>{
110
+ const relativePath = node_path.relative(workspaceRoot, filePath).split(node_path.sep).join('/');
111
+ if (!preservedPaths.has(relativePath)) return false;
112
+ if (!reported.has(relativePath)) {
113
+ console.warn(`${relativePath} preserved consumer-owned artifact: its canonical generated source does not match.`);
114
+ reported.add(relativePath);
115
+ }
116
+ return true;
117
+ };
118
+ return {
119
+ preservedPaths,
120
+ io: {
121
+ write: (filePath, content)=>{
122
+ if (isPreserved(filePath)) return false;
123
+ writeFileReplacing(workspaceRoot, node_path.relative(workspaceRoot, filePath), content);
124
+ return true;
125
+ }
126
+ }
127
+ };
128
+ }
129
+ export { preserveConsumerWorkspaceArtifacts, workspaceArtifactCandidates, workspaceDevelopmentPorts };