@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.
- package/README.md +43 -74
- package/dist/cjs/cli/package-source.cjs +2 -2
- package/dist/cjs/cli/project-setup.cjs +2 -22
- package/dist/cjs/index.cjs +9 -1
- package/dist/cjs/locale/en.cjs +2 -1
- package/dist/cjs/locale/zh.cjs +2 -1
- package/dist/cjs/ultramodern-package-source.cjs +13 -9
- package/dist/cjs/ultramodern-release-cohort.cjs +6 -21
- package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +49 -56
- package/dist/cjs/ultramodern-tooling/commands/context.cjs +11 -29
- package/dist/cjs/ultramodern-tooling/commands/routes-generate-app.cjs +67 -0
- package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +24 -53
- package/dist/cjs/ultramodern-tooling/commands/validate.cjs +5 -11
- package/dist/cjs/ultramodern-tooling/commands.cjs +15 -8
- package/dist/cjs/ultramodern-tooling/config/index.cjs +10 -24
- package/dist/cjs/ultramodern-tooling/config/load.cjs +12 -10
- package/dist/cjs/ultramodern-tooling/config/metadata.cjs +34 -32
- package/dist/cjs/ultramodern-tooling/config/normalize.cjs +165 -164
- package/dist/cjs/ultramodern-workspace/add-shell.cjs +118 -118
- package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +121 -25
- package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +14 -160
- package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +16 -48
- package/dist/cjs/ultramodern-workspace/add-vertical/preview.cjs +78 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +87 -24
- package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +4 -1
- package/dist/cjs/ultramodern-workspace/add-vertical/transaction.cjs +378 -45
- package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +21 -44
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +0 -9
- package/dist/cjs/ultramodern-workspace/api/client.cjs +5 -5
- package/dist/cjs/ultramodern-workspace/api/contracts.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/api/rpc.cjs +20 -18
- package/dist/cjs/ultramodern-workspace/api/service.cjs +49 -24
- package/dist/cjs/ultramodern-workspace/api/shared.cjs +28 -18
- package/dist/cjs/ultramodern-workspace/app-files.cjs +3 -23
- package/dist/cjs/ultramodern-workspace/backend-federation.cjs +27 -27
- package/dist/cjs/ultramodern-workspace/contracts.cjs +14 -183
- package/dist/cjs/ultramodern-workspace/delivery-unit-schema/surfaces.cjs +85 -0
- package/dist/cjs/ultramodern-workspace/delivery-unit-schema/types.cjs +8 -85
- package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +16 -4
- package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +27 -17
- package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +16 -10
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +66 -433
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +0 -4
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +37 -2
- package/dist/cjs/ultramodern-workspace/generation-result.cjs +4 -4
- package/dist/cjs/ultramodern-workspace/index.cjs +2 -5
- package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +0 -6
- package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +6 -6
- package/dist/cjs/{ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs → ultramodern-workspace/mf-validation/exposes.cjs} +13 -17
- package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +26 -7
- package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +21 -122
- package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +37 -38
- package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +93 -153
- package/dist/cjs/ultramodern-workspace/mf-validation.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +24 -29
- package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +39 -58
- package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +1 -43
- package/dist/cjs/ultramodern-workspace/package-json.cjs +63 -37
- package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +104 -0
- package/dist/cjs/ultramodern-workspace/policy.cjs +3 -577
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +3 -3
- package/dist/cjs/ultramodern-workspace/routes.cjs +2 -11
- package/dist/cjs/ultramodern-workspace/shared-patches.cjs +12 -2
- package/dist/cjs/ultramodern-workspace/shells.cjs +0 -70
- package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +27 -41
- package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +8 -2
- package/dist/cjs/ultramodern-workspace/validation/architecture.cjs +397 -0
- package/dist/cjs/ultramodern-workspace/validation/assertions.cjs +140 -0
- package/dist/cjs/ultramodern-workspace/validation/types.cjs +18 -0
- package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +344 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +81 -45
- package/dist/cjs/ultramodern-workspace/workspace-artifact-ownership.cjs +183 -0
- package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +36 -25
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +11 -200
- package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +62 -373
- package/dist/cjs/ultramodern-workspace/write-app.cjs +19 -11
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +20 -50
- package/dist/cjs/ultramodern-workspace/zerops.cjs +2 -0
- package/dist/esm/cli/package-source.js +3 -3
- package/dist/esm/cli/project-setup.js +2 -22
- package/dist/esm/index.js +10 -2
- package/dist/esm/locale/en.js +2 -1
- package/dist/esm/locale/zh.js +2 -1
- package/dist/esm/ultramodern-package-source.js +14 -4
- package/dist/esm/ultramodern-release-cohort.js +5 -14
- package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
- package/dist/esm/ultramodern-tooling/commands/context.js +10 -26
- package/dist/esm/ultramodern-tooling/commands/routes-generate-app.js +35 -0
- package/dist/esm/ultramodern-tooling/commands/routes-generate.js +25 -54
- package/dist/esm/ultramodern-tooling/commands/validate.js +6 -12
- package/dist/esm/ultramodern-tooling/commands.js +15 -9
- package/dist/esm/ultramodern-tooling/config/index.js +0 -2
- package/dist/esm/ultramodern-tooling/config/load.js +9 -9
- package/dist/esm/ultramodern-tooling/config/metadata.js +33 -28
- package/dist/esm/ultramodern-tooling/config/normalize.js +159 -156
- package/dist/esm/ultramodern-workspace/add-shell.js +124 -123
- package/dist/esm/ultramodern-workspace/add-vertical/execute.js +119 -27
- package/dist/esm/ultramodern-workspace/add-vertical/plan.js +16 -150
- package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +15 -47
- package/dist/esm/ultramodern-workspace/add-vertical/preview.js +40 -0
- package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +87 -25
- package/dist/esm/ultramodern-workspace/add-vertical/topology.js +4 -1
- package/dist/esm/ultramodern-workspace/add-vertical/transaction.js +373 -46
- package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
- package/dist/esm/ultramodern-workspace/add-vertical.js +1 -1
- package/dist/esm/ultramodern-workspace/api/client.js +5 -5
- package/dist/esm/ultramodern-workspace/api/contracts.js +2 -2
- package/dist/esm/ultramodern-workspace/api/rpc.js +20 -18
- package/dist/esm/ultramodern-workspace/api/service.js +49 -24
- package/dist/esm/ultramodern-workspace/api/shared.js +28 -18
- package/dist/esm/ultramodern-workspace/app-files.js +3 -23
- package/dist/esm/ultramodern-workspace/backend-federation.js +5 -5
- package/dist/esm/ultramodern-workspace/contracts.js +14 -180
- package/dist/esm/ultramodern-workspace/delivery-unit-schema/surfaces.js +41 -0
- package/dist/esm/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
- package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +16 -4
- package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +28 -18
- package/dist/esm/ultramodern-workspace/delivery-unit.js +12 -6
- package/dist/esm/ultramodern-workspace/demo-components.js +67 -428
- package/dist/esm/ultramodern-workspace/descriptors.js +1 -2
- package/dist/esm/ultramodern-workspace/fs-io.js +37 -2
- package/dist/esm/ultramodern-workspace/generation-result.js +3 -3
- package/dist/esm/ultramodern-workspace/index.js +1 -1
- package/dist/esm/ultramodern-workspace/mf-validation/constants.js +1 -4
- package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +7 -7
- package/dist/esm/ultramodern-workspace/mf-validation/exposes.js +14 -0
- package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +27 -8
- package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +22 -123
- package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +36 -34
- package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +83 -143
- package/dist/esm/ultramodern-workspace/mf-validation.js +1 -0
- package/dist/esm/ultramodern-workspace/module-federation/config.js +25 -30
- package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +39 -58
- package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +1 -43
- package/dist/esm/ultramodern-workspace/package-json.js +58 -32
- package/dist/esm/ultramodern-workspace/patch-inventory.js +66 -0
- package/dist/esm/ultramodern-workspace/policy.js +2 -564
- package/dist/esm/ultramodern-workspace/public-surface.js +3 -3
- package/dist/esm/ultramodern-workspace/routes.js +2 -11
- package/dist/esm/ultramodern-workspace/shared-patches.js +2 -2
- package/dist/esm/ultramodern-workspace/shells.js +3 -67
- package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +22 -37
- package/dist/esm/ultramodern-workspace/tsconfigs.js +9 -3
- package/dist/esm/ultramodern-workspace/validation/architecture.js +348 -0
- package/dist/esm/ultramodern-workspace/validation/assertions.js +65 -0
- package/dist/esm/ultramodern-workspace/validation/types.js +0 -0
- package/dist/esm/ultramodern-workspace/validation/workspace.js +286 -0
- package/dist/esm/ultramodern-workspace/versions.js +74 -29
- package/dist/esm/ultramodern-workspace/workspace-artifact-ownership.js +128 -0
- package/dist/esm/ultramodern-workspace/workspace-script-plan.js +35 -27
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +10 -190
- package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +65 -376
- package/dist/esm/ultramodern-workspace/write-app.js +18 -10
- package/dist/esm/ultramodern-workspace/write-workspace.js +25 -52
- package/dist/esm/ultramodern-workspace/zerops.js +2 -0
- package/dist/esm-node/cli/package-source.js +3 -3
- package/dist/esm-node/cli/project-setup.js +2 -22
- package/dist/esm-node/index.js +10 -2
- package/dist/esm-node/locale/en.js +2 -1
- package/dist/esm-node/locale/zh.js +2 -1
- package/dist/esm-node/ultramodern-package-source.js +14 -4
- package/dist/esm-node/ultramodern-release-cohort.js +5 -14
- package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
- package/dist/esm-node/ultramodern-tooling/commands/context.js +10 -26
- package/dist/esm-node/ultramodern-tooling/commands/routes-generate-app.js +36 -0
- package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +25 -54
- package/dist/esm-node/ultramodern-tooling/commands/validate.js +6 -12
- package/dist/esm-node/ultramodern-tooling/commands.js +15 -9
- package/dist/esm-node/ultramodern-tooling/config/index.js +0 -2
- package/dist/esm-node/ultramodern-tooling/config/load.js +9 -9
- package/dist/esm-node/ultramodern-tooling/config/metadata.js +33 -28
- package/dist/esm-node/ultramodern-tooling/config/normalize.js +159 -156
- package/dist/esm-node/ultramodern-workspace/add-shell.js +124 -123
- package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +119 -27
- package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +16 -150
- package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +15 -47
- package/dist/esm-node/ultramodern-workspace/add-vertical/preview.js +41 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +87 -25
- package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +4 -1
- package/dist/esm-node/ultramodern-workspace/add-vertical/transaction.js +373 -46
- package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +1 -1
- package/dist/esm-node/ultramodern-workspace/api/client.js +5 -5
- package/dist/esm-node/ultramodern-workspace/api/contracts.js +2 -2
- package/dist/esm-node/ultramodern-workspace/api/rpc.js +20 -18
- package/dist/esm-node/ultramodern-workspace/api/service.js +49 -24
- package/dist/esm-node/ultramodern-workspace/api/shared.js +28 -18
- package/dist/esm-node/ultramodern-workspace/app-files.js +3 -23
- package/dist/esm-node/ultramodern-workspace/backend-federation.js +5 -5
- package/dist/esm-node/ultramodern-workspace/contracts.js +14 -180
- package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/surfaces.js +42 -0
- package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
- package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +16 -4
- package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +28 -18
- package/dist/esm-node/ultramodern-workspace/delivery-unit.js +12 -6
- package/dist/esm-node/ultramodern-workspace/demo-components.js +67 -428
- package/dist/esm-node/ultramodern-workspace/descriptors.js +1 -2
- package/dist/esm-node/ultramodern-workspace/fs-io.js +37 -2
- package/dist/esm-node/ultramodern-workspace/generation-result.js +3 -3
- package/dist/esm-node/ultramodern-workspace/index.js +1 -1
- package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +1 -4
- package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +7 -7
- package/dist/esm-node/ultramodern-workspace/mf-validation/exposes.js +15 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +27 -8
- package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +22 -123
- package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +36 -34
- package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +83 -143
- package/dist/esm-node/ultramodern-workspace/mf-validation.js +1 -0
- package/dist/esm-node/ultramodern-workspace/module-federation/config.js +25 -30
- package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +39 -58
- package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +1 -43
- package/dist/esm-node/ultramodern-workspace/package-json.js +58 -32
- package/dist/esm-node/ultramodern-workspace/patch-inventory.js +67 -0
- package/dist/esm-node/ultramodern-workspace/policy.js +2 -564
- package/dist/esm-node/ultramodern-workspace/public-surface.js +3 -3
- package/dist/esm-node/ultramodern-workspace/routes.js +2 -11
- package/dist/esm-node/ultramodern-workspace/shared-patches.js +2 -2
- package/dist/esm-node/ultramodern-workspace/shells.js +3 -67
- package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +22 -37
- package/dist/esm-node/ultramodern-workspace/tsconfigs.js +9 -3
- package/dist/esm-node/ultramodern-workspace/validation/architecture.js +349 -0
- package/dist/esm-node/ultramodern-workspace/validation/assertions.js +66 -0
- package/dist/esm-node/ultramodern-workspace/validation/types.js +1 -0
- package/dist/esm-node/ultramodern-workspace/validation/workspace.js +287 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +74 -29
- package/dist/esm-node/ultramodern-workspace/workspace-artifact-ownership.js +129 -0
- package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +35 -27
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +10 -190
- package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +65 -376
- package/dist/esm-node/ultramodern-workspace/write-app.js +18 -10
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +25 -52
- package/dist/esm-node/ultramodern-workspace/zerops.js +2 -0
- package/dist/types/cli/project-setup.d.ts +1 -1
- package/dist/types/locale/en.d.ts +1 -0
- package/dist/types/locale/index.d.ts +2 -0
- package/dist/types/locale/zh.d.ts +1 -0
- package/dist/types/ultramodern-package-source.d.ts +2 -4
- package/dist/types/ultramodern-release-cohort.d.ts +1 -3
- package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -2
- package/dist/types/ultramodern-tooling/commands/context.d.ts +4 -1
- package/dist/types/ultramodern-tooling/commands/routes-generate-app.d.ts +1 -0
- package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +1 -1
- package/dist/types/ultramodern-tooling/commands/validate.d.ts +1 -1
- package/dist/types/ultramodern-tooling/config/index.d.ts +0 -2
- package/dist/types/ultramodern-tooling/config/load.d.ts +10 -2
- package/dist/types/ultramodern-tooling/config/metadata.d.ts +2 -2
- package/dist/types/ultramodern-tooling/config/normalize.d.ts +19 -19
- package/dist/types/ultramodern-tooling/config/types.d.ts +2 -9
- package/dist/types/ultramodern-workspace/add-shell.d.ts +1 -1
- package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +1 -0
- package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +4 -3
- package/dist/types/ultramodern-workspace/add-vertical/preview.d.ts +4 -0
- package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +7 -2
- package/dist/types/ultramodern-workspace/add-vertical/transaction.d.ts +32 -6
- package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +10 -7
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +1 -1
- package/dist/types/ultramodern-workspace/api/client.d.ts +3 -1
- package/dist/types/ultramodern-workspace/api/rpc.d.ts +1 -1
- package/dist/types/ultramodern-workspace/api/service.d.ts +3 -1
- package/dist/types/ultramodern-workspace/api/shared.d.ts +2 -0
- package/dist/types/ultramodern-workspace/backend-federation.d.ts +1 -1
- package/dist/types/ultramodern-workspace/contracts.d.ts +1 -3
- package/dist/types/ultramodern-workspace/delivery-unit-schema/surfaces.d.ts +17 -0
- package/dist/types/ultramodern-workspace/delivery-unit-schema/types.d.ts +3 -68
- package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +2 -2
- package/dist/types/ultramodern-workspace/delivery-unit.d.ts +3 -3
- package/dist/types/ultramodern-workspace/demo-components.d.ts +0 -3
- package/dist/types/ultramodern-workspace/descriptors.d.ts +0 -1
- package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -1
- package/dist/types/ultramodern-workspace/index.d.ts +1 -1
- package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +0 -1
- package/dist/types/ultramodern-workspace/mf-validation/exposes.d.ts +11 -0
- package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +2 -3
- package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +4 -3
- package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +1 -0
- package/dist/types/ultramodern-workspace/mf-validation.d.ts +1 -0
- package/dist/types/ultramodern-workspace/module-federation/config.d.ts +1 -1
- package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +2 -2
- package/dist/types/ultramodern-workspace/package-json.d.ts +1 -1
- package/dist/types/ultramodern-workspace/patch-inventory.d.ts +10 -0
- package/dist/types/ultramodern-workspace/policy.d.ts +31 -209
- package/dist/types/ultramodern-workspace/routes.d.ts +6 -1
- package/dist/types/ultramodern-workspace/shells.d.ts +2 -15
- package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +8 -7
- package/dist/types/ultramodern-workspace/types.d.ts +9 -9
- package/dist/types/ultramodern-workspace/validation/architecture.d.ts +2 -0
- package/dist/types/ultramodern-workspace/validation/assertions.d.ts +14 -0
- package/dist/types/ultramodern-workspace/validation/types.d.ts +9 -0
- package/dist/types/ultramodern-workspace/validation/workspace.d.ts +6 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +73 -28
- package/dist/types/ultramodern-workspace/workspace-artifact-ownership.d.ts +18 -0
- package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +4 -5
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +8 -13
- package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +22 -188
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +1 -3
- package/package.json +18 -11
- package/{template-workspace/.modernjs/release-cohort.json → release-cohort.json} +88 -40
- package/template-workspace/.codex/skills/rspack-tracing/scripts/analyze_trace.js +1 -1
- package/template-workspace/README.md.handlebars +20 -35
- package/template-workspace/oxfmt.config.ts +3 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +0 -24
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +4 -4
- package/templates/packages/shared-contracts-index.ts +4 -332
- package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +10 -0
- package/templates/workspace/apps/modern.config.ts.handlebars +13 -27
- package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -11
- package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +20 -20
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +4 -6
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +2 -2
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +11 -11
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.helpers.tsx.handlebars +1 -1
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.imports.tsx.handlebars +1 -1
- package/templates/workspace-scripts/generate-node-backend-federation.mjs +68 -77
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +107 -207
- package/templates/workspace-scripts/materialize-zerops-runtime.mjs +12 -19
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +53 -444
- package/templates/workspace-scripts/proof-node-backend-federation.mjs +212 -91
- package/templates/workspace-scripts/{proof-workerd-ssr.mts → proof-workerd-ssr.mjs} +434 -239
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +25 -7
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +45 -147
- package/templates/workspace-scripts/ultramodern-typecheck.mjs +1 -1
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +0 -212
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +0 -47
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +0 -112
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +0 -55
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +0 -102
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +0 -195
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +0 -146
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.cjs +0 -110
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +0 -67
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +0 -307
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +0 -58
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +0 -71
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.cjs +0 -151
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +0 -67
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +0 -52
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +0 -447
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +0 -323
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +0 -87
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +0 -612
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +0 -376
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +0 -73
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.cjs +0 -215
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +0 -135
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +0 -454
- package/dist/cjs/ultramodern-tooling/config/constants.cjs +0 -48
- package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +0 -157
- package/dist/cjs/ultramodern-workspace/delivery-unit-schema/up-projection.cjs +0 -188
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -154
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -9
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -63
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -7
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -47
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -146
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -97
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -61
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -16
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -258
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -10
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -8
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -15
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -100
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -29
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -14
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -385
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -276
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -49
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -559
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -329
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -19
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -148
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -80
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +0 -405
- package/dist/esm/ultramodern-tooling/config/constants.js +0 -4
- package/dist/esm/ultramodern-tooling/config/synthesize.js +0 -108
- package/dist/esm/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -129
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -155
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -10
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -64
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -8
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -48
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -147
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -98
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -62
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -17
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -259
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -11
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -9
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -16
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -101
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -30
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -15
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -386
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -277
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -50
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -560
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -330
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -20
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -149
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -81
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +0 -406
- package/dist/esm-node/ultramodern-tooling/config/constants.js +0 -5
- package/dist/esm-node/ultramodern-tooling/config/synthesize.js +0 -109
- package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -130
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +0 -12
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +0 -4
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +0 -1
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +0 -5
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +0 -2
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.d.ts +0 -2
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +0 -4
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +0 -8
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +0 -1
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +0 -2
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +0 -26
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +0 -25
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +0 -26
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +0 -26
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +0 -6
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.d.ts +0 -37
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.d.ts +0 -4
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +0 -2
- package/dist/types/ultramodern-tooling/config/constants.d.ts +0 -3
- package/dist/types/ultramodern-tooling/config/synthesize.d.ts +0 -5
- package/dist/types/ultramodern-workspace/delivery-unit-schema/up-projection.d.ts +0 -189
- package/template-workspace/patches/@module-federation__bridge-react@2.9.0.patch +0 -47
- package/template-workspace/patches/@module-federation__dts-plugin@2.9.0.patch +0 -26
- package/template-workspace/patches/@module-federation__modern-js-v3@2.9.0.patch +0 -268
- package/template-workspace/patches/@module-federation__runtime-core@2.9.0.patch +0 -13
- package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +0 -471
- package/template-workspace/patches/msgpackr@2.1.0.patch +0 -30
- package/template-workspace/patches/zod@4.5.4.patch +0 -56
- package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +0 -779
- package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mts +0 -9
- 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
|
-
|
|
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().
|
|
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:
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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:
|
|
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,
|
|
276
|
-
for (const
|
|
277
|
-
ensureOwnedParentDirectories(root,
|
|
278
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
468
|
-
cause:
|
|
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
|
-
|
|
487
|
-
const
|
|
488
|
-
|
|
489
|
-
return
|
|
490
|
-
}
|
|
491
|
-
|
|
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"
|