@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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createDeliveryUnitRecord, deliveryUnitContractBlock } from "./delivery-unit.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { resolveOwnerAttribution } from "./types.js";
|
|
2
|
+
import { createNeutralOwnership, shellApp } from "./descriptors.js";
|
|
3
|
+
import { toEnvSegment, toKebabCase, toPascalCase } from "./naming.js";
|
|
5
4
|
const PRIMARY_SHELL_ID = shellApp.id;
|
|
6
5
|
const FIRST_ADDITIONAL_SHELL_PORT = 3120;
|
|
7
6
|
function createShellDescriptor(name, port) {
|
|
@@ -30,67 +29,4 @@ function assertValidShellName(name) {
|
|
|
30
29
|
function shellDeliveryUnitBlock(scope, shell) {
|
|
31
30
|
return shell.deliveryUnit ?? deliveryUnitContractBlock(createDeliveryUnitRecord(scope, shell));
|
|
32
31
|
}
|
|
33
|
-
|
|
34
|
-
const verticalRefs = shell.verticalRefs ?? [];
|
|
35
|
-
return {
|
|
36
|
-
id: shell.id,
|
|
37
|
-
name: shell.id.replace(/^shell-/u, ''),
|
|
38
|
-
kind: 'shell',
|
|
39
|
-
package: packageName(scope, shell.packageSuffix),
|
|
40
|
-
path: shell.directory,
|
|
41
|
-
port: shell.port,
|
|
42
|
-
portEnv: shell.portEnv,
|
|
43
|
-
mfName: shell.mfName,
|
|
44
|
-
verticalRefs,
|
|
45
|
-
owner: resolveOwnerAttribution(shell.ownership),
|
|
46
|
-
deliveryUnit: shellDeliveryUnitBlock(scope, shell),
|
|
47
|
-
moduleFederation: {
|
|
48
|
-
role: 'host',
|
|
49
|
-
name: shell.mfName,
|
|
50
|
-
verticalRefs,
|
|
51
|
-
remotes: createModuleFederationRemoteContracts(shell, remotes),
|
|
52
|
-
ssr: true,
|
|
53
|
-
sharedContractVersion: 'mf-ssr-contract-v1'
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function resolveConfiguredAdditionalShells(config) {
|
|
58
|
-
const shells = config?.shells;
|
|
59
|
-
if (!Array.isArray(shells)) return [];
|
|
60
|
-
return shells.filter((entry)=>null !== entry && 'object' == typeof entry && !Array.isArray(entry)).map((entry)=>{
|
|
61
|
-
const id = String(entry.id ?? '');
|
|
62
|
-
const suffix = 'string' == typeof entry.package ? entry.package.split('/').at(-1) ?? id : id;
|
|
63
|
-
const name = 'string' == typeof entry.name ? entry.name : id.replace(/^shell-/, '');
|
|
64
|
-
const port = 'number' == typeof entry.port ? entry.port : FIRST_ADDITIONAL_SHELL_PORT;
|
|
65
|
-
const descriptor = createShellDescriptor(name, port);
|
|
66
|
-
const moduleFederation = entry.moduleFederation && 'object' == typeof entry.moduleFederation && !Array.isArray(entry.moduleFederation) ? entry.moduleFederation : void 0;
|
|
67
|
-
const owner = entry.owner;
|
|
68
|
-
const deliveryUnit = entry.deliveryUnit;
|
|
69
|
-
const ownerAttribution = owner && 'object' == typeof owner && !Array.isArray(owner) && 'kind' in owner && ('team' === owner.kind || 'agent' === owner.kind || 'agent-team' === owner.kind) && 'id' in owner && 'string' == typeof owner.id ? {
|
|
70
|
-
kind: owner.kind,
|
|
71
|
-
id: owner.id,
|
|
72
|
-
...'contact' in owner && 'string' == typeof owner.contact ? {
|
|
73
|
-
contact: owner.contact
|
|
74
|
-
} : {}
|
|
75
|
-
} : void 0;
|
|
76
|
-
const ownership = void 0 === ownerAttribution ? descriptor.ownership : {
|
|
77
|
-
...descriptor.ownership,
|
|
78
|
-
owner: ownerAttribution
|
|
79
|
-
};
|
|
80
|
-
return {
|
|
81
|
-
...descriptor,
|
|
82
|
-
id,
|
|
83
|
-
packageSuffix: suffix,
|
|
84
|
-
ownership,
|
|
85
|
-
displayName: 'string' == typeof entry.displayName ? entry.displayName : descriptor.displayName,
|
|
86
|
-
directory: 'string' == typeof entry.path ? entry.path : descriptor.directory,
|
|
87
|
-
portEnv: 'string' == typeof entry.portEnv ? entry.portEnv : descriptor.portEnv,
|
|
88
|
-
mfName: 'string' == typeof entry.mfName ? entry.mfName : 'string' == typeof moduleFederation?.name ? moduleFederation.name : descriptor.mfName,
|
|
89
|
-
verticalRefs: Array.isArray(entry.verticalRefs) ? entry.verticalRefs.filter((ref)=>'string' == typeof ref) : Array.isArray(moduleFederation?.verticalRefs) ? moduleFederation.verticalRefs.filter((ref)=>'string' == typeof ref) : [],
|
|
90
|
-
...deliveryUnit && 'object' == typeof deliveryUnit && !Array.isArray(deliveryUnit) ? {
|
|
91
|
-
deliveryUnit: deliveryUnit
|
|
92
|
-
} : {}
|
|
93
|
-
};
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
export { FIRST_ADDITIONAL_SHELL_PORT, PRIMARY_SHELL_ID, assertValidShellName, createAdditionalShellConfigEntry, createShellDescriptor, resolveConfiguredAdditionalShells, shellDeliveryUnitBlock };
|
|
32
|
+
export { FIRST_ADDITIONAL_SHELL_PORT, PRIMARY_SHELL_ID, assertValidShellName, createShellDescriptor, shellDeliveryUnitBlock };
|
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
const defineToolingCommand = (command)=>
|
|
2
|
-
...command,
|
|
3
|
-
wrapperPath: `scripts/${command.wrapperName}.mts`
|
|
4
|
-
});
|
|
1
|
+
const defineToolingCommand = (command)=>command;
|
|
5
2
|
const generatedToolingCommands = [
|
|
6
3
|
defineToolingCommand({
|
|
7
4
|
id: 'validate',
|
|
8
5
|
command: 'validate',
|
|
9
|
-
wrapperName: 'validate-ultramodern-workspace',
|
|
10
|
-
contractKey: 'validate',
|
|
11
6
|
rootScript: 'contract:check'
|
|
12
7
|
}),
|
|
13
8
|
defineToolingCommand({
|
|
14
9
|
id: 'typecheck',
|
|
15
10
|
command: 'typecheck',
|
|
16
|
-
wrapperName: 'ultramodern-typecheck',
|
|
17
|
-
contractKey: 'typecheck',
|
|
18
11
|
rootScript: 'typecheck',
|
|
19
12
|
templatePath: "templates/workspace-scripts/ultramodern-typecheck.mjs",
|
|
20
13
|
cwd: 'invocation'
|
|
@@ -22,79 +15,71 @@ const generatedToolingCommands = [
|
|
|
22
15
|
defineToolingCommand({
|
|
23
16
|
id: 'mfTypes',
|
|
24
17
|
command: 'mf-types',
|
|
25
|
-
wrapperName: 'assert-mf-types',
|
|
26
|
-
contractKey: 'mfTypes',
|
|
27
18
|
rootScript: 'mf:types'
|
|
28
19
|
}),
|
|
29
20
|
defineToolingCommand({
|
|
30
21
|
id: 'publicSurface',
|
|
31
22
|
command: 'public-surface',
|
|
32
|
-
wrapperName: 'generate-public-surface-assets',
|
|
33
|
-
contractKey: 'publicSurface',
|
|
34
23
|
templatePath: "templates/workspace-scripts/generate-public-surface-assets.mjs"
|
|
35
24
|
}),
|
|
36
25
|
defineToolingCommand({
|
|
37
26
|
id: 'backendFederationGenerate',
|
|
27
|
+
requiresBackendSurface: true,
|
|
38
28
|
command: 'backend-federation-generate',
|
|
39
|
-
wrapperName: 'generate-node-backend-federation',
|
|
40
|
-
contractKey: 'backendFederationGenerate',
|
|
41
29
|
rootScript: 'node:backend-federation:generate',
|
|
42
30
|
templatePath: "templates/workspace-scripts/generate-node-backend-federation.mjs"
|
|
43
31
|
}),
|
|
44
32
|
defineToolingCommand({
|
|
45
33
|
id: 'backendFederationProof',
|
|
34
|
+
requiresBackendSurface: true,
|
|
46
35
|
command: 'backend-federation-proof',
|
|
47
|
-
wrapperName: 'proof-node-backend-federation',
|
|
48
|
-
contractKey: 'backendFederationProof',
|
|
49
36
|
rootScript: 'node:proof',
|
|
50
37
|
templatePath: "templates/workspace-scripts/proof-node-backend-federation.mjs"
|
|
51
38
|
}),
|
|
52
39
|
defineToolingCommand({
|
|
53
40
|
id: 'cloudflareProof',
|
|
54
41
|
command: 'cloudflare-proof',
|
|
55
|
-
wrapperName: 'proof-cloudflare-version',
|
|
56
|
-
contractKey: 'cloudflareProof',
|
|
57
42
|
rootScript: 'cloudflare:proof',
|
|
58
43
|
templatePath: "templates/workspace-scripts/proof-cloudflare-version.mjs"
|
|
59
44
|
}),
|
|
60
45
|
defineToolingCommand({
|
|
61
46
|
id: 'cloudflareOutputVerify',
|
|
62
47
|
command: 'cloudflare-output-verify',
|
|
63
|
-
wrapperName: 'verify-cloudflare-output',
|
|
64
|
-
contractKey: 'cloudflareOutputVerify',
|
|
65
48
|
rootScript: 'cloudflare-output:verify'
|
|
66
49
|
}),
|
|
67
50
|
defineToolingCommand({
|
|
68
51
|
id: 'performanceReadiness',
|
|
69
52
|
command: 'performance-readiness',
|
|
70
|
-
wrapperName: 'ultramodern-performance-readiness',
|
|
71
|
-
contractKey: 'performanceReadiness',
|
|
72
53
|
rootScript: 'performance:readiness',
|
|
73
54
|
templatePath: "templates/workspace-scripts/ultramodern-performance-readiness.mjs"
|
|
74
55
|
}),
|
|
75
56
|
defineToolingCommand({
|
|
76
|
-
id: '
|
|
77
|
-
command: '
|
|
78
|
-
wrapperName: 'migrate-strict-effect',
|
|
79
|
-
contractKey: 'migrateStrictEffect',
|
|
80
|
-
rootScript: 'migrate:strict-effect'
|
|
57
|
+
id: 'routesGenerate',
|
|
58
|
+
command: 'routes-generate'
|
|
81
59
|
}),
|
|
82
60
|
defineToolingCommand({
|
|
83
|
-
id: '
|
|
84
|
-
command: '
|
|
85
|
-
|
|
86
|
-
|
|
61
|
+
id: 'zeropsMaterialize',
|
|
62
|
+
command: 'zerops-materialize',
|
|
63
|
+
rootScript: 'zerops:materialize',
|
|
64
|
+
requiresRemotes: true,
|
|
65
|
+
templatePath: "templates/workspace-scripts/materialize-zerops-runtime.mjs"
|
|
66
|
+
}),
|
|
67
|
+
defineToolingCommand({
|
|
68
|
+
id: 'cloudflareSsrProof',
|
|
69
|
+
command: 'cloudflare-ssr-proof',
|
|
70
|
+
rootScript: 'cloudflare:ssr-proof',
|
|
71
|
+
requiresRemotes: true,
|
|
72
|
+
templatePath: "templates/workspace-scripts/proof-workerd-ssr.mjs"
|
|
87
73
|
})
|
|
88
74
|
];
|
|
75
|
+
function selectGeneratedToolingCommands(options = {}) {
|
|
76
|
+
const backendSurface = options.hasBackendSurface ?? !options.shellOnly;
|
|
77
|
+
return generatedToolingCommands.filter((command)=>(!options.shellOnly || !command.requiresRemotes) && (backendSurface || !command.requiresBackendSurface));
|
|
78
|
+
}
|
|
89
79
|
const toolingCommandById = Object.fromEntries(generatedToolingCommands.map((command)=>[
|
|
90
80
|
command.id,
|
|
91
81
|
command
|
|
92
82
|
]));
|
|
93
83
|
const GENERATED_TOOLING_COMMANDS = toolingCommandById;
|
|
94
84
|
const generatedToolingCommandList = ()=>generatedToolingCommands.map((command)=>command.command);
|
|
95
|
-
|
|
96
|
-
command.contractKey,
|
|
97
|
-
command.wrapperPath
|
|
98
|
-
]));
|
|
99
|
-
const createGeneratedToolingWrapperMap = createToolingWrapperContract;
|
|
100
|
-
export { GENERATED_TOOLING_COMMANDS, createGeneratedToolingWrapperMap, generatedToolingCommandList, generatedToolingCommands };
|
|
85
|
+
export { GENERATED_TOOLING_COMMANDS, generatedToolingCommandList, generatedToolingCommands, selectGeneratedToolingCommands };
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import node_path from "node:path";
|
|
2
|
-
import { appHasApi, resolveRemoteRefs, sharedPackages } from "./descriptors.js";
|
|
2
|
+
import { appHasApi, resolveApiProtocol, resolveRemoteRefs, sharedPackages } from "./descriptors.js";
|
|
3
3
|
import { effectDiagnostics } from "./effect-diagnostics.js";
|
|
4
4
|
import { relativeRootFor } from "./naming.js";
|
|
5
5
|
function createTsConfigBase() {
|
|
6
6
|
return {
|
|
7
7
|
compilerOptions: {
|
|
8
8
|
target: 'ESNext',
|
|
9
|
+
types: [
|
|
10
|
+
'node'
|
|
11
|
+
],
|
|
9
12
|
lib: [
|
|
10
13
|
'ESNext',
|
|
11
14
|
'DOM',
|
|
@@ -70,7 +73,8 @@ function createPackageTsConfig(packageDir, options = {}) {
|
|
|
70
73
|
'src',
|
|
71
74
|
'locales/**/*.json',
|
|
72
75
|
'package.json',
|
|
73
|
-
'shared'
|
|
76
|
+
'shared',
|
|
77
|
+
'shared/ultramodern-build.json'
|
|
74
78
|
];
|
|
75
79
|
if (resolvedOptions.includeServer) include.push('server');
|
|
76
80
|
if (resolvedOptions.includeApi) include.push('api');
|
|
@@ -112,7 +116,9 @@ function createAppMfTypesTsConfig(app) {
|
|
|
112
116
|
const exposedFiles = Object.entries(app.exposes ?? {}).sort(([left], [right])=>'./Route' === left ? -1 : './Route' === right ? 1 : 0).map(([, exposePath])=>exposePath.replace(/^\.\//u, ''));
|
|
113
117
|
return {
|
|
114
118
|
extends: `${relativeRootFor(app.directory)}/tsconfig.base.json`,
|
|
115
|
-
include: [
|
|
119
|
+
include: 'api-only' === app.surfaceProfile ? [
|
|
120
|
+
'rpc' === resolveApiProtocol(app) ? 'shared/rpc.ts' : 'shared/api.ts'
|
|
121
|
+
] : [
|
|
116
122
|
...new Set([
|
|
117
123
|
...exposedFiles,
|
|
118
124
|
'src/modern-app-env.d.ts'
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import node_fs from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import node_path from "node:path";
|
|
4
|
+
import { assert, sameJson, selfCheckFailure } from "./assertions.js";
|
|
5
|
+
function assertCompilerArchitecture(root, workspaceValidationContract) {
|
|
6
|
+
const fullStackVerticals = workspaceValidationContract.apps.filter((app)=>'shell' !== app.kind);
|
|
7
|
+
const tailwindEnabled = workspaceValidationContract.tailwindEnabled;
|
|
8
|
+
const compactConfigPath = 'topology/reference-topology.json';
|
|
9
|
+
const readJson = (relativePath)=>JSON.parse(node_fs.readFileSync(node_path.join(root, relativePath), 'utf-8'));
|
|
10
|
+
const workspaceRequire = createRequire(node_path.join(root, 'package.json'));
|
|
11
|
+
let typescript;
|
|
12
|
+
let typescriptApi;
|
|
13
|
+
try {
|
|
14
|
+
typescript = workspaceRequire("@typescript/native/unstable/ast");
|
|
15
|
+
typescriptApi = workspaceRequire("@typescript/native/unstable/sync");
|
|
16
|
+
} catch (error) {
|
|
17
|
+
if ('MODULE_NOT_FOUND' !== error.code) throw error;
|
|
18
|
+
}
|
|
19
|
+
let compilerSnapshot;
|
|
20
|
+
let compiler;
|
|
21
|
+
try {
|
|
22
|
+
const sourceExtensions = new Set([
|
|
23
|
+
'.cjs',
|
|
24
|
+
'.cts',
|
|
25
|
+
'.js',
|
|
26
|
+
'.jsx',
|
|
27
|
+
'.mjs',
|
|
28
|
+
'.mts',
|
|
29
|
+
'.ts',
|
|
30
|
+
'.tsx'
|
|
31
|
+
]);
|
|
32
|
+
const collectCompilerInputs = (relativeDirectory)=>{
|
|
33
|
+
const absoluteDirectory = node_path.join(root, relativeDirectory);
|
|
34
|
+
if (!node_fs.existsSync(absoluteDirectory)) return [];
|
|
35
|
+
const files = [];
|
|
36
|
+
const queue = [
|
|
37
|
+
absoluteDirectory
|
|
38
|
+
];
|
|
39
|
+
while(queue.length > 0){
|
|
40
|
+
const current = queue.shift();
|
|
41
|
+
for (const entry of node_fs.readdirSync(current, {
|
|
42
|
+
withFileTypes: true
|
|
43
|
+
})){
|
|
44
|
+
const absoluteEntry = node_path.join(current, entry.name);
|
|
45
|
+
if (entry.isDirectory()) queue.push(absoluteEntry);
|
|
46
|
+
else if (sourceExtensions.has(node_path.extname(entry.name))) files.push(absoluteEntry);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return files.toSorted();
|
|
50
|
+
};
|
|
51
|
+
const initializeCompilerSnapshot = (absolutePaths)=>{
|
|
52
|
+
if (void 0 === typescript || void 0 === typescriptApi) return;
|
|
53
|
+
compiler = new typescriptApi.API({
|
|
54
|
+
cwd: root
|
|
55
|
+
});
|
|
56
|
+
compilerSnapshot = compiler.updateSnapshot({
|
|
57
|
+
openFiles: [
|
|
58
|
+
...absolutePaths
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const parseCompilerInput = (absolutePath)=>{
|
|
63
|
+
const project = compilerSnapshot?.getDefaultProjectForFile(absolutePath);
|
|
64
|
+
const sourceFile = project?.program.getSourceFile(absolutePath);
|
|
65
|
+
assert(void 0 !== sourceFile, `Native TypeScript compiler could not parse ${node_path.relative(root, absolutePath)}`);
|
|
66
|
+
return sourceFile;
|
|
67
|
+
};
|
|
68
|
+
const nodeName = (node)=>{
|
|
69
|
+
if (!node) return;
|
|
70
|
+
if (typescript.isIdentifier(node) || typescript.isPrivateIdentifier(node) || typescript.isStringLiteralLikeNode(node) || typescript.isNumericLiteral(node)) return node.text;
|
|
71
|
+
};
|
|
72
|
+
const propertyAccessPath = (node)=>{
|
|
73
|
+
if (typescript.isIdentifier(node)) return [
|
|
74
|
+
node.text
|
|
75
|
+
];
|
|
76
|
+
if (typescript.isPropertyAccessExpression(node)) {
|
|
77
|
+
const left = propertyAccessPath(node.expression);
|
|
78
|
+
return void 0 === left ? void 0 : [
|
|
79
|
+
...left,
|
|
80
|
+
node.name.text
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
if (typescript.isElementAccessExpression(node) && typescript.isStringLiteralLikeNode(node.argumentExpression)) {
|
|
84
|
+
const left = propertyAccessPath(node.expression);
|
|
85
|
+
return void 0 === left ? void 0 : [
|
|
86
|
+
...left,
|
|
87
|
+
node.argumentExpression.text
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
function compilerFailure(sourceFile, node, contract, diagnostic, fixArea) {
|
|
92
|
+
const position = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
|
|
93
|
+
const relativePath = node_path.relative(root, sourceFile.fileName).split(node_path.sep).join('/');
|
|
94
|
+
throw new Error(selfCheckFailure(contract, `${diagnostic} Compiler evidence: ${relativePath}:${position.line + 1}:${position.character + 1}`, fixArea));
|
|
95
|
+
}
|
|
96
|
+
const runtimeModuleReferences = (sourceFile)=>{
|
|
97
|
+
const references = [];
|
|
98
|
+
const record = (node, specifier, kind, typeOnly = false)=>{
|
|
99
|
+
if (!typeOnly) references.push({
|
|
100
|
+
kind,
|
|
101
|
+
node,
|
|
102
|
+
specifier
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
const visit = (node)=>{
|
|
106
|
+
if (typescript.isImportDeclaration(node) && typescript.isStringLiteralLikeNode(node.moduleSpecifier)) {
|
|
107
|
+
const importClause = node.importClause;
|
|
108
|
+
const namedBindings = importClause?.namedBindings;
|
|
109
|
+
const namedBindingsAreTypeOnly = void 0 !== namedBindings && typescript.isNamedImports(namedBindings) && namedBindings.elements.length > 0 && namedBindings.elements.every((element)=>element.isTypeOnly);
|
|
110
|
+
record(node, node.moduleSpecifier.text, void 0 === importClause ? 'side-effect-import' : 'static-import', importClause?.phaseModifier === typescript.SyntaxKind.TypeKeyword || importClause?.name === void 0 && namedBindingsAreTypeOnly);
|
|
111
|
+
} else if (typescript.isExportDeclaration(node) && void 0 !== node.moduleSpecifier && typescript.isStringLiteralLikeNode(node.moduleSpecifier)) record(node, node.moduleSpecifier.text, 'static-import', node.isTypeOnly);
|
|
112
|
+
else if (typescript.isCallExpression(node) && node.arguments.length > 0 && typescript.isStringLiteralLikeNode(node.arguments[0])) {
|
|
113
|
+
if (node.expression.kind === typescript.SyntaxKind.ImportKeyword) record(node, node.arguments[0].text, 'dynamic-import');
|
|
114
|
+
else if (typescript.isIdentifier(node.expression) && 'require' === node.expression.text) record(node, node.arguments[0].text, 'require');
|
|
115
|
+
}
|
|
116
|
+
node.forEachChild(visit);
|
|
117
|
+
};
|
|
118
|
+
visit(sourceFile);
|
|
119
|
+
return references;
|
|
120
|
+
};
|
|
121
|
+
const importDiagnosticId = (prefix, kind)=>{
|
|
122
|
+
switch(kind){
|
|
123
|
+
case 'side-effect-import':
|
|
124
|
+
return `${prefix}-side-effect-import`;
|
|
125
|
+
case 'dynamic-import':
|
|
126
|
+
return `${prefix}-dynamic-import`;
|
|
127
|
+
case 'require':
|
|
128
|
+
return `${prefix}-require`;
|
|
129
|
+
default:
|
|
130
|
+
return 'vertical-directory' === prefix ? 'vertical-directory-deep-import' : 'workspace-package-source-import';
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const isWorkspaceSourceSpecifier = (specifier)=>{
|
|
134
|
+
const segments = specifier.split('/');
|
|
135
|
+
return segments.length > 3 && segments[0].startsWith('@') && 'src' === segments[2];
|
|
136
|
+
};
|
|
137
|
+
const resolvesInsideVerticalDirectory = (sourceFile, specifier)=>{
|
|
138
|
+
if (!specifier.startsWith('.')) return false;
|
|
139
|
+
const specifierSegments = specifier.replaceAll('\\', '/').split('/');
|
|
140
|
+
if (specifierSegments.some((segment, index)=>'verticals' === segment && void 0 !== specifierSegments[index + 1])) return true;
|
|
141
|
+
const absoluteTarget = node_path.resolve(node_path.dirname(sourceFile.fileName), specifier);
|
|
142
|
+
const verticalRoot = node_path.join(root, 'verticals') + node_path.sep;
|
|
143
|
+
if (!absoluteTarget.startsWith(verticalRoot)) return false;
|
|
144
|
+
const relativeSegments = node_path.relative(verticalRoot, absoluteTarget).split(node_path.sep);
|
|
145
|
+
return relativeSegments.length > 1;
|
|
146
|
+
};
|
|
147
|
+
const jsxTagName = (tagName)=>typescript.isIdentifier(tagName) ? tagName.text : void 0;
|
|
148
|
+
const jsxAttribute = (attributes, name)=>attributes.properties.find((property)=>typescript.isJsxAttribute(property) && nodeName(property.name) === name);
|
|
149
|
+
const isBooleanLiteral = (node, value)=>node?.kind === (value ? typescript.SyntaxKind.TrueKeyword : typescript.SyntaxKind.FalseKeyword);
|
|
150
|
+
const isCallNamed = (node, names)=>{
|
|
151
|
+
if (void 0 === node || !typescript.isCallExpression(node)) return false;
|
|
152
|
+
const accessPath = propertyAccessPath(node.expression);
|
|
153
|
+
return void 0 !== accessPath && names.has(accessPath.at(-1));
|
|
154
|
+
};
|
|
155
|
+
const objectLiteralProperty = (objectLiteral, name)=>objectLiteral.properties.find((property)=>typescript.isPropertyAssignment(property) && nodeName(property.name) === name);
|
|
156
|
+
const moduleFederationConfigArgument = (sourceFile)=>{
|
|
157
|
+
let argument;
|
|
158
|
+
const visit = (node)=>{
|
|
159
|
+
if (void 0 !== argument) return;
|
|
160
|
+
if (typescript.isCallExpression(node) && typescript.isIdentifier(node.expression) && 'createModuleFederationConfig' === node.expression.text && 1 === node.arguments.length && typescript.isObjectLiteralExpression(node.arguments[0])) {
|
|
161
|
+
argument = node.arguments[0];
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
node.forEachChild(visit);
|
|
165
|
+
};
|
|
166
|
+
visit(sourceFile);
|
|
167
|
+
return argument;
|
|
168
|
+
};
|
|
169
|
+
const appDeclaresReactRouter = (appPath)=>{
|
|
170
|
+
const relativePath = `${appPath}/package.json`;
|
|
171
|
+
if (!node_fs.existsSync(node_path.join(root, relativePath))) return false;
|
|
172
|
+
const packageJson = readJson(relativePath);
|
|
173
|
+
return [
|
|
174
|
+
'react-router',
|
|
175
|
+
'react-router-dom'
|
|
176
|
+
].some((dependency)=>[
|
|
177
|
+
'dependencies',
|
|
178
|
+
'devDependencies'
|
|
179
|
+
].some((field)=>Object.hasOwn(packageJson[field] ?? {}, dependency)));
|
|
180
|
+
};
|
|
181
|
+
const bridgeRouterFixArea = 'declare bridge.enableBridgeRouter: false, or true only in an app that declares react-router or react-router-dom';
|
|
182
|
+
const assertBridgeRouterCapability = (sourceFile, appPath)=>{
|
|
183
|
+
const contract = 'module federation bridge capability';
|
|
184
|
+
const configArgument = moduleFederationConfigArgument(sourceFile);
|
|
185
|
+
if (void 0 === configArgument) compilerFailure(sourceFile, sourceFile, contract, 'Generated Module Federation must pass a literal config object to createModuleFederationConfig.', bridgeRouterFixArea);
|
|
186
|
+
const bridge = objectLiteralProperty(configArgument, 'bridge');
|
|
187
|
+
const declaration = void 0 !== bridge && typescript.isObjectLiteralExpression(bridge.initializer) ? objectLiteralProperty(bridge.initializer, 'enableBridgeRouter') : void 0;
|
|
188
|
+
if (void 0 === declaration) compilerFailure(sourceFile, bridge ?? configArgument, contract, 'Generated Module Federation must declare bridge.enableBridgeRouter in its config object.', bridgeRouterFixArea);
|
|
189
|
+
if (isBooleanLiteral(declaration.initializer, false)) return;
|
|
190
|
+
if (!isBooleanLiteral(declaration.initializer, true)) compilerFailure(sourceFile, declaration, contract, 'Generated Module Federation must declare bridge.enableBridgeRouter as a boolean literal.', bridgeRouterFixArea);
|
|
191
|
+
if (!appDeclaresReactRouter(appPath)) compilerFailure(sourceFile, declaration, contract, `Generated Module Federation enables the React bridge router while ${appPath}/package.json declares neither react-router nor react-router-dom.`, bridgeRouterFixArea);
|
|
192
|
+
};
|
|
193
|
+
const checkArchitecture = ()=>{
|
|
194
|
+
const structuralPolicy = workspaceValidationContract.structuralShellPolicy;
|
|
195
|
+
assert(structuralPolicy?.schemaVersion === 1, 'Structural thin-shell compiler policy must use schemaVersion 1');
|
|
196
|
+
const compositionPolicy = workspaceValidationContract.federatedCompositionPolicy;
|
|
197
|
+
assert(compositionPolicy?.schemaVersion === 1, 'Federated composition compiler policy must use schemaVersion 1');
|
|
198
|
+
const compilerInputs = new Set([
|
|
199
|
+
...(structuralPolicy.shells ?? []).flatMap((shell)=>collectCompilerInputs(shell.srcDir)),
|
|
200
|
+
...(compositionPolicy.hosts ?? []).flatMap((host)=>collectCompilerInputs(host.srcDir)),
|
|
201
|
+
...workspaceValidationContract.apps.flatMap((app)=>collectCompilerInputs(app.path))
|
|
202
|
+
]);
|
|
203
|
+
initializeCompilerSnapshot(compilerInputs);
|
|
204
|
+
for (const shell of structuralPolicy.shells ?? []){
|
|
205
|
+
for (const forbidden of structuralPolicy.forbiddenPathClasses ?? [])if ('shell-super-app' !== shell.id || 'backend-federation.config.ts' === forbidden.path) assert(!node_fs.existsSync(node_path.join(root, shell.packageDir, forbidden.path)), selfCheckFailure(`structural thin-shell ${forbidden.id}`, `${forbidden.diagnostic} Forbidden artifact ${shell.packageDir}/${forbidden.path} exists`, `remove forbidden thin-shell artifact ${shell.packageDir}/${forbidden.path}`));
|
|
206
|
+
if (void 0 !== compilerSnapshot) for (const absolutePath of collectCompilerInputs(shell.srcDir)){
|
|
207
|
+
const sourceFile = parseCompilerInput(absolutePath);
|
|
208
|
+
for (const reference of runtimeModuleReferences(sourceFile)){
|
|
209
|
+
if (resolvesInsideVerticalDirectory(sourceFile, reference.specifier)) {
|
|
210
|
+
const id = importDiagnosticId('vertical-directory', reference.kind);
|
|
211
|
+
compilerFailure(sourceFile, reference.node, `structural thin-shell ${id}`, 'A thin Shell must consume only published vertical surfaces, never a vertical implementation directory.', 'consume only published surfaces from the thin shell');
|
|
212
|
+
}
|
|
213
|
+
if (isWorkspaceSourceSpecifier(reference.specifier)) {
|
|
214
|
+
const id = importDiagnosticId('workspace-package', reference.kind);
|
|
215
|
+
compilerFailure(sourceFile, reference.node, `structural thin-shell ${id}`, 'A thin Shell must consume only package exports, never another package raw src directory.', 'consume only published surfaces from the thin shell');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (void 0 === compilerSnapshot) {
|
|
221
|
+
const packageJson = readJson('package.json');
|
|
222
|
+
assert('string' == typeof packageJson.devDependencies?.["@typescript/native"], 'Generated workspaces must declare the native TypeScript compiler used by architecture evidence');
|
|
223
|
+
assert(packageJson.scripts?.check?.split('&&').some((stage)=>'pnpm typecheck' === stage.trim()), 'Generated workspace check must execute compiler evidence before contract validation');
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
for (const host of compositionPolicy.hosts ?? [])for (const absolutePath of collectCompilerInputs(host.srcDir)){
|
|
227
|
+
const sourceFile = parseCompilerInput(absolutePath);
|
|
228
|
+
if (sourceFile.isDeclarationFile) continue;
|
|
229
|
+
const remoteImplementation = (specifier)=>(host.remotes ?? []).find((remote)=>{
|
|
230
|
+
if (specifier === remote.packageName) return true;
|
|
231
|
+
if (specifier.startsWith(`${remote.packageName}/`)) {
|
|
232
|
+
const subpath = specifier.slice(remote.packageName.length + 1);
|
|
233
|
+
return 'api' !== subpath && !subpath.startsWith('api/');
|
|
234
|
+
}
|
|
235
|
+
if (!specifier.startsWith('.')) return false;
|
|
236
|
+
const absoluteTarget = node_path.resolve(node_path.dirname(sourceFile.fileName), specifier);
|
|
237
|
+
const remoteDirectory = node_path.join(root, remote.directory);
|
|
238
|
+
return absoluteTarget === remoteDirectory || absoluteTarget.startsWith(remoteDirectory + node_path.sep);
|
|
239
|
+
});
|
|
240
|
+
for (const reference of runtimeModuleReferences(sourceFile)){
|
|
241
|
+
const remote = remoteImplementation(reference.specifier);
|
|
242
|
+
if (void 0 !== remote) compilerFailure(sourceFile, reference.node, 'federated composition remote-runtime-package-import', `Host ${host.id} imports the ${remote.id} render implementation through ${reference.specifier}.`, 'use import type for contracts or compose the implementation through Module Federation');
|
|
243
|
+
}
|
|
244
|
+
const hydrationStateSetters = new Set();
|
|
245
|
+
const visit = (node)=>{
|
|
246
|
+
if (typescript.isVariableDeclaration(node) && typescript.isArrayBindingPattern(node.name) && node.name.elements.length >= 2 && isCallNamed(node.initializer, new Set([
|
|
247
|
+
'useState'
|
|
248
|
+
])) && isBooleanLiteral(node.initializer.arguments[0], false)) {
|
|
249
|
+
const stateName = nodeName(node.name.elements[0].name)?.toLowerCase();
|
|
250
|
+
const setterName = nodeName(node.name.elements[1].name);
|
|
251
|
+
if (('hydrated' === stateName || 'ishydrated' === stateName) && void 0 !== setterName) hydrationStateSetters.add(setterName);
|
|
252
|
+
}
|
|
253
|
+
if ((typescript.isVariableDeclaration(node) || typescript.isFunctionDeclaration(node)) && 'createHydratedRemote' === nodeName(node.name)) compilerFailure(sourceFile, node, 'federated composition hydrated-remote-factory', 'Federated hosts must use the distributed SSR boundary directly; hydration-time remote factories are forbidden.', 'compose remote rendering through framework Module Federation primitives');
|
|
254
|
+
if ((typescript.isPropertyAssignment(node) || typescript.isJsxAttribute(node)) && ('loading' === nodeName(node.name) || 'fallback' === nodeName(node.name))) {
|
|
255
|
+
const value = typescript.isPropertyAssignment(node) ? node.initializer : void 0 !== node.initializer && typescript.isJsxExpression(node.initializer) ? node.initializer.expression : void 0;
|
|
256
|
+
if (void 0 !== value && (typescript.isJsxElement(value) || typescript.isJsxSelfClosingElement(value))) {
|
|
257
|
+
const tagName = typescript.isJsxElement(value) ? jsxTagName(value.openingElement.tagName) : jsxTagName(value.tagName);
|
|
258
|
+
if ('ServerComponent' === tagName || 'LocalComponent' === tagName) compilerFailure(sourceFile, node, 'federated composition local-loading-copy', 'Federated hosts must not render a local component copy while loading a remote implementation.', 'use an explicit unavailable-state component instead of a local implementation copy');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
node.forEachChild(visit);
|
|
262
|
+
};
|
|
263
|
+
visit(sourceFile);
|
|
264
|
+
if (hydrationStateSetters.size > 0) {
|
|
265
|
+
const findHydrationSetter = (node)=>{
|
|
266
|
+
if (typescript.isCallExpression(node) && typescript.isIdentifier(node.expression) && hydrationStateSetters.has(node.expression.text) && isBooleanLiteral(node.arguments[0], true)) compilerFailure(sourceFile, node, 'federated composition hydration-flag', 'Federated hosts must hydrate the server DOM directly; hydrated-state component switching is forbidden.', 'compose remote rendering through framework Module Federation primitives');
|
|
267
|
+
node.forEachChild(findHydrationSetter);
|
|
268
|
+
};
|
|
269
|
+
findHydrationSetter(sourceFile);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const shellRouteDirectories = (structuralPolicy.shells ?? []).map((shell)=>`${shell.packageDir}/src/routes`);
|
|
273
|
+
const appPaths = workspaceValidationContract.apps.map((app)=>app.path);
|
|
274
|
+
const configFiles = appPaths.flatMap((appPath)=>[
|
|
275
|
+
`${appPath}/modern.config.ts`,
|
|
276
|
+
`${appPath}/module-federation.config.ts`
|
|
277
|
+
]);
|
|
278
|
+
const moduleFederationConfigAppPaths = new Map(appPaths.map((appPath)=>[
|
|
279
|
+
node_path.join(root, `${appPath}/module-federation.config.ts`),
|
|
280
|
+
appPath
|
|
281
|
+
]).filter((entry)=>node_fs.existsSync(entry[0])));
|
|
282
|
+
const checkedFiles = new Set([
|
|
283
|
+
...shellRouteDirectories.flatMap(collectCompilerInputs),
|
|
284
|
+
...configFiles.map((relativePath)=>node_path.join(root, relativePath)).filter((absolutePath)=>node_fs.existsSync(absolutePath))
|
|
285
|
+
]);
|
|
286
|
+
for (const absolutePath of checkedFiles){
|
|
287
|
+
const sourceFile = parseCompilerInput(absolutePath);
|
|
288
|
+
const isShellRoute = shellRouteDirectories.some((relativeDirectory)=>{
|
|
289
|
+
const absoluteDirectory = node_path.join(root, relativeDirectory);
|
|
290
|
+
return absolutePath.startsWith(absoluteDirectory + node_path.sep);
|
|
291
|
+
});
|
|
292
|
+
const moduleFederationAppPath = moduleFederationConfigAppPaths.get(absolutePath);
|
|
293
|
+
const tailwindFactories = new Set();
|
|
294
|
+
const presetFactories = new Set();
|
|
295
|
+
for (const statement of sourceFile.statements){
|
|
296
|
+
if (!typescript.isImportDeclaration(statement) || !typescript.isStringLiteralLikeNode(statement.moduleSpecifier) || statement.importClause?.phaseModifier === typescript.SyntaxKind.TypeKeyword) continue;
|
|
297
|
+
const bindings = statement.importClause?.namedBindings;
|
|
298
|
+
if (void 0 !== bindings && typescript.isNamedImports(bindings)) for (const binding of bindings.elements){
|
|
299
|
+
if (binding.isTypeOnly) continue;
|
|
300
|
+
const imported = (binding.propertyName ?? binding.name).text;
|
|
301
|
+
if ('@rsbuild/plugin-tailwindcss' === statement.moduleSpecifier.text && 'pluginTailwindcss' === imported) tailwindFactories.add(binding.name.text);
|
|
302
|
+
if ('@modern-js/ultramodern-app-tools' === statement.moduleSpecifier.text && 'presetUltramodern' === imported) presetFactories.add(binding.name.text);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const modernConfigApp = workspaceValidationContract.apps.find((app)=>absolutePath === node_path.join(root, app.path, 'modern.config.ts'));
|
|
306
|
+
let insideDefaultExport = false;
|
|
307
|
+
const visit = (node)=>{
|
|
308
|
+
const previousDefaultExport = insideDefaultExport;
|
|
309
|
+
if (typescript.isExportAssignment(node) && !node.isExportEquals) insideDefaultExport = true;
|
|
310
|
+
if (insideDefaultExport && void 0 !== modernConfigApp && isCallNamed(node, presetFactories) && void 0 !== node.arguments[0] && typescript.isObjectLiteralExpression(node.arguments[0])) {
|
|
311
|
+
const builderPlugins = objectLiteralProperty(node.arguments[0], 'builderPlugins');
|
|
312
|
+
const usesTailwind = void 0 !== builderPlugins && typescript.isArrayLiteralExpression(builderPlugins.initializer) && builderPlugins.initializer.elements.some((plugin)=>isCallNamed(plugin, tailwindFactories));
|
|
313
|
+
const emitsUi = 'shell' === modernConfigApp.kind || fullStackVerticals.some((vertical)=>vertical.id === modernConfigApp.id && vertical.emitsUi);
|
|
314
|
+
if (usesTailwind !== (tailwindEnabled && emitsUi)) compilerFailure(sourceFile, builderPlugins ?? node, `${compactConfigPath} policy.features.tailwind`, `Tailwind feature flag is ${tailwindEnabled}, but ${modernConfigApp.id} exported config ${usesTailwind ? 'enables' : 'does not enable'} the Tailwind builder plugin.`, 'keep the Tailwind feature flag and active app builder configuration consistent');
|
|
315
|
+
}
|
|
316
|
+
if (typescript.isImportDeclaration(node) && typescript.isStringLiteralLikeNode(node.moduleSpecifier) && 'node:child_process' === node.moduleSpecifier.text) compilerFailure(sourceFile, node, 'framework config API node-child-process-access', 'Generated config must not invoke node:child_process directly.', 'use the framework config environment API');
|
|
317
|
+
const accessPath = propertyAccessPath(node);
|
|
318
|
+
if (sameJson(accessPath, [
|
|
319
|
+
'process',
|
|
320
|
+
'env'
|
|
321
|
+
])) compilerFailure(sourceFile, node, 'framework config API direct-process-env-access', 'Generated config must use the framework config environment API instead of process.env.', 'use getBuildConfigEnvironment');
|
|
322
|
+
if (typescript.isIdentifier(node) && 'ULTRAMODERN_ZEPHYR' === node.text) compilerFailure(sourceFile, node, 'zephyr gating ultramodern-zephyr-environment-gate', 'Generated Zephyr integration must not be gated through ULTRAMODERN_ZEPHYR.', 'use Zephyr native deploy-token behavior');
|
|
323
|
+
if (typescript.isPropertyAssignment(node)) {
|
|
324
|
+
const property = nodeName(node.name);
|
|
325
|
+
if ('enableBridgeRouter' === property && void 0 === moduleFederationAppPath || 'disableDynamicRemoteTypeHints' === property && isBooleanLiteral(node.initializer, true) || 'treeShakingSharedExcludePlugins' === property) compilerFailure(sourceFile, node, 'module federation bridge capability', `Generated Module Federation carries forbidden option ${property}.`, 'use framework-owned Module Federation defaults');
|
|
326
|
+
}
|
|
327
|
+
if (isShellRoute) {
|
|
328
|
+
if (typescript.isJsxOpeningElement(node) && 'a' === jsxTagName(node.tagName) && void 0 !== jsxAttribute(node.attributes, 'onClick')) compilerFailure(sourceFile, node, 'shell routing synthetic-anchor-click-interception', 'Shell routing must not intercept anchor clicks synthetically.', 'use the router Link primitive');
|
|
329
|
+
if (isCallNamed(node, new Set([
|
|
330
|
+
'hydrateRoot',
|
|
331
|
+
'loadRemote',
|
|
332
|
+
'loadShare'
|
|
333
|
+
]))) compilerFailure(sourceFile, node, 'module federation native loading', 'Shell routing must use framework Module Federation loading primitives.', 'remove manual hydration or remote-loading wrappers');
|
|
334
|
+
if (typescript.isBinaryExpression(node) && node.operatorToken.kind === typescript.SyntaxKind.EqualsToken && propertyAccessPath(node.left)?.slice(0, 2).join('.') === 'window.location' || typescript.isCallExpression(node) && propertyAccessPath(node.expression)?.slice(0, 2).join('.') === 'window.location') compilerFailure(sourceFile, node, 'shell routing window-location-navigation', 'Shell routing must use router navigation instead of window.location.', 'use the router navigation primitive');
|
|
335
|
+
}
|
|
336
|
+
node.forEachChild(visit);
|
|
337
|
+
insideDefaultExport = previousDefaultExport;
|
|
338
|
+
};
|
|
339
|
+
visit(sourceFile);
|
|
340
|
+
if (void 0 !== moduleFederationAppPath) assertBridgeRouterCapability(sourceFile, moduleFederationAppPath);
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
checkArchitecture();
|
|
344
|
+
} finally{
|
|
345
|
+
compiler?.close();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
export { assertCompilerArchitecture };
|