@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,82 +0,0 @@
|
|
|
1
|
-
// Canonical evidence JSON, exact UTF-8 and sha256 digests: the primitives every evidence module shares. Its own module so a
|
|
2
|
-
// module `image-evidence.mjs` imports (the third-party pin loader) can use them without an import cycle.
|
|
3
|
-
|
|
4
|
-
import { createHash } from 'node:crypto';
|
|
5
|
-
|
|
6
|
-
import { compareStrings } from './lib.mjs';
|
|
7
|
-
|
|
8
|
-
const STRICT_UTF8 = new TextDecoder('utf-8', {
|
|
9
|
-
fatal: true,
|
|
10
|
-
ignoreBOM: true,
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
export function canonicalJson(value) {
|
|
14
|
-
if (
|
|
15
|
-
value === null ||
|
|
16
|
-
typeof value === 'boolean' ||
|
|
17
|
-
typeof value === 'string'
|
|
18
|
-
) {
|
|
19
|
-
return JSON.stringify(value);
|
|
20
|
-
}
|
|
21
|
-
if (typeof value === 'number') {
|
|
22
|
-
if (!Number.isSafeInteger(value)) {
|
|
23
|
-
throw new Error('canonical evidence JSON permits only safe integers');
|
|
24
|
-
}
|
|
25
|
-
return JSON.stringify(value);
|
|
26
|
-
}
|
|
27
|
-
if (Array.isArray(value)) {
|
|
28
|
-
return `[${value.map(canonicalJson).join(',')}]`;
|
|
29
|
-
}
|
|
30
|
-
if (typeof value === 'object') {
|
|
31
|
-
const entries = Object.entries(value).sort(([left], [right]) =>
|
|
32
|
-
compareStrings(left, right),
|
|
33
|
-
);
|
|
34
|
-
return `{${entries
|
|
35
|
-
.map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`)
|
|
36
|
-
.join(',')}}`;
|
|
37
|
-
}
|
|
38
|
-
throw new Error(`unsupported canonical evidence JSON value ${typeof value}`);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function canonicalJsonBytes(value) {
|
|
42
|
-
return Buffer.from(`${canonicalJson(value)}\n`, 'utf8');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function sha256Digest(bytes) {
|
|
46
|
-
return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Exact UTF-8 decode. Exported because the producers need byte-for-byte the
|
|
51
|
-
* same strictness the verifier applies — a producer that accepts bytes the
|
|
52
|
-
* verifier will reject signs evidence that can never verify.
|
|
53
|
-
*/
|
|
54
|
-
export function decodeExactUtf8(bytes, label) {
|
|
55
|
-
let text;
|
|
56
|
-
try {
|
|
57
|
-
text = STRICT_UTF8.decode(bytes);
|
|
58
|
-
} catch {
|
|
59
|
-
throw new Error(`${label} contains invalid UTF-8`);
|
|
60
|
-
}
|
|
61
|
-
if (!Buffer.from(text, 'utf8').equals(bytes)) {
|
|
62
|
-
throw new Error(`${label} is not exact UTF-8`);
|
|
63
|
-
}
|
|
64
|
-
return text;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function parseCanonicalJsonBytes(bytes, label) {
|
|
68
|
-
const text = decodeExactUtf8(bytes, label);
|
|
69
|
-
let value;
|
|
70
|
-
try {
|
|
71
|
-
value = JSON.parse(text);
|
|
72
|
-
} catch (error) {
|
|
73
|
-
throw new Error(`${label} is not valid JSON: ${error.message}`);
|
|
74
|
-
}
|
|
75
|
-
const canonical = canonicalJsonBytes(value);
|
|
76
|
-
if (!bytes.equals(canonical)) {
|
|
77
|
-
throw new Error(
|
|
78
|
-
`${label} is not canonical JSON (duplicate keys, non-canonical ordering, or whitespace are refused)`,
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
return value;
|
|
82
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
// The canonical form of a public HTTPS repository URL, and the refusals that
|
|
2
|
-
// define it. Leaf module: the workspace config and the git source hold read it
|
|
3
|
-
// without importing the edition library.
|
|
4
|
-
|
|
5
|
-
export function canonicalPublicHttpsRepositoryUrl(raw, context) {
|
|
6
|
-
if (typeof raw !== 'string' || raw.length === 0 || raw.trim() !== raw) {
|
|
7
|
-
throw new Error(`${context} must be a non-empty canonical HTTPS URL`);
|
|
8
|
-
}
|
|
9
|
-
let parsed;
|
|
10
|
-
try {
|
|
11
|
-
parsed = new URL(raw);
|
|
12
|
-
} catch {
|
|
13
|
-
throw new Error(`${context} is not a valid URL`);
|
|
14
|
-
}
|
|
15
|
-
if (parsed.protocol !== 'https:') {
|
|
16
|
-
throw new Error(`${context} must use HTTPS`);
|
|
17
|
-
}
|
|
18
|
-
if (parsed.username.length > 0 || parsed.password.length > 0) {
|
|
19
|
-
throw new Error(
|
|
20
|
-
`${context} must not contain username/password credentials`,
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
if (
|
|
24
|
-
parsed.search.length > 0 ||
|
|
25
|
-
parsed.hash.length > 0 ||
|
|
26
|
-
raw.includes('?') ||
|
|
27
|
-
raw.includes('#')
|
|
28
|
-
) {
|
|
29
|
-
throw new Error(`${context} must not contain a query or fragment`);
|
|
30
|
-
}
|
|
31
|
-
if (parsed.hostname.length === 0) {
|
|
32
|
-
throw new Error(`${context} must identify a repository host`);
|
|
33
|
-
}
|
|
34
|
-
return parsed.toString();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* The `owner/name` of a canonical public HTTPS repository URL (`https://host/owner/name[.git]`): exactly two
|
|
39
|
-
* path segments, the optional `.git` suffix dropped. Anything else is refused, naming `context`.
|
|
40
|
-
*/
|
|
41
|
-
export function repositoryOwnerName(canonicalUrl, context) {
|
|
42
|
-
const segments = new URL(canonicalUrl).pathname.replace(/\.git$/, '').split('/').filter((segment) => segment.length > 0);
|
|
43
|
-
if (segments.length !== 2) {
|
|
44
|
-
throw new Error(`${context} must name exactly <owner>/<name> on its host; got ${JSON.stringify(canonicalUrl)}`);
|
|
45
|
-
}
|
|
46
|
-
return segments.join('/');
|
|
47
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// catalogue-edition — write the catalogue of a RELEASE offering from its committed, sealed locks.
|
|
3
|
-
//
|
|
4
|
-
// catalogue <id> --out <dir>
|
|
5
|
-
//
|
|
6
|
-
// Writes <dir>/catalogue.json (catalogue.mjs). `xema edition artifact` writes the
|
|
7
|
-
// same file into the offering artifact; this verb is for inspecting it or
|
|
8
|
-
// publishing it on its own.
|
|
9
|
-
|
|
10
|
-
import { mkdirSync } from 'node:fs';
|
|
11
|
-
import { resolve } from 'node:path';
|
|
12
|
-
|
|
13
|
-
import { writeCatalogue } from './catalogue.mjs';
|
|
14
|
-
import { assertCanonicalDistributionId } from './distribution-paths.mjs';
|
|
15
|
-
import {
|
|
16
|
-
WorkspaceRoot,
|
|
17
|
-
configureEditionWorkspaceFromProcess,
|
|
18
|
-
isEntryModule,
|
|
19
|
-
} from './edition-workspace.mjs';
|
|
20
|
-
import { releaseCatalogue } from './release-catalogue.mjs';
|
|
21
|
-
import { readCommittedEdition } from './release-edition-artifact.mjs';
|
|
22
|
-
|
|
23
|
-
if (isEntryModule(import.meta.url)) {
|
|
24
|
-
configureEditionWorkspaceFromProcess([WorkspaceRoot.Data, WorkspaceRoot.Editions, WorkspaceRoot.Sources, WorkspaceRoot.Kernel]);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** `{ id, out }` of `<distribution-id> --out <dir>` (the argv AFTER the `catalogue` verb, which the edition dispatcher has already stripped); anything else is the usage error. */
|
|
28
|
-
export function parseCatalogueArgs(argv) {
|
|
29
|
-
const [id, flag, out, ...extra] = argv;
|
|
30
|
-
if (id === undefined || flag !== '--out' || out === undefined || out.startsWith('--') || extra.length > 0) {
|
|
31
|
-
throw new Error('usage: xema edition catalogue <distribution-id> --out <dir>');
|
|
32
|
-
}
|
|
33
|
-
assertCanonicalDistributionId(id);
|
|
34
|
-
return { id, out };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function run(argv) {
|
|
38
|
-
const { id, out } = parseCatalogueArgs(argv);
|
|
39
|
-
const dir = resolve(out);
|
|
40
|
-
mkdirSync(dir, { recursive: true });
|
|
41
|
-
console.log(writeCatalogue(dir, await releaseCatalogue(id, await readCommittedEdition(id))));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (isEntryModule(import.meta.url)) {
|
|
45
|
-
run(process.argv.slice(2)).catch((error) => {
|
|
46
|
-
console.error(`[edition-catalogue] ${error.message}`);
|
|
47
|
-
process.exit(1);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
// catalogue-evidence — the catalogue's signed E4 evidence, verified BEFORE the catalogue is read.
|
|
2
|
-
//
|
|
3
|
-
// A release catalogue is the ceiling of everything resolved against it, so its bytes are not parsed, and not even
|
|
4
|
-
// fetched, until the E4 statement over its digest, catalogue layer and lock layer has been verified against the evidence
|
|
5
|
-
// trust policy of the CALLER'S OWN data root (never the vendor's). The statement is an `oras attach` referrer of the
|
|
6
|
-
// edition artifact digest (`EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE`): two layers, `statement.json` (in-toto) and
|
|
7
|
-
// `bundle.sigstore.json` (the Sigstore bundle), and the exact commit of the signing workflow as an annotation.
|
|
8
|
-
//
|
|
9
|
-
// The verification is ONE seam, `verifyCatalogueEvidenceReferrer`, and it is done by the data root's PINNED built
|
|
10
|
-
// verifier (`catalogue-evidence verify`, verify-catalogue-evidence.mjs): there is no second verifier. The only
|
|
11
|
-
// kernel-dependent parts of the judgement are the policy schema (parseSigstoreOfflineTrustPolicy) and the
|
|
12
|
-
// predicate-type/channel constants; before the catalogue's kernel is adopted (kernel-package.mjs) there is no kernel
|
|
13
|
-
// package to load them from, so they come from the pinned bundle's own embedded kernel. The library never judges the
|
|
14
|
-
// statement itself: it checks the referrer's layout, hands the two blobs to the bundle (only after the bundle's digests
|
|
15
|
-
// equal the data-root pin; otherwise CatalogueVerifierNotPinnedError, before anything is spawned) and reads its verdict.
|
|
16
|
-
|
|
17
|
-
import { spawnSync } from 'node:child_process';
|
|
18
|
-
import { createHash } from 'node:crypto';
|
|
19
|
-
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
20
|
-
import { tmpdir } from 'node:os';
|
|
21
|
-
import { join } from 'node:path';
|
|
22
|
-
|
|
23
|
-
import { locateBuiltVerifier, readBuiltVerifierDigests } from './built-verifier.mjs';
|
|
24
|
-
import { editionWorkspaceConfig } from './edition-config.mjs';
|
|
25
|
-
import { dataRoot as configuredDataRoot } from './edition-workspace.mjs';
|
|
26
|
-
import { assertPinnedVerifier, readEvidenceTrustPin } from './evidence-trust-pin.mjs';
|
|
27
|
-
import { EvidenceTrustRequiredError } from './evidence-trust-policy.mjs';
|
|
28
|
-
import { EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE } from './oci-image-source-evidence.mjs';
|
|
29
|
-
import { BUNDLE_MEDIA_TYPE } from './sigstore-bundle-media-type.mjs';
|
|
30
|
-
|
|
31
|
-
const TITLE = 'org.opencontainers.image.title';
|
|
32
|
-
/** The titles of the two layers of an E4 referrer, the in-toto statement's media type and the annotation naming the signing workflow commit. */
|
|
33
|
-
export const CATALOGUE_EVIDENCE_STATEMENT_TITLE = 'statement.json';
|
|
34
|
-
export const CATALOGUE_EVIDENCE_BUNDLE_TITLE = 'bundle.sigstore.json';
|
|
35
|
-
export const CATALOGUE_EVIDENCE_STATEMENT_MEDIA_TYPE = 'application/vnd.in-toto+json';
|
|
36
|
-
export const CATALOGUE_EVIDENCE_WORKFLOW_SHA_ANNOTATION = 'dev.xema.evidence.signer-workflow-sha';
|
|
37
|
-
/** The variables the pinned verifier bundle is launched with (it refuses NODE_OPTIONS, NODE_PATH, DYLD_*, LD_*, GIT_*). */
|
|
38
|
-
export const VERIFIER_LAUNCH_ENV_KEYS = Object.freeze(['PATH', 'HOME', 'TMPDIR', 'LANG', 'LC_ALL', 'TZ']);
|
|
39
|
-
const STATEMENT_MAX_BYTES = 2 * 1024 * 1024;
|
|
40
|
-
const BUNDLE_MAX_BYTES = 16 * 1024 * 1024;
|
|
41
|
-
const SPAWN_TIMEOUT_MS = 120_000;
|
|
42
|
-
const COMMIT = /^[a-f0-9]{40}$/;
|
|
43
|
-
const sha256Of = (bytes) => `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
|
|
44
|
-
|
|
45
|
-
/** No E4 referrer is attached to the artifact: the catalogue has no signed evidence at all. */
|
|
46
|
-
export class CatalogueEvidenceMissingError extends Error {
|
|
47
|
-
constructor(ref) {
|
|
48
|
-
super(
|
|
49
|
-
`${ref} carries no ${EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE} referrer: its catalogue has no signed edition evidence (E4), ` +
|
|
50
|
-
'so it is refused before it is read',
|
|
51
|
-
);
|
|
52
|
-
this.name = 'CatalogueEvidenceMissingError';
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** An E4 referrer exists but does not verify against the caller's evidence trust policy. */
|
|
57
|
-
export class CatalogueEvidenceNotVerifiedError extends Error {
|
|
58
|
-
constructor(ref, reason) {
|
|
59
|
-
super(`${ref}: the catalogue's edition evidence (E4) is not verified: ${reason}; the catalogue is refused before it is read`);
|
|
60
|
-
this.name = 'CatalogueEvidenceNotVerifiedError';
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** The built verifier is not the one the data root pins (or is missing): nothing is spawned. */
|
|
65
|
-
export class CatalogueVerifierNotPinnedError extends Error {
|
|
66
|
-
constructor(reason) {
|
|
67
|
-
super(`the catalogue's edition evidence (E4) cannot be verified: this CLI's built evidence verifier is not the one the data root pins: ${reason}`);
|
|
68
|
-
this.name = 'CatalogueVerifierNotPinnedError';
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/** The edition a catalogue-consumer refusal names: the customer edition of `channel` that reads the catalogue. */
|
|
73
|
-
const catalogueConsumer = (channel) => ({ edition: `${channel} edition`, channel });
|
|
74
|
-
|
|
75
|
-
/** The pinned built verifier's bundle path, after the data root's pin of it held; refuses before anything is spawned. */
|
|
76
|
-
function pinnedVerifierBundle(locateVerifier, channel) {
|
|
77
|
-
const declaration = editionWorkspaceConfig().evidenceTrustPolicy;
|
|
78
|
-
const root = configuredDataRoot();
|
|
79
|
-
if (declaration.policy === null) {throw new EvidenceTrustRequiredError(root, 'declares no policy', catalogueConsumer(channel));}
|
|
80
|
-
try {
|
|
81
|
-
const pin = readEvidenceTrustPin({ dataRoot: root, declaration });
|
|
82
|
-
assertPinnedVerifier({ pin, actual: readBuiltVerifierDigests(locateVerifier) });
|
|
83
|
-
return { bundlePath: locateVerifier().bundlePath, root };
|
|
84
|
-
} catch (error) {
|
|
85
|
-
throw new CatalogueVerifierNotPinnedError(error.message);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function launchEnvironment(source = process.env) {
|
|
90
|
-
const reduced = {};
|
|
91
|
-
for (const key of VERIFIER_LAUNCH_ENV_KEYS) {
|
|
92
|
-
if (source[key] !== undefined) {reduced[key] = source[key];}
|
|
93
|
-
}
|
|
94
|
-
return reduced;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function runVerifier({ spawn, bundlePath, args }) {
|
|
98
|
-
return spawn(process.execPath, [bundlePath, 'catalogue-evidence', ...args], {
|
|
99
|
-
encoding: 'utf8',
|
|
100
|
-
env: launchEnvironment(),
|
|
101
|
-
timeout: SPAWN_TIMEOUT_MS,
|
|
102
|
-
maxBuffer: 1024 * 1024,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const stderrOf = (result) => String(result.stderr ?? '').trim() || (result.error ? result.error.message : `exit ${String(result.status)}`);
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Before any registry call: the caller's data root declares a policy, the built verifier is the one the pin records, and
|
|
110
|
-
* the policy is ARMED on `channel` with the E4 row required (the one arming rule, judged by the pinned bundle with its own
|
|
111
|
-
* kernel). Throws EvidenceTrustRequiredError for no policy / not armed, CatalogueVerifierNotPinnedError for a verifier the
|
|
112
|
-
* pin does not record.
|
|
113
|
-
*
|
|
114
|
-
* @param {{ channel: string, locateVerifier?: Function, spawn?: Function }} options
|
|
115
|
-
*/
|
|
116
|
-
export function assertCatalogueConsumerArmed({ channel, locateVerifier = locateBuiltVerifier, spawn = spawnSync }) {
|
|
117
|
-
const { bundlePath, root } = pinnedVerifierBundle(locateVerifier, channel);
|
|
118
|
-
const result = runVerifier({ spawn, bundlePath, args: ['arming', '--channel', channel, '--data-root', root] });
|
|
119
|
-
if (result.status === 0) {return;}
|
|
120
|
-
const stderr = stderrOf(result);
|
|
121
|
-
if (stderr.includes('EVIDENCE_TRUST_REQUIRED_UNARMED')) {
|
|
122
|
-
throw new EvidenceTrustRequiredError(root, `declares a policy that is not armed on the ${channel} channel for a catalogue consumer (${stderr})`, catalogueConsumer(channel));
|
|
123
|
-
}
|
|
124
|
-
throw new CatalogueEvidenceNotVerifiedError(`the ${channel} catalogue`, `the arming check failed: ${stderr}`);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function layerOf(layers, title, mediaType, ref) {
|
|
128
|
-
const found = layers.filter((layer) => layer?.annotations?.[TITLE] === title);
|
|
129
|
-
if (found.length !== 1 || found[0].mediaType !== mediaType || typeof found[0].digest !== 'string') {
|
|
130
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, `the referrer must carry exactly one ${title} layer of media type ${mediaType}`);
|
|
131
|
-
}
|
|
132
|
-
return found[0];
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async function readReferrerLayers({ client, repository, referrer, manifestDigest, ref }) {
|
|
136
|
-
const manifest = await client.getManifestByDigest(repository, referrer.digest);
|
|
137
|
-
const document = manifest.document ?? {};
|
|
138
|
-
if (document.artifactType !== EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE) {
|
|
139
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, `referrer ${referrer.digest} is not a ${EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE} artifact`);
|
|
140
|
-
}
|
|
141
|
-
if (document.subject?.digest !== manifestDigest) {
|
|
142
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, `referrer ${referrer.digest} is a referrer of ${String(document.subject?.digest)}, not of ${manifestDigest}`);
|
|
143
|
-
}
|
|
144
|
-
const layers = Array.isArray(document.layers) ? document.layers : [];
|
|
145
|
-
if (layers.length !== 2) {
|
|
146
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, `referrer ${referrer.digest} must carry exactly two layers (${CATALOGUE_EVIDENCE_STATEMENT_TITLE}, ${CATALOGUE_EVIDENCE_BUNDLE_TITLE}), it carries ${layers.length}`);
|
|
147
|
-
}
|
|
148
|
-
const statement = layerOf(layers, CATALOGUE_EVIDENCE_STATEMENT_TITLE, CATALOGUE_EVIDENCE_STATEMENT_MEDIA_TYPE, ref);
|
|
149
|
-
const bundle = layerOf(layers, CATALOGUE_EVIDENCE_BUNDLE_TITLE, BUNDLE_MEDIA_TYPE, ref);
|
|
150
|
-
const workflowSha = document.annotations?.[CATALOGUE_EVIDENCE_WORKFLOW_SHA_ANNOTATION];
|
|
151
|
-
if (typeof workflowSha !== 'string' || !COMMIT.test(workflowSha)) {
|
|
152
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, `referrer ${referrer.digest} states no 40-hex ${CATALOGUE_EVIDENCE_WORKFLOW_SHA_ANNOTATION} annotation`);
|
|
153
|
-
}
|
|
154
|
-
return { statement, bundle, workflowSha };
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* The seam. Hold one E4 referrer to the caller's policy and to the exact catalogue and lock layers: read its two layers
|
|
159
|
-
* (bounded) into a private temporary directory and have the PINNED built verifier judge them. Throws when it does not
|
|
160
|
-
* verify, returns when it does. The verifier's pin is re-checked here, before anything is spawned.
|
|
161
|
-
*
|
|
162
|
-
* @param {{ ref: string, client: object, repository: string, referrer: object, channel: string, offeringId: string, manifestDigest: string, catalogueLayerDigest: string, lockLayerDigest: string, cosign: string, locateVerifier?: Function, spawn?: Function }} subject
|
|
163
|
-
*/
|
|
164
|
-
export async function verifyCatalogueEvidenceReferrer({
|
|
165
|
-
ref,
|
|
166
|
-
client,
|
|
167
|
-
repository,
|
|
168
|
-
referrer,
|
|
169
|
-
channel,
|
|
170
|
-
offeringId,
|
|
171
|
-
manifestDigest,
|
|
172
|
-
catalogueLayerDigest,
|
|
173
|
-
lockLayerDigest,
|
|
174
|
-
cosign,
|
|
175
|
-
locateVerifier = locateBuiltVerifier,
|
|
176
|
-
spawn = spawnSync,
|
|
177
|
-
}) {
|
|
178
|
-
if (typeof cosign !== 'string' || !cosign.startsWith('/')) {
|
|
179
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, 'a release catalogue is verified with a cosign binary: pass --cosign <absolute path>');
|
|
180
|
-
}
|
|
181
|
-
const layers = await readReferrerLayers({ client, repository, referrer, manifestDigest, ref });
|
|
182
|
-
const statementBytes = await client.getBlob(repository, layers.statement.digest, STATEMENT_MAX_BYTES);
|
|
183
|
-
const bundleBytes = await client.getBlob(repository, layers.bundle.digest, BUNDLE_MAX_BYTES);
|
|
184
|
-
if (sha256Of(statementBytes) !== layers.statement.digest || sha256Of(bundleBytes) !== layers.bundle.digest) {
|
|
185
|
-
throw new CatalogueEvidenceNotVerifiedError(ref, 'a referrer layer does not hash to its digest');
|
|
186
|
-
}
|
|
187
|
-
const { bundlePath, root } = pinnedVerifierBundle(locateVerifier, channel);
|
|
188
|
-
const evidenceRoot = mkdtempSync(join(tmpdir(), 'xema-catalogue-evidence-'));
|
|
189
|
-
try {
|
|
190
|
-
writeFileSync(join(evidenceRoot, CATALOGUE_EVIDENCE_STATEMENT_TITLE), statementBytes, { flag: 'wx', mode: 0o600 });
|
|
191
|
-
writeFileSync(join(evidenceRoot, CATALOGUE_EVIDENCE_BUNDLE_TITLE), bundleBytes, { flag: 'wx', mode: 0o600 });
|
|
192
|
-
const result = runVerifier({
|
|
193
|
-
spawn,
|
|
194
|
-
bundlePath,
|
|
195
|
-
args: [
|
|
196
|
-
'verify',
|
|
197
|
-
'--channel', channel,
|
|
198
|
-
'--data-root', root,
|
|
199
|
-
'--evidence-root', evidenceRoot,
|
|
200
|
-
'--statement-digest', layers.statement.digest,
|
|
201
|
-
'--bundle-digest', layers.bundle.digest,
|
|
202
|
-
'--workflow-sha', layers.workflowSha,
|
|
203
|
-
'--offering-id', offeringId,
|
|
204
|
-
'--subject-digest', manifestDigest,
|
|
205
|
-
'--catalogue-layer-digest', catalogueLayerDigest,
|
|
206
|
-
'--lock-layer-digest', lockLayerDigest,
|
|
207
|
-
'--cosign', cosign,
|
|
208
|
-
],
|
|
209
|
-
});
|
|
210
|
-
if (result.status !== 0) {throw new CatalogueEvidenceNotVerifiedError(ref, stderrOf(result));}
|
|
211
|
-
} finally {
|
|
212
|
-
rmSync(evidenceRoot, { recursive: true, force: true });
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Verify the catalogue's E4 evidence from the registry, before any catalogue byte is fetched or parsed.
|
|
218
|
-
*
|
|
219
|
-
* @param {{ client: object, ref: string, repository: string, manifestDigest: string, channel: string, offeringId: string, catalogueLayerDigest: string, lockLayerDigest: string, cosign?: string, locateVerifier?: Function, verifyReferrer?: Function }} options
|
|
220
|
-
*/
|
|
221
|
-
export async function verifyCatalogueEvidence({ client, ref, repository, manifestDigest, channel, offeringId, catalogueLayerDigest, lockLayerDigest, cosign, locateVerifier, verifyReferrer = verifyCatalogueEvidenceReferrer }) {
|
|
222
|
-
const listed = await client.listReferrers(repository, manifestDigest, EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE);
|
|
223
|
-
const referrers = listed.filter((descriptor) => descriptor?.artifactType === EDITION_CATALOGUE_EVIDENCE_ARTIFACT_TYPE);
|
|
224
|
-
if (referrers.length === 0) {throw new CatalogueEvidenceMissingError(ref);}
|
|
225
|
-
for (const referrer of referrers) {
|
|
226
|
-
await verifyReferrer({ ref, client, repository, referrer, channel, offeringId, manifestDigest, catalogueLayerDigest, lockLayerDigest, cosign, ...(locateVerifier === undefined ? {} : { locateVerifier }) });
|
|
227
|
-
}
|
|
228
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
// catalogue-fetch — read the catalogue layer of an offering artifact, by digest.
|
|
2
|
-
//
|
|
3
|
-
// The reference is `oci://<registry root>/<channel segment>/xema-edition-<id>@sha256:<digest>`
|
|
4
|
-
// (it comes from catalogue.pin.json): a tag is refused, because a catalogue is pinned, not
|
|
5
|
-
// followed. The repository is parsed by `parseEditionRepository`; a reference whose
|
|
6
|
-
// repository channel is not the channel being resolved is refused before any fetch, and a
|
|
7
|
-
// catalogue that states another channel than the repository it came from is refused before
|
|
8
|
-
// it is used. The manifest and the
|
|
9
|
-
// layer are fetched with the one OCI client (`oras.mjs`, the pinned oras), which verifies that
|
|
10
|
-
// every body hashes to the digest it was asked for. Credentials are named by
|
|
11
|
-
// environment variable (never inlined): `--catalogue-username` with
|
|
12
|
-
// `--catalogue-token-env`, or neither for an anonymous read.
|
|
13
|
-
|
|
14
|
-
import { Buffer } from 'node:buffer';
|
|
15
|
-
|
|
16
|
-
import { verifyCatalogueEvidence } from './catalogue-evidence.mjs';
|
|
17
|
-
import { CATALOGUE_FILE, CatalogueError, parseCatalogue } from './catalogue.mjs';
|
|
18
|
-
import { parseEditionRepository } from './edition-artifact.mjs';
|
|
19
|
-
import { EDITION_ARTIFACT_TYPE, EditionChannel, EditionLockFile } from './edition-constants.mjs';
|
|
20
|
-
import { OrasRegistry } from './oras.mjs';
|
|
21
|
-
import { splitImageRef } from './registry-credentials.mjs';
|
|
22
|
-
|
|
23
|
-
const REF = /^oci:\/\/([^@]+)@(sha256:[a-f0-9]{64})$/;
|
|
24
|
-
const CATALOGUE_MAX_BYTES = 32 * 1024 * 1024;
|
|
25
|
-
const TITLE = 'org.opencontainers.image.title';
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* `{ authority, repository, digest, edition }` of an `oci://<repository>@sha256:<digest>` reference, where
|
|
29
|
-
* `edition` is the parsed repository (`{ registryRoot, channel, distributionId }`); a tag is refused.
|
|
30
|
-
*/
|
|
31
|
-
export function parseCatalogueRef(ref) {
|
|
32
|
-
const match = REF.exec(String(ref));
|
|
33
|
-
if (match === null) {
|
|
34
|
-
throw new CatalogueError(`catalogue reference ${JSON.stringify(ref)} is not oci://<registry>/<repository>@sha256:<64 hex>: a catalogue is pinned by digest, never by tag`);
|
|
35
|
-
}
|
|
36
|
-
const { authority, repository } = splitImageRef(match[1]);
|
|
37
|
-
let edition;
|
|
38
|
-
try {
|
|
39
|
-
edition = parseEditionRepository(match[1]);
|
|
40
|
-
} catch (error) {
|
|
41
|
-
throw new CatalogueError(`catalogue reference ${JSON.stringify(ref)}: ${error.message}`, { cause: error });
|
|
42
|
-
}
|
|
43
|
-
return { authority, repository, digest: match[2], edition };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** The credential the client needs: named by env var, or anonymous. */
|
|
47
|
-
export function catalogueCredential({ authority, username, tokenEnv, env = process.env }) {
|
|
48
|
-
if ((username === undefined) !== (tokenEnv === undefined)) {
|
|
49
|
-
throw new CatalogueError('--catalogue-username and --catalogue-token-env go together (or neither, for an anonymous read)');
|
|
50
|
-
}
|
|
51
|
-
if (tokenEnv === undefined) {return { authority, access: 'anonymous', basicAuth: null };}
|
|
52
|
-
const token = env[tokenEnv];
|
|
53
|
-
if (typeof token !== 'string' || token.length === 0) {
|
|
54
|
-
throw new CatalogueError(`--catalogue-token-env names ${tokenEnv}, which is unset or empty`);
|
|
55
|
-
}
|
|
56
|
-
return { authority, access: 'authenticated', basicAuth: Buffer.from(`${username}:${token}`, 'utf8').toString('base64') };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** The one layer of `manifest` titled `title`; an offering artifact carries exactly one of each. */
|
|
60
|
-
export function layerTitled(manifest, title, ref) {
|
|
61
|
-
const layers = (manifest.document.layers ?? []).filter((layer) => layer.annotations?.[TITLE] === title);
|
|
62
|
-
if (layers.length !== 1) {
|
|
63
|
-
throw new CatalogueError(`${ref} carries ${layers.length} layers titled ${title}; an offering artifact carries exactly one`);
|
|
64
|
-
}
|
|
65
|
-
return layers[0];
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Fetch and strictly parse the catalogue of the artifact at `ref`, resolving for `channel`. A RELEASE catalogue is read
|
|
70
|
-
* only after its E4 evidence verified against the caller's own evidence trust policy (catalogue-evidence.mjs): the
|
|
71
|
-
* verification precedes the blob fetch and the parse, so an unverified catalogue is never read. It is done by the data
|
|
72
|
-
* root's pinned built verifier, with the absolute `cosign` the caller names. `client` and `verifyEvidence` are injectable
|
|
73
|
-
* for tests.
|
|
74
|
-
*/
|
|
75
|
-
export async function fetchCatalogue({ ref, channel, username, tokenEnv, env = process.env, client, cosign, locateVerifier, verifyEvidence = verifyCatalogueEvidence }) {
|
|
76
|
-
const { authority, repository, digest, edition } = parseCatalogueRef(ref);
|
|
77
|
-
if (edition.channel !== channel) {
|
|
78
|
-
throw new CatalogueError(
|
|
79
|
-
`${ref}: its repository ${authority}/${repository} is a ${edition.channel} repository, but this resolve is for the ${channel} channel; ` +
|
|
80
|
-
'a catalogue is read only from the repository of the channel being resolved',
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
const registry = client ?? new OrasRegistry({ credential: catalogueCredential({ authority, username, tokenEnv, env }) });
|
|
84
|
-
const manifest = await registry.getManifestByDigest(repository, digest);
|
|
85
|
-
if (manifest.isIndex || manifest.document.artifactType !== EDITION_ARTIFACT_TYPE) {
|
|
86
|
-
throw new CatalogueError(`${ref} is not an edition artifact (artifactType ${JSON.stringify(manifest.document.artifactType)}, expected ${EDITION_ARTIFACT_TYPE})`);
|
|
87
|
-
}
|
|
88
|
-
const catalogueLayer = layerTitled(manifest, CATALOGUE_FILE, ref);
|
|
89
|
-
if (channel === EditionChannel.Release) {
|
|
90
|
-
await verifyEvidence({
|
|
91
|
-
client: registry,
|
|
92
|
-
ref,
|
|
93
|
-
repository,
|
|
94
|
-
manifestDigest: digest,
|
|
95
|
-
channel,
|
|
96
|
-
offeringId: edition.distributionId,
|
|
97
|
-
cosign,
|
|
98
|
-
locateVerifier,
|
|
99
|
-
catalogueLayerDigest: catalogueLayer.digest,
|
|
100
|
-
lockLayerDigest: layerTitled(manifest, EditionLockFile.Distribution, ref).digest,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
const bytes = await registry.getBlob(repository, catalogueLayer.digest, CATALOGUE_MAX_BYTES);
|
|
104
|
-
let document;
|
|
105
|
-
try {
|
|
106
|
-
document = JSON.parse(bytes.toString('utf8'));
|
|
107
|
-
} catch (error) {
|
|
108
|
-
throw new CatalogueError(`${ref}: ${CATALOGUE_FILE} is not JSON: ${error.message}`);
|
|
109
|
-
}
|
|
110
|
-
const catalogue = parseCatalogue(document);
|
|
111
|
-
if (catalogue.offeringId !== edition.distributionId) {
|
|
112
|
-
throw new CatalogueError(
|
|
113
|
-
`${ref}: ${CATALOGUE_FILE} is the catalogue of offering ${catalogue.offeringId}, but it was fetched from the repository of offering ${edition.distributionId}; ` +
|
|
114
|
-
'an artifact whose stated offering differs from its repository is refused',
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
if (catalogue.channel !== edition.channel) {
|
|
118
|
-
throw new CatalogueError(
|
|
119
|
-
`${ref}: ${CATALOGUE_FILE} states channel ${catalogue.channel}, but it was fetched from the ${edition.channel} repository ${authority}/${repository}; ` +
|
|
120
|
-
'an artifact whose stated channel differs from its repository is refused',
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
return { catalogue, digest };
|
|
124
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// catalogue-lock-field — how a customer edition's distribution lock names the catalogue it was resolved against
|
|
2
|
-
// (kernel edition protocol v37, DistributionLock): EXACTLY ONE of
|
|
3
|
-
//
|
|
4
|
-
// catalogueDigest the digest of a PUBLISHED catalogue artifact (the catalogue pin form);
|
|
5
|
-
// catalogueContentDigest sha256 of the exact catalogue.json bytes a catalogue-free resolve's vendor step wrote
|
|
6
|
-
// (the catalogue-free pin form: no catalogue artifact exists).
|
|
7
|
-
//
|
|
8
|
-
// The kernel refuses a lock carrying both; this CLI refuses a request naming both or neither, and a field that is
|
|
9
|
-
// not its pin form's, before anything is resolved or sealed.
|
|
10
|
-
|
|
11
|
-
/** The two lock fields, by what they digest. */
|
|
12
|
-
export const CatalogueLockField = Object.freeze({ Artifact: 'catalogueDigest', Content: 'catalogueContentDigest' });
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* `{ key, digest }` of the one catalogue field `request` names (CatalogueLockField). Throws `new ErrorType(message)`
|
|
16
|
-
* when it names both or neither; `what` names the caller in the message.
|
|
17
|
-
*/
|
|
18
|
-
export function catalogueLockFieldOf(request, { what, ErrorType = Error }) {
|
|
19
|
-
const named = Object.values(CatalogueLockField).filter((key) => request?.[key] !== undefined);
|
|
20
|
-
if (named.length !== 1) {
|
|
21
|
-
throw new ErrorType(`${what} names ${named.length === 0 ? 'neither' : 'both'} ${CatalogueLockField.Artifact} (a published catalogue) ${named.length === 0 ? 'nor' : 'and'} ${CatalogueLockField.Content} (a catalogue-free resolve): exactly one`);
|
|
22
|
-
}
|
|
23
|
-
const [key] = named;
|
|
24
|
-
return { key, digest: request[key] };
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** The lock field of a customer edition's pin form: the catalogue-free form records the content digest, the catalogue form the artifact digest. */
|
|
28
|
-
export const catalogueLockFieldOfForm = (catalogueFree) => (catalogueFree ? CatalogueLockField.Content : CatalogueLockField.Artifact);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The one catalogue field of a customer edition's lock, `{ key, digest }`: exactly one named, and the one its pin form
|
|
32
|
-
* records (`catalogueFree`: the catalogue-free form). Throws `new ErrorType(message)` otherwise.
|
|
33
|
-
*/
|
|
34
|
-
export function customerLockCatalogueField({ catalogueFree, catalogueDigest, catalogueContentDigest }, { what, ErrorType = Error }) {
|
|
35
|
-
const field = catalogueLockFieldOf({ catalogueDigest, catalogueContentDigest }, { what, ErrorType });
|
|
36
|
-
const formField = catalogueLockFieldOfForm(catalogueFree);
|
|
37
|
-
if (field.key !== formField) {
|
|
38
|
-
throw new ErrorType(`a ${catalogueFree ? 'catalogue-free' : 'catalogue-form'} customer edition names its catalogue by ${formField}, not ${field.key}`);
|
|
39
|
-
}
|
|
40
|
-
return field;
|
|
41
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// catalogue-pin — `catalogue.pin.json`, the catalogues a customer edition is resolved against.
|
|
2
|
-
//
|
|
3
|
-
// It sits in the SAME directory as the customer's definition file:
|
|
4
|
-
// { "schemaVersion": 1, "develop": "oci://<repository>@sha256:<64 hex>" | null, "release": ... | null }
|
|
5
|
-
// Exactly these keys, both channel keys present; null states that the edition is not produced on
|
|
6
|
-
// that channel. A reference is parsed by `parseCatalogueRef`, and the repository channel of the
|
|
7
|
-
// reference under a key must be that key. This is the only reader of the file: every customer
|
|
8
|
-
// resolve takes the catalogue reference of its channel from here.
|
|
9
|
-
|
|
10
|
-
import { existsSync } from 'node:fs';
|
|
11
|
-
import { dirname, join } from 'node:path';
|
|
12
|
-
|
|
13
|
-
import { parseCatalogueRef } from './catalogue-fetch.mjs';
|
|
14
|
-
import { CatalogueError } from './catalogue.mjs';
|
|
15
|
-
import { EditionChannel } from './edition-constants.mjs';
|
|
16
|
-
import { readStrictJsonFile } from './strict-json.mjs';
|
|
17
|
-
|
|
18
|
-
export const CATALOGUE_PIN_FILE = 'catalogue.pin.json';
|
|
19
|
-
export const CATALOGUE_PIN_SCHEMA_VERSION = 1;
|
|
20
|
-
|
|
21
|
-
const SCHEMA_VERSION_KEY = 'schemaVersion';
|
|
22
|
-
|
|
23
|
-
/** The catalogue pin file that sits beside `definitionFile`. */
|
|
24
|
-
export const cataloguePinFile = (definitionFile) => join(dirname(definitionFile), CATALOGUE_PIN_FILE);
|
|
25
|
-
|
|
26
|
-
/** The strict parse of a pin document read from `file`; returns it unchanged. */
|
|
27
|
-
export function parseCataloguePins(document, file) {
|
|
28
|
-
const channels = Object.values(EditionChannel);
|
|
29
|
-
const expected = [SCHEMA_VERSION_KEY, ...channels].sort().join();
|
|
30
|
-
if (document === null || typeof document !== 'object' || Array.isArray(document) || Object.keys(document).sort().join() !== expected) {
|
|
31
|
-
throw new CatalogueError(`${file} must be exactly {${[SCHEMA_VERSION_KEY, ...channels].join(', ')}}, every key present`);
|
|
32
|
-
}
|
|
33
|
-
if (document[SCHEMA_VERSION_KEY] !== CATALOGUE_PIN_SCHEMA_VERSION) {
|
|
34
|
-
throw new CatalogueError(`${file}: ${SCHEMA_VERSION_KEY} must be ${CATALOGUE_PIN_SCHEMA_VERSION}`);
|
|
35
|
-
}
|
|
36
|
-
for (const channel of channels) {
|
|
37
|
-
const ref = document[channel];
|
|
38
|
-
if (ref === null) {continue;}
|
|
39
|
-
if (typeof ref !== 'string') {
|
|
40
|
-
throw new CatalogueError(`${file}: "${channel}" must be an oci://<repository>@sha256:<64 hex> reference or null`);
|
|
41
|
-
}
|
|
42
|
-
let parsed;
|
|
43
|
-
try {
|
|
44
|
-
parsed = parseCatalogueRef(ref);
|
|
45
|
-
} catch (error) {
|
|
46
|
-
throw new CatalogueError(`${file}: "${channel}": ${error.message}`, { cause: error });
|
|
47
|
-
}
|
|
48
|
-
if (parsed.edition.channel !== channel) {
|
|
49
|
-
throw new CatalogueError(
|
|
50
|
-
`${file}: "${channel}" pins ${ref}, whose repository is a ${parsed.edition.channel} repository; a ${channel} catalogue is pinned in a ${channel} repository`,
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return document;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** The catalogue reference pinned for `channel` beside `definitionFile`; a null pin or a missing file is refused. */
|
|
58
|
-
export function readCataloguePin({ definitionFile, channel }) {
|
|
59
|
-
const file = cataloguePinFile(definitionFile);
|
|
60
|
-
if (!existsSync(file)) {
|
|
61
|
-
throw new CatalogueError(`${file} does not exist: a customer edition pins its catalogues in ${CATALOGUE_PIN_FILE}, beside the definition`);
|
|
62
|
-
}
|
|
63
|
-
const ref = parseCataloguePins(readStrictJsonFile(file), file)[channel];
|
|
64
|
-
if (ref === undefined) {
|
|
65
|
-
throw new CatalogueError(`${file}: ${JSON.stringify(channel)} is not a channel (${Object.values(EditionChannel).join(' | ')})`);
|
|
66
|
-
}
|
|
67
|
-
if (ref === null) {
|
|
68
|
-
throw new CatalogueError(`${file}: no ${channel} catalogue is pinned for this edition`);
|
|
69
|
-
}
|
|
70
|
-
return ref;
|
|
71
|
-
}
|