@empire-builder-kit/nx 1.0.0-rc.37 → 1.0.0-rc.39
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 +18 -0
- package/executors.json +5 -0
- package/generators.json +10 -0
- package/package.json +20 -3
- package/src/aws-authority/index.d.ts +1 -0
- package/src/aws-authority/index.js +1 -0
- package/src/aws-authority/lambda-policy-ordering.d.ts +38 -0
- package/src/aws-authority/lambda-policy-ordering.js +56 -0
- package/src/aws-authority/stage-authority.d.ts +11 -3
- package/src/aws-authority/stage-authority.js +615 -29
- package/src/blueprints/external-sandbox.js +21 -9
- package/src/blueprints/manifest.d.ts +1 -1
- package/src/blueprints/resolver.js +28 -15
- package/src/cli/bootstrap.d.ts +1 -1
- package/src/cli/deploy-runtime.d.ts +6 -0
- package/src/cli/deploy-runtime.js +58 -0
- package/src/cli/dev-command.d.ts +16 -4
- package/src/cli/dev-command.js +63 -0
- package/src/cli/main.d.ts +7 -1
- package/src/cli/main.js +128 -20
- package/src/cli/output.d.ts +1 -1
- package/src/developer-agent/context.js +41 -9
- package/src/developer-agent/generator-planning.js +16 -2
- package/src/developer-agent/git-inspection.d.ts +6 -2
- package/src/developer-agent/git-inspection.js +78 -6
- package/src/developer-agent/model.d.ts +4 -2
- package/src/developer-agent/operation-registry.d.ts +5 -0
- package/src/developer-agent/operation-registry.js +179 -23
- package/src/developer-agent/preview-changes.d.ts +2 -0
- package/src/developer-agent/preview-changes.js +14 -2
- package/src/developer-agent/preview-source.js +3 -0
- package/src/developer-agent/validation.js +20 -8
- package/src/developer-agent/workspace-inspection.js +37 -3
- package/src/executors/deployment-plan/deployment-plan.d.ts +2 -0
- package/src/executors/deployment-plan/deployment-plan.js +51 -4
- package/src/executors/dev-doctor/dev-doctor.js +13 -6
- package/src/executors/dev-task-cleanup/dev-task-cleanup.d.ts +23 -0
- package/src/executors/dev-task-cleanup/dev-task-cleanup.js +145 -0
- package/src/executors/dev-task-cleanup/schema.json +9 -0
- package/src/executors/dev-task-cleanup/task-stack-absence.d.ts +27 -0
- package/src/executors/dev-task-cleanup/task-stack-absence.js +281 -0
- package/src/executors/dev-task-cleanup/task-stack-checkpoint.d.ts +12 -0
- package/src/executors/dev-task-cleanup/task-stack-checkpoint.js +92 -0
- package/src/executors/fleet/fleet.js +1 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +28 -1
- package/src/executors/local-deploy/local-deploy.d.ts +8 -1
- package/src/executors/local-deploy/local-deploy.js +97 -24
- package/src/executors/local-deploy/schema.json +8 -0
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +30 -18
- package/src/executors/sst-lifecycle/governed-native-operation.d.ts +2 -0
- package/src/executors/sst-lifecycle/governed-native-operation.js +9 -0
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +5 -0
- package/src/executors/sst-lifecycle/run-sst-command.js +220 -32
- package/src/executors/sst-lifecycle/sst-environment-source.d.ts +8 -0
- package/src/executors/sst-lifecycle/sst-environment-source.js +54 -0
- package/src/executors/sst-lifecycle/task-unlock.d.ts +15 -0
- package/src/executors/sst-lifecycle/task-unlock.js +126 -0
- package/src/foundation/capability-plan.d.ts +43 -0
- package/src/foundation/capability-plan.js +168 -0
- package/src/foundation/discovery.d.ts +14 -11
- package/src/foundation/discovery.js +32 -6
- package/src/foundation/index.d.ts +1 -0
- package/src/foundation/index.js +1 -0
- package/src/foundation/local-database-contract.d.ts +20 -0
- package/src/foundation/local-database-contract.js +262 -13
- package/src/foundation/local-private-smoke-access.d.ts +20 -0
- package/src/foundation/local-private-smoke-access.js +197 -0
- package/src/foundation/preflight.js +37 -18
- package/src/foundation/private-smoke-access.js +10 -2
- package/src/foundation/private-smoke-admission.d.ts +3 -1
- package/src/foundation/private-smoke-admission.js +29 -8
- package/src/foundation/private-smoke-control-plane.js +17 -6
- package/src/foundation/provision-database-bindings.d.ts +5 -0
- package/src/foundation/provision-database-bindings.js +41 -8
- package/src/foundation/provision-logical-database.js +13 -8
- package/src/foundation/requirements.d.ts +3 -3
- package/src/foundation/requirements.js +24 -12
- package/src/foundation/router-waf.d.ts +1 -0
- package/src/foundation/router-waf.js +14 -1
- package/src/generators/blueprint/blueprint.d.ts +5 -0
- package/src/generators/blueprint/blueprint.js +102 -0
- package/src/generators/blueprint/files.d.ts +6 -0
- package/src/generators/blueprint/files.js +217 -0
- package/src/generators/blueprint/schema.d.ts +4 -0
- package/src/generators/blueprint/schema.json +18 -0
- package/src/generators/formatting.js +24 -1
- package/src/generators/logging-registry.d.ts +2 -0
- package/src/generators/logging-registry.js +22 -0
- package/src/generators/preset/workspace-files-adopter-skills.d.ts +7 -0
- package/src/generators/preset/workspace-files-adopter-skills.js +301 -0
- package/src/generators/preset/workspace-files-ci-install.d.ts +2 -0
- package/src/generators/preset/workspace-files-ci-install.js +196 -0
- package/src/generators/preset/workspace-files-developer-agent.js +40 -13
- package/src/generators/preset/workspace-files-performance-load.js +8 -0
- package/src/generators/preset/workspace-files-stage-authority.js +40 -1
- package/src/generators/preset/workspace-files-thin-deploy.js +66 -34
- package/src/generators/preset/workspace-files-thin-docs.js +64 -18
- package/src/generators/preset/workspace-files.d.ts +4 -0
- package/src/generators/preset/workspace-files.js +159 -91
- package/src/generators/repository-policy/repository-policy.js +37 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js +42 -7
- package/src/generators/slice/built-in-plan-api-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-api-files.js +47 -389
- package/src/generators/slice/built-in-plan-async-work-files.js +19 -1912
- package/src/generators/slice/built-in-plan-authorization-files.js +92 -329
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +36 -2
- package/src/generators/slice/built-in-plan-authorization-storage.d.ts +3 -0
- package/src/generators/slice/built-in-plan-authorization-storage.js +119 -0
- package/src/generators/slice/built-in-plan-background-work-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-background-work-files.js +15 -5
- package/src/generators/slice/built-in-plan-data-deletion-files.js +2 -830
- package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-data-files.js +61 -1164
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js +53 -28
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +18 -2
- package/src/generators/slice/built-in-plan-data-retention-job-files.js +7 -2446
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +30 -6
- package/src/generators/slice/built-in-plan-data-rights-files.js +6 -4482
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js +4 -15
- package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -1
- package/src/generators/slice/built-in-plan-foundation-files.js +34 -10
- package/src/generators/slice/built-in-plan-frontend-files.js +2 -2
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js +180 -522
- package/src/generators/slice/built-in-plan-key-value-cleanup.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-cleanup.js +100 -0
- package/src/generators/slice/built-in-plan-key-value-consumer.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-consumer.js +151 -0
- package/src/generators/slice/built-in-plan-key-value-deletion.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-deletion.js +377 -0
- package/src/generators/slice/built-in-plan-key-value-delivery.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-delivery.js +120 -0
- package/src/generators/slice/built-in-plan-key-value-export.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-export.js +595 -0
- package/src/generators/slice/built-in-plan-key-value-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-files.js +31 -0
- package/src/generators/slice/built-in-plan-key-value-holds.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-holds.js +189 -0
- package/src/generators/slice/built-in-plan-key-value-infrastructure.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-infrastructure.js +102 -0
- package/src/generators/slice/built-in-plan-key-value-performance.d.ts +5 -0
- package/src/generators/slice/built-in-plan-key-value-performance.js +530 -0
- package/src/generators/slice/built-in-plan-key-value-provider.d.ts +4 -0
- package/src/generators/slice/built-in-plan-key-value-provider.js +366 -0
- package/src/generators/slice/built-in-plan-key-value-records.d.ts +3 -0
- package/src/generators/slice/built-in-plan-key-value-records.js +232 -0
- package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-infrastructure.js +103 -0
- package/src/generators/slice/built-in-plan-key-value-retention-job-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-job-files.js +160 -0
- package/src/generators/slice/built-in-plan-key-value-retention-maintenance.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-maintenance.js +329 -0
- package/src/generators/slice/built-in-plan-key-value-retention-worker.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention-worker.js +477 -0
- package/src/generators/slice/built-in-plan-key-value-retention.d.ts +2 -0
- package/src/generators/slice/built-in-plan-key-value-retention.js +184 -0
- package/src/generators/slice/built-in-plan-metadata-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-metadata-files.js +140 -28
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +36 -19
- package/src/generators/slice/built-in-plan-operations-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-operations-files.js +89 -50
- package/src/generators/slice/built-in-plan-performance-files.js +84 -1010
- package/src/generators/slice/built-in-plan-project-files.js +116 -67
- package/src/generators/slice/built-in-plan-release-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-release-files.js +64 -15
- package/src/generators/slice/built-in-plan-reliability-files.js +54 -28
- package/src/generators/slice/built-in-plan-shared.d.ts +4 -2
- package/src/generators/slice/built-in-plan-shared.js +41 -19
- package/src/generators/slice/built-in-plan-sql-events.d.ts +2 -0
- package/src/generators/slice/built-in-plan-sql-events.js +257 -0
- package/src/generators/slice/built-in-plan-testing-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-testing-files.js +184 -132
- package/src/generators/slice/built-in-plan-testing-persistence-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-testing-persistence-files.js +178 -0
- package/src/generators/slice/built-in-plan-thin-release-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-thin-release-files.js +35 -2
- package/src/generators/slice/built-in-plan-verification-files.js +70 -0
- package/src/generators/slice/built-in-plan-web-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-web-files.js +206 -14
- package/src/generators/slice/built-in-plan-workload-role-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js +113 -274
- package/src/generators/slice/built-in-plan.d.ts +9 -1
- package/src/generators/slice/built-in-plan.js +49 -21
- package/src/generators/slice/data-policy-review-seed.d.ts +2 -0
- package/src/generators/slice/data-policy-review-seed.js +22 -0
- package/src/generators/slice/deployed-smoke-readiness.d.ts +2 -0
- package/src/generators/slice/deployed-smoke-readiness.js +214 -0
- package/src/generators/slice/local-source-identity.d.ts +2 -0
- package/src/generators/slice/local-source-identity.js +31 -0
- package/src/generators/slice/persistence-contract.d.ts +14 -0
- package/src/generators/slice/persistence-contract.js +32 -0
- package/src/generators/slice/slice.js +29 -24
- package/src/generators/sql/schema.d.ts +7 -0
- package/src/generators/sql/schema.json +38 -0
- package/src/generators/sql/sql.d.ts +6 -0
- package/src/generators/sql/sql.js +53 -0
- package/src/generators/upgrade/sql-seeded-reconciliation.d.ts +2 -0
- package/src/generators/upgrade/sql-seeded-reconciliation.js +170 -0
- package/src/generators/upgrade/upgrade.d.ts +2 -0
- package/src/generators/upgrade/upgrade.js +136 -9
- package/src/generators/workload/workload.js +51 -2
- package/src/local-dev/browser-verification.d.ts +37 -0
- package/src/local-dev/browser-verification.js +281 -0
- package/src/local-dev/contracts.d.ts +10 -1
- package/src/local-dev/contracts.js +114 -13
- package/src/local-dev/dev-command-core.js +24 -5
- package/src/local-dev/docker-credential-health.d.ts +14 -0
- package/src/local-dev/docker-credential-health.js +94 -0
- package/src/local-dev/environment-inspector.d.ts +7 -0
- package/src/local-dev/environment-inspector.js +42 -15
- package/src/local-dev/environment-state.js +2 -2
- package/src/local-dev/errors.d.ts +1 -1
- package/src/local-dev/errors.js +2 -0
- package/src/local-dev/fleet-client.js +2 -2
- package/src/local-dev/fleet-configuration.js +57 -25
- package/src/local-dev/fleet-inventory.js +46 -18
- package/src/local-dev/fleet-ipc.d.ts +7 -0
- package/src/local-dev/fleet-ipc.js +14 -2
- package/src/local-dev/fleet-launcher.d.ts +6 -0
- package/src/local-dev/fleet-launcher.js +14 -2
- package/src/local-dev/fleet-logs.js +50 -22
- package/src/local-dev/fleet-process.d.ts +20 -1
- package/src/local-dev/fleet-process.js +197 -41
- package/src/local-dev/fleet-runner-evidence.d.ts +5 -0
- package/src/local-dev/fleet-runner-evidence.js +56 -0
- package/src/local-dev/fleet-runtime.js +268 -229
- package/src/local-dev/fleet-session.d.ts +2 -0
- package/src/local-dev/fleet-session.js +28 -11
- package/src/local-dev/fleet-slice-runner-daemon.js +4 -0
- package/src/local-dev/fleet-state.d.ts +5 -2
- package/src/local-dev/fleet-state.js +25 -4
- package/src/local-dev/fleet-supervisor.d.ts +3 -0
- package/src/local-dev/fleet-supervisor.js +66 -11
- package/src/local-dev/fleet-web-start.d.ts +12 -0
- package/src/local-dev/fleet-web-start.js +48 -0
- package/src/local-dev/identity.js +3 -14
- package/src/local-dev/index.d.ts +1 -0
- package/src/local-dev/index.js +1 -0
- package/src/local-dev/native-completion.d.ts +9 -0
- package/src/local-dev/native-completion.js +130 -0
- package/src/local-dev/nx-workspace.d.ts +4 -2
- package/src/local-dev/nx-workspace.js +11 -6
- package/src/local-dev/personal-stage.d.ts +4 -5
- package/src/local-dev/personal-stage.js +6 -54
- package/src/local-dev/port-claims.d.ts +13 -0
- package/src/local-dev/port-claims.js +46 -0
- package/src/local-dev/ports.d.ts +14 -2
- package/src/local-dev/ports.js +78 -3
- package/src/local-dev/private-state.d.ts +6 -0
- package/src/local-dev/private-state.js +126 -34
- package/src/local-dev/process-group.d.ts +4 -0
- package/src/local-dev/process-group.js +29 -0
- package/src/local-dev/process-identity.d.ts +8 -0
- package/src/local-dev/process-identity.js +31 -1
- package/src/local-dev/proxy.js +11 -12
- package/src/local-dev/runtime-paths.js +1 -1
- package/src/local-dev/slice-claim.js +1 -1
- package/src/local-dev/slice-runner.d.ts +15 -6
- package/src/local-dev/slice-runner.js +189 -54
- package/src/local-dev/task-attachment.d.ts +17 -0
- package/src/local-dev/task-attachment.js +73 -0
- package/src/local-dev/task-authority.d.ts +10 -0
- package/src/local-dev/task-authority.js +27 -0
- package/src/local-dev/task-identity.d.ts +33 -0
- package/src/local-dev/task-identity.js +418 -0
- package/src/local-dev/task-native-writer.d.ts +18 -0
- package/src/local-dev/task-native-writer.js +329 -0
- package/src/local-dev/tls.js +3 -1
- package/src/local-dev/web-launch.d.ts +9 -0
- package/src/local-dev/web-launch.js +130 -0
- package/src/ownership/composition.d.ts +2 -1
- package/src/ownership/composition.js +1 -0
- package/src/performance/scenario.d.ts +22 -0
- package/src/performance/scenario.js +100 -92
- package/src/repository-policy/deployment-plan.d.ts +2 -2
- package/src/repository-policy/deployment-plan.js +2 -1
- package/src/repository-policy/policy.js +38 -3
- package/src/schemas/blueprint-v1.json +5 -4
- package/src/schemas/foundation-requirement-v1.json +5 -4
- package/src/schemas/testing-evidence-result-v1.json +1 -1
- package/src/secrets/operator.d.ts +3 -1
- package/src/secrets/operator.js +22 -3
- package/src/sst-environment-source-format.d.ts +3 -0
- package/src/sst-environment-source-format.js +20 -0
- package/src/supply-chain/blueprint-trust-git.js +13 -3
- package/src/supply-chain/build-output.js +15 -0
- package/src/supply-chain/generated-blueprint-trust-command.js +18 -1
- package/src/testing-evidence/fixture-scope.d.ts +2 -1
- package/src/testing-evidence/fixture-scope.js +4 -2
- package/src/testing-evidence/result.d.ts +2 -1
- package/src/testing-evidence/result.js +18 -4
- package/src/workload-roles/standard-slice.js +2 -3
- package/src/api-contract/baseline-update.js.map +0 -1
- package/src/api-contract/compatibility.js.map +0 -1
- package/src/api-contract/contract-graph.js.map +0 -1
- package/src/api-contract/evidence.js.map +0 -1
- package/src/api-contract/index.js.map +0 -1
- package/src/api-contract/model.fixtures.d.ts +0 -2
- package/src/api-contract/model.fixtures.js +0 -81
- package/src/api-contract/model.fixtures.js.map +0 -1
- package/src/api-contract/model.js.map +0 -1
- package/src/api-contract/rollout.js.map +0 -1
- package/src/authorization/compatibility.js.map +0 -1
- package/src/authorization/index.js.map +0 -1
- package/src/aws/child-environment.js.map +0 -1
- package/src/aws/identity.js.map +0 -1
- package/src/aws-authority/index.js.map +0 -1
- package/src/aws-authority/stage-authority.js.map +0 -1
- package/src/blueprints/execution.js.map +0 -1
- package/src/blueprints/external-sandbox.js.map +0 -1
- package/src/blueprints/index.js.map +0 -1
- package/src/blueprints/inputs.js.map +0 -1
- package/src/blueprints/manifest.js.map +0 -1
- package/src/blueprints/resolver.js.map +0 -1
- package/src/blueprints/transitions.js.map +0 -1
- package/src/cli/agent-command.js.map +0 -1
- package/src/cli/agent-runtime.js.map +0 -1
- package/src/cli/blueprint-authority.js.map +0 -1
- package/src/cli/blueprint-command.js.map +0 -1
- package/src/cli/bootstrap.js.map +0 -1
- package/src/cli/dev-command.js.map +0 -1
- package/src/cli/main.js.map +0 -1
- package/src/cli/output.js.map +0 -1
- package/src/cli/personal-secret-runtime.js.map +0 -1
- package/src/cli/secret-terminal.js.map +0 -1
- package/src/container-images.js.map +0 -1
- package/src/data-lifecycle/index.js.map +0 -1
- package/src/data-lifecycle/model.fixtures.d.ts +0 -2
- package/src/data-lifecycle/model.fixtures.js +0 -244
- package/src/data-lifecycle/model.fixtures.js.map +0 -1
- package/src/data-lifecycle/model.js.map +0 -1
- package/src/data-lifecycle/sensitive-artifacts.js.map +0 -1
- package/src/data-lifecycle/validation.js.map +0 -1
- package/src/database-retirement/contract.js.map +0 -1
- package/src/database-retirement/index.js.map +0 -1
- package/src/deterministic-order.js.map +0 -1
- package/src/developer-agent/context.js.map +0 -1
- package/src/developer-agent/generator-planning.js.map +0 -1
- package/src/developer-agent/generator-preview.js.map +0 -1
- package/src/developer-agent/git-inspection.js.map +0 -1
- package/src/developer-agent/handoff.js.map +0 -1
- package/src/developer-agent/index.js.map +0 -1
- package/src/developer-agent/model.js.map +0 -1
- package/src/developer-agent/operation-registry.js.map +0 -1
- package/src/developer-agent/ordering.js.map +0 -1
- package/src/developer-agent/planning.js.map +0 -1
- package/src/developer-agent/preview-changes.js.map +0 -1
- package/src/developer-agent/preview-source.js.map +0 -1
- package/src/developer-agent/validation.js.map +0 -1
- package/src/developer-agent/workspace-inspection.js.map +0 -1
- package/src/developer-agent/workspace-path.js.map +0 -1
- package/src/executors/blueprint-trust/blueprint-trust.js.map +0 -1
- package/src/executors/blueprint-verification/blueprint-verification.js.map +0 -1
- package/src/executors/deploy/deploy.js.map +0 -1
- package/src/executors/deployment-plan/deployment-plan.js.map +0 -1
- package/src/executors/dev/dev.js.map +0 -1
- package/src/executors/dev-doctor/dev-doctor.js.map +0 -1
- package/src/executors/dev-setup/dev-setup.js.map +0 -1
- package/src/executors/developer-context/developer-context.js.map +0 -1
- package/src/executors/fleet/fleet.js.map +0 -1
- package/src/executors/foundation-preflight/foundation-preflight.js.map +0 -1
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +0 -1
- package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +0 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +0 -1
- package/src/executors/github-bootstrap/github-bootstrap.js.map +0 -1
- package/src/executors/infrastructure-plan/infrastructure-plan.js.map +0 -1
- package/src/executors/local-deploy/federated-credential-transport.js.map +0 -1
- package/src/executors/local-deploy/fixtures/local-deploy-state-machine.mjs +0 -53
- package/src/executors/local-deploy/local-approval.js.map +0 -1
- package/src/executors/local-deploy/local-deploy.js.map +0 -1
- package/src/executors/refresh/refresh.js.map +0 -1
- package/src/executors/remove/remove.js.map +0 -1
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +0 -1
- package/src/executors/secret-guardrails/secret-guardrails.js.map +0 -1
- package/src/executors/secret-initialize/secret-initialize.js.map +0 -1
- package/src/executors/secret-metadata/secret-metadata.js.map +0 -1
- package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +0 -1
- package/src/executors/sst-lifecycle/governed-native-operation.js.map +0 -1
- package/src/executors/sst-lifecycle/logging-preflight.js.map +0 -1
- package/src/executors/sst-lifecycle/run-sst-command.js.map +0 -1
- package/src/executors/sst-lifecycle/secret-preflight.js.map +0 -1
- package/src/executors/sst-lifecycle/sst-environment-source.js.map +0 -1
- package/src/executors/unlock/unlock.js.map +0 -1
- package/src/executors/work-markers/work-markers.js.map +0 -1
- package/src/foundation/discovery.js.map +0 -1
- package/src/foundation/index.js.map +0 -1
- package/src/foundation/local-database-contract.js.map +0 -1
- package/src/foundation/logging-preflight.js.map +0 -1
- package/src/foundation/logging.js.map +0 -1
- package/src/foundation/partial-state.js.map +0 -1
- package/src/foundation/preflight.js.map +0 -1
- package/src/foundation/private-smoke-access.js.map +0 -1
- package/src/foundation/private-smoke-admission.js.map +0 -1
- package/src/foundation/private-smoke-control-plane.js.map +0 -1
- package/src/foundation/provision-database-bindings.js.map +0 -1
- package/src/foundation/provision-logical-database.js.map +0 -1
- package/src/foundation/requirements.js.map +0 -1
- package/src/foundation/router-origin-proof.js.map +0 -1
- package/src/foundation/router-waf-rate-rehearsal.js.map +0 -1
- package/src/foundation/router-waf.js.map +0 -1
- package/src/foundation/stages.js.map +0 -1
- package/src/frontend-security/index.js.map +0 -1
- package/src/frontend-security/security-headers.js.map +0 -1
- package/src/generators/feature-registry.js.map +0 -1
- package/src/generators/formatting.js.map +0 -1
- package/src/generators/function/function.js.map +0 -1
- package/src/generators/job/job.js.map +0 -1
- package/src/generators/logging-registry.js.map +0 -1
- package/src/generators/post-generation-install.js.map +0 -1
- package/src/generators/preset/dependency-overrides.js.map +0 -1
- package/src/generators/preset/generator.js.map +0 -1
- package/src/generators/preset/tool-versions.js.map +0 -1
- package/src/generators/preset/workspace-files-ci-acceptance.js.map +0 -1
- package/src/generators/preset/workspace-files-developer-agent.js.map +0 -1
- package/src/generators/preset/workspace-files-ecr-inspector.js.map +0 -1
- package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +0 -1
- package/src/generators/preset/workspace-files-performance-cost.js.map +0 -1
- package/src/generators/preset/workspace-files-performance-load.js.map +0 -1
- package/src/generators/preset/workspace-files-stage-authority.js.map +0 -1
- package/src/generators/preset/workspace-files-thin-deploy.js.map +0 -1
- package/src/generators/preset/workspace-files-thin-docs.js.map +0 -1
- package/src/generators/preset/workspace-files-thin-release.js.map +0 -1
- package/src/generators/preset/workspace-files-workload-role-baseline.js.map +0 -1
- package/src/generators/preset/workspace-files.js.map +0 -1
- package/src/generators/repository-policy/repository-policy.js.map +0 -1
- package/src/generators/repository-policy/tree-policy.js.map +0 -1
- package/src/generators/service/service.js.map +0 -1
- package/src/generators/slice/built-in-plan-api-contract-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-api-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-async-work-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-authorization-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-background-work-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-deletion-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-data-rights-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-foundation-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-frontend-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-metadata-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-operations-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-performance-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-project-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-release-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-reliability-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-shared.js.map +0 -1
- package/src/generators/slice/built-in-plan-testing-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-thin-release-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-verification-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-web-files.js.map +0 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js.map +0 -1
- package/src/generators/slice/built-in-plan.js.map +0 -1
- package/src/generators/slice/slice.js.map +0 -1
- package/src/generators/upgrade/upgrade.js.map +0 -1
- package/src/generators/workload/frozen-container.js.map +0 -1
- package/src/generators/workload/performance-registration.js.map +0 -1
- package/src/generators/workload/reliability-registration.js.map +0 -1
- package/src/generators/workload/service-performance-files.js.map +0 -1
- package/src/generators/workload/workload.js.map +0 -1
- package/src/git-policy/action-pins.js.map +0 -1
- package/src/git-policy/github-bootstrap.js.map +0 -1
- package/src/git-policy/index.js.map +0 -1
- package/src/git-policy/routing.js.map +0 -1
- package/src/index.js.map +0 -1
- package/src/infrastructure-change/convergence.js.map +0 -1
- package/src/infrastructure-change/drift.js.map +0 -1
- package/src/infrastructure-change/index.js.map +0 -1
- package/src/infrastructure-change/local-capability.js.map +0 -1
- package/src/infrastructure-change/model.js.map +0 -1
- package/src/infrastructure-change/normalize.js.map +0 -1
- package/src/infrastructure-change/plan.js.map +0 -1
- package/src/infrastructure-change/risk.js.map +0 -1
- package/src/infrastructure-change/summary.js.map +0 -1
- package/src/local-dev/context-discovery.js.map +0 -1
- package/src/local-dev/contract-validation.js.map +0 -1
- package/src/local-dev/contracts.js.map +0 -1
- package/src/local-dev/control-contract.js.map +0 -1
- package/src/local-dev/dev-command-core.js.map +0 -1
- package/src/local-dev/effects.js.map +0 -1
- package/src/local-dev/environment-inspector.js.map +0 -1
- package/src/local-dev/environment-state.js.map +0 -1
- package/src/local-dev/errors.js.map +0 -1
- package/src/local-dev/fleet-client.js.map +0 -1
- package/src/local-dev/fleet-configuration.js.map +0 -1
- package/src/local-dev/fleet-inventory.js.map +0 -1
- package/src/local-dev/fleet-ipc.js.map +0 -1
- package/src/local-dev/fleet-launcher.js.map +0 -1
- package/src/local-dev/fleet-lock.js.map +0 -1
- package/src/local-dev/fleet-logs.js.map +0 -1
- package/src/local-dev/fleet-process.js.map +0 -1
- package/src/local-dev/fleet-runtime.js.map +0 -1
- package/src/local-dev/fleet-session.js.map +0 -1
- package/src/local-dev/fleet-slice-runner-daemon.js.map +0 -1
- package/src/local-dev/fleet-startup.js.map +0 -1
- package/src/local-dev/fleet-state.js.map +0 -1
- package/src/local-dev/fleet-supervisor-daemon.js.map +0 -1
- package/src/local-dev/fleet-supervisor.js.map +0 -1
- package/src/local-dev/gateway-daemon.js.map +0 -1
- package/src/local-dev/gateway.js.map +0 -1
- package/src/local-dev/identity.js.map +0 -1
- package/src/local-dev/index.js.map +0 -1
- package/src/local-dev/local-context.js.map +0 -1
- package/src/local-dev/nx-workspace.js.map +0 -1
- package/src/local-dev/personal-secret-ledger.js.map +0 -1
- package/src/local-dev/personal-stage.js.map +0 -1
- package/src/local-dev/portless.js.map +0 -1
- package/src/local-dev/ports.js.map +0 -1
- package/src/local-dev/private-state.js.map +0 -1
- package/src/local-dev/process-identity.js.map +0 -1
- package/src/local-dev/proxy.js.map +0 -1
- package/src/local-dev/runtime-paths.js.map +0 -1
- package/src/local-dev/secret-slice-claim.js.map +0 -1
- package/src/local-dev/slice-claim.js.map +0 -1
- package/src/local-dev/slice-runner.js.map +0 -1
- package/src/local-dev/tls.js.map +0 -1
- package/src/ownership/composition.js.map +0 -1
- package/src/ownership/foundation-record.js.map +0 -1
- package/src/ownership/hash.js.map +0 -1
- package/src/ownership/index.js.map +0 -1
- package/src/ownership/json-ownership.js.map +0 -1
- package/src/ownership/record.js.map +0 -1
- package/src/ownership/workspace-record.js.map +0 -1
- package/src/performance/cost-collection.js.map +0 -1
- package/src/performance/cost-controls.js.map +0 -1
- package/src/performance/evidence.js.map +0 -1
- package/src/performance/index.js.map +0 -1
- package/src/performance/load-safety.js.map +0 -1
- package/src/performance/model.js.map +0 -1
- package/src/performance/pr-artifact-budget.js.map +0 -1
- package/src/performance/runner.js.map +0 -1
- package/src/performance/scenario-endpoint.js.map +0 -1
- package/src/performance/scenario.js.map +0 -1
- package/src/performance/test-fixtures.d.ts +0 -7
- package/src/performance/test-fixtures.js +0 -167
- package/src/performance/test-fixtures.js.map +0 -1
- package/src/performance/unit-cost.js.map +0 -1
- package/src/release/index.js.map +0 -1
- package/src/release/lifecycle.js.map +0 -1
- package/src/release/manifest.js.map +0 -1
- package/src/release/rollout.js.map +0 -1
- package/src/release/source-authority.js.map +0 -1
- package/src/repository-policy/aurora-preflight.js.map +0 -1
- package/src/repository-policy/capacity-migration.js.map +0 -1
- package/src/repository-policy/deployment-plan.js.map +0 -1
- package/src/repository-policy/foundation-profile.js.map +0 -1
- package/src/repository-policy/index.js.map +0 -1
- package/src/repository-policy/policy.js.map +0 -1
- package/src/secrets/adapters.js.map +0 -1
- package/src/secrets/aws-control-plane.js.map +0 -1
- package/src/secrets/declaration-verification.js.map +0 -1
- package/src/secrets/generated-aws-control-plane.js.map +0 -1
- package/src/secrets/guardrails.js.map +0 -1
- package/src/secrets/index.js.map +0 -1
- package/src/secrets/metadata.js.map +0 -1
- package/src/secrets/model.js.map +0 -1
- package/src/secrets/operator.js.map +0 -1
- package/src/secrets/permissions.js.map +0 -1
- package/src/secrets/personal-command.js.map +0 -1
- package/src/secrets/personal-ledger.js.map +0 -1
- package/src/secrets/registry.js.map +0 -1
- package/src/secrets/verification.js.map +0 -1
- package/src/secrets/workload-access.js.map +0 -1
- package/src/sst-environment-source-format.js.map +0 -1
- package/src/supply-chain/action-pins.js.map +0 -1
- package/src/supply-chain/blueprint-trust-git.js.map +0 -1
- package/src/supply-chain/blueprint-trust-process.js.map +0 -1
- package/src/supply-chain/blueprint-trust.js.map +0 -1
- package/src/supply-chain/blueprint-verification-authority.js.map +0 -1
- package/src/supply-chain/blueprint-verification-execution.js.map +0 -1
- package/src/supply-chain/build-output-bounds.js.map +0 -1
- package/src/supply-chain/build-output.js.map +0 -1
- package/src/supply-chain/common.js.map +0 -1
- package/src/supply-chain/container-artifact-contract.js.map +0 -1
- package/src/supply-chain/container-release.js.map +0 -1
- package/src/supply-chain/ecr-applicability.js.map +0 -1
- package/src/supply-chain/ecr-scanning.js.map +0 -1
- package/src/supply-chain/ecs-deployed-image.js.map +0 -1
- package/src/supply-chain/errors.js.map +0 -1
- package/src/supply-chain/generated-blueprint-trust-command.js.map +0 -1
- package/src/supply-chain/generated-command.js.map +0 -1
- package/src/supply-chain/generated-container-release-command.js.map +0 -1
- package/src/supply-chain/generated-ecr-collector-command.js.map +0 -1
- package/src/supply-chain/generated-files.js.map +0 -1
- package/src/supply-chain/generated-scanner-command.js.map +0 -1
- package/src/supply-chain/index.js.map +0 -1
- package/src/supply-chain/inventory.js.map +0 -1
- package/src/supply-chain/license-expression.js.map +0 -1
- package/src/supply-chain/pnpm-toolchain-authority.js.map +0 -1
- package/src/supply-chain/policy.js.map +0 -1
- package/src/supply-chain/publication.js.map +0 -1
- package/src/supply-chain/sbom.js.map +0 -1
- package/src/supply-chain/scanner.js.map +0 -1
- package/src/supply-chain/vendored-source.js.map +0 -1
- package/src/testing-evidence/fixture-scope.js.map +0 -1
- package/src/testing-evidence/index.js.map +0 -1
- package/src/testing-evidence/quarantine.js.map +0 -1
- package/src/testing-evidence/result.js.map +0 -1
- package/src/testing-evidence/runner-adapter.js.map +0 -1
- package/src/testing-evidence/sensitive-artifacts.js.map +0 -1
- package/src/validation.js.map +0 -1
- package/src/work-markers/index.js.map +0 -1
- package/src/work-markers/work-markers.js.map +0 -1
- package/src/workload-roles/account-baseline.js.map +0 -1
- package/src/workload-roles/authority.js.map +0 -1
- package/src/workload-roles/aws-adapter.js.map +0 -1
- package/src/workload-roles/aws-internal-handler.js.map +0 -1
- package/src/workload-roles/aws-s3-state.js.map +0 -1
- package/src/workload-roles/aws-sdk-control-plane.js.map +0 -1
- package/src/workload-roles/boundary.js.map +0 -1
- package/src/workload-roles/convergence.js.map +0 -1
- package/src/workload-roles/effective-policy.js.map +0 -1
- package/src/workload-roles/handler.js.map +0 -1
- package/src/workload-roles/history.js.map +0 -1
- package/src/workload-roles/index.js.map +0 -1
- package/src/workload-roles/injection.js.map +0 -1
- package/src/workload-roles/manifest.js.map +0 -1
- package/src/workload-roles/provisioner.js.map +0 -1
- package/src/workload-roles/registration.js.map +0 -1
- package/src/workload-roles/stage-boundary.js.map +0 -1
- package/src/workload-roles/standard-slice.js.map +0 -1
- package/src/workspace-deployment/affected-lifecycle.js.map +0 -1
- package/src/workspace-deployment/identity.js.map +0 -1
- package/src/workspace-deployment/index.js.map +0 -1
- package/src/workspace-deployment/migration-evidence.js.map +0 -1
- package/src/workspace-deployment/migration.js.map +0 -1
- package/src/workspace-deployment/ownership.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export interface SmokeAdmissionContext {
|
|
2
|
+
authority?: 'local';
|
|
2
3
|
run: string;
|
|
3
4
|
attempt: string;
|
|
4
5
|
source: string;
|
|
@@ -14,6 +15,7 @@ export interface SmokeIpSetStore {
|
|
|
14
15
|
update(previous: SmokeIpSet, next: Pick<SmokeIpSet, 'addresses' | 'description'>): Promise<void>;
|
|
15
16
|
}
|
|
16
17
|
export interface SmokeAdmissionLease {
|
|
18
|
+
authority?: 'local';
|
|
17
19
|
run: string;
|
|
18
20
|
attempt: string;
|
|
19
21
|
source: string;
|
|
@@ -33,7 +35,7 @@ export declare function withPrivateSmokeAdmission<T>(input: {
|
|
|
33
35
|
context: SmokeAdmissionContext;
|
|
34
36
|
cidr: string;
|
|
35
37
|
run: (lease: SmokeAdmissionLease) => Promise<T>;
|
|
36
|
-
awaitAdmission: () => Promise<void>;
|
|
38
|
+
awaitAdmission: (signal: AbortSignal) => Promise<void>;
|
|
37
39
|
awaitRevocation: () => Promise<void>;
|
|
38
40
|
now?: () => number;
|
|
39
41
|
signals?: {
|
|
@@ -9,6 +9,7 @@ exports.withPrivateSmokeAdmission = withPrivateSmokeAdmission;
|
|
|
9
9
|
const node_crypto_1 = require("node:crypto");
|
|
10
10
|
const node_net_1 = require("node:net");
|
|
11
11
|
const prefix = 'ebk-smoke-v1:';
|
|
12
|
+
const localPrefix = 'ebk-smoke-local-v1:';
|
|
12
13
|
const sorted = (values) => [...values].sort();
|
|
13
14
|
const same = (a, b) => JSON.stringify(sorted(a)) === JSON.stringify(sorted(b));
|
|
14
15
|
const baselineDigest = (values) => (0, node_crypto_1.createHash)('sha256')
|
|
@@ -47,20 +48,31 @@ function publicRunnerIpv4(value) {
|
|
|
47
48
|
function parseSmokeAdmissionLease(description) {
|
|
48
49
|
if (description === '')
|
|
49
50
|
return undefined;
|
|
50
|
-
|
|
51
|
-
const
|
|
51
|
+
const local = description.startsWith(localPrefix);
|
|
52
|
+
const leasePrefix = local ? localPrefix : prefix;
|
|
53
|
+
requireCondition(description.startsWith(leasePrefix) && description.length <= 256, 'unrecognized IP-set description; do not overwrite it');
|
|
54
|
+
const parts = description.slice(leasePrefix.length).split(',');
|
|
52
55
|
requireCondition(parts.length === 6, 'malformed admission lease');
|
|
53
56
|
const [run, attempt, source, cidr, baseline, expires] = parts;
|
|
54
|
-
requireCondition(/^[1-9][0-9]*$/.test(run) &&
|
|
57
|
+
requireCondition((local ? /^[a-f0-9]{32}$/.test(run) : /^[1-9][0-9]*$/.test(run)) &&
|
|
55
58
|
/^[1-9][0-9]*$/.test(attempt) &&
|
|
56
59
|
/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(source) &&
|
|
57
60
|
/^[a-f0-9]{64}$/.test(baseline) &&
|
|
58
61
|
/^[0-9]{13}$/.test(expires), 'malformed admission identity');
|
|
59
62
|
requireCondition(cidr === publicRunnerIpv4(cidr.replace(/\/32$/, '')), 'admission is not an exact /32');
|
|
60
|
-
return {
|
|
63
|
+
return {
|
|
64
|
+
...(local ? { authority: 'local' } : {}),
|
|
65
|
+
run,
|
|
66
|
+
attempt,
|
|
67
|
+
source,
|
|
68
|
+
cidr,
|
|
69
|
+
baseline,
|
|
70
|
+
expiresAt: Number(expires),
|
|
71
|
+
};
|
|
61
72
|
}
|
|
62
73
|
function belongsTo(lease, context) {
|
|
63
|
-
return (lease.
|
|
74
|
+
return (lease.authority === context.authority &&
|
|
75
|
+
lease.run === context.run &&
|
|
64
76
|
lease.attempt === context.attempt &&
|
|
65
77
|
lease.source === context.source);
|
|
66
78
|
}
|
|
@@ -91,7 +103,10 @@ async function cleanupSmokeAdmission(store, context) {
|
|
|
91
103
|
return;
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
|
-
throw new Error('Private smoke access: cleanup unproved; deployment acceptance is prohibited.
|
|
106
|
+
throw new Error('Private smoke access: cleanup unproved; deployment acceptance is prohibited. ' +
|
|
107
|
+
(context.authority === 'local'
|
|
108
|
+
? 'Preserve the private recovery receipt, stop the owning invocation, then retry ebk deploy from the same workspace and stage with its verified credential profile.'
|
|
109
|
+
: 'Run protected smoke-access cleanup before retrying.'));
|
|
95
110
|
}
|
|
96
111
|
/** A retained lease alone, or its expiry, is not proof that a different run ended. */
|
|
97
112
|
async function recoverSmokeAdmission(store, baseline, completedRun) {
|
|
@@ -112,7 +127,7 @@ async function withPrivateSmokeAdmission(input) {
|
|
|
112
127
|
requireCondition(!parseSmokeAdmissionLease(before.description), 'recover the existing admission before starting smoke');
|
|
113
128
|
requireCondition(same(before.addresses, context.baseline), 'live allowlist differs from committed baseline');
|
|
114
129
|
const alreadyAllowed = runnerAlreadyAllowed(cidr, context.baseline);
|
|
115
|
-
const description = prefix +
|
|
130
|
+
const description = (context.authority === 'local' ? localPrefix : prefix) +
|
|
116
131
|
[
|
|
117
132
|
context.run,
|
|
118
133
|
context.attempt,
|
|
@@ -125,8 +140,10 @@ async function withPrivateSmokeAdmission(input) {
|
|
|
125
140
|
requireCondition(lease !== undefined, 'admission lease is unreadable');
|
|
126
141
|
const signals = input.signals ?? process;
|
|
127
142
|
let interrupted = false;
|
|
143
|
+
const admissionAbort = new AbortController();
|
|
128
144
|
const stop = () => {
|
|
129
145
|
interrupted = true;
|
|
146
|
+
admissionAbort.abort(new Error('Private smoke interrupted'));
|
|
130
147
|
};
|
|
131
148
|
signals.on('SIGINT', stop);
|
|
132
149
|
signals.on('SIGTERM', stop);
|
|
@@ -138,7 +155,8 @@ async function withPrivateSmokeAdmission(input) {
|
|
|
138
155
|
});
|
|
139
156
|
const after = await store.read();
|
|
140
157
|
requireCondition(same(after.addresses, alreadyAllowed ? context.baseline : [...context.baseline, cidr]) && after.description === (alreadyAllowed ? '' : description), 'admission readback differs');
|
|
141
|
-
|
|
158
|
+
requireCondition(!interrupted, 'interrupted before admission');
|
|
159
|
+
await input.awaitAdmission(admissionAbort.signal);
|
|
142
160
|
requireCondition(!interrupted, 'interrupted before smoke');
|
|
143
161
|
const result = await input.run(lease);
|
|
144
162
|
requireCondition(!interrupted, 'smoke interrupted');
|
|
@@ -149,6 +167,9 @@ async function withPrivateSmokeAdmission(input) {
|
|
|
149
167
|
await cleanupSmokeAdmission(store, context);
|
|
150
168
|
if (!alreadyAllowed)
|
|
151
169
|
await input.awaitRevocation();
|
|
170
|
+
// Signals must not abort revocation, but they must invalidate the pending
|
|
171
|
+
// return value even when smoke itself already completed successfully.
|
|
172
|
+
requireCondition(!interrupted, 'smoke interrupted during cleanup');
|
|
152
173
|
}
|
|
153
174
|
finally {
|
|
154
175
|
signals.removeListener('SIGINT', stop);
|
|
@@ -29,7 +29,7 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
|
|
|
29
29
|
const url = smokeUrl === undefined ? undefined : new URL(smokeUrl);
|
|
30
30
|
if (url)
|
|
31
31
|
check(url.protocol === 'https:' && !url.username && !url.password && !url.port, 'credential-free HTTPS Router required');
|
|
32
|
-
const name = `foundation-${identity.stage}-router-
|
|
32
|
+
const name = `foundation-${identity.stage}-router-smoke-access`;
|
|
33
33
|
const ipSets = [];
|
|
34
34
|
let marker;
|
|
35
35
|
const seen = new Set();
|
|
@@ -47,7 +47,7 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
|
|
|
47
47
|
check(seen.size <= 100, 'IP-set inventory exceeds bounded inspection');
|
|
48
48
|
} while (marker);
|
|
49
49
|
const matches = ipSets.filter((set) => set.Name === name);
|
|
50
|
-
check(matches.length === 1 && matches[0].Id, 'exact stage
|
|
50
|
+
check(matches.length === 1 && matches[0].Id, 'exact stage smoke-access IP set missing or ambiguous; deploy the upgraded Foundation before private smoke');
|
|
51
51
|
const selected = matches[0];
|
|
52
52
|
const arn = `arn:aws:wafv2:us-east-1:${identity.account}:global/ipset/${name}/${selected.Id}`;
|
|
53
53
|
check(selected.ARN === arn, 'IP-set account/scope/identity mismatch');
|
|
@@ -56,7 +56,6 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
|
|
|
56
56
|
'ebk:owner': 'foundation',
|
|
57
57
|
'ebk:stage': identity.stage,
|
|
58
58
|
'ebk:workspace': identity.workspace,
|
|
59
|
-
'ebk:policy-digest': identity.policyDigest,
|
|
60
59
|
};
|
|
61
60
|
async function attestTags(resourceArn) {
|
|
62
61
|
const tags = {};
|
|
@@ -80,6 +79,15 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
|
|
|
80
79
|
} while (tagMarker);
|
|
81
80
|
for (const [key, value] of Object.entries(expectedTags))
|
|
82
81
|
check(tags[key] === value, 'WAF ownership or committed policy differs');
|
|
82
|
+
if (resourceArn === arn) {
|
|
83
|
+
// The dedicated smoke set has stable ownership, not mutable WAF policy.
|
|
84
|
+
// An older creation-time digest tag is inert. Policy binding is checked
|
|
85
|
+
// on the attached Web ACL before any admission, never during revocation.
|
|
86
|
+
check(tags['ebk:purpose'] === 'private-smoke-access', 'IP set is not owned exclusively by private smoke');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
check(tags['ebk:policy-digest'] === identity.policyDigest, 'WAF ownership or committed policy differs');
|
|
90
|
+
}
|
|
83
91
|
}
|
|
84
92
|
await attestTags(arn);
|
|
85
93
|
// Cleanup never expands access; exact tagged IP-set identity and lease are sufficient.
|
|
@@ -135,12 +143,15 @@ async function openPrivateSmokeControlPlane(identity, smokeUrl, clients = {
|
|
|
135
143
|
: statement?.OrStatement?.Statements?.map((item) => item.IPSetReferenceStatement);
|
|
136
144
|
check(rules.length === 1 &&
|
|
137
145
|
rules[0].Action?.Block &&
|
|
138
|
-
refs
|
|
146
|
+
refs &&
|
|
147
|
+
refs.length >= 2 &&
|
|
148
|
+
refs.length <= 3 &&
|
|
139
149
|
refs.every((ref) => ref?.ARN) &&
|
|
150
|
+
new Set(refs.map((ref) => ref?.ARN)).size === refs.length &&
|
|
140
151
|
refs.filter((ref) => ref?.ARN === arn).length === 1, 'Router blocking rule does not reference the exact IP set');
|
|
141
|
-
//
|
|
152
|
+
// Only the unchanged same-stage baseline sets may accompany the smoke set.
|
|
142
153
|
check(refs.every((ref) => ref?.ARN === arn ||
|
|
143
|
-
ref?.ARN?.startsWith(`arn:aws:wafv2:us-east-1:${identity.account}:global/ipset/foundation-${identity.stage}-router-
|
|
154
|
+
['ipv4', 'ipv6'].some((family) => ref?.ARN?.startsWith(`arn:aws:wafv2:us-east-1:${identity.account}:global/ipset/foundation-${identity.stage}-router-${family}-allowlist/`))), 'Router allowlist contains an out-of-stage reference');
|
|
144
155
|
}
|
|
145
156
|
const key = { Name: name, Id: selected.Id, Scope: 'CLOUDFRONT' };
|
|
146
157
|
return {
|
|
@@ -32,7 +32,12 @@ export type ProvisionedDatabaseBindings<TBindings extends DatabaseBindingDeclara
|
|
|
32
32
|
export declare function createDatabaseBindingPlan(bindings: DatabaseBindingDeclaration, context: {
|
|
33
33
|
slice: string;
|
|
34
34
|
stage: string;
|
|
35
|
+
localDev?: boolean;
|
|
35
36
|
}): DatabaseBindingPlan;
|
|
37
|
+
/** Validate declaration shape/collisions without planning deployment or connection coordinates. */
|
|
38
|
+
export declare function validateDatabaseBindings(bindings: DatabaseBindingDeclaration, context: {
|
|
39
|
+
slice: string;
|
|
40
|
+
}): Pick<DatabaseBindingPlan, 'active' | 'provisioned'>;
|
|
36
41
|
export declare function provisionDatabaseBindings<TBindings extends DatabaseBindingDeclaration>(foundation: FoundationInfrastructure, options: ProvisionDatabaseBindingsOptions & {
|
|
37
42
|
bindings: TBindings;
|
|
38
43
|
}): ProvisionedDatabaseBindings<TBindings>;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.selectDatabaseTarget = selectDatabaseTarget;
|
|
4
4
|
exports.createDatabaseBindingPlan = createDatabaseBindingPlan;
|
|
5
|
+
exports.validateDatabaseBindings = validateDatabaseBindings;
|
|
5
6
|
exports.provisionDatabaseBindings = provisionDatabaseBindings;
|
|
6
7
|
const local_database_contract_js_1 = require("./local-database-contract.js");
|
|
7
8
|
const provision_logical_database_js_1 = require("./provision-logical-database.js");
|
|
@@ -25,6 +26,40 @@ function collisionKey(value) {
|
|
|
25
26
|
return (0, local_database_contract_js_1.normalizePostgresIdentifier)(value).normalize('NFKC').toLowerCase();
|
|
26
27
|
}
|
|
27
28
|
function createDatabaseBindingPlan(bindings, context) {
|
|
29
|
+
return inspectDatabaseBindings(bindings, context.slice, (identifier) => {
|
|
30
|
+
if (!context.localDev)
|
|
31
|
+
return (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
|
|
32
|
+
database: identifier,
|
|
33
|
+
slice: context.slice,
|
|
34
|
+
stage: context.stage,
|
|
35
|
+
});
|
|
36
|
+
const local = (0, local_database_contract_js_1.resolveLocalDatabaseContract)({
|
|
37
|
+
database: identifier,
|
|
38
|
+
slice: context.slice,
|
|
39
|
+
stage: context.stage,
|
|
40
|
+
});
|
|
41
|
+
const resolved = {
|
|
42
|
+
database: local.database,
|
|
43
|
+
localDatabase: local.database,
|
|
44
|
+
localReadwriteRole: local.username,
|
|
45
|
+
readwriteRole: local.username,
|
|
46
|
+
readonlyRole: `${local.database}_readonly`,
|
|
47
|
+
migratorRole: `${local.database}_migrator`,
|
|
48
|
+
};
|
|
49
|
+
for (const [role, value] of Object.entries(resolved))
|
|
50
|
+
(0, local_database_contract_js_1.assertPostgresIdentifierLength)(value, `Local ${role} identifier`);
|
|
51
|
+
return resolved;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** Validate declaration shape/collisions without planning deployment or connection coordinates. */
|
|
55
|
+
function validateDatabaseBindings(bindings, context) {
|
|
56
|
+
const { active, provisioned } = inspectDatabaseBindings(bindings, context.slice);
|
|
57
|
+
return { active, provisioned };
|
|
58
|
+
}
|
|
59
|
+
function inspectDatabaseBindings(bindings, slice, resolveIdentifiers) {
|
|
60
|
+
if (typeof slice !== 'string' || slice.trim() === '') {
|
|
61
|
+
throw new Error('Product Slice name must be a non-empty string.');
|
|
62
|
+
}
|
|
28
63
|
if (typeof bindings !== 'object' ||
|
|
29
64
|
bindings === null ||
|
|
30
65
|
Array.isArray(bindings)) {
|
|
@@ -73,17 +108,13 @@ function createDatabaseBindingPlan(bindings, context) {
|
|
|
73
108
|
if (declared.has(identifier)) {
|
|
74
109
|
throw new Error(`Database identifier "${identifier}" is declared more than once. Each provisioned identifier must be unique across the binding set.`);
|
|
75
110
|
}
|
|
76
|
-
const resolved = (
|
|
77
|
-
|
|
78
|
-
slice: context.slice,
|
|
79
|
-
stage: context.stage,
|
|
80
|
-
});
|
|
81
|
-
const key = collisionKey(resolved.database);
|
|
111
|
+
const resolved = resolveIdentifiers?.(identifier);
|
|
112
|
+
const key = collisionKey(resolved?.database ?? identifier);
|
|
82
113
|
const previous = normalized.get(key);
|
|
83
114
|
if (previous !== undefined) {
|
|
84
115
|
throw new Error(`Database identifiers "${previous}" and "${identifier}" collide after PostgreSQL normalization. Rename one identifier; EBK never truncates or aliases database bindings.`);
|
|
85
116
|
}
|
|
86
|
-
const componentName = (0, provision_logical_database_js_1.defaultDatabaseLinkableName)(
|
|
117
|
+
const componentName = (0, provision_logical_database_js_1.defaultDatabaseLinkableName)(slice, identifier);
|
|
87
118
|
const previousComponent = componentNames.get(componentName);
|
|
88
119
|
if (previousComponent !== undefined) {
|
|
89
120
|
throw new Error(`Database identifiers "${previousComponent}" and "${identifier}" collide after SST logical-name normalization as "${componentName}". Rename one identifier so every resource name is unique before deployment.`);
|
|
@@ -91,7 +122,8 @@ function createDatabaseBindingPlan(bindings, context) {
|
|
|
91
122
|
declared.add(identifier);
|
|
92
123
|
normalized.set(key, identifier);
|
|
93
124
|
componentNames.set(componentName, identifier);
|
|
94
|
-
|
|
125
|
+
if (resolved)
|
|
126
|
+
identifiers[identifier] = resolved;
|
|
95
127
|
}
|
|
96
128
|
}
|
|
97
129
|
return {
|
|
@@ -107,6 +139,7 @@ function provisionDatabaseBindings(foundation, options) {
|
|
|
107
139
|
const plan = createDatabaseBindingPlan(options.bindings, {
|
|
108
140
|
slice: options.slice,
|
|
109
141
|
stage: $app.stage,
|
|
142
|
+
localDev: $dev && options.localDev !== false,
|
|
110
143
|
});
|
|
111
144
|
const provisioned = new Map();
|
|
112
145
|
for (const database of plan.provisioned) {
|
|
@@ -27,11 +27,6 @@ function provisionLogicalDatabase(foundation, options) {
|
|
|
27
27
|
options.rotationToken.trim() === '') {
|
|
28
28
|
throw new Error('Logical database rotationToken must be a non-empty string when supplied.');
|
|
29
29
|
}
|
|
30
|
-
const identifiers = (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
|
|
31
|
-
database: options.database,
|
|
32
|
-
slice: options.slice,
|
|
33
|
-
stage: consumerStage,
|
|
34
|
-
});
|
|
35
30
|
const resourceName = options.linkableName ??
|
|
36
31
|
defaultDatabaseLinkableName(options.slice, options.database);
|
|
37
32
|
if ($dev && (options.localDev ?? true)) {
|
|
@@ -40,7 +35,12 @@ function provisionLogicalDatabase(foundation, options) {
|
|
|
40
35
|
password: options.localDevPassword,
|
|
41
36
|
port: options.localDevPort,
|
|
42
37
|
slice: options.slice,
|
|
38
|
+
stage: consumerStage,
|
|
43
39
|
});
|
|
40
|
+
const readonlyRole = `${localDatabase.database}_readonly`;
|
|
41
|
+
const migratorRole = `${localDatabase.database}_migrator`;
|
|
42
|
+
(0, local_database_contract_js_1.assertPostgresIdentifierLength)(readonlyRole, 'Local read-only role identifier');
|
|
43
|
+
(0, local_database_contract_js_1.assertPostgresIdentifierLength)(migratorRole, 'Local migrator role identifier');
|
|
44
44
|
return {
|
|
45
45
|
db: new sst.Linkable(resourceName, {
|
|
46
46
|
properties: {
|
|
@@ -49,12 +49,17 @@ function provisionLogicalDatabase(foundation, options) {
|
|
|
49
49
|
},
|
|
50
50
|
}),
|
|
51
51
|
databaseName: localDatabase.database,
|
|
52
|
-
migratorRole
|
|
53
|
-
readonlyRole
|
|
54
|
-
readwriteRole:
|
|
52
|
+
migratorRole,
|
|
53
|
+
readonlyRole,
|
|
54
|
+
readwriteRole: localDatabase.username,
|
|
55
55
|
resourceName,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
|
+
const identifiers = (0, local_database_contract_js_1.resolveLogicalDatabaseIdentifiers)({
|
|
59
|
+
database: options.database,
|
|
60
|
+
slice: options.slice,
|
|
61
|
+
stage: consumerStage,
|
|
62
|
+
});
|
|
58
63
|
if (options.removalPolicy === 'destroy') {
|
|
59
64
|
throw new Error('Logical database removalPolicy "destroy" requires a reviewed AWS-internal retirement workflow and is not supported by the v1 protected bootstrap.');
|
|
60
65
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ValidationResult } from '../validation.js';
|
|
2
|
-
export declare const STANDARD_FOUNDATION_CONTRACT_VERSION:
|
|
3
|
-
export declare const STANDARD_FOUNDATION_CAPABILITIES: readonly ["
|
|
2
|
+
export declare const STANDARD_FOUNDATION_CONTRACT_VERSION: 2;
|
|
3
|
+
export declare const STANDARD_FOUNDATION_CAPABILITIES: readonly ["key-value", "routing", "identity", "events", "observability", "configuration", "deployment", "network", "container-compute", "postgres"];
|
|
4
4
|
export type StandardFoundationCapability = (typeof STANDARD_FOUNDATION_CAPABILITIES)[number];
|
|
5
5
|
export interface FoundationRequirement {
|
|
6
6
|
capabilities: StandardFoundationCapability[];
|
|
@@ -20,7 +20,7 @@ export declare const foundationRequirementSchema: {
|
|
|
20
20
|
readonly properties: {
|
|
21
21
|
readonly capabilities: {
|
|
22
22
|
readonly items: {
|
|
23
|
-
readonly enum: readonly ["
|
|
23
|
+
readonly enum: readonly ["key-value", "routing", "identity", "events", "observability", "configuration", "deployment", "network", "container-compute", "postgres"];
|
|
24
24
|
readonly type: "string";
|
|
25
25
|
};
|
|
26
26
|
readonly type: "array";
|
|
@@ -6,18 +6,9 @@ exports.validateFoundationRequirement = validateFoundationRequirement;
|
|
|
6
6
|
exports.validateFoundationCompatibility = validateFoundationCompatibility;
|
|
7
7
|
const validation_js_1 = require("../validation.js");
|
|
8
8
|
const semver_1 = require("semver");
|
|
9
|
-
|
|
10
|
-
exports.
|
|
11
|
-
|
|
12
|
-
'routing',
|
|
13
|
-
'container-compute',
|
|
14
|
-
'postgres',
|
|
15
|
-
'identity',
|
|
16
|
-
'events',
|
|
17
|
-
'observability',
|
|
18
|
-
'configuration',
|
|
19
|
-
'deployment',
|
|
20
|
-
];
|
|
9
|
+
const capability_plan_js_1 = require("./capability-plan.js");
|
|
10
|
+
exports.STANDARD_FOUNDATION_CONTRACT_VERSION = 2;
|
|
11
|
+
exports.STANDARD_FOUNDATION_CAPABILITIES = capability_plan_js_1.FOUNDATION_CAPABILITY_VOCABULARY;
|
|
21
12
|
const capabilitySet = new Set(exports.STANDARD_FOUNDATION_CAPABILITIES);
|
|
22
13
|
function isStandardFoundationCapability(value) {
|
|
23
14
|
return typeof value === 'string' && capabilitySet.has(value);
|
|
@@ -91,6 +82,7 @@ function validateFoundationCompatibility(requirement, foundation) {
|
|
|
91
82
|
});
|
|
92
83
|
}
|
|
93
84
|
else {
|
|
85
|
+
const seen = new Set();
|
|
94
86
|
foundation.capabilities.forEach((capability, index) => {
|
|
95
87
|
if (!isStandardFoundationCapability(capability)) {
|
|
96
88
|
issues.push({
|
|
@@ -98,7 +90,27 @@ function validateFoundationCompatibility(requirement, foundation) {
|
|
|
98
90
|
path: `foundationDescriptor.capabilities[${index}]`,
|
|
99
91
|
});
|
|
100
92
|
}
|
|
93
|
+
if (seen.has(capability)) {
|
|
94
|
+
issues.push({
|
|
95
|
+
message: 'must not contain duplicate capabilities',
|
|
96
|
+
path: `foundationDescriptor.capabilities[${index}]`,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
seen.add(capability);
|
|
101
100
|
});
|
|
101
|
+
if (foundation.contractVersion === '2.0.0') {
|
|
102
|
+
for (const [capability, dependency] of [
|
|
103
|
+
['postgres', 'container-compute'],
|
|
104
|
+
['container-compute', 'network'],
|
|
105
|
+
]) {
|
|
106
|
+
if (seen.has(capability) && !seen.has(dependency)) {
|
|
107
|
+
issues.push({
|
|
108
|
+
message: `capability ${capability} requires ${dependency}`,
|
|
109
|
+
path: 'foundationDescriptor.capabilities',
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
102
114
|
}
|
|
103
115
|
if (requirementResult.valid &&
|
|
104
116
|
typeof foundation.contractVersion === 'string' &&
|
|
@@ -143,6 +143,7 @@ export declare function createRouterWafStagePlan(input: {
|
|
|
143
143
|
export declare function createRouterWafRules(plan: RouterWafStagePlan, ipSets: {
|
|
144
144
|
ipv4Arn?: unknown;
|
|
145
145
|
ipv6Arn?: unknown;
|
|
146
|
+
smokeArn?: unknown;
|
|
146
147
|
}): WafRule[];
|
|
147
148
|
export declare function routerWafContractDigest(policy: RouterWafPolicy): `sha256:${string}`;
|
|
148
149
|
export {};
|
|
@@ -652,7 +652,10 @@ function createRouterWafRules(plan, ipSets) {
|
|
|
652
652
|
const rules = [];
|
|
653
653
|
let priority = 0;
|
|
654
654
|
if (plan.access === 'allowlist') {
|
|
655
|
-
|
|
655
|
+
if (ipSets.ipv4Arn === undefined && ipSets.ipv6Arn === undefined) {
|
|
656
|
+
throw new Error('Router WAF allowlist is missing its exact IP set ARN.');
|
|
657
|
+
}
|
|
658
|
+
const references = [ipSets.ipv4Arn, ipSets.ipv6Arn, ipSets.smokeArn]
|
|
656
659
|
.filter((value) => value !== undefined)
|
|
657
660
|
.map((arn) => ({ ipSetReferenceStatement: { arn } }));
|
|
658
661
|
if (references.length === 0) {
|
|
@@ -749,6 +752,9 @@ function routerWafContractDigest(policy) {
|
|
|
749
752
|
...(plan.ipv6Cidrs.length > 0
|
|
750
753
|
? { ipv6Arn: `<ipv6-ip-set:${stage}>` }
|
|
751
754
|
: {}),
|
|
755
|
+
...(plan.access === 'allowlist'
|
|
756
|
+
? { smokeArn: `<smoke-ip-set:${stage}>` }
|
|
757
|
+
: {}),
|
|
752
758
|
}),
|
|
753
759
|
};
|
|
754
760
|
});
|
|
@@ -785,6 +791,13 @@ function routerWafContractDigest(policy) {
|
|
|
785
791
|
'ebk:stage',
|
|
786
792
|
'ebk:workspace',
|
|
787
793
|
],
|
|
794
|
+
smokeIpSetTags: [
|
|
795
|
+
'ebk:managed-by',
|
|
796
|
+
'ebk:owner',
|
|
797
|
+
'ebk:purpose',
|
|
798
|
+
'ebk:stage',
|
|
799
|
+
'ebk:workspace',
|
|
800
|
+
],
|
|
788
801
|
logging: policy.logging,
|
|
789
802
|
scope: 'CLOUDFRONT',
|
|
790
803
|
},
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Tree } from '@nx/devkit';
|
|
2
|
+
import type { BlueprintGeneratorSchema } from './schema.js';
|
|
3
|
+
/** Scaffold source owned by the adopter, without executing it or minting trust. */
|
|
4
|
+
export declare function blueprintGenerator(tree: Tree, options: BlueprintGeneratorSchema): Promise<void>;
|
|
5
|
+
export default blueprintGenerator;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.blueprintGenerator = blueprintGenerator;
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
const prettier_1 = require("prettier");
|
|
6
|
+
const semver_1 = require("semver");
|
|
7
|
+
const validation_js_1 = require("../../validation.js");
|
|
8
|
+
const manifest_js_1 = require("../../blueprints/manifest.js");
|
|
9
|
+
const post_generation_install_js_1 = require("../post-generation-install.js");
|
|
10
|
+
const files_js_1 = require("./files.js");
|
|
11
|
+
/** Scaffold source owned by the adopter, without executing it or minting trust. */
|
|
12
|
+
async function blueprintGenerator(tree, options) {
|
|
13
|
+
const name = options.name;
|
|
14
|
+
if (typeof name !== 'string' ||
|
|
15
|
+
name.length > 63 ||
|
|
16
|
+
!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(name) ||
|
|
17
|
+
/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/.test(name)) {
|
|
18
|
+
throw new Error('Blueprint name must be a lowercase hyphenated name of at most 63 characters.');
|
|
19
|
+
}
|
|
20
|
+
(0, post_generation_install_js_1.assertPostGenerationInstallWorkspaceAvailable)(tree, `generator:blueprint:${name}`);
|
|
21
|
+
const workspace = (0, devkit_1.readJson)(tree, 'package.json');
|
|
22
|
+
if (!(0, validation_js_1.isRecord)(workspace) ||
|
|
23
|
+
typeof workspace.name !== 'string' ||
|
|
24
|
+
!/^[a-z0-9][a-z0-9-]*$/.test(workspace.name) ||
|
|
25
|
+
!(0, validation_js_1.isRecord)(workspace.devDependencies) ||
|
|
26
|
+
typeof workspace.devDependencies['@empire-builder-kit/nx'] !== 'string' ||
|
|
27
|
+
!(0, semver_1.valid)(workspace.devDependencies['@empire-builder-kit/nx'])) {
|
|
28
|
+
throw new Error('Blueprint authoring requires an EBK workspace with an unscoped name and exact @empire-builder-kit/nx version.');
|
|
29
|
+
}
|
|
30
|
+
if (workspace.ebk !== undefined && !(0, validation_js_1.isRecord)(workspace.ebk)) {
|
|
31
|
+
throw new Error('Workspace ebk configuration must be an object.');
|
|
32
|
+
}
|
|
33
|
+
const ebk = (0, validation_js_1.isRecord)(workspace.ebk) ? workspace.ebk : {};
|
|
34
|
+
if (ebk.blueprints !== undefined && !(0, validation_js_1.isRecord)(ebk.blueprints)) {
|
|
35
|
+
throw new Error('Workspace ebk.blueprints configuration must be an object.');
|
|
36
|
+
}
|
|
37
|
+
const blueprints = (0, validation_js_1.isRecord)(ebk.blueprints) ? ebk.blueprints : {};
|
|
38
|
+
if ((blueprints.localPackages !== undefined &&
|
|
39
|
+
(!(0, validation_js_1.isRecord)(blueprints.localPackages) ||
|
|
40
|
+
Object.values(blueprints.localPackages).some((path) => typeof path !== 'string'))) ||
|
|
41
|
+
(blueprints.localAuthoringPackages !== undefined &&
|
|
42
|
+
(!Array.isArray(blueprints.localAuthoringPackages) ||
|
|
43
|
+
blueprints.localAuthoringPackages.some((entry) => typeof entry !== 'string')))) {
|
|
44
|
+
throw new Error('Existing Blueprint local authoring mappings must be valid before scaffolding.');
|
|
45
|
+
}
|
|
46
|
+
const root = `blueprints/${name}`;
|
|
47
|
+
const project = `blueprint-${name}`;
|
|
48
|
+
const packageName = `@${workspace.name}/blueprint-${name}`;
|
|
49
|
+
const localPackages = (blueprints.localPackages ?? {});
|
|
50
|
+
const localAuthoringPackages = (blueprints.localAuthoringPackages ??
|
|
51
|
+
[]);
|
|
52
|
+
if (tree.isFile('blueprints') ||
|
|
53
|
+
tree.exists(root) ||
|
|
54
|
+
tree.children(root).length > 0 ||
|
|
55
|
+
tree.children('blueprints').some((entry) => entry.toLowerCase() === name) ||
|
|
56
|
+
(0, devkit_1.getProjects)(tree).has(project) ||
|
|
57
|
+
Object.prototype.hasOwnProperty.call(localPackages, packageName) ||
|
|
58
|
+
Object.values(localPackages).includes(root)) {
|
|
59
|
+
throw new Error(`Blueprint ${name} already has files, a project, or a local mapping. Choose a new name; existing authoring source is never overwritten.`);
|
|
60
|
+
}
|
|
61
|
+
const files = (0, files_js_1.createBlueprintAuthoringFiles)({
|
|
62
|
+
engine: workspace.devDependencies['@empire-builder-kit/nx'],
|
|
63
|
+
name,
|
|
64
|
+
packageName,
|
|
65
|
+
root,
|
|
66
|
+
});
|
|
67
|
+
const manifest = (0, manifest_js_1.validateBlueprintManifest)(JSON.parse(files['ebk-blueprint.json']));
|
|
68
|
+
if (!manifest.valid)
|
|
69
|
+
throw new Error('Generated Blueprint authoring manifest is invalid.');
|
|
70
|
+
const nextWorkspace = {
|
|
71
|
+
...workspace,
|
|
72
|
+
ebk: {
|
|
73
|
+
...ebk,
|
|
74
|
+
blueprints: {
|
|
75
|
+
...blueprints,
|
|
76
|
+
localPackages: { ...localPackages, [packageName]: root },
|
|
77
|
+
localAuthoringPackages: [
|
|
78
|
+
...new Set([...localAuthoringPackages, packageName]),
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const planned = {
|
|
84
|
+
...Object.fromEntries(Object.entries(files).map(([path, contents]) => [
|
|
85
|
+
`${root}/${path}`,
|
|
86
|
+
contents,
|
|
87
|
+
])),
|
|
88
|
+
'package.json': JSON.stringify(nextWorkspace, null, 2) + '\n',
|
|
89
|
+
};
|
|
90
|
+
// Complete validation and formatting before the first write. Only this new
|
|
91
|
+
// package and the supported user-owned root ebk mapping are in scope.
|
|
92
|
+
const formatted = await Promise.all(Object.entries(planned).map(async ([path, contents]) => [
|
|
93
|
+
path,
|
|
94
|
+
options.skipFormat
|
|
95
|
+
? contents
|
|
96
|
+
: await (0, prettier_1.format)(contents, { filepath: path, singleQuote: true }),
|
|
97
|
+
]));
|
|
98
|
+
for (const [path, contents] of formatted)
|
|
99
|
+
tree.write(path, contents);
|
|
100
|
+
}
|
|
101
|
+
exports.default = blueprintGenerator;
|
|
102
|
+
//# sourceMappingURL=blueprint.js.map
|