@empire-builder-kit/nx 1.0.0-beta.9 → 1.0.0-rc.11
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/NOTICE +6 -0
- package/README.md +113 -3
- package/executors.json +30 -0
- package/package.json +85 -7
- package/src/api-contract/baseline-update.d.ts +82 -0
- package/src/api-contract/baseline-update.js +225 -0
- package/src/api-contract/baseline-update.js.map +1 -0
- package/src/api-contract/compatibility.d.ts +30 -0
- package/src/api-contract/compatibility.js +643 -0
- package/src/api-contract/compatibility.js.map +1 -0
- package/src/api-contract/contract-graph.d.ts +35 -0
- package/src/api-contract/contract-graph.js +141 -0
- package/src/api-contract/contract-graph.js.map +1 -0
- package/src/api-contract/evidence.d.ts +23 -0
- package/src/api-contract/evidence.js +87 -0
- package/src/api-contract/evidence.js.map +1 -0
- package/src/api-contract/index.d.ts +6 -0
- package/src/api-contract/index.js +10 -0
- package/src/api-contract/index.js.map +1 -0
- package/src/api-contract/model.d.ts +144 -0
- package/src/api-contract/model.fixtures.d.ts +2 -0
- package/src/api-contract/model.fixtures.js +81 -0
- package/src/api-contract/model.fixtures.js.map +1 -0
- package/src/api-contract/model.js +993 -0
- package/src/api-contract/model.js.map +1 -0
- package/src/api-contract/rollout.d.ts +32 -0
- package/src/api-contract/rollout.js +88 -0
- package/src/api-contract/rollout.js.map +1 -0
- package/src/authorization/compatibility.d.ts +62 -0
- package/src/authorization/compatibility.js +175 -0
- package/src/authorization/compatibility.js.map +1 -0
- package/src/authorization/index.d.ts +1 -0
- package/src/authorization/index.js +5 -0
- package/src/authorization/index.js.map +1 -0
- package/src/blueprints/execution.d.ts +25 -1
- package/src/blueprints/execution.js +246 -83
- package/src/blueprints/execution.js.map +1 -1
- package/src/blueprints/external-sandbox.d.ts +53 -0
- package/src/blueprints/external-sandbox.js +1182 -0
- package/src/blueprints/external-sandbox.js.map +1 -0
- package/src/blueprints/manifest.d.ts +42 -2
- package/src/blueprints/manifest.js +82 -27
- package/src/blueprints/manifest.js.map +1 -1
- package/src/blueprints/resolver.d.ts +14 -5
- package/src/blueprints/resolver.js +228 -68
- package/src/blueprints/resolver.js.map +1 -1
- package/src/cli/agent-command.d.ts +30 -0
- package/src/cli/agent-command.js +204 -0
- package/src/cli/agent-command.js.map +1 -0
- package/src/cli/agent-runtime.d.ts +25 -0
- package/src/cli/agent-runtime.js +488 -0
- package/src/cli/agent-runtime.js.map +1 -0
- package/src/cli/blueprint-authority.d.ts +9 -0
- package/src/cli/blueprint-authority.js +43 -0
- package/src/cli/blueprint-authority.js.map +1 -0
- package/src/cli/blueprint-command.d.ts +24 -0
- package/src/cli/blueprint-command.js +63 -0
- package/src/cli/blueprint-command.js.map +1 -0
- package/src/cli/bootstrap.d.ts +31 -0
- package/src/cli/bootstrap.js +165 -0
- package/src/cli/bootstrap.js.map +1 -0
- package/src/cli/dev-command.d.ts +92 -0
- package/src/cli/dev-command.js +561 -0
- package/src/cli/dev-command.js.map +1 -0
- package/src/cli/main.d.ts +131 -0
- package/src/cli/main.js +1199 -0
- package/src/cli/main.js.map +1 -0
- package/src/cli/output.d.ts +19 -0
- package/src/cli/output.js +51 -0
- package/src/cli/output.js.map +1 -0
- package/src/cli/personal-secret-runtime.d.ts +81 -0
- package/src/cli/personal-secret-runtime.js +567 -0
- package/src/cli/personal-secret-runtime.js.map +1 -0
- package/src/cli/secret-terminal.d.ts +12 -0
- package/src/cli/secret-terminal.js +128 -0
- package/src/cli/secret-terminal.js.map +1 -0
- package/src/container-images.d.ts +1 -0
- package/src/container-images.js +5 -0
- package/src/container-images.js.map +1 -0
- package/src/data-lifecycle/index.d.ts +3 -0
- package/src/data-lifecycle/index.js +7 -0
- package/src/data-lifecycle/index.js.map +1 -0
- package/src/data-lifecycle/model.d.ts +172 -0
- package/src/data-lifecycle/model.fixtures.d.ts +2 -0
- package/src/data-lifecycle/model.fixtures.js +244 -0
- package/src/data-lifecycle/model.fixtures.js.map +1 -0
- package/src/data-lifecycle/model.js +95 -0
- package/src/data-lifecycle/model.js.map +1 -0
- package/src/data-lifecycle/sensitive-artifacts.d.ts +28 -0
- package/src/data-lifecycle/sensitive-artifacts.js +146 -0
- package/src/data-lifecycle/sensitive-artifacts.js.map +1 -0
- package/src/data-lifecycle/validation.d.ts +32 -0
- package/src/data-lifecycle/validation.js +837 -0
- package/src/data-lifecycle/validation.js.map +1 -0
- package/src/database-retirement/contract.d.ts +68 -0
- package/src/database-retirement/contract.js +166 -0
- package/src/database-retirement/contract.js.map +1 -0
- package/src/database-retirement/index.d.ts +1 -0
- package/src/database-retirement/index.js +5 -0
- package/src/database-retirement/index.js.map +1 -0
- package/src/deterministic-order.d.ts +2 -0
- package/src/deterministic-order.js +7 -0
- package/src/deterministic-order.js.map +1 -0
- package/src/developer-agent/context.d.ts +27 -0
- package/src/developer-agent/context.js +497 -0
- package/src/developer-agent/context.js.map +1 -0
- package/src/developer-agent/generator-planning.d.ts +34 -0
- package/src/developer-agent/generator-planning.js +645 -0
- package/src/developer-agent/generator-planning.js.map +1 -0
- package/src/developer-agent/generator-preview.d.ts +8 -0
- package/src/developer-agent/generator-preview.js +650 -0
- package/src/developer-agent/generator-preview.js.map +1 -0
- package/src/developer-agent/git-inspection.d.ts +108 -0
- package/src/developer-agent/git-inspection.js +815 -0
- package/src/developer-agent/git-inspection.js.map +1 -0
- package/src/developer-agent/handoff.d.ts +43 -0
- package/src/developer-agent/handoff.js +698 -0
- package/src/developer-agent/handoff.js.map +1 -0
- package/src/developer-agent/index.d.ts +10 -0
- package/src/developer-agent/index.js +14 -0
- package/src/developer-agent/index.js.map +1 -0
- package/src/developer-agent/model.d.ts +481 -0
- package/src/developer-agent/model.js +143 -0
- package/src/developer-agent/model.js.map +1 -0
- package/src/developer-agent/operation-registry.d.ts +45 -0
- package/src/developer-agent/operation-registry.js +1267 -0
- package/src/developer-agent/operation-registry.js.map +1 -0
- package/src/developer-agent/ordering.d.ts +9 -0
- package/src/developer-agent/ordering.js +15 -0
- package/src/developer-agent/ordering.js.map +1 -0
- package/src/developer-agent/planning.d.ts +18 -0
- package/src/developer-agent/planning.js +447 -0
- package/src/developer-agent/planning.js.map +1 -0
- package/src/developer-agent/preview-changes.d.ts +26 -0
- package/src/developer-agent/preview-changes.js +203 -0
- package/src/developer-agent/preview-changes.js.map +1 -0
- package/src/developer-agent/preview-source.d.ts +2 -0
- package/src/developer-agent/preview-source.js +16 -0
- package/src/developer-agent/preview-source.js.map +1 -0
- package/src/developer-agent/validation.d.ts +18 -0
- package/src/developer-agent/validation.js +2617 -0
- package/src/developer-agent/validation.js.map +1 -0
- package/src/developer-agent/workspace-inspection.d.ts +20 -0
- package/src/developer-agent/workspace-inspection.js +1134 -0
- package/src/developer-agent/workspace-inspection.js.map +1 -0
- package/src/developer-agent/workspace-path.d.ts +6 -0
- package/src/developer-agent/workspace-path.js +22 -0
- package/src/developer-agent/workspace-path.js.map +1 -0
- package/src/executors/blueprint-trust/blueprint-trust.d.ts +29 -0
- package/src/executors/blueprint-trust/blueprint-trust.js +121 -0
- package/src/executors/blueprint-trust/blueprint-trust.js.map +1 -0
- package/src/executors/blueprint-trust/schema.json +27 -0
- package/src/executors/blueprint-verification/blueprint-verification.d.ts +13 -0
- package/src/executors/blueprint-verification/blueprint-verification.js +110 -0
- package/src/executors/blueprint-verification/blueprint-verification.js.map +1 -0
- package/src/executors/blueprint-verification/schema.json +44 -0
- package/src/executors/deployment-plan/deployment-plan.js +1 -0
- package/src/executors/deployment-plan/deployment-plan.js.map +1 -1
- package/src/executors/dev-doctor/dev-doctor.d.ts +19 -5
- package/src/executors/dev-doctor/dev-doctor.js +186 -32
- package/src/executors/dev-doctor/dev-doctor.js.map +1 -1
- package/src/executors/dev-doctor/schema.json +1 -6
- package/src/executors/dev-setup/dev-setup.d.ts +7 -1
- package/src/executors/dev-setup/dev-setup.js +14 -3
- package/src/executors/dev-setup/dev-setup.js.map +1 -1
- package/src/executors/developer-context/developer-context.d.ts +38 -0
- package/src/executors/developer-context/developer-context.js +78 -0
- package/src/executors/developer-context/developer-context.js.map +1 -0
- package/src/executors/developer-context/schema.json +87 -0
- package/src/executors/fleet/fleet.d.ts +12 -43
- package/src/executors/fleet/fleet.js +120 -500
- package/src/executors/fleet/fleet.js.map +1 -1
- package/src/executors/fleet/schema.json +64 -14
- package/src/executors/github-bootstrap/github-bootstrap.d.ts +1 -0
- package/src/executors/github-bootstrap/github-bootstrap.js +1 -0
- package/src/executors/github-bootstrap/github-bootstrap.js.map +1 -1
- package/src/executors/github-bootstrap/schema.json +5 -0
- package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +144 -0
- package/src/executors/infrastructure-plan/infrastructure-plan.js +3320 -0
- package/src/executors/infrastructure-plan/infrastructure-plan.js.map +1 -0
- package/src/executors/infrastructure-plan/schema.json +78 -0
- package/src/executors/secret-guardrails/schema.json +6 -0
- package/src/executors/secret-guardrails/secret-guardrails.d.ts +3 -0
- package/src/executors/secret-guardrails/secret-guardrails.js +44 -0
- package/src/executors/secret-guardrails/secret-guardrails.js.map +1 -0
- package/src/executors/secret-metadata/schema.json +31 -0
- package/src/executors/secret-metadata/secret-metadata.d.ts +32 -0
- package/src/executors/secret-metadata/secret-metadata.js +131 -0
- package/src/executors/secret-metadata/secret-metadata.js.map +1 -0
- package/src/executors/sst-lifecycle/logging-preflight.d.ts +17 -0
- package/src/executors/sst-lifecycle/logging-preflight.js +196 -0
- package/src/executors/sst-lifecycle/logging-preflight.js.map +1 -0
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +23 -3
- package/src/executors/sst-lifecycle/run-sst-command.js +113 -10
- package/src/executors/sst-lifecycle/run-sst-command.js.map +1 -1
- package/src/executors/sst-lifecycle/schema.json +9 -5
- package/src/executors/sst-lifecycle/secret-preflight.d.ts +25 -0
- package/src/executors/sst-lifecycle/secret-preflight.js +119 -0
- package/src/executors/sst-lifecycle/secret-preflight.js.map +1 -0
- package/src/foundation/discovery.d.ts +17 -1
- package/src/foundation/discovery.js +16 -1
- package/src/foundation/discovery.js.map +1 -1
- package/src/foundation/index.d.ts +3 -0
- package/src/foundation/index.js +3 -0
- package/src/foundation/index.js.map +1 -1
- package/src/foundation/local-database-contract.d.ts +1 -0
- package/src/foundation/local-database-contract.js +3 -0
- package/src/foundation/local-database-contract.js.map +1 -1
- package/src/foundation/logging-preflight.d.ts +30 -0
- package/src/foundation/logging-preflight.js +138 -0
- package/src/foundation/logging-preflight.js.map +1 -0
- package/src/foundation/logging.d.ts +70 -0
- package/src/foundation/logging.js +133 -0
- package/src/foundation/logging.js.map +1 -0
- package/src/foundation/preflight.d.ts +9 -0
- package/src/foundation/preflight.js +58 -2
- package/src/foundation/preflight.js.map +1 -1
- package/src/foundation/provision-database-bindings.d.ts +9 -1
- package/src/foundation/provision-database-bindings.js +25 -5
- package/src/foundation/provision-database-bindings.js.map +1 -1
- package/src/foundation/provision-logical-database.d.ts +10 -2
- package/src/foundation/provision-logical-database.js +68 -113
- package/src/foundation/provision-logical-database.js.map +1 -1
- package/src/foundation/router-origin-proof.d.ts +2 -0
- package/src/foundation/router-origin-proof.js +25 -0
- package/src/foundation/router-origin-proof.js.map +1 -0
- package/src/foundation/stages.d.ts +1 -0
- package/src/foundation/stages.js +9 -1
- package/src/foundation/stages.js.map +1 -1
- package/src/frontend-security/index.d.ts +1 -0
- package/src/frontend-security/index.js +5 -0
- package/src/frontend-security/index.js.map +1 -0
- package/src/frontend-security/security-headers.d.ts +50 -0
- package/src/frontend-security/security-headers.js +418 -0
- package/src/frontend-security/security-headers.js.map +1 -0
- package/src/generators/feature-registry.d.ts +13 -0
- package/src/generators/feature-registry.js +73 -0
- package/src/generators/feature-registry.js.map +1 -0
- package/src/generators/function/function.d.ts +1 -1
- package/src/generators/function/function.js +51 -6
- package/src/generators/function/function.js.map +1 -1
- package/src/generators/function/schema.d.ts +1 -0
- package/src/generators/function/schema.json +6 -1
- package/src/generators/logging-registry.d.ts +13 -0
- package/src/generators/logging-registry.js +62 -0
- package/src/generators/logging-registry.js.map +1 -0
- package/src/generators/post-generation-install.d.ts +68 -0
- package/src/generators/post-generation-install.js +3375 -0
- package/src/generators/post-generation-install.js.map +1 -0
- package/src/generators/preset/generator.js +3 -0
- package/src/generators/preset/generator.js.map +1 -1
- package/src/generators/preset/tool-versions.d.ts +18 -0
- package/src/generators/preset/tool-versions.js +22 -0
- package/src/generators/preset/tool-versions.js.map +1 -0
- package/src/generators/preset/workspace-files-ci-acceptance.d.ts +1 -0
- package/src/generators/preset/workspace-files-ci-acceptance.js +648 -0
- package/src/generators/preset/workspace-files-ci-acceptance.js.map +1 -0
- package/src/generators/preset/workspace-files-developer-agent.d.ts +14 -0
- package/src/generators/preset/workspace-files-developer-agent.js +511 -0
- package/src/generators/preset/workspace-files-developer-agent.js.map +1 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.d.ts +6 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.js +406 -0
- package/src/generators/preset/workspace-files-foundation-workload-roles.js.map +1 -0
- package/src/generators/preset/workspace-files-performance-cost.d.ts +66 -0
- package/src/generators/preset/workspace-files-performance-cost.js +866 -0
- package/src/generators/preset/workspace-files-performance-cost.js.map +1 -0
- package/src/generators/preset/workspace-files-performance-load.d.ts +73 -0
- package/src/generators/preset/workspace-files-performance-load.js +801 -0
- package/src/generators/preset/workspace-files-performance-load.js.map +1 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.d.ts +9 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.js +1102 -0
- package/src/generators/preset/workspace-files-workload-role-baseline.js.map +1 -0
- package/src/generators/preset/workspace-files.d.ts +15 -2
- package/src/generators/preset/workspace-files.js +8360 -250
- package/src/generators/preset/workspace-files.js.map +1 -1
- package/src/generators/repository-policy/repository-policy.js +3 -47
- package/src/generators/repository-policy/repository-policy.js.map +1 -1
- package/src/generators/slice/built-in-plan-api-contract-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js +2656 -0
- package/src/generators/slice/built-in-plan-api-contract-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-api-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-api-files.js +1186 -0
- package/src/generators/slice/built-in-plan-api-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-async-work-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-async-work-files.js +7903 -0
- package/src/generators/slice/built-in-plan-async-work-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-authorization-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-authorization-files.js +2314 -0
- package/src/generators/slice/built-in-plan-authorization-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +559 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.js +1101 -0
- package/src/generators/slice/built-in-plan-data-deletion-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +249 -0
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-files.js +1530 -0
- package/src/generators/slice/built-in-plan-data-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js +750 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js +828 -0
- package/src/generators/slice/built-in-plan-data-lifecycle-runtime-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-retention-job-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-retention-job-files.js +2605 -0
- package/src/generators/slice/built-in-plan-data-retention-job-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js +144 -0
- package/src/generators/slice/built-in-plan-data-retention-launcher-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-data-rights-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-data-rights-files.js +4628 -0
- package/src/generators/slice/built-in-plan-data-rights-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-database-lifecycle-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js +1902 -0
- package/src/generators/slice/built-in-plan-database-lifecycle-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js +485 -0
- package/src/generators/slice/built-in-plan-database-retirement-rehearsal-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-foundation-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-foundation-files.js +184 -0
- package/src/generators/slice/built-in-plan-foundation-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-frontend-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-frontend-files.js +2233 -0
- package/src/generators/slice/built-in-plan-frontend-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-infrastructure-files.js +3038 -0
- package/src/generators/slice/built-in-plan-infrastructure-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js +312 -0
- package/src/generators/slice/built-in-plan-infrastructure-safety-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-metadata-files.d.ts +3 -0
- package/src/generators/slice/built-in-plan-metadata-files.js +219 -0
- package/src/generators/slice/built-in-plan-metadata-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-operations-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-operations-files.js +630 -0
- package/src/generators/slice/built-in-plan-operations-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-performance-files.d.ts +3 -0
- package/src/generators/slice/built-in-plan-performance-files.js +3293 -0
- package/src/generators/slice/built-in-plan-performance-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-project-files.d.ts +3 -0
- package/src/generators/slice/built-in-plan-project-files.js +979 -0
- package/src/generators/slice/built-in-plan-project-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-release-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-release-files.js +6387 -0
- package/src/generators/slice/built-in-plan-release-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-reliability-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-reliability-files.js +4499 -0
- package/src/generators/slice/built-in-plan-reliability-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-secret-runtime-files.js +1004 -0
- package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-shared.d.ts +53 -0
- package/src/generators/slice/built-in-plan-shared.js +113 -0
- package/src/generators/slice/built-in-plan-shared.js.map +1 -0
- package/src/generators/slice/built-in-plan-testing-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-testing-files.js +2443 -0
- package/src/generators/slice/built-in-plan-testing-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-verification-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-verification-files.js +358 -0
- package/src/generators/slice/built-in-plan-verification-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-web-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-web-files.js +430 -0
- package/src/generators/slice/built-in-plan-web-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-workload-role-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-workload-role-files.js +2356 -0
- package/src/generators/slice/built-in-plan-workload-role-files.js.map +1 -0
- package/src/generators/slice/built-in-plan.d.ts +8 -0
- package/src/generators/slice/built-in-plan.js +264 -0
- package/src/generators/slice/built-in-plan.js.map +1 -0
- package/src/generators/slice/schema.json +1 -1
- package/src/generators/slice/slice.d.ts +1 -22
- package/src/generators/slice/slice.js +185 -1510
- package/src/generators/slice/slice.js.map +1 -1
- package/src/generators/upgrade/schema.d.ts +2 -0
- package/src/generators/upgrade/schema.json +11 -1
- package/src/generators/upgrade/upgrade.d.ts +51 -1
- package/src/generators/upgrade/upgrade.js +820 -82
- package/src/generators/upgrade/upgrade.js.map +1 -1
- package/src/generators/workload/frozen-container.d.ts +9 -0
- package/src/generators/workload/frozen-container.js +38 -0
- package/src/generators/workload/frozen-container.js.map +1 -0
- package/src/generators/workload/performance-registration.d.ts +32 -0
- package/src/generators/workload/performance-registration.js +226 -0
- package/src/generators/workload/performance-registration.js.map +1 -0
- package/src/generators/workload/reliability-registration.d.ts +16 -0
- package/src/generators/workload/reliability-registration.js +150 -0
- package/src/generators/workload/reliability-registration.js.map +1 -0
- package/src/generators/workload/schema.d.ts +1 -0
- package/src/generators/workload/schema.json +6 -1
- package/src/generators/workload/service-performance-files.d.ts +4 -0
- package/src/generators/workload/service-performance-files.js +1846 -0
- package/src/generators/workload/service-performance-files.js.map +1 -0
- package/src/generators/workload/workload.d.ts +3 -2
- package/src/generators/workload/workload.js +1083 -18
- package/src/generators/workload/workload.js.map +1 -1
- package/src/git-policy/action-pins.d.ts +10 -0
- package/src/git-policy/action-pins.js +10 -0
- package/src/git-policy/action-pins.js.map +1 -1
- package/src/git-policy/github-bootstrap.d.ts +14 -1
- package/src/git-policy/github-bootstrap.js +274 -46
- package/src/git-policy/github-bootstrap.js.map +1 -1
- package/src/git-policy/routing.d.ts +2 -0
- package/src/git-policy/routing.js +12 -1
- package/src/git-policy/routing.js.map +1 -1
- package/src/index.d.ts +2 -0
- package/src/index.js +2 -0
- package/src/index.js.map +1 -1
- package/src/infrastructure-change/convergence.d.ts +13 -0
- package/src/infrastructure-change/convergence.js +85 -0
- package/src/infrastructure-change/convergence.js.map +1 -0
- package/src/infrastructure-change/drift.d.ts +13 -0
- package/src/infrastructure-change/drift.js +112 -0
- package/src/infrastructure-change/drift.js.map +1 -0
- package/src/infrastructure-change/index.d.ts +7 -0
- package/src/infrastructure-change/index.js +11 -0
- package/src/infrastructure-change/index.js.map +1 -0
- package/src/infrastructure-change/model.d.ts +253 -0
- package/src/infrastructure-change/model.js +28 -0
- package/src/infrastructure-change/model.js.map +1 -0
- package/src/infrastructure-change/normalize.d.ts +12 -0
- package/src/infrastructure-change/normalize.js +245 -0
- package/src/infrastructure-change/normalize.js.map +1 -0
- package/src/infrastructure-change/plan.d.ts +40 -0
- package/src/infrastructure-change/plan.js +361 -0
- package/src/infrastructure-change/plan.js.map +1 -0
- package/src/infrastructure-change/risk.d.ts +7 -0
- package/src/infrastructure-change/risk.js +269 -0
- package/src/infrastructure-change/risk.js.map +1 -0
- package/src/infrastructure-change/summary.d.ts +20 -0
- package/src/infrastructure-change/summary.js +130 -0
- package/src/infrastructure-change/summary.js.map +1 -0
- package/src/local-dev/context-discovery.d.ts +2 -0
- package/src/local-dev/context-discovery.js +59 -0
- package/src/local-dev/context-discovery.js.map +1 -0
- package/src/local-dev/contract-validation.d.ts +15 -0
- package/src/local-dev/contract-validation.js +84 -0
- package/src/local-dev/contract-validation.js.map +1 -0
- package/src/local-dev/contracts.d.ts +10 -1
- package/src/local-dev/contracts.js +57 -5
- package/src/local-dev/contracts.js.map +1 -1
- package/src/local-dev/control-contract.d.ts +67 -0
- package/src/local-dev/control-contract.js +180 -0
- package/src/local-dev/control-contract.js.map +1 -0
- package/src/local-dev/dev-command-core.d.ts +60 -0
- package/src/local-dev/dev-command-core.js +89 -0
- package/src/local-dev/dev-command-core.js.map +1 -0
- package/src/local-dev/effects.d.ts +16 -0
- package/src/local-dev/effects.js +63 -0
- package/src/local-dev/effects.js.map +1 -0
- package/src/local-dev/environment-inspector.d.ts +126 -0
- package/src/local-dev/environment-inspector.js +699 -0
- package/src/local-dev/environment-inspector.js.map +1 -0
- package/src/local-dev/environment-state.d.ts +113 -0
- package/src/local-dev/environment-state.js +463 -0
- package/src/local-dev/environment-state.js.map +1 -0
- package/src/local-dev/errors.d.ts +6 -0
- package/src/local-dev/errors.js +41 -0
- package/src/local-dev/errors.js.map +1 -0
- package/src/local-dev/fleet-client.d.ts +33 -0
- package/src/local-dev/fleet-client.js +156 -0
- package/src/local-dev/fleet-client.js.map +1 -0
- package/src/local-dev/fleet-configuration.d.ts +13 -0
- package/src/local-dev/fleet-configuration.js +71 -0
- package/src/local-dev/fleet-configuration.js.map +1 -0
- package/src/local-dev/fleet-inventory.d.ts +56 -0
- package/src/local-dev/fleet-inventory.js +469 -0
- package/src/local-dev/fleet-inventory.js.map +1 -0
- package/src/local-dev/fleet-ipc.d.ts +28 -0
- package/src/local-dev/fleet-ipc.js +267 -0
- package/src/local-dev/fleet-ipc.js.map +1 -0
- package/src/local-dev/fleet-launcher.d.ts +53 -0
- package/src/local-dev/fleet-launcher.js +379 -0
- package/src/local-dev/fleet-launcher.js.map +1 -0
- package/src/local-dev/fleet-lock.d.ts +41 -0
- package/src/local-dev/fleet-lock.js +135 -0
- package/src/local-dev/fleet-lock.js.map +1 -0
- package/src/local-dev/fleet-logs.d.ts +66 -0
- package/src/local-dev/fleet-logs.js +542 -0
- package/src/local-dev/fleet-logs.js.map +1 -0
- package/src/local-dev/fleet-process.d.ts +50 -0
- package/src/local-dev/fleet-process.js +289 -0
- package/src/local-dev/fleet-process.js.map +1 -0
- package/src/local-dev/fleet-runtime.d.ts +22 -0
- package/src/local-dev/fleet-runtime.js +368 -0
- package/src/local-dev/fleet-runtime.js.map +1 -0
- package/src/local-dev/fleet-session.d.ts +70 -0
- package/src/local-dev/fleet-session.js +301 -0
- package/src/local-dev/fleet-session.js.map +1 -0
- package/src/local-dev/fleet-slice-runner-daemon.d.ts +1 -0
- package/src/local-dev/fleet-slice-runner-daemon.js +21 -0
- package/src/local-dev/fleet-slice-runner-daemon.js.map +1 -0
- package/src/local-dev/fleet-startup.d.ts +22 -0
- package/src/local-dev/fleet-startup.js +114 -0
- package/src/local-dev/fleet-startup.js.map +1 -0
- package/src/local-dev/fleet-state.d.ts +62 -0
- package/src/local-dev/fleet-state.js +297 -0
- package/src/local-dev/fleet-state.js.map +1 -0
- package/src/local-dev/fleet-supervisor-daemon.d.ts +1 -0
- package/src/local-dev/fleet-supervisor-daemon.js +41 -0
- package/src/local-dev/fleet-supervisor-daemon.js.map +1 -0
- package/src/local-dev/fleet-supervisor.d.ts +52 -0
- package/src/local-dev/fleet-supervisor.js +384 -0
- package/src/local-dev/fleet-supervisor.js.map +1 -0
- package/src/local-dev/gateway.js +1 -1
- package/src/local-dev/gateway.js.map +1 -1
- package/src/local-dev/identity.js +4 -6
- package/src/local-dev/identity.js.map +1 -1
- package/src/local-dev/index.d.ts +1 -0
- package/src/local-dev/index.js +1 -0
- package/src/local-dev/index.js.map +1 -1
- package/src/local-dev/local-context.d.ts +62 -0
- package/src/local-dev/local-context.js +299 -0
- package/src/local-dev/local-context.js.map +1 -0
- package/src/local-dev/nx-workspace.d.ts +45 -0
- package/src/local-dev/nx-workspace.js +228 -0
- package/src/local-dev/nx-workspace.js.map +1 -0
- package/src/local-dev/personal-secret-ledger.d.ts +75 -0
- package/src/local-dev/personal-secret-ledger.js +391 -0
- package/src/local-dev/personal-secret-ledger.js.map +1 -0
- package/src/local-dev/personal-stage.d.ts +18 -0
- package/src/local-dev/personal-stage.js +129 -0
- package/src/local-dev/personal-stage.js.map +1 -0
- package/src/local-dev/private-state.d.ts +17 -0
- package/src/local-dev/private-state.js +254 -0
- package/src/local-dev/private-state.js.map +1 -0
- package/src/local-dev/process-identity.d.ts +9 -0
- package/src/local-dev/process-identity.js +79 -0
- package/src/local-dev/process-identity.js.map +1 -0
- package/src/local-dev/runtime-paths.d.ts +17 -0
- package/src/local-dev/runtime-paths.js +33 -0
- package/src/local-dev/runtime-paths.js.map +1 -0
- package/src/local-dev/secret-slice-claim.d.ts +17 -0
- package/src/local-dev/secret-slice-claim.js +75 -0
- package/src/local-dev/secret-slice-claim.js.map +1 -0
- package/src/local-dev/slice-claim.d.ts +36 -0
- package/src/local-dev/slice-claim.js +199 -0
- package/src/local-dev/slice-claim.js.map +1 -0
- package/src/local-dev/slice-runner.d.ts +121 -0
- package/src/local-dev/slice-runner.js +715 -0
- package/src/local-dev/slice-runner.js.map +1 -0
- package/src/local-dev/tls.js +51 -17
- package/src/local-dev/tls.js.map +1 -1
- package/src/ownership/composition.d.ts +5 -2
- package/src/ownership/composition.js +26 -3
- package/src/ownership/composition.js.map +1 -1
- package/src/ownership/hash.d.ts +1 -1
- package/src/ownership/hash.js +3 -1
- package/src/ownership/hash.js.map +1 -1
- package/src/ownership/record.d.ts +32 -1
- package/src/ownership/record.js +139 -2
- package/src/ownership/record.js.map +1 -1
- package/src/performance/cost-collection.d.ts +225 -0
- package/src/performance/cost-collection.js +825 -0
- package/src/performance/cost-collection.js.map +1 -0
- package/src/performance/cost-controls.d.ts +131 -0
- package/src/performance/cost-controls.js +336 -0
- package/src/performance/cost-controls.js.map +1 -0
- package/src/performance/evidence.d.ts +140 -0
- package/src/performance/evidence.js +599 -0
- package/src/performance/evidence.js.map +1 -0
- package/src/performance/index.d.ts +10 -0
- package/src/performance/index.js +14 -0
- package/src/performance/index.js.map +1 -0
- package/src/performance/load-safety.d.ts +84 -0
- package/src/performance/load-safety.js +346 -0
- package/src/performance/load-safety.js.map +1 -0
- package/src/performance/model.d.ts +129 -0
- package/src/performance/model.js +452 -0
- package/src/performance/model.js.map +1 -0
- package/src/performance/pr-artifact-budget.d.ts +42 -0
- package/src/performance/pr-artifact-budget.js +151 -0
- package/src/performance/pr-artifact-budget.js.map +1 -0
- package/src/performance/runner.d.ts +75 -0
- package/src/performance/runner.js +227 -0
- package/src/performance/runner.js.map +1 -0
- package/src/performance/scenario-endpoint.d.ts +1 -0
- package/src/performance/scenario-endpoint.js +5 -0
- package/src/performance/scenario-endpoint.js.map +1 -0
- package/src/performance/scenario.d.ts +193 -0
- package/src/performance/scenario.js +736 -0
- package/src/performance/scenario.js.map +1 -0
- package/src/performance/test-fixtures.d.ts +7 -0
- package/src/performance/test-fixtures.js +169 -0
- package/src/performance/test-fixtures.js.map +1 -0
- package/src/performance/unit-cost.d.ts +105 -0
- package/src/performance/unit-cost.js +364 -0
- package/src/performance/unit-cost.js.map +1 -0
- package/src/release/index.d.ts +4 -0
- package/src/release/index.js +8 -0
- package/src/release/index.js.map +1 -0
- package/src/release/lifecycle.d.ts +132 -0
- package/src/release/lifecycle.js +411 -0
- package/src/release/lifecycle.js.map +1 -0
- package/src/release/manifest.d.ts +148 -0
- package/src/release/manifest.js +503 -0
- package/src/release/manifest.js.map +1 -0
- package/src/release/rollout.d.ts +170 -0
- package/src/release/rollout.js +578 -0
- package/src/release/rollout.js.map +1 -0
- package/src/release/source-authority.d.ts +19 -0
- package/src/release/source-authority.js +195 -0
- package/src/release/source-authority.js.map +1 -0
- package/src/repository-policy/deployment-plan.d.ts +2 -1
- package/src/repository-policy/deployment-plan.js +2 -0
- package/src/repository-policy/deployment-plan.js.map +1 -1
- package/src/repository-policy/policy.d.ts +1 -1
- package/src/repository-policy/policy.js +29 -25
- package/src/repository-policy/policy.js.map +1 -1
- package/src/schemas/aggregate-count-evidence-v1.json +135 -0
- package/src/schemas/api-contract-baseline-v1.json +674 -0
- package/src/schemas/api-contract-compatibility-report-v1.json +126 -0
- package/src/schemas/aws-billing-actual-evidence-v1.json +407 -0
- package/src/schemas/blueprint-v1.json +18 -1
- package/src/schemas/data-lifecycle-policy-v1.json +517 -0
- package/src/schemas/generated-ownership-v2.json +22 -0
- package/src/schemas/performance-policy-v1.json +335 -0
- package/src/schemas/repository-policy-v1.json +1 -0
- package/src/schemas/testing-evidence-quarantine-v1.json +168 -0
- package/src/schemas/testing-evidence-result-v1.json +319 -0
- package/src/secrets/adapters.d.ts +49 -0
- package/src/secrets/adapters.js +184 -0
- package/src/secrets/adapters.js.map +1 -0
- package/src/secrets/aws-control-plane.d.ts +20 -0
- package/src/secrets/aws-control-plane.js +255 -0
- package/src/secrets/aws-control-plane.js.map +1 -0
- package/src/secrets/declaration-verification.d.ts +11 -0
- package/src/secrets/declaration-verification.js +68 -0
- package/src/secrets/declaration-verification.js.map +1 -0
- package/src/secrets/guardrails.d.ts +26 -0
- package/src/secrets/guardrails.js +328 -0
- package/src/secrets/guardrails.js.map +1 -0
- package/src/secrets/index.d.ts +12 -0
- package/src/secrets/index.js +16 -0
- package/src/secrets/index.js.map +1 -0
- package/src/secrets/metadata.d.ts +48 -0
- package/src/secrets/metadata.js +171 -0
- package/src/secrets/metadata.js.map +1 -0
- package/src/secrets/model.d.ts +49 -0
- package/src/secrets/model.js +125 -0
- package/src/secrets/model.js.map +1 -0
- package/src/secrets/operator.d.ts +101 -0
- package/src/secrets/operator.js +229 -0
- package/src/secrets/operator.js.map +1 -0
- package/src/secrets/permissions.d.ts +34 -0
- package/src/secrets/permissions.js +86 -0
- package/src/secrets/permissions.js.map +1 -0
- package/src/secrets/personal-command.d.ts +83 -0
- package/src/secrets/personal-command.js +197 -0
- package/src/secrets/personal-command.js.map +1 -0
- package/src/secrets/personal-ledger.d.ts +21 -0
- package/src/secrets/personal-ledger.js +135 -0
- package/src/secrets/personal-ledger.js.map +1 -0
- package/src/secrets/registry.d.ts +9 -0
- package/src/secrets/registry.js +86 -0
- package/src/secrets/registry.js.map +1 -0
- package/src/secrets/verification.d.ts +18 -0
- package/src/secrets/verification.js +139 -0
- package/src/secrets/verification.js.map +1 -0
- package/src/secrets/workload-access.d.ts +46 -0
- package/src/secrets/workload-access.js +163 -0
- package/src/secrets/workload-access.js.map +1 -0
- package/src/supply-chain/action-pins.d.ts +26 -0
- package/src/supply-chain/action-pins.js +208 -0
- package/src/supply-chain/action-pins.js.map +1 -0
- package/src/supply-chain/blueprint-trust-git.d.ts +130 -0
- package/src/supply-chain/blueprint-trust-git.js +1632 -0
- package/src/supply-chain/blueprint-trust-git.js.map +1 -0
- package/src/supply-chain/blueprint-trust-process.d.ts +4 -0
- package/src/supply-chain/blueprint-trust-process.js +88 -0
- package/src/supply-chain/blueprint-trust-process.js.map +1 -0
- package/src/supply-chain/blueprint-trust.d.ts +354 -0
- package/src/supply-chain/blueprint-trust.js +1558 -0
- package/src/supply-chain/blueprint-trust.js.map +1 -0
- package/src/supply-chain/blueprint-verification-authority.d.ts +62 -0
- package/src/supply-chain/blueprint-verification-authority.js +588 -0
- package/src/supply-chain/blueprint-verification-authority.js.map +1 -0
- package/src/supply-chain/blueprint-verification-execution.d.ts +68 -0
- package/src/supply-chain/blueprint-verification-execution.js +639 -0
- package/src/supply-chain/blueprint-verification-execution.js.map +1 -0
- package/src/supply-chain/build-output.d.ts +35 -0
- package/src/supply-chain/build-output.js +398 -0
- package/src/supply-chain/build-output.js.map +1 -0
- package/src/supply-chain/common.d.ts +21 -0
- package/src/supply-chain/common.js +107 -0
- package/src/supply-chain/common.js.map +1 -0
- package/src/supply-chain/container-artifact-contract.d.ts +23 -0
- package/src/supply-chain/container-artifact-contract.js +208 -0
- package/src/supply-chain/container-artifact-contract.js.map +1 -0
- package/src/supply-chain/container-release.d.ts +119 -0
- package/src/supply-chain/container-release.js +496 -0
- package/src/supply-chain/container-release.js.map +1 -0
- package/src/supply-chain/ecr-applicability.d.ts +19 -0
- package/src/supply-chain/ecr-applicability.js +103 -0
- package/src/supply-chain/ecr-applicability.js.map +1 -0
- package/src/supply-chain/ecr-scanning.d.ts +83 -0
- package/src/supply-chain/ecr-scanning.js +321 -0
- package/src/supply-chain/ecr-scanning.js.map +1 -0
- package/src/supply-chain/ecs-deployed-image.d.ts +85 -0
- package/src/supply-chain/ecs-deployed-image.js +300 -0
- package/src/supply-chain/ecs-deployed-image.js.map +1 -0
- package/src/supply-chain/errors.d.ts +6 -0
- package/src/supply-chain/errors.js +15 -0
- package/src/supply-chain/errors.js.map +1 -0
- package/src/supply-chain/generated-blueprint-trust-command.d.ts +4 -0
- package/src/supply-chain/generated-blueprint-trust-command.js +1362 -0
- package/src/supply-chain/generated-blueprint-trust-command.js.map +1 -0
- package/src/supply-chain/generated-command.d.ts +1 -0
- package/src/supply-chain/generated-command.js +774 -0
- package/src/supply-chain/generated-command.js.map +1 -0
- package/src/supply-chain/generated-container-release-command.d.ts +16 -0
- package/src/supply-chain/generated-container-release-command.js +2087 -0
- package/src/supply-chain/generated-container-release-command.js.map +1 -0
- package/src/supply-chain/generated-ecr-collector-command.d.ts +21 -0
- package/src/supply-chain/generated-ecr-collector-command.js +1338 -0
- package/src/supply-chain/generated-ecr-collector-command.js.map +1 -0
- package/src/supply-chain/generated-files.d.ts +13 -0
- package/src/supply-chain/generated-files.js +401 -0
- package/src/supply-chain/generated-files.js.map +1 -0
- package/src/supply-chain/generated-scanner-command.d.ts +1 -0
- package/src/supply-chain/generated-scanner-command.js +777 -0
- package/src/supply-chain/generated-scanner-command.js.map +1 -0
- package/src/supply-chain/index.d.ts +28 -0
- package/src/supply-chain/index.js +35 -0
- package/src/supply-chain/index.js.map +1 -0
- package/src/supply-chain/inventory.d.ts +96 -0
- package/src/supply-chain/inventory.js +828 -0
- package/src/supply-chain/inventory.js.map +1 -0
- package/src/supply-chain/license-expression.d.ts +7 -0
- package/src/supply-chain/license-expression.js +128 -0
- package/src/supply-chain/license-expression.js.map +1 -0
- package/src/supply-chain/pnpm-toolchain-authority.d.ts +32 -0
- package/src/supply-chain/pnpm-toolchain-authority.js +302 -0
- package/src/supply-chain/pnpm-toolchain-authority.js.map +1 -0
- package/src/supply-chain/policy.d.ts +105 -0
- package/src/supply-chain/policy.js +304 -0
- package/src/supply-chain/policy.js.map +1 -0
- package/src/supply-chain/publication.d.ts +48 -0
- package/src/supply-chain/publication.js +85 -0
- package/src/supply-chain/publication.js.map +1 -0
- package/src/supply-chain/sbom.d.ts +228 -0
- package/src/supply-chain/sbom.js +826 -0
- package/src/supply-chain/sbom.js.map +1 -0
- package/src/supply-chain/scanner.d.ts +77 -0
- package/src/supply-chain/scanner.js +511 -0
- package/src/supply-chain/scanner.js.map +1 -0
- package/src/supply-chain/vendored-source.d.ts +95 -0
- package/src/supply-chain/vendored-source.js +315 -0
- package/src/supply-chain/vendored-source.js.map +1 -0
- package/src/testing-evidence/fixture-scope.d.ts +52 -0
- package/src/testing-evidence/fixture-scope.js +140 -0
- package/src/testing-evidence/fixture-scope.js.map +1 -0
- package/src/testing-evidence/index.d.ts +5 -0
- package/src/testing-evidence/index.js +9 -0
- package/src/testing-evidence/index.js.map +1 -0
- package/src/testing-evidence/quarantine.d.ts +48 -0
- package/src/testing-evidence/quarantine.js +253 -0
- package/src/testing-evidence/quarantine.js.map +1 -0
- package/src/testing-evidence/result.d.ts +108 -0
- package/src/testing-evidence/result.js +571 -0
- package/src/testing-evidence/result.js.map +1 -0
- package/src/testing-evidence/runner-adapter.d.ts +51 -0
- package/src/testing-evidence/runner-adapter.js +288 -0
- package/src/testing-evidence/runner-adapter.js.map +1 -0
- package/src/testing-evidence/sensitive-artifacts.d.ts +13 -0
- package/src/testing-evidence/sensitive-artifacts.js +93 -0
- package/src/testing-evidence/sensitive-artifacts.js.map +1 -0
- package/src/work-markers/work-markers.js +4 -3
- package/src/work-markers/work-markers.js.map +1 -1
- package/src/workload-roles/account-baseline.d.ts +132 -0
- package/src/workload-roles/account-baseline.js +743 -0
- package/src/workload-roles/account-baseline.js.map +1 -0
- package/src/workload-roles/authority.d.ts +38 -0
- package/src/workload-roles/authority.js +156 -0
- package/src/workload-roles/authority.js.map +1 -0
- package/src/workload-roles/aws-adapter.d.ts +99 -0
- package/src/workload-roles/aws-adapter.js +416 -0
- package/src/workload-roles/aws-adapter.js.map +1 -0
- package/src/workload-roles/aws-internal-handler.d.ts +27 -0
- package/src/workload-roles/aws-internal-handler.js +58 -0
- package/src/workload-roles/aws-internal-handler.js.map +1 -0
- package/src/workload-roles/aws-s3-state.d.ts +52 -0
- package/src/workload-roles/aws-s3-state.js +164 -0
- package/src/workload-roles/aws-s3-state.js.map +1 -0
- package/src/workload-roles/aws-sdk-control-plane.d.ts +12 -0
- package/src/workload-roles/aws-sdk-control-plane.js +291 -0
- package/src/workload-roles/aws-sdk-control-plane.js.map +1 -0
- package/src/workload-roles/boundary.d.ts +33 -0
- package/src/workload-roles/boundary.js +130 -0
- package/src/workload-roles/boundary.js.map +1 -0
- package/src/workload-roles/convergence.d.ts +66 -0
- package/src/workload-roles/convergence.js +186 -0
- package/src/workload-roles/convergence.js.map +1 -0
- package/src/workload-roles/effective-policy.d.ts +51 -0
- package/src/workload-roles/effective-policy.js +183 -0
- package/src/workload-roles/effective-policy.js.map +1 -0
- package/src/workload-roles/handler.d.ts +43 -0
- package/src/workload-roles/handler.js +130 -0
- package/src/workload-roles/handler.js.map +1 -0
- package/src/workload-roles/history.d.ts +47 -0
- package/src/workload-roles/history.js +324 -0
- package/src/workload-roles/history.js.map +1 -0
- package/src/workload-roles/index.d.ts +17 -0
- package/src/workload-roles/index.js +21 -0
- package/src/workload-roles/index.js.map +1 -0
- package/src/workload-roles/injection.d.ts +119 -0
- package/src/workload-roles/injection.js +495 -0
- package/src/workload-roles/injection.js.map +1 -0
- package/src/workload-roles/manifest.d.ts +54 -0
- package/src/workload-roles/manifest.js +343 -0
- package/src/workload-roles/manifest.js.map +1 -0
- package/src/workload-roles/provisioner.d.ts +70 -0
- package/src/workload-roles/provisioner.js +231 -0
- package/src/workload-roles/provisioner.js.map +1 -0
- package/src/workload-roles/registration.d.ts +101 -0
- package/src/workload-roles/registration.js +457 -0
- package/src/workload-roles/registration.js.map +1 -0
- package/src/workload-roles/stage-boundary.d.ts +31 -0
- package/src/workload-roles/stage-boundary.js +208 -0
- package/src/workload-roles/stage-boundary.js.map +1 -0
- package/src/workload-roles/standard-slice.d.ts +54 -0
- package/src/workload-roles/standard-slice.js +252 -0
- package/src/workload-roles/standard-slice.js.map +1 -0
- package/migrations/standard-pre-v1-to-v1.md +0 -11
- package/src/foundation/aurora-logical-database.d.ts +0 -76
- package/src/foundation/aurora-logical-database.js +0 -419
- package/src/foundation/aurora-logical-database.js.map +0 -1
|
@@ -0,0 +1,828 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SUPPLY_CHAIN_SUPPORTED_PLATFORMS = exports.SUPPLY_CHAIN_INVENTORY_SCHEMA_VERSION = void 0;
|
|
4
|
+
exports.discoverLifecycleScripts = discoverLifecycleScripts;
|
|
5
|
+
exports.workspacePackageGlobs = workspacePackageGlobs;
|
|
6
|
+
exports.assertWorkspaceImporterCoverage = assertWorkspaceImporterCoverage;
|
|
7
|
+
exports.deriveWorkspaceManifestPathsFromPnpmLock = deriveWorkspaceManifestPathsFromPnpmLock;
|
|
8
|
+
exports.validateReviewedBuildPermissions = validateReviewedBuildPermissions;
|
|
9
|
+
exports.validateLifecycleScriptInventory = validateLifecycleScriptInventory;
|
|
10
|
+
exports.scanContainerImageAuthorities = scanContainerImageAuthorities;
|
|
11
|
+
exports.scanContainerRecipe = scanContainerRecipe;
|
|
12
|
+
exports.createSupplyChainInventory = createSupplyChainInventory;
|
|
13
|
+
const deterministic_order_js_1 = require("../deterministic-order.js");
|
|
14
|
+
const yaml_1 = require("yaml");
|
|
15
|
+
const validation_js_1 = require("../validation.js");
|
|
16
|
+
const common_js_1 = require("./common.js");
|
|
17
|
+
const errors_js_1 = require("./errors.js");
|
|
18
|
+
exports.SUPPLY_CHAIN_INVENTORY_SCHEMA_VERSION = 2;
|
|
19
|
+
exports.SUPPLY_CHAIN_SUPPORTED_PLATFORMS = [
|
|
20
|
+
'darwin-arm64',
|
|
21
|
+
'darwin-x64',
|
|
22
|
+
'linux-arm64-glibc',
|
|
23
|
+
'linux-arm64-musl',
|
|
24
|
+
'linux-x64-glibc',
|
|
25
|
+
'linux-x64-musl',
|
|
26
|
+
'win32-arm64',
|
|
27
|
+
'win32-x64',
|
|
28
|
+
];
|
|
29
|
+
function discoverLifecycleScripts(packageMetadata) {
|
|
30
|
+
const discovered = new Map();
|
|
31
|
+
for (const [index, metadata] of packageMetadata.entries()) {
|
|
32
|
+
if (!(0, validation_js_1.isRecord)(metadata)) {
|
|
33
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `packageMetadata[${index}]`, 'must be a package manifest object');
|
|
34
|
+
}
|
|
35
|
+
const scripts = (0, validation_js_1.isRecord)(metadata.scripts) ? metadata.scripts : {};
|
|
36
|
+
const lifecycle = ['preinstall', 'install', 'postinstall'].filter((name) => typeof scripts[name] === 'string');
|
|
37
|
+
if (lifecycle.length === 0)
|
|
38
|
+
continue;
|
|
39
|
+
if (typeof metadata.name !== 'string' ||
|
|
40
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(metadata.name) ||
|
|
41
|
+
typeof metadata.version !== 'string' ||
|
|
42
|
+
metadata.version.trim() === '') {
|
|
43
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `packageMetadata[${index}]`, 'a package with lifecycle code must expose exact name and version metadata');
|
|
44
|
+
}
|
|
45
|
+
const identity = `${metadata.name}@${metadata.version}`;
|
|
46
|
+
const existing = discovered.get(identity);
|
|
47
|
+
if (existing &&
|
|
48
|
+
existing.scripts.join('\0') !== lifecycle.sort().join('\0')) {
|
|
49
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `packageMetadata[${index}]`, `${identity} has conflicting installed lifecycle metadata`);
|
|
50
|
+
}
|
|
51
|
+
discovered.set(identity, {
|
|
52
|
+
package: metadata.name,
|
|
53
|
+
scripts: lifecycle.sort(),
|
|
54
|
+
version: metadata.version,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return [...discovered.values()].sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(`${left.package}\0${left.version}`, `${right.package}\0${right.version}`));
|
|
58
|
+
}
|
|
59
|
+
function manifestImporter(path) {
|
|
60
|
+
if (path === 'package.json')
|
|
61
|
+
return '.';
|
|
62
|
+
if (!path.endsWith('/package.json') || path.startsWith('/')) {
|
|
63
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'manifest path must be repository-relative and end with package.json');
|
|
64
|
+
}
|
|
65
|
+
const importer = path.slice(0, -'/package.json'.length);
|
|
66
|
+
if (importer
|
|
67
|
+
.split('/')
|
|
68
|
+
.some((segment) => segment === '' || segment === '.' || segment === '..')) {
|
|
69
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'manifest path contains an unsafe segment');
|
|
70
|
+
}
|
|
71
|
+
return importer;
|
|
72
|
+
}
|
|
73
|
+
function dependencySections() {
|
|
74
|
+
return [
|
|
75
|
+
['dependencies', 'production'],
|
|
76
|
+
['devDependencies', 'development'],
|
|
77
|
+
['optionalDependencies', 'optional'],
|
|
78
|
+
['peerDependencies', 'peer'],
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
function lockSection(scope) {
|
|
82
|
+
switch (scope) {
|
|
83
|
+
case 'development':
|
|
84
|
+
return 'devDependencies';
|
|
85
|
+
case 'optional':
|
|
86
|
+
return 'optionalDependencies';
|
|
87
|
+
case 'peer':
|
|
88
|
+
return 'peerDependencies';
|
|
89
|
+
case 'production':
|
|
90
|
+
return 'dependencies';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function requirePackageManager(manifest, nodeVersion) {
|
|
94
|
+
if (typeof manifest.packageManager !== 'string' ||
|
|
95
|
+
!/^pnpm@\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?\+sha512\.[a-f0-9]{128}$/.test(manifest.packageManager)) {
|
|
96
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'package.json#packageManager', 'must pin an exact pnpm version and Corepack SHA-512 artifact digest');
|
|
97
|
+
}
|
|
98
|
+
const engines = manifest.engines;
|
|
99
|
+
if (!(0, validation_js_1.isRecord)(engines) ||
|
|
100
|
+
typeof engines.node !== 'string' ||
|
|
101
|
+
engines.node.trim() === '') {
|
|
102
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'package.json#engines.node', 'must declare the supported Node.js version policy');
|
|
103
|
+
}
|
|
104
|
+
if (!/^\d+\.\d+\.\d+$/.test(nodeVersion)) {
|
|
105
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', '.node-version', 'must pin one exact Node.js patch version');
|
|
106
|
+
}
|
|
107
|
+
return { node: nodeVersion, packageManager: manifest.packageManager };
|
|
108
|
+
}
|
|
109
|
+
function parseLockfile(lockfile) {
|
|
110
|
+
let value;
|
|
111
|
+
try {
|
|
112
|
+
value = (0, yaml_1.parse)(lockfile);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-lock.yaml', `cannot be parsed: ${error instanceof Error ? error.message : String(error)}`);
|
|
116
|
+
}
|
|
117
|
+
if (!(0, validation_js_1.isRecord)(value) ||
|
|
118
|
+
!['9.0', 9].includes(value.lockfileVersion) ||
|
|
119
|
+
!(0, validation_js_1.isRecord)(value.importers) ||
|
|
120
|
+
!(0, validation_js_1.isRecord)(value.packages)) {
|
|
121
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-lock.yaml', `must be a complete pnpm lockfile v9 (version=${String((0, validation_js_1.isRecord)(value) ? value.lockfileVersion : undefined)}, importers=${String((0, validation_js_1.isRecord)(value) && (0, validation_js_1.isRecord)(value.importers))}, packages=${String((0, validation_js_1.isRecord)(value) && (0, validation_js_1.isRecord)(value.packages))})`);
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
const MAX_WORKSPACE_IMPORTERS = 2_000;
|
|
126
|
+
const MAX_WORKSPACE_IMPORTER_LENGTH = 1_024;
|
|
127
|
+
const MAX_WORKSPACE_IMPORTER_SEGMENT_LENGTH = 255;
|
|
128
|
+
const WINDOWS_RESERVED_WORKSPACE_SEGMENT = /^(?:aux|con|nul|prn|com[1-9]|lpt[1-9])(?:\..*)?$/iu;
|
|
129
|
+
function hasControlCharacter(value) {
|
|
130
|
+
return [...value].some((character) => {
|
|
131
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
132
|
+
return codePoint <= 0x1f || codePoint === 0x7f;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function workspaceManifestPath(importer) {
|
|
136
|
+
if (importer === '.')
|
|
137
|
+
return 'package.json';
|
|
138
|
+
const segments = importer.split('/');
|
|
139
|
+
if (importer.length === 0 ||
|
|
140
|
+
Buffer.byteLength(importer, 'utf8') > MAX_WORKSPACE_IMPORTER_LENGTH ||
|
|
141
|
+
importer.startsWith('/') ||
|
|
142
|
+
importer.endsWith('/') ||
|
|
143
|
+
importer.includes('\\') ||
|
|
144
|
+
/^[A-Za-z]:/u.test(importer) ||
|
|
145
|
+
hasControlCharacter(importer) ||
|
|
146
|
+
segments.some((segment) => segment === '' ||
|
|
147
|
+
segment === '.' ||
|
|
148
|
+
segment === '..' ||
|
|
149
|
+
Buffer.byteLength(segment, 'utf8') >
|
|
150
|
+
MAX_WORKSPACE_IMPORTER_SEGMENT_LENGTH ||
|
|
151
|
+
/[<>:"|?*]/u.test(segment) ||
|
|
152
|
+
/[. ]$/u.test(segment) ||
|
|
153
|
+
WINDOWS_RESERVED_WORKSPACE_SEGMENT.test(segment))) {
|
|
154
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `pnpm-lock.yaml#importers.${importer}`, 'workspace importer must be one bounded repository-relative POSIX path');
|
|
155
|
+
}
|
|
156
|
+
return `${importer}/package.json`;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Returns the declared workspace package globs so a caller can enumerate the
|
|
160
|
+
* manifests that must appear as lockfile importers.
|
|
161
|
+
*/
|
|
162
|
+
function workspacePackageGlobs(workspacePolicy) {
|
|
163
|
+
let parsed;
|
|
164
|
+
try {
|
|
165
|
+
parsed = (0, yaml_1.parse)(workspacePolicy);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-workspace.yaml', `cannot be parsed: ${error instanceof Error ? error.message : String(error)}`);
|
|
169
|
+
}
|
|
170
|
+
const packages = (0, validation_js_1.isRecord)(parsed) ? parsed.packages : undefined;
|
|
171
|
+
if (!Array.isArray(packages) ||
|
|
172
|
+
packages.length === 0 ||
|
|
173
|
+
packages.length > MAX_WORKSPACE_IMPORTERS ||
|
|
174
|
+
packages.some((entry) => typeof entry !== 'string' ||
|
|
175
|
+
entry.trim() === '' ||
|
|
176
|
+
entry !== entry.trim() ||
|
|
177
|
+
entry.startsWith('/') ||
|
|
178
|
+
entry.split('/').includes('..'))) {
|
|
179
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-workspace.yaml#packages', 'must declare bounded relative workspace package globs');
|
|
180
|
+
}
|
|
181
|
+
return packages;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Fails closed when a manifest the workspace globs select is absent from the
|
|
185
|
+
* lockfile importers. Deriving the manifest inventory from the importers
|
|
186
|
+
* alone cannot observe that drift: a manifest stripped from the lockfile
|
|
187
|
+
* simply disappears from the inventory instead of being reported.
|
|
188
|
+
*/
|
|
189
|
+
function assertWorkspaceImporterCoverage(discoveredManifestPaths, importerManifestPaths) {
|
|
190
|
+
const importers = new Set(importerManifestPaths);
|
|
191
|
+
const missing = [...new Set(discoveredManifestPaths)]
|
|
192
|
+
.filter((path) => !importers.has(path))
|
|
193
|
+
.sort(deterministic_order_js_1.compareUtf16);
|
|
194
|
+
if (missing.length > 0) {
|
|
195
|
+
throw new errors_js_1.SupplyChainError('supply-chain-lock-drift', 'pnpm-lock.yaml#importers', `is missing the importer for ${missing.join(', ')}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Derives the exact manifest inventory from a complete pnpm lockfile rather
|
|
200
|
+
* than executing a package manager selected from ambient PATH.
|
|
201
|
+
*/
|
|
202
|
+
function deriveWorkspaceManifestPathsFromPnpmLock(lockfileSource) {
|
|
203
|
+
const lockfile = parseLockfile(lockfileSource);
|
|
204
|
+
const importers = lockfile.importers;
|
|
205
|
+
const entries = Object.entries(importers).sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right));
|
|
206
|
+
if (entries.length === 0 || entries.length > MAX_WORKSPACE_IMPORTERS) {
|
|
207
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-lock.yaml#importers', `must contain from 1 through ${MAX_WORKSPACE_IMPORTERS} workspace importers`);
|
|
208
|
+
}
|
|
209
|
+
if (!Object.prototype.hasOwnProperty.call(importers, '.')) {
|
|
210
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', 'pnpm-lock.yaml#importers', 'must contain the root workspace importer');
|
|
211
|
+
}
|
|
212
|
+
const paths = entries.map(([importer, value]) => {
|
|
213
|
+
if (!(0, validation_js_1.isRecord)(value)) {
|
|
214
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `pnpm-lock.yaml#importers.${importer}`, 'workspace importer must be an object');
|
|
215
|
+
}
|
|
216
|
+
return workspaceManifestPath(importer);
|
|
217
|
+
});
|
|
218
|
+
const portableIdentities = new Set();
|
|
219
|
+
for (const path of paths) {
|
|
220
|
+
const identity = path.normalize('NFC').toLowerCase();
|
|
221
|
+
if (portableIdentities.has(identity)) {
|
|
222
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-lock.yaml#importers', 'workspace importers must not alias on supported filesystems');
|
|
223
|
+
}
|
|
224
|
+
portableIdentities.add(identity);
|
|
225
|
+
}
|
|
226
|
+
return paths;
|
|
227
|
+
}
|
|
228
|
+
function collectDependencies(manifests, lockfile) {
|
|
229
|
+
const importers = lockfile.importers;
|
|
230
|
+
const entries = [];
|
|
231
|
+
for (const [manifestPath, manifestValue] of Object.entries(manifests).sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))) {
|
|
232
|
+
if (!(0, validation_js_1.isRecord)(manifestValue)) {
|
|
233
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', manifestPath, 'package manifest must be an object');
|
|
234
|
+
}
|
|
235
|
+
const importerName = manifestImporter(manifestPath);
|
|
236
|
+
const importer = importers[importerName];
|
|
237
|
+
if (!(0, validation_js_1.isRecord)(importer)) {
|
|
238
|
+
throw new errors_js_1.SupplyChainError('supply-chain-lock-drift', `pnpm-lock.yaml#importers.${importerName}`, `is missing the importer for ${manifestPath}`);
|
|
239
|
+
}
|
|
240
|
+
for (const [manifestSection, scope] of dependencySections()) {
|
|
241
|
+
const declared = manifestValue[manifestSection];
|
|
242
|
+
if (declared === undefined)
|
|
243
|
+
continue;
|
|
244
|
+
if (!(0, validation_js_1.isRecord)(declared)) {
|
|
245
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${manifestPath}#${manifestSection}`, 'must be an object');
|
|
246
|
+
}
|
|
247
|
+
const locked = importer[lockSection(scope)];
|
|
248
|
+
if (!(0, validation_js_1.isRecord)(locked) && Object.keys(declared).length > 0) {
|
|
249
|
+
throw new errors_js_1.SupplyChainError('supply-chain-lock-drift', `pnpm-lock.yaml#importers.${importerName}.${lockSection(scope)}`, 'is missing declared dependencies');
|
|
250
|
+
}
|
|
251
|
+
for (const [dependency, specifier] of Object.entries(declared).sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))) {
|
|
252
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(dependency) ||
|
|
253
|
+
typeof specifier !== 'string' ||
|
|
254
|
+
specifier.trim() === '') {
|
|
255
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${manifestPath}#${manifestSection}.${dependency}`, 'must be a valid package name and non-empty specifier');
|
|
256
|
+
}
|
|
257
|
+
const lockEntry = (0, validation_js_1.isRecord)(locked) ? locked[dependency] : undefined;
|
|
258
|
+
if (!(0, validation_js_1.isRecord)(lockEntry) ||
|
|
259
|
+
lockEntry.specifier !== specifier ||
|
|
260
|
+
typeof lockEntry.version !== 'string' ||
|
|
261
|
+
lockEntry.version.trim() === '') {
|
|
262
|
+
throw new errors_js_1.SupplyChainError('supply-chain-lock-drift', `pnpm-lock.yaml#importers.${importerName}.${lockSection(scope)}.${dependency}`, `does not exactly bind manifest specifier ${specifier}`);
|
|
263
|
+
}
|
|
264
|
+
entries.push({
|
|
265
|
+
importer: importerName,
|
|
266
|
+
name: dependency,
|
|
267
|
+
resolved: lockEntry.version,
|
|
268
|
+
scope,
|
|
269
|
+
specifier,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return entries.sort((left, right) => (0, deterministic_order_js_1.compareUtf16)([
|
|
275
|
+
left.importer,
|
|
276
|
+
left.scope,
|
|
277
|
+
left.name,
|
|
278
|
+
left.specifier,
|
|
279
|
+
left.resolved,
|
|
280
|
+
].join('\0'), [
|
|
281
|
+
right.importer,
|
|
282
|
+
right.scope,
|
|
283
|
+
right.name,
|
|
284
|
+
right.specifier,
|
|
285
|
+
right.resolved,
|
|
286
|
+
].join('\0')));
|
|
287
|
+
}
|
|
288
|
+
function parseLockPackageIdentity(lockKey) {
|
|
289
|
+
const withoutPeers = lockKey.replace(/\(.+$/, '');
|
|
290
|
+
const separator = withoutPeers.lastIndexOf('@');
|
|
291
|
+
if (separator <= 0) {
|
|
292
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#packages.${lockKey}`, 'cannot derive package name and exact version from lock key');
|
|
293
|
+
}
|
|
294
|
+
const name = withoutPeers.slice(0, separator);
|
|
295
|
+
const version = withoutPeers.slice(separator + 1);
|
|
296
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(name) ||
|
|
297
|
+
version.length === 0 ||
|
|
298
|
+
/^(?:link|workspace|file):/.test(version)) {
|
|
299
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#packages.${lockKey}`, 'must identify a registry package and exact resolved version');
|
|
300
|
+
}
|
|
301
|
+
return { name, version };
|
|
302
|
+
}
|
|
303
|
+
function packageDependencyReference(value, path) {
|
|
304
|
+
const separator = value.startsWith('@')
|
|
305
|
+
? value.indexOf('@', value.indexOf('/') + 1)
|
|
306
|
+
: value.indexOf('@');
|
|
307
|
+
const name = value.slice(0, separator);
|
|
308
|
+
const reference = value.slice(separator + 1);
|
|
309
|
+
if (separator <= 0 ||
|
|
310
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(name) ||
|
|
311
|
+
reference.trim() === '') {
|
|
312
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', path, 'must identify a package name and exact lock reference');
|
|
313
|
+
}
|
|
314
|
+
return { name, reference };
|
|
315
|
+
}
|
|
316
|
+
function effectivePackagePlatforms(roots, packages) {
|
|
317
|
+
const byLockKey = new Map(packages.map((entry) => [entry.lockKey, entry]));
|
|
318
|
+
const byIdentity = new Map();
|
|
319
|
+
for (const entry of packages) {
|
|
320
|
+
const identity = `${entry.name}\0${entry.version}`;
|
|
321
|
+
byIdentity.set(identity, [...(byIdentity.get(identity) ?? []), entry]);
|
|
322
|
+
}
|
|
323
|
+
const targetFor = (name, reference, path) => {
|
|
324
|
+
if (/^(?:file|link|workspace):/.test(reference))
|
|
325
|
+
return undefined;
|
|
326
|
+
let targetName = name;
|
|
327
|
+
let targetReference = reference;
|
|
328
|
+
if (reference.startsWith('npm:')) {
|
|
329
|
+
const alias = packageDependencyReference(reference.slice(4), path);
|
|
330
|
+
targetName = alias.name;
|
|
331
|
+
targetReference = alias.reference;
|
|
332
|
+
}
|
|
333
|
+
const exact = byLockKey.get(`${targetName}@${targetReference}`);
|
|
334
|
+
if (exact)
|
|
335
|
+
return exact;
|
|
336
|
+
const aliasSeparator = targetReference.startsWith('@')
|
|
337
|
+
? targetReference.indexOf('@', targetReference.indexOf('/') + 1)
|
|
338
|
+
: targetReference.indexOf('@');
|
|
339
|
+
const aliasName = targetReference.slice(0, aliasSeparator);
|
|
340
|
+
const aliasReference = targetReference.slice(aliasSeparator + 1);
|
|
341
|
+
if (aliasSeparator > 0 &&
|
|
342
|
+
common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(aliasName) &&
|
|
343
|
+
aliasReference.trim() !== '') {
|
|
344
|
+
targetName = aliasName;
|
|
345
|
+
targetReference = aliasReference;
|
|
346
|
+
const aliased = byLockKey.get(`${targetName}@${targetReference}`);
|
|
347
|
+
if (aliased)
|
|
348
|
+
return aliased;
|
|
349
|
+
}
|
|
350
|
+
const peerlessReference = targetReference.replace(/\(.+$/, '');
|
|
351
|
+
const candidates = byIdentity.get(`${targetName}\0${peerlessReference}`) ?? [];
|
|
352
|
+
if (candidates.length !== 1) {
|
|
353
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', path, candidates.length === 0
|
|
354
|
+
? `has no package snapshot for ${targetName}@${targetReference}`
|
|
355
|
+
: `does not select one exact peer context for ${targetName}@${targetReference}`);
|
|
356
|
+
}
|
|
357
|
+
return candidates[0];
|
|
358
|
+
};
|
|
359
|
+
const effective = new Map();
|
|
360
|
+
const queue = [];
|
|
361
|
+
const include = (entry, platforms) => {
|
|
362
|
+
const current = effective.get(entry.lockKey) ?? new Set();
|
|
363
|
+
const previousSize = current.size;
|
|
364
|
+
for (const platform of platforms) {
|
|
365
|
+
if (entry.applicablePlatforms.includes(platform))
|
|
366
|
+
current.add(platform);
|
|
367
|
+
}
|
|
368
|
+
effective.set(entry.lockKey, current);
|
|
369
|
+
if (current.size !== previousSize)
|
|
370
|
+
queue.push(entry.lockKey);
|
|
371
|
+
};
|
|
372
|
+
for (const [index, root] of roots.entries()) {
|
|
373
|
+
const target = targetFor(root.name, root.resolved, `dependencies[${index}].resolved`);
|
|
374
|
+
if (target)
|
|
375
|
+
include(target, target.applicablePlatforms);
|
|
376
|
+
}
|
|
377
|
+
for (let index = 0; index < queue.length; index += 1) {
|
|
378
|
+
const parentKey = queue[index];
|
|
379
|
+
const parent = parentKey ? byLockKey.get(parentKey) : undefined;
|
|
380
|
+
if (!parent)
|
|
381
|
+
continue;
|
|
382
|
+
const parentPlatforms = effective.get(parent.lockKey) ?? new Set();
|
|
383
|
+
for (const [dependencyIndex, dependency] of parent.dependencies.entries()) {
|
|
384
|
+
const parsed = packageDependencyReference(dependency, `pnpm-lock.yaml#snapshots.${parent.lockKey}.dependencies[${dependencyIndex}]`);
|
|
385
|
+
const child = targetFor(parsed.name, parsed.reference, `pnpm-lock.yaml#snapshots.${parent.lockKey}.dependencies[${dependencyIndex}]`);
|
|
386
|
+
if (child)
|
|
387
|
+
include(child, [...parentPlatforms]);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return packages.map((entry) => {
|
|
391
|
+
const platforms = effective.get(entry.lockKey) ?? new Set();
|
|
392
|
+
return {
|
|
393
|
+
...entry,
|
|
394
|
+
applicablePlatforms: exports.SUPPLY_CHAIN_SUPPORTED_PLATFORMS.filter((platform) => platforms.has(platform)),
|
|
395
|
+
};
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
function collectResolvedPackages(lockfile, roots) {
|
|
399
|
+
const packages = lockfile.packages;
|
|
400
|
+
const snapshots = (0, validation_js_1.isRecord)(lockfile.snapshots) ? lockfile.snapshots : {};
|
|
401
|
+
const packageMetadata = new Map();
|
|
402
|
+
for (const [packageKey, metadata] of Object.entries(packages).sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))) {
|
|
403
|
+
if (packageKey.replace(/\(.+$/, '') !== packageKey) {
|
|
404
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#packages.${packageKey}`, 'package metadata keys must be peerless; peer contexts belong in snapshots');
|
|
405
|
+
}
|
|
406
|
+
parseLockPackageIdentity(packageKey);
|
|
407
|
+
if (!(0, validation_js_1.isRecord)(metadata) ||
|
|
408
|
+
!(0, validation_js_1.isRecord)(metadata.resolution) ||
|
|
409
|
+
typeof metadata.resolution.integrity !== 'string' ||
|
|
410
|
+
!/^sha512-[A-Za-z0-9+/]{43,}={0,2}$/.test(metadata.resolution.integrity)) {
|
|
411
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#packages.${packageKey}.resolution.integrity`, 'registry package must retain its SHA-512 integrity');
|
|
412
|
+
}
|
|
413
|
+
packageMetadata.set(packageKey, {
|
|
414
|
+
applicablePlatforms: supportedPackagePlatforms(metadata, `pnpm-lock.yaml#packages.${packageKey}`),
|
|
415
|
+
integrity: metadata.resolution.integrity,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
const coveredPackageKeys = new Set();
|
|
419
|
+
const resolvedPackages = Object.entries(snapshots)
|
|
420
|
+
.sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))
|
|
421
|
+
.map(([lockKey, snapshot]) => {
|
|
422
|
+
const packageKey = lockKey.replace(/\(.+$/, '');
|
|
423
|
+
const identity = parseLockPackageIdentity(lockKey);
|
|
424
|
+
const metadata = packageMetadata.get(packageKey);
|
|
425
|
+
if (!metadata) {
|
|
426
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#snapshots.${lockKey}`, `peer context has no exact peerless package metadata at packages.${packageKey}`);
|
|
427
|
+
}
|
|
428
|
+
const packageIdentity = parseLockPackageIdentity(packageKey);
|
|
429
|
+
if (packageIdentity.name !== identity.name ||
|
|
430
|
+
packageIdentity.version !== identity.version ||
|
|
431
|
+
!(0, validation_js_1.isRecord)(snapshot)) {
|
|
432
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#snapshots.${lockKey}`, 'must be an object that resolves to the same peerless package identity');
|
|
433
|
+
}
|
|
434
|
+
coveredPackageKeys.add(packageKey);
|
|
435
|
+
const dependencies = ['dependencies', 'optionalDependencies'].flatMap((section) => {
|
|
436
|
+
const entries = snapshot[section];
|
|
437
|
+
if (entries === undefined)
|
|
438
|
+
return [];
|
|
439
|
+
if (!(0, validation_js_1.isRecord)(entries)) {
|
|
440
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#snapshots.${lockKey}.${section}`, 'must be an exact dependency map');
|
|
441
|
+
}
|
|
442
|
+
return Object.entries(entries)
|
|
443
|
+
.sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))
|
|
444
|
+
.map(([name, version]) => {
|
|
445
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(name) ||
|
|
446
|
+
typeof version !== 'string' ||
|
|
447
|
+
version.trim() === '') {
|
|
448
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#snapshots.${lockKey}.${section}.${name}`, 'must bind a package name to one exact lock reference');
|
|
449
|
+
}
|
|
450
|
+
return `${name}@${version}`;
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
return {
|
|
454
|
+
applicablePlatforms: metadata.applicablePlatforms,
|
|
455
|
+
dependencies: [...new Set(dependencies)].sort(),
|
|
456
|
+
integrity: metadata.integrity,
|
|
457
|
+
lockKey,
|
|
458
|
+
...identity,
|
|
459
|
+
};
|
|
460
|
+
});
|
|
461
|
+
for (const packageKey of packageMetadata.keys()) {
|
|
462
|
+
if (!coveredPackageKeys.has(packageKey)) {
|
|
463
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `pnpm-lock.yaml#packages.${packageKey}`, 'peerless package metadata has no exact dependency snapshot');
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return effectivePackagePlatforms(roots, resolvedPackages);
|
|
467
|
+
}
|
|
468
|
+
function platformParts(platform) {
|
|
469
|
+
const [os, cpu, libc] = platform.split('-');
|
|
470
|
+
return {
|
|
471
|
+
cpu: cpu ?? '',
|
|
472
|
+
...(libc ? { libc } : {}),
|
|
473
|
+
os: os ?? '',
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
function packageConstraint(metadata, field, path) {
|
|
477
|
+
const value = metadata[field];
|
|
478
|
+
if (value === undefined)
|
|
479
|
+
return [];
|
|
480
|
+
if (!Array.isArray(value) ||
|
|
481
|
+
value.length === 0 ||
|
|
482
|
+
value.some((entry) => typeof entry !== 'string' ||
|
|
483
|
+
!/^!?[a-z0-9][a-z0-9._-]{0,31}$/.test(entry)) ||
|
|
484
|
+
new Set(value).size !== value.length) {
|
|
485
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', `${path}.${field}`, 'must be a unique bounded package-platform constraint list');
|
|
486
|
+
}
|
|
487
|
+
return value;
|
|
488
|
+
}
|
|
489
|
+
function constraintMatches(constraints, actual) {
|
|
490
|
+
if (constraints.length === 0)
|
|
491
|
+
return true;
|
|
492
|
+
const excluded = new Set(constraints
|
|
493
|
+
.filter((value) => value.startsWith('!'))
|
|
494
|
+
.map((value) => value.slice(1)));
|
|
495
|
+
if (actual !== undefined && excluded.has(actual))
|
|
496
|
+
return false;
|
|
497
|
+
const included = constraints.filter((value) => !value.startsWith('!'));
|
|
498
|
+
return (included.length === 0 || (actual !== undefined && included.includes(actual)));
|
|
499
|
+
}
|
|
500
|
+
function supportedPackagePlatforms(metadata, path) {
|
|
501
|
+
const cpu = packageConstraint(metadata, 'cpu', path);
|
|
502
|
+
const libc = packageConstraint(metadata, 'libc', path);
|
|
503
|
+
const os = packageConstraint(metadata, 'os', path);
|
|
504
|
+
return exports.SUPPLY_CHAIN_SUPPORTED_PLATFORMS.filter((platform) => {
|
|
505
|
+
const candidate = platformParts(platform);
|
|
506
|
+
return (constraintMatches(os, candidate.os) &&
|
|
507
|
+
constraintMatches(cpu, candidate.cpu) &&
|
|
508
|
+
constraintMatches(libc, candidate.libc));
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
function parseWorkspacePolicy(value) {
|
|
512
|
+
let parsed;
|
|
513
|
+
try {
|
|
514
|
+
parsed = (0, yaml_1.parse)(value);
|
|
515
|
+
}
|
|
516
|
+
catch (error) {
|
|
517
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-workspace.yaml', `cannot be parsed: ${error instanceof Error ? error.message : String(error)}`);
|
|
518
|
+
}
|
|
519
|
+
if (!(0, validation_js_1.isRecord)(parsed)) {
|
|
520
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-workspace.yaml', 'must be an object');
|
|
521
|
+
}
|
|
522
|
+
const allowBuilds = parsed.allowBuilds;
|
|
523
|
+
if (allowBuilds !== undefined && !(0, validation_js_1.isRecord)(allowBuilds)) {
|
|
524
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'pnpm-workspace.yaml#allowBuilds', 'must be an exact package-to-boolean map');
|
|
525
|
+
}
|
|
526
|
+
const normalized = {};
|
|
527
|
+
for (const [name, allowed] of Object.entries(allowBuilds ?? {}).sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))) {
|
|
528
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(name) || allowed !== true) {
|
|
529
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `pnpm-workspace.yaml#allowBuilds.${name}`, 'must name an exact package allowed with the boolean true');
|
|
530
|
+
}
|
|
531
|
+
normalized[name] = true;
|
|
532
|
+
}
|
|
533
|
+
return {
|
|
534
|
+
allowBuilds: normalized,
|
|
535
|
+
strictDepBuilds: parsed.strictDepBuilds === true,
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
function validateReviewedBuildPermissions(workspacePolicy, permissions) {
|
|
539
|
+
const policy = parseWorkspacePolicy(workspacePolicy);
|
|
540
|
+
const reviewed = new Map();
|
|
541
|
+
for (const [index, permission] of permissions.entries()) {
|
|
542
|
+
if (!permission ||
|
|
543
|
+
typeof permission !== 'object' ||
|
|
544
|
+
!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(permission.package) ||
|
|
545
|
+
typeof permission.approvedAt !== 'string' ||
|
|
546
|
+
new Date(permission.approvedAt).toISOString() !== permission.approvedAt ||
|
|
547
|
+
[permission.owner, permission.rationale, permission.workItem].some((entry) => typeof entry !== 'string' ||
|
|
548
|
+
entry.trim() === '' ||
|
|
549
|
+
entry !== entry.trim()) ||
|
|
550
|
+
reviewed.has(permission.package)) {
|
|
551
|
+
throw new errors_js_1.SupplyChainError('supply-chain-script-unreviewed', `buildPermissions[${index}]`, 'must be a unique, attributable exact-package approval');
|
|
552
|
+
}
|
|
553
|
+
reviewed.set(permission.package, permission);
|
|
554
|
+
}
|
|
555
|
+
for (const name of Object.keys(policy.allowBuilds)) {
|
|
556
|
+
if (!reviewed.has(name)) {
|
|
557
|
+
throw new errors_js_1.SupplyChainError('supply-chain-script-unreviewed', `pnpm-workspace.yaml#allowBuilds.${name}`, 'has no owner, rationale, approval time, and work item');
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
for (const name of reviewed.keys()) {
|
|
561
|
+
if (!policy.allowBuilds[name]) {
|
|
562
|
+
throw new errors_js_1.SupplyChainError('supply-chain-script-unreviewed', `buildPermissions.${name}`, 'does not correspond to an active allowBuilds entry');
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
function validateLifecycleScriptInventory(lifecycleScripts, workspacePolicy) {
|
|
567
|
+
const { allowBuilds, strictDepBuilds } = parseWorkspacePolicy(workspacePolicy);
|
|
568
|
+
if (!strictDepBuilds) {
|
|
569
|
+
throw new errors_js_1.SupplyChainError('supply-chain-script-unreviewed', 'pnpm-workspace.yaml#strictDepBuilds', 'must equal true so newly introduced dependency scripts fail closed');
|
|
570
|
+
}
|
|
571
|
+
const seen = new Set();
|
|
572
|
+
for (const [index, entry] of lifecycleScripts.entries()) {
|
|
573
|
+
if (!common_js_1.SUPPLY_CHAIN_PACKAGE_NAME.test(entry.package) ||
|
|
574
|
+
typeof entry.version !== 'string' ||
|
|
575
|
+
entry.version.trim() === '' ||
|
|
576
|
+
entry.scripts.length === 0 ||
|
|
577
|
+
entry.scripts.some((script) => !['preinstall', 'install', 'postinstall'].includes(script)) ||
|
|
578
|
+
new Set(entry.scripts).size !== entry.scripts.length ||
|
|
579
|
+
seen.has(`${entry.package}@${entry.version}`)) {
|
|
580
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `lifecycleScripts[${index}]`, 'must uniquely identify exact packages and declared lifecycle hooks');
|
|
581
|
+
}
|
|
582
|
+
seen.add(`${entry.package}@${entry.version}`);
|
|
583
|
+
if (!allowBuilds[entry.package]) {
|
|
584
|
+
throw new errors_js_1.SupplyChainError('supply-chain-script-unreviewed', `lifecycleScripts[${index}]`, `${entry.package}@${entry.version} has lifecycle code but is not reviewed in allowBuilds`);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
function dockerfileInstructions(path, source) {
|
|
589
|
+
if (source.includes('\0')) {
|
|
590
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'container recipe contains a NUL byte');
|
|
591
|
+
}
|
|
592
|
+
const instructions = [];
|
|
593
|
+
let pending = '';
|
|
594
|
+
let pendingLine = 0;
|
|
595
|
+
for (const [index, raw] of source
|
|
596
|
+
.replace(/\r\n/g, '\n')
|
|
597
|
+
.split('\n')
|
|
598
|
+
.entries()) {
|
|
599
|
+
const trimmed = raw.trim();
|
|
600
|
+
if (pending === '' && (trimmed === '' || trimmed.startsWith('#')))
|
|
601
|
+
continue;
|
|
602
|
+
if (pending === '')
|
|
603
|
+
pendingLine = index + 1;
|
|
604
|
+
const trailingBackslashes = /\\+$/.exec(trimmed)?.[0].length ?? 0;
|
|
605
|
+
const continued = trailingBackslashes % 2 === 1;
|
|
606
|
+
const fragment = continued ? trimmed.slice(0, -1).trimEnd() : trimmed;
|
|
607
|
+
pending = pending === '' ? fragment : `${pending} ${fragment}`;
|
|
608
|
+
if (continued)
|
|
609
|
+
continue;
|
|
610
|
+
if (/\s<<[-~]?\s*['"]?[^\s'"]+['"]?(?:\s|$)/u.test(pending)) {
|
|
611
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#line[${pendingLine}]`, 'Blueprint container recipes may not use heredoc instructions');
|
|
612
|
+
}
|
|
613
|
+
instructions.push({ line: pendingLine, value: pending });
|
|
614
|
+
pending = '';
|
|
615
|
+
}
|
|
616
|
+
if (pending !== '') {
|
|
617
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#line[${pendingLine}]`, 'container recipe ends inside a continued instruction');
|
|
618
|
+
}
|
|
619
|
+
return instructions;
|
|
620
|
+
}
|
|
621
|
+
function pinnedContainerImage(reference, label) {
|
|
622
|
+
if (!/^[a-z0-9][a-z0-9._/-]*:[A-Za-z0-9._-]+@sha256:[a-f0-9]{64}$/.test(reference)) {
|
|
623
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', label, 'container image authority must retain a readable tag and pin a lowercase SHA-256 digest');
|
|
624
|
+
}
|
|
625
|
+
return reference;
|
|
626
|
+
}
|
|
627
|
+
function externalImageAuthority(reference, stages, stageCount, label) {
|
|
628
|
+
if (/^\d+$/u.test(reference)) {
|
|
629
|
+
const index = Number(reference);
|
|
630
|
+
if (Number.isSafeInteger(index) && index >= 0 && index < stageCount) {
|
|
631
|
+
return undefined;
|
|
632
|
+
}
|
|
633
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', label, 'container stage index does not identify a prior stage');
|
|
634
|
+
}
|
|
635
|
+
if (stages.has(reference.toLowerCase()))
|
|
636
|
+
return undefined;
|
|
637
|
+
return pinnedContainerImage(reference, label);
|
|
638
|
+
}
|
|
639
|
+
function scanContainerImageAuthorities(path, source) {
|
|
640
|
+
const authorities = [];
|
|
641
|
+
if (source.startsWith('\uFEFF')) {
|
|
642
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#encoding`, 'container recipe must not use a byte-order mark that can alter parser-directive recognition');
|
|
643
|
+
}
|
|
644
|
+
const escapeDirectives = [
|
|
645
|
+
...source.matchAll(/^\s*#\s*escape\s*=\s*(\S+)\s*$/gim),
|
|
646
|
+
];
|
|
647
|
+
if (escapeDirectives.length > 1) {
|
|
648
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#escape`, 'container recipe must declare at most one escape parser directive');
|
|
649
|
+
}
|
|
650
|
+
if (escapeDirectives.length === 1 && escapeDirectives[0]?.[1] !== '\\') {
|
|
651
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#escape`, 'Blueprint container recipes must use the default backslash escape so image-authority parsing cannot diverge from Docker');
|
|
652
|
+
}
|
|
653
|
+
const syntaxDirectives = [
|
|
654
|
+
...source.matchAll(/^\s*#\s*syntax\s*=\s*(\S+)\s*$/gim),
|
|
655
|
+
];
|
|
656
|
+
if (syntaxDirectives.length > 1) {
|
|
657
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#syntax`, 'container recipe must declare at most one syntax frontend');
|
|
658
|
+
}
|
|
659
|
+
for (const [index, directive] of syntaxDirectives.entries()) {
|
|
660
|
+
const value = (directive[1] ?? '').replace(/^docker-image:\/\//u, '');
|
|
661
|
+
const reference = pinnedContainerImage(value, `${path}#syntax[${index}]`);
|
|
662
|
+
authorities.push({ instruction: 'syntax', reference });
|
|
663
|
+
}
|
|
664
|
+
const stages = new Set();
|
|
665
|
+
let stageCount = 0;
|
|
666
|
+
for (const { line, value } of dockerfileInstructions(path, source)) {
|
|
667
|
+
const instruction = value.replace(/^ONBUILD\s+/iu, '');
|
|
668
|
+
if (/^FROM\b/iu.test(instruction)) {
|
|
669
|
+
const match = /^FROM\s+(?:(?:--platform=\S+)\s+)*(\S+)(?:\s+AS\s+([A-Za-z0-9][A-Za-z0-9._-]{0,127}))?$/iu.exec(instruction);
|
|
670
|
+
if (!match) {
|
|
671
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#line[${line}]`, 'container FROM instruction is not in the supported exact form');
|
|
672
|
+
}
|
|
673
|
+
const base = match[1] ?? '';
|
|
674
|
+
const external = externalImageAuthority(base, stages, stageCount, `${path}#FROM[${stageCount}]`);
|
|
675
|
+
if (external)
|
|
676
|
+
authorities.push({ instruction: 'FROM', reference: external });
|
|
677
|
+
const alias = match[2]?.toLowerCase();
|
|
678
|
+
if (alias) {
|
|
679
|
+
if (/^\d+$/u.test(alias) || stages.has(alias)) {
|
|
680
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#FROM[${stageCount}]`, 'container stage aliases must be unique non-numeric identities');
|
|
681
|
+
}
|
|
682
|
+
stages.add(alias);
|
|
683
|
+
}
|
|
684
|
+
stageCount += 1;
|
|
685
|
+
continue;
|
|
686
|
+
}
|
|
687
|
+
if (/^COPY\b/iu.test(instruction)) {
|
|
688
|
+
const fromTokens = [...instruction.matchAll(/(?:^|\s)--from=(\S+)/giu)];
|
|
689
|
+
if (/--from\b/iu.test(instruction) && fromTokens.length !== 1) {
|
|
690
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#line[${line}]`, 'container COPY --from must name one exact prior stage or image');
|
|
691
|
+
}
|
|
692
|
+
if (fromTokens.length === 1) {
|
|
693
|
+
const external = externalImageAuthority(fromTokens[0]?.[1] ?? '', stages, stageCount, `${path}#COPY-from[line-${line}]`);
|
|
694
|
+
if (external)
|
|
695
|
+
authorities.push({ instruction: 'COPY', reference: external });
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
if (/^RUN\b/iu.test(instruction)) {
|
|
699
|
+
for (const [mountIndex, mount] of [
|
|
700
|
+
...instruction.matchAll(/(?:^|\s)--mount=([^\s]+)/giu),
|
|
701
|
+
].entries()) {
|
|
702
|
+
const from = (mount[1] ?? '')
|
|
703
|
+
.split(',')
|
|
704
|
+
.filter((field) => field.startsWith('from='));
|
|
705
|
+
if (from.length > 1) {
|
|
706
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `${path}#RUN-mount[${mountIndex}]`, 'container RUN mount must name at most one image or prior stage');
|
|
707
|
+
}
|
|
708
|
+
if (from.length === 1) {
|
|
709
|
+
const external = externalImageAuthority(from[0]?.slice('from='.length) ?? '', stages, stageCount, `${path}#RUN-mount[${mountIndex}]`);
|
|
710
|
+
if (external) {
|
|
711
|
+
authorities.push({ instruction: 'RUN-mount', reference: external });
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
if (!authorities.some(({ instruction }) => instruction === 'FROM')) {
|
|
718
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', path, 'container recipe contains no external FROM image authority');
|
|
719
|
+
}
|
|
720
|
+
return authorities;
|
|
721
|
+
}
|
|
722
|
+
function scanContainerRecipe(path, source) {
|
|
723
|
+
const authorities = scanContainerImageAuthorities(path, source);
|
|
724
|
+
for (const [index, directive] of [
|
|
725
|
+
...source.matchAll(/^\s*#\s*syntax\s*=\s*(\S+)\s*$/gim),
|
|
726
|
+
].entries()) {
|
|
727
|
+
if (!/@sha256:[a-f0-9]{64}$/.test(directive[1] ?? '')) {
|
|
728
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', `${path}#syntax[${index}]`, 'Dockerfile frontend directives must pin an exact SHA-256 digest');
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
const bases = authorities
|
|
732
|
+
.filter(({ instruction }) => instruction === 'FROM')
|
|
733
|
+
.map(({ reference }) => reference);
|
|
734
|
+
if (/(?:^|\s)npm\s+(?:i|install|ci)(?:\s|$)/im.test(source)) {
|
|
735
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', path, 'npm installation may re-resolve outside the reviewed pnpm lockfile');
|
|
736
|
+
}
|
|
737
|
+
if (/\bcorepack\s+enable\b/i.test(source)) {
|
|
738
|
+
const descriptors = [
|
|
739
|
+
...source.matchAll(/\bcorepack\s+prepare\s+(pnpm@\S+)\s+--activate\b/gim),
|
|
740
|
+
].map((match) => match[1] ?? '');
|
|
741
|
+
if (descriptors.length !== 1 ||
|
|
742
|
+
!/^pnpm@\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?\+sha512\.[a-f0-9]{128}$/.test(descriptors[0] ?? '')) {
|
|
743
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', `${path}#corepack`, 'Corepack must install one exact pnpm artifact with a SHA-512 descriptor');
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
const fetchCommands = [
|
|
747
|
+
...source.matchAll(/^\s*RUN\s+.*\bpnpm\b.*\bfetch\b.*$/gim),
|
|
748
|
+
].map(([command]) => command ?? '');
|
|
749
|
+
for (const command of fetchCommands) {
|
|
750
|
+
if (!command.includes('--frozen-lockfile')) {
|
|
751
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', path, 'pnpm fetch must retain the reviewed lockfile');
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
for (const install of source.matchAll(/^\s*RUN\s+.*\bpnpm\b.*\binstall\b.*$/gim)) {
|
|
755
|
+
const command = install[0] ?? '';
|
|
756
|
+
if (!command.includes('--frozen-lockfile') ||
|
|
757
|
+
!command.includes('--offline')) {
|
|
758
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', path, 'pnpm install must be both frozen and offline after lockfile fetch');
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
for (const deploy of source.matchAll(/^\s*RUN\s+.*\bpnpm\b.*\bdeploy\b.*$/gim)) {
|
|
762
|
+
const command = deploy[0] ?? '';
|
|
763
|
+
if (!/^\s*RUN\s+--network=none(?:\s|$)/i.test(command) ||
|
|
764
|
+
!command.includes('--prod') ||
|
|
765
|
+
!command.includes('--offline') ||
|
|
766
|
+
!command.includes('--frozen-lockfile') ||
|
|
767
|
+
!command.includes('--trust-lockfile') ||
|
|
768
|
+
!fetchCommands.some((fetch) => fetch.includes('--frozen-lockfile')) ||
|
|
769
|
+
command.includes('--legacy')) {
|
|
770
|
+
throw new errors_js_1.SupplyChainError('supply-chain-container-mutable', path, 'pnpm deploy must trust one previously verified frozen lockfile and assemble its offline production closure with BuildKit network access disabled');
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
return {
|
|
774
|
+
bases,
|
|
775
|
+
path,
|
|
776
|
+
recipeDigest: (0, common_js_1.supplyChainDigest)(source.replace(/\r\n/g, '\n')),
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
function createSupplyChainInventory(input) {
|
|
780
|
+
const lockfile = parseLockfile(input.lockfile);
|
|
781
|
+
const rootManifest = input.manifests['package.json'];
|
|
782
|
+
if (!(0, validation_js_1.isRecord)(rootManifest)) {
|
|
783
|
+
throw new errors_js_1.SupplyChainError('supply-chain-inventory-incomplete', 'package.json', 'root manifest is required');
|
|
784
|
+
}
|
|
785
|
+
const toolchain = requirePackageManager(rootManifest, input.nodeVersion);
|
|
786
|
+
const dependencies = collectDependencies(input.manifests, lockfile);
|
|
787
|
+
const resolvedPackages = collectResolvedPackages(lockfile, dependencies);
|
|
788
|
+
validateLifecycleScriptInventory(input.lifecycleScripts ?? [], input.workspacePolicy);
|
|
789
|
+
const containers = Object.entries(input.containers ?? {})
|
|
790
|
+
.sort(([left], [right]) => (0, deterministic_order_js_1.compareUtf16)(left, right))
|
|
791
|
+
.map(([path, source]) => scanContainerRecipe(path, source));
|
|
792
|
+
const registries = [...(input.registries ?? ['https://registry.npmjs.org'])]
|
|
793
|
+
.sort()
|
|
794
|
+
.filter((entry, index, values) => index === 0 || entry !== values[index - 1]);
|
|
795
|
+
if (registries.length === 0 ||
|
|
796
|
+
registries.some((registry) => !/^https:\/\/[A-Za-z0-9.-]+(?::\d+)?(?:\/[A-Za-z0-9._~/-]*)?$/.test(registry))) {
|
|
797
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', 'registries', 'must contain explicit HTTPS registry origins');
|
|
798
|
+
}
|
|
799
|
+
for (const [index, tool] of (input.downloadedTools ?? []).entries()) {
|
|
800
|
+
if (!common_js_1.SUPPLY_CHAIN_SHA256.test(tool.digest) ||
|
|
801
|
+
[tool.name, tool.source, tool.version].some((value) => typeof value !== 'string' || value.trim() === '') ||
|
|
802
|
+
!/^https:\/\//.test(tool.source)) {
|
|
803
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `downloadedTools[${index}]`, 'must bind a named version to an HTTPS source and SHA-256 digest');
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
for (const [index, vendored] of (input.vendoredInputs ?? []).entries()) {
|
|
807
|
+
if (!common_js_1.SUPPLY_CHAIN_SHA256.test(vendored.sha256) ||
|
|
808
|
+
[vendored.identity, vendored.revision].some((value) => typeof value !== 'string' || value.trim() === '')) {
|
|
809
|
+
throw new errors_js_1.SupplyChainError('supply-chain-input-invalid', `vendoredInputs[${index}]`, 'must bind identity and immutable revision to a SHA-256 digest');
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
return {
|
|
813
|
+
containers,
|
|
814
|
+
dependencies,
|
|
815
|
+
downloadedTools: [...(input.downloadedTools ?? [])].sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(`${left.name}\0${left.version}`, `${right.name}\0${right.version}`)),
|
|
816
|
+
lifecycleScripts: [...(input.lifecycleScripts ?? [])]
|
|
817
|
+
.map((entry) => ({ ...entry, scripts: [...entry.scripts].sort() }))
|
|
818
|
+
.sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(`${left.package}\0${left.version}`, `${right.package}\0${right.version}`)),
|
|
819
|
+
lockfileDigest: (0, common_js_1.supplyChainDigest)(input.lockfile.replace(/\r\n/g, '\n')),
|
|
820
|
+
nodeVersion: toolchain.node,
|
|
821
|
+
packageManager: toolchain.packageManager,
|
|
822
|
+
registries,
|
|
823
|
+
resolvedPackages,
|
|
824
|
+
schemaVersion: exports.SUPPLY_CHAIN_INVENTORY_SCHEMA_VERSION,
|
|
825
|
+
vendoredInputs: [...(input.vendoredInputs ?? [])].sort((left, right) => (0, deterministic_order_js_1.compareUtf16)(`${left.identity}\0${left.revision}`, `${right.identity}\0${right.revision}`)),
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
//# sourceMappingURL=inventory.js.map
|