@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
@@ -39,6 +39,8 @@ __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
40
  WorkspaceTransactionConflictError: ()=>WorkspaceTransactionConflictError,
41
41
  __transactionTestHooks: ()=>__transactionTestHooks,
42
+ recoverFreshWorkspaceTransactions: ()=>recoverFreshWorkspaceTransactions,
43
+ recoverWorkspaceTransactions: ()=>recoverWorkspaceTransactions,
42
44
  relocateStagedWorkspaceReferences: ()=>relocateStagedWorkspaceReferences,
43
45
  runFreshWorkspaceTransaction: ()=>runFreshWorkspaceTransaction,
44
46
  runWorkspaceTransaction: ()=>runWorkspaceTransaction
@@ -58,7 +60,18 @@ class WorkspaceTransactionConflictError extends Error {
58
60
  }
59
61
  const __transactionTestHooks = {};
60
62
  function isIgnoredRelativePath(relativePath) {
61
- return (0, external_naming_cjs_namespaceObject.normalizePath)(relativePath).split('/').some((segment)=>external_generation_result_cjs_namespaceObject.ignoredSnapshotDirectories.has(segment));
63
+ const segments = (0, external_naming_cjs_namespaceObject.normalizePath)(relativePath).split('/');
64
+ return segments.some((segment, index)=>{
65
+ if (1 === index && [
66
+ 'apps',
67
+ 'verticals',
68
+ 'packages'
69
+ ].includes(segments[0]) && [
70
+ 'dist',
71
+ 'coverage'
72
+ ].includes(segment)) return false;
73
+ return external_generation_result_cjs_namespaceObject.ignoredSnapshotDirectories.has(segment);
74
+ });
62
75
  }
63
76
  function walkWorkspaceFiles(root, onFile) {
64
77
  if (!external_node_fs_default().existsSync(root)) return;
@@ -69,26 +82,30 @@ function walkWorkspaceFiles(root, onFile) {
69
82
  const entryPath = external_node_path_default().join(currentDir, entry.name);
70
83
  const relativePath = (0, external_naming_cjs_namespaceObject.normalizePath)(external_node_path_default().relative(root, entryPath));
71
84
  if (!isIgnoredRelativePath(relativePath)) if (entry.isDirectory()) collect(entryPath);
72
- else if (entry.isFile()) onFile(relativePath, entryPath);
85
+ else if (entry.isFile() || entry.isSymbolicLink()) onFile(relativePath, entryPath);
73
86
  else throw new WorkspaceTransactionConflictError(`Staged workspace contains an unsupported link or special file: ${relativePath}`);
74
87
  }
75
88
  };
76
89
  collect(root);
77
90
  }
78
- function captureWorkspace(root) {
91
+ function captureWorkspace(root, publishedRoot = root) {
79
92
  const files = new Map();
80
93
  walkWorkspaceFiles(root, (relativePath, absolutePath)=>{
81
- const stat = external_node_fs_default().statSync(absolutePath);
94
+ const stat = external_node_fs_default().lstatSync(absolutePath);
95
+ const target = stat.isSymbolicLink() ? external_node_fs_default().readlinkSync(absolutePath) : void 0;
82
96
  files.set(relativePath, {
83
- content: external_node_fs_default().readFileSync(absolutePath),
84
- mode: 511 & stat.mode
97
+ content: void 0 === target ? external_node_fs_default().readFileSync(absolutePath) : Buffer.from(external_node_path_default().isAbsolute(target) && isInside(root, target) ? external_node_path_default().join(publishedRoot, external_node_path_default().relative(root, target)) : target),
98
+ mode: 4095 & stat.mode,
99
+ ...void 0 === target ? {} : {
100
+ symlink: true
101
+ }
85
102
  });
86
103
  });
87
104
  return files;
88
105
  }
89
106
  function sameFile(left, right) {
90
107
  if (void 0 === left || void 0 === right) return left === right;
91
- return left.mode === right.mode && left.content.equals(right.content);
108
+ return left.symlink === right.symlink && left.mode === right.mode && left.content.equals(right.content);
92
109
  }
93
110
  function buildChangePlan(before, after) {
94
111
  return [
@@ -114,7 +131,7 @@ function createTemporarySibling(root) {
114
131
  external_node_fs_default().mkdirSync(parent, {
115
132
  recursive: true
116
133
  });
117
- return external_node_fs_default().mkdtempSync(external_node_path_default().join(parent, `.${external_node_path_default().basename(absoluteRoot)}.ultramodern-stage-`));
134
+ return external_node_fs_default().realpathSync.native(external_node_fs_default().mkdtempSync(external_node_path_default().join(parent, `.${external_node_path_default().basename(absoluteRoot)}.ultramodern-stage-`)));
118
135
  }
119
136
  function removeOwnedTemporaryDirectory(temporaryRoot, identity) {
120
137
  let current;
@@ -166,6 +183,7 @@ function assertFreshTarget(targetDir, expected) {
166
183
  if ('empty' !== current.kind || current.dev !== expected.dev || current.ino !== expected.ino) throw new WorkspaceTransactionConflictError(`Workspace target changed during generation: ${targetDir}`);
167
184
  }
168
185
  function publishFileExclusive(sourcePath, targetPath) {
186
+ if (external_node_fs_default().lstatSync(sourcePath).isSymbolicLink()) return void external_node_fs_default().symlinkSync(external_node_fs_default().readlinkSync(sourcePath), targetPath);
169
187
  try {
170
188
  external_node_fs_default().linkSync(sourcePath, targetPath);
171
189
  } catch (error) {
@@ -178,15 +196,36 @@ function publishFileExclusive(sourcePath, targetPath) {
178
196
  external_node_fs_default().copyFileSync(sourcePath, targetPath, external_node_fs_default().constants.COPYFILE_EXCL);
179
197
  }
180
198
  }
199
+ function isInside(root, target) {
200
+ const relative = external_node_path_default().relative(root, target);
201
+ return '..' !== relative && !relative.startsWith(`..${external_node_path_default().sep}`) && !external_node_path_default().isAbsolute(relative);
202
+ }
181
203
  function copyWorkspaceToStage(root, stagingRoot) {
204
+ walkWorkspaceFiles(root, (relativePath, absolutePath)=>{
205
+ if (!external_node_fs_default().lstatSync(absolutePath).isSymbolicLink()) return;
206
+ let target;
207
+ try {
208
+ target = external_node_fs_default().realpathSync.native(absolutePath);
209
+ } catch (cause) {
210
+ throw new WorkspaceTransactionConflictError(`Unsupported dangling or cyclic workspace link: ${relativePath}`, {
211
+ cause
212
+ });
213
+ }
214
+ if (!isInside(root, target) || isIgnoredRelativePath(external_node_path_default().relative(root, target))) throw new WorkspaceTransactionConflictError(`Workspace transaction conflict: link escapes the staged input: ${relativePath}`);
215
+ });
182
216
  external_node_fs_default().cpSync(root, stagingRoot, {
183
217
  mode: external_node_fs_default().constants.COPYFILE_FICLONE,
184
218
  recursive: true,
185
- filter (sourcePath) {
186
- const relativePath = external_node_path_default().relative(root, sourcePath);
187
- if ('' === relativePath) return true;
188
- if (isIgnoredRelativePath(relativePath)) return false;
189
- return !external_node_fs_default().lstatSync(sourcePath).isSymbolicLink();
219
+ verbatimSymlinks: true,
220
+ filter: (sourcePath)=>!isIgnoredRelativePath(external_node_path_default().relative(root, sourcePath))
221
+ });
222
+ walkWorkspaceFiles(stagingRoot, (_relativePath, absolutePath)=>{
223
+ if (!external_node_fs_default().lstatSync(absolutePath).isSymbolicLink()) return;
224
+ const target = external_node_fs_default().readlinkSync(absolutePath);
225
+ if (external_node_path_default().isAbsolute(target)) {
226
+ const realTarget = external_node_fs_default().realpathSync.native(target);
227
+ external_node_fs_default().unlinkSync(absolutePath);
228
+ external_node_fs_default().symlinkSync(external_node_path_default().join(stagingRoot, external_node_path_default().relative(root, realTarget)), absolutePath);
190
229
  }
191
230
  });
192
231
  }
@@ -206,6 +245,7 @@ function relocateStagedWorkspaceReferences(stagingRoot, workspaceRoot) {
206
245
  const stagedPath = Buffer.from(stagingRoot);
207
246
  const publishedPath = Buffer.from(workspaceRoot);
208
247
  walkWorkspaceFiles(stagingRoot, (_relativePath, absolutePath)=>{
248
+ if (external_node_fs_default().lstatSync(absolutePath).isSymbolicLink()) return;
209
249
  const content = external_node_fs_default().readFileSync(absolutePath);
210
250
  if (!content.includes(stagedPath)) return;
211
251
  external_node_fs_default().writeFileSync(absolutePath, replaceBuffer(content, stagedPath, publishedPath));
@@ -222,10 +262,13 @@ function readFilePath(absolutePath, displayPath) {
222
262
  if ('ENOENT' === error.code) return;
223
263
  throw error;
224
264
  }
225
- if (!stat.isFile()) throw new WorkspaceTransactionConflictError(`Workspace target changed type during generation: ${displayPath}`);
265
+ if (!stat.isFile() && !stat.isSymbolicLink()) throw new WorkspaceTransactionConflictError(`Workspace target changed type during generation: ${displayPath}`);
226
266
  return {
227
- content: external_node_fs_default().readFileSync(absolutePath),
228
- mode: 511 & stat.mode
267
+ content: stat.isSymbolicLink() ? Buffer.from(external_node_fs_default().readlinkSync(absolutePath)) : external_node_fs_default().readFileSync(absolutePath),
268
+ mode: 4095 & stat.mode,
269
+ ...stat.isSymbolicLink() ? {
270
+ symlink: true
271
+ } : {}
229
272
  };
230
273
  }
231
274
  function assertPreimage(root, change) {
@@ -257,6 +300,7 @@ function temporaryFilePath(root, relativePath, role) {
257
300
  return external_node_path_default().join(external_node_path_default().dirname(targetPath), `.${external_node_path_default().basename(targetPath)}.ultramodern-${role}-${(0, external_node_crypto_namespaceObject.randomUUID)()}.tmp`);
258
301
  }
259
302
  function writeTemporaryFile(filePath, file) {
303
+ if (file.symlink) return void external_node_fs_default().symlinkSync(file.content.toString(), filePath);
260
304
  external_node_fs_default().writeFileSync(filePath, file.content, {
261
305
  flag: 'wx',
262
306
  mode: file.mode
@@ -272,19 +316,10 @@ function removeIfPresent(filePath) {
272
316
  if ('ENOENT' !== error.code) throw error;
273
317
  }
274
318
  }
275
- function prepareChanges(root, changes, createdDirectories, preparedChanges) {
276
- for (const change of changes){
277
- ensureOwnedParentDirectories(root, change.relativePath, createdDirectories);
278
- const prepared = {
279
- ...change,
280
- published: false
281
- };
282
- preparedChanges.push(prepared);
283
- if (change.after) {
284
- prepared.publishPath = temporaryFilePath(root, change.relativePath, 'publish');
285
- writeTemporaryFile(prepared.publishPath, change.after);
286
- }
287
- if (change.before) prepared.rollbackPath = temporaryFilePath(root, change.relativePath, change.after ? 'rollback' : 'removed');
319
+ function prepareChanges(root, preparedChanges, createdDirectories) {
320
+ for (const prepared of preparedChanges){
321
+ ensureOwnedParentDirectories(root, prepared.relativePath, createdDirectories);
322
+ if (prepared.after && prepared.publishPath) writeTemporaryFile(prepared.publishPath, prepared.after);
288
323
  }
289
324
  }
290
325
  function assertPublishedState(root, change) {
@@ -440,17 +475,278 @@ function publishChange(root, change) {
440
475
  }
441
476
  change.published = true;
442
477
  }
443
- function publishChangePlan(root, stagingRoot, changes) {
478
+ const receiptSuffix = '.receipt.json';
479
+ function persistReceipt(receiptPath, receipt) {
480
+ const temporary = `${receiptPath}.next`;
481
+ const fd = external_node_fs_default().openSync(temporary, 'wx', 384);
482
+ try {
483
+ external_node_fs_default().writeFileSync(fd, JSON.stringify(receipt));
484
+ external_node_fs_default().fsyncSync(fd);
485
+ } finally{
486
+ external_node_fs_default().closeSync(fd);
487
+ }
488
+ external_node_fs_default().renameSync(temporary, receiptPath);
489
+ if ('win32' === process.platform) return;
490
+ const directory = external_node_fs_default().openSync(external_node_path_default().dirname(receiptPath), 'r');
491
+ try {
492
+ external_node_fs_default().fsyncSync(directory);
493
+ } finally{
494
+ external_node_fs_default().closeSync(directory);
495
+ }
496
+ }
497
+ function encodedReceipt(root, stagingRoot, changes, directories) {
498
+ const encode = (file)=>file ? {
499
+ ...file,
500
+ content: file.content.toString('base64')
501
+ } : void 0;
502
+ const identity = (filePath)=>{
503
+ const { dev, ino } = external_node_fs_default().lstatSync(filePath);
504
+ return {
505
+ dev,
506
+ ino
507
+ };
508
+ };
509
+ return {
510
+ schema: 'ultramodern-workspace-transaction-v1',
511
+ root,
512
+ rootIdentity: identity(root),
513
+ stagingIdentity: identity(stagingRoot),
514
+ pid: process.pid,
515
+ state: 'publishing',
516
+ ...directories ? {
517
+ purpose: 'fresh-empty',
518
+ directories
519
+ } : {},
520
+ changes: changes.map((change)=>({
521
+ ...change,
522
+ before: encode(change.before),
523
+ after: encode(change.after)
524
+ }))
525
+ };
526
+ }
527
+ function decodeReceipt(receiptPath, root) {
528
+ const stat = external_node_fs_default().lstatSync(receiptPath);
529
+ if (!stat.isFile() || stat.isSymbolicLink() || 'function' == typeof process.getuid && stat.uid !== process.getuid()) throw new WorkspaceTransactionConflictError(`Unsafe interrupted transaction receipt: ${receiptPath}`);
530
+ const receipt = JSON.parse(external_node_fs_default().readFileSync(receiptPath, 'utf8'));
531
+ const stagingRoot = receiptPath.slice(0, -receiptSuffix.length);
532
+ if ('ultramodern-workspace-transaction-v1' !== receipt.schema || receipt.root !== root || ![
533
+ 'publishing',
534
+ 'committed'
535
+ ].includes(receipt.state) || !Number.isSafeInteger(receipt.pid) || receipt.pid <= 0 || !sameIdentity(external_node_fs_default().lstatSync(root), receipt.rootIdentity) || !sameIdentity(external_node_fs_default().lstatSync(stagingRoot), receipt.stagingIdentity) || !Array.isArray(receipt.changes)) throw new WorkspaceTransactionConflictError(`Unrecognized interrupted transaction receipt: ${receiptPath}`);
536
+ const paths = new Set();
537
+ const decode = (file)=>{
538
+ if (void 0 === file) return;
539
+ if (!file || 'string' != typeof file.content || !Number.isInteger(file.mode) || file.mode < 0 || file.mode > 4095 || void 0 !== file.symlink && true !== file.symlink || Buffer.from(file.content, 'base64').toString('base64') !== file.content) throw new WorkspaceTransactionConflictError(`Malformed interrupted transaction preimage: ${receiptPath}`);
540
+ return {
541
+ ...file,
542
+ content: Buffer.from(file.content, 'base64')
543
+ };
544
+ };
545
+ const changes = receipt.changes.map((change)=>{
546
+ const relative = change.relativePath;
547
+ if ('string' != typeof relative || !relative || external_node_path_default().isAbsolute(relative) || (0, external_naming_cjs_namespaceObject.normalizePath)(external_node_path_default().normalize(relative)) !== relative || !isInside(root, external_node_path_default().resolve(root, relative)) || isIgnoredRelativePath(relative) || paths.has(relative)) throw new WorkspaceTransactionConflictError(`Unsafe interrupted transaction target: ${String(relative)}`);
548
+ paths.add(relative);
549
+ for (const temporary of [
550
+ change.publishPath,
551
+ change.rollbackPath
552
+ ])if (void 0 !== temporary && ('string' != typeof temporary || external_node_path_default().dirname(temporary) !== external_node_path_default().dirname(external_node_path_default().join(root, relative)) || !external_node_path_default().basename(temporary).startsWith(`.${external_node_path_default().basename(relative)}.ultramodern-`) || !temporary.endsWith('.tmp'))) throw new WorkspaceTransactionConflictError(`Unsafe interrupted transaction temporary: ${String(temporary)}`);
553
+ return {
554
+ relativePath: relative,
555
+ before: decode(change.before),
556
+ after: decode(change.after),
557
+ publishPath: change.publishPath,
558
+ rollbackPath: change.rollbackPath,
559
+ published: false
560
+ };
561
+ });
562
+ if (void 0 !== receipt.purpose && 'fresh-empty' !== receipt.purpose) throw new WorkspaceTransactionConflictError(`Unknown transaction purpose: ${receiptPath}`);
563
+ if ('fresh-empty' === receipt.purpose) {
564
+ const expected = freshParentPaths(changes);
565
+ if (!Array.isArray(receipt.directories) || receipt.directories.length !== expected.length || changes.some((change)=>void 0 !== change.before || void 0 === change.after) || receipt.directories.some((directory, index)=>!directory || directory.relativePath !== expected[index] || 'string' != typeof directory.temporaryPath || external_node_path_default().dirname(directory.temporaryPath) !== stagingRoot || !/^\.ultramodern-directory-[\da-f-]+\.tmp$/u.test(external_node_path_default().basename(directory.temporaryPath)) || !Number.isInteger(directory.dev) || !Number.isInteger(directory.ino)) || new Set(receipt.directories.map((directory)=>directory.temporaryPath)).size !== expected.length) throw new WorkspaceTransactionConflictError(`Unsafe fresh transaction directories: ${receiptPath}`);
566
+ } else if (void 0 !== receipt.directories) throw new WorkspaceTransactionConflictError(`Unexpected transaction directories: ${receiptPath}`);
567
+ return {
568
+ receipt,
569
+ changes
570
+ };
571
+ }
572
+ function freshParentPaths(changes) {
573
+ const parents = new Set();
574
+ for (const change of changes){
575
+ const segments = change.relativePath.split('/');
576
+ for(let length = 1; length < segments.length; length++)parents.add(segments.slice(0, length).join('/'));
577
+ }
578
+ return [
579
+ ...parents
580
+ ].sort((left, right)=>left.split('/').length - right.split('/').length || left.localeCompare(right));
581
+ }
582
+ function stageFreshDirectories(stagingRoot, changes) {
583
+ return freshParentPaths(changes).map((relativePath)=>{
584
+ const temporaryPath = external_node_path_default().join(stagingRoot, `.ultramodern-directory-${(0, external_node_crypto_namespaceObject.randomUUID)()}.tmp`);
585
+ external_node_fs_default().mkdirSync(temporaryPath, {
586
+ mode: 511 & external_node_fs_default().statSync(external_node_path_default().join(stagingRoot, relativePath)).mode
587
+ });
588
+ const { dev, ino } = external_node_fs_default().lstatSync(temporaryPath);
589
+ return {
590
+ relativePath,
591
+ temporaryPath,
592
+ dev,
593
+ ino
594
+ };
595
+ });
596
+ }
597
+ function assertFreshDirectoryAncestors(root, receipt, relativePath) {
598
+ const ancestors = relativePath.split('/').slice(0, -1);
599
+ for(let length = 0; length <= ancestors.length; length++){
600
+ const relative = ancestors.slice(0, length).join('/');
601
+ const expected = 0 === length ? receipt.rootIdentity : receipt.directories.find((directory)=>directory.relativePath === relative);
602
+ const candidate = external_node_path_default().join(root, relative);
603
+ const stat = external_node_fs_default().lstatSync(candidate);
604
+ if (!stat.isDirectory() || stat.isSymbolicLink() || !sameIdentity(stat, expected)) throw new WorkspaceTransactionConflictError(`Fresh transaction parent changed; preserved at ${candidate}`);
605
+ }
606
+ }
607
+ function publishFreshDirectory(root, receipt, directory) {
608
+ const target = external_node_path_default().join(root, directory.relativePath);
609
+ assertFreshDirectoryAncestors(root, receipt, directory.relativePath);
610
+ const staged = external_node_fs_default().lstatSync(directory.temporaryPath);
611
+ const stagingRoot = external_node_path_default().dirname(directory.temporaryPath);
612
+ if (!staged.isDirectory() || staged.isSymbolicLink() || !sameIdentity(staged, directory) || !sameIdentity(external_node_fs_default().lstatSync(stagingRoot), receipt.stagingIdentity)) throw new WorkspaceTransactionConflictError(`Fresh transaction staged directory changed: ${directory.temporaryPath}`);
613
+ if (external_node_fs_default().existsSync(target)) throw new WorkspaceTransactionConflictError(`Fresh transaction directory appeared: ${target}`);
614
+ external_node_fs_default().renameSync(directory.temporaryPath, target);
615
+ try {
616
+ assertFreshDirectoryAncestors(root, receipt, directory.relativePath);
617
+ const published = external_node_fs_default().lstatSync(target);
618
+ if (!published.isDirectory() || published.isSymbolicLink() || !sameIdentity(published, directory)) throw new WorkspaceTransactionConflictError(`Fresh transaction directory changed; preserved at ${target}`);
619
+ } catch (error) {
620
+ throw new WorkspaceTransactionConflictError(`Fresh directory publication could not validate ownership at ${target}; no cleanup attempted through this path`, {
621
+ cause: error
622
+ });
623
+ }
624
+ }
625
+ function validateFreshDirectories(root, receipt, changes) {
626
+ const directories = receipt.directories;
627
+ const allowed = new Set(directories.map((directory)=>external_node_path_default().join(root, directory.relativePath)));
628
+ for (const change of changes){
629
+ allowed.add(external_node_path_default().join(root, change.relativePath));
630
+ if (change.publishPath) allowed.add(change.publishPath);
631
+ }
632
+ const liveDirectories = [
633
+ root
634
+ ];
635
+ for (const directory of directories)for (const candidate of [
636
+ external_node_path_default().join(root, directory.relativePath),
637
+ directory.temporaryPath
638
+ ]){
639
+ let stat;
640
+ try {
641
+ stat = external_node_fs_default().lstatSync(candidate);
642
+ } catch (error) {
643
+ if ('ENOENT' === error.code) continue;
644
+ throw error;
645
+ }
646
+ if (!stat.isDirectory() || stat.isSymbolicLink() || !sameIdentity(stat, directory)) throw new WorkspaceTransactionConflictError(`Fresh transaction directory changed; preserved at ${candidate}`);
647
+ if (candidate !== directory.temporaryPath) liveDirectories.push(candidate);
648
+ }
649
+ if ('committed' === receipt.state) return;
650
+ for (const directory of liveDirectories)for (const entry of external_node_fs_default().readdirSync(directory))if (!allowed.has(external_node_path_default().join(directory, entry))) throw new WorkspaceTransactionConflictError(`Fresh transaction conflicts with newer consumer path: ${external_node_path_default().join(directory, entry)}`);
651
+ }
652
+ function removeFreshDirectories(root, directories) {
653
+ for (const directory of [
654
+ ...directories
655
+ ].reverse()){
656
+ const target = external_node_path_default().join(root, directory.relativePath);
657
+ let stat;
658
+ try {
659
+ stat = external_node_fs_default().lstatSync(target);
660
+ } catch (error) {
661
+ if ('ENOENT' === error.code) continue;
662
+ throw error;
663
+ }
664
+ if (!stat.isDirectory() || stat.isSymbolicLink() || !sameIdentity(stat, directory)) throw new WorkspaceTransactionConflictError(`Fresh transaction directory changed; preserved at ${target}`);
665
+ external_node_fs_default().rmdirSync(target);
666
+ }
667
+ }
668
+ function recoverFreshWorkspaceTransactions(root) {
669
+ try {
670
+ const stat = external_node_fs_default().lstatSync(root);
671
+ if (!stat.isDirectory() || stat.isSymbolicLink()) return;
672
+ } catch (error) {
673
+ if ('ENOENT' === error.code) return;
674
+ throw error;
675
+ }
676
+ recoverWorkspaceTransactions(root, 'fresh-empty');
677
+ }
678
+ function recoverWorkspaceTransactions(root, purpose = 'update') {
679
+ const workspaceRoot = external_node_fs_default().realpathSync.native(root);
680
+ const parent = external_node_path_default().dirname(workspaceRoot);
681
+ const prefix = `.${external_node_path_default().basename(workspaceRoot)}.ultramodern-stage-`;
682
+ for (const entry of external_node_fs_default().readdirSync(parent).sort()){
683
+ if (!entry.startsWith(prefix) || !entry.endsWith(receiptSuffix)) continue;
684
+ const receiptPath = external_node_path_default().join(parent, entry);
685
+ const { receipt, changes } = decodeReceipt(receiptPath, workspaceRoot);
686
+ if ((receipt.purpose ?? 'update') === purpose) {
687
+ try {
688
+ process.kill(receipt.pid, 0);
689
+ throw new WorkspaceTransactionConflictError(`Workspace publication is still owned by process ${receipt.pid}: ${receiptPath}`);
690
+ } catch (error) {
691
+ if ('ESRCH' !== error.code) throw error;
692
+ }
693
+ if ('fresh-empty' === receipt.purpose) validateFreshDirectories(workspaceRoot, receipt, changes);
694
+ for (const change of changes){
695
+ if ('fresh-empty' !== receipt.purpose) ensureOwnedParentDirectories(workspaceRoot, change.relativePath, []);
696
+ for (const [temporary, expected] of [
697
+ [
698
+ change.publishPath,
699
+ change.after
700
+ ],
701
+ [
702
+ change.rollbackPath,
703
+ change.before
704
+ ]
705
+ ])if (temporary && external_node_fs_default().existsSync(temporary) && !sameFile(readFilePath(temporary, temporary), expected)) throw new WorkspaceTransactionConflictError(`Interrupted transaction temporary changed; preserved at ${temporary}`);
706
+ if ('committed' === receipt.state) continue;
707
+ const current = readWorkspaceFile(workspaceRoot, change.relativePath);
708
+ if (!sameFile(current, change.before)) if (sameFile(current, change.after)) {
709
+ change.published = true;
710
+ if (change.before && change.rollbackPath && !external_node_fs_default().existsSync(change.rollbackPath)) writeTemporaryFile(change.rollbackPath, change.before);
711
+ } else if (void 0 === current && change.before && change.rollbackPath && external_node_fs_default().existsSync(change.rollbackPath)) {
712
+ if (!restoreQuarantinedPreimage(change, external_node_path_default().join(workspaceRoot, change.relativePath))) throw new WorkspaceTransactionConflictError(`Interrupted preimage cannot be restored: ${change.relativePath}`);
713
+ } else throw new WorkspaceTransactionConflictError(`Interrupted transaction conflicts with newer consumer bytes: ${change.relativePath}; receipt ${receiptPath}`);
714
+ }
715
+ if ('publishing' === receipt.state) rollbackPublishedChanges(workspaceRoot, changes);
716
+ cleanupPreparedChanges(changes, []);
717
+ if ('fresh-empty' === receipt.purpose && 'publishing' === receipt.state) removeFreshDirectories(workspaceRoot, receipt.directories);
718
+ removeOwnedTemporaryDirectory(receiptPath.slice(0, -receiptSuffix.length), receipt.stagingIdentity);
719
+ removeIfPresent(receiptPath);
720
+ }
721
+ }
722
+ }
723
+ function publishChangePlan(root, stagingRoot, changes, emptyTarget) {
444
724
  __transactionTestHooks.beforePublish?.({
445
725
  workspaceRoot: root,
446
726
  stagingRoot,
447
727
  changedPaths: changes.map((change)=>change.relativePath)
448
728
  });
729
+ if (emptyTarget) assertFreshTarget(root, emptyTarget);
449
730
  for (const change of changes)assertPreimage(root, change);
731
+ if (0 === changes.length) return;
450
732
  const createdDirectories = [];
451
- const preparedChanges = [];
733
+ const preparedChanges = changes.map((change)=>({
734
+ ...change,
735
+ published: false,
736
+ ...change.after ? {
737
+ publishPath: temporaryFilePath(root, change.relativePath, 'publish')
738
+ } : {},
739
+ ...change.before ? {
740
+ rollbackPath: temporaryFilePath(root, change.relativePath, 'rollback')
741
+ } : {}
742
+ }));
743
+ const receiptPath = `${stagingRoot}${receiptSuffix}`;
744
+ const directories = emptyTarget ? stageFreshDirectories(stagingRoot, changes) : void 0;
745
+ const receipt = encodedReceipt(root, stagingRoot, preparedChanges, directories);
746
+ persistReceipt(receiptPath, receipt);
452
747
  try {
453
- prepareChanges(root, changes, createdDirectories, preparedChanges);
748
+ for (const directory of directories ?? [])publishFreshDirectory(root, receipt, directory);
749
+ prepareChanges(root, preparedChanges, createdDirectories);
454
750
  for (const change of preparedChanges)assertPreimage(root, change);
455
751
  preparedChanges.forEach((change, index)=>{
456
752
  __transactionTestHooks.beforePublishPath?.({
@@ -459,36 +755,67 @@ function publishChangePlan(root, stagingRoot, changes) {
459
755
  index
460
756
  });
461
757
  publishChange(root, change);
758
+ __transactionTestHooks.afterPublishPath?.({
759
+ workspaceRoot: root,
760
+ relativePath: change.relativePath,
761
+ index
762
+ });
763
+ });
764
+ persistReceipt(receiptPath, {
765
+ ...receipt,
766
+ state: 'committed'
462
767
  });
463
768
  } catch (error) {
464
769
  try {
770
+ if (directories) validateFreshDirectories(root, receipt, preparedChanges);
465
771
  rollbackPublishedChanges(root, preparedChanges);
772
+ if (directories) {
773
+ cleanupPreparedChanges(preparedChanges, []);
774
+ removeFreshDirectories(root, directories);
775
+ }
466
776
  } catch (rollbackError) {
467
- throw new WorkspaceTransactionConflictError('Workspace transaction failed and concurrent target changes prevented a safe rollback.', {
468
- cause: rollbackError
777
+ throw new WorkspaceTransactionConflictError(`Workspace transaction failed and concurrent target changes prevented a safe rollback; recovery receipt ${receiptPath}.`, {
778
+ cause: directories ? new AggregateError([
779
+ error,
780
+ rollbackError
781
+ ], 'Fresh publication and rollback conflicts') : rollbackError
469
782
  });
470
- } finally{
471
- cleanPreparedChanges(preparedChanges, createdDirectories);
472
783
  }
784
+ cleanPreparedChanges(preparedChanges, createdDirectories);
785
+ if (!preparedChanges.some((change)=>change.preserveRollback || change.preservedPaths?.length)) removeIfPresent(receiptPath);
473
786
  throw error;
474
787
  }
475
788
  cleanPreparedChanges(preparedChanges, []);
789
+ removeIfPresent(receiptPath);
476
790
  }
477
- function runWorkspaceTransaction(root, mutate) {
791
+ function runWorkspaceTransaction(root, mutate, options = {}) {
478
792
  const workspaceRoot = external_node_fs_default().realpathSync.native(external_node_path_default().resolve(root));
479
793
  if (!external_node_fs_default().statSync(workspaceRoot).isDirectory()) throw new Error(`Workspace root is not a directory: ${root}`);
794
+ if ('preview' !== options.mode) recoverWorkspaceTransactions(workspaceRoot);
480
795
  const stagingRoot = createTemporarySibling(workspaceRoot);
481
796
  const stagingIdentity = external_node_fs_default().lstatSync(stagingRoot);
797
+ const cleanup = ()=>{
798
+ if (!external_node_fs_default().existsSync(`${stagingRoot}${receiptSuffix}`)) cleanOwnedTemporaryDirectory(stagingRoot, stagingIdentity);
799
+ };
482
800
  try {
483
801
  copyWorkspaceToStage(workspaceRoot, stagingRoot);
484
- const before = captureWorkspace(stagingRoot);
802
+ const before = captureWorkspace(stagingRoot, workspaceRoot);
803
+ const finish = (result)=>{
804
+ if (options.commitWhen && !options.commitWhen(result)) return result;
805
+ relocateStagedWorkspaceReferences(stagingRoot, root);
806
+ const changes = buildChangePlan(before, captureWorkspace(stagingRoot, workspaceRoot));
807
+ options.inspectChanges?.(changes);
808
+ if ('preview' !== options.mode) publishChangePlan(workspaceRoot, stagingRoot, changes);
809
+ return result;
810
+ };
485
811
  const result = mutate(stagingRoot);
486
- relocateStagedWorkspaceReferences(stagingRoot, root);
487
- const changes = buildChangePlan(before, captureWorkspace(stagingRoot));
488
- publishChangePlan(workspaceRoot, stagingRoot, changes);
489
- return result;
490
- } finally{
491
- cleanOwnedTemporaryDirectory(stagingRoot, stagingIdentity);
812
+ if (null !== result && ('object' == typeof result || 'function' == typeof result) && 'function' == typeof result.then) return Promise.resolve(result).then(finish).finally(cleanup);
813
+ const completed = finish(result);
814
+ cleanup();
815
+ return completed;
816
+ } catch (error) {
817
+ cleanup();
818
+ throw error;
492
819
  }
493
820
  }
494
821
  function sameIdentity(stat, identity) {
@@ -529,6 +856,7 @@ function cleanEmptyTargetRollback(rollbackPath, expected) {
529
856
  function publishFreshWorkspace(stagingRoot, workspaceRoot, target) {
530
857
  assertFreshTarget(workspaceRoot, target);
531
858
  if ('absent' === target.kind) return void external_node_fs_default().renameSync(stagingRoot, workspaceRoot);
859
+ if ('win32' === process.platform && currentDirectoryIs(workspaceRoot)) return void publishChangePlan(external_node_fs_default().realpathSync.native(workspaceRoot), stagingRoot, buildChangePlan(new Map(), captureWorkspace(stagingRoot, workspaceRoot)), target);
532
860
  const rollbackPath = external_node_path_default().join(external_node_path_default().dirname(workspaceRoot), `.${external_node_path_default().basename(workspaceRoot)}.ultramodern-empty-${(0, external_node_crypto_namespaceObject.randomUUID)()}.tmp`);
533
861
  const restoreCwd = currentDirectoryIs(workspaceRoot);
534
862
  external_node_fs_default().renameSync(workspaceRoot, rollbackPath);
@@ -557,6 +885,7 @@ function publishFreshWorkspace(stagingRoot, workspaceRoot, target) {
557
885
  }
558
886
  function runFreshWorkspaceTransaction(targetDir, generate) {
559
887
  const workspaceRoot = external_node_path_default().resolve(targetDir);
888
+ recoverFreshWorkspaceTransactions(workspaceRoot);
560
889
  const target = inspectFreshTarget(workspaceRoot);
561
890
  const stagingRoot = createTemporarySibling(workspaceRoot);
562
891
  const stagingIdentity = external_node_fs_default().lstatSync(stagingRoot);
@@ -570,17 +899,21 @@ function runFreshWorkspaceTransaction(targetDir, generate) {
570
899
  publishFreshWorkspace(stagingRoot, workspaceRoot, target);
571
900
  return result;
572
901
  } finally{
573
- cleanOwnedTemporaryDirectory(stagingRoot, stagingIdentity);
902
+ if (!external_node_fs_default().existsSync(`${stagingRoot}${receiptSuffix}`)) cleanOwnedTemporaryDirectory(stagingRoot, stagingIdentity);
574
903
  }
575
904
  }
576
905
  exports.WorkspaceTransactionConflictError = __webpack_exports__.WorkspaceTransactionConflictError;
577
906
  exports.__transactionTestHooks = __webpack_exports__.__transactionTestHooks;
907
+ exports.recoverFreshWorkspaceTransactions = __webpack_exports__.recoverFreshWorkspaceTransactions;
908
+ exports.recoverWorkspaceTransactions = __webpack_exports__.recoverWorkspaceTransactions;
578
909
  exports.relocateStagedWorkspaceReferences = __webpack_exports__.relocateStagedWorkspaceReferences;
579
910
  exports.runFreshWorkspaceTransaction = __webpack_exports__.runFreshWorkspaceTransaction;
580
911
  exports.runWorkspaceTransaction = __webpack_exports__.runWorkspaceTransaction;
581
912
  for(var __rspack_i in __webpack_exports__)if (-1 === [
582
913
  "WorkspaceTransactionConflictError",
583
914
  "__transactionTestHooks",
915
+ "recoverFreshWorkspaceTransactions",
916
+ "recoverWorkspaceTransactions",
584
917
  "relocateStagedWorkspaceReferences",
585
918
  "runFreshWorkspaceTransaction",
586
919
  "runWorkspaceTransaction"