@xemahq/xema 0.59.0 → 0.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/appliance-owner.d.ts.map +1 -1
- package/dist/appliance-owner.js +6 -6
- package/dist/appliance-owner.js.map +1 -1
- package/dist/assets/appliance-base/authorization.lock.json +5186 -0
- package/dist/assets/appliance-base/distribution.lock.json +760 -279
- package/dist/assets/appliance-base/images.lock.json +576 -513
- package/dist/assets/appliance-lean/authorization.lock.json +4648 -0
- package/dist/assets/appliance-lean/distribution.lock.json +641 -186
- package/dist/assets/appliance-lean/images.lock.json +574 -512
- package/dist/assets/boot-graph.json +33 -14
- package/dist/assets/distribution-assets.manifest.json +23 -20
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -9
- package/dist/cli.js.map +1 -1
- package/dist/commands/biome-dev.d.ts.map +1 -1
- package/dist/commands/biome-dev.js +41 -137
- package/dist/commands/biome-dev.js.map +1 -1
- package/dist/commands/biome-lifecycle.d.ts +24 -0
- package/dist/commands/biome-lifecycle.d.ts.map +1 -0
- package/dist/commands/biome-lifecycle.js +253 -0
- package/dist/commands/biome-lifecycle.js.map +1 -0
- package/dist/commands/biome.d.ts +2 -4
- package/dist/commands/biome.d.ts.map +1 -1
- package/dist/commands/biome.js +61 -46
- package/dist/commands/biome.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +96 -8
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +13 -20
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +14 -21
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/installation-tenancy.d.ts +11 -0
- package/dist/commands/installation-tenancy.d.ts.map +1 -0
- package/dist/commands/installation-tenancy.js +308 -0
- package/dist/commands/installation-tenancy.js.map +1 -0
- package/dist/commands/installation.d.ts.map +1 -1
- package/dist/commands/installation.js +19 -5
- package/dist/commands/installation.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +41 -8
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/{dev.d.ts → mirror.d.ts} +1 -1
- package/dist/commands/mirror.d.ts.map +1 -0
- package/dist/commands/mirror.js +132 -0
- package/dist/commands/mirror.js.map +1 -0
- package/dist/commands/source.d.ts.map +1 -1
- package/dist/commands/source.js +3 -2
- package/dist/commands/source.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +40 -21
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +36 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/dev/infra-preflight.d.ts.map +1 -1
- package/dist/dev/infra-preflight.js +0 -4
- package/dist/dev/infra-preflight.js.map +1 -1
- package/dist/lib/confirm.d.ts +3 -0
- package/dist/lib/confirm.d.ts.map +1 -0
- package/dist/lib/confirm.js +19 -0
- package/dist/lib/confirm.js.map +1 -0
- package/dist/lib/output-format.d.ts +6 -0
- package/dist/lib/output-format.d.ts.map +1 -0
- package/dist/lib/output-format.js +20 -0
- package/dist/lib/output-format.js.map +1 -0
- package/dist/mirror/config/mirror-config-document.d.ts +18 -0
- package/dist/mirror/config/mirror-config-document.d.ts.map +1 -0
- package/dist/mirror/config/mirror-config-document.js +57 -0
- package/dist/mirror/config/mirror-config-document.js.map +1 -0
- package/dist/mirror/config/mirror-config-schema.d.ts +54 -0
- package/dist/mirror/config/mirror-config-schema.d.ts.map +1 -0
- package/dist/mirror/config/mirror-config-schema.js +80 -0
- package/dist/mirror/config/mirror-config-schema.js.map +1 -0
- package/dist/mirror/kit/delta.d.ts +4 -0
- package/dist/mirror/kit/delta.d.ts.map +1 -0
- package/dist/mirror/kit/delta.js +41 -0
- package/dist/mirror/kit/delta.js.map +1 -0
- package/dist/mirror/kit/export-kit.d.ts +16 -0
- package/dist/mirror/kit/export-kit.d.ts.map +1 -0
- package/dist/mirror/kit/export-kit.js +112 -0
- package/dist/mirror/kit/export-kit.js.map +1 -0
- package/dist/mirror/kit/import-kit.d.ts +9 -0
- package/dist/mirror/kit/import-kit.d.ts.map +1 -0
- package/dist/mirror/kit/import-kit.js +166 -0
- package/dist/mirror/kit/import-kit.js.map +1 -0
- package/dist/mirror/kit/kit-archive.d.ts +4 -0
- package/dist/mirror/kit/kit-archive.d.ts.map +1 -0
- package/dist/mirror/kit/kit-archive.js +38 -0
- package/dist/mirror/kit/kit-archive.js.map +1 -0
- package/dist/mirror/kit/kit-layout.d.ts +10 -0
- package/dist/mirror/kit/kit-layout.d.ts.map +1 -0
- package/dist/mirror/kit/kit-layout.js +19 -0
- package/dist/mirror/kit/kit-layout.js.map +1 -0
- package/dist/mirror/kit/kit-sums.d.ts +5 -0
- package/dist/mirror/kit/kit-sums.d.ts.map +1 -0
- package/dist/mirror/kit/kit-sums.js +63 -0
- package/dist/mirror/kit/kit-sums.js.map +1 -0
- package/dist/mirror/kit/layout-sync.d.ts +8 -0
- package/dist/mirror/kit/layout-sync.d.ts.map +1 -0
- package/dist/mirror/kit/layout-sync.js +58 -0
- package/dist/mirror/kit/layout-sync.js.map +1 -0
- package/dist/mirror/plan/bundle-content.d.ts +10 -0
- package/dist/mirror/plan/bundle-content.d.ts.map +1 -0
- package/dist/mirror/plan/bundle-content.js +61 -0
- package/dist/mirror/plan/bundle-content.js.map +1 -0
- package/dist/mirror/plan/declaration-file.d.ts +9 -0
- package/dist/mirror/plan/declaration-file.d.ts.map +1 -0
- package/dist/mirror/plan/declaration-file.js +27 -0
- package/dist/mirror/plan/declaration-file.js.map +1 -0
- package/dist/mirror/plan/edition-inputs.d.ts +57 -0
- package/dist/mirror/plan/edition-inputs.d.ts.map +1 -0
- package/dist/mirror/plan/edition-inputs.js +44 -0
- package/dist/mirror/plan/edition-inputs.js.map +1 -0
- package/dist/mirror/plan/edition-reader.d.ts +9 -0
- package/dist/mirror/plan/edition-reader.d.ts.map +1 -0
- package/dist/mirror/plan/edition-reader.js +47 -0
- package/dist/mirror/plan/edition-reader.js.map +1 -0
- package/dist/mirror/plan/image-content.d.ts +30 -0
- package/dist/mirror/plan/image-content.d.ts.map +1 -0
- package/dist/mirror/plan/image-content.js +120 -0
- package/dist/mirror/plan/image-content.js.map +1 -0
- package/dist/mirror/plan/npm-lockfile.d.ts +12 -0
- package/dist/mirror/plan/npm-lockfile.d.ts.map +1 -0
- package/dist/mirror/plan/npm-lockfile.js +106 -0
- package/dist/mirror/plan/npm-lockfile.js.map +1 -0
- package/dist/mirror/plan/oci-reads.d.ts +22 -0
- package/dist/mirror/plan/oci-reads.d.ts.map +1 -0
- package/dist/mirror/plan/oci-reads.js +43 -0
- package/dist/mirror/plan/oci-reads.js.map +1 -0
- package/dist/mirror/plan/plan-command.d.ts +22 -0
- package/dist/mirror/plan/plan-command.d.ts.map +1 -0
- package/dist/mirror/plan/plan-command.js +81 -0
- package/dist/mirror/plan/plan-command.js.map +1 -0
- package/dist/mirror/plan/plan-file.d.ts +13 -0
- package/dist/mirror/plan/plan-file.d.ts.map +1 -0
- package/dist/mirror/plan/plan-file.js +63 -0
- package/dist/mirror/plan/plan-file.js.map +1 -0
- package/dist/mirror/plan/resolve-content-set.d.ts +16 -0
- package/dist/mirror/plan/resolve-content-set.d.ts.map +1 -0
- package/dist/mirror/plan/resolve-content-set.js +90 -0
- package/dist/mirror/plan/resolve-content-set.js.map +1 -0
- package/dist/mirror/preflight/glob.d.ts +2 -0
- package/dist/mirror/preflight/glob.d.ts.map +1 -0
- package/dist/mirror/preflight/glob.js +59 -0
- package/dist/mirror/preflight/glob.js.map +1 -0
- package/dist/mirror/preflight/harbor-api.d.ts +27 -0
- package/dist/mirror/preflight/harbor-api.d.ts.map +1 -0
- package/dist/mirror/preflight/harbor-api.js +39 -0
- package/dist/mirror/preflight/harbor-api.js.map +1 -0
- package/dist/mirror/preflight/preflight.d.ts +18 -0
- package/dist/mirror/preflight/preflight.d.ts.map +1 -0
- package/dist/mirror/preflight/preflight.js +41 -0
- package/dist/mirror/preflight/preflight.js.map +1 -0
- package/dist/mirror/preflight/tag-moves.d.ts +16 -0
- package/dist/mirror/preflight/tag-moves.d.ts.map +1 -0
- package/dist/mirror/preflight/tag-moves.js +28 -0
- package/dist/mirror/preflight/tag-moves.js.map +1 -0
- package/dist/mirror/preflight/write-probe.d.ts +10 -0
- package/dist/mirror/preflight/write-probe.d.ts.map +1 -0
- package/dist/mirror/preflight/write-probe.js +36 -0
- package/dist/mirror/preflight/write-probe.js.map +1 -0
- package/dist/mirror/target/extras.d.ts +16 -0
- package/dist/mirror/target/extras.d.ts.map +1 -0
- package/dist/mirror/target/extras.js +47 -0
- package/dist/mirror/target/extras.js.map +1 -0
- package/dist/mirror/target/npm-registry.d.ts +20 -0
- package/dist/mirror/target/npm-registry.d.ts.map +1 -0
- package/dist/mirror/target/npm-registry.js +67 -0
- package/dist/mirror/target/npm-registry.js.map +1 -0
- package/dist/mirror/target/npm-sync.d.ts +15 -0
- package/dist/mirror/target/npm-sync.d.ts.map +1 -0
- package/dist/mirror/target/npm-sync.js +44 -0
- package/dist/mirror/target/npm-sync.js.map +1 -0
- package/dist/mirror/target/oci-items.d.ts +27 -0
- package/dist/mirror/target/oci-items.d.ts.map +1 -0
- package/dist/mirror/target/oci-items.js +79 -0
- package/dist/mirror/target/oci-items.js.map +1 -0
- package/dist/mirror/target/oci-sync.d.ts +20 -0
- package/dist/mirror/target/oci-sync.d.ts.map +1 -0
- package/dist/mirror/target/oci-sync.js +93 -0
- package/dist/mirror/target/oci-sync.js.map +1 -0
- package/dist/mirror/target/receipt-store.d.ts +13 -0
- package/dist/mirror/target/receipt-store.d.ts.map +1 -0
- package/dist/mirror/target/receipt-store.js +61 -0
- package/dist/mirror/target/receipt-store.js.map +1 -0
- package/dist/mirror/target/receipt.d.ts +13 -0
- package/dist/mirror/target/receipt.d.ts.map +1 -0
- package/dist/mirror/target/receipt.js +25 -0
- package/dist/mirror/target/receipt.js.map +1 -0
- package/dist/mirror/target/seed-push.d.ts +15 -0
- package/dist/mirror/target/seed-push.d.ts.map +1 -0
- package/dist/mirror/target/seed-push.js +20 -0
- package/dist/mirror/target/seed-push.js.map +1 -0
- package/dist/mirror/target/target-access.d.ts +7 -0
- package/dist/mirror/target/target-access.d.ts.map +1 -0
- package/dist/mirror/target/target-access.js +17 -0
- package/dist/mirror/target/target-access.js.map +1 -0
- package/dist/mirror/target/target-commands.d.ts +21 -0
- package/dist/mirror/target/target-commands.d.ts.map +1 -0
- package/dist/mirror/target/target-commands.js +134 -0
- package/dist/mirror/target/target-commands.js.map +1 -0
- package/dist/mirror/target/target-context.d.ts +11 -0
- package/dist/mirror/target/target-context.d.ts.map +1 -0
- package/dist/mirror/target/target-context.js +31 -0
- package/dist/mirror/target/target-context.js.map +1 -0
- package/dist/mirror/target/target-ports.d.ts +18 -0
- package/dist/mirror/target/target-ports.d.ts.map +1 -0
- package/dist/mirror/target/target-ports.js +49 -0
- package/dist/mirror/target/target-ports.js.map +1 -0
- package/dist/mirror/target/target-state.d.ts +22 -0
- package/dist/mirror/target/target-state.d.ts.map +1 -0
- package/dist/mirror/target/target-state.js +41 -0
- package/dist/mirror/target/target-state.js.map +1 -0
- package/dist/runtime/biome-dev.d.ts +0 -16
- package/dist/runtime/biome-dev.d.ts.map +1 -1
- package/dist/runtime/biome-dev.js +0 -53
- package/dist/runtime/biome-dev.js.map +1 -1
- package/dist/runtime/biome-host/biome-directory-packer.d.ts +3 -0
- package/dist/runtime/biome-host/biome-directory-packer.d.ts.map +1 -0
- package/dist/runtime/biome-host/biome-directory-packer.js +12 -0
- package/dist/runtime/biome-host/biome-directory-packer.js.map +1 -0
- package/dist/runtime/biome-host/bundle-packer.d.ts +8 -0
- package/dist/runtime/biome-host/bundle-packer.d.ts.map +1 -0
- package/dist/runtime/biome-host/bundle-packer.js +3 -0
- package/dist/runtime/biome-host/bundle-packer.js.map +1 -0
- package/dist/runtime/biome-host/from-spec.d.ts +33 -0
- package/dist/runtime/biome-host/from-spec.d.ts.map +1 -0
- package/dist/runtime/biome-host/from-spec.js +70 -0
- package/dist/runtime/biome-host/from-spec.js.map +1 -0
- package/dist/runtime/biome-host/lifecycle-client.d.ts +20 -0
- package/dist/runtime/biome-host/lifecycle-client.d.ts.map +1 -0
- package/dist/runtime/biome-host/lifecycle-client.js +197 -0
- package/dist/runtime/biome-host/lifecycle-client.js.map +1 -0
- package/dist/runtime/biome-host/lifecycle-contract.d.ts +95 -0
- package/dist/runtime/biome-host/lifecycle-contract.d.ts.map +1 -0
- package/dist/runtime/biome-host/lifecycle-contract.js +61 -0
- package/dist/runtime/biome-host/lifecycle-contract.js.map +1 -0
- package/dist/runtime/biome-host/lifecycle-flow.d.ts +29 -0
- package/dist/runtime/biome-host/lifecycle-flow.d.ts.map +1 -0
- package/dist/runtime/biome-host/lifecycle-flow.js +106 -0
- package/dist/runtime/biome-host/lifecycle-flow.js.map +1 -0
- package/dist/runtime/biome-host/plan-sources.d.ts +4 -0
- package/dist/runtime/biome-host/plan-sources.d.ts.map +1 -0
- package/dist/runtime/biome-host/plan-sources.js +26 -0
- package/dist/runtime/biome-host/plan-sources.js.map +1 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.d.ts +12 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.js +76 -0
- package/dist/runtime/biome-host/relay/bundle-fetch.js.map +1 -0
- package/dist/runtime/biome-host/relay/declared-scheme.d.ts +3 -0
- package/dist/runtime/biome-host/relay/declared-scheme.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/declared-scheme.js +14 -0
- package/dist/runtime/biome-host/relay/declared-scheme.js.map +1 -0
- package/dist/runtime/biome-host/relay/npm-token.d.ts +4 -0
- package/dist/runtime/biome-host/relay/npm-token.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/npm-token.js +16 -0
- package/dist/runtime/biome-host/relay/npm-token.js.map +1 -0
- package/dist/runtime/biome-host/relay/relay-flow.d.ts +16 -0
- package/dist/runtime/biome-host/relay/relay-flow.d.ts.map +1 -0
- package/dist/runtime/biome-host/relay/relay-flow.js +48 -0
- package/dist/runtime/biome-host/relay/relay-flow.js.map +1 -0
- package/dist/runtime/biome-host/source-staging.d.ts +17 -0
- package/dist/runtime/biome-host/source-staging.d.ts.map +1 -0
- package/dist/runtime/biome-host/source-staging.js +80 -0
- package/dist/runtime/biome-host/source-staging.js.map +1 -0
- package/dist/runtime/biome-host/sse.d.ts +2 -0
- package/dist/runtime/biome-host/sse.d.ts.map +1 -0
- package/dist/runtime/biome-host/sse.js +33 -0
- package/dist/runtime/biome-host/sse.js.map +1 -0
- package/dist/runtime/biome-local-install.js +1 -1
- package/dist/runtime/biome-local-install.js.map +1 -1
- package/dist/runtime/browser-origins.d.ts +9 -0
- package/dist/runtime/browser-origins.d.ts.map +1 -1
- package/dist/runtime/browser-origins.js +10 -0
- package/dist/runtime/browser-origins.js.map +1 -1
- package/dist/runtime/config/config-document.d.ts +10 -0
- package/dist/runtime/config/config-document.d.ts.map +1 -0
- package/dist/runtime/config/config-document.js +56 -0
- package/dist/runtime/config/config-document.js.map +1 -0
- package/dist/runtime/config/config-migrations.d.ts +21 -0
- package/dist/runtime/config/config-migrations.d.ts.map +1 -0
- package/dist/runtime/config/config-migrations.js +102 -0
- package/dist/runtime/config/config-migrations.js.map +1 -0
- package/dist/runtime/config/config-paths.d.ts +3 -0
- package/dist/runtime/config/config-paths.d.ts.map +1 -0
- package/dist/runtime/config/config-paths.js +9 -0
- package/dist/runtime/config/config-paths.js.map +1 -0
- package/dist/runtime/config/dev-mode.d.ts +0 -1
- package/dist/runtime/config/dev-mode.d.ts.map +1 -1
- package/dist/runtime/config/dev-mode.js +11 -27
- package/dist/runtime/config/dev-mode.js.map +1 -1
- package/dist/runtime/config/init-presets.js +5 -9
- package/dist/runtime/config/init-presets.js.map +1 -1
- package/dist/runtime/config/launch-config-help.d.ts +4 -0
- package/dist/runtime/config/launch-config-help.d.ts.map +1 -0
- package/dist/runtime/config/launch-config-help.js +42 -0
- package/dist/runtime/config/launch-config-help.js.map +1 -0
- package/dist/runtime/config/launch-config.d.ts +60 -0
- package/dist/runtime/config/launch-config.d.ts.map +1 -0
- package/dist/runtime/config/launch-config.js +123 -0
- package/dist/runtime/config/launch-config.js.map +1 -0
- package/dist/runtime/config/launch-schema.d.ts +18 -0
- package/dist/runtime/config/launch-schema.d.ts.map +1 -0
- package/dist/runtime/config/launch-schema.js +31 -0
- package/dist/runtime/config/launch-schema.js.map +1 -0
- package/dist/runtime/config/loader.d.ts.map +1 -1
- package/dist/runtime/config/loader.js +4 -14
- package/dist/runtime/config/loader.js.map +1 -1
- package/dist/runtime/config/schema.d.ts +43 -38
- package/dist/runtime/config/schema.d.ts.map +1 -1
- package/dist/runtime/config/schema.js +17 -46
- package/dist/runtime/config/schema.js.map +1 -1
- package/dist/runtime/config/sources-config.d.ts +0 -2
- package/dist/runtime/config/sources-config.d.ts.map +1 -1
- package/dist/runtime/config/sources-config.js +10 -29
- package/dist/runtime/config/sources-config.js.map +1 -1
- package/dist/runtime/config/versioned-document.d.ts +26 -0
- package/dist/runtime/config/versioned-document.d.ts.map +1 -0
- package/dist/runtime/config/versioned-document.js +87 -0
- package/dist/runtime/config/versioned-document.js.map +1 -0
- package/dist/runtime/directory-changes.d.ts +12 -0
- package/dist/runtime/directory-changes.d.ts.map +1 -0
- package/dist/runtime/directory-changes.js +62 -0
- package/dist/runtime/directory-changes.js.map +1 -0
- package/dist/runtime/foreground.d.ts +2 -0
- package/dist/runtime/foreground.d.ts.map +1 -1
- package/dist/runtime/foreground.js +5 -20
- package/dist/runtime/foreground.js.map +1 -1
- package/dist/runtime/infra/infra-runner.js +5 -5
- package/dist/runtime/infra/infra-runner.js.map +1 -1
- package/dist/runtime/infra/keycloak-realm.d.ts +3 -19
- package/dist/runtime/infra/keycloak-realm.d.ts.map +1 -1
- package/dist/runtime/infra/keycloak-realm.js +12 -133
- package/dist/runtime/infra/keycloak-realm.js.map +1 -1
- package/dist/runtime/installation/current-launcher-renderer.js.map +1 -1
- package/dist/runtime/installation/from-current-config.d.ts.map +1 -1
- package/dist/runtime/installation/from-current-config.js +24 -47
- package/dist/runtime/installation/from-current-config.js.map +1 -1
- package/dist/runtime/installation/index.d.ts +1 -0
- package/dist/runtime/installation/index.d.ts.map +1 -1
- package/dist/runtime/installation/index.js +1 -0
- package/dist/runtime/installation/index.js.map +1 -1
- package/dist/runtime/installation/installation-file.d.ts +3 -0
- package/dist/runtime/installation/installation-file.d.ts.map +1 -0
- package/dist/runtime/installation/installation-file.js +9 -0
- package/dist/runtime/installation/installation-file.js.map +1 -0
- package/dist/runtime/installation/readiness.d.ts +6 -7
- package/dist/runtime/installation/readiness.d.ts.map +1 -1
- package/dist/runtime/installation/readiness.js +82 -132
- package/dist/runtime/installation/readiness.js.map +1 -1
- package/dist/runtime/installation/state-store.d.ts +4 -0
- package/dist/runtime/installation/state-store.d.ts.map +1 -1
- package/dist/runtime/installation/state-store.js +22 -1
- package/dist/runtime/installation/state-store.js.map +1 -1
- package/dist/runtime/installation/to-current-config.d.ts +4 -1
- package/dist/runtime/installation/to-current-config.d.ts.map +1 -1
- package/dist/runtime/installation/to-current-config.js +10 -36
- package/dist/runtime/installation/to-current-config.js.map +1 -1
- package/dist/runtime/launch-plan-format.d.ts.map +1 -1
- package/dist/runtime/launch-plan-format.js +31 -6
- package/dist/runtime/launch-plan-format.js.map +1 -1
- package/dist/runtime/launch-result.d.ts +15 -0
- package/dist/runtime/launch-result.d.ts.map +1 -0
- package/dist/runtime/launch-result.js +3 -0
- package/dist/runtime/launch-result.js.map +1 -0
- package/dist/runtime/launch.d.ts +16 -5
- package/dist/runtime/launch.d.ts.map +1 -1
- package/dist/runtime/launch.js +151 -315
- package/dist/runtime/launch.js.map +1 -1
- package/dist/runtime/license/helm-pull-secret.d.ts +1 -1
- package/dist/runtime/license/helm-pull-secret.d.ts.map +1 -1
- package/dist/runtime/license/helm-pull-secret.js +2 -2
- package/dist/runtime/license/helm-pull-secret.js.map +1 -1
- package/dist/runtime/lifecycle-progress/index.d.ts +9 -0
- package/dist/runtime/lifecycle-progress/index.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/index.js +30 -0
- package/dist/runtime/lifecycle-progress/index.js.map +1 -0
- package/dist/runtime/lifecycle-progress/json-renderer.d.ts +3 -0
- package/dist/runtime/lifecycle-progress/json-renderer.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/json-renderer.js +27 -0
- package/dist/runtime/lifecycle-progress/json-renderer.js.map +1 -0
- package/dist/runtime/lifecycle-progress/text-renderer.d.ts +5 -0
- package/dist/runtime/lifecycle-progress/text-renderer.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/text-renderer.js +83 -0
- package/dist/runtime/lifecycle-progress/text-renderer.js.map +1 -0
- package/dist/runtime/lifecycle-progress/types.d.ts +79 -0
- package/dist/runtime/lifecycle-progress/types.d.ts.map +1 -0
- package/dist/runtime/lifecycle-progress/types.js +32 -0
- package/dist/runtime/lifecycle-progress/types.js.map +1 -0
- package/dist/runtime/lock-loader.d.ts +13 -3
- package/dist/runtime/lock-loader.d.ts.map +1 -1
- package/dist/runtime/lock-loader.js +28 -8
- package/dist/runtime/lock-loader.js.map +1 -1
- package/dist/runtime/paths.d.ts +2 -0
- package/dist/runtime/paths.d.ts.map +1 -1
- package/dist/runtime/paths.js +17 -4
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/roster.d.ts +6 -5
- package/dist/runtime/roster.d.ts.map +1 -1
- package/dist/runtime/roster.js +0 -21
- package/dist/runtime/roster.js.map +1 -1
- package/dist/runtime/runner/container-preflight.d.ts +3 -2
- package/dist/runtime/runner/container-preflight.d.ts.map +1 -1
- package/dist/runtime/runner/container-preflight.js +5 -5
- package/dist/runtime/runner/container-preflight.js.map +1 -1
- package/dist/runtime/runner/container-runner.d.ts +0 -22
- package/dist/runtime/runner/container-runner.d.ts.map +1 -1
- package/dist/runtime/runner/container-runner.js +0 -112
- package/dist/runtime/runner/container-runner.js.map +1 -1
- package/dist/runtime/runner/docker-cli.d.ts +1 -0
- package/dist/runtime/runner/docker-cli.d.ts.map +1 -1
- package/dist/runtime/runner/docker-cli.js +19 -0
- package/dist/runtime/runner/docker-cli.js.map +1 -1
- package/dist/runtime/runner/helm-cli.d.ts +1 -0
- package/dist/runtime/runner/helm-cli.d.ts.map +1 -1
- package/dist/runtime/runner/helm-cli.js +5 -1
- package/dist/runtime/runner/helm-cli.js.map +1 -1
- package/dist/runtime/runner/helm-pre-install.d.ts +3 -2
- package/dist/runtime/runner/helm-pre-install.d.ts.map +1 -1
- package/dist/runtime/runner/helm-pre-install.js +3 -3
- package/dist/runtime/runner/helm-pre-install.js.map +1 -1
- package/dist/runtime/runner/helm-runner.d.ts +29 -4
- package/dist/runtime/runner/helm-runner.d.ts.map +1 -1
- package/dist/runtime/runner/helm-runner.js +44 -14
- package/dist/runtime/runner/helm-runner.js.map +1 -1
- package/dist/runtime/runner/kube-cli.d.ts +1 -0
- package/dist/runtime/runner/kube-cli.d.ts.map +1 -1
- package/dist/runtime/runner/kube-cli.js +24 -2
- package/dist/runtime/runner/kube-cli.js.map +1 -1
- package/dist/runtime/secrets/managed-local-key-provider.d.ts +2 -0
- package/dist/runtime/secrets/managed-local-key-provider.d.ts.map +1 -1
- package/dist/runtime/secrets/managed-local-key-provider.js +17 -8
- package/dist/runtime/secrets/managed-local-key-provider.js.map +1 -1
- package/dist/runtime/seed/closure-container.d.ts +8 -0
- package/dist/runtime/seed/closure-container.d.ts.map +1 -0
- package/dist/runtime/seed/closure-container.js +23 -0
- package/dist/runtime/seed/closure-container.js.map +1 -0
- package/dist/runtime/seed/closure-helm.d.ts +9 -0
- package/dist/runtime/seed/closure-helm.d.ts.map +1 -0
- package/dist/runtime/seed/closure-helm.js +16 -0
- package/dist/runtime/seed/closure-helm.js.map +1 -0
- package/dist/runtime/seed/closure-names.d.ts +4 -0
- package/dist/runtime/seed/closure-names.d.ts.map +1 -0
- package/dist/runtime/seed/closure-names.js +29 -0
- package/dist/runtime/seed/closure-names.js.map +1 -0
- package/dist/runtime/seed/closure-native.d.ts +3 -0
- package/dist/runtime/seed/closure-native.d.ts.map +1 -0
- package/dist/runtime/seed/closure-native.js +18 -0
- package/dist/runtime/seed/closure-native.js.map +1 -0
- package/dist/runtime/seed/installation-tar.d.ts +5 -0
- package/dist/runtime/seed/installation-tar.d.ts.map +1 -0
- package/dist/runtime/seed/installation-tar.js +30 -0
- package/dist/runtime/seed/installation-tar.js.map +1 -0
- package/dist/runtime/seed/launch-env.d.ts +42 -0
- package/dist/runtime/seed/launch-env.d.ts.map +1 -0
- package/dist/runtime/seed/launch-env.js +150 -0
- package/dist/runtime/seed/launch-env.js.map +1 -0
- package/dist/runtime/seed/seed-container.d.ts +13 -0
- package/dist/runtime/seed/seed-container.d.ts.map +1 -0
- package/dist/runtime/seed/seed-container.js +175 -0
- package/dist/runtime/seed/seed-container.js.map +1 -0
- package/dist/runtime/seed/seed-delivery-env.d.ts +39 -0
- package/dist/runtime/seed/seed-delivery-env.d.ts.map +1 -0
- package/dist/runtime/seed/seed-delivery-env.js +47 -0
- package/dist/runtime/seed/seed-delivery-env.js.map +1 -0
- package/dist/runtime/seed/seed-down.d.ts +2 -0
- package/dist/runtime/seed/seed-down.d.ts.map +1 -0
- package/dist/runtime/seed/seed-down.js +52 -0
- package/dist/runtime/seed/seed-down.js.map +1 -0
- package/dist/runtime/seed/seed-env-file.d.ts +3 -0
- package/dist/runtime/seed/seed-env-file.d.ts.map +1 -0
- package/dist/runtime/seed/seed-env-file.js +24 -0
- package/dist/runtime/seed/seed-env-file.js.map +1 -0
- package/dist/runtime/seed/seed-env-secret.d.ts +18 -0
- package/dist/runtime/seed/seed-env-secret.d.ts.map +1 -0
- package/dist/runtime/seed/seed-env-secret.js +62 -0
- package/dist/runtime/seed/seed-env-secret.js.map +1 -0
- package/dist/runtime/seed/seed-environment.d.ts +12 -0
- package/dist/runtime/seed/seed-environment.d.ts.map +1 -0
- package/dist/runtime/seed/seed-environment.js +66 -0
- package/dist/runtime/seed/seed-environment.js.map +1 -0
- package/dist/runtime/seed/seed-facts.d.ts +22 -0
- package/dist/runtime/seed/seed-facts.d.ts.map +1 -0
- package/dist/runtime/seed/seed-facts.js +40 -0
- package/dist/runtime/seed/seed-facts.js.map +1 -0
- package/dist/runtime/seed/seed-helm.d.ts +10 -0
- package/dist/runtime/seed/seed-helm.d.ts.map +1 -0
- package/dist/runtime/seed/seed-helm.js +74 -0
- package/dist/runtime/seed/seed-helm.js.map +1 -0
- package/dist/runtime/seed/seed-image-user.d.ts +6 -0
- package/dist/runtime/seed/seed-image-user.d.ts.map +1 -0
- package/dist/runtime/seed/seed-image-user.js +14 -0
- package/dist/runtime/seed/seed-image-user.js.map +1 -0
- package/dist/runtime/seed/seed-installation-files.d.ts +23 -0
- package/dist/runtime/seed/seed-installation-files.d.ts.map +1 -0
- package/dist/runtime/seed/seed-installation-files.js +51 -0
- package/dist/runtime/seed/seed-installation-files.js.map +1 -0
- package/dist/runtime/seed/seed-installation.d.ts +20 -0
- package/dist/runtime/seed/seed-installation.d.ts.map +1 -0
- package/dist/runtime/seed/seed-installation.js +36 -0
- package/dist/runtime/seed/seed-installation.js.map +1 -0
- package/dist/runtime/seed/seed-launcher.d.ts +14 -0
- package/dist/runtime/seed/seed-launcher.d.ts.map +1 -0
- package/dist/runtime/seed/seed-launcher.js +155 -0
- package/dist/runtime/seed/seed-launcher.js.map +1 -0
- package/dist/runtime/seed/seed-options.d.ts +22 -0
- package/dist/runtime/seed/seed-options.d.ts.map +1 -0
- package/dist/runtime/seed/seed-options.js +57 -0
- package/dist/runtime/seed/seed-options.js.map +1 -0
- package/dist/runtime/seed/seed-platform-endpoints.d.ts +8 -0
- package/dist/runtime/seed/seed-platform-endpoints.d.ts.map +1 -0
- package/dist/runtime/seed/seed-platform-endpoints.js +55 -0
- package/dist/runtime/seed/seed-platform-endpoints.js.map +1 -0
- package/dist/runtime/seed/seed-process.d.ts +22 -0
- package/dist/runtime/seed/seed-process.d.ts.map +1 -0
- package/dist/runtime/seed/seed-process.js +79 -0
- package/dist/runtime/seed/seed-process.js.map +1 -0
- package/dist/runtime/seed/seed-record.d.ts +101 -0
- package/dist/runtime/seed/seed-record.d.ts.map +1 -0
- package/dist/runtime/seed/seed-record.js +141 -0
- package/dist/runtime/seed/seed-record.js.map +1 -0
- package/dist/runtime/seed/seed-resolved-deployment.d.ts +14 -0
- package/dist/runtime/seed/seed-resolved-deployment.d.ts.map +1 -0
- package/dist/runtime/seed/seed-resolved-deployment.js +52 -0
- package/dist/runtime/seed/seed-resolved-deployment.js.map +1 -0
- package/dist/runtime/seed/substrate-facts.d.ts +52 -0
- package/dist/runtime/seed/substrate-facts.d.ts.map +1 -0
- package/dist/runtime/seed/substrate-facts.js +92 -0
- package/dist/runtime/seed/substrate-facts.js.map +1 -0
- package/dist/runtime/seed/supervisor-contract.d.ts +9 -0
- package/dist/runtime/seed/supervisor-contract.d.ts.map +1 -0
- package/dist/runtime/seed/supervisor-contract.js +68 -0
- package/dist/runtime/seed/supervisor-contract.js.map +1 -0
- package/dist/runtime/seed/workload-identity-facts.d.ts +17 -0
- package/dist/runtime/seed/workload-identity-facts.d.ts.map +1 -0
- package/dist/runtime/seed/workload-identity-facts.js +53 -0
- package/dist/runtime/seed/workload-identity-facts.js.map +1 -0
- package/dist/runtime/sources/schema.d.ts +2 -0
- package/dist/runtime/sources/schema.d.ts.map +1 -1
- package/dist/runtime/sources/schema.js +10 -9
- package/dist/runtime/sources/schema.js.map +1 -1
- package/dist/runtime/store-client.d.ts +0 -10
- package/dist/runtime/store-client.d.ts.map +1 -1
- package/dist/runtime/store-client.js +0 -5
- package/dist/runtime/store-client.js.map +1 -1
- package/dist/runtime/tenancy/identity-installer.d.ts +11 -0
- package/dist/runtime/tenancy/identity-installer.d.ts.map +1 -0
- package/dist/runtime/tenancy/identity-installer.js +39 -0
- package/dist/runtime/tenancy/identity-installer.js.map +1 -0
- package/dist/runtime/tenancy/import-cache.d.ts +5 -0
- package/dist/runtime/tenancy/import-cache.d.ts.map +1 -0
- package/dist/runtime/tenancy/import-cache.js +27 -0
- package/dist/runtime/tenancy/import-cache.js.map +1 -0
- package/dist/runtime/tenancy/openfga.d.ts +4 -0
- package/dist/runtime/tenancy/openfga.d.ts.map +1 -0
- package/dist/runtime/tenancy/openfga.js +29 -0
- package/dist/runtime/tenancy/openfga.js.map +1 -0
- package/dist/runtime/tenancy/servers.d.ts +18 -0
- package/dist/runtime/tenancy/servers.d.ts.map +1 -0
- package/dist/runtime/tenancy/servers.js +102 -0
- package/dist/runtime/tenancy/servers.js.map +1 -0
- package/dist/runtime/tenancy/session.d.ts +19 -0
- package/dist/runtime/tenancy/session.d.ts.map +1 -0
- package/dist/runtime/tenancy/session.js +79 -0
- package/dist/runtime/tenancy/session.js.map +1 -0
- package/dist/runtime/tenancy/specs.d.ts +27 -0
- package/dist/runtime/tenancy/specs.d.ts.map +1 -0
- package/dist/runtime/tenancy/specs.js +129 -0
- package/dist/runtime/tenancy/specs.js.map +1 -0
- package/examples/01-local-native.yaml +1 -3
- package/examples/02-local-container-full.yaml +0 -2
- package/examples/03-byo-infra.yaml +1 -5
- package/examples/06-biome-sources.yaml +1 -3
- package/package.json +32 -37
- package/xema.config.example.yaml +1 -10
- package/dist/assets/keycloak/realm-xema.json +0 -397
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -196
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/edition.d.ts +0 -3
- package/dist/commands/edition.d.ts.map +0 -1
- package/dist/commands/edition.js +0 -54
- package/dist/commands/edition.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -3
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -114
- package/dist/commands/serve.js.map +0 -1
- package/dist/dev/carved-installs.d.ts +0 -3
- package/dist/dev/carved-installs.d.ts.map +0 -1
- package/dist/dev/carved-installs.js +0 -63
- package/dist/dev/carved-installs.js.map +0 -1
- package/dist/dev/env-defaults.d.ts +0 -15
- package/dist/dev/env-defaults.d.ts.map +0 -1
- package/dist/dev/env-defaults.js +0 -178
- package/dist/dev/env-defaults.js.map +0 -1
- package/dist/dev/forked-worker-bootstrap-protocol.d.ts +0 -17
- package/dist/dev/forked-worker-bootstrap-protocol.d.ts.map +0 -1
- package/dist/dev/forked-worker-bootstrap-protocol.js +0 -35
- package/dist/dev/forked-worker-bootstrap-protocol.js.map +0 -1
- package/dist/dev/forked-worker-bootstrap.d.ts +0 -18
- package/dist/dev/forked-worker-bootstrap.d.ts.map +0 -1
- package/dist/dev/forked-worker-bootstrap.js +0 -84
- package/dist/dev/forked-worker-bootstrap.js.map +0 -1
- package/dist/dev/forked-worker.d.ts +0 -43
- package/dist/dev/forked-worker.d.ts.map +0 -1
- package/dist/dev/forked-worker.js +0 -358
- package/dist/dev/forked-worker.js.map +0 -1
- package/dist/edition/verify-image-evidence.bundle.mjs +0 -70456
- package/dist/edition/verify-image-evidence.bundle.provenance.json +0 -3957
- package/dist/runtime/backing-registration.d.ts +0 -11
- package/dist/runtime/backing-registration.d.ts.map +0 -1
- package/dist/runtime/backing-registration.js +0 -94
- package/dist/runtime/backing-registration.js.map +0 -1
- package/dist/runtime/edition/run-entry.d.ts +0 -9
- package/dist/runtime/edition/run-entry.d.ts.map +0 -1
- package/dist/runtime/edition/run-entry.js +0 -36
- package/dist/runtime/edition/run-entry.js.map +0 -1
- package/dist/runtime/edition/verb-map.d.ts +0 -70
- package/dist/runtime/edition/verb-map.d.ts.map +0 -1
- package/dist/runtime/edition/verb-map.js +0 -166
- package/dist/runtime/edition/verb-map.js.map +0 -1
- package/dist/runtime/env-seeder.d.ts +0 -26
- package/dist/runtime/env-seeder.d.ts.map +0 -1
- package/dist/runtime/env-seeder.js +0 -340
- package/dist/runtime/env-seeder.js.map +0 -1
- package/dist/runtime/port-map.d.ts +0 -3
- package/dist/runtime/port-map.d.ts.map +0 -1
- package/dist/runtime/port-map.js +0 -25
- package/dist/runtime/port-map.js.map +0 -1
- package/dist/runtime/run-manifest.d.ts +0 -52
- package/dist/runtime/run-manifest.d.ts.map +0 -1
- package/dist/runtime/run-manifest.js +0 -585
- package/dist/runtime/run-manifest.js.map +0 -1
- package/dist/runtime/runner/native-runner.d.ts +0 -13
- package/dist/runtime/runner/native-runner.d.ts.map +0 -1
- package/dist/runtime/runner/native-runner.js +0 -94
- package/dist/runtime/runner/native-runner.js.map +0 -1
- package/dist/runtime/runner/service-runner.d.ts +0 -28
- package/dist/runtime/runner/service-runner.d.ts.map +0 -1
- package/dist/runtime/runner/service-runner.js +0 -10
- package/dist/runtime/runner/service-runner.js.map +0 -1
- package/dist/runtime/secrets/generated-platform-secrets.d.ts +0 -16
- package/dist/runtime/secrets/generated-platform-secrets.d.ts.map +0 -1
- package/dist/runtime/secrets/generated-platform-secrets.js +0 -115
- package/dist/runtime/secrets/generated-platform-secrets.js.map +0 -1
- package/dist/runtime/secrets/resolver.d.ts +0 -23
- package/dist/runtime/secrets/resolver.d.ts.map +0 -1
- package/dist/runtime/secrets/resolver.js +0 -266
- package/dist/runtime/secrets/resolver.js.map +0 -1
- package/dist/runtime/supervisor.d.ts +0 -67
- package/dist/runtime/supervisor.d.ts.map +0 -1
- package/dist/runtime/supervisor.js +0 -227
- package/dist/runtime/supervisor.js.map +0 -1
- package/edition/README.md +0 -293
- package/edition/adapter-bundled-versions.mjs +0 -108
- package/edition/adapter-host-versions.mjs +0 -41
- package/edition/assemble-producer-input.mjs +0 -1414
- package/edition/assemble-third-party-input.mjs +0 -336
- package/edition/authored-source-check.mjs +0 -135
- package/edition/authorization-base.mjs +0 -357
- package/edition/biome-content.mjs +0 -327
- package/edition/build-biome-index.mjs +0 -180
- package/edition/build-ledger-completeness.mjs +0 -67
- package/edition/build-ledger.mjs +0 -107
- package/edition/build-platform-service-index.mjs +0 -292
- package/edition/build-runtime-image-source-index.mjs +0 -1187
- package/edition/built-verifier.mjs +0 -55
- package/edition/candidate-edition.mjs +0 -697
- package/edition/canonical-evidence-json.mjs +0 -82
- package/edition/canonical-repository-url.mjs +0 -47
- package/edition/catalogue-edition.mjs +0 -49
- package/edition/catalogue-evidence.mjs +0 -228
- package/edition/catalogue-fetch.mjs +0 -124
- package/edition/catalogue-lock-field.mjs +0 -41
- package/edition/catalogue-pin.mjs +0 -71
- package/edition/catalogue.mjs +0 -223
- package/edition/chart-set-source-commit.mjs +0 -97
- package/edition/check-committed-image-evidence.mjs +0 -412
- package/edition/checkout-indexed-source-repositories.mjs +0 -283
- package/edition/collected-refusals.mjs +0 -59
- package/edition/comment-blanker.mjs +0 -75
- package/edition/connector-source-authority.mjs +0 -60
- package/edition/contract-authority.mjs +0 -122
- package/edition/cosign-certificate-constraints.mjs +0 -50
- package/edition/cross-repo-build-inputs.mjs +0 -158
- package/edition/customer-definition.mjs +0 -174
- package/edition/customer-edition-verbs.mjs +0 -617
- package/edition/customer-flags.mjs +0 -15
- package/edition/develop-catalogue-free-resolve.mjs +0 -280
- package/edition/develop-chart-roster.mjs +0 -96
- package/edition/develop-chart-set.mjs +0 -147
- package/edition/develop-coverage-readers.mjs +0 -217
- package/edition/develop-coverage-run.mjs +0 -50
- package/edition/develop-coverage-verdict.mjs +0 -153
- package/edition/develop-coverage.mjs +0 -131
- package/edition/develop-current-resolution.mjs +0 -29
- package/edition/develop-edition-invariants.mjs +0 -142
- package/edition/develop-edition-resolve.mjs +0 -211
- package/edition/develop-edition.mjs +0 -379
- package/edition/develop-engine-image.mjs +0 -95
- package/edition/develop-follow.mjs +0 -491
- package/edition/develop-freeze.mjs +0 -289
- package/edition/develop-git-bundles.mjs +0 -255
- package/edition/develop-graph.mjs +0 -28
- package/edition/develop-image-coordinate.mjs +0 -54
- package/edition/develop-image-probe.mjs +0 -120
- package/edition/develop-image-record.mjs +0 -194
- package/edition/develop-record-ancestry.mjs +0 -144
- package/edition/develop-record-verify.mjs +0 -216
- package/edition/develop-resolve-report.mjs +0 -159
- package/edition/develop-select-records.mjs +0 -172
- package/edition/develop-selection-line.mjs +0 -30
- package/edition/develop-selection-pins.mjs +0 -36
- package/edition/develop-snapshot-inputs.mjs +0 -93
- package/edition/develop-verify-image-record.mjs +0 -109
- package/edition/dispatched-runtime-components.mjs +0 -172
- package/edition/dist-check.mjs +0 -1137
- package/edition/distribution-evidence-set.mjs +0 -1064
- package/edition/distribution-paths.mjs +0 -191
- package/edition/edition-artifact.mjs +0 -529
- package/edition/edition-biome-manifests.mjs +0 -85
- package/edition/edition-ceiling.mjs +0 -180
- package/edition/edition-channel.mjs +0 -20
- package/edition/edition-chart-set.mjs +0 -104
- package/edition/edition-config.mjs +0 -374
- package/edition/edition-constants.mjs +0 -110
- package/edition/edition-contract-parse.mjs +0 -179
- package/edition/edition-contract.json +0 -100
- package/edition/edition-image-seal.mjs +0 -110
- package/edition/edition-kind.mjs +0 -10
- package/edition/edition-list.mjs +0 -35
- package/edition/edition-locks.mjs +0 -79
- package/edition/edition-pin-verbs.mjs +0 -183
- package/edition/edition-pin.mjs +0 -17
- package/edition/edition-pinned-inputs.mjs +0 -116
- package/edition/edition-protocol.mjs +0 -277
- package/edition/edition-publisher.mjs +0 -21
- package/edition/edition-seal.mjs +0 -257
- package/edition/edition-source-pins.mjs +0 -211
- package/edition/edition-unpin.mjs +0 -16
- package/edition/edition-workspace.mjs +0 -204
- package/edition/evidence-checkout.mjs +0 -439
- package/edition/evidence-grammars.mjs +0 -18
- package/edition/evidence-input-mode.mjs +0 -136
- package/edition/evidence-trust-pin.mjs +0 -380
- package/edition/evidence-trust-policy.mjs +0 -374
- package/edition/external-source-walk.mjs +0 -485
- package/edition/first-party-source-ids.mjs +0 -62
- package/edition/fleet-coordinate-finality.mjs +0 -363
- package/edition/fulcio-certificate-extensions.mjs +0 -231
- package/edition/git-json.mjs +0 -54
- package/edition/git-source-auth.mjs +0 -131
- package/edition/image-delivery-entitlement-descriptor.mjs +0 -106
- package/edition/image-evidence-replay-state.mjs +0 -242
- package/edition/image-evidence.mjs +0 -1404
- package/edition/image-lock-service-rows.mjs +0 -26
- package/edition/image-subject-identity.mjs +0 -24
- package/edition/images-from-record.mjs +0 -298
- package/edition/indexes-at-pins.mjs +0 -13
- package/edition/kernel-capability-domain.mjs +0 -30
- package/edition/kernel-contract-authority.mjs +0 -517
- package/edition/kernel-contract-source-path-set.mjs +0 -94
- package/edition/kernel-package.mjs +0 -206
- package/edition/kernel-protocol-choice.mjs +0 -239
- package/edition/kernel-signer-kind.mjs +0 -23
- package/edition/lib.mjs +0 -3303
- package/edition/locked-bundle-signer.mjs +0 -297
- package/edition/map-with-concurrency.mjs +0 -19
- package/edition/no-follow-file.mjs +0 -94
- package/edition/oci-evidence-verbs.mjs +0 -419
- package/edition/oci-image-source-evidence.mjs +0 -364
- package/edition/operation-grant-admission.mjs +0 -285
- package/edition/operation-requirements.mjs +0 -282
- package/edition/oras-process.mjs +0 -35
- package/edition/oras.mjs +0 -742
- package/edition/pin-source.mjs +0 -242
- package/edition/pinned-cosign.mjs +0 -70
- package/edition/plan-image-evidence-refresh.mjs +0 -427
- package/edition/platform-lock-readability.mjs +0 -901
- package/edition/platform-service-class.mjs +0 -85
- package/edition/platform-service-ownership.mjs +0 -88
- package/edition/platform-service-source-authority.mjs +0 -105
- package/edition/positive-closure.mjs +0 -162
- package/edition/previous-seal-registry.mjs +0 -149
- package/edition/produce-distribution-completeness-evidence.mjs +0 -318
- package/edition/produce-edition-catalogue-evidence.mjs +0 -252
- package/edition/produce-image-delivery-entitlement-evidence.mjs +0 -304
- package/edition/produce-image-source-evidence.mjs +0 -788
- package/edition/producer-evidence-bundle.mjs +0 -201
- package/edition/producer-evidence-index-file.mjs +0 -4
- package/edition/record-refused.mjs +0 -12
- package/edition/registry-credentials.mjs +0 -225
- package/edition/release-catalogue.mjs +0 -47
- package/edition/release-channel-guard.mjs +0 -108
- package/edition/release-edition-artifact.mjs +0 -152
- package/edition/release-edition.mjs +0 -54
- package/edition/remedy-command.mjs +0 -89
- package/edition/repin-evidence-trust.mjs +0 -109
- package/edition/required-resource-provider.mjs +0 -58
- package/edition/resolve-chart-set.mjs +0 -376
- package/edition/resolve-customer-edition.mjs +0 -374
- package/edition/resolve-distribution.mjs +0 -2639
- package/edition/resolve-edition.mjs +0 -192
- package/edition/resolve-images.mjs +0 -2294
- package/edition/seal-image-digests.mjs +0 -954
- package/edition/sealed-distribution-lock.mjs +0 -22
- package/edition/sealed-evidence-accept.mjs +0 -82
- package/edition/shallow-checkout.mjs +0 -18
- package/edition/sigstore-bundle-media-type.mjs +0 -4
- package/edition/source-authority.mjs +0 -713
- package/edition/source-closure.mjs +0 -115
- package/edition/store-publisher-trust.mjs +0 -40
- package/edition/strict-json.mjs +0 -121
- package/edition/string-order.mjs +0 -5
- package/edition/third-party-admission.mjs +0 -91
- package/edition/third-party-bundle-registry.mjs +0 -242
- package/edition/third-party-certificate-extensions.mjs +0 -21
- package/edition/third-party-image-pins.mjs +0 -41
- package/edition/third-party-pins-trusted.mjs +0 -24
- package/edition/third-party-producer-evidence.mjs +0 -76
- package/edition/third-party-source-check.mjs +0 -28
- package/edition/third-party-source-context.mjs +0 -41
- package/edition/third-party-source-evidence.mjs +0 -287
- package/edition/third-party-source-flags.mjs +0 -134
- package/edition/third-party-source-pins.mjs +0 -259
- package/edition/third-party-source-uniqueness.mjs +0 -54
- package/edition/third-party-source-walk.mjs +0 -115
- package/edition/third-party-source-writer.mjs +0 -213
- package/edition/third-party-subjects.mjs +0 -128
- package/edition/trust-policy-arming-verb.mjs +0 -60
- package/edition/trust-policy-arming.mjs +0 -144
- package/edition/trust-policy-image-ownership.mjs +0 -85
- package/edition/trusted-executable.mjs +0 -166
- package/edition/verifier-binding.mjs +0 -45
- package/edition/verifier-files.mjs +0 -8
- package/edition/verifier-kernel-schemas.mjs +0 -22
- package/edition/verifier-provenance.mjs +0 -64
- package/edition/verify-catalogue-evidence.mjs +0 -247
- package/edition/verify-image-evidence.mjs +0 -475
- package/edition/verify-image-platforms.mjs +0 -523
- package/edition/why.mjs +0 -56
- package/edition/workspace-sections.mjs +0 -276
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
// develop-record-verify — the verify core of a signed build record, shared by `develop select-records` and
|
|
2
|
-
// `develop verify-image-record`.
|
|
3
|
-
//
|
|
4
|
-
// A record is trusted only after cosign verified it, offline against the pinned trusted root, as signed by the
|
|
5
|
-
// data root's `record-build.yaml` at `refs/heads/<branch>`, called by the member's own repository at the
|
|
6
|
-
// record's own commit; the record must also name that member as its producer, its own branch and its own tag.
|
|
7
|
-
// Both verbs read records through `loadVerifiedRecord`: there is one copy of this logic.
|
|
8
|
-
//
|
|
9
|
-
// Two failure classes: `RecordRefused` (the record is missing, or cosign or the record itself says no) and a
|
|
10
|
-
// plain Error (the registry or cosign could not answer), which the operator retries rather than reads.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
import { canonicalPublicHttpsRepositoryUrl, repositoryOwnerName } from './canonical-repository-url.mjs';
|
|
14
|
-
import { certificateConstraintArgs } from './cosign-certificate-constraints.mjs';
|
|
15
|
-
import { editionWorkspaceConfig } from './edition-config.mjs';
|
|
16
|
-
import { loadKernelDistributionSchemas } from './lib.mjs';
|
|
17
|
-
import { cosignEnvironment, withPinnedCosign } from './pinned-cosign.mjs';
|
|
18
|
-
import { RecordRefused } from './record-refused.mjs';
|
|
19
|
-
import { splitImageRef } from './registry-credentials.mjs';
|
|
20
|
-
import { isNotPublishedYet } from './seal-image-digests.mjs';
|
|
21
|
-
|
|
22
|
-
/** The repository segment, under the registry root, that holds a member's build records. */
|
|
23
|
-
export const BUILD_RECORDS_SEGMENT = 'build-records';
|
|
24
|
-
export const RECORD_SIGNER_WORKFLOW = '.github/workflows/record-build.yaml';
|
|
25
|
-
export const RECORD_SIGNER_OIDC_ISSUER = 'https://token.actions.githubusercontent.com';
|
|
26
|
-
/** The branches a record signer is declared for, each with the ref the record workflow runs at. */
|
|
27
|
-
const RECORD_SIGNER_REFS = Object.freeze({ develop: 'refs/heads/develop' });
|
|
28
|
-
/**
|
|
29
|
-
* A cosign exit whose stderr shows the registry was not reached before any verdict. Only this, a cosign that
|
|
30
|
-
* could not run, and a timeout are operational; every other non-zero exit of `cosign verify` is a verdict.
|
|
31
|
-
*/
|
|
32
|
-
const COSIGN_TRANSPORT_FAILURE = /dial tcp|i\/o timeout|connection (refused|reset)|no such host|TLS handshake timeout|context deadline exceeded/i;
|
|
33
|
-
|
|
34
|
-
/** The record's producer is a kind this CLI has no claims for: a closed set, never guessed at. */
|
|
35
|
-
export class UnknownBuildRecordProducerError extends RecordRefused {
|
|
36
|
-
constructor(repo, kind) {
|
|
37
|
-
super(repo, `the record's producer kind ${JSON.stringify(kind)} is not one select-records can verify`);
|
|
38
|
-
this.name = 'UnknownBuildRecordProducerError';
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class DataRootRepositoryUndeclaredError extends Error {
|
|
43
|
-
constructor() {
|
|
44
|
-
super('edition-workspace.json declares no dataRootRepositoryUrl; select-records cannot name the record signer');
|
|
45
|
-
this.name = 'DataRootRepositoryUndeclaredError';
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export class KernelLacksBuildRecordSchemaError extends Error {
|
|
50
|
-
constructor(missing) {
|
|
51
|
-
super(`the kernel's distribution module does not export ${missing.join(', ')}; select-records needs a kernel with the build-record contract`);
|
|
52
|
-
this.name = 'KernelLacksBuildRecordSchemaError';
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** The data root's `owner/name`, from the workspace declaration; refused by name when it declares none. */
|
|
57
|
-
export function declaredDataRootRepositoryUrl() {
|
|
58
|
-
const url = editionWorkspaceConfig().dataRootRepositoryUrl;
|
|
59
|
-
if (url === undefined) {throw new DataRootRepositoryUndeclaredError();}
|
|
60
|
-
return url;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** The kernel's build-record exports, refused as a set when any is absent. */
|
|
64
|
-
export function requireBuildRecordKernel(schemas) {
|
|
65
|
-
const names = ['BUILD_RECORD_MEDIA_TYPE', 'BuildRecordSchema', 'buildRecordTag', 'parseBuildRecordTag', 'compareBuildRecordRuns'];
|
|
66
|
-
const missing = names.filter((name) => schemas?.[name] === undefined);
|
|
67
|
-
if (missing.length > 0 || typeof schemas.BuildRecordSchema?.safeParse !== 'function') {
|
|
68
|
-
throw new KernelLacksBuildRecordSchemaError(missing.length > 0 ? missing : ['a BuildRecordSchema with safeParse']);
|
|
69
|
-
}
|
|
70
|
-
return schemas;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** The ref and data-root repository a branch's records are signed by; refused before any network call. */
|
|
74
|
-
export function recordSignerOrigin({ branch, dataRootRepositoryUrl }) {
|
|
75
|
-
const ref = Object.hasOwn(RECORD_SIGNER_REFS, branch) ? RECORD_SIGNER_REFS[branch] : undefined;
|
|
76
|
-
if (ref === undefined) {throw new Error(`no record signer declared for branch ${branch}`);}
|
|
77
|
-
if (dataRootRepositoryUrl === undefined) {throw new DataRootRepositoryUndeclaredError();}
|
|
78
|
-
const dataRepository = repositoryOwnerName(canonicalPublicHttpsRepositoryUrl(dataRootRepositoryUrl, 'dataRootRepositoryUrl'), 'dataRootRepositoryUrl');
|
|
79
|
-
return { ref, dataRepository };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* The signer of the branch's records: the data root's record workflow at the branch, as the certificate states
|
|
84
|
-
* it, with the repository that CALLED the workflow (the member) as the workflow-repository claim.
|
|
85
|
-
*/
|
|
86
|
-
export function recordSigner({ branch, dataRootRepositoryUrl, memberRepositoryUrl }) {
|
|
87
|
-
const { ref, dataRepository } = recordSignerOrigin({ branch, dataRootRepositoryUrl });
|
|
88
|
-
const member = repositoryOwnerName(canonicalPublicHttpsRepositoryUrl(memberRepositoryUrl, 'repositoryUrl'), 'repositoryUrl');
|
|
89
|
-
return {
|
|
90
|
-
certificateIdentity: `https://github.com/${dataRepository}/${RECORD_SIGNER_WORKFLOW}@${ref}`,
|
|
91
|
-
oidcIssuer: RECORD_SIGNER_OIDC_ISSUER,
|
|
92
|
-
githubWorkflow: { repository: member, ref },
|
|
93
|
-
memberRepository: member,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* What a record's producer says, read through the ONE switch over its kind: the repository that called the
|
|
99
|
-
* record workflow (the cosign caller claim, held equal to the member's) and the run the snapshot names.
|
|
100
|
-
*/
|
|
101
|
-
export function producerClaims({ record, repo, memberRepository }) {
|
|
102
|
-
switch (record.producer?.kind) {
|
|
103
|
-
case 'github-actions': {
|
|
104
|
-
const { repository, runNumber, runAttempt } = record.producer;
|
|
105
|
-
if (repository !== memberRepository) {throw new RecordRefused(repo, `record is produced by repository ${repository}, not ${memberRepository}`);}
|
|
106
|
-
return { repository, snapshot: `${runNumber}.${runAttempt}` };
|
|
107
|
-
}
|
|
108
|
-
default:
|
|
109
|
-
throw new UnknownBuildRecordProducerError(repo, record.producer?.kind);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/** Run one registry client call; ONLY a failure of the client itself is "the registry did not answer". */
|
|
114
|
-
async function fromRegistry(repo, what, call) {
|
|
115
|
-
try {
|
|
116
|
-
return await call();
|
|
117
|
-
} catch (error) {
|
|
118
|
-
throw new Error(`select-records: ${repo}: the registry did not answer for ${what}: ${error.message}`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** Read one record by its tag: manifest by digest, its single layer, parsed against the kernel's schema. */
|
|
123
|
-
async function readRecord({ kernel, client, repository, repo, tag }) {
|
|
124
|
-
const served = await fromRegistry(repo, `${repository}:${tag}`, () => client.getManifestByTag(repository, tag));
|
|
125
|
-
const manifest = await fromRegistry(repo, `${repository}@${served.digest}`, () => client.getManifestByDigest(repository, served.digest));
|
|
126
|
-
const layers = manifest.document.layers;
|
|
127
|
-
if (!Array.isArray(layers) || layers.length !== 1) {
|
|
128
|
-
throw new RecordRefused(repo, `record ${tag} has ${Array.isArray(layers) ? layers.length : 'no'} layers, not exactly one`);
|
|
129
|
-
}
|
|
130
|
-
const [layer] = layers;
|
|
131
|
-
if (layer.mediaType !== kernel.BUILD_RECORD_MEDIA_TYPE) {
|
|
132
|
-
throw new RecordRefused(repo, `record ${tag} layer media type is ${JSON.stringify(layer.mediaType)}, not ${kernel.BUILD_RECORD_MEDIA_TYPE}`);
|
|
133
|
-
}
|
|
134
|
-
const bytes = await fromRegistry(repo, `${repository}@${layer.digest}`, () => client.getBlob(repository, layer.digest));
|
|
135
|
-
let document;
|
|
136
|
-
try {
|
|
137
|
-
document = JSON.parse(bytes.toString('utf8'));
|
|
138
|
-
} catch (error) {
|
|
139
|
-
throw new RecordRefused(repo, `record ${tag} is not JSON: ${error.message}`);
|
|
140
|
-
}
|
|
141
|
-
const parsed = kernel.BuildRecordSchema.safeParse(document);
|
|
142
|
-
if (!parsed.success) {throw new RecordRefused(repo, `record ${tag} does not parse as a build record: ${parsed.error.message}`);}
|
|
143
|
-
return { record: parsed.data, digest: served.digest };
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/** The tag's record, verified by digest against the constrained signer, then held to its own repo, branch and tag. */
|
|
147
|
-
export async function loadVerifiedRecord({ kernel, client, runCosign, cosignEnv, trustedRootPath, repository, member, branch, dataRootRepositoryUrl, tag }) {
|
|
148
|
-
const repo = member.repo;
|
|
149
|
-
const { record, digest } = await readRecord({ kernel, client, repository, repo, tag });
|
|
150
|
-
const signer = recordSigner({ branch, dataRootRepositoryUrl, memberRepositoryUrl: member.repositoryUrl });
|
|
151
|
-
const { repository: callerRepository, snapshot } = producerClaims({ record, repo, memberRepository: signer.memberRepository });
|
|
152
|
-
signer.githubWorkflow.repository = callerRepository;
|
|
153
|
-
const ref = `${repository}@${digest}`;
|
|
154
|
-
const args = ['verify', '--offline', '--trusted-root', trustedRootPath, ...certificateConstraintArgs(signer, record.commit), ref];
|
|
155
|
-
let result;
|
|
156
|
-
try {
|
|
157
|
-
result = await runCosign(args, cosignEnv);
|
|
158
|
-
} catch (error) {
|
|
159
|
-
// no numeric exit code: cosign did not run (spawn failure) or did not answer (timeout, kill signal)
|
|
160
|
-
throw new Error(`select-records: ${repo}: cosign could not run for ${ref}: ${error.message}`);
|
|
161
|
-
}
|
|
162
|
-
if (result.code !== 0) {
|
|
163
|
-
if (COSIGN_TRANSPORT_FAILURE.test(result.stderr)) {
|
|
164
|
-
throw new Error(`select-records: ${repo}: cosign could not reach the registry for ${ref} (exit ${result.code}): ${result.stderr.trim()}`);
|
|
165
|
-
}
|
|
166
|
-
throw new RecordRefused(repo, `cosign refused record ${tag} (${digest}) as signed by ${signer.certificateIdentity} (exit ${result.code}): ${result.stderr.trim()}`);
|
|
167
|
-
}
|
|
168
|
-
if (record.branch !== branch) {throw new RecordRefused(repo, `record ${tag} is for branch ${record.branch}, not ${branch}`);}
|
|
169
|
-
if (kernel.buildRecordTag(record) !== tag) {throw new RecordRefused(repo, `record tagged ${tag} says it is ${kernel.buildRecordTag(record)}`);}
|
|
170
|
-
return { record, snapshot };
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
/** The registry repository that holds a member's build records. */
|
|
175
|
-
export function recordsRepositoryOf(registry, member) {
|
|
176
|
-
return `${registry}/${BUILD_RECORDS_SEGMENT}/${member.repo.split('/').at(-1)}`;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Every record tag a member published for `branch`, newest run first, with the registry client of its authority.
|
|
181
|
-
* Refused when none was ever published; a registry that did not answer is a plain Error.
|
|
182
|
-
*/
|
|
183
|
-
export async function listBuildRecordRuns({ kernel, clientFor, registry, member, branch }) {
|
|
184
|
-
const repository = recordsRepositoryOf(registry, member);
|
|
185
|
-
const { authority } = splitImageRef(repository);
|
|
186
|
-
const client = clientFor(authority);
|
|
187
|
-
let tags;
|
|
188
|
-
try {
|
|
189
|
-
tags = await client.listTags(repository);
|
|
190
|
-
} catch (error) {
|
|
191
|
-
if (isNotPublishedYet(error)) {throw new RecordRefused(member.repo, `${repository} does not exist: no build record was ever published`);}
|
|
192
|
-
throw new Error(`select-records: ${member.repo}: the registry did not answer for ${repository} tags: ${error.message}`);
|
|
193
|
-
}
|
|
194
|
-
const runs = tags
|
|
195
|
-
.map((tag) => ({ tag, run: kernel.parseBuildRecordTag(tag, branch) }))
|
|
196
|
-
.filter(({ run }) => run !== undefined)
|
|
197
|
-
.sort((a, b) => kernel.compareBuildRecordRuns(b.run, a.run));
|
|
198
|
-
if (runs.length === 0) {throw new RecordRefused(member.repo, `${repository} has no build record for branch ${branch}`);}
|
|
199
|
-
return { repository, authority, client, runs };
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Prepare everything record verification needs (the declared pinned policy, the trusted cosign, the pinned trusted
|
|
204
|
-
* root, the registry clients and their credentials), hand it to `use`, and dispose of it. The injections are
|
|
205
|
-
* replaced by tests.
|
|
206
|
-
*/
|
|
207
|
-
export async function withRecordVerifier({ cosignBinary, env, loadKernel = loadKernelDistributionSchemas, ...pinned }, use) {
|
|
208
|
-
const dataRootRepositoryUrl = declaredDataRootRepositoryUrl();
|
|
209
|
-
return withPinnedCosign(
|
|
210
|
-
{ cosignBinary, env, ...pinned, afterPolicy: async () => ({ kernel: requireBuildRecordKernel(await loadKernel()) }) },
|
|
211
|
-
({ kernel, clientFor, runCosign, cosignEnvFor, trustedRootPath }) => use({ dataRootRepositoryUrl, kernel, clientFor, runCosign, cosignEnvFor, trustedRootPath }),
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/** The environment cosign runs with for one authority: the pinned base plus its declared credential (pinned-cosign.mjs). */
|
|
216
|
-
export { cosignEnvironment };
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { isRefusal } from './collected-refusals.mjs';
|
|
2
|
-
|
|
3
|
-
// develop-resolve-report — every refusal of one develop resolve, in one report.
|
|
4
|
-
//
|
|
5
|
-
// `xema edition develop resolve` runs a set of checks. A check that needs the output of another is a DEPENDENT of
|
|
6
|
-
// it; every other check is independent. The collector runs each check, records a refusal instead of throwing it, and
|
|
7
|
-
// skips (records as blocked) every check whose dependency was refused or blocked. `settle()` then throws ONE error whose
|
|
8
|
-
// message is the table, so an operator sees what to fix, and who owns each fix, after a single run. Nothing is
|
|
9
|
-
// downgraded: every refusal stays a refusal, and a run with a row writes nothing.
|
|
10
|
-
|
|
11
|
-
/** The checks of a develop resolve, in the order the report lists them. */
|
|
12
|
-
export const DevelopResolveCheck = Object.freeze({
|
|
13
|
-
EditionProtocol: 'edition-protocol',
|
|
14
|
-
DistributionLock: 'distribution-lock',
|
|
15
|
-
BundleSigner: 'bundle-signer',
|
|
16
|
-
PlaneInvariants: 'plane-invariants',
|
|
17
|
-
OperationAdmission: 'operation-admission',
|
|
18
|
-
AdapterBundles: 'adapter-bundles',
|
|
19
|
-
AuthorizationBase: 'authorization-base',
|
|
20
|
-
DevelopImages: 'develop-images',
|
|
21
|
-
EngineImage: 'engine-image',
|
|
22
|
-
ChartSet: 'chart-set',
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
/** Who fixes a refused check. */
|
|
26
|
-
export const ResolveCheckOwner = Object.freeze({
|
|
27
|
-
Producer: 'producer (the repository the refusal names)',
|
|
28
|
-
XemaCli: 'xema-cli',
|
|
29
|
-
EditionOwner: 'edition-owner (the repository that declares the edition)',
|
|
30
|
-
DeployOwner: 'deploy-owner (the repository that builds the engine and the charts)',
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
export const RESOLVE_CHECK_OWNERS = Object.freeze({
|
|
34
|
-
[DevelopResolveCheck.EditionProtocol]: ResolveCheckOwner.XemaCli,
|
|
35
|
-
[DevelopResolveCheck.DistributionLock]: ResolveCheckOwner.EditionOwner,
|
|
36
|
-
[DevelopResolveCheck.BundleSigner]: ResolveCheckOwner.EditionOwner,
|
|
37
|
-
[DevelopResolveCheck.PlaneInvariants]: ResolveCheckOwner.EditionOwner,
|
|
38
|
-
[DevelopResolveCheck.OperationAdmission]: ResolveCheckOwner.Producer,
|
|
39
|
-
[DevelopResolveCheck.AdapterBundles]: ResolveCheckOwner.Producer,
|
|
40
|
-
[DevelopResolveCheck.AuthorizationBase]: ResolveCheckOwner.EditionOwner,
|
|
41
|
-
[DevelopResolveCheck.DevelopImages]: ResolveCheckOwner.Producer,
|
|
42
|
-
[DevelopResolveCheck.EngineImage]: ResolveCheckOwner.DeployOwner,
|
|
43
|
-
[DevelopResolveCheck.ChartSet]: ResolveCheckOwner.DeployOwner,
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const C = DevelopResolveCheck;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* What each check needs verified before it runs: a check that consumes a predecessor's result is not run on the state a
|
|
50
|
-
* refused predecessor left behind, it is reported `blocked by` the refusal at the root.
|
|
51
|
-
* The checks that read the lock but consume no other check's verdict are independent of each other on purpose, so one run
|
|
52
|
-
* names all of them: the plane invariants (the graph), the operation admission (the lock's requirements) and the adapter
|
|
53
|
-
* bundles (the lock against the registry). The authorization base is composed from, and the images are hashed from, the
|
|
54
|
-
* lock AFTER those verified it. Chart set and engine image read only the pins.
|
|
55
|
-
*/
|
|
56
|
-
export const RESOLVE_CHECK_DEPENDENCIES = Object.freeze({
|
|
57
|
-
[C.EditionProtocol]: [],
|
|
58
|
-
[C.DistributionLock]: [C.EditionProtocol],
|
|
59
|
-
[C.BundleSigner]: [C.DistributionLock],
|
|
60
|
-
[C.PlaneInvariants]: [C.DistributionLock],
|
|
61
|
-
[C.OperationAdmission]: [C.DistributionLock],
|
|
62
|
-
[C.AdapterBundles]: [C.DistributionLock],
|
|
63
|
-
[C.AuthorizationBase]: [C.DistributionLock, C.BundleSigner, C.PlaneInvariants, C.OperationAdmission],
|
|
64
|
-
[C.DevelopImages]: [C.DistributionLock, C.BundleSigner, C.PlaneInvariants, C.OperationAdmission],
|
|
65
|
-
[C.EngineImage]: [],
|
|
66
|
-
[C.ChartSet]: [],
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
/** How a recorded check ended. */
|
|
70
|
-
export const ResolveRowStatus = Object.freeze({ Refused: 'refused', Blocked: 'blocked' });
|
|
71
|
-
|
|
72
|
-
/** What `run` returns for a check that did not produce a value: refused, or blocked by a dependency. */
|
|
73
|
-
export const BLOCKED = Symbol('develop-resolve-blocked');
|
|
74
|
-
|
|
75
|
-
const CHECK_ORDER = Object.values(DevelopResolveCheck);
|
|
76
|
-
const COLUMNS = Object.freeze(['CHECK', 'OWNER', 'STATUS', 'DETAIL']);
|
|
77
|
-
const DETAIL_INDENT = ' ';
|
|
78
|
-
|
|
79
|
-
const statusOf = (row) => (row.status === ResolveRowStatus.Blocked ? `blocked by ${row.blockedBy}` : ResolveRowStatus.Refused);
|
|
80
|
-
|
|
81
|
-
const NOTICE_HEADING = 'NOTICE: ungranted optional operations';
|
|
82
|
-
|
|
83
|
-
/** The notices as one section: never a refusal, so it is separate from the table. Empty when there are none. */
|
|
84
|
-
export const renderResolveNotices = (notices) =>
|
|
85
|
-
notices.length === 0 ? '' : [`${NOTICE_HEADING} (${notices.length})`, ...notices.map((notice) => `${DETAIL_INDENT}${notice}`)].join('\n');
|
|
86
|
-
|
|
87
|
-
/** The report rows as one plain-text table, in the order of {@link DevelopResolveCheck}; a multi-line detail is indented under its row. */
|
|
88
|
-
export function renderResolveReport(rows) {
|
|
89
|
-
const sorted = [...rows].sort((a, b) => CHECK_ORDER.indexOf(a.check) - CHECK_ORDER.indexOf(b.check));
|
|
90
|
-
const cells = sorted.map((row) => {
|
|
91
|
-
const [firstLine = '', ...more] = (row.detail ?? '').split('\n');
|
|
92
|
-
return { columns: [row.check, row.owner, statusOf(row), firstLine], more };
|
|
93
|
-
});
|
|
94
|
-
const widths = COLUMNS.slice(0, -1).map((name, i) => Math.max(name.length, ...cells.map((c) => c.columns[i].length)));
|
|
95
|
-
const line = (values) => [...values.slice(0, -1).map((v, i) => v.padEnd(widths[i])), values.at(-1)].join(' ').trimEnd();
|
|
96
|
-
const body = cells.flatMap(({ columns, more }) => [line(columns), ...more.map((m) => `${DETAIL_INDENT}${m}`.trimEnd())]);
|
|
97
|
-
return [`develop resolve refused: ${rows.length} check(s) did not pass; nothing was sealed or written`, line(COLUMNS), ...body].join('\n');
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** The one error of a develop resolve that had a refusal; `.rows` are the recorded rows, the message is the table. */
|
|
101
|
-
export class DevelopResolveRefusedError extends Error {
|
|
102
|
-
constructor(rows, notices = []) {
|
|
103
|
-
super([renderResolveReport(rows), renderResolveNotices(notices)].filter((part) => part !== '').join('\n\n'));
|
|
104
|
-
this.name = 'DevelopResolveRefusedError';
|
|
105
|
-
this.rows = rows;
|
|
106
|
-
this.notices = notices;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export function createResolveReport() {
|
|
111
|
-
const rows = [];
|
|
112
|
-
const byCheck = new Map();
|
|
113
|
-
const notices = [];
|
|
114
|
-
const record = (row) => {
|
|
115
|
-
rows.push(row);
|
|
116
|
-
byCheck.set(row.check, row);
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
rows,
|
|
121
|
-
notices,
|
|
122
|
-
/** Add one line to the NOTICE section; it never refuses and never changes the exit code. */
|
|
123
|
-
notice(line) {
|
|
124
|
-
notices.push(line);
|
|
125
|
-
},
|
|
126
|
-
/** The NOTICE section as text ('' when there is none). */
|
|
127
|
-
noticeText: () => renderResolveNotices(notices),
|
|
128
|
-
/**
|
|
129
|
-
* Run `fn` as `check`, unless a check it depends on was refused or blocked (it is then blocked by the root refusal).
|
|
130
|
-
* `classify(error)` may name another check the thrown error belongs to; that check is then the one refused,
|
|
131
|
-
* and `check` is blocked by it.
|
|
132
|
-
*/
|
|
133
|
-
async run(check, dependsOn, fn, { classify = () => check } = {}) {
|
|
134
|
-
const blocker = dependsOn.map((dependency) => byCheck.get(dependency)).find((row) => row !== undefined);
|
|
135
|
-
if (blocker !== undefined) {
|
|
136
|
-
// Always the refusal at the root: a check blocked by a blocked check names the check that was refused.
|
|
137
|
-
const blockedBy = blocker.status === ResolveRowStatus.Blocked ? blocker.blockedBy : blocker.check;
|
|
138
|
-
record({ check, owner: RESOLVE_CHECK_OWNERS[check], status: ResolveRowStatus.Blocked, blockedBy });
|
|
139
|
-
return BLOCKED;
|
|
140
|
-
}
|
|
141
|
-
try {
|
|
142
|
-
return await fn();
|
|
143
|
-
} catch (error) {
|
|
144
|
-
// A defect (a TypeError, a failed system call, a registry answering 5xx) is not a refusal: it propagates as thrown.
|
|
145
|
-
if (!isRefusal(error)) {throw error;}
|
|
146
|
-
const filedUnder = classify(error);
|
|
147
|
-
record({ check: filedUnder, owner: RESOLVE_CHECK_OWNERS[filedUnder], status: ResolveRowStatus.Refused, detail: error.message, error });
|
|
148
|
-
if (filedUnder !== check) {
|
|
149
|
-
record({ check, owner: RESOLVE_CHECK_OWNERS[check], status: ResolveRowStatus.Blocked, blockedBy: filedUnder });
|
|
150
|
-
}
|
|
151
|
-
return BLOCKED;
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
/** Throw the one error when any check was refused or blocked. */
|
|
155
|
-
settle() {
|
|
156
|
-
if (rows.length > 0) {throw new DevelopResolveRefusedError(rows, notices);}
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
// develop-select-records — the body of `xema edition develop select-records`.
|
|
2
|
-
//
|
|
3
|
-
// For every member of the develop graph, take the newest signed build record the data root's record workflow
|
|
4
|
-
// published for the branch, and write the snapshot it names: the commit to pin, the run it came from, and the
|
|
5
|
-
// images it built. A record is trusted only after cosign verified it, offline against the pinned trusted root,
|
|
6
|
-
// as signed by the data root's `record-build.yaml` at `refs/heads/<branch>`, called by the member's own
|
|
7
|
-
// repository at the record's own commit.
|
|
8
|
-
//
|
|
9
|
-
// "Newest" is the newest COMMIT on develop, never the highest run: every record of the branch is read and
|
|
10
|
-
// verified, the selected commit must equal or descend from every other record's commit (git ancestry, develop
|
|
11
|
-
// fetched from the member), and among that commit's records (re-runs of it) the highest run and attempt wins.
|
|
12
|
-
// With --published-pins <file> (a file this verb wrote; only .pins is read) a member's published commit is kept
|
|
13
|
-
// when the records are not ahead of it, and a diverged one is refused; without it the rule applies among the
|
|
14
|
-
// records only (part 07 passes the flag).
|
|
15
|
-
//
|
|
16
|
-
// The output also carries `behind: { <repo>: { head, commits } }`: develop's head and how many commits the selected
|
|
17
|
-
// commit trails it by, from the same fetch (0 when the record is the head). The verb prints one line per member, in
|
|
18
|
-
// repo order, after writing --out, formatted by develop-selection-line.mjs (`<short name>: record <commit>, <N> commits behind HEAD`,
|
|
19
|
-
// always `commits`, never singular; short name = the repo's last path segment, unambiguous across members).
|
|
20
|
-
//
|
|
21
|
-
// A member that declares a currentResolution (develop-current-resolution.mjs) is skipped, its registry never read; the
|
|
22
|
-
// selection lists it as `currentResolution: { <repo>: <ticket> }` and the verb prints `<short name>: current resolution
|
|
23
|
-
// (leaves the edition, <ticket>)` in its place. Every other member without a record still refuses.
|
|
24
|
-
//
|
|
25
|
-
// Every failure is a hard refusal naming the repository, and nothing is written. Two classes: `RecordRefused`
|
|
26
|
-
// (the record is missing, or cosign or the record itself says no) and a plain Error (the registry or cosign
|
|
27
|
-
// could not answer), which the operator retries rather than reads.
|
|
28
|
-
//
|
|
29
|
-
// Rollback residual: anyone who can delete registry tags can remove newer records, and select-records then pins
|
|
30
|
-
// the newest remaining valid one. The guard is deploy-latest's (part 07): its owner refuses a snapshot that goes
|
|
31
|
-
// backwards. This verb checks nothing against current pins.
|
|
32
|
-
|
|
33
|
-
import { writeOnce } from './customer-edition-verbs.mjs';
|
|
34
|
-
import { currentResolutionOf, keepsCurrentResolution } from './develop-current-resolution.mjs';
|
|
35
|
-
import { developGraphMembers } from './develop-graph.mjs';
|
|
36
|
-
import { PublishedRecordMissingError, newestCommitOnDevelop } from './develop-record-ancestry.mjs';
|
|
37
|
-
import {
|
|
38
|
-
cosignEnvironment,
|
|
39
|
-
listBuildRecordRuns,
|
|
40
|
-
loadVerifiedRecord,
|
|
41
|
-
recordSignerOrigin,
|
|
42
|
-
requireBuildRecordKernel,
|
|
43
|
-
withRecordVerifier,
|
|
44
|
-
} from './develop-record-verify.mjs';
|
|
45
|
-
import { assertShortNamesUnambiguous, formatSelectionLine } from './develop-selection-line.mjs';
|
|
46
|
-
import { readSelectionPins } from './develop-selection-pins.mjs';
|
|
47
|
-
import { editionWorkspaceConfig } from './edition-config.mjs';
|
|
48
|
-
import { compareStrings } from './lib.mjs';
|
|
49
|
-
import { RecordRefused } from './record-refused.mjs';
|
|
50
|
-
|
|
51
|
-
// The record-verification names this verb's tests and callers read from here, owned by the shared core.
|
|
52
|
-
export {
|
|
53
|
-
DataRootRepositoryUndeclaredError,
|
|
54
|
-
KernelLacksBuildRecordSchemaError,
|
|
55
|
-
UnknownBuildRecordProducerError,
|
|
56
|
-
declaredDataRootRepositoryUrl,
|
|
57
|
-
recordSigner,
|
|
58
|
-
} from './develop-record-verify.mjs';
|
|
59
|
-
|
|
60
|
-
const ISO_UTC = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* @param {object} request
|
|
64
|
-
* @param {string} request.branch
|
|
65
|
-
* @param {string} request.registry the registry root, e.g. `registry.example.com/acme`
|
|
66
|
-
* @param {string} [request.at] ISO-8601 UTC: the newest record completed at or before it
|
|
67
|
-
* @param {readonly {repo: string, repositoryUrl: string}[]} request.members
|
|
68
|
-
* @param {string|undefined} request.dataRootRepositoryUrl
|
|
69
|
-
* @param {object} request.kernel the kernel's distribution exports
|
|
70
|
-
* @param {(authority: string) => object} request.clientFor registry client of an authority
|
|
71
|
-
* @param {(args: string[], env: object) => Promise<{code: number, stdout: string, stderr: string}>} request.runCosign
|
|
72
|
-
* @param {(authority: string) => object} request.cosignEnvFor
|
|
73
|
-
* @param {string} request.trustedRootPath
|
|
74
|
-
* @param {Record<string, string>} [request.publishedPins] member repo -> the commit already published (--published-pins)
|
|
75
|
-
* @param {object} request.workspace the workspace config the source hold reads
|
|
76
|
-
* @param {object} request.env
|
|
77
|
-
* @param {Function} [request.runGit] replaced by tests
|
|
78
|
-
* @returns {Promise<{pins: object, snapshot: object, behind: object, images: object[], currentResolution: object}>}
|
|
79
|
-
*/
|
|
80
|
-
export async function selectRecords({ branch, registry, at, members, dataRootRepositoryUrl, kernel, clientFor, runCosign, cosignEnvFor, trustedRootPath, publishedPins, workspace, env, runGit }) {
|
|
81
|
-
requireBuildRecordKernel(kernel);
|
|
82
|
-
assertShortNamesUnambiguous(members);
|
|
83
|
-
recordSignerOrigin({ branch, dataRootRepositoryUrl });
|
|
84
|
-
if (at !== undefined && (!ISO_UTC.test(at) || Number.isNaN(Date.parse(at)))) {
|
|
85
|
-
throw new Error(`--at must be an ISO-8601 UTC time (YYYY-MM-DDTHH:MM:SSZ); got ${JSON.stringify(at)}`);
|
|
86
|
-
}
|
|
87
|
-
const selected = [];
|
|
88
|
-
for (const member of members) {
|
|
89
|
-
// the one declared exception (develop-current-resolution.mjs): no registry read, no record
|
|
90
|
-
if (keepsCurrentResolution(member)) {continue;}
|
|
91
|
-
const { repository, authority, client, runs } = await listBuildRecordRuns({ kernel, clientFor, registry, member, branch });
|
|
92
|
-
// EVERY candidate is read and verified; any that fails refuses the run. None is skipped.
|
|
93
|
-
const verified = [];
|
|
94
|
-
for (const { tag, run } of runs) {
|
|
95
|
-
const loaded = await loadVerifiedRecord({
|
|
96
|
-
kernel, client, runCosign, cosignEnv: cosignEnvironment(cosignEnvFor, authority), trustedRootPath,
|
|
97
|
-
repository, member, branch, dataRootRepositoryUrl, tag,
|
|
98
|
-
});
|
|
99
|
-
verified.push({ tag, run, ...loaded });
|
|
100
|
-
}
|
|
101
|
-
const eligible = at === undefined ? verified : verified.filter(({ record }) => Date.parse(record.completedAt) <= Date.parse(at));
|
|
102
|
-
if (eligible.length === 0) {throw new RecordRefused(member.repo, `no build record for branch ${branch} completed at or before ${at}`);}
|
|
103
|
-
const published = publishedPins?.[member.repo];
|
|
104
|
-
const { commit, head, behind } = newestCommitOnDevelop({
|
|
105
|
-
member, candidates: eligible.map(({ record, tag }) => ({ commit: record.commit, tag })), published, workspace, env, runGit,
|
|
106
|
-
});
|
|
107
|
-
// records of one commit are re-runs of it: the highest run, then attempt
|
|
108
|
-
const ofCommitIn = (pool) => pool.filter(({ record }) => record.commit === commit).sort((a, b) => kernel.compareBuildRecordRuns(b.run, a.run));
|
|
109
|
-
// a kept published commit may be one --at left out of the eligible records: its own verified record stands
|
|
110
|
-
const ofCommit = ofCommitIn(eligible).length > 0 ? ofCommitIn(eligible) : ofCommitIn(verified);
|
|
111
|
-
if (ofCommit.length === 0) {throw new PublishedRecordMissingError(member.repo, commit);}
|
|
112
|
-
const chosen = ofCommit[0];
|
|
113
|
-
selected.push({ member, head, behind, ...chosen });
|
|
114
|
-
}
|
|
115
|
-
return { ...composeSelection(selected), currentResolution: currentResolutionOf(members) };
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/** The snapshot a selection writes. A name built by two records is refused: an image has one builder. */
|
|
119
|
-
export function composeSelection(selected) {
|
|
120
|
-
const pins = {};
|
|
121
|
-
const snapshot = {};
|
|
122
|
-
const behind = {};
|
|
123
|
-
const owners = new Map();
|
|
124
|
-
const images = [];
|
|
125
|
-
for (const { member, record, snapshot: run, head, behind: commits } of selected) {
|
|
126
|
-
pins[member.repo] = record.commit;
|
|
127
|
-
behind[member.repo] = { head, commits };
|
|
128
|
-
snapshot[member.repo] = run;
|
|
129
|
-
for (const image of record.images) {
|
|
130
|
-
if (owners.has(image.name)) {
|
|
131
|
-
throw new RecordRefused(member.repo, `image ${image.name} is also built by ${owners.get(image.name)}; an image has one builder`);
|
|
132
|
-
}
|
|
133
|
-
owners.set(image.name, member.repo);
|
|
134
|
-
images.push({ name: image.name, digest: image.digest, contentHash: image.contentHash, member: member.repo, ...(image.members === undefined ? {} : { members: image.members }) });
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
const sorted = (object) => Object.fromEntries(Object.entries(object).sort(([a], [b]) => compareStrings(a, b)));
|
|
138
|
-
return { pins: sorted(pins), snapshot: sorted(snapshot), behind: sorted(behind), images: images.sort((a, b) => compareStrings(a.name, b.name)) };
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/** The `pins` of a file this verb wrote: member repo -> 40-hex commit. Nothing else of the file is read. */
|
|
142
|
-
export const readPublishedPins = (path) => readSelectionPins(path, '--published-pins');
|
|
143
|
-
|
|
144
|
-
/** The `select-records` verb. Writes `--out` once, only after every member was selected. */
|
|
145
|
-
export async function runSelectRecords({
|
|
146
|
-
options,
|
|
147
|
-
env = process.env,
|
|
148
|
-
members = developGraphMembers(),
|
|
149
|
-
runGit,
|
|
150
|
-
write = writeOnce,
|
|
151
|
-
print = (text) => process.stdout.write(text),
|
|
152
|
-
...verifierInjections
|
|
153
|
-
}) {
|
|
154
|
-
return withRecordVerifier({ cosignBinary: options['--cosign'], env, ...verifierInjections }, async (verifier) => {
|
|
155
|
-
const selection = await selectRecords({
|
|
156
|
-
branch: options['--branch'],
|
|
157
|
-
registry: options['--registry'],
|
|
158
|
-
at: options['--at'],
|
|
159
|
-
members,
|
|
160
|
-
...verifier,
|
|
161
|
-
publishedPins: options['--published-pins'] === undefined ? undefined : readPublishedPins(options['--published-pins']),
|
|
162
|
-
workspace: editionWorkspaceConfig(),
|
|
163
|
-
env,
|
|
164
|
-
runGit,
|
|
165
|
-
});
|
|
166
|
-
write(options['--out'], selection);
|
|
167
|
-
for (const member of members) {
|
|
168
|
-
print(`${formatSelectionLine(member, selection)}\n`);
|
|
169
|
-
}
|
|
170
|
-
return selection;
|
|
171
|
-
});
|
|
172
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// develop-selection-line — the one stdout line `select-records` prints per member, and the check that lines are unambiguous.
|
|
2
|
-
//
|
|
3
|
-
// <short name>: record <40-hex commit>, <N> commits behind HEAD
|
|
4
|
-
// <short name>: current resolution (leaves the edition, <ticket>)
|
|
5
|
-
//
|
|
6
|
-
// The short name is the repo handle's last path segment. The develop-edition workflow in xema-distributions
|
|
7
|
-
// (develop-edition.yaml) parses these lines with the same pattern; change both together.
|
|
8
|
-
|
|
9
|
-
import { keepsCurrentResolution } from './develop-current-resolution.mjs';
|
|
10
|
-
|
|
11
|
-
export const shortNameOf = (repo) => repo.split('/').at(-1);
|
|
12
|
-
|
|
13
|
-
/** One graph member's line (no newline): its current-resolution line, or its record, commit and distance from develop HEAD. */
|
|
14
|
-
export function formatSelectionLine(member, selection) {
|
|
15
|
-
const { repo } = member;
|
|
16
|
-
if (keepsCurrentResolution(member)) {
|
|
17
|
-
return `${shortNameOf(repo)}: current resolution (leaves the edition, ${member.currentResolution})`;
|
|
18
|
-
}
|
|
19
|
-
return `${shortNameOf(repo)}: record ${selection.pins[repo]}, ${selection.behind[repo].commits} commits behind HEAD`;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** Two members with one short name would print indistinguishable lines: refused by name. */
|
|
23
|
-
export function assertShortNamesUnambiguous(members) {
|
|
24
|
-
const seen = new Map();
|
|
25
|
-
for (const { repo } of members) {
|
|
26
|
-
const name = shortNameOf(repo);
|
|
27
|
-
if (seen.has(name)) {throw new Error(`select-records: members ${seen.get(name)} and ${repo} share the short name "${name}"; the printed lines would be ambiguous`);}
|
|
28
|
-
seen.set(name, repo);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// develop-selection-pins — the `pins` of a file `select-records` wrote: member repo -> 40-hex commit. Nothing else of
|
|
2
|
-
// the file is read here. `flag` names the option the file came in on (--published-pins, --member-pins), for the refusal.
|
|
3
|
-
|
|
4
|
-
import { currentResolutionProblem } from './develop-current-resolution.mjs';
|
|
5
|
-
import { readStrictJsonFile } from './strict-json.mjs';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @param {readonly {repo: string}[]} [members] when given, the file's `currentResolution` must also be exactly
|
|
9
|
-
* what these graph members declare (develop-current-resolution.mjs)
|
|
10
|
-
* @returns {Record<string, string>} the file's `pins`, each a 40-hex commit
|
|
11
|
-
*/
|
|
12
|
-
export const readSelectionPins = (path, flag, members) => parseSelectionPins(readStrictJsonFile(path), path, flag, members);
|
|
13
|
-
|
|
14
|
-
/** The same over a document already read: the ONE validation of a selection's `pins` (and `currentResolution`). */
|
|
15
|
-
export function parseSelectionPins(document, path, flag, members) {
|
|
16
|
-
const { pins } = document ?? {};
|
|
17
|
-
if (pins === null || typeof pins !== 'object' || Array.isArray(pins)) {
|
|
18
|
-
throw new Error(`${flag} ${path} has no "pins" object`);
|
|
19
|
-
}
|
|
20
|
-
assertCommitPins(pins, `${flag} ${path}`);
|
|
21
|
-
if (members !== undefined) {
|
|
22
|
-
const problem = currentResolutionProblem(document.currentResolution, members);
|
|
23
|
-
if (problem !== null) {throw new Error(`${flag} ${path}: ${problem}`);}
|
|
24
|
-
}
|
|
25
|
-
return pins;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** A pin map's every value is a 40-hex commit (a selection's pins, follow's --current-pins); returns it. `label` names the input. */
|
|
29
|
-
export function assertCommitPins(pins, label) {
|
|
30
|
-
for (const [key, commit] of Object.entries(pins)) {
|
|
31
|
-
if (typeof commit !== 'string' || !/^[0-9a-f]{40}$/.test(commit)) {
|
|
32
|
-
throw new Error(`${label}: pin ${JSON.stringify(key)} is not a 40-hex commit: ${JSON.stringify(commit)}`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return pins;
|
|
36
|
-
}
|