@xemahq/xema 0.59.1 → 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 -1423
- 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 -2351
- 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,529 +0,0 @@
|
|
|
1
|
-
// edition-artifact — the files of an edition and where they may go.
|
|
2
|
-
//
|
|
3
|
-
// ONE layout for develop and release: an OCI artifact at
|
|
4
|
-
// `<registry root>/<channel segment>/xema-edition-<id>` (release: `editions`, develop: `develop-editions`,
|
|
5
|
-
// from edition-contract.json), addressed by digest, whose titled layers are
|
|
6
|
-
// `xema-edition.json` (the descriptor) plus the lock files. It is written to a
|
|
7
|
-
// scratch directory; the workflow pushes it with oras and signs the digest.
|
|
8
|
-
// Tags are for humans only (an edition resolved from a snapshot: the hash of every input, snapshotEditionTag; vendor release: the
|
|
9
|
-
// coordinate). Admission rests on the signature of the manifest digest, never on
|
|
10
|
-
// a channel label: no reader branches on `provenance.channel`.
|
|
11
|
-
//
|
|
12
|
-
// The artifact is never written to git, so the writer REFUSES a target inside
|
|
13
|
-
// either the data tree or the editions root.
|
|
14
|
-
|
|
15
|
-
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
|
|
16
|
-
import { basename, dirname, join, relative, resolve, sep, isAbsolute } from 'node:path';
|
|
17
|
-
|
|
18
|
-
import { assertCanonicalDistributionId } from './distribution-paths.mjs';
|
|
19
|
-
import { EDITION_CHART_SET_FILE, assertRosteredChartSetLock } from './edition-chart-set.mjs';
|
|
20
|
-
import {
|
|
21
|
-
CATALOGUE_PIN_KEY,
|
|
22
|
-
CustomerPinForm,
|
|
23
|
-
DEFINITION_PIN_KEY,
|
|
24
|
-
DIGEST_PIN_KEYS,
|
|
25
|
-
EDITION_DESCRIPTOR_FILE,
|
|
26
|
-
EDITION_DESCRIPTOR_SCHEMA,
|
|
27
|
-
EDITION_LOCKS,
|
|
28
|
-
EDITION_REPOSITORY_PREFIX,
|
|
29
|
-
EDITION_REPOSITORY_SEGMENTS,
|
|
30
|
-
EditionChannel,
|
|
31
|
-
EditionKind,
|
|
32
|
-
EditionLockFile,
|
|
33
|
-
SEALED_EDITION_CHANNEL,
|
|
34
|
-
SEAL_OF_PATTERN,
|
|
35
|
-
VENDOR_MEMBER_PIN_PATTERN,
|
|
36
|
-
admittedEvidenceTrustStates,
|
|
37
|
-
customerPinFormAdmitted,
|
|
38
|
-
} from './edition-constants.mjs';
|
|
39
|
-
import { dataRoot, editionsRoot } from './edition-workspace.mjs';
|
|
40
|
-
import { serializeJson, sha256Hex } from './lib.mjs';
|
|
41
|
-
import { isSourcePinKey, sortedSnapshotPins } from './pin-source.mjs';
|
|
42
|
-
import { readStrictJsonFile } from './strict-json.mjs';
|
|
43
|
-
|
|
44
|
-
/** Which GitHub Actions run produced the artifact; recorded in its descriptor. */
|
|
45
|
-
export function workflowFromEnv(env) {
|
|
46
|
-
const repository = env.GITHUB_REPOSITORY;
|
|
47
|
-
const runId = env.GITHUB_RUN_ID;
|
|
48
|
-
if (!repository || !runId) {
|
|
49
|
-
throw new Error(
|
|
50
|
-
'an edition records the workflow run that produced it: GITHUB_REPOSITORY and GITHUB_RUN_ID are required ' +
|
|
51
|
-
'(pass --local to write outside GitHub Actions)',
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
return { repository, runId };
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** The workflow stamp of a write that is explicitly not from CI. */
|
|
58
|
-
export const LOCAL_WORKFLOW = Object.freeze({ repository: 'local', runId: 'local' });
|
|
59
|
-
|
|
60
|
-
const ENGINE_IMAGE_PATTERN = /^[a-z0-9.-]+(:[0-9]+)?(\/[a-z0-9._-]+)+@sha256:[a-f0-9]{64}$/;
|
|
61
|
-
|
|
62
|
-
/** The deploy engine image, by digest only: `<repository>@sha256:<64 hex>`. No tag form, no default. */
|
|
63
|
-
export function assertEngineImage(image) {
|
|
64
|
-
if (typeof image !== 'string' || !ENGINE_IMAGE_PATTERN.test(image)) {
|
|
65
|
-
throw new Error(
|
|
66
|
-
`--engine-image ${JSON.stringify(image)} is not <repository>@sha256:<64 hex>: the deploy engine is pinned by digest, never by tag`,
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
return image;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* The descriptor (xema.edition/v2): what this artifact is (its `kind`, and for a sealed edition the
|
|
74
|
-
* resolved edition it seals, `sealOf`), which locks it carries, where it came from, whether the data
|
|
75
|
-
* root's editions are evidence-gated, and the deploy engine image that consumes it. Every writer of a
|
|
76
|
-
* descriptor passes here, and the strict parse it ends in holds the contract's rule: no route writes
|
|
77
|
-
* an edition whose evidence trust state its kind and channel do not admit, whatever its caller computed.
|
|
78
|
-
*/
|
|
79
|
-
export function editionDescriptor({ kind, sealOf, distributionId, channel, pins, workflow, evidenceTrustPolicy, engineImage }) {
|
|
80
|
-
assertCanonicalDistributionId(distributionId);
|
|
81
|
-
return parseEditionDescriptor({
|
|
82
|
-
schema: EDITION_DESCRIPTOR_SCHEMA,
|
|
83
|
-
kind,
|
|
84
|
-
...(kind === EditionKind.Sealed ? { sealOf } : {}),
|
|
85
|
-
distributionId,
|
|
86
|
-
locks: [...EDITION_LOCKS],
|
|
87
|
-
provenance: {
|
|
88
|
-
channel,
|
|
89
|
-
pins: sortedSnapshotPins(pins),
|
|
90
|
-
workflow: { repository: workflow?.repository, runId: workflow?.runId },
|
|
91
|
-
},
|
|
92
|
-
evidenceTrustPolicy,
|
|
93
|
-
engine: { image: engineImage },
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const COMMIT_PATTERN = /^[0-9a-f]{40}$/;
|
|
98
|
-
const DIGEST_PIN_PATTERN = /^sha256:[0-9a-f]{64}$/;
|
|
99
|
-
const DESCRIPTOR_KEYS = Object.freeze(['schema', 'kind', 'distributionId', 'locks', 'provenance', 'evidenceTrustPolicy', 'engine']);
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* The one parser of a sealed edition's `sealOf`, the digest-pinned ref of the resolved edition it seals: its form is the
|
|
103
|
-
* contract's `sealOf.pattern` (`<registry>/<path>@sha256:<64 hex>`), and its repository is an edition repository
|
|
104
|
-
* (`<registry root>/<channel segment>/xema-edition-<id>`). Returns `{ repository, digest, registryRoot, channel, distributionId }`.
|
|
105
|
-
*/
|
|
106
|
-
export function parseSealOf(sealOf) {
|
|
107
|
-
if (typeof sealOf !== 'string' || !SEAL_OF_PATTERN.test(sealOf)) {
|
|
108
|
-
throw new Error(
|
|
109
|
-
`sealOf ${JSON.stringify(sealOf)} does not match the contract's sealOf.pattern ${SEAL_OF_PATTERN.source}: a seal names the resolved edition ` +
|
|
110
|
-
`<registry root>/<channel segment>/${EDITION_REPOSITORY_PREFIX}<id> by digest`,
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
const at = sealOf.lastIndexOf('@');
|
|
114
|
-
const digest = sealOf.slice(at + 1);
|
|
115
|
-
const repository = sealOf.slice(0, at);
|
|
116
|
-
return { repository, digest, ...parseEditionRepository(repository) };
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const exactKeys = (value, keys, where) => {
|
|
120
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).sort().join() !== [...keys].sort().join()) {
|
|
121
|
-
throw new Error(`${where} must be exactly {${keys.join(', ')}}`);
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* The closed customer pin rule (edition-contract.json provenancePins.customerForms). A descriptor whose pins carry the
|
|
127
|
-
* definition pin is a customer edition, and it carries exactly one form: the CATALOGUE form (the catalogue pin, the
|
|
128
|
-
* definition pin and sources/<name> commits, nothing else), or the CATALOGUE-FREE form (no catalogue pin, at least one
|
|
129
|
-
* vendor member pin), each only on the kinds and channels the contract admits it on. A descriptor without the definition
|
|
130
|
-
* pin is not a customer edition and the rule does not apply to it.
|
|
131
|
-
*/
|
|
132
|
-
export function assertCustomerPinForm(kind, channel, pins, distributionId) {
|
|
133
|
-
if (!(DEFINITION_PIN_KEY in pins)) {
|
|
134
|
-
// only a customer edition records a vendor side: every other edition carries neither form's marker
|
|
135
|
-
if (CATALOGUE_PIN_KEY in pins) {
|
|
136
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: the ${kind} ${channel} edition "${distributionId}" carries the catalogue pin without the definition pin: only a customer edition (the definition pin) records the catalogue it was resolved against`);
|
|
137
|
-
}
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
const where = `${EDITION_DESCRIPTOR_FILE}: the customer ${kind} ${channel} edition "${distributionId}"`;
|
|
141
|
-
if (CATALOGUE_PIN_KEY in pins) {
|
|
142
|
-
if (!customerPinFormAdmitted(CustomerPinForm.Catalogue, kind, channel)) {
|
|
143
|
-
throw new Error(`${where} carries the catalogue pin, but the contract admits the catalogue form on no ${kind} ${channel} edition`);
|
|
144
|
-
}
|
|
145
|
-
const stray = Object.keys(pins).filter((key) => key !== CATALOGUE_PIN_KEY && key !== DEFINITION_PIN_KEY && !isSourcePinKey(key));
|
|
146
|
-
if (stray.length > 0) {
|
|
147
|
-
throw new Error(`${where} carries the catalogue pin and also ${stray.map((key) => JSON.stringify(key)).join(', ')}: the catalogue form pins only the catalogue, the definition and sources/<name>`);
|
|
148
|
-
}
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
if (!customerPinFormAdmitted(CustomerPinForm.CatalogueFree, kind, channel)) {
|
|
152
|
-
throw new Error(`${where} carries no catalogue pin: only a ${catalogueFreeAdmissions()} customer edition may be resolved catalogue-free`);
|
|
153
|
-
}
|
|
154
|
-
if (!Object.keys(pins).some((key) => VENDOR_MEMBER_PIN_PATTERN.test(key))) {
|
|
155
|
-
throw new Error(`${where} carries neither the catalogue pin nor a vendor member pin: a catalogue-free edition records the vendor member pins it was resolved from`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const catalogueFreeAdmissions = () =>
|
|
160
|
-
Object.values(EditionKind)
|
|
161
|
-
.flatMap((kind) => Object.values(EditionChannel).filter((channel) => customerPinFormAdmitted(CustomerPinForm.CatalogueFree, kind, channel)).map((channel) => `${kind} ${channel}`))
|
|
162
|
-
.join(' or ');
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* The strict parse of a descriptor: exact keys, the closed kind enum (no default, never inferred), `sealOf` exactly on a
|
|
166
|
-
* sealed edition, closed vocabularies, the evidence trust state the contract admits for the kind on the channel, an engine
|
|
167
|
-
* image by digest. Returns it unchanged.
|
|
168
|
-
*/
|
|
169
|
-
export function parseEditionDescriptor(value) {
|
|
170
|
-
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
171
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE} must be a JSON object`);
|
|
172
|
-
}
|
|
173
|
-
if (value.schema !== EDITION_DESCRIPTOR_SCHEMA) {
|
|
174
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: schema is ${JSON.stringify(value.schema)}, expected ${JSON.stringify(EDITION_DESCRIPTOR_SCHEMA)}`);
|
|
175
|
-
}
|
|
176
|
-
if (!Object.values(EditionKind).includes(value.kind)) {
|
|
177
|
-
throw new Error(
|
|
178
|
-
`${EDITION_DESCRIPTOR_FILE}: kind is ${JSON.stringify(value.kind)}, expected exactly ${Object.values(EditionKind).join(' | ')}; there is no default kind and none is inferred`,
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
const sealed = value.kind === EditionKind.Sealed;
|
|
182
|
-
if (!sealed && 'sealOf' in value) {
|
|
183
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: kind ${value.kind} carries sealOf; only a sealed edition names the resolved edition it seals`);
|
|
184
|
-
}
|
|
185
|
-
exactKeys(value, sealed ? [...DESCRIPTOR_KEYS, 'sealOf'] : DESCRIPTOR_KEYS, EDITION_DESCRIPTOR_FILE);
|
|
186
|
-
assertCanonicalDistributionId(value.distributionId);
|
|
187
|
-
if (!Array.isArray(value.locks) || value.locks.length === 0 || value.locks.some((file) => typeof file !== 'string' || file === '')) {
|
|
188
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: locks must be a non-empty array of file names`);
|
|
189
|
-
}
|
|
190
|
-
exactKeys(value.provenance, ['channel', 'pins', 'workflow'], `${EDITION_DESCRIPTOR_FILE} provenance`);
|
|
191
|
-
if (!Object.values(EditionChannel).includes(value.provenance.channel)) {
|
|
192
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: provenance.channel must be one of ${Object.values(EditionChannel).join(' | ')}`);
|
|
193
|
-
}
|
|
194
|
-
const { pins, workflow } = value.provenance;
|
|
195
|
-
if (pins === null || typeof pins !== 'object' || Array.isArray(pins)) {
|
|
196
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: provenance.pins must map pin keys to 40-hex commits (the ${DIGEST_PIN_KEYS.map((key) => `"${key}"`).join(' and ')} pins to sha256 digests)`);
|
|
197
|
-
}
|
|
198
|
-
for (const [key, pin] of Object.entries(pins)) {
|
|
199
|
-
const digestPin = DIGEST_PIN_KEYS.includes(key);
|
|
200
|
-
const pattern = digestPin ? DIGEST_PIN_PATTERN : COMMIT_PATTERN;
|
|
201
|
-
if (typeof pin !== 'string' || !pattern.test(pin)) {
|
|
202
|
-
throw new Error(
|
|
203
|
-
digestPin
|
|
204
|
-
? `${EDITION_DESCRIPTOR_FILE}: provenance.pins["${key}"] must be a sha256:<64 hex> digest`
|
|
205
|
-
: `${EDITION_DESCRIPTOR_FILE}: provenance.pins must map pin keys to 40-hex commits (${JSON.stringify(key)} is not)`,
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
assertCustomerPinForm(value.kind, value.provenance.channel, pins, value.distributionId);
|
|
210
|
-
exactKeys(workflow, ['repository', 'runId'], `${EDITION_DESCRIPTOR_FILE} provenance.workflow`);
|
|
211
|
-
if (!workflow.repository || !workflow.runId || typeof workflow.repository !== 'string' || typeof workflow.runId !== 'string') {
|
|
212
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: provenance.workflow is {repository, runId}, both non-empty strings`);
|
|
213
|
-
}
|
|
214
|
-
if (sealed && value.provenance.channel !== SEALED_EDITION_CHANNEL) {
|
|
215
|
-
throw new Error(
|
|
216
|
-
`${EDITION_DESCRIPTOR_FILE}: a sealed edition records provenance.channel ${SEALED_EDITION_CHANNEL} (a seal is ${SEALED_EDITION_CHANNEL}-only); "${value.distributionId}" records ${JSON.stringify(value.provenance.channel)}`,
|
|
217
|
-
);
|
|
218
|
-
}
|
|
219
|
-
// The reader holds the writer's rule (contract evidenceTrust.statesByKind): `not-armed` only on a resolved develop edition.
|
|
220
|
-
const admitted = admittedEvidenceTrustStates(value.kind, value.provenance.channel);
|
|
221
|
-
if (!admitted.includes(value.evidenceTrustPolicy)) {
|
|
222
|
-
throw new Error(
|
|
223
|
-
`${EDITION_DESCRIPTOR_FILE}: a ${value.kind} ${value.provenance.channel} edition records evidenceTrustPolicy ${admitted.join(' | ')}; ` +
|
|
224
|
-
`"${value.distributionId}" records ${JSON.stringify(value.evidenceTrustPolicy)}`,
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
if (sealed) {
|
|
228
|
-
const sealOf = parseSealOf(value.sealOf);
|
|
229
|
-
if (sealOf.distributionId !== value.distributionId) {
|
|
230
|
-
throw new Error(`${EDITION_DESCRIPTOR_FILE}: sealOf ${value.sealOf} is an edition of "${sealOf.distributionId}", not of "${value.distributionId}"`);
|
|
231
|
-
}
|
|
232
|
-
if (sealOf.channel !== value.provenance.channel) {
|
|
233
|
-
throw new Error(
|
|
234
|
-
`${EDITION_DESCRIPTOR_FILE}: sealOf ${value.sealOf} is a ${sealOf.channel} edition, but the seal records provenance.channel ${value.provenance.channel}; a seal keeps the channel of the edition it seals`,
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
exactKeys(value.engine, ['image'], `${EDITION_DESCRIPTOR_FILE} engine`);
|
|
239
|
-
assertEngineImage(value.engine.image);
|
|
240
|
-
return value;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
const REGISTRY_PATTERN = /^[a-z0-9.-]+(:[0-9]+)?(\/[a-z0-9._-]+)+$/;
|
|
244
|
-
/** `.` and `..` match the segment grammar and name no namespace: a registry resolves them away. */
|
|
245
|
-
const isDotSegment = (segment) => segment === '.' || segment === '..';
|
|
246
|
-
const TAG_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9._-]{0,127}$/;
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* The registry ROOT is the caller's `<host>[:port]/<namespace>[/...]`; the CLI appends the channel's
|
|
250
|
-
* namespace segment AND `xema-edition-<id>` itself, so a root already ending in either is refused.
|
|
251
|
-
*/
|
|
252
|
-
export function assertRegistry(registryRoot) {
|
|
253
|
-
if (typeof registryRoot !== 'string' || !REGISTRY_PATTERN.test(registryRoot) || registryRoot.split('/').slice(1).some(isDotSegment)) {
|
|
254
|
-
throw new Error(
|
|
255
|
-
`--registry ${JSON.stringify(registryRoot)} is not <registry-host>[:port]/<namespace>[/...] (lowercase, e.g. registry.example.com/acme)`,
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
const last = registryRoot.split('/').pop();
|
|
259
|
-
if (Object.values(EDITION_REPOSITORY_SEGMENTS).includes(last) || last.startsWith(EDITION_REPOSITORY_PREFIX)) {
|
|
260
|
-
throw new Error(
|
|
261
|
-
`--registry ${registryRoot} ends in "${last}", which the CLI appends itself: pass the registry root; ` +
|
|
262
|
-
`the CLI appends <${Object.values(EDITION_REPOSITORY_SEGMENTS).join('|')}>/${EDITION_REPOSITORY_PREFIX}<id>`,
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function assertChannel(channel) {
|
|
268
|
-
if (!Object.values(EditionChannel).includes(channel)) {
|
|
269
|
-
throw new Error(`edition channel ${JSON.stringify(channel)} must be one of ${Object.values(EditionChannel).join(' | ')}`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/** `<registry root>/<channel segment>/xema-edition-<id>`: the repository of an edition produced for `channel`. */
|
|
274
|
-
export function editionRepository(distributionId, registryRoot, channel) {
|
|
275
|
-
assertCanonicalDistributionId(distributionId);
|
|
276
|
-
assertRegistry(registryRoot);
|
|
277
|
-
assertChannel(channel);
|
|
278
|
-
return `${registryRoot}/${EDITION_REPOSITORY_SEGMENTS[channel]}/${EDITION_REPOSITORY_PREFIX}${distributionId}`;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* The one parser of an edition repository `<root>/<segment>/xema-edition-<id>`, returning
|
|
283
|
-
* `{ registryRoot, channel, distributionId }`. The penultimate segment must be one of the contract's
|
|
284
|
-
* channel segments and the last must carry the repository prefix.
|
|
285
|
-
*/
|
|
286
|
-
export function parseEditionRepository(repository) {
|
|
287
|
-
const segments = typeof repository === 'string' ? repository.split('/') : [];
|
|
288
|
-
const last = segments.at(-1) ?? '';
|
|
289
|
-
const segment = segments.at(-2);
|
|
290
|
-
const channel = Object.values(EditionChannel).find((candidate) => EDITION_REPOSITORY_SEGMENTS[candidate] === segment);
|
|
291
|
-
if (channel === undefined) {
|
|
292
|
-
throw new Error(
|
|
293
|
-
`edition repository ${JSON.stringify(repository)}: its namespace segment ${JSON.stringify(segment)} is not one of ` +
|
|
294
|
-
Object.values(EDITION_REPOSITORY_SEGMENTS).map((name) => `"${name}"`).join(', '),
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
if (!last.startsWith(EDITION_REPOSITORY_PREFIX)) {
|
|
298
|
-
throw new Error(`edition repository ${JSON.stringify(repository)}: its name ${JSON.stringify(last)} lacks the "${EDITION_REPOSITORY_PREFIX}" prefix`);
|
|
299
|
-
}
|
|
300
|
-
const distributionId = last.slice(EDITION_REPOSITORY_PREFIX.length);
|
|
301
|
-
assertCanonicalDistributionId(distributionId);
|
|
302
|
-
const registryRoot = segments.slice(0, -2).join('/');
|
|
303
|
-
assertRegistry(registryRoot);
|
|
304
|
-
return { registryRoot, channel, distributionId };
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
/** `<repository>:<tag>`; the tag is for humans, the artifact is addressed by its digest. */
|
|
308
|
-
export function editionTarget(distributionId, registryRoot, channel, tag) {
|
|
309
|
-
if (typeof tag !== 'string' || !TAG_PATTERN.test(tag)) {
|
|
310
|
-
throw new Error(`tag ${JSON.stringify(tag)} is not an OCI tag`);
|
|
311
|
-
}
|
|
312
|
-
return `${editionRepository(distributionId, registryRoot, channel)}:${tag}`;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/** The version of this CLI, the writer of every descriptor and lock: read lazily, so a bundle that never tags does not need it. */
|
|
316
|
-
let cliVersionMemo;
|
|
317
|
-
export function cliVersion() {
|
|
318
|
-
if (cliVersionMemo === undefined) {
|
|
319
|
-
const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
320
|
-
if (typeof version !== 'string' || version.length === 0) {throw new Error('@xemahq/xema: no "version" in its package.json');}
|
|
321
|
-
cliVersionMemo = version;
|
|
322
|
-
}
|
|
323
|
-
return cliVersionMemo;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/** `{ <source>: "<registry>/<prefix>" }` sorted by source: the canonical form of a parsed --source-image map. */
|
|
327
|
-
export function canonicalSourceImages(sourceImages = new Map()) {
|
|
328
|
-
return Object.fromEntries(
|
|
329
|
-
[...sourceImages.entries()]
|
|
330
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
331
|
-
.map(([name, { imageRegistry, imageNamePrefix }]) => [name, `${imageRegistry}/${imageNamePrefix}`]),
|
|
332
|
-
);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* The tag of an edition resolved from a snapshot (a develop edition, a customer release edition): sha256 of the canonical `{ cli, engine, pins, sourceImages }`, plus `imageBuildRecord` (the record's digest) for a develop resolve --images-from. Every input of
|
|
337
|
-
* the bytes the artifact records is inside it. The pins fix the locks and the descriptor's pins: a vendor edition's
|
|
338
|
-
* commits fix its definitions; a customer edition's pins carry its sources' commits, the catalogue digest and the
|
|
339
|
-
* digest of its canonical definition (`definition`: vendor selection, image registry mirror, Store publisher anchors); the
|
|
340
|
-
* descriptor's `engine.image` is not a pin; a customer's `--source-image` map composes its own image rows
|
|
341
|
-
* (`<registry>/<prefix><subject>`) and is not a pin either; and the CLI version is the writer of every
|
|
342
|
-
* byte. A tag over the pins alone named two artifacts that differ in any of the others, and a re-run could
|
|
343
|
-
* only refuse the existing one (`check-existing`) or reuse a stale one. `provenance.workflow` (the run that
|
|
344
|
-
* wrote the bytes) is the one recorded field outside it: a fact about the artifact, not an input to it.
|
|
345
|
-
*/
|
|
346
|
-
export function snapshotEditionTag({ pins, engineImage, sourceImages = new Map(), imageBuildRecordDigest, version = cliVersion() }) {
|
|
347
|
-
return sha256Hex(
|
|
348
|
-
serializeJson({
|
|
349
|
-
cli: version,
|
|
350
|
-
engine: assertEngineImage(engineImage),
|
|
351
|
-
pins: sortedSnapshotPins(pins),
|
|
352
|
-
sourceImages: canonicalSourceImages(sourceImages),
|
|
353
|
-
// A develop resolve from an image build record (--images-from): the record fixes the image rows, and a satellite
|
|
354
|
-
// digest changes independently of the pins. Absent on the probe path, whose tag inputs are unchanged.
|
|
355
|
-
...(imageBuildRecordDigest === undefined ? {} : { imageBuildRecord: assertImageBuildRecordDigest(imageBuildRecordDigest) }),
|
|
356
|
-
}),
|
|
357
|
-
);
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
function assertImageBuildRecordDigest(digest) {
|
|
361
|
-
if (typeof digest !== 'string' || !/^[0-9a-f]{64}$/.test(digest)) {
|
|
362
|
-
throw new Error(`an image build record digest must be 64 lowercase hex; got ${JSON.stringify(digest)}`);
|
|
363
|
-
}
|
|
364
|
-
return digest;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/** The target of an edition resolved from a snapshot of pins, on either channel: the tag is `snapshotEditionTag`. */
|
|
368
|
-
export function snapshotEditionTarget(channel, distributionId, pins, { registry, engineImage, sourceImages, imageBuildRecordDigest }) {
|
|
369
|
-
return editionTarget(distributionId, registry, channel, snapshotEditionTag({ pins, engineImage, sourceImages, imageBuildRecordDigest }));
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/** A develop edition's target: the tag is `snapshotEditionTag` of the pins, the engine, the source images and any image build record. */
|
|
373
|
-
export function developEditionTarget(distributionId, pins, { registry, engineImage, sourceImages, imageBuildRecordDigest }) {
|
|
374
|
-
return snapshotEditionTarget(EditionChannel.Develop, distributionId, pins, { registry, engineImage, sourceImages, imageBuildRecordDigest });
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
function realpathOfPlanned(path) {
|
|
378
|
-
const absolute = resolve(path);
|
|
379
|
-
let existing = absolute;
|
|
380
|
-
const rest = [];
|
|
381
|
-
while (!existsSync(existing)) {
|
|
382
|
-
rest.unshift(basename(existing));
|
|
383
|
-
existing = dirname(existing);
|
|
384
|
-
}
|
|
385
|
-
return join(realpathSync(existing), ...rest);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
function isWithin(path, directory) {
|
|
389
|
-
const inside = relative(realpathOfPlanned(directory), path);
|
|
390
|
-
return !(inside === '..' || inside.startsWith(`..${sep}`) || isAbsolute(inside));
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
function assertOutsideCommittedTrees(outDir) {
|
|
394
|
-
const planned = realpathOfPlanned(outDir);
|
|
395
|
-
for (const [label, tree] of [
|
|
396
|
-
['the data tree', dataRoot()],
|
|
397
|
-
['the editions root', editionsRoot()],
|
|
398
|
-
]) {
|
|
399
|
-
if (isWithin(planned, tree)) {
|
|
400
|
-
throw new Error(`refusing to write an edition artifact to ${outDir}: it lies inside ${label} (${tree}), which is committed content`);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
/** Write the descriptor and the locks of a RESOLVED edition of `channel` to `outDir`; returns the descriptor. */
|
|
406
|
-
export function writeEditionArtifact({
|
|
407
|
-
outDir,
|
|
408
|
-
channel,
|
|
409
|
-
distributionId,
|
|
410
|
-
pins,
|
|
411
|
-
workflow,
|
|
412
|
-
evidenceTrustPolicy,
|
|
413
|
-
engineImage,
|
|
414
|
-
distributionLock,
|
|
415
|
-
imageLock,
|
|
416
|
-
authorizationLock,
|
|
417
|
-
chartSetLock,
|
|
418
|
-
}) {
|
|
419
|
-
assertOutsideCommittedTrees(outDir);
|
|
420
|
-
const byFile = [
|
|
421
|
-
[EditionLockFile.Distribution, distributionLock],
|
|
422
|
-
[EditionLockFile.Images, imageLock],
|
|
423
|
-
[EditionLockFile.Authorization, authorizationLock],
|
|
424
|
-
[EditionLockFile.ChartSet, chartSetLock],
|
|
425
|
-
];
|
|
426
|
-
for (const [file, lock] of byFile) {
|
|
427
|
-
if (lock === null || lock === undefined) {
|
|
428
|
-
throw new Error(`edition "${distributionId}" has no ${file}: an edition carries all four locks`);
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
assertRosteredChartSetLock(chartSetLock, EDITION_CHART_SET_FILE);
|
|
432
|
-
const descriptor = editionDescriptor({ kind: EditionKind.Resolved, distributionId, channel, pins, workflow, evidenceTrustPolicy, engineImage });
|
|
433
|
-
mkdirSync(outDir, { recursive: true });
|
|
434
|
-
for (const [file, value] of [[EDITION_DESCRIPTOR_FILE, descriptor], ...byFile]) {
|
|
435
|
-
writeFileSync(join(outDir, file), serializeJson(value));
|
|
436
|
-
}
|
|
437
|
-
return descriptor;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* An existing develop tag is reused only if it IS this snapshot: the tag
|
|
442
|
-
* is a hash of its inputs, but a tag is mutable registry state, so the pulled
|
|
443
|
-
* descriptor must say the same edition, the same channel, exactly the same pins,
|
|
444
|
-
* the same engine image, the same evidence trust state and the same lock set. A customer artifact (`catalogueDigest` and
|
|
445
|
-
* `definitionDigest` given) must also record those digests as its catalogue and definition provenance pins. Throws naming
|
|
446
|
-
* the first difference.
|
|
447
|
-
*/
|
|
448
|
-
export function assertExistingArtifactMatches({ artifactDir, distributionId, channel, pins, engineImage, evidenceTrustPolicy, catalogueDigest, definitionDigest }) {
|
|
449
|
-
const descriptorPath = join(artifactDir, EDITION_DESCRIPTOR_FILE);
|
|
450
|
-
if (!existsSync(descriptorPath)) {
|
|
451
|
-
throw new Error(`the existing artifact holds no ${EDITION_DESCRIPTOR_FILE}; refusing to reuse a tag that is not an edition`);
|
|
452
|
-
}
|
|
453
|
-
const existing = parseEditionDescriptor(readStrictJsonFile(descriptorPath));
|
|
454
|
-
if (existing.kind !== EditionKind.Resolved) {
|
|
455
|
-
throw new Error(`the existing artifact is a ${existing.kind} edition; only a resolved edition is reused for a snapshot, refusing to reuse it`);
|
|
456
|
-
}
|
|
457
|
-
assertCanonicalDistributionId(distributionId);
|
|
458
|
-
if (existing.distributionId !== distributionId) {
|
|
459
|
-
throw new Error(`the existing artifact's distributionId is ${JSON.stringify(existing.distributionId)}, expected ${JSON.stringify(distributionId)}; refusing to reuse it`);
|
|
460
|
-
}
|
|
461
|
-
if (existing.provenance.channel !== channel) {
|
|
462
|
-
throw new Error(`the existing artifact was produced on channel ${JSON.stringify(existing.provenance.channel)}, expected ${JSON.stringify(channel)}; refusing to reuse it`);
|
|
463
|
-
}
|
|
464
|
-
if (existing.evidenceTrustPolicy !== evidenceTrustPolicy) {
|
|
465
|
-
throw new Error(`the existing artifact records evidenceTrustPolicy ${JSON.stringify(existing.evidenceTrustPolicy)}, this data root's is ${JSON.stringify(evidenceTrustPolicy)}; refusing to reuse it`);
|
|
466
|
-
}
|
|
467
|
-
if (catalogueDigest !== undefined && existing.provenance.pins[CATALOGUE_PIN_KEY] !== catalogueDigest) {
|
|
468
|
-
throw new Error(
|
|
469
|
-
`the existing artifact's catalogue provenance pin is ${JSON.stringify(existing.provenance.pins[CATALOGUE_PIN_KEY])}, ` +
|
|
470
|
-
`the pinned catalogue is ${catalogueDigest}; refusing to reuse it`,
|
|
471
|
-
);
|
|
472
|
-
}
|
|
473
|
-
if (definitionDigest !== undefined && existing.provenance.pins[DEFINITION_PIN_KEY] !== definitionDigest) {
|
|
474
|
-
throw new Error(
|
|
475
|
-
`the existing artifact was resolved from customer definition ${JSON.stringify(existing.provenance.pins[DEFINITION_PIN_KEY])}, ` +
|
|
476
|
-
`this definition is ${definitionDigest} (its selection, mirror or Store publisher anchors differ); refusing to reuse it`,
|
|
477
|
-
);
|
|
478
|
-
}
|
|
479
|
-
if (serializeJson(existing.provenance.pins) !== serializeJson(sortedSnapshotPins(pins))) {
|
|
480
|
-
throw new Error('the existing artifact was resolved from different pins than this snapshot (tag and content disagree); refusing to reuse it');
|
|
481
|
-
}
|
|
482
|
-
if (existing.engine.image !== assertEngineImage(engineImage)) {
|
|
483
|
-
throw new Error(`the existing artifact names engine ${existing.engine.image}, not ${engineImage}; refusing to reuse it`);
|
|
484
|
-
}
|
|
485
|
-
if (serializeJson(existing.locks) !== serializeJson(EDITION_LOCKS)) {
|
|
486
|
-
throw new Error('the existing artifact lists a different lock set than an edition carries; refusing to reuse it');
|
|
487
|
-
}
|
|
488
|
-
for (const file of existing.locks) {
|
|
489
|
-
if (!existsSync(join(artifactDir, file))) {
|
|
490
|
-
throw new Error(`the existing artifact lacks ${file}, which its descriptor lists; refusing to reuse it`);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/**
|
|
496
|
-
* Write the SEALED edition of one exact resolved edition to `outDir`: every layer of the resolved artifact other than
|
|
497
|
-
* its descriptor, byte for byte (`layers`: title -> bytes, already proven to be the layers of `sealOf`), plus a sealed
|
|
498
|
-
* descriptor. The seal keeps the resolved edition's distribution, locks, channel, pins and engine image; it records
|
|
499
|
-
* `sealOf`, the run that sealed it, and an evidence trust state its kind admits (contract: armed). Returns the descriptor.
|
|
500
|
-
*/
|
|
501
|
-
export function writeSealedEditionArtifact({ outDir, resolved, sealOf, layers, workflow, evidenceTrustPolicy }) {
|
|
502
|
-
assertOutsideCommittedTrees(outDir);
|
|
503
|
-
if (resolved.kind !== EditionKind.Resolved) {
|
|
504
|
-
throw new Error(`${sealOf} is a ${resolved.kind} edition; a seal seals exactly one resolved edition`);
|
|
505
|
-
}
|
|
506
|
-
if (layers.has(EDITION_DESCRIPTOR_FILE)) {
|
|
507
|
-
throw new Error(`the layers of a seal exclude the resolved ${EDITION_DESCRIPTOR_FILE}; the seal writes its own`);
|
|
508
|
-
}
|
|
509
|
-
const missing = resolved.locks.filter((file) => !layers.has(file));
|
|
510
|
-
if (missing.length > 0) {
|
|
511
|
-
throw new Error(`${sealOf} lacks ${missing.join(', ')}, which its descriptor lists`);
|
|
512
|
-
}
|
|
513
|
-
const descriptor = editionDescriptor({
|
|
514
|
-
kind: EditionKind.Sealed,
|
|
515
|
-
sealOf,
|
|
516
|
-
distributionId: resolved.distributionId,
|
|
517
|
-
channel: resolved.provenance.channel,
|
|
518
|
-
pins: resolved.provenance.pins,
|
|
519
|
-
workflow,
|
|
520
|
-
evidenceTrustPolicy,
|
|
521
|
-
engineImage: resolved.engine.image,
|
|
522
|
-
});
|
|
523
|
-
mkdirSync(outDir, { recursive: true });
|
|
524
|
-
writeFileSync(join(outDir, EDITION_DESCRIPTOR_FILE), serializeJson(descriptor));
|
|
525
|
-
for (const [file, bytes] of layers) {
|
|
526
|
-
writeFileSync(join(outDir, file), bytes);
|
|
527
|
-
}
|
|
528
|
-
return descriptor;
|
|
529
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// `xema edition biome-manifests <id> --json`: the PINNED xema-biome.json of every
|
|
3
|
-
// biome of one edition, as JSON.
|
|
4
|
-
//
|
|
5
|
-
// usage: xema edition biome-manifests <id> --json --data-root <dir> --editions-root <dir>
|
|
6
|
-
// --sources-root <dir> --kernel <dir>
|
|
7
|
-
//
|
|
8
|
-
// For every biome of the edition's resolved lock this reads the manifest AT the
|
|
9
|
-
// commit the lock pins (the way the seal and `xema edition check` read it) and
|
|
10
|
-
// prints one document on stdout:
|
|
11
|
-
// {"schema":"xema.edition-biome-manifests/v1","distributionId","biomes":[{"id","repo","sourceCommit","manifest"}]}
|
|
12
|
-
// sorted by biome id. A consumer (the store catalogue) reads this instead of
|
|
13
|
-
// reading the sources itself. Read-only. When the lock is absent or a pinned
|
|
14
|
-
// manifest cannot be read it prints NOTHING on stdout, a message on stderr, and exits non-zero.
|
|
15
|
-
|
|
16
|
-
import { readFileSync } from 'node:fs';
|
|
17
|
-
import { join } from 'node:path';
|
|
18
|
-
|
|
19
|
-
import { pinnedBiomeManifests } from './biome-content.mjs';
|
|
20
|
-
import { assertCanonicalDistributionId } from './distribution-paths.mjs';
|
|
21
|
-
import { editionPinnedInputs } from './edition-pinned-inputs.mjs';
|
|
22
|
-
import {
|
|
23
|
-
WorkspaceRoot,
|
|
24
|
-
configureEditionWorkspaceFromArgv,
|
|
25
|
-
editionsRoot,
|
|
26
|
-
isEntryModule,
|
|
27
|
-
} from './edition-workspace.mjs';
|
|
28
|
-
import { loadKernelDistributionSchemas, serializeJson } from './lib.mjs';
|
|
29
|
-
import { externalSourceTrees, sourceTreeLocator } from './resolve-images.mjs';
|
|
30
|
-
import { createPinnedSourceAuthority } from './source-authority.mjs';
|
|
31
|
-
|
|
32
|
-
export const EDITION_BIOME_MANIFESTS_SCHEMA = 'xema.edition-biome-manifests/v1';
|
|
33
|
-
|
|
34
|
-
const USAGE =
|
|
35
|
-
'usage: xema edition biome-manifests <id> --json --data-root <dir> --editions-root <dir> --sources-root <dir> --kernel <dir>';
|
|
36
|
-
|
|
37
|
-
function readLock(distributionId, file) {
|
|
38
|
-
try {
|
|
39
|
-
return JSON.parse(readFileSync(join(editionsRoot(), distributionId, file), 'utf8'));
|
|
40
|
-
} catch (error) {
|
|
41
|
-
throw new Error(`edition "${distributionId}" has no readable ${file} under ${editionsRoot()}: ${error.message}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export async function editionBiomeManifests({ distributionId, schemas }) {
|
|
46
|
-
assertCanonicalDistributionId(distributionId);
|
|
47
|
-
const lock = schemas.parseDistributionLock(readLock(distributionId, 'distribution.lock.json'));
|
|
48
|
-
const imageLock = schemas.parseImageLock(readLock(distributionId, 'images.lock.json'));
|
|
49
|
-
const authority = createPinnedSourceAuthority({ pins: (await editionPinnedInputs(distributionId, { schemas })).repositoryPins });
|
|
50
|
-
return {
|
|
51
|
-
schema: EDITION_BIOME_MANIFESTS_SCHEMA,
|
|
52
|
-
distributionId,
|
|
53
|
-
biomes: await pinnedBiomeManifests({
|
|
54
|
-
schemas,
|
|
55
|
-
lock,
|
|
56
|
-
imageLock,
|
|
57
|
-
locate: sourceTreeLocator(externalSourceTrees(lock)),
|
|
58
|
-
vendoredCommit: (repo) => authority.vendoredSourceCommitForRepository(repo),
|
|
59
|
-
}),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async function main() {
|
|
64
|
-
const rest = configureEditionWorkspaceFromArgv(process.argv.slice(2), [
|
|
65
|
-
WorkspaceRoot.Data,
|
|
66
|
-
WorkspaceRoot.Editions,
|
|
67
|
-
WorkspaceRoot.Sources,
|
|
68
|
-
WorkspaceRoot.Kernel,
|
|
69
|
-
]);
|
|
70
|
-
const operands = rest.filter((arg) => arg !== '--json');
|
|
71
|
-
if (operands.length !== 1 || rest.length - operands.length !== 1) {
|
|
72
|
-
throw new Error(USAGE);
|
|
73
|
-
}
|
|
74
|
-
const schemas = await loadKernelDistributionSchemas();
|
|
75
|
-
// Built whole before anything is written, so a refusal leaves stdout empty.
|
|
76
|
-
const document = await editionBiomeManifests({ distributionId: operands[0], schemas });
|
|
77
|
-
process.stdout.write(serializeJson(document));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (isEntryModule(import.meta.url)) {
|
|
81
|
-
main().catch((error) => {
|
|
82
|
-
console.error(`[edition-biome-manifests] ${error.message}`);
|
|
83
|
-
process.exitCode = 1;
|
|
84
|
-
});
|
|
85
|
-
}
|