@astrale-os/sdk 0.6.0-beta.2 → 0.6.0-beta.21
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 +74 -14
- package/dist/application/action/action.d.ts +6 -0
- package/dist/application/action/authoring.d.ts +1 -1
- package/dist/application/action/context.d.ts +17 -8
- package/dist/application/action/define.d.ts +3 -3
- package/dist/application/action/index.d.ts +1 -1
- package/dist/application/define.d.ts +5 -5
- package/dist/application/define.js +13 -13
- package/dist/application/dependency/index.d.ts +1 -1
- package/dist/application/dependency/invoker.d.ts +11 -6
- package/dist/application/domain.d.ts +28 -0
- package/dist/application/index.d.ts +3 -3
- package/dist/application/index.js +1 -1
- package/dist/application/mutation/authoring/properties.d.ts +5 -3
- package/dist/application/mutation/authoring/properties.js +35 -2
- package/dist/application/mutation/authoring/transition.js +4 -1
- package/dist/application/routes/admission.d.ts +2 -2
- package/dist/application/routes/admission.js +1 -1
- package/dist/application/routes/route.d.ts +2 -2
- package/dist/application/runtime/actions.js +3 -0
- package/dist/application/runtime/workflows.d.ts +2 -0
- package/dist/application/runtime/workflows.js +5 -0
- package/dist/application/workflow/authoring.d.ts +3 -2
- package/dist/application/workflow/context.d.ts +8 -2
- package/dist/application/workflow/define.d.ts +3 -3
- package/dist/application/workflow/define.js +19 -3
- package/dist/application/workflow/durable.d.ts +83 -0
- package/dist/application/workflow/index.d.ts +3 -2
- package/dist/application/workflow/runner/inline.js +3 -4
- package/dist/application/workflow/runner/runner.d.ts +2 -2
- package/dist/application/workflow/step/output.d.ts +2 -0
- package/dist/application/workflow/step/output.js +73 -0
- package/dist/application/workflow/workflow.d.ts +12 -0
- package/dist/deployment/adapter/adapter.d.ts +59 -11
- package/dist/deployment/adapter/bundle/bundle.d.ts +36 -0
- package/dist/deployment/adapter/bundle/file.d.ts +10 -0
- package/dist/deployment/adapter/bundle/index.d.ts +2 -0
- package/dist/deployment/adapter/define.d.ts +25 -3
- package/dist/deployment/adapter/define.js +101 -24
- package/dist/deployment/adapter/index.d.ts +6 -3
- package/dist/deployment/adapter/index.js +1 -0
- package/dist/deployment/adapter/legacy/adapter.d.ts +40 -0
- package/dist/deployment/adapter/{deploy → legacy/deploy}/context.d.ts +6 -2
- package/dist/deployment/adapter/legacy/deploy/index.d.ts +2 -0
- package/dist/deployment/adapter/legacy/deploy/index.js +1 -0
- package/dist/deployment/adapter/legacy/deploy/result.d.ts +89 -0
- package/dist/deployment/adapter/legacy/deploy/result.js +1 -0
- package/dist/deployment/adapter/legacy/index.d.ts +24 -0
- package/dist/deployment/adapter/legacy/index.js +1 -0
- package/dist/deployment/adapter/legacy/prepare/artifact.d.ts +43 -0
- package/dist/deployment/adapter/legacy/prepare/artifact.js +1 -0
- package/dist/deployment/adapter/legacy/prepare/context.d.ts +33 -0
- package/dist/deployment/adapter/legacy/prepare/context.js +1 -0
- package/dist/deployment/adapter/legacy/prepare/index.d.ts +2 -0
- package/dist/deployment/adapter/legacy/prepare/index.js +1 -0
- package/dist/deployment/adapter/release/context.d.ts +95 -0
- package/dist/deployment/adapter/release/context.js +1 -0
- package/dist/deployment/adapter/release/index.d.ts +3 -0
- package/dist/deployment/adapter/release/index.js +1 -0
- package/dist/deployment/adapter/release/list.d.ts +53 -0
- package/dist/deployment/adapter/release/list.js +1 -0
- package/dist/deployment/adapter/release/refusal.d.ts +10 -0
- package/dist/deployment/adapter/release/refusal.js +14 -0
- package/dist/deployment/adapter/release/result.d.ts +56 -0
- package/dist/deployment/adapter/release/result.js +1 -0
- package/dist/deployment/address/configuration.d.ts +83 -0
- package/dist/deployment/address/configuration.js +262 -0
- package/dist/deployment/address/fingerprint.d.ts +5 -0
- package/dist/deployment/address/fingerprint.js +27 -0
- package/dist/deployment/address/index.d.ts +5 -0
- package/dist/deployment/address/index.js +5 -0
- package/dist/deployment/address/label.d.ts +42 -0
- package/dist/deployment/address/label.js +80 -0
- package/dist/deployment/address/line.d.ts +29 -0
- package/dist/deployment/address/line.js +53 -0
- package/dist/deployment/address/record.d.ts +52 -0
- package/dist/deployment/address/record.js +104 -0
- package/dist/deployment/address/summary.d.ts +57 -0
- package/dist/deployment/address/summary.js +117 -0
- package/dist/deployment/address/vectors.d.ts +60 -0
- package/dist/deployment/address/vectors.js +517 -0
- package/dist/deployment/build/build.d.ts +2 -2
- package/dist/deployment/build/compile.d.ts +4 -4
- package/dist/deployment/build/compile.js +17 -17
- package/dist/deployment/build/index.d.ts +1 -0
- package/dist/deployment/build/index.js +1 -0
- package/dist/deployment/build/manifest.d.ts +59 -0
- package/dist/deployment/build/manifest.js +118 -0
- package/dist/deployment/build/material.js +2 -2
- package/dist/deployment/build/schema.d.ts +2 -2
- package/dist/deployment/deploy.d.ts +10 -10
- package/dist/deployment/deploy.js +3 -3
- package/dist/deployment/deployment.d.ts +9 -4
- package/dist/deployment/environment.d.ts +6 -0
- package/dist/deployment/environment.js +6 -0
- package/dist/deployment/index.d.ts +4 -4
- package/dist/deployment/index.js +1 -1
- package/dist/deployment/release/addressing.d.ts +9 -1
- package/dist/deployment/release/assemble.d.ts +6 -3
- package/dist/deployment/release/assemble.js +12 -10
- package/dist/deployment/release/index.d.ts +2 -0
- package/dist/deployment/release/index.js +2 -0
- package/dist/deployment/release/legacy/admission.d.ts +3 -0
- package/dist/deployment/release/legacy/admission.js +8 -0
- package/dist/deployment/release/legacy/assemble.d.ts +5 -0
- package/dist/deployment/release/legacy/assemble.js +20 -0
- package/dist/deployment/release/legacy/index.d.ts +35 -0
- package/dist/deployment/release/legacy/index.js +34 -0
- package/dist/deployment/release/legacy/release.d.ts +12 -0
- package/dist/deployment/release/legacy/release.js +1 -0
- package/dist/deployment/release/{publication → legacy}/seal.d.ts +3 -3
- package/dist/deployment/release/legacy/seal.js +17 -0
- package/dist/deployment/release/release.d.ts +16 -5
- package/dist/deployment/release/runtime.d.ts +2 -0
- package/dist/deployment/release/runtime.js +2 -0
- package/dist/deployment/release/seal.d.ts +14 -0
- package/dist/deployment/release/seal.js +22 -0
- package/dist/deployment/release/{publication → served}/callables.d.ts +2 -2
- package/dist/deployment/release/{publication → served}/callables.js +2 -2
- package/dist/deployment/release/served/index.d.ts +12 -0
- package/dist/deployment/release/served/index.js +22 -0
- package/dist/deployment/release/{publication → served}/views.d.ts +2 -2
- package/dist/deployment/runtime/admission.d.ts +2 -2
- package/dist/deployment/runtime/admission.js +5 -5
- package/dist/deployment/verify/index.d.ts +2 -1
- package/dist/deployment/verify/index.js +1 -0
- package/dist/deployment/verify/preflight/artifact.d.ts +1 -1
- package/dist/deployment/verify/preflight/bundle.d.ts +18 -0
- package/dist/deployment/verify/preflight/bundle.js +71 -0
- package/dist/deployment/verify/preflight/index.d.ts +2 -1
- package/dist/deployment/verify/preflight/index.js +1 -0
- package/dist/deployment/verify/preflight/publication.d.ts +2 -2
- package/dist/deployment/verify/preflight/publication.js +4 -3
- package/dist/deployment/verify/readiness/deployment.js +7 -15
- package/dist/deployment/verify/readiness/fetch.d.ts +13 -0
- package/dist/deployment/verify/readiness/fetch.js +26 -0
- package/dist/deployment/verify/readiness/identity.d.ts +3 -6
- package/dist/deployment/verify/readiness/identity.js +3 -3
- package/dist/deployment/verify/readiness/index.d.ts +11 -7
- package/dist/deployment/verify/readiness/index.js +15 -4
- package/dist/deployment/verify/readiness/legacy/index.d.ts +2 -0
- package/dist/deployment/verify/readiness/legacy/index.js +2 -0
- package/dist/deployment/verify/readiness/legacy/publication.d.ts +12 -0
- package/dist/deployment/verify/readiness/legacy/publication.js +23 -0
- package/dist/deployment/verify/readiness/release.d.ts +8 -0
- package/dist/deployment/verify/readiness/release.js +22 -0
- package/dist/execution/identity/authentication.d.ts +23 -2
- package/dist/execution/identity/authentication.js +64 -40
- package/dist/execution/identity/callback.d.ts +16 -15
- package/dist/execution/identity/callback.js +21 -16
- package/dist/execution/identity/delivery.d.ts +11 -4
- package/dist/execution/identity/delivery.js +47 -20
- package/dist/execution/identity/identity.d.ts +18 -3
- package/dist/execution/identity/identity.js +8 -4
- package/dist/execution/identity/jwks.js +57 -12
- package/dist/execution/index.d.ts +4 -2
- package/dist/execution/index.js +2 -1
- package/dist/execution/invocation/admission/authentication.d.ts +3 -8
- package/dist/execution/invocation/admission/authentication.js +10 -24
- package/dist/execution/invocation/admission/authority.d.ts +15 -8
- package/dist/execution/invocation/admission/authority.js +5 -0
- package/dist/execution/invocation/admission/input.d.ts +2 -2
- package/dist/execution/invocation/admission/input.js +16 -2
- package/dist/execution/invocation/dependency/bind.d.ts +1 -1
- package/dist/execution/invocation/dependency/bind.js +35 -14
- package/dist/execution/invocation/dispatch/context.d.ts +2 -1
- package/dist/execution/invocation/dispatch/context.js +1 -1
- package/dist/execution/invocation/invocation.js +58 -16
- package/dist/execution/invocation/result/project.js +41 -1
- package/dist/execution/node/serve.d.ts +2 -2
- package/dist/execution/node/serve.js +1 -1
- package/dist/execution/runtime/index.d.ts +1 -0
- package/dist/execution/runtime/index.js +1 -0
- package/dist/execution/runtime/load.d.ts +3 -3
- package/dist/execution/runtime/load.js +3 -2
- package/dist/execution/runtime/release.d.ts +22 -0
- package/dist/execution/runtime/release.js +14 -0
- package/dist/execution/serve.d.ts +10 -4
- package/dist/execution/serve.js +3 -0
- package/dist/execution/service/create.js +39 -7
- package/dist/execution/service/initialization.d.ts +4 -4
- package/dist/execution/service/initialization.js +23 -14
- package/dist/execution/service/release.d.ts +2 -2
- package/dist/execution/service/release.js +3 -2
- package/dist/execution/service/service.d.ts +15 -5
- package/dist/execution/service/serving/delivery.d.ts +6 -0
- package/dist/execution/service/{publication → serving}/delivery.js +5 -1
- package/dist/execution/service/{publication → serving}/index.d.ts +1 -1
- package/dist/execution/service/serving/installation.d.ts +4 -0
- package/dist/execution/service/serving/installation.js +9 -0
- package/dist/execution/service/serving/legacy/index.d.ts +15 -0
- package/dist/execution/service/serving/legacy/index.js +19 -0
- package/dist/execution/service/serving/source.d.ts +18 -0
- package/dist/execution/service/serving/source.js +19 -0
- package/dist/execution/workflows/discovery.d.ts +14 -0
- package/dist/execution/workflows/discovery.js +151 -0
- package/dist/execution/workflows/engine.d.ts +52 -0
- package/dist/execution/workflows/engine.js +1 -0
- package/dist/execution/workflows/envelope.d.ts +12 -0
- package/dist/execution/workflows/envelope.js +46 -0
- package/dist/execution/workflows/failure.d.ts +11 -0
- package/dist/execution/workflows/failure.js +43 -0
- package/dist/execution/workflows/index.d.ts +4 -0
- package/dist/execution/workflows/index.js +3 -0
- package/dist/execution/workflows/options.d.ts +40 -0
- package/dist/execution/workflows/options.js +83 -0
- package/dist/execution/workflows/receiver.d.ts +22 -0
- package/dist/execution/workflows/receiver.js +99 -0
- package/dist/execution/workflows/route.d.ts +14 -0
- package/dist/execution/workflows/route.js +40 -0
- package/dist/execution/workflows/run.d.ts +22 -0
- package/dist/execution/workflows/run.js +211 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/platform/release/index.d.ts +27 -0
- package/dist/platform/release/index.js +27 -0
- package/dist/platform/schema/index.d.ts +2 -1
- package/dist/platform/schema/property-input.d.ts +15 -0
- package/dist/platform/schema/property-input.js +1 -0
- package/dist/platform/schema/property.d.ts +5 -0
- package/dist/platform/versioning/dependents.d.ts +18 -0
- package/dist/platform/versioning/dependents.js +15 -0
- package/dist/platform/versioning/index.d.ts +5 -0
- package/dist/platform/versioning/index.js +5 -0
- package/dist/platform/versioning/name.d.ts +38 -0
- package/dist/platform/versioning/name.js +58 -0
- package/dist/platform/versioning/reference.d.ts +48 -0
- package/dist/platform/versioning/reference.js +95 -0
- package/dist/platform/versioning/version.d.ts +72 -0
- package/dist/platform/versioning/version.js +98 -0
- package/dist/project/admit.js +2 -2
- package/dist/project/define.d.ts +4 -4
- package/dist/project/define.js +55 -35
- package/dist/project/index.d.ts +1 -1
- package/dist/project/install-command.d.ts +10 -0
- package/dist/project/install-command.js +13 -0
- package/dist/project/project.d.ts +10 -8
- package/dist/testing/dataset/builder.d.ts +3 -3
- package/dist/testing/dataset/define.d.ts +1 -1
- package/dist/testing/load.js +1 -1
- package/dist/tooling/cli/arguments.d.ts +10 -5
- package/dist/tooling/cli/arguments.js +123 -52
- package/dist/tooling/cli/build.d.ts +55 -0
- package/dist/tooling/cli/build.js +77 -0
- package/dist/tooling/cli/bun.d.ts +0 -1
- package/dist/tooling/cli/bun.js +0 -7
- package/dist/tooling/cli/commit.d.ts +35 -0
- package/dist/tooling/cli/commit.js +235 -0
- package/dist/tooling/cli/deploy-mode.d.ts +82 -0
- package/dist/tooling/cli/deploy-mode.js +135 -0
- package/dist/tooling/cli/deploy-result.d.ts +85 -0
- package/dist/tooling/cli/deploy-result.js +64 -0
- package/dist/tooling/cli/diff/declared.d.ts +7 -0
- package/dist/tooling/cli/diff/declared.js +27 -0
- package/dist/tooling/cli/diff/index.d.ts +30 -0
- package/dist/tooling/cli/diff/index.js +58 -0
- package/dist/tooling/cli/diff/render.d.ts +15 -0
- package/dist/tooling/cli/diff/render.js +131 -0
- package/dist/tooling/cli/diff/report.d.ts +88 -0
- package/dist/tooling/cli/diff/report.js +154 -0
- package/dist/tooling/cli/dotenv.d.ts +2 -2
- package/dist/tooling/cli/dotenv.js +3 -33
- package/dist/tooling/cli/help.js +176 -59
- package/dist/tooling/cli/immutable-deployment.d.ts +83 -0
- package/dist/tooling/cli/immutable-deployment.js +135 -0
- package/dist/tooling/cli/index.d.ts +10 -4
- package/dist/tooling/cli/index.js +5 -3
- package/dist/tooling/cli/installed-on.d.ts +83 -0
- package/dist/tooling/cli/installed-on.js +156 -0
- package/dist/tooling/cli/legacy/deploy-result.d.ts +28 -0
- package/dist/tooling/cli/legacy/deploy-result.js +37 -0
- package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +21 -0
- package/dist/tooling/cli/legacy/stable-target-adapter.js +14 -0
- package/dist/tooling/cli/legacy/stable-target-deploy.d.ts +40 -0
- package/dist/tooling/cli/legacy/stable-target-deploy.js +102 -0
- package/dist/tooling/cli/legacy/uploaded-build.d.ts +11 -0
- package/dist/tooling/cli/legacy/uploaded-build.js +22 -0
- package/dist/tooling/cli/list.d.ts +154 -0
- package/dist/tooling/cli/list.js +381 -0
- package/dist/tooling/cli/log.d.ts +5 -0
- package/dist/tooling/cli/log.js +9 -0
- package/dist/tooling/cli/orchestrate.d.ts +0 -6
- package/dist/tooling/cli/orchestrate.js +236 -88
- package/dist/tooling/cli/project.d.ts +3 -3
- package/dist/tooling/cli/publish/index.d.ts +73 -0
- package/dist/tooling/cli/publish/index.js +346 -0
- package/dist/tooling/cli/publish/report.d.ts +49 -0
- package/dist/tooling/cli/publish/report.js +15 -0
- package/dist/tooling/cli/registry/client.d.ts +114 -0
- package/dist/tooling/cli/registry/client.js +346 -0
- package/dist/tooling/cli/registry/error.d.ts +11 -0
- package/dist/tooling/cli/registry/error.js +17 -0
- package/dist/tooling/cli/registry/executable.d.ts +29 -0
- package/dist/tooling/cli/registry/executable.js +90 -0
- package/dist/tooling/cli/registry/index.d.ts +9 -0
- package/dist/tooling/cli/registry/index.js +8 -0
- package/dist/tooling/cli/registry/installations.d.ts +67 -0
- package/dist/tooling/cli/registry/installations.js +108 -0
- package/dist/tooling/cli/registry/process.d.ts +36 -0
- package/dist/tooling/cli/registry/process.js +119 -0
- package/dist/tooling/cli/secrets.d.ts +9 -0
- package/dist/tooling/cli/secrets.js +19 -0
- package/dist/tooling/cli/yank.d.ts +34 -0
- package/dist/tooling/cli/yank.js +32 -0
- package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +1 -1
- package/dist/tooling/linter/implementations/source/callable-requirements.js +10 -10
- package/dist/tooling/linter/implementations/source/dependencies.js +12 -10
- package/dist/tooling/linter/implementations/source/global.js +1 -1
- package/dist/tooling/linter/implementations/source/mutations.js +17 -17
- package/dist/tooling/linter/implementations/source/providers.js +5 -5
- package/dist/tooling/linter/implementations/source/views.js +2 -2
- package/dist/tooling/linter/policy/generated.js +16 -16
- package/dist/tooling/packaging/declarations/ownership.js +1 -1
- package/dist/tooling/packaging/finalize.d.ts +1 -1
- package/dist/tooling/packaging/finalize.js +1 -1
- package/package.json +32 -11
- package/dist/application/application.d.ts +0 -28
- package/dist/deployment/adapter/deploy/index.d.ts +0 -2
- package/dist/deployment/adapter/deploy/result.d.ts +0 -50
- package/dist/deployment/adapter/prepare/artifact.d.ts +0 -33
- package/dist/deployment/adapter/prepare/context.d.ts +0 -23
- package/dist/deployment/adapter/prepare/index.d.ts +0 -2
- package/dist/deployment/release/publication/index.d.ts +0 -6
- package/dist/deployment/release/publication/index.js +0 -6
- package/dist/deployment/release/publication/manifest.d.ts +0 -3
- package/dist/deployment/release/publication/manifest.js +0 -5
- package/dist/deployment/release/publication/requirements.d.ts +0 -3
- package/dist/deployment/release/publication/requirements.js +0 -3
- package/dist/deployment/release/publication/seal.js +0 -39
- package/dist/deployment/verify/readiness/publication.d.ts +0 -11
- package/dist/deployment/verify/readiness/publication.js +0 -41
- package/dist/execution/service/publication/delivery.d.ts +0 -2
- package/dist/execution/service/publication/installation.d.ts +0 -3
- package/dist/execution/service/publication/installation.js +0 -8
- package/dist/execution/service/publication/source.d.ts +0 -3
- package/dist/execution/service/publication/source.js +0 -11
- package/dist/platform/publication/index.d.ts +0 -2
- package/dist/platform/publication/index.js +0 -2
- package/dist/tooling/cli/astrale/authority.d.ts +0 -5
- package/dist/tooling/cli/astrale/authority.js +0 -11
- package/dist/tooling/cli/astrale/executable.d.ts +0 -2
- package/dist/tooling/cli/astrale/executable.js +0 -47
- package/dist/tooling/cli/astrale/failure.d.ts +0 -6
- package/dist/tooling/cli/astrale/failure.js +0 -48
- package/dist/tooling/cli/astrale/instance.d.ts +0 -11
- package/dist/tooling/cli/astrale/instance.js +0 -52
- package/dist/tooling/cli/astrale/process.d.ts +0 -13
- package/dist/tooling/cli/astrale/process.js +0 -94
- package/dist/tooling/cli/astrale/version.d.ts +0 -18
- package/dist/tooling/cli/astrale/version.js +0 -55
- package/dist/tooling/cli/credential.d.ts +0 -2
- package/dist/tooling/cli/credential.js +0 -57
- package/dist/tooling/cli/development/candidate.d.ts +0 -25
- package/dist/tooling/cli/development/candidate.js +0 -176
- package/dist/tooling/cli/development/deployment.d.ts +0 -16
- package/dist/tooling/cli/development/deployment.js +0 -39
- package/dist/tooling/cli/development/develop.d.ts +0 -11
- package/dist/tooling/cli/development/develop.js +0 -243
- package/dist/tooling/cli/development/lease.d.ts +0 -18
- package/dist/tooling/cli/development/lease.js +0 -163
- package/dist/tooling/cli/development/lifecycle.d.ts +0 -9
- package/dist/tooling/cli/development/lifecycle.js +0 -43
- package/dist/tooling/cli/development/project-imports.d.ts +0 -22
- package/dist/tooling/cli/development/project-imports.js +0 -39
- package/dist/tooling/cli/development/project-lock.d.ts +0 -16
- package/dist/tooling/cli/development/project-lock.js +0 -41
- package/dist/tooling/cli/development/rebuild.d.ts +0 -13
- package/dist/tooling/cli/development/rebuild.js +0 -58
- package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
- package/dist/tooling/cli/development/release-evidence.js +0 -10
- package/dist/tooling/cli/development/report.d.ts +0 -6
- package/dist/tooling/cli/development/report.js +0 -14
- package/dist/tooling/cli/development/session-file.d.ts +0 -53
- package/dist/tooling/cli/development/session-file.js +0 -337
- package/dist/tooling/cli/development/source-watch.d.ts +0 -14
- package/dist/tooling/cli/development/source-watch.js +0 -140
- package/dist/tooling/cli/development/sources.d.ts +0 -7
- package/dist/tooling/cli/development/sources.js +0 -48
- package/dist/tooling/cli/development/target-lock.d.ts +0 -16
- package/dist/tooling/cli/development/target-lock.js +0 -68
- package/dist/tooling/cli/development/view.d.ts +0 -28
- package/dist/tooling/cli/development/view.js +0 -151
- package/dist/tooling/cli/environment-release.d.ts +0 -21
- package/dist/tooling/cli/environment-release.js +0 -46
- package/dist/tooling/cli/evidence.d.ts +0 -11
- package/dist/tooling/cli/evidence.js +0 -53
- package/dist/tooling/cli/installation/index.d.ts +0 -2
- package/dist/tooling/cli/installation/index.js +0 -1
- package/dist/tooling/cli/installation/observation.d.ts +0 -10
- package/dist/tooling/cli/installation/observation.js +0 -44
- package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
- package/dist/tooling/cli/installation/reconcile.js +0 -122
- /package/dist/application/{application.js → domain.js} +0 -0
- /package/dist/{deployment/adapter/deploy/context.js → application/workflow/durable.js} +0 -0
- /package/dist/deployment/adapter/{deploy/index.js → bundle/bundle.js} +0 -0
- /package/dist/deployment/adapter/{deploy/result.js → bundle/file.js} +0 -0
- /package/dist/deployment/adapter/{prepare → bundle}/index.js +0 -0
- /package/dist/deployment/adapter/{prepare/artifact.js → legacy/adapter.js} +0 -0
- /package/dist/deployment/adapter/{prepare → legacy/deploy}/context.js +0 -0
- /package/dist/deployment/release/{publication → served}/routes.d.ts +0 -0
- /package/dist/deployment/release/{publication → served}/routes.js +0 -0
- /package/dist/deployment/release/{publication → served}/views.js +0 -0
- /package/dist/execution/service/{publication → serving}/index.js +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Revision } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import type { ReleaseDigest } from '@astrale-os/kernel-protocol/release';
|
|
3
|
+
import type { DeploymentCommitV1 } from '../../deployment/address/index.js';
|
|
4
|
+
import type { BuildDigest, DeploymentSecretsState, ReadyReleaseDeployResult, Release } from '../../deployment/index.js';
|
|
5
|
+
export type { DeploymentSecretsState } from '../../deployment/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* `astrale-domain deploy <environment> --json` on stdout: the one deployment the deploy made or
|
|
8
|
+
* reused, which CI installs by its URL. Progress and warnings go to stderr. It names no instance
|
|
9
|
+
* and no version: a deploy numbers nothing and installs nothing.
|
|
10
|
+
*/
|
|
11
|
+
export interface DeployResultV1 {
|
|
12
|
+
readonly format: 'astrale.deploy-result';
|
|
13
|
+
readonly version: 1;
|
|
14
|
+
readonly origin: string;
|
|
15
|
+
readonly environment: string;
|
|
16
|
+
/**
|
|
17
|
+
* The URL `astrale domain install <url>` takes: an immutable deployment's URL, which is also its
|
|
18
|
+
* issuer, or the public URL of a stable target.
|
|
19
|
+
*/
|
|
20
|
+
readonly url: string;
|
|
21
|
+
/**
|
|
22
|
+
* The digest of the `DomainRelease` v4 the deployment serves at `release.json`. `null` for a
|
|
23
|
+
* stable target, which serves a v3 Publication and no release.
|
|
24
|
+
*/
|
|
25
|
+
readonly release: {
|
|
26
|
+
readonly digest: ReleaseDigest;
|
|
27
|
+
} | null;
|
|
28
|
+
/**
|
|
29
|
+
* The build digest of the code the deployment runs, as `astrale-domain build` prints it. `null`
|
|
30
|
+
* for a stable target, which never serves a build digest.
|
|
31
|
+
*/
|
|
32
|
+
readonly build: {
|
|
33
|
+
readonly digest: BuildDigest;
|
|
34
|
+
} | null;
|
|
35
|
+
readonly schema: {
|
|
36
|
+
readonly revision: Revision;
|
|
37
|
+
};
|
|
38
|
+
readonly deployment: {
|
|
39
|
+
/** `<adapter name>@<adapter version>` */
|
|
40
|
+
readonly adapter: string;
|
|
41
|
+
/**
|
|
42
|
+
* The provider script that serves this deployment: an immutable deployment's label, which is
|
|
43
|
+
* also the first label of its URL. `null` for a stable target, whose legacy adapter operations
|
|
44
|
+
* never report the script they replace.
|
|
45
|
+
*/
|
|
46
|
+
readonly script: string | null;
|
|
47
|
+
/**
|
|
48
|
+
* `created`: a new immutable deployment. `reused`: the immutable deployment of this exact
|
|
49
|
+
* release already existed. `replaced`: a stable target now runs this code in place of what it
|
|
50
|
+
* ran, if anything (the legacy direct-mode path cannot tell a first deploy from a later one);
|
|
51
|
+
* only that path replaces.
|
|
52
|
+
*/
|
|
53
|
+
readonly state: 'created' | 'reused' | 'replaced';
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Immutable deployments only: the environment's current secrets were `bound` to a new
|
|
57
|
+
* deployment, or `updated` or left `unchanged` in place on the reused one. A deploy never writes
|
|
58
|
+
* the secrets of any other deployment.
|
|
59
|
+
*/
|
|
60
|
+
readonly secrets?: {
|
|
61
|
+
readonly state: DeploymentSecretsState;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* The commit the deployment was built from, as its deployment record declares it: the commit of
|
|
65
|
+
* the deploy that created it. A reused deployment keeps its record, so this can be an earlier
|
|
66
|
+
* commit than the one the deploy ran from; the label covers the release, never the commit.
|
|
67
|
+
*/
|
|
68
|
+
readonly commit: DeploymentCommitV1 | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The deploy result of one immutable deployment, from the ready result of the adapter's
|
|
72
|
+
* `deployRelease`. Its release, build, Schema revision and URL are those the SDK sealed before
|
|
73
|
+
* deploying; the deployment record the adapter returned must declare exactly that release at that
|
|
74
|
+
* URL, so the result never names a release the deployment does not serve. Its commit is the
|
|
75
|
+
* record's, which a reused deployment kept from the deploy that created it.
|
|
76
|
+
*/
|
|
77
|
+
export declare function deployResult(input: {
|
|
78
|
+
readonly environment: string;
|
|
79
|
+
readonly adapter: {
|
|
80
|
+
readonly name: string;
|
|
81
|
+
readonly version: string;
|
|
82
|
+
};
|
|
83
|
+
readonly release: Release;
|
|
84
|
+
readonly deployment: ReadyReleaseDeployResult;
|
|
85
|
+
}): DeployResultV1;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { acceptDeploymentRecord } from '../../deployment/address/index.js';
|
|
2
|
+
import { addressing, isRelease } from '../../deployment/index.js';
|
|
3
|
+
const SECRETS_BY_STATE = Object.freeze({
|
|
4
|
+
created: Object.freeze(['bound']),
|
|
5
|
+
reused: Object.freeze(['updated', 'unchanged']),
|
|
6
|
+
});
|
|
7
|
+
/**
|
|
8
|
+
* The deploy result of one immutable deployment, from the ready result of the adapter's
|
|
9
|
+
* `deployRelease`. Its release, build, Schema revision and URL are those the SDK sealed before
|
|
10
|
+
* deploying; the deployment record the adapter returned must declare exactly that release at that
|
|
11
|
+
* URL, so the result never names a release the deployment does not serve. Its commit is the
|
|
12
|
+
* record's, which a reused deployment kept from the deploy that created it.
|
|
13
|
+
*/
|
|
14
|
+
export function deployResult(input) {
|
|
15
|
+
const { release, deployment } = input;
|
|
16
|
+
if (!isRelease(release))
|
|
17
|
+
throw new TypeError('Deploy result requires a sealed Release.');
|
|
18
|
+
if (deployment.status !== 'ready') {
|
|
19
|
+
throw new TypeError('Deploy result requires the ready result of deployRelease.');
|
|
20
|
+
}
|
|
21
|
+
const record = acceptDeploymentRecord(deployment.record);
|
|
22
|
+
const { document } = release;
|
|
23
|
+
expectSame('origin', record.origin, document.origin);
|
|
24
|
+
expectSame('environment', record.environment, input.environment);
|
|
25
|
+
expectSame('release digest', record.releaseDigest, document.digest);
|
|
26
|
+
expectSame('build digest', record.buildDigest, release.buildDigest);
|
|
27
|
+
expectSame('Schema revision', record.schemaRevision, document.schema.revision);
|
|
28
|
+
const url = addressing(deployment.url).issuer;
|
|
29
|
+
expectSame('URL', url, release.url);
|
|
30
|
+
if (new URL(url).hostname.split('.')[0] !== record.providerScript) {
|
|
31
|
+
throw new TypeError(`Deployment URL ${url} is not addressed by its provider script ${record.providerScript}.`);
|
|
32
|
+
}
|
|
33
|
+
const allowed = Object.hasOwn(SECRETS_BY_STATE, deployment.state)
|
|
34
|
+
? SECRETS_BY_STATE[deployment.state]
|
|
35
|
+
: undefined;
|
|
36
|
+
if (allowed === undefined)
|
|
37
|
+
throw new TypeError('Deployment state must be created or reused.');
|
|
38
|
+
const secrets = deployment.secrets?.state;
|
|
39
|
+
if (!allowed.includes(secrets)) {
|
|
40
|
+
throw new TypeError(`A ${deployment.state} deployment has its secrets ${allowed.join(' or ')}, not ${String(secrets)}.`);
|
|
41
|
+
}
|
|
42
|
+
return Object.freeze({
|
|
43
|
+
format: 'astrale.deploy-result',
|
|
44
|
+
version: 1,
|
|
45
|
+
origin: document.origin,
|
|
46
|
+
environment: record.environment,
|
|
47
|
+
url,
|
|
48
|
+
release: Object.freeze({ digest: document.digest }),
|
|
49
|
+
build: Object.freeze({ digest: release.buildDigest }),
|
|
50
|
+
schema: Object.freeze({ revision: record.schemaRevision }),
|
|
51
|
+
deployment: Object.freeze({
|
|
52
|
+
adapter: `${input.adapter.name}@${input.adapter.version}`,
|
|
53
|
+
script: record.providerScript,
|
|
54
|
+
state: deployment.state,
|
|
55
|
+
}),
|
|
56
|
+
secrets: Object.freeze({ state: secrets }),
|
|
57
|
+
commit: record.commit,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function expectSame(member, declared, expected) {
|
|
61
|
+
if (declared !== expected) {
|
|
62
|
+
throw new TypeError(`Deployment declares ${member} ${declared}, not ${expected}.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Version } from '../../../platform/versioning/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* The version the author declares for the next release: `package.json` `version` in the Project
|
|
4
|
+
* directory, as release-please and `npm version` write it (tech Versioning [.21210]). No command
|
|
5
|
+
* takes a version number.
|
|
6
|
+
*/
|
|
7
|
+
export declare function declaredVersion(projectDir: string): Promise<Version>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { acceptVersion } from '../../../platform/versioning/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* The version the author declares for the next release: `package.json` `version` in the Project
|
|
6
|
+
* directory, as release-please and `npm version` write it (tech Versioning [.21210]). No command
|
|
7
|
+
* takes a version number.
|
|
8
|
+
*/
|
|
9
|
+
export async function declaredVersion(projectDir) {
|
|
10
|
+
const path = join(projectDir, 'package.json');
|
|
11
|
+
let manifest;
|
|
12
|
+
try {
|
|
13
|
+
manifest = JSON.parse(await readFile(path, 'utf8'));
|
|
14
|
+
}
|
|
15
|
+
catch (cause) {
|
|
16
|
+
throw new TypeError(`Cannot read the Domain's version: ${path} is not a readable JSON file.`, {
|
|
17
|
+
cause,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const version = typeof manifest === 'object' && manifest !== null && !Array.isArray(manifest)
|
|
21
|
+
? manifest.version
|
|
22
|
+
: undefined;
|
|
23
|
+
if (typeof version !== 'string') {
|
|
24
|
+
throw new TypeError(`${path} declares no version. The Domain's version is the package.json version, for example written by npm version minor.`);
|
|
25
|
+
}
|
|
26
|
+
return acceptVersion(version);
|
|
27
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Build } from '../../../deployment/index.js';
|
|
2
|
+
import type { DomainRegistry } from '../registry/index.js';
|
|
3
|
+
export type { DiffChangeV1, DiffReportV1 } from './report.js';
|
|
4
|
+
export interface DiffCommandInput {
|
|
5
|
+
readonly projectDir: string;
|
|
6
|
+
readonly build: Build;
|
|
7
|
+
/** The build digest of every distinct bundler of the Project, bundled on demand. */
|
|
8
|
+
readonly builds: () => Promise<readonly string[]>;
|
|
9
|
+
readonly identity?: string;
|
|
10
|
+
readonly json: boolean;
|
|
11
|
+
readonly signal: AbortSignal;
|
|
12
|
+
}
|
|
13
|
+
export interface DiffCommandDependencies {
|
|
14
|
+
readonly open: (input: {
|
|
15
|
+
readonly projectDir: string;
|
|
16
|
+
readonly identity?: string;
|
|
17
|
+
readonly signal: AbortSignal;
|
|
18
|
+
}) => Promise<DomainRegistry>;
|
|
19
|
+
readonly stdout: (text: string) => void;
|
|
20
|
+
readonly stderr: (text: string) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `astrale-domain diff [--as <identity>] [--json]`: the changes since the highest published stable
|
|
24
|
+
* version up to the declared one, and the smallest version they admit (tech Versioning [.72565]).
|
|
25
|
+
* On a feature branch the declared version is still the published one and the report is
|
|
26
|
+
* informational (exit 0); on a release PR an unpublished version that is too low fails (exit 1)
|
|
27
|
+
* with the [.105820] message. Reads the registry through the Astrale CLI under the caller's own
|
|
28
|
+
* credential and changes nothing.
|
|
29
|
+
*/
|
|
30
|
+
export declare function runDiff(input: DiffCommandInput, dependencies?: DiffCommandDependencies): Promise<number>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as bundle from '@astrale-os/kernel-dsl/v1/bundle/transport';
|
|
2
|
+
import { DIM, RED, RESET } from '../log.js';
|
|
3
|
+
import { RegistryCliError, openDomainRegistry } from '../registry/index.js';
|
|
4
|
+
import { declaredVersion } from './declared.js';
|
|
5
|
+
import { diffExitCode, renderDiff } from './render.js';
|
|
6
|
+
import { diffReport, publishedSchema } from './report.js';
|
|
7
|
+
/**
|
|
8
|
+
* `astrale-domain diff [--as <identity>] [--json]`: the changes since the highest published stable
|
|
9
|
+
* version up to the declared one, and the smallest version they admit (tech Versioning [.72565]).
|
|
10
|
+
* On a feature branch the declared version is still the published one and the report is
|
|
11
|
+
* informational (exit 0); on a release PR an unpublished version that is too low fails (exit 1)
|
|
12
|
+
* with the [.105820] message. Reads the registry through the Astrale CLI under the caller's own
|
|
13
|
+
* credential and changes nothing.
|
|
14
|
+
*/
|
|
15
|
+
export async function runDiff(input, dependencies = {
|
|
16
|
+
open: openDomainRegistry,
|
|
17
|
+
stdout: (text) => void process.stdout.write(text),
|
|
18
|
+
stderr: (text) => void process.stderr.write(text),
|
|
19
|
+
}) {
|
|
20
|
+
const root = input.build.schema.compiled.root;
|
|
21
|
+
let report;
|
|
22
|
+
try {
|
|
23
|
+
const declared = await declaredVersion(input.projectDir);
|
|
24
|
+
const registry = await dependencies.open({
|
|
25
|
+
projectDir: input.projectDir,
|
|
26
|
+
...(input.identity === undefined ? {} : { identity: input.identity }),
|
|
27
|
+
signal: input.signal,
|
|
28
|
+
});
|
|
29
|
+
report = await diffReport({
|
|
30
|
+
origin: root.origin,
|
|
31
|
+
declared,
|
|
32
|
+
revision: root.revision,
|
|
33
|
+
index: await registry.index(root.origin),
|
|
34
|
+
current: () => bundle.decode(input.build.schema.bundle.bytes()).root,
|
|
35
|
+
builds: input.builds,
|
|
36
|
+
published: async (publication) => publishedSchema(await registry.bundle(root.origin, publication), publication, root.origin),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (cause) {
|
|
40
|
+
if (!(cause instanceof RegistryCliError))
|
|
41
|
+
throw cause;
|
|
42
|
+
// Nothing on stdout: a JSON consumer reads one report or nothing.
|
|
43
|
+
dependencies.stderr(`${RED}✗${RESET} Domain registry: ${cause.code}: ${cause.message}\n`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const rendered = renderDiff(report);
|
|
47
|
+
// With --json, stdout carries only the report and the summary moves to stderr, as for deploy.
|
|
48
|
+
const summary = input.json ? dependencies.stderr : dependencies.stdout;
|
|
49
|
+
// The sentence takes the progress mark; the member rows below it keep their indentation.
|
|
50
|
+
for (const line of rendered.summary) {
|
|
51
|
+
summary(line.startsWith(' ') ? `${line}\n` : `${DIM}›${RESET} ${line}\n`);
|
|
52
|
+
}
|
|
53
|
+
if (rendered.refusal.length > 0)
|
|
54
|
+
dependencies.stderr(`${rendered.refusal.join('\n')}\n`);
|
|
55
|
+
if (input.json)
|
|
56
|
+
dependencies.stdout(`${JSON.stringify(report, null, 2)}\n`);
|
|
57
|
+
return diffExitCode(report);
|
|
58
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DiffReportV1 } from './report.js';
|
|
2
|
+
/**
|
|
3
|
+
* 0 when the declared version is accepted, already published (the report is then informational:
|
|
4
|
+
* a feature branch keeps the last published number until its release), or has nothing to compare
|
|
5
|
+
* with; 1 when an unpublished declared version is too low.
|
|
6
|
+
*/
|
|
7
|
+
export declare function diffExitCode(report: DiffReportV1): 0 | 1;
|
|
8
|
+
/**
|
|
9
|
+
* The report for a person. `summary` describes the comparison; `refusal` is the [.105820] message
|
|
10
|
+
* for an unpublished version that is too low (tech Versioning), printed as an error.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderDiff(report: DiffReportV1): {
|
|
13
|
+
readonly summary: readonly string[];
|
|
14
|
+
readonly refusal: readonly string[];
|
|
15
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/** What a change of each level is, in the [.105820] message. */
|
|
2
|
+
const NATURE = Object.freeze({
|
|
3
|
+
major: 'breaking change',
|
|
4
|
+
minor: 'addition',
|
|
5
|
+
patch: 'change',
|
|
6
|
+
});
|
|
7
|
+
const LEVELS = ['patch', 'minor', 'major'];
|
|
8
|
+
/**
|
|
9
|
+
* 0 when the declared version is accepted, already published (the report is then informational:
|
|
10
|
+
* a feature branch keeps the last published number until its release), or has nothing to compare
|
|
11
|
+
* with; 1 when an unpublished declared version is too low.
|
|
12
|
+
*/
|
|
13
|
+
export function diffExitCode(report) {
|
|
14
|
+
return report.published || report.accepted ? 0 : 1;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The report for a person. `summary` describes the comparison; `refusal` is the [.105820] message
|
|
18
|
+
* for an unpublished version that is too low (tech Versioning), printed as an error.
|
|
19
|
+
*/
|
|
20
|
+
export function renderDiff(report) {
|
|
21
|
+
const subject = `${report.origin} ${report.declared}`;
|
|
22
|
+
if (report.registry === 'unregistered') {
|
|
23
|
+
return {
|
|
24
|
+
summary: [
|
|
25
|
+
`${report.origin} is not in the Domain registry, or you may not read it: nothing to compare.`,
|
|
26
|
+
],
|
|
27
|
+
refusal: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (report.baseline === undefined) {
|
|
31
|
+
return {
|
|
32
|
+
summary: [
|
|
33
|
+
`${subject}: no stable version up to ${report.declared} is published, nothing to compare.`,
|
|
34
|
+
],
|
|
35
|
+
refusal: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const level = report.level;
|
|
39
|
+
const required = `at least ${report.next} (${NATURE[level]})`;
|
|
40
|
+
const rows = changeRows(report.changes, report.origin);
|
|
41
|
+
if (report.changes.length === 0) {
|
|
42
|
+
const state = report.published ? 'is published' : 'is accepted';
|
|
43
|
+
return {
|
|
44
|
+
summary: [`${subject} ${state}: no change since ${report.baseline}.`],
|
|
45
|
+
refusal: [],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (report.published) {
|
|
49
|
+
return {
|
|
50
|
+
summary: [
|
|
51
|
+
`${subject} is published. The changes since ${report.baseline} need ${required}:`,
|
|
52
|
+
...rows,
|
|
53
|
+
],
|
|
54
|
+
refusal: [],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (report.accepted) {
|
|
58
|
+
return {
|
|
59
|
+
summary: [
|
|
60
|
+
`${subject} is accepted. The changes since ${report.baseline} need ${required}:`,
|
|
61
|
+
...rows,
|
|
62
|
+
],
|
|
63
|
+
refusal: [],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Only the changes that set the level are listed, as [.105820] lists the breaking ones.
|
|
67
|
+
const binding = report.changes.filter((change) => change.bump === level);
|
|
68
|
+
const others = report.changes.length - binding.length;
|
|
69
|
+
const declare = report.suggestion ?? report.next;
|
|
70
|
+
return {
|
|
71
|
+
summary: [],
|
|
72
|
+
refusal: [
|
|
73
|
+
`error: ${report.declared} is too low, ${NATURE[level]} since ${report.baseline}: at least ${report.next} is required`,
|
|
74
|
+
...changeRows(binding, report.origin),
|
|
75
|
+
...(others === 0 ? [] : [` (and ${others} other ${others === 1 ? 'change' : 'changes'})`]),
|
|
76
|
+
level === 'major'
|
|
77
|
+
? `Declare ${declare}, or keep the old member (expand then contract).`
|
|
78
|
+
: `Declare ${declare}.`,
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* One line per changed member, `<kind> <name> <states> (<details>)`, in report order. A member the
|
|
84
|
+
* engine observes through several facets (a removed Method loses its existence and its signature)
|
|
85
|
+
* is one line.
|
|
86
|
+
*/
|
|
87
|
+
function changeRows(changes, origin) {
|
|
88
|
+
const members = new Map();
|
|
89
|
+
for (const change of changes) {
|
|
90
|
+
const key = `${change.facet === 'build' || change.facet === 'schema' ? change.facet : ''}\u0000${change.subject}`;
|
|
91
|
+
const member = members.get(key) ?? {
|
|
92
|
+
...memberName(change, origin),
|
|
93
|
+
states: [],
|
|
94
|
+
details: [],
|
|
95
|
+
bump: 'patch',
|
|
96
|
+
};
|
|
97
|
+
if (!member.states.includes(change.state))
|
|
98
|
+
member.states.push(change.state);
|
|
99
|
+
if (change.detail !== undefined && !member.details.includes(change.detail)) {
|
|
100
|
+
member.details.push(change.detail);
|
|
101
|
+
}
|
|
102
|
+
if (LEVELS.indexOf(change.bump) > LEVELS.indexOf(member.bump))
|
|
103
|
+
member.bump = change.bump;
|
|
104
|
+
members.set(key, member);
|
|
105
|
+
}
|
|
106
|
+
const rows = [...members.values()];
|
|
107
|
+
const kindWidth = Math.max(0, ...rows.map(({ kind }) => kind.length)) + 1;
|
|
108
|
+
const nameWidth = Math.max(0, ...rows.map(({ name }) => name.length)) + 3;
|
|
109
|
+
return rows.map(({ kind, name, states, details }) => ` ${kind.padEnd(kindWidth)}${name.padEnd(nameWidth)}${states.join(', ')}${details.length === 0 ? '' : ` (${details.join('; ')})`}`);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* `class.Project.method.archive` reads `method Project.archive`. A Key of another origin keeps
|
|
113
|
+
* its origin; a whole-Domain change names the origin.
|
|
114
|
+
*/
|
|
115
|
+
function memberName(change, origin) {
|
|
116
|
+
if (change.facet === 'build' || change.facet === 'schema') {
|
|
117
|
+
return { kind: change.facet, name: change.subject };
|
|
118
|
+
}
|
|
119
|
+
const separator = change.subject.indexOf(':');
|
|
120
|
+
const local = change.subject.slice(separator + 1);
|
|
121
|
+
const prefix = separator > 0 && change.subject.slice(0, separator) !== origin
|
|
122
|
+
? `${change.subject.slice(0, separator)}:`
|
|
123
|
+
: '';
|
|
124
|
+
const member = /^class\.([^.]+)\.(property|method)\.(.+)$/u.exec(local);
|
|
125
|
+
if (member !== null)
|
|
126
|
+
return { kind: member[2], name: `${prefix}${member[1]}.${member[3]}` };
|
|
127
|
+
const dot = local.indexOf('.');
|
|
128
|
+
return dot > 0
|
|
129
|
+
? { kind: local.slice(0, dot), name: `${prefix}${local.slice(dot + 1)}` }
|
|
130
|
+
: { kind: 'member', name: change.subject };
|
|
131
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { DomainSchema } from '@astrale-os/kernel-dsl/v1/schema';
|
|
2
|
+
import type { BumpLevel, Version } from '../../../platform/versioning/index.js';
|
|
3
|
+
import type { RegistryIndex, RegistryPublication } from '../registry/index.js';
|
|
4
|
+
/** One change since the baseline, with the level it alone requires. */
|
|
5
|
+
export interface DiffChangeV1 {
|
|
6
|
+
/**
|
|
7
|
+
* The compared member's Key (`issues.astrale.ai:class.Issue.property.priority`), or the Domain's
|
|
8
|
+
* origin for a change of the whole build or Schema.
|
|
9
|
+
*/
|
|
10
|
+
readonly subject: string;
|
|
11
|
+
/**
|
|
12
|
+
* The compatibility engine's facet (`method.existence`, `property.required`, …), `schema` for a
|
|
13
|
+
* new Schema revision of equivalent meaning, `build` for new code under the same revision.
|
|
14
|
+
*/
|
|
15
|
+
readonly facet: string;
|
|
16
|
+
readonly state: 'missing' | 'changed' | 'added';
|
|
17
|
+
readonly bump: BumpLevel;
|
|
18
|
+
/** What differs, such as `optional → required`, when the observation says. */
|
|
19
|
+
readonly detail?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* `astrale-domain diff --json` on stdout: the version the Project declares, checked against the
|
|
23
|
+
* highest published stable version up to it (CT30).
|
|
24
|
+
*/
|
|
25
|
+
export interface DiffReportV1 {
|
|
26
|
+
readonly format: 'astrale.diff-report';
|
|
27
|
+
readonly version: 1;
|
|
28
|
+
readonly origin: string;
|
|
29
|
+
/** `package.json` `version`. */
|
|
30
|
+
readonly declared: string;
|
|
31
|
+
/** The declared version already names a Publication: the report is informational. */
|
|
32
|
+
readonly published: boolean;
|
|
33
|
+
/** `unregistered`: no Domain of this origin the caller may read; nothing is compared. */
|
|
34
|
+
readonly registry: 'read' | 'unregistered';
|
|
35
|
+
/** The highest published stable version up to the declared one, yanked ones included. */
|
|
36
|
+
readonly baseline?: string;
|
|
37
|
+
/** The level the changes since the baseline require. */
|
|
38
|
+
readonly level?: BumpLevel;
|
|
39
|
+
/** The level after the 0.x rule. */
|
|
40
|
+
readonly effective?: BumpLevel;
|
|
41
|
+
/** The smallest version the changes admit, a pre-release such as `2.0.0-0`. */
|
|
42
|
+
readonly minimum?: string;
|
|
43
|
+
/** The stable form of the required version, such as `2.0.0`. */
|
|
44
|
+
readonly next?: string;
|
|
45
|
+
/** For a refused pre-release, the first pre-release of the required version on its channel. */
|
|
46
|
+
readonly suggestion?: string;
|
|
47
|
+
/**
|
|
48
|
+
* The declared version reaches the minimum, or there is nothing to compare. It judges an
|
|
49
|
+
* unpublished version: a published stable one is its own baseline and is never accepted, so a
|
|
50
|
+
* consumer decides on `published || accepted`, the exit status.
|
|
51
|
+
*/
|
|
52
|
+
readonly accepted: boolean;
|
|
53
|
+
/** Every change since the baseline, ordered by subject Key then observation; empty for none. */
|
|
54
|
+
readonly changes: readonly DiffChangeV1[];
|
|
55
|
+
}
|
|
56
|
+
export interface DiffInput {
|
|
57
|
+
readonly origin: string;
|
|
58
|
+
readonly declared: Version;
|
|
59
|
+
/**
|
|
60
|
+
* Which published versions can be the baseline (AM-23): `diff` compares with the highest stable
|
|
61
|
+
* version up to the declared one (`<=`, the default); `publish`, which never runs for a published
|
|
62
|
+
* version, with the highest one below it (`<`).
|
|
63
|
+
*/
|
|
64
|
+
readonly bound?: '<' | '<=';
|
|
65
|
+
/** The Schema revision the Project builds now. */
|
|
66
|
+
readonly revision: string;
|
|
67
|
+
/** The caller's view of the registry; `undefined` when it holds no readable Domain of `origin`. */
|
|
68
|
+
readonly index: RegistryIndex | undefined;
|
|
69
|
+
/** The Schema the Project builds now. */
|
|
70
|
+
readonly current: () => DomainSchema;
|
|
71
|
+
/** The build digest of every distinct bundler; read only when the Schema revision is unchanged. */
|
|
72
|
+
readonly builds: () => Promise<readonly string[]>;
|
|
73
|
+
/** The Schema a Publication names; read only when its revision differs from the Project's. */
|
|
74
|
+
readonly published: (publication: RegistryPublication) => Promise<DomainSchema>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compare the Project with the highest published stable version up to the declared one
|
|
78
|
+
* (`baselineVersion(index, declared, '<=')`, or below it for `publish`, AM-23) and judge the declared version against the
|
|
79
|
+
* level its changes require (tech Versioning [.21507], [.106102]). The judgement always receives a
|
|
80
|
+
* level beside its baseline (AM-56): the compatibility engine's when the Schema revision changed,
|
|
81
|
+
* otherwise patch, the smallest level, which `diff` picks itself when nothing changed at all.
|
|
82
|
+
*/
|
|
83
|
+
export declare function diffReport(input: DiffInput): Promise<DiffReportV1>;
|
|
84
|
+
/**
|
|
85
|
+
* Decode the bundle a Publication stores and admit it only as that Publication's Schema: the
|
|
86
|
+
* Domain's origin and the Publication's Schema revision.
|
|
87
|
+
*/
|
|
88
|
+
export declare function publishedSchema(bytes: Uint8Array, publication: RegistryPublication, origin: string): DomainSchema;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import * as bundle from '@astrale-os/kernel-dsl/v1/bundle/transport';
|
|
2
|
+
import { requiredBump } from '@astrale-os/kernel-dsl/v1/schema/compatibility';
|
|
3
|
+
import { revision } from '@astrale-os/kernel-dsl/v1/schema/revision';
|
|
4
|
+
import { baselineVersion, judgeVersion } from '../../../platform/versioning/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Compare the Project with the highest published stable version up to the declared one
|
|
7
|
+
* (`baselineVersion(index, declared, '<=')`, or below it for `publish`, AM-23) and judge the declared version against the
|
|
8
|
+
* level its changes require (tech Versioning [.21507], [.106102]). The judgement always receives a
|
|
9
|
+
* level beside its baseline (AM-56): the compatibility engine's when the Schema revision changed,
|
|
10
|
+
* otherwise patch, the smallest level, which `diff` picks itself when nothing changed at all.
|
|
11
|
+
*/
|
|
12
|
+
export async function diffReport(input) {
|
|
13
|
+
const identity = {
|
|
14
|
+
format: 'astrale.diff-report',
|
|
15
|
+
version: 1,
|
|
16
|
+
origin: input.origin,
|
|
17
|
+
declared: input.declared,
|
|
18
|
+
};
|
|
19
|
+
if (input.index === undefined) {
|
|
20
|
+
return Object.freeze({
|
|
21
|
+
...identity,
|
|
22
|
+
published: false,
|
|
23
|
+
registry: 'unregistered',
|
|
24
|
+
accepted: true,
|
|
25
|
+
changes: Object.freeze([]),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const publications = input.index.publications;
|
|
29
|
+
const published = publications.some(({ version }) => version === input.declared);
|
|
30
|
+
// An index entry that is not a canonical version is never a baseline: `baselineVersion` keeps
|
|
31
|
+
// only canonical stable versions (AM-56), so the registry's strings need no admission here.
|
|
32
|
+
const index = publications.map(({ version, yanked }) => ({
|
|
33
|
+
version: version,
|
|
34
|
+
yanked,
|
|
35
|
+
}));
|
|
36
|
+
const baseline = baselineVersion(index, input.declared, input.bound ?? '<=');
|
|
37
|
+
if (baseline === undefined) {
|
|
38
|
+
// Without a stable version before it there is nothing to check (tech [.106102]).
|
|
39
|
+
const verdict = judgeVersion({ declared: input.declared });
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
...identity,
|
|
42
|
+
published,
|
|
43
|
+
registry: 'read',
|
|
44
|
+
accepted: verdict.accepted,
|
|
45
|
+
changes: Object.freeze([]),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const publication = publications.find(({ version }) => version === baseline);
|
|
49
|
+
const { level, changes } = await changesSince(publication, input);
|
|
50
|
+
const verdict = judgeVersion({ declared: input.declared, previous: baseline, level });
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
...identity,
|
|
53
|
+
published,
|
|
54
|
+
registry: 'read',
|
|
55
|
+
baseline,
|
|
56
|
+
level,
|
|
57
|
+
effective: verdict.effective,
|
|
58
|
+
minimum: verdict.minimum,
|
|
59
|
+
next: verdict.next,
|
|
60
|
+
...(verdict.suggestion === undefined ? {} : { suggestion: verdict.suggestion }),
|
|
61
|
+
accepted: verdict.accepted,
|
|
62
|
+
changes,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Decode the bundle a Publication stores and admit it only as that Publication's Schema: the
|
|
67
|
+
* Domain's origin and the Publication's Schema revision.
|
|
68
|
+
*/
|
|
69
|
+
export function publishedSchema(bytes, publication, origin) {
|
|
70
|
+
const root = bundle.decode(bytes).root;
|
|
71
|
+
if (root.origin !== origin || revision(root) !== publication.schemaRevision) {
|
|
72
|
+
throw new TypeError(`The stored bundle of ${origin}@${publication.version} is not that Publication's Schema ${publication.schemaRevision}.`);
|
|
73
|
+
}
|
|
74
|
+
return root;
|
|
75
|
+
}
|
|
76
|
+
async function changesSince(publication, input) {
|
|
77
|
+
if (publication.schemaRevision !== input.revision) {
|
|
78
|
+
const required = requiredBump(await input.published(publication), input.current());
|
|
79
|
+
const changes = required.changes.map(change);
|
|
80
|
+
return {
|
|
81
|
+
level: required.level,
|
|
82
|
+
changes: Object.freeze(changes.length > 0
|
|
83
|
+
? changes
|
|
84
|
+
: // A new revision whose meaning the engine finds equivalent, such as descriptions.
|
|
85
|
+
[
|
|
86
|
+
Object.freeze({
|
|
87
|
+
subject: input.origin,
|
|
88
|
+
facet: 'schema',
|
|
89
|
+
state: 'changed',
|
|
90
|
+
bump: 'patch',
|
|
91
|
+
detail: 'same meaning',
|
|
92
|
+
}),
|
|
93
|
+
]),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const builds = await input.builds();
|
|
97
|
+
if (builds.includes(publication.buildDigest)) {
|
|
98
|
+
// No change at all: same build digest and no row of [.21507] (AM-56).
|
|
99
|
+
return { level: 'patch', changes: Object.freeze([]) };
|
|
100
|
+
}
|
|
101
|
+
// Code only, same Schema revision ([.21507], first row).
|
|
102
|
+
return {
|
|
103
|
+
level: 'patch',
|
|
104
|
+
changes: Object.freeze([
|
|
105
|
+
Object.freeze({
|
|
106
|
+
subject: input.origin,
|
|
107
|
+
facet: 'build',
|
|
108
|
+
state: 'changed',
|
|
109
|
+
bump: 'patch',
|
|
110
|
+
detail: `${publication.buildDigest} → ${builds.length === 0 ? 'none' : builds.join(', ')}`,
|
|
111
|
+
}),
|
|
112
|
+
]),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function change({ subject, observation, bump }) {
|
|
116
|
+
const detail = describe(observation);
|
|
117
|
+
return Object.freeze({
|
|
118
|
+
subject: subject.key,
|
|
119
|
+
facet: observation.facet,
|
|
120
|
+
// `requiredBump` lists only observations that are not equal.
|
|
121
|
+
state: observation.state,
|
|
122
|
+
bump,
|
|
123
|
+
...(detail === undefined ? {} : { detail }),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const DETAILED_DIFFERENCES = 3;
|
|
127
|
+
const VALUE_LENGTH = 40;
|
|
128
|
+
/** The observation's differences in a few words: `optional → required`, `input/type: "string" → "number"`. */
|
|
129
|
+
function describe(observation) {
|
|
130
|
+
const differences = observation.differences;
|
|
131
|
+
if (differences.length === 0)
|
|
132
|
+
return undefined;
|
|
133
|
+
const [first] = differences;
|
|
134
|
+
if (differences.length === 1 &&
|
|
135
|
+
first.path === '/required' &&
|
|
136
|
+
typeof first.before === 'boolean' &&
|
|
137
|
+
typeof first.after === 'boolean') {
|
|
138
|
+
return first.after ? 'optional → required' : 'required → optional';
|
|
139
|
+
}
|
|
140
|
+
const described = differences.slice(0, DETAILED_DIFFERENCES).map((difference) => {
|
|
141
|
+
const path = difference.path === '' ? '/' : difference.path.slice(1);
|
|
142
|
+
if (difference.before === undefined)
|
|
143
|
+
return `${path}: added ${value(difference.after)}`;
|
|
144
|
+
if (difference.after === undefined)
|
|
145
|
+
return `${path}: removed ${value(difference.before)}`;
|
|
146
|
+
return `${path}: ${value(difference.before)} → ${value(difference.after)}`;
|
|
147
|
+
});
|
|
148
|
+
const more = differences.length - described.length;
|
|
149
|
+
return more > 0 ? `${described.join('; ')}; ${more} more` : described.join('; ');
|
|
150
|
+
}
|
|
151
|
+
function value(input) {
|
|
152
|
+
const text = JSON.stringify(input) ?? String(input);
|
|
153
|
+
return text.length > VALUE_LENGTH ? `${text.slice(0, VALUE_LENGTH - 1)}…` : text;
|
|
154
|
+
}
|