@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
|
@@ -9,7 +9,8 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
9
9
|
|
|
10
10
|
const workspaceRoot = path.resolve(process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd());
|
|
11
11
|
const workspaceRequire = createRequire(path.join(workspaceRoot, 'package.json'));
|
|
12
|
-
const
|
|
12
|
+
const topologyPath = path.join(workspaceRoot, 'topology/reference-topology.json');
|
|
13
|
+
const localOverlayPath = path.join(workspaceRoot, 'topology/local-overlays/development.json');
|
|
13
14
|
const defaultOut = path.join(
|
|
14
15
|
workspaceRoot,
|
|
15
16
|
'.codex/reports/node-backend-federation-proof/proof.json',
|
|
@@ -19,13 +20,9 @@ const defaultOut = path.join(
|
|
|
19
20
|
// @modern-js/utils/universal backend-federation-contract. Generated workspace
|
|
20
21
|
// scripts do not currently import @modern-js/utils directly.
|
|
21
22
|
const contractVersion = 'microvertical-server-effect-v1';
|
|
22
|
-
const nodeAdapterVersion = 'backend-mf-effect-
|
|
23
|
+
const nodeAdapterVersion = 'backend-mf-effect-v2';
|
|
23
24
|
const backendExpose = './effect-api';
|
|
24
25
|
const releaseEnvelopePath = 'release/microvertical-release-envelope.json';
|
|
25
|
-
const localRuntimeRelativePaths = [
|
|
26
|
-
'packages/cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
|
|
27
|
-
'cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
|
|
28
|
-
];
|
|
29
26
|
|
|
30
27
|
function readJson(filePath) {
|
|
31
28
|
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
|
|
@@ -55,60 +52,30 @@ function hasBackendFederationManifestAdapter(runtime) {
|
|
|
55
52
|
return typeof runtime?.loadBackendFederatedEffectApiFromManifest === 'function';
|
|
56
53
|
}
|
|
57
54
|
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (parent === current) {
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
current = parent;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function importBackendFederationRuntime() {
|
|
79
|
-
let importError;
|
|
80
|
-
try {
|
|
81
|
-
const runtimePath = workspaceRequire.resolve('@modern-js/plugin-bff/effect');
|
|
82
|
-
const runtime = await import(pathToFileURL(runtimePath).href);
|
|
83
|
-
if (hasBackendFederationManifestAdapter(runtime)) {
|
|
84
|
-
return runtime;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
importError = new Error(
|
|
55
|
+
export async function importBackendFederationRuntime() {
|
|
56
|
+
const runtimePath = workspaceRequire.resolve(
|
|
57
|
+
'@modern-js/plugin-bff-extensions/backend-federation-manifest/node',
|
|
58
|
+
);
|
|
59
|
+
const effectPath = workspaceRequire.resolve('@modern-js/bff-effect/effect');
|
|
60
|
+
const [runtime, effect] = await Promise.all([
|
|
61
|
+
import(pathToFileURL(runtimePath).href),
|
|
62
|
+
import(pathToFileURL(effectPath).href),
|
|
63
|
+
]);
|
|
64
|
+
if (!hasBackendFederationManifestAdapter(runtime)) {
|
|
65
|
+
throw new Error(
|
|
88
66
|
`${runtimePath} does not export loadBackendFederatedEffectApiFromManifest`,
|
|
89
67
|
);
|
|
90
|
-
} catch (error) {
|
|
91
|
-
importError = error;
|
|
92
68
|
}
|
|
93
|
-
|
|
94
|
-
const createBin = process.env.ULTRAMODERN_CREATE_BIN;
|
|
95
|
-
if (!createBin) {
|
|
96
|
-
throw importError;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const localRuntimePath = findLocalRuntimePath(createBin);
|
|
100
|
-
if (!localRuntimePath) {
|
|
101
|
-
throw importError;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const localRuntime = await import(pathToFileURL(localRuntimePath).href);
|
|
105
|
-
if (!hasBackendFederationManifestAdapter(localRuntime)) {
|
|
69
|
+
if (typeof effect.createEffectBffTestHandler !== 'function') {
|
|
106
70
|
throw new Error(
|
|
107
|
-
`${
|
|
71
|
+
`${effectPath} does not export createEffectBffTestHandler`,
|
|
108
72
|
);
|
|
109
73
|
}
|
|
110
|
-
|
|
111
|
-
|
|
74
|
+
return {
|
|
75
|
+
loadBackendFederatedEffectApiFromManifest:
|
|
76
|
+
runtime.loadBackendFederatedEffectApiFromManifest,
|
|
77
|
+
createEffectBffTestHandler: effect.createEffectBffTestHandler,
|
|
78
|
+
};
|
|
112
79
|
}
|
|
113
80
|
|
|
114
81
|
function normalizeRelativePath(value) {
|
|
@@ -129,7 +96,6 @@ function createBackendName(app) {
|
|
|
129
96
|
return (
|
|
130
97
|
app.backendFederation?.name ??
|
|
131
98
|
app.backendFederation?.executionSurfaces?.node?.remoteName ??
|
|
132
|
-
app.serverExecution?.node?.remoteName ??
|
|
133
99
|
(typeof app.moduleFederation?.name === 'string'
|
|
134
100
|
? `${app.moduleFederation.name}Backend`
|
|
135
101
|
: `vertical${toPascalCase(app.id)}Backend`)
|
|
@@ -138,7 +104,6 @@ function createBackendName(app) {
|
|
|
138
104
|
|
|
139
105
|
function createBackendManifestUrl(app) {
|
|
140
106
|
return (
|
|
141
|
-
app.backendFederation?.executionSurfaces?.node?.manifestUrl ??
|
|
142
107
|
app.serverExecution?.node?.manifestUrl ??
|
|
143
108
|
`http://localhost:${app.port}/backend-mf-manifest.json`
|
|
144
109
|
);
|
|
@@ -146,7 +111,6 @@ function createBackendManifestUrl(app) {
|
|
|
146
111
|
|
|
147
112
|
function createBackendContainerEntry(app) {
|
|
148
113
|
return (
|
|
149
|
-
app.backendFederation?.executionSurfaces?.node?.containerEntry ??
|
|
150
114
|
app.serverExecution?.node?.containerEntry ??
|
|
151
115
|
`http://localhost:${app.port}/backendRemoteEntry.cjs`
|
|
152
116
|
);
|
|
@@ -154,8 +118,8 @@ function createBackendContainerEntry(app) {
|
|
|
154
118
|
|
|
155
119
|
function resolveRemoteType(app) {
|
|
156
120
|
return (
|
|
157
|
-
app.backendFederation?.executionSurfaces?.node?.remoteType ??
|
|
158
121
|
app.serverExecution?.node?.remoteType ??
|
|
122
|
+
app.backendFederation?.executionSurfaces?.node?.remoteType ??
|
|
159
123
|
'commonjs-module'
|
|
160
124
|
);
|
|
161
125
|
}
|
|
@@ -173,8 +137,8 @@ function collectJsonSmokeChecks(apps, targetApp) {
|
|
|
173
137
|
|
|
174
138
|
const configuredChecks = apps
|
|
175
139
|
.flatMap((app) =>
|
|
176
|
-
Array.isArray(app?.
|
|
177
|
-
? app.
|
|
140
|
+
Array.isArray(app?.cloudflare?.jsonSmokeChecks)
|
|
141
|
+
? app.cloudflare.jsonSmokeChecks
|
|
178
142
|
: [],
|
|
179
143
|
)
|
|
180
144
|
.filter((check) => {
|
|
@@ -211,27 +175,70 @@ function collectJsonSmokeChecks(apps, targetApp) {
|
|
|
211
175
|
];
|
|
212
176
|
}
|
|
213
177
|
|
|
214
|
-
function
|
|
215
|
-
|
|
178
|
+
export function topologyApps(topology, localOverlay, appFilter, env = process.env) {
|
|
179
|
+
if (!Array.isArray(topology?.verticals) || !localOverlay?.ports || !localOverlay?.serverExecution) {
|
|
180
|
+
throw new Error('Node proof requires declared reference topology and development overlay.');
|
|
181
|
+
}
|
|
182
|
+
const apps = topology.verticals;
|
|
216
183
|
const filteredApps = apps
|
|
217
184
|
.filter((app) => app?.kind === 'vertical' && app.api)
|
|
218
185
|
.filter((app) => !appFilter || app.id === appFilter)
|
|
219
|
-
.map((app) =>
|
|
186
|
+
.map((app) => {
|
|
187
|
+
const overlayPort = localOverlay.ports[app.id];
|
|
188
|
+
const domain = app.domain ?? app.id;
|
|
189
|
+
const portEnv = app.portEnv ??
|
|
190
|
+
`VERTICAL_${String(domain).replace(/[^a-zA-Z0-9]/gu, '_').toUpperCase()}_PORT`;
|
|
191
|
+
const configuredPort = env[portEnv];
|
|
192
|
+
const port = configuredPort === undefined ? overlayPort : Number(configuredPort);
|
|
193
|
+
const serverExecution = localOverlay.serverExecution[app.id];
|
|
194
|
+
if (!app.path || !Number.isInteger(overlayPort) || !Number.isInteger(port) || port < 1 || port > 65535 || !serverExecution?.node) {
|
|
195
|
+
throw new Error(`${app.id} is missing its declared path, port or Node server execution.`);
|
|
196
|
+
}
|
|
197
|
+
const appManifest = readJson(path.join(workspaceRoot, app.path, 'package.json'));
|
|
198
|
+
if (app.package !== appManifest.name || typeof appManifest.version !== 'string') {
|
|
199
|
+
throw new Error(`${app.id} topology package identity must match package.json`);
|
|
200
|
+
}
|
|
201
|
+
const api = { ...app.api, prefix: app.api.bff?.prefix };
|
|
202
|
+
const declared = { ...app, api, serverExecution };
|
|
203
|
+
const publicUrlEnv = app.cloudflare?.publicUrlEnv;
|
|
204
|
+
const configuredPublicUrl = publicUrlEnv ? env[publicUrlEnv] : undefined;
|
|
205
|
+
const publicOrigin = configuredPublicUrl
|
|
206
|
+
? new URL(configuredPublicUrl).origin
|
|
207
|
+
: `http://localhost:${port}`;
|
|
208
|
+
if (!/^https?:\/\//u.test(publicOrigin)) {
|
|
209
|
+
throw new Error(`${app.id} has an invalid declared public URL.`);
|
|
210
|
+
}
|
|
211
|
+
const nodeUrl = (declaredUrl) => {
|
|
212
|
+
const url = new URL(declaredUrl);
|
|
213
|
+
return url.origin === new URL(`http://localhost:${overlayPort}`).origin &&
|
|
214
|
+
url.username === '' &&
|
|
215
|
+
url.password === ''
|
|
216
|
+
? `${publicOrigin}${url.pathname}${url.search}${url.hash}`
|
|
217
|
+
: declaredUrl;
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
220
|
id: app.id,
|
|
221
|
-
directory:
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
221
|
+
directory: normalizeRelativePath(app.path),
|
|
222
|
+
backendName: createBackendName(declared),
|
|
223
|
+
manifestUrl: nodeUrl(createBackendManifestUrl(declared)),
|
|
224
|
+
containerEntry: nodeUrl(createBackendContainerEntry(declared)),
|
|
225
|
+
port,
|
|
226
|
+
portEnv,
|
|
227
|
+
remoteType: resolveRemoteType(declared),
|
|
228
|
+
apiProtocol: app.api.protocol ?? 'rest',
|
|
229
|
+
apiPrefix: app.api.bff?.prefix,
|
|
230
|
+
rpcPath: app.api.rpcPath,
|
|
231
|
+
rpcSerialization: app.api.rpcSerialization,
|
|
232
|
+
apiOnly: app.surfaceProfile === 'api-only',
|
|
233
|
+
smokeChecks: collectJsonSmokeChecks(apps, declared),
|
|
234
|
+
topologyDeliveryUnit:
|
|
231
235
|
app.deliveryUnit && typeof app.deliveryUnit === 'object'
|
|
232
236
|
? app.deliveryUnit
|
|
233
237
|
: undefined,
|
|
234
|
-
|
|
238
|
+
packageName: appManifest.name,
|
|
239
|
+
version: appManifest.version,
|
|
240
|
+
};
|
|
241
|
+
});
|
|
235
242
|
|
|
236
243
|
if (appFilter && filteredApps.length === 0) {
|
|
237
244
|
throw new Error(`No vertical API app matched --app ${appFilter}`);
|
|
@@ -473,7 +480,7 @@ function sha256(bytes) {
|
|
|
473
480
|
return createHash('sha256').update(bytes).digest('hex');
|
|
474
481
|
}
|
|
475
482
|
|
|
476
|
-
function readBoundReleaseEnvelope(app, target) {
|
|
483
|
+
export function readBoundReleaseEnvelope(app, target) {
|
|
477
484
|
const targetDirectory = path.join(workspaceRoot, app.directory, target);
|
|
478
485
|
const envelopePath = path.join(targetDirectory, releaseEnvelopePath);
|
|
479
486
|
assertFile(envelopePath, app.id, 'Node release envelope');
|
|
@@ -484,6 +491,18 @@ function readBoundReleaseEnvelope(app, target) {
|
|
|
484
491
|
`${app.id} release-envelope schema`,
|
|
485
492
|
);
|
|
486
493
|
assertEqual(envelope.target, 'node', `${app.id} release-envelope target`);
|
|
494
|
+
assertEqual(
|
|
495
|
+
envelope.kind,
|
|
496
|
+
'ultramodern-target-microvertical-release-envelope',
|
|
497
|
+
`${app.id} release-envelope kind`,
|
|
498
|
+
);
|
|
499
|
+
if (app.apiOnly) {
|
|
500
|
+
if (envelope.surfaces?.uiClient?.length !== 0 || envelope.surfaces?.ssr?.length !== 0) {
|
|
501
|
+
throw new Error(`${app.id} API-only release envelope must declare empty UI/client and SSR surfaces`);
|
|
502
|
+
}
|
|
503
|
+
} else if (!envelope.surfaces?.uiClient?.length || !envelope.surfaces?.ssr?.length) {
|
|
504
|
+
throw new Error(`${app.id} full-stack release envelope must bind UI/client and SSR surfaces`);
|
|
505
|
+
}
|
|
487
506
|
|
|
488
507
|
const manifestLogicalPath = envelope.surfaces?.backendFederation?.manifest;
|
|
489
508
|
const containerLogicalPath = envelope.surfaces?.backendFederation?.container;
|
|
@@ -729,6 +748,98 @@ async function proveLiveApi(app, manifest, releaseBinding) {
|
|
|
729
748
|
};
|
|
730
749
|
}
|
|
731
750
|
|
|
751
|
+
export async function proveLiveRpcApi(app, loaded, manifest, releaseBinding) {
|
|
752
|
+
const contract = loaded.contract;
|
|
753
|
+
if (contract?.protocol !== 'rpc' || typeof contract.group !== 'string' ||
|
|
754
|
+
typeof contract.path !== 'string' || contract.serialization !== 'json') {
|
|
755
|
+
throw new Error(`${app.id} backend expose missing native RPC contract`);
|
|
756
|
+
}
|
|
757
|
+
assertEqual(contract.path, app.rpcPath, `${app.id} RPC contract/topology path`);
|
|
758
|
+
assertEqual(contract.path, manifest.backendFederation?.rpcPath, `${app.id} RPC contract/manifest path`);
|
|
759
|
+
assertEqual(contract.serialization, app.rpcSerialization, `${app.id} RPC contract/topology serialization`);
|
|
760
|
+
assertEqual(contract.serialization, manifest.backendFederation?.rpcSerialization, `${app.id} RPC contract/manifest serialization`);
|
|
761
|
+
const check = app.smokeChecks.find((entry) => entry?.body?.method === 'list' && entry.route === contract.path);
|
|
762
|
+
if (!check || !Number.isInteger(check.body?.params?.limit) || check.body.params.limit < 1) {
|
|
763
|
+
throw new Error(`${app.id} has no declared RPC list smoke check`);
|
|
764
|
+
}
|
|
765
|
+
const route = normalizeRoutePath(contract.path);
|
|
766
|
+
const url = new URL(route, app.manifestUrl).href;
|
|
767
|
+
const clientModule = createRequire(
|
|
768
|
+
path.join(workspaceRoot, app.directory, 'package.json'),
|
|
769
|
+
)(`${app.packageName}/api/rpc-client`);
|
|
770
|
+
const clientName = toPascalCase(contract.group);
|
|
771
|
+
const localContract = clientModule[`${clientName}RpcContract`];
|
|
772
|
+
if (localContract?.path !== contract.path ||
|
|
773
|
+
localContract?.group !== contract.group ||
|
|
774
|
+
localContract?.serialization !== contract.serialization ||
|
|
775
|
+
localContract?.protocol !== contract.protocol) {
|
|
776
|
+
throw new Error(`${app.id} public RPC client contract does not match the verified backend expose`);
|
|
777
|
+
}
|
|
778
|
+
const makeClient = clientModule[`make${clientName}RpcClient`];
|
|
779
|
+
if (typeof makeClient !== 'function' ||
|
|
780
|
+
typeof clientModule.Effect?.runPromise !== 'function') {
|
|
781
|
+
throw new Error(`${app.id} has no native public RPC client`);
|
|
782
|
+
}
|
|
783
|
+
const client = await clientModule.Effect.runPromise(makeClient({ url }));
|
|
784
|
+
try {
|
|
785
|
+
const listed = await clientModule.Effect.runPromise(client.list({ limit: check.body.params.limit }));
|
|
786
|
+
const item = listed?.items?.[0];
|
|
787
|
+
if (typeof item?.id !== 'string' || item.id.length === 0) {
|
|
788
|
+
throw new Error(`${app.id} native RPC list returned no item id`);
|
|
789
|
+
}
|
|
790
|
+
for (const expectation of normalizeJsonExpectations(check)) {
|
|
791
|
+
if (expectation.path === 'id') {
|
|
792
|
+
assertJsonEqual(check.body.id, expectation.value, `${app.id} declared RPC request id`);
|
|
793
|
+
} else if (expectation.path.startsWith('result.')) {
|
|
794
|
+
assertJsonEqual(
|
|
795
|
+
jsonPathValue(listed, expectation.path.slice('result.'.length)),
|
|
796
|
+
expectation.value,
|
|
797
|
+
`${app.id} native RPC ${expectation.path}`,
|
|
798
|
+
);
|
|
799
|
+
} else {
|
|
800
|
+
throw new Error(`${app.id} RPC smoke check has unsupported expectation ${expectation.path}`);
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
const fetched = await clientModule.Effect.runPromise(client.get({ id: item.id }));
|
|
804
|
+
assertEqual(fetched?.id, item.id, `${app.id} native RPC get item id`);
|
|
805
|
+
const missingId = `__ultramodern-proof-missing-${item.id}__`;
|
|
806
|
+
const missing = await clientModule.Effect.runPromise(
|
|
807
|
+
clientModule.Effect.match(client.get({ id: missingId }), {
|
|
808
|
+
onFailure: (error) => ({ error }),
|
|
809
|
+
onSuccess: (value) => ({ value }),
|
|
810
|
+
}),
|
|
811
|
+
);
|
|
812
|
+
const expectedErrorTag = `${toPascalCase(contract.group)}NotFoundRpc`;
|
|
813
|
+
if (missing?.error?._tag !== expectedErrorTag ||
|
|
814
|
+
missing.error?.id !== missingId) {
|
|
815
|
+
throw new Error(`${app.id} native RPC get did not return ${expectedErrorTag} for a missing item`);
|
|
816
|
+
}
|
|
817
|
+
return {
|
|
818
|
+
method: 'RPC',
|
|
819
|
+
route,
|
|
820
|
+
url,
|
|
821
|
+
protocol: contract.protocol,
|
|
822
|
+
serialization: contract.serialization,
|
|
823
|
+
group: contract.group,
|
|
824
|
+
operations: [
|
|
825
|
+
{ method: 'list', itemId: item.id, status: 'pass' },
|
|
826
|
+
{ method: 'get', itemId: fetched.id, status: 'pass' },
|
|
827
|
+
{ method: 'get', errorTag: missing.error._tag, missingId, status: 'pass' },
|
|
828
|
+
],
|
|
829
|
+
envelopeDigest: releaseBinding.envelope.envelopeDigest,
|
|
830
|
+
apiBackendArtifacts: releaseBinding.apiBackendArtifacts.map((artifact) => ({
|
|
831
|
+
logicalPath: artifact.logicalPath,
|
|
832
|
+
runtime: artifact.runtime,
|
|
833
|
+
byteLength: artifact.byteLength,
|
|
834
|
+
sha256: artifact.sha256,
|
|
835
|
+
})),
|
|
836
|
+
status: 'pass',
|
|
837
|
+
};
|
|
838
|
+
} finally {
|
|
839
|
+
await client.dispose();
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
|
|
732
843
|
function jsonPathValue(value, path) {
|
|
733
844
|
const segments = String(path ?? '')
|
|
734
845
|
.split('.')
|
|
@@ -781,12 +892,17 @@ async function runSmokeChecks(app, loaded, createEffectBffTestHandler) {
|
|
|
781
892
|
throw new Error(`${app.id} backend runtime cannot create Effect test handler`);
|
|
782
893
|
}
|
|
783
894
|
|
|
784
|
-
const servicePrefix = loaded.contract?.
|
|
895
|
+
const servicePrefix = loaded.contract?.protocol === 'rpc'
|
|
896
|
+
? app.apiPrefix
|
|
897
|
+
: loaded.contract?.servicePrefix ?? loaded.contract?.apiPrefix;
|
|
785
898
|
if (typeof servicePrefix !== 'string' || servicePrefix.length === 0) {
|
|
786
899
|
throw new Error(
|
|
787
|
-
`${app.id} backend expose missing
|
|
900
|
+
`${app.id} backend expose missing declared API prefix`,
|
|
788
901
|
);
|
|
789
902
|
}
|
|
903
|
+
if (loaded.contract?.protocol === 'rpc') {
|
|
904
|
+
assertEqual(loaded.contract.path, app.rpcPath, `${app.id} RPC smoke route`);
|
|
905
|
+
}
|
|
790
906
|
|
|
791
907
|
const edge = await createEffectBffTestHandler({
|
|
792
908
|
module: loaded.runtime,
|
|
@@ -995,10 +1111,10 @@ function validateManifest(app, manifest, buildIdentity) {
|
|
|
995
1111
|
}
|
|
996
1112
|
}
|
|
997
1113
|
|
|
998
|
-
function
|
|
999
|
-
const
|
|
1000
|
-
if (!
|
|
1001
|
-
|
|
1114
|
+
function assertTopologyStableIdentityMatchesBuild(app, buildIdentity) {
|
|
1115
|
+
const topologyDeliveryUnit = app.topologyDeliveryUnit;
|
|
1116
|
+
if (!topologyDeliveryUnit) {
|
|
1117
|
+
throw new Error(`${app.id} is missing its declared topology delivery-unit identity`);
|
|
1002
1118
|
}
|
|
1003
1119
|
|
|
1004
1120
|
const mismatches = [];
|
|
@@ -1007,20 +1123,22 @@ function assertCompactStableIdentityMatchesBuild(app, buildIdentity) {
|
|
|
1007
1123
|
mismatches.push(`${label}: deliveryUnit=${a} vs ultramodern-build=${b}`);
|
|
1008
1124
|
}
|
|
1009
1125
|
};
|
|
1010
|
-
compare('unitId',
|
|
1126
|
+
compare('unitId', topologyDeliveryUnit.unitId, buildIdentity.unitId);
|
|
1011
1127
|
compare(
|
|
1012
1128
|
'packageName',
|
|
1013
|
-
|
|
1129
|
+
topologyDeliveryUnit.packageName,
|
|
1014
1130
|
buildIdentity.packageName,
|
|
1015
1131
|
);
|
|
1016
|
-
compare('version',
|
|
1132
|
+
compare('version', topologyDeliveryUnit.version, buildIdentity.version);
|
|
1133
|
+
compare('packageName', app.packageName, buildIdentity.packageName);
|
|
1134
|
+
compare('version', app.version, buildIdentity.version);
|
|
1017
1135
|
|
|
1018
1136
|
if (mismatches.length > 0) {
|
|
1019
1137
|
throw new Error(
|
|
1020
1138
|
`${app.id} delivery-unit identity drift between ${path.relative(
|
|
1021
1139
|
workspaceRoot,
|
|
1022
|
-
|
|
1023
|
-
)} (
|
|
1140
|
+
topologyPath,
|
|
1141
|
+
)} (reference topology) and ${path.relative(
|
|
1024
1142
|
workspaceRoot,
|
|
1025
1143
|
buildIdentity.artifactPath,
|
|
1026
1144
|
)} (stamped target identity): ${mismatches.join('; ')}`,
|
|
@@ -1039,7 +1157,7 @@ async function proveBackend(app, backendRuntime, target) {
|
|
|
1039
1157
|
assertFile(entryPath, app.id, 'backend remote entry');
|
|
1040
1158
|
|
|
1041
1159
|
const buildIdentity = readBuildIdentity(app, target);
|
|
1042
|
-
|
|
1160
|
+
assertTopologyStableIdentityMatchesBuild(app, buildIdentity);
|
|
1043
1161
|
const manifest = readJson(manifestPath);
|
|
1044
1162
|
validateManifest(app, manifest, buildIdentity);
|
|
1045
1163
|
const releaseBinding = readBoundReleaseEnvelope(app, target);
|
|
@@ -1141,7 +1259,9 @@ async function proveBackend(app, backendRuntime, target) {
|
|
|
1141
1259
|
}
|
|
1142
1260
|
|
|
1143
1261
|
const smokeChecks = await runSmokeChecks(app, loaded, createEffectBffTestHandler);
|
|
1144
|
-
const liveApi =
|
|
1262
|
+
const liveApi = loaded.contract?.protocol === 'rpc'
|
|
1263
|
+
? await proveLiveRpcApi(app, loaded, manifest, releaseBinding)
|
|
1264
|
+
: await proveLiveApi(app, manifest, releaseBinding);
|
|
1145
1265
|
|
|
1146
1266
|
return {
|
|
1147
1267
|
appId: app.id,
|
|
@@ -1218,9 +1338,10 @@ async function main(argv = process.argv.slice(2)) {
|
|
|
1218
1338
|
return 0;
|
|
1219
1339
|
}
|
|
1220
1340
|
|
|
1221
|
-
const
|
|
1222
|
-
const
|
|
1223
|
-
const
|
|
1341
|
+
const topology = readJson(topologyPath);
|
|
1342
|
+
const localOverlay = readJson(localOverlayPath);
|
|
1343
|
+
const runtimeApps = topologyApps(topology, localOverlay);
|
|
1344
|
+
const apps = args.app ? topologyApps(topology, localOverlay, args.app) : runtimeApps;
|
|
1224
1345
|
const results = [];
|
|
1225
1346
|
const backendRuntime =
|
|
1226
1347
|
apps.length > 0 ? await importBackendFederationRuntime() : undefined;
|