@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,374 +0,0 @@
|
|
|
1
|
-
// The deployment-specific coordinates the edition library needs and must not
|
|
2
|
-
// carry: which image registry, chart registry and source
|
|
3
|
-
// organisation a workspace belongs to. They are DATA, read from
|
|
4
|
-
// `<dataRoot>/edition-workspace.json`; there is no default for any of them, and
|
|
5
|
-
// a file with a missing, unknown or malformed key is refused. `evidenceTrustPolicy`
|
|
6
|
-
// declares the data root's evidence gating; its `required` flag has no default.
|
|
7
|
-
// `editionPublishers` names the exact workflow that publishes an edition of each
|
|
8
|
-
// kind on each channel (the shape is edition-contract.json signers.publishers): a
|
|
9
|
-
// customer data root declares its own; a publisher it does not declare is refused
|
|
10
|
-
// when an operation needs it, with no default.
|
|
11
|
-
|
|
12
|
-
import { join } from 'node:path';
|
|
13
|
-
|
|
14
|
-
import { canonicalPublicHttpsRepositoryUrl, repositoryOwnerName } from './canonical-repository-url.mjs';
|
|
15
|
-
import { EDITION_PUBLISHER_CHANNELS } from './edition-constants.mjs';
|
|
16
|
-
import { assertPublisher } from './edition-publisher.mjs';
|
|
17
|
-
import { dataRoot } from './edition-workspace.mjs';
|
|
18
|
-
import { CANONICAL_IDENTIFIER } from './evidence-grammars.mjs';
|
|
19
|
-
import { isUnderSourcePrefix } from './git-source-auth.mjs';
|
|
20
|
-
import { readStrictJsonFile } from './strict-json.mjs';
|
|
21
|
-
import {
|
|
22
|
-
parseConfinedBiomes,
|
|
23
|
-
parseConnectorSources,
|
|
24
|
-
parseFirstPartySources,
|
|
25
|
-
parsePinRoles,
|
|
26
|
-
parsePlatformServiceSources,
|
|
27
|
-
parseRuntimeImageSources,
|
|
28
|
-
} from './workspace-sections.mjs';
|
|
29
|
-
|
|
30
|
-
/** A refusal of edition-workspace.json itself. */
|
|
31
|
-
export class EditionWorkspaceConfigError extends Error {
|
|
32
|
-
constructor(message) {
|
|
33
|
-
super(message);
|
|
34
|
-
this.name = 'EditionWorkspaceConfigError';
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export const EDITION_WORKSPACE_CONFIG_FILE = 'edition-workspace.json';
|
|
39
|
-
export const EDITION_WORKSPACE_CONFIG_SCHEMA_VERSION = 1;
|
|
40
|
-
|
|
41
|
-
// The product-data sections. Each is optional in the file (a customer data root
|
|
42
|
-
// legitimately has none of some), and each is REQUIRED at the moment an
|
|
43
|
-
// operation reads it: `workspaceSection` refuses a missing one by name.
|
|
44
|
-
const SECTIONS = Object.freeze({
|
|
45
|
-
firstPartySources: parseFirstPartySources,
|
|
46
|
-
platformServiceSources: parsePlatformServiceSources,
|
|
47
|
-
connectorSources: parseConnectorSources,
|
|
48
|
-
runtimeImageSources: parseRuntimeImageSources,
|
|
49
|
-
pinRoles: parsePinRoles,
|
|
50
|
-
confinedBiomes: parseConfinedBiomes,
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const KEYS = Object.freeze([
|
|
54
|
-
'schemaVersion',
|
|
55
|
-
'imageRegistry',
|
|
56
|
-
'chartRegistry',
|
|
57
|
-
'chartPublishers',
|
|
58
|
-
'sourceRepositoryUrlPrefix',
|
|
59
|
-
'dataRootRepositoryUrl',
|
|
60
|
-
'sourceAuthUsername',
|
|
61
|
-
'evidenceTrustPolicy',
|
|
62
|
-
'firstPartyBundleSigner',
|
|
63
|
-
'editionPublishers',
|
|
64
|
-
...Object.keys(SECTIONS),
|
|
65
|
-
]);
|
|
66
|
-
|
|
67
|
-
const IMAGE_REGISTRY = /^[a-z0-9.-]+(:[0-9]+)?(\/[a-z0-9._-]+)+$/;
|
|
68
|
-
const CHART_REGISTRY = /^oci:\/\/[a-z0-9.-]+(:[0-9]+)?(\/[a-z0-9._-]+)+$/;
|
|
69
|
-
// A data-root-relative POSIX path: no leading slash, no empty, `.` or `..` segment.
|
|
70
|
-
const DATA_ROOT_RELATIVE_PATH = /^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*$/;
|
|
71
|
-
const SOURCE_URL_PREFIX = /^https:\/\/[a-z0-9.-]+(\/[A-Za-z0-9._-]+)+\/$/;
|
|
72
|
-
|
|
73
|
-
function requireString(config, key, pattern, shape) {
|
|
74
|
-
const value = config[key];
|
|
75
|
-
if (typeof value !== 'string' || !pattern.test(value)) {
|
|
76
|
-
throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE}: "${key}" must be ${shape}; got ${JSON.stringify(value)}`);
|
|
77
|
-
}
|
|
78
|
-
return value;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/** The git username first-party sources authenticate as: declared, never defaulted (GitHub says `x-access-token`, other forges differ). */
|
|
82
|
-
function requireSourceAuthUsername(config) {
|
|
83
|
-
const value = config.sourceAuthUsername;
|
|
84
|
-
if (typeof value !== 'string' || value.length === 0 || /[\s:]/.test(value)) {
|
|
85
|
-
throw new EditionWorkspaceConfigError(
|
|
86
|
-
`${EDITION_WORKSPACE_CONFIG_FILE}: "sourceAuthUsername" is required: the non-empty git username (no whitespace or ":") ` +
|
|
87
|
-
`that first-party source tokens authenticate as; got ${JSON.stringify(value)}`,
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
return value;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** `chartRegistry` and `chartPublishers` are a vendor-only pair: both declared or both absent. */
|
|
94
|
-
function optionalChartSet(document) {
|
|
95
|
-
const registry = document.chartRegistry !== undefined;
|
|
96
|
-
const publishers = document.chartPublishers !== undefined;
|
|
97
|
-
if (registry !== publishers) {
|
|
98
|
-
throw new EditionWorkspaceConfigError(
|
|
99
|
-
`${EDITION_WORKSPACE_CONFIG_FILE}: "chartRegistry" and "chartPublishers" are a vendor-only pair, both declared or both absent; only "${registry ? 'chartRegistry' : 'chartPublishers'}" is`,
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
if (!registry) {return {};}
|
|
103
|
-
return {
|
|
104
|
-
chartRegistry: requireString(document, 'chartRegistry', CHART_REGISTRY, 'oci://<host>/<path>'),
|
|
105
|
-
chartPublishers: requirePublishers(document),
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function requirePublishers(config) {
|
|
110
|
-
const value = config.chartPublishers;
|
|
111
|
-
if (!Array.isArray(value) || value.length === 0) {
|
|
112
|
-
throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE}: "chartPublishers" must be a non-empty array of {index, repo}`);
|
|
113
|
-
}
|
|
114
|
-
const seen = new Set();
|
|
115
|
-
return Object.freeze(
|
|
116
|
-
value.map((entry) => {
|
|
117
|
-
const keys = entry !== null && typeof entry === 'object' ? Object.keys(entry).sort() : [];
|
|
118
|
-
if (keys.join() !== 'index,repo' || typeof entry.index !== 'string' || typeof entry.repo !== 'string' || !entry.index || !entry.repo) {
|
|
119
|
-
throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE}: every "chartPublishers" entry is exactly {index, repo}, both non-empty strings`);
|
|
120
|
-
}
|
|
121
|
-
if (seen.has(entry.index)) {
|
|
122
|
-
throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE}: duplicate chart publisher index "${entry.index}"`);
|
|
123
|
-
}
|
|
124
|
-
seen.add(entry.index);
|
|
125
|
-
return Object.freeze({ index: entry.index, repo: entry.repo });
|
|
126
|
-
}),
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const EVIDENCE_TRUST_POLICY_KEYS = Object.freeze(['pin', 'policy']);
|
|
131
|
-
|
|
132
|
-
function isDataRootRelativePath(value) {
|
|
133
|
-
return (
|
|
134
|
-
typeof value === 'string' &&
|
|
135
|
-
DATA_ROOT_RELATIVE_PATH.test(value) &&
|
|
136
|
-
value.split('/').every((segment) => segment !== '.' && segment !== '..')
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* The MANDATORY `evidenceTrustPolicy` declaration: `{policy, pin}` (two
|
|
142
|
-
* data-root-relative paths) or `null`, the explicit statement that this data
|
|
143
|
-
* root declares no policy. There is no switch that admits an ungated release:
|
|
144
|
-
* a release edition is written only against a policy ARMED on the release
|
|
145
|
-
* channel, so a data root that declares none serves develop editions only.
|
|
146
|
-
*/
|
|
147
|
-
function requireEvidenceTrustPolicy(config) {
|
|
148
|
-
if (!Object.hasOwn(config, 'evidenceTrustPolicy')) {
|
|
149
|
-
throw new EditionWorkspaceConfigError(
|
|
150
|
-
`${EDITION_WORKSPACE_CONFIG_FILE}: "evidenceTrustPolicy" is required: {"policy": ..., "pin": ...}, ` +
|
|
151
|
-
'or null to state that this data root declares no policy (no release edition can then be sealed from it)',
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
const value = config.evidenceTrustPolicy;
|
|
155
|
-
if (value === null) {return Object.freeze({ policy: null, pin: null });}
|
|
156
|
-
const shapeError = (detail) =>
|
|
157
|
-
new EditionWorkspaceConfigError(
|
|
158
|
-
`${EDITION_WORKSPACE_CONFIG_FILE}: "evidenceTrustPolicy" is exactly null or {policy, pin} with both paths data-root-relative${detail}`,
|
|
159
|
-
);
|
|
160
|
-
if (typeof value !== 'object' || Array.isArray(value)) {throw shapeError('');}
|
|
161
|
-
const keys = Object.keys(value).sort();
|
|
162
|
-
const unknown = keys.filter((key) => !EVIDENCE_TRUST_POLICY_KEYS.includes(key));
|
|
163
|
-
if (unknown.length > 0) {throw shapeError(`; unknown key ${unknown.map((key) => `"${key}"`).join(', ')}`);}
|
|
164
|
-
if (keys.join() !== EVIDENCE_TRUST_POLICY_KEYS.join()) {throw shapeError('');}
|
|
165
|
-
for (const key of EVIDENCE_TRUST_POLICY_KEYS) {
|
|
166
|
-
if (!isDataRootRelativePath(value[key])) {
|
|
167
|
-
throw new EditionWorkspaceConfigError(
|
|
168
|
-
`${EDITION_WORKSPACE_CONFIG_FILE}: "evidenceTrustPolicy.${key}" must be a data-root-relative POSIX path without "." or ".." segments; got ${JSON.stringify(value[key])}`,
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
if (value.policy === value.pin) {
|
|
173
|
-
throw new EditionWorkspaceConfigError(`${EDITION_WORKSPACE_CONFIG_FILE}: "evidenceTrustPolicy.policy" and ".pin" must be different files`);
|
|
174
|
-
}
|
|
175
|
-
return Object.freeze({ policy: value.policy, pin: value.pin });
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* The OPTIONAL `firstPartyBundleSigner` declaration: exactly `{policyId}`, naming the one `public-key` row of the
|
|
180
|
-
* evidence trust policy that signs the data root's first-party OCI bundles. No default: a data root that does not
|
|
181
|
-
* declare it cannot seal a first-party OCI bundle row.
|
|
182
|
-
*/
|
|
183
|
-
function optionalFirstPartyBundleSigner(document) {
|
|
184
|
-
if (document.firstPartyBundleSigner === undefined) {return {};}
|
|
185
|
-
const value = document.firstPartyBundleSigner;
|
|
186
|
-
const where = `${EDITION_WORKSPACE_CONFIG_FILE}: "firstPartyBundleSigner"`;
|
|
187
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
188
|
-
throw new EditionWorkspaceConfigError(`${where} must be exactly {"policyId": "<canonical id>"}; got ${JSON.stringify(value)}`);
|
|
189
|
-
}
|
|
190
|
-
const keys = Object.keys(value);
|
|
191
|
-
const unknown = keys.filter((key) => key !== 'policyId');
|
|
192
|
-
if (unknown.length > 0) {
|
|
193
|
-
throw new EditionWorkspaceConfigError(`${where} has unknown key ${unknown.map((key) => `"${key}"`).join(', ')}; it is exactly {"policyId": "<canonical id>"}`);
|
|
194
|
-
}
|
|
195
|
-
if (!Object.hasOwn(value, 'policyId')) {
|
|
196
|
-
throw new EditionWorkspaceConfigError(`${where} is missing "policyId"; it is exactly {"policyId": "<canonical id>"}`);
|
|
197
|
-
}
|
|
198
|
-
if (typeof value.policyId !== 'string' || !CANONICAL_IDENTIFIER.test(value.policyId)) {
|
|
199
|
-
throw new EditionWorkspaceConfigError(`${where}.policyId must be a canonical policy id; got ${JSON.stringify(value.policyId)}`);
|
|
200
|
-
}
|
|
201
|
-
return { firstPartyBundleSigner: Object.freeze({ policyId: value.policyId }) };
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Every first-party repository URL is canonical and under the workspace's
|
|
206
|
-
* `sourceRepositoryUrlPrefix`: the develop graph sends the source token there.
|
|
207
|
-
*/
|
|
208
|
-
function assertFirstPartyUrls(firstPartySources, prefix) {
|
|
209
|
-
for (const [repo, { repositoryUrl }] of Object.entries(firstPartySources)) {
|
|
210
|
-
const where = `${EDITION_WORKSPACE_CONFIG_FILE}: "firstPartySources"["${repo}"].repositoryUrl`;
|
|
211
|
-
let canonical;
|
|
212
|
-
try {
|
|
213
|
-
canonical = canonicalPublicHttpsRepositoryUrl(repositoryUrl, where);
|
|
214
|
-
} catch (err) {
|
|
215
|
-
throw new EditionWorkspaceConfigError(err.message);
|
|
216
|
-
}
|
|
217
|
-
if (canonical !== repositoryUrl) {
|
|
218
|
-
throw new EditionWorkspaceConfigError(`${where} ${JSON.stringify(repositoryUrl)} is not in its canonical form (${canonical})`);
|
|
219
|
-
}
|
|
220
|
-
if (!isUnderSourcePrefix(canonical, prefix)) {
|
|
221
|
-
throw new EditionWorkspaceConfigError(`${where} ${JSON.stringify(repositoryUrl)} is not under sourceRepositoryUrlPrefix ${prefix}`);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* The OPTIONAL `dataRootRepositoryUrl`: where the data root itself lives, in the canonical public HTTPS form
|
|
228
|
-
* and under `sourceRepositoryUrlPrefix` like a first-party repository. It names the record signer
|
|
229
|
-
* (the data root's reusable workflows); a data root that does not declare it simply cannot be named as one.
|
|
230
|
-
*/
|
|
231
|
-
function optionalDataRootRepositoryUrl(document, prefix) {
|
|
232
|
-
if (document.dataRootRepositoryUrl === undefined) {return {};}
|
|
233
|
-
const where = `${EDITION_WORKSPACE_CONFIG_FILE}: "dataRootRepositoryUrl"`;
|
|
234
|
-
let canonical;
|
|
235
|
-
try {
|
|
236
|
-
canonical = canonicalPublicHttpsRepositoryUrl(document.dataRootRepositoryUrl, where);
|
|
237
|
-
repositoryOwnerName(canonical, where);
|
|
238
|
-
} catch (err) {
|
|
239
|
-
throw new EditionWorkspaceConfigError(err.message);
|
|
240
|
-
}
|
|
241
|
-
if (canonical !== document.dataRootRepositoryUrl) {
|
|
242
|
-
throw new EditionWorkspaceConfigError(`${where} ${JSON.stringify(document.dataRootRepositoryUrl)} is not in its canonical form (${canonical})`);
|
|
243
|
-
}
|
|
244
|
-
if (!isUnderSourcePrefix(canonical, prefix)) {
|
|
245
|
-
throw new EditionWorkspaceConfigError(`${where} ${JSON.stringify(canonical)} is not under sourceRepositoryUrlPrefix ${prefix}`);
|
|
246
|
-
}
|
|
247
|
-
return { dataRootRepositoryUrl: canonical };
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* The OPTIONAL `editionPublishers`: `{<kind>: {<channel>: {repository, workflow, ref}}}`, only the kinds and channels
|
|
252
|
-
* edition-contract.json signers.publishers.channelsByKind names, each publisher in the contract's shape. A data root
|
|
253
|
-
* may declare a subset; an empty kind, an unknown kind or channel, or a malformed publisher is refused.
|
|
254
|
-
*/
|
|
255
|
-
function optionalEditionPublishers(document) {
|
|
256
|
-
const value = document.editionPublishers;
|
|
257
|
-
if (value === undefined) {return {};}
|
|
258
|
-
const where = `${EDITION_WORKSPACE_CONFIG_FILE}: "editionPublishers"`;
|
|
259
|
-
const isObject = (entry) => entry !== null && typeof entry === 'object' && !Array.isArray(entry);
|
|
260
|
-
if (!isObject(value) || Object.keys(value).length === 0) {
|
|
261
|
-
throw new EditionWorkspaceConfigError(`${where} must be a non-empty {<kind>: {<channel>: {repository, workflow, ref}}}`);
|
|
262
|
-
}
|
|
263
|
-
const parsed = {};
|
|
264
|
-
for (const [kind, byChannel] of Object.entries(value)) {
|
|
265
|
-
const channels = EDITION_PUBLISHER_CHANNELS[kind];
|
|
266
|
-
if (channels === undefined) {
|
|
267
|
-
throw new EditionWorkspaceConfigError(`${where} names kind "${kind}"; edition-contract.json signers.publishers.channelsByKind names ${Object.keys(EDITION_PUBLISHER_CHANNELS).join(' | ')}`);
|
|
268
|
-
}
|
|
269
|
-
if (!isObject(byChannel) || Object.keys(byChannel).length === 0) {
|
|
270
|
-
throw new EditionWorkspaceConfigError(`${where}.${kind} must be a non-empty {<channel>: {repository, workflow, ref}}`);
|
|
271
|
-
}
|
|
272
|
-
parsed[kind] = {};
|
|
273
|
-
for (const [channel, publisher] of Object.entries(byChannel)) {
|
|
274
|
-
if (!channels.includes(channel)) {
|
|
275
|
-
throw new EditionWorkspaceConfigError(`${where}.${kind} names channel "${channel}"; a ${kind} edition has a publisher on ${channels.join(' | ')} only`);
|
|
276
|
-
}
|
|
277
|
-
try {
|
|
278
|
-
parsed[kind][channel] = Object.freeze({ ...assertPublisher(publisher, `${where}.${kind}.${channel}`) });
|
|
279
|
-
} catch (error) {
|
|
280
|
-
throw new EditionWorkspaceConfigError(error.message);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
Object.freeze(parsed[kind]);
|
|
284
|
-
}
|
|
285
|
-
return { editionPublishers: Object.freeze(parsed) };
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/** Validate a parsed config document; returns the frozen, typed config. */
|
|
289
|
-
export function parseEditionWorkspaceConfig(document) {
|
|
290
|
-
if (document === null || typeof document !== 'object' || Array.isArray(document)) {
|
|
291
|
-
throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE} must be a JSON object`);
|
|
292
|
-
}
|
|
293
|
-
for (const key of Object.keys(document)) {
|
|
294
|
-
if (!KEYS.includes(key)) {throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE}: unknown key "${key}"`);}
|
|
295
|
-
}
|
|
296
|
-
if (document.schemaVersion !== EDITION_WORKSPACE_CONFIG_SCHEMA_VERSION) {
|
|
297
|
-
throw new Error(`${EDITION_WORKSPACE_CONFIG_FILE}: schemaVersion must be ${EDITION_WORKSPACE_CONFIG_SCHEMA_VERSION}`);
|
|
298
|
-
}
|
|
299
|
-
const sections = Object.fromEntries(
|
|
300
|
-
Object.entries(SECTIONS)
|
|
301
|
-
.filter(([key]) => document[key] !== undefined)
|
|
302
|
-
.map(([key, parse]) => [key, parse(document[key])]),
|
|
303
|
-
);
|
|
304
|
-
const sourceRepositoryUrlPrefix = requireString(document, 'sourceRepositoryUrlPrefix', SOURCE_URL_PREFIX, 'https://<host>/<organisation>/ with a trailing slash');
|
|
305
|
-
if (sections.firstPartySources !== undefined) {assertFirstPartyUrls(sections.firstPartySources, sourceRepositoryUrlPrefix);}
|
|
306
|
-
return Object.freeze({
|
|
307
|
-
...sections,
|
|
308
|
-
imageRegistry: requireString(document, 'imageRegistry', IMAGE_REGISTRY, '<host>/<namespace> with no scheme or trailing slash'),
|
|
309
|
-
...optionalChartSet(document),
|
|
310
|
-
sourceRepositoryUrlPrefix,
|
|
311
|
-
...optionalDataRootRepositoryUrl(document, sourceRepositoryUrlPrefix),
|
|
312
|
-
sourceAuthUsername: requireSourceAuthUsername(document),
|
|
313
|
-
evidenceTrustPolicy: requireEvidenceTrustPolicy(document),
|
|
314
|
-
...optionalFirstPartyBundleSigner(document),
|
|
315
|
-
...optionalEditionPublishers(document),
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
let cached;
|
|
320
|
-
|
|
321
|
-
/** The workspace config, read once per data root. */
|
|
322
|
-
export function editionWorkspaceConfig() {
|
|
323
|
-
const root = dataRoot();
|
|
324
|
-
if (cached?.root !== root) {
|
|
325
|
-
cached = { root, config: parseEditionWorkspaceConfig(readStrictJsonFile(join(root, EDITION_WORKSPACE_CONFIG_FILE))) };
|
|
326
|
-
}
|
|
327
|
-
return cached.config;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/** Forget the cached config (a test that rewrites the file in place). */
|
|
331
|
-
export function resetEditionWorkspaceConfig() {
|
|
332
|
-
cached = undefined;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/** The vendor chart set's coordinates `{chartRegistry, chartPublishers}`; a data root that declares neither (a customer's) is refused, naming the file and both keys. */
|
|
336
|
-
export function vendorChartSetConfig() {
|
|
337
|
-
const { chartRegistry, chartPublishers } = editionWorkspaceConfig();
|
|
338
|
-
if (chartRegistry === undefined) {
|
|
339
|
-
throw new EditionWorkspaceConfigError(
|
|
340
|
-
`${EDITION_WORKSPACE_CONFIG_FILE} in ${dataRoot()} declares no "chartRegistry" and "chartPublishers", which vendor chart-set code needs`,
|
|
341
|
-
);
|
|
342
|
-
}
|
|
343
|
-
return { chartRegistry, chartPublishers };
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* One product-data section, refused by name when the data root does not carry
|
|
348
|
-
* it. `needed` says which operation wanted it, so the refusal is actionable.
|
|
349
|
-
*/
|
|
350
|
-
export function workspaceSection(name, needed) {
|
|
351
|
-
const section = editionWorkspaceConfig()[name];
|
|
352
|
-
if (section === undefined) {
|
|
353
|
-
throw new Error(
|
|
354
|
-
`${EDITION_WORKSPACE_CONFIG_FILE} in ${dataRoot()} has no "${name}" section, which ${needed} needs`,
|
|
355
|
-
);
|
|
356
|
-
}
|
|
357
|
-
return section;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* The publisher `{repository, workflow, ref}` of an edition of `kind` on `channel`, as this data root declares it
|
|
362
|
-
* (edition-workspace.json editionPublishers.<kind>.<channel>). One it does not declare is refused by name; there is
|
|
363
|
-
* no default publisher and no fallback.
|
|
364
|
-
*/
|
|
365
|
-
export function editionPublisher(kind, channel) {
|
|
366
|
-
const publisher = editionWorkspaceConfig().editionPublishers?.[kind]?.[channel];
|
|
367
|
-
if (publisher === undefined) {
|
|
368
|
-
throw new EditionWorkspaceConfigError(
|
|
369
|
-
`${EDITION_WORKSPACE_CONFIG_FILE} in ${dataRoot()} declares no "editionPublishers"."${kind}"."${channel}": the exact workflow ` +
|
|
370
|
-
`{repository, workflow, ref} that publishes a ${kind} ${channel} edition; there is no default publisher`,
|
|
371
|
-
);
|
|
372
|
-
}
|
|
373
|
-
return publisher;
|
|
374
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
// edition-constants — the closed vocabulary of the edition OCI artifact, in one
|
|
2
|
-
// place so the writer, the guards and the workflow cannot disagree about what an
|
|
3
|
-
// edition IS. ONE layout serves both channels: an artifact at
|
|
4
|
-
// `<registry root>/<channel segment>/xema-edition-<id>`, addressed by digest,
|
|
5
|
-
// carrying a titled descriptor layer plus the lock layers.
|
|
6
|
-
|
|
7
|
-
import { EditionChannel } from './edition-channel.mjs';
|
|
8
|
-
import { EDITION_CHART_SET_FILE } from './edition-chart-set.mjs';
|
|
9
|
-
import { CustomerPinForm, parseEditionContract } from './edition-contract-parse.mjs';
|
|
10
|
-
import editionContract from './edition-contract.json' with { type: 'json' };
|
|
11
|
-
import { EditionKind, EvidenceTrustState } from './edition-kind.mjs';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* The vocabulary itself lives in edition-contract.json, the ONE source:
|
|
15
|
-
* xema-deploy vendors that file byte for byte and builds its constants from it,
|
|
16
|
-
* so the producer and the consumer of an edition cannot disagree about its names.
|
|
17
|
-
* It is a JSON import, not a read at run time, so a bundle (the evidence
|
|
18
|
-
* verifier) carries it.
|
|
19
|
-
*/
|
|
20
|
-
export const EDITION_CONTRACT = Object.freeze(structuredClone(parseEditionContract(editionContract)));
|
|
21
|
-
|
|
22
|
-
/** The descriptor layer's file name; its `org.opencontainers.image.title`. */
|
|
23
|
-
export const EDITION_DESCRIPTOR_FILE = EDITION_CONTRACT.descriptorFile;
|
|
24
|
-
export const EDITION_DESCRIPTOR_SCHEMA = EDITION_CONTRACT.descriptorSchema;
|
|
25
|
-
/** The form of a sealed edition's `sealOf` (`<registry>/<path>@sha256:<64 hex>`): the contract's pattern, never restated. */
|
|
26
|
-
export const SEAL_OF_PATTERN = new RegExp(EDITION_CONTRACT.sealOf.pattern);
|
|
27
|
-
/** The one channel a seal is of (contract sealOf.channel, D99: release-only): the channel of the resolved edition it seals and of the sealed edition. */
|
|
28
|
-
export const SEALED_EDITION_CHANNEL = EDITION_CONTRACT.sealOf.channel;
|
|
29
|
-
/** The OIDC issuer of every edition publisher's keyless certificate (contract signers.oidcIssuer); never overridden. */
|
|
30
|
-
export const EDITION_SIGNER_OIDC_ISSUER = EDITION_CONTRACT.signers.oidcIssuer;
|
|
31
|
-
/** The channels on which an edition of `kind` has a publisher (contract signers.publishers.channelsByKind); its values are the data root's. */
|
|
32
|
-
export const EDITION_PUBLISHER_CHANNELS = EDITION_CONTRACT.signers.publishers.channelsByKind;
|
|
33
|
-
/** The ONE artifactType of every edition artifact, develop or release. */
|
|
34
|
-
export const EDITION_ARTIFACT_TYPE = EDITION_CONTRACT.artifactType;
|
|
35
|
-
/** The repository name prefix: `<registry root>/<channel segment>/<prefix><id>`. */
|
|
36
|
-
export const EDITION_REPOSITORY_PREFIX = EDITION_CONTRACT.repositoryPrefix;
|
|
37
|
-
|
|
38
|
-
/** The namespace segment of each channel's edition repositories, keyed by channel: `<registry root>/<segment>/<prefix><id>`. */
|
|
39
|
-
export const EDITION_REPOSITORY_SEGMENTS = Object.freeze(
|
|
40
|
-
Object.fromEntries(Object.values(EditionChannel).map((channel) => [channel, EDITION_CONTRACT.repositories[channel].namespaceSegment])),
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
export { CustomerPinForm, EditionChannel, EditionKind, EvidenceTrustState };
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* The evidence trust states an edition of `kind` on `channel` may record (contract `evidenceTrust.statesByKind`):
|
|
47
|
-
* `not-armed` only for a resolved develop edition; every other edition is armed or is not written.
|
|
48
|
-
*/
|
|
49
|
-
export function admittedEvidenceTrustStates(kind, channel) {
|
|
50
|
-
const states = EDITION_CONTRACT.evidenceTrust.statesByKind[kind]?.[channel];
|
|
51
|
-
if (states === undefined) {
|
|
52
|
-
throw new Error(`edition kind ${JSON.stringify(kind)} on channel ${JSON.stringify(channel)} is not one edition-contract.json names`);
|
|
53
|
-
}
|
|
54
|
-
return states;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** The owner-relative segment of a develop image repository: `<host>/<owner>/<segment>/<name>`. */
|
|
58
|
-
export const DEVELOP_IMAGE_NAMESPACE_SEGMENT = EDITION_CONTRACT.imageNamespaceSegment;
|
|
59
|
-
|
|
60
|
-
/** The titled layers only an OFFERING artifact carries (not locks): the catalogue a customer edition resolves against. */
|
|
61
|
-
export const EDITION_OFFERING_LAYERS = Object.freeze({ ...EDITION_CONTRACT.offeringLayers });
|
|
62
|
-
|
|
63
|
-
/** The one provenance pin that is not a commit: the digest of the catalogue artifact a customer edition was resolved against. */
|
|
64
|
-
export const CATALOGUE_PIN_KEY = 'catalogue';
|
|
65
|
-
if (!(CATALOGUE_PIN_KEY in EDITION_CONTRACT.provenancePins)) {
|
|
66
|
-
throw new Error('edition-contract.json provenancePins does not declare the catalogue pin');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** The digest of the canonical customer definition a customer edition was resolved from: every input the pins of its sources and catalogue do not fix. */
|
|
70
|
-
export const DEFINITION_PIN_KEY = 'definition';
|
|
71
|
-
if (!(DEFINITION_PIN_KEY in EDITION_CONTRACT.provenancePins)) {
|
|
72
|
-
throw new Error('edition-contract.json provenancePins does not declare the definition pin');
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The commit of the customer definition repository a catalogue-free customer edition's definition was read at: a pin of
|
|
77
|
-
* the catalogue-free form only (provenancePins.customerForms["catalogue-free"].pins names it), a 40-hex commit.
|
|
78
|
-
*/
|
|
79
|
-
export const DEFINITION_REPOSITORY_PIN_KEY = 'definition-repository';
|
|
80
|
-
if (!EDITION_CONTRACT.provenancePins.customerForms['catalogue-free'].pins.includes(`"${DEFINITION_REPOSITORY_PIN_KEY}"`)) {
|
|
81
|
-
throw new Error(`edition-contract.json provenancePins.customerForms["catalogue-free"].pins does not name the "${DEFINITION_REPOSITORY_PIN_KEY}" pin`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/** The provenance pins that are sha256 digests, not commits. */
|
|
85
|
-
export const DIGEST_PIN_KEYS = Object.freeze([CATALOGUE_PIN_KEY, DEFINITION_PIN_KEY]);
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* The key of a vendor member (develop graph repository) pin, `repos/<x>` or `submodules/<x>`: the one statement is the
|
|
89
|
-
* contract's (provenancePins.customerForms.vendorMemberPinPattern); the snapshot pin namespaces read it from here.
|
|
90
|
-
*/
|
|
91
|
-
export const VENDOR_MEMBER_PIN_PATTERN = new RegExp(EDITION_CONTRACT.provenancePins.customerForms.vendorMemberPinPattern);
|
|
92
|
-
|
|
93
|
-
/** Whether the contract admits customer pin form `form` (CustomerPinForm) on an edition of `kind` and `channel`. */
|
|
94
|
-
export function customerPinFormAdmitted(form, kind, channel) {
|
|
95
|
-
return EDITION_CONTRACT.provenancePins.customerForms[form].kinds[kind]?.includes(channel) === true;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** The lock files an edition can carry. */
|
|
99
|
-
export const EditionLockFile = Object.freeze({
|
|
100
|
-
Distribution: 'distribution.lock.json',
|
|
101
|
-
Images: 'images.lock.json',
|
|
102
|
-
Authorization: 'authorization.lock.json',
|
|
103
|
-
ChartSet: EDITION_CHART_SET_FILE,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
/** The locks of an edition, in the order the descriptor lists them and the artifact pushes them; the same for both channels. */
|
|
107
|
-
export const EDITION_LOCKS = Object.freeze([...EDITION_CONTRACT.locks]);
|
|
108
|
-
|
|
109
|
-
/** Every file of the artifact, in the order it is pushed. */
|
|
110
|
-
export const EDITION_FILES = Object.freeze([EDITION_DESCRIPTOR_FILE, ...EDITION_LOCKS]);
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
// edition-contract-parse — the strict parse of edition-contract.json. A consumer
|
|
2
|
-
// that vendors the contract holds it to this same shape: a contract that is not
|
|
3
|
-
// v3, or lacks `repositories`, or names a channel, kind or evidence trust state
|
|
4
|
-
// this CLI does not know, is refused rather than read with a default.
|
|
5
|
-
|
|
6
|
-
import { EditionChannel } from './edition-channel.mjs';
|
|
7
|
-
import { EditionKind, EvidenceTrustState } from './edition-kind.mjs';
|
|
8
|
-
|
|
9
|
-
export const EDITION_CONTRACT_SCHEMA = 'xema.edition-contract/v3';
|
|
10
|
-
|
|
11
|
-
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
12
|
-
const sameSet = (left, right) => Array.isArray(left) && left.length === right.length && right.every((name) => left.includes(name));
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* The descriptor vocabulary: the descriptor schema (read from the contract, never restated), the closed kind enum,
|
|
16
|
-
* `sealOf` (its pattern, its repository rule and the one channel a seal is of), the signers (the issuer, and the SHAPE of
|
|
17
|
-
* a publisher: which kinds and channels have one and its {repository, workflow, ref} grammar; the publisher VALUES are
|
|
18
|
-
* the data root's edition-workspace.json, never the contract's) and the evidence trust states each kind may record per
|
|
19
|
-
* channel. A kind's channels are the same in `signers.publishers.channelsByKind` and `evidenceTrust.statesByKind`: every
|
|
20
|
-
* channel for a resolved edition, exactly `sealOf.channel` for a sealed one (a seal is release-only).
|
|
21
|
-
*/
|
|
22
|
-
/** `source` is an anchored (^...$) regular expression source that compiles. */
|
|
23
|
-
function assertAnchoredPattern(source, where) {
|
|
24
|
-
if (typeof source !== 'string' || !source.startsWith('^') || !source.endsWith('$')) {
|
|
25
|
-
throw new Error(`edition-contract.json: ${where} must be an anchored (^...$) regular expression source`);
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
new RegExp(source);
|
|
29
|
-
} catch (error) {
|
|
30
|
-
throw new Error(`edition-contract.json: ${where} is not a regular expression: ${error.message}`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function assertDescriptorVocabulary(contract) {
|
|
35
|
-
if (typeof contract.descriptorSchema !== 'string' || contract.descriptorSchema === '') {
|
|
36
|
-
throw new Error('edition-contract.json: "descriptorSchema" must be a non-empty string');
|
|
37
|
-
}
|
|
38
|
-
const kinds = Object.values(EditionKind);
|
|
39
|
-
const channels = Object.values(EditionChannel);
|
|
40
|
-
if (!sameSet(contract.descriptorKinds, kinds)) {
|
|
41
|
-
throw new Error(`edition-contract.json: descriptorKinds must be exactly ${kinds.join(' | ')} (got ${JSON.stringify(contract.descriptorKinds)})`);
|
|
42
|
-
}
|
|
43
|
-
const sealOf = contract.sealOf;
|
|
44
|
-
const texts = ['names', 'repository', 'sealedEdition'];
|
|
45
|
-
if (!isObject(sealOf) || !sameSet(Object.keys(sealOf), ['pattern', 'channel', ...texts]) || !texts.every((key) => typeof sealOf[key] === 'string' && sealOf[key] !== '')) {
|
|
46
|
-
throw new Error('edition-contract.json: "sealOf" must be exactly {pattern, names, repository, channel, sealedEdition}: the one statement of a sealed edition\'s sealOf');
|
|
47
|
-
}
|
|
48
|
-
assertAnchoredPattern(sealOf.pattern, 'sealOf.pattern');
|
|
49
|
-
if (!channels.includes(sealOf.channel)) {
|
|
50
|
-
throw new Error(`edition-contract.json: sealOf.channel must be one of ${channels.join(' | ')}`);
|
|
51
|
-
}
|
|
52
|
-
const channelsOf = { [EditionKind.Resolved]: channels, [EditionKind.Sealed]: [sealOf.channel] };
|
|
53
|
-
const signers = contract.signers;
|
|
54
|
-
if (!isObject(signers) || !sameSet(Object.keys(signers), ['oidcIssuer', 'identity', 'publishers']) || !/^https:\/\/\S+$/.test(signers.oidcIssuer ?? '') || typeof signers.identity !== 'string' || signers.identity === '') {
|
|
55
|
-
throw new Error('edition-contract.json: "signers" must be exactly {oidcIssuer: <https URL>, identity, publishers}');
|
|
56
|
-
}
|
|
57
|
-
const publishers = signers.publishers;
|
|
58
|
-
if (!isObject(publishers) || !sameSet(Object.keys(publishers), ['values', 'channelsByKind', 'shape']) || typeof publishers.values !== 'string' || publishers.values === '') {
|
|
59
|
-
throw new Error('edition-contract.json: signers.publishers must be exactly {values, channelsByKind, shape}');
|
|
60
|
-
}
|
|
61
|
-
const fields = ['repository', 'workflow', 'ref'];
|
|
62
|
-
if (!isObject(publishers.shape) || !sameSet(Object.keys(publishers.shape), fields)) {
|
|
63
|
-
throw new Error(`edition-contract.json: signers.publishers.shape must be exactly {${fields.join(', ')}}`);
|
|
64
|
-
}
|
|
65
|
-
for (const field of fields) {
|
|
66
|
-
assertAnchoredPattern(publishers.shape[field], `signers.publishers.shape.${field}`);
|
|
67
|
-
}
|
|
68
|
-
const trust = contract.evidenceTrust;
|
|
69
|
-
const states = Object.values(EvidenceTrustState);
|
|
70
|
-
if (!isObject(trust) || !isObject(trust.states) || !sameSet(Object.keys(trust.states), states)) {
|
|
71
|
-
throw new Error(`edition-contract.json: evidenceTrust.states must name exactly ${states.join(' | ')}`);
|
|
72
|
-
}
|
|
73
|
-
for (const [where, byKind] of [['signers.publishers.channelsByKind', publishers.channelsByKind], ['evidenceTrust.statesByKind', trust.statesByKind]]) {
|
|
74
|
-
if (!isObject(byKind) || !sameSet(Object.keys(byKind), kinds)) {
|
|
75
|
-
throw new Error(`edition-contract.json: ${where} must have exactly one entry per kind (${kinds.join(' | ')})`);
|
|
76
|
-
}
|
|
77
|
-
for (const kind of kinds) {
|
|
78
|
-
const named = Array.isArray(byKind[kind]) ? byKind[kind] : isObject(byKind[kind]) ? Object.keys(byKind[kind]) : undefined;
|
|
79
|
-
if (!sameSet(named, channelsOf[kind]) || new Set(named).size !== named.length) {
|
|
80
|
-
throw new Error(`edition-contract.json: ${where}.${kind} must have exactly one entry per channel of a ${kind} edition (${channelsOf[kind].join(' | ')})`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
for (const kind of kinds) {
|
|
85
|
-
for (const channel of channelsOf[kind]) {
|
|
86
|
-
const admitted = trust.statesByKind[kind][channel];
|
|
87
|
-
if (!Array.isArray(admitted) || admitted.length === 0 || new Set(admitted).size !== admitted.length || !admitted.every((state) => states.includes(state))) {
|
|
88
|
-
throw new Error(`edition-contract.json: evidenceTrust.statesByKind.${kind}.${channel} must be a non-empty set of ${states.join(' | ')}`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** The customer pin forms (provenancePins.customerForms), one key per form. */
|
|
95
|
-
export const CustomerPinForm = Object.freeze({ Catalogue: 'catalogue', CatalogueFree: 'catalogue-free' });
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* `provenancePins`: exactly the catalogue and definition pin statements and `customerForms`, the closed statement of how a
|
|
99
|
-
* customer edition records its vendor side. The catalogue form is admitted on every kind and channel a kind has (a customer
|
|
100
|
-
* edition that is not catalogue-free still requires the catalogue pin), the catalogue-free form on a subset of them; the
|
|
101
|
-
* vendor member pin pattern is an anchored regular expression.
|
|
102
|
-
*/
|
|
103
|
-
function assertProvenancePins(contract) {
|
|
104
|
-
const pins = contract.provenancePins;
|
|
105
|
-
const texts = ['catalogue', 'definition'];
|
|
106
|
-
if (!isObject(pins) || !sameSet(Object.keys(pins), [...texts, 'customerForms']) || !texts.every((key) => typeof pins[key] === 'string' && pins[key] !== '')) {
|
|
107
|
-
throw new Error('edition-contract.json: "provenancePins" must be exactly {catalogue, definition, customerForms}');
|
|
108
|
-
}
|
|
109
|
-
const forms = pins.customerForms;
|
|
110
|
-
const formNames = Object.values(CustomerPinForm);
|
|
111
|
-
if (!isObject(forms) || !sameSet(Object.keys(forms), ['names', 'vendorMemberPinPattern', ...formNames]) || typeof forms.names !== 'string' || forms.names === '') {
|
|
112
|
-
throw new Error(`edition-contract.json: provenancePins.customerForms must be exactly {names, vendorMemberPinPattern, ${formNames.join(', ')}}`);
|
|
113
|
-
}
|
|
114
|
-
assertAnchoredPattern(forms.vendorMemberPinPattern, 'provenancePins.customerForms.vendorMemberPinPattern');
|
|
115
|
-
const channelsOf = { [EditionKind.Resolved]: Object.values(EditionChannel), [EditionKind.Sealed]: [contract.sealOf.channel] };
|
|
116
|
-
for (const name of formNames) {
|
|
117
|
-
const form = forms[name];
|
|
118
|
-
if (!isObject(form) || !sameSet(Object.keys(form), ['pins', 'kinds']) || typeof form.pins !== 'string' || form.pins === '' || !isObject(form.kinds)) {
|
|
119
|
-
throw new Error(`edition-contract.json: provenancePins.customerForms.${name} must be exactly {pins, kinds}`);
|
|
120
|
-
}
|
|
121
|
-
for (const [kind, channels] of Object.entries(form.kinds)) {
|
|
122
|
-
const own = channelsOf[kind];
|
|
123
|
-
if (own === undefined || !Array.isArray(channels) || channels.length === 0 || new Set(channels).size !== channels.length || !channels.every((channel) => own.includes(channel))) {
|
|
124
|
-
throw new Error(`edition-contract.json: provenancePins.customerForms.${name}.kinds.${kind} must be a non-empty set of the channels of a ${kind} edition`);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
for (const [kind, own] of Object.entries(channelsOf)) {
|
|
129
|
-
if (!sameSet(forms[CustomerPinForm.Catalogue].kinds[kind], own)) {
|
|
130
|
-
throw new Error(`edition-contract.json: provenancePins.customerForms.catalogue.kinds.${kind} must name every channel of a ${kind} edition (${own.join(' | ')}): the catalogue form is the default form`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const SEGMENT = /^[a-z0-9][a-z0-9.-]*$/;
|
|
136
|
-
|
|
137
|
-
/** The strict parse of the contract; returns it unchanged. */
|
|
138
|
-
export function parseEditionContract(contract) {
|
|
139
|
-
if (contract === null || typeof contract !== 'object' || Array.isArray(contract)) {
|
|
140
|
-
throw new Error('edition-contract.json must be a JSON object');
|
|
141
|
-
}
|
|
142
|
-
if (contract.schema !== EDITION_CONTRACT_SCHEMA) {
|
|
143
|
-
throw new Error(`edition-contract.json: schema is ${JSON.stringify(contract.schema)}, expected ${JSON.stringify(EDITION_CONTRACT_SCHEMA)}`);
|
|
144
|
-
}
|
|
145
|
-
if (typeof contract.vendoring !== 'string' || contract.vendoring === '') {
|
|
146
|
-
throw new Error('edition-contract.json: "vendoring" must be the non-empty statement of how a consumer vendors this file');
|
|
147
|
-
}
|
|
148
|
-
if (typeof contract.repositoryPrefix !== 'string' || contract.repositoryPrefix === '') {
|
|
149
|
-
throw new Error('edition-contract.json: "repositoryPrefix" must be a non-empty string');
|
|
150
|
-
}
|
|
151
|
-
const repositories = contract.repositories;
|
|
152
|
-
if (repositories === null || typeof repositories !== 'object' || Array.isArray(repositories)) {
|
|
153
|
-
throw new Error('edition-contract.json has no "repositories": the namespace segment of each channel is read from it and nowhere else');
|
|
154
|
-
}
|
|
155
|
-
const channels = Object.values(EditionChannel);
|
|
156
|
-
const keys = Object.keys(repositories);
|
|
157
|
-
const unknown = keys.filter((key) => !channels.includes(key));
|
|
158
|
-
if (unknown.length > 0 || keys.length !== channels.length) {
|
|
159
|
-
throw new Error(
|
|
160
|
-
`edition-contract.json: "repositories" is exactly one entry per channel (${channels.join(' | ')}); ` +
|
|
161
|
-
(unknown.length > 0 ? `unknown channel ${unknown.map((key) => JSON.stringify(key)).join(', ')}` : `got ${keys.join(', ') || 'none'}`),
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
const segments = new Set();
|
|
165
|
-
for (const channel of channels) {
|
|
166
|
-
const entry = repositories[channel];
|
|
167
|
-
const entryKeys = entry !== null && typeof entry === 'object' && !Array.isArray(entry) ? Object.keys(entry) : [];
|
|
168
|
-
if (entryKeys.join() !== 'namespaceSegment' || typeof entry.namespaceSegment !== 'string' || !SEGMENT.test(entry.namespaceSegment)) {
|
|
169
|
-
throw new Error(`edition-contract.json: repositories.${channel} is exactly {namespaceSegment}, one lowercase path segment`);
|
|
170
|
-
}
|
|
171
|
-
segments.add(entry.namespaceSegment);
|
|
172
|
-
}
|
|
173
|
-
if (segments.size !== channels.length) {
|
|
174
|
-
throw new Error('edition-contract.json: the channels\' namespace segments must differ');
|
|
175
|
-
}
|
|
176
|
-
assertDescriptorVocabulary(contract);
|
|
177
|
-
assertProvenancePins(contract);
|
|
178
|
-
return contract;
|
|
179
|
-
}
|