@mannyc1/ts-release 0.0.7 → 0.2.2
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/ARCHITECTURE.md +124 -92
- package/CHANGELOG.md +115 -0
- package/LICENSE +21 -0
- package/README.md +278 -324
- package/SPEC.md +206 -310
- package/apps/release-ts/README.md +32 -0
- package/apps/release-ts/src/cli/command.ts +164 -0
- package/apps/release-ts/src/cli/commands.ts +351 -0
- package/apps/release-ts/src/cli/main.ts +43 -0
- package/apps/release-ts/src/cli/node-main.ts +49 -0
- package/apps/ts-release-agents/LICENSE +21 -0
- package/apps/ts-release-agents/README.md +21 -0
- package/apps/ts-release-agents/evals/cases.json +11 -0
- package/apps/ts-release-agents/manifests/claude.json +5 -0
- package/apps/ts-release-agents/manifests/codex.json +5 -0
- package/apps/ts-release-agents/package.json +11 -0
- package/apps/ts-release-agents/skills/release/SKILL.md +48 -0
- package/apps/ts-release-agents/skills/release/references/configuration.md +18 -0
- package/apps/ts-release-agents/skills/release/references/recovery.md +10 -0
- package/apps/ts-release-agents/skills/release/references/staged-workflow.md +12 -0
- package/apps/ts-release-agents/skills/release/references/target-selection.md +13 -0
- package/apps/ts-release-agents/skills/release/references/verification.md +14 -0
- package/apps/ts-release-agents/src/build.ts +105 -0
- package/apps/ts-release-agents/src/check.ts +117 -0
- package/apps/ts-release-agents/src/install.ts +121 -0
- package/apps/ts-release-agents/test/contract.test.ts +56 -0
- package/apps/ts-release-agents/tsconfig.json +5 -0
- package/dist/api/api.d.ts +15 -0
- package/dist/api/api.d.ts.map +1 -0
- package/dist/api/api.js +244 -0
- package/dist/api/api.js.map +1 -0
- package/dist/api/errors.d.ts +39 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +32 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/input.d.ts +10 -0
- package/dist/api/input.d.ts.map +1 -0
- package/dist/api/input.js +73 -0
- package/dist/api/input.js.map +1 -0
- package/dist/api/runtime.d.ts +18 -0
- package/dist/api/runtime.d.ts.map +1 -0
- package/dist/api/runtime.js +7 -0
- package/dist/api/runtime.js.map +1 -0
- package/dist/api/types.d.ts +76 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +17 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/ts-release.js +39239 -0
- package/dist/capabilities/bun-targets.d.ts +3 -0
- package/dist/capabilities/bun-targets.d.ts.map +1 -0
- package/dist/capabilities/bun-targets.js +3 -0
- package/dist/capabilities/bun-targets.js.map +1 -0
- package/dist/capabilities/field-ownership.d.ts +17 -0
- package/dist/capabilities/field-ownership.d.ts.map +1 -0
- package/dist/capabilities/field-ownership.js +40 -0
- package/dist/capabilities/field-ownership.js.map +1 -0
- package/dist/capabilities/module.d.ts +91 -0
- package/dist/capabilities/module.d.ts.map +1 -0
- package/dist/capabilities/module.js +2 -0
- package/dist/capabilities/module.js.map +1 -0
- package/dist/capabilities/registry.d.ts +829 -0
- package/dist/capabilities/registry.d.ts.map +1 -0
- package/dist/capabilities/registry.js +291 -0
- package/dist/capabilities/registry.js.map +1 -0
- package/dist/config/config.d.ts +6 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +42 -0
- package/dist/config/config.js.map +1 -0
- package/dist/correction/coordinator.d.ts +248 -0
- package/dist/correction/coordinator.d.ts.map +1 -0
- package/dist/correction/coordinator.js +274 -0
- package/dist/correction/coordinator.js.map +1 -0
- package/dist/correction/index.d.ts +3 -0
- package/dist/correction/index.d.ts.map +1 -0
- package/dist/correction/index.js +3 -0
- package/dist/correction/index.js.map +1 -0
- package/dist/correction/intent.d.ts +111 -0
- package/dist/correction/intent.d.ts.map +1 -0
- package/dist/correction/intent.js +146 -0
- package/dist/correction/intent.js.map +1 -0
- package/dist/drivers/archive.d.ts +8 -0
- package/dist/drivers/archive.d.ts.map +1 -0
- package/dist/drivers/archive.js +101 -0
- package/dist/drivers/archive.js.map +1 -0
- package/dist/drivers/contain.d.ts +6 -0
- package/dist/drivers/contain.d.ts.map +1 -0
- package/dist/drivers/contain.js +17 -0
- package/dist/drivers/contain.js.map +1 -0
- package/dist/drivers/environment.d.ts +4 -0
- package/dist/drivers/environment.d.ts.map +1 -0
- package/dist/drivers/environment.js +18 -0
- package/dist/drivers/environment.js.map +1 -0
- package/dist/drivers/errors.d.ts +9 -0
- package/dist/drivers/errors.d.ts.map +1 -0
- package/dist/drivers/errors.js +6 -0
- package/dist/drivers/errors.js.map +1 -0
- package/dist/drivers/glob.d.ts +2 -0
- package/dist/drivers/glob.d.ts.map +1 -0
- package/dist/drivers/glob.js +162 -0
- package/dist/drivers/glob.js.map +1 -0
- package/dist/drivers/process.d.ts +48 -0
- package/dist/drivers/process.d.ts.map +1 -0
- package/dist/drivers/process.js +257 -0
- package/dist/drivers/process.js.map +1 -0
- package/dist/drivers/redact.d.ts +4 -0
- package/dist/drivers/redact.d.ts.map +1 -0
- package/dist/drivers/redact.js +24 -0
- package/dist/drivers/redact.js.map +1 -0
- package/dist/drivers/seccomp-helper-source.d.ts +7 -0
- package/dist/drivers/seccomp-helper-source.d.ts.map +1 -0
- package/dist/drivers/seccomp-helper-source.js +121 -0
- package/dist/drivers/seccomp-helper-source.js.map +1 -0
- package/dist/drivers/utils.d.ts +4 -0
- package/dist/drivers/utils.d.ts.map +1 -0
- package/dist/drivers/utils.js +5 -0
- package/dist/drivers/utils.js.map +1 -0
- package/dist/drivers/workspace.d.ts +6 -0
- package/dist/drivers/workspace.d.ts.map +1 -0
- package/dist/drivers/workspace.js +49 -0
- package/dist/drivers/workspace.js.map +1 -0
- package/dist/extensions/provider-adapter.d.ts +48 -0
- package/dist/extensions/provider-adapter.d.ts.map +1 -0
- package/dist/extensions/provider-adapter.js +64 -0
- package/dist/extensions/provider-adapter.js.map +1 -0
- package/dist/host.d.ts +33 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +20 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/model/artifact-collection.d.ts +84 -0
- package/dist/model/artifact-collection.d.ts.map +1 -0
- package/dist/model/artifact-collection.js +185 -0
- package/dist/model/artifact-collection.js.map +1 -0
- package/dist/model/authority.d.ts +89 -0
- package/dist/model/authority.d.ts.map +1 -0
- package/dist/model/authority.js +80 -0
- package/dist/model/authority.js.map +1 -0
- package/dist/model/bun-targets.d.ts +34 -0
- package/dist/model/bun-targets.d.ts.map +1 -0
- package/dist/model/bun-targets.js +17 -0
- package/dist/model/bun-targets.js.map +1 -0
- package/dist/model/canonical.d.ts +8 -0
- package/dist/model/canonical.d.ts.map +1 -0
- package/dist/model/canonical.js +205 -0
- package/dist/model/canonical.js.map +1 -0
- package/dist/model/catalog.d.ts +76 -0
- package/dist/model/catalog.d.ts.map +1 -0
- package/dist/model/catalog.js +174 -0
- package/dist/model/catalog.js.map +1 -0
- package/dist/model/digest.d.ts +53 -0
- package/dist/model/digest.d.ts.map +1 -0
- package/dist/model/digest.js +127 -0
- package/dist/model/digest.js.map +1 -0
- package/dist/model/errors.d.ts +14 -0
- package/dist/model/errors.d.ts.map +1 -0
- package/dist/model/errors.js +8 -0
- package/dist/model/errors.js.map +1 -0
- package/dist/model/primitives.d.ts +19 -0
- package/dist/model/primitives.d.ts.map +1 -0
- package/dist/model/primitives.js +18 -0
- package/dist/model/primitives.js.map +1 -0
- package/dist/model/pypi.d.ts +12 -0
- package/dist/model/pypi.d.ts.map +1 -0
- package/dist/model/pypi.js +20 -0
- package/dist/model/pypi.js.map +1 -0
- package/dist/model/python-distribution.d.ts +33 -0
- package/dist/model/python-distribution.d.ts.map +1 -0
- package/dist/model/python-distribution.js +367 -0
- package/dist/model/python-distribution.js.map +1 -0
- package/dist/model/secret-patterns.d.ts +2 -0
- package/dist/model/secret-patterns.d.ts.map +1 -0
- package/dist/model/secret-patterns.js +12 -0
- package/dist/model/secret-patterns.js.map +1 -0
- package/dist/platform/bun.d.ts +7 -0
- package/dist/platform/bun.d.ts.map +1 -0
- package/dist/platform/bun.js +15 -0
- package/dist/platform/bun.js.map +1 -0
- package/dist/platform/credentials.d.ts +32 -0
- package/dist/platform/credentials.d.ts.map +1 -0
- package/dist/platform/credentials.js +772 -0
- package/dist/platform/credentials.js.map +1 -0
- package/dist/platform/host-support.d.ts +2 -0
- package/dist/platform/host-support.d.ts.map +1 -0
- package/dist/platform/host-support.js +4 -0
- package/dist/platform/host-support.js.map +1 -0
- package/dist/platform/node.d.ts +7 -0
- package/dist/platform/node.d.ts.map +1 -0
- package/dist/platform/node.js +15 -0
- package/dist/platform/node.js.map +1 -0
- package/dist/platform/release-runtime.d.ts +11 -0
- package/dist/platform/release-runtime.d.ts.map +1 -0
- package/dist/platform/release-runtime.js +34 -0
- package/dist/platform/release-runtime.js.map +1 -0
- package/dist/platform/services.d.ts +15 -0
- package/dist/platform/services.d.ts.map +1 -0
- package/dist/platform/services.js +30 -0
- package/dist/platform/services.js.map +1 -0
- package/dist/platform/source-observer.d.ts +5 -0
- package/dist/platform/source-observer.d.ts.map +1 -0
- package/dist/platform/source-observer.js +159 -0
- package/dist/platform/source-observer.js.map +1 -0
- package/dist/provider-sdk.d.ts +14 -0
- package/dist/provider-sdk.d.ts.map +1 -0
- package/dist/provider-sdk.js +10 -0
- package/dist/provider-sdk.js.map +1 -0
- package/dist/publication/adapter.d.ts +212 -0
- package/dist/publication/adapter.d.ts.map +1 -0
- package/dist/publication/adapter.js +83 -0
- package/dist/publication/adapter.js.map +1 -0
- package/dist/publication/authority.d.ts +137 -0
- package/dist/publication/authority.d.ts.map +1 -0
- package/dist/publication/authority.js +233 -0
- package/dist/publication/authority.js.map +1 -0
- package/dist/publication/catalog-git.d.ts +37 -0
- package/dist/publication/catalog-git.d.ts.map +1 -0
- package/dist/publication/catalog-git.js +451 -0
- package/dist/publication/catalog-git.js.map +1 -0
- package/dist/publication/claim.d.ts +39 -0
- package/dist/publication/claim.d.ts.map +1 -0
- package/dist/publication/claim.js +31 -0
- package/dist/publication/claim.js.map +1 -0
- package/dist/publication/coordinator.d.ts +246 -0
- package/dist/publication/coordinator.d.ts.map +1 -0
- package/dist/publication/coordinator.js +370 -0
- package/dist/publication/coordinator.js.map +1 -0
- package/dist/publication/github.d.ts +36 -0
- package/dist/publication/github.d.ts.map +1 -0
- package/dist/publication/github.js +644 -0
- package/dist/publication/github.js.map +1 -0
- package/dist/publication/http.d.ts +69 -0
- package/dist/publication/http.d.ts.map +1 -0
- package/dist/publication/http.js +29 -0
- package/dist/publication/http.js.map +1 -0
- package/dist/publication/index.d.ts +5 -0
- package/dist/publication/index.d.ts.map +1 -0
- package/dist/publication/index.js +5 -0
- package/dist/publication/index.js.map +1 -0
- package/dist/publication/npm.d.ts +40 -0
- package/dist/publication/npm.d.ts.map +1 -0
- package/dist/publication/npm.js +359 -0
- package/dist/publication/npm.js.map +1 -0
- package/dist/publication/profiles.d.ts +136 -0
- package/dist/publication/profiles.d.ts.map +1 -0
- package/dist/publication/profiles.js +90 -0
- package/dist/publication/profiles.js.map +1 -0
- package/dist/publication/publisher.d.ts +82 -0
- package/dist/publication/publisher.d.ts.map +1 -0
- package/dist/publication/publisher.js +53 -0
- package/dist/publication/publisher.js.map +1 -0
- package/dist/publication/pypi.d.ts +45 -0
- package/dist/publication/pypi.d.ts.map +1 -0
- package/dist/publication/pypi.js +369 -0
- package/dist/publication/pypi.js.map +1 -0
- package/dist/publication/recovery.d.ts +663 -0
- package/dist/publication/recovery.d.ts.map +1 -0
- package/dist/publication/recovery.js +252 -0
- package/dist/publication/recovery.js.map +1 -0
- package/dist/publication/report.d.ts +1061 -0
- package/dist/publication/report.d.ts.map +1 -0
- package/dist/publication/report.js +441 -0
- package/dist/publication/report.js.map +1 -0
- package/dist/recipes/config.d.ts +296 -0
- package/dist/recipes/config.d.ts.map +1 -0
- package/dist/recipes/config.js +325 -0
- package/dist/recipes/config.js.map +1 -0
- package/dist/release/capabilities.d.ts +12 -0
- package/dist/release/capabilities.d.ts.map +1 -0
- package/dist/release/capabilities.js +395 -0
- package/dist/release/capabilities.js.map +1 -0
- package/dist/release/compiler.d.ts +5 -0
- package/dist/release/compiler.d.ts.map +1 -0
- package/dist/release/compiler.js +19 -0
- package/dist/release/compiler.js.map +1 -0
- package/dist/release/config.d.ts +5 -0
- package/dist/release/config.d.ts.map +1 -0
- package/dist/release/config.js +10 -0
- package/dist/release/config.js.map +1 -0
- package/dist/release/context.d.ts +96 -0
- package/dist/release/context.d.ts.map +1 -0
- package/dist/release/context.js +168 -0
- package/dist/release/context.js.map +1 -0
- package/dist/release/graph.d.ts +271 -0
- package/dist/release/graph.d.ts.map +1 -0
- package/dist/release/graph.js +766 -0
- package/dist/release/graph.js.map +1 -0
- package/dist/release/inspect.d.ts +88 -0
- package/dist/release/inspect.d.ts.map +1 -0
- package/dist/release/inspect.js +75 -0
- package/dist/release/inspect.js.map +1 -0
- package/dist/release/prepare.d.ts +24 -0
- package/dist/release/prepare.d.ts.map +1 -0
- package/dist/release/prepare.js +1116 -0
- package/dist/release/prepare.js.map +1 -0
- package/dist/release/prepared-ref.d.ts +60 -0
- package/dist/release/prepared-ref.d.ts.map +1 -0
- package/dist/release/prepared-ref.js +131 -0
- package/dist/release/prepared-ref.js.map +1 -0
- package/dist/release/prepared-store.d.ts +90 -0
- package/dist/release/prepared-store.d.ts.map +1 -0
- package/dist/release/prepared-store.js +337 -0
- package/dist/release/prepared-store.js.map +1 -0
- package/dist/release/prepared.d.ts +172 -0
- package/dist/release/prepared.d.ts.map +1 -0
- package/dist/release/prepared.js +268 -0
- package/dist/release/prepared.js.map +1 -0
- package/dist/release/staging.d.ts +31 -0
- package/dist/release/staging.d.ts.map +1 -0
- package/dist/release/staging.js +218 -0
- package/dist/release/staging.js.map +1 -0
- package/dist/resolve/authored.d.ts +53 -0
- package/dist/resolve/authored.d.ts.map +1 -0
- package/dist/resolve/authored.js +55 -0
- package/dist/resolve/authored.js.map +1 -0
- package/dist/resolve/encode.d.ts +3 -0
- package/dist/resolve/encode.d.ts.map +1 -0
- package/dist/resolve/encode.js +21 -0
- package/dist/resolve/encode.js.map +1 -0
- package/dist/resolve/errors.d.ts +7 -0
- package/dist/resolve/errors.d.ts.map +1 -0
- package/dist/resolve/errors.js +17 -0
- package/dist/resolve/errors.js.map +1 -0
- package/dist/resolve/facts.d.ts +12 -0
- package/dist/resolve/facts.d.ts.map +1 -0
- package/dist/resolve/facts.js +18 -0
- package/dist/resolve/facts.js.map +1 -0
- package/dist/resolve/resolve.d.ts +10 -0
- package/dist/resolve/resolve.d.ts.map +1 -0
- package/dist/resolve/resolve.js +242 -0
- package/dist/resolve/resolve.js.map +1 -0
- package/dist/store.d.ts +11 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +9 -0
- package/dist/store.js.map +1 -0
- package/examples/README.md +20 -30
- package/examples/github-release/release.config.json +11 -18
- package/examples/homebrew-tap/README.md +11 -0
- package/examples/homebrew-tap/release.config.json +40 -28
- package/examples/multi-target/release.config.json +28 -53
- package/examples/npm-first-publish/release.config.json +23 -25
- package/examples/npm-only/release.config.json +22 -30
- package/examples/portable-cli/README.md +17 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-arm64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-x64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-arm64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-x64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-windows-x64.exe +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_10_15_x86_64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_11_0_arm64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_aarch64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_x86_64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-win_amd64.whl +1 -0
- package/examples/portable-cli/package.json +9 -0
- package/examples/portable-cli/release.config.json +53 -0
- package/examples/portable-cli/src/cli.ts +3 -0
- package/examples/pypi-registry/README.md +8 -0
- package/examples/scoop-bucket/README.md +10 -0
- package/examples/scoop-bucket/release.config.json +40 -30
- package/package.json +60 -156
- package/src/api/api.ts +365 -0
- package/src/api/errors.ts +36 -0
- package/src/api/input.ts +92 -0
- package/src/api/runtime.ts +14 -0
- package/src/api/types.ts +103 -0
- package/src/capabilities/bun-targets.ts +2 -0
- package/src/capabilities/field-ownership.ts +60 -0
- package/src/capabilities/module.ts +158 -0
- package/src/capabilities/registry.ts +333 -0
- package/src/config/config.ts +48 -0
- package/src/correction/coordinator.ts +336 -0
- package/src/correction/index.ts +2 -0
- package/src/correction/intent.ts +172 -0
- package/src/drivers/archive.ts +102 -0
- package/src/drivers/contain.ts +20 -0
- package/src/drivers/environment.ts +28 -0
- package/src/drivers/errors.ts +6 -0
- package/src/drivers/glob.ts +137 -0
- package/src/drivers/process.ts +340 -0
- package/src/drivers/redact.ts +31 -0
- package/src/drivers/seccomp-helper-source.ts +121 -0
- package/src/drivers/utils.ts +10 -0
- package/src/drivers/workspace.ts +40 -0
- package/src/extensions/provider-adapter.ts +99 -0
- package/src/host.ts +140 -0
- package/src/index.ts +64 -0
- package/src/model/artifact-collection.ts +237 -0
- package/src/model/authority.ts +116 -0
- package/src/model/bun-targets.ts +34 -0
- package/src/model/canonical.ts +205 -0
- package/src/model/catalog.ts +220 -0
- package/src/model/digest.ts +172 -0
- package/src/model/errors.ts +6 -0
- package/src/model/primitives.ts +37 -0
- package/src/model/pypi.ts +30 -0
- package/src/model/python-distribution.ts +360 -0
- package/src/model/secret-patterns.ts +11 -0
- package/src/platform/bun.ts +38 -0
- package/src/platform/credentials.ts +1083 -0
- package/src/platform/host-support.ts +4 -0
- package/src/platform/node.ts +38 -0
- package/src/platform/release-runtime.ts +47 -0
- package/src/platform/services.ts +57 -0
- package/src/platform/source-observer.ts +193 -0
- package/src/provider-sdk.ts +48 -0
- package/src/publication/adapter.ts +132 -0
- package/src/publication/authority.ts +397 -0
- package/src/publication/catalog-git.ts +603 -0
- package/src/publication/claim.ts +51 -0
- package/src/publication/coordinator.ts +578 -0
- package/src/publication/github.ts +954 -0
- package/src/publication/http.ts +101 -0
- package/src/publication/index.ts +4 -0
- package/src/publication/npm.ts +525 -0
- package/src/publication/profiles.ts +94 -0
- package/src/publication/publisher.ts +130 -0
- package/src/publication/pypi.ts +463 -0
- package/src/publication/recovery.ts +349 -0
- package/src/publication/report.ts +628 -0
- package/src/recipes/config.ts +395 -0
- package/src/release/capabilities.ts +459 -0
- package/src/release/compiler.ts +28 -0
- package/src/release/config.ts +12 -0
- package/src/release/context.ts +223 -0
- package/src/release/graph.ts +866 -0
- package/src/release/inspect.ts +83 -0
- package/src/release/prepare.ts +1331 -0
- package/src/release/prepared-ref.ts +193 -0
- package/src/release/prepared-store.ts +377 -0
- package/src/release/prepared.ts +299 -0
- package/src/release/staging.ts +257 -0
- package/src/resolve/authored.ts +64 -0
- package/src/resolve/encode.ts +22 -0
- package/src/resolve/errors.ts +15 -0
- package/src/resolve/facts.ts +18 -0
- package/src/resolve/resolve.ts +328 -0
- package/src/store.ts +28 -0
- package/templates/README.md +55 -72
- package/templates/bun-cli-github/README.md +7 -9
- package/templates/bun-cli-github/release.config.json +35 -73
- package/templates/github-actions/release.yml +57 -0
- package/templates/github-actions/reviewed-release.yml +80 -0
- package/templates/multi-target-homebrew/README.md +10 -0
- package/templates/multi-target-homebrew/release.config.json +43 -60
- package/templates/multi-target-scoop/README.md +10 -0
- package/templates/multi-target-scoop/release.config.json +43 -62
- package/templates/npm-github/release.config.json +25 -38
- package/templates/npm-github/reviewed-release.config.json +37 -0
- package/templates/npm-only/README.md +10 -0
- package/templates/npm-only/release.config.json +15 -30
- package/templates/portable-cli/README.md +13 -0
- package/templates/portable-cli/release.config.json +53 -0
- package/dist/artifacts/adapter.d.ts +0 -39
- package/dist/artifacts/adapter.d.ts.map +0 -1
- package/dist/artifacts/adapter.js +0 -23
- package/dist/artifacts/adapter.js.map +0 -1
- package/dist/artifacts/registry.d.ts +0 -21
- package/dist/artifacts/registry.d.ts.map +0 -1
- package/dist/artifacts/registry.js +0 -21
- package/dist/artifacts/registry.js.map +0 -1
- package/dist/config/errors.d.ts +0 -24
- package/dist/config/errors.d.ts.map +0 -1
- package/dist/config/errors.js +0 -19
- package/dist/config/errors.js.map +0 -1
- package/dist/config/load.d.ts +0 -9
- package/dist/config/load.d.ts.map +0 -1
- package/dist/config/load.js +0 -29
- package/dist/config/load.js.map +0 -1
- package/dist/config/schema.d.ts +0 -12
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -19
- package/dist/config/schema.js.map +0 -1
- package/dist/domain/artifact.d.ts +0 -118
- package/dist/domain/artifact.d.ts.map +0 -1
- package/dist/domain/artifact.js +0 -197
- package/dist/domain/artifact.js.map +0 -1
- package/dist/domain/evidence.d.ts +0 -59
- package/dist/domain/evidence.d.ts.map +0 -1
- package/dist/domain/evidence.js +0 -51
- package/dist/domain/evidence.js.map +0 -1
- package/dist/domain/operation.d.ts +0 -143
- package/dist/domain/operation.d.ts.map +0 -1
- package/dist/domain/operation.js +0 -198
- package/dist/domain/operation.js.map +0 -1
- package/dist/domain/release.d.ts +0 -93
- package/dist/domain/release.d.ts.map +0 -1
- package/dist/domain/release.js +0 -82
- package/dist/domain/release.js.map +0 -1
- package/dist/domain/remote-state.d.ts +0 -58
- package/dist/domain/remote-state.d.ts.map +0 -1
- package/dist/domain/remote-state.js +0 -55
- package/dist/domain/remote-state.js.map +0 -1
- package/dist/domain/target.d.ts +0 -148
- package/dist/domain/target.d.ts.map +0 -1
- package/dist/domain/target.js +0 -151
- package/dist/domain/target.js.map +0 -1
- package/dist/host/host.d.ts +0 -32
- package/dist/host/host.d.ts.map +0 -1
- package/dist/host/host.js +0 -24
- package/dist/host/host.js.map +0 -1
- package/dist/host/http-live.d.ts +0 -6
- package/dist/host/http-live.d.ts.map +0 -1
- package/dist/host/http-live.js +0 -86
- package/dist/host/http-live.js.map +0 -1
- package/dist/host/http.d.ts +0 -43
- package/dist/host/http.d.ts.map +0 -1
- package/dist/host/http.js +0 -59
- package/dist/host/http.js.map +0 -1
- package/dist/host/platform.d.ts +0 -10
- package/dist/host/platform.d.ts.map +0 -1
- package/dist/host/platform.js +0 -114
- package/dist/host/platform.js.map +0 -1
- package/dist/host/test.d.ts +0 -23
- package/dist/host/test.d.ts.map +0 -1
- package/dist/host/test.js +0 -222
- package/dist/host/test.js.map +0 -1
- package/dist/internal/workspace-path.d.ts +0 -15
- package/dist/internal/workspace-path.d.ts.map +0 -1
- package/dist/internal/workspace-path.js +0 -36
- package/dist/internal/workspace-path.js.map +0 -1
- package/dist/planner/artifact-inventory.d.ts +0 -9
- package/dist/planner/artifact-inventory.d.ts.map +0 -1
- package/dist/planner/artifact-inventory.js +0 -86
- package/dist/planner/artifact-inventory.js.map +0 -1
- package/dist/planner/create-release-plan.d.ts +0 -5
- package/dist/planner/create-release-plan.d.ts.map +0 -1
- package/dist/planner/create-release-plan.js +0 -25
- package/dist/planner/create-release-plan.js.map +0 -1
- package/dist/planner/errors.d.ts +0 -67
- package/dist/planner/errors.d.ts.map +0 -1
- package/dist/planner/errors.js +0 -58
- package/dist/planner/errors.js.map +0 -1
- package/dist/planner/evidence-recorder.d.ts +0 -28
- package/dist/planner/evidence-recorder.d.ts.map +0 -1
- package/dist/planner/evidence-recorder.js +0 -362
- package/dist/planner/evidence-recorder.js.map +0 -1
- package/dist/planner/executor.d.ts +0 -58
- package/dist/planner/executor.d.ts.map +0 -1
- package/dist/planner/executor.js +0 -147
- package/dist/planner/executor.js.map +0 -1
- package/dist/planner/normalize-release.d.ts +0 -19
- package/dist/planner/normalize-release.d.ts.map +0 -1
- package/dist/planner/normalize-release.js +0 -342
- package/dist/planner/normalize-release.js.map +0 -1
- package/dist/planner/reconcile.d.ts +0 -17
- package/dist/planner/reconcile.d.ts.map +0 -1
- package/dist/planner/reconcile.js +0 -259
- package/dist/planner/reconcile.js.map +0 -1
- package/dist/planner/render-plan.d.ts +0 -15
- package/dist/planner/render-plan.d.ts.map +0 -1
- package/dist/planner/render-plan.js +0 -231
- package/dist/planner/render-plan.js.map +0 -1
- package/dist/targets/adapter-helpers.d.ts +0 -79
- package/dist/targets/adapter-helpers.d.ts.map +0 -1
- package/dist/targets/adapter-helpers.js +0 -194
- package/dist/targets/adapter-helpers.js.map +0 -1
- package/dist/targets/adapter.d.ts +0 -17
- package/dist/targets/adapter.d.ts.map +0 -1
- package/dist/targets/adapter.js +0 -2
- package/dist/targets/adapter.js.map +0 -1
- package/dist/targets/github-release.d.ts +0 -25
- package/dist/targets/github-release.d.ts.map +0 -1
- package/dist/targets/github-release.js +0 -82
- package/dist/targets/github-release.js.map +0 -1
- package/dist/targets/github.d.ts +0 -11
- package/dist/targets/github.d.ts.map +0 -1
- package/dist/targets/github.js +0 -117
- package/dist/targets/github.js.map +0 -1
- package/dist/targets/homebrew.d.ts +0 -11
- package/dist/targets/homebrew.d.ts.map +0 -1
- package/dist/targets/homebrew.js +0 -210
- package/dist/targets/homebrew.js.map +0 -1
- package/dist/targets/live.d.ts +0 -5
- package/dist/targets/live.d.ts.map +0 -1
- package/dist/targets/live.js +0 -50
- package/dist/targets/live.js.map +0 -1
- package/dist/targets/npm.d.ts +0 -10
- package/dist/targets/npm.d.ts.map +0 -1
- package/dist/targets/npm.js +0 -112
- package/dist/targets/npm.js.map +0 -1
- package/dist/targets/pypi.d.ts +0 -11
- package/dist/targets/pypi.d.ts.map +0 -1
- package/dist/targets/pypi.js +0 -141
- package/dist/targets/pypi.js.map +0 -1
- package/dist/targets/registry.d.ts +0 -25
- package/dist/targets/registry.d.ts.map +0 -1
- package/dist/targets/registry.js +0 -34
- package/dist/targets/registry.js.map +0 -1
- package/dist/targets/scoop.d.ts +0 -11
- package/dist/targets/scoop.d.ts.map +0 -1
- package/dist/targets/scoop.js +0 -88
- package/dist/targets/scoop.js.map +0 -1
- package/dist/types/effect-internal.d.ts +0 -5
- package/dist/types/effect-internal.d.ts.map +0 -1
- package/dist/types/effect-internal.js +0 -2
- package/dist/types/effect-internal.js.map +0 -1
- package/dist/workflows/config.d.ts +0 -202
- package/dist/workflows/config.d.ts.map +0 -1
- package/dist/workflows/config.js +0 -420
- package/dist/workflows/config.js.map +0 -1
- package/dist/workflows/diagnostics.d.ts +0 -62
- package/dist/workflows/diagnostics.d.ts.map +0 -1
- package/dist/workflows/diagnostics.js +0 -530
- package/dist/workflows/diagnostics.js.map +0 -1
- package/dist/workflows/distribution.d.ts +0 -25
- package/dist/workflows/distribution.d.ts.map +0 -1
- package/dist/workflows/distribution.js +0 -24
- package/dist/workflows/distribution.js.map +0 -1
- package/dist/workflows/evidence.d.ts +0 -17
- package/dist/workflows/evidence.d.ts.map +0 -1
- package/dist/workflows/evidence.js +0 -32
- package/dist/workflows/evidence.js.map +0 -1
- package/dist/workflows/index.d.ts +0 -8
- package/dist/workflows/index.d.ts.map +0 -1
- package/dist/workflows/index.js +0 -7
- package/dist/workflows/index.js.map +0 -1
- package/dist/workflows/init.d.ts +0 -84
- package/dist/workflows/init.d.ts.map +0 -1
- package/dist/workflows/init.js +0 -487
- package/dist/workflows/init.js.map +0 -1
- package/dist/workflows/live.d.ts +0 -9
- package/dist/workflows/live.d.ts.map +0 -1
- package/dist/workflows/live.js +0 -7
- package/dist/workflows/live.js.map +0 -1
- package/dist/workflows/options.d.ts +0 -30
- package/dist/workflows/options.d.ts.map +0 -1
- package/dist/workflows/options.js +0 -16
- package/dist/workflows/options.js.map +0 -1
- package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +0 -1
- package/examples/non-strict-skips/release.config.json +0 -31
- package/examples/pypi-registry/release.config.json +0 -31
- package/templates/github-actions/plan-and-approved-execute.yml +0 -58
- package/templates/github-actions/plan-only.yml +0 -33
- package/templates/github-actions/trusted-publishing.yml +0 -61
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema"
|
|
2
|
+
import * as Result from "effect/Result"
|
|
3
|
+
import {
|
|
4
|
+
CanonicalAudience,
|
|
5
|
+
CredentialPurpose,
|
|
6
|
+
ProviderId,
|
|
7
|
+
SubjectId
|
|
8
|
+
} from "../model/authority.js"
|
|
9
|
+
import { NonEmptyName } from "../model/primitives.js"
|
|
10
|
+
import { secretPatterns } from "../model/secret-patterns.js"
|
|
11
|
+
|
|
12
|
+
export const SafeReason = Schema.String.check(
|
|
13
|
+
Schema.makeFilter((value: string) => {
|
|
14
|
+
const length = [...value].length
|
|
15
|
+
if (length === 0 || length > 2048) return "SafeReason must contain between 1 and 2048 code points."
|
|
16
|
+
if (![...value].every((character) => {
|
|
17
|
+
const codePoint = character.codePointAt(0) ?? 0
|
|
18
|
+
return codePoint === 9 || codePoint === 10 || codePoint === 13 || codePoint >= 0x20
|
|
19
|
+
})) return "SafeReason must not contain control characters."
|
|
20
|
+
if (secretPatterns.some((pattern) => pattern.test(value))) return "SafeReason must not contain token-shaped material."
|
|
21
|
+
return undefined
|
|
22
|
+
})
|
|
23
|
+
).pipe(Schema.brand("SafeReason"))
|
|
24
|
+
export type SafeReason = typeof SafeReason.Type
|
|
25
|
+
|
|
26
|
+
export class Difference extends Schema.Class<Difference>("Difference")({
|
|
27
|
+
field: NonEmptyName,
|
|
28
|
+
expected: SafeReason,
|
|
29
|
+
observed: SafeReason
|
|
30
|
+
}) {}
|
|
31
|
+
|
|
32
|
+
export class AbsenceBasis extends Schema.Class<AbsenceBasis>("AbsenceBasis")({
|
|
33
|
+
kind: NonEmptyName,
|
|
34
|
+
detail: SafeReason
|
|
35
|
+
}) {}
|
|
36
|
+
|
|
37
|
+
export class VisibilityBasis extends Schema.Class<VisibilityBasis>("VisibilityBasis")({
|
|
38
|
+
kind: NonEmptyName,
|
|
39
|
+
detail: SafeReason
|
|
40
|
+
}) {}
|
|
41
|
+
|
|
42
|
+
export class PresentEquivalent
|
|
43
|
+
extends Schema.TaggedClass<PresentEquivalent>()("PresentEquivalent", {
|
|
44
|
+
subject: SubjectId
|
|
45
|
+
}) {}
|
|
46
|
+
|
|
47
|
+
export class PresentDifferent
|
|
48
|
+
extends Schema.TaggedClass<PresentDifferent>()("PresentDifferent", {
|
|
49
|
+
subject: SubjectId,
|
|
50
|
+
differences: Schema.NonEmptyArray(Difference)
|
|
51
|
+
}) {}
|
|
52
|
+
|
|
53
|
+
export class AuthoritativelyAbsent
|
|
54
|
+
extends Schema.TaggedClass<AuthoritativelyAbsent>()("AuthoritativelyAbsent", {
|
|
55
|
+
subject: SubjectId,
|
|
56
|
+
basis: AbsenceBasis
|
|
57
|
+
}) {}
|
|
58
|
+
|
|
59
|
+
export class VisibilityPending
|
|
60
|
+
extends Schema.TaggedClass<VisibilityPending>()("VisibilityPending", {
|
|
61
|
+
subject: SubjectId,
|
|
62
|
+
expectation: SafeReason,
|
|
63
|
+
basis: VisibilityBasis
|
|
64
|
+
}) {}
|
|
65
|
+
|
|
66
|
+
const CredentialFailureStrategy = Schema.Literals(["anonymous", "token", "trusted-publishing"])
|
|
67
|
+
|
|
68
|
+
/** Secret-free durable projection of a transient credential acquisition failure. */
|
|
69
|
+
export class CredentialUnavailableCause
|
|
70
|
+
extends Schema.TaggedClass<CredentialUnavailableCause>()("CredentialUnavailable", {
|
|
71
|
+
provider: ProviderId,
|
|
72
|
+
purpose: CredentialPurpose,
|
|
73
|
+
strategy: CredentialFailureStrategy
|
|
74
|
+
}) {}
|
|
75
|
+
|
|
76
|
+
/** Secret-free durable projection of an unsupported prepared authentication strategy. */
|
|
77
|
+
export class CredentialStrategyUnsupportedCause
|
|
78
|
+
extends Schema.TaggedClass<CredentialStrategyUnsupportedCause>()("CredentialStrategyUnsupported", {
|
|
79
|
+
provider: ProviderId,
|
|
80
|
+
purpose: CredentialPurpose,
|
|
81
|
+
strategy: CredentialFailureStrategy
|
|
82
|
+
}) {}
|
|
83
|
+
|
|
84
|
+
export const CredentialFailureCause = Schema.Union([
|
|
85
|
+
CredentialUnavailableCause,
|
|
86
|
+
CredentialStrategyUnsupportedCause
|
|
87
|
+
])
|
|
88
|
+
export type CredentialFailureCause = typeof CredentialFailureCause.Type
|
|
89
|
+
|
|
90
|
+
export class InconclusiveObservation
|
|
91
|
+
extends Schema.TaggedClass<InconclusiveObservation>()("Inconclusive", {
|
|
92
|
+
subject: SubjectId,
|
|
93
|
+
reason: SafeReason,
|
|
94
|
+
cause: Schema.optionalKey(CredentialFailureCause)
|
|
95
|
+
}) {}
|
|
96
|
+
|
|
97
|
+
export const Observation = Schema.Union([
|
|
98
|
+
PresentEquivalent,
|
|
99
|
+
PresentDifferent,
|
|
100
|
+
AuthoritativelyAbsent,
|
|
101
|
+
VisibilityPending,
|
|
102
|
+
InconclusiveObservation
|
|
103
|
+
])
|
|
104
|
+
export type Observation = typeof Observation.Type
|
|
105
|
+
|
|
106
|
+
export class MutationPrecondition
|
|
107
|
+
extends Schema.Class<MutationPrecondition>("MutationPrecondition")({
|
|
108
|
+
kind: NonEmptyName
|
|
109
|
+
}) {}
|
|
110
|
+
|
|
111
|
+
export class CreateAuthorizationProof
|
|
112
|
+
extends Schema.Class<CreateAuthorizationProof>("CreateAuthorizationProof")({
|
|
113
|
+
kind: NonEmptyName
|
|
114
|
+
}) {}
|
|
115
|
+
|
|
116
|
+
export class NeedsMutation
|
|
117
|
+
extends Schema.TaggedClass<NeedsMutation>()("NeedsMutation", {
|
|
118
|
+
subject: SubjectId,
|
|
119
|
+
precondition: MutationPrecondition
|
|
120
|
+
}) {}
|
|
121
|
+
|
|
122
|
+
export class ProviderAuthorizedCreate
|
|
123
|
+
extends Schema.TaggedClass<ProviderAuthorizedCreate>()("ProviderAuthorizedCreate", {
|
|
124
|
+
subject: SubjectId,
|
|
125
|
+
proof: CreateAuthorizationProof
|
|
126
|
+
}) {}
|
|
127
|
+
|
|
128
|
+
export const MutationDecision = Schema.Union([NeedsMutation, ProviderAuthorizedCreate])
|
|
129
|
+
export type MutationDecision = typeof MutationDecision.Type
|
|
130
|
+
|
|
131
|
+
export class ProviderAlreadyEquivalent
|
|
132
|
+
extends Schema.TaggedClass<ProviderAlreadyEquivalent>()("AlreadyEquivalent", {
|
|
133
|
+
subject: SubjectId
|
|
134
|
+
}) {}
|
|
135
|
+
|
|
136
|
+
export class Conflict
|
|
137
|
+
extends Schema.TaggedClass<Conflict>()("Conflict", {
|
|
138
|
+
subject: SubjectId,
|
|
139
|
+
differences: Schema.NonEmptyArray(Difference)
|
|
140
|
+
}) {}
|
|
141
|
+
|
|
142
|
+
export class ProviderBlocked
|
|
143
|
+
extends Schema.TaggedClass<ProviderBlocked>()("Blocked", {
|
|
144
|
+
subject: SubjectId,
|
|
145
|
+
reason: SafeReason,
|
|
146
|
+
cause: Schema.optionalKey(CredentialFailureCause)
|
|
147
|
+
}) {}
|
|
148
|
+
|
|
149
|
+
export const ProviderDecision = Schema.Union([
|
|
150
|
+
ProviderAlreadyEquivalent,
|
|
151
|
+
NeedsMutation,
|
|
152
|
+
ProviderAuthorizedCreate,
|
|
153
|
+
Conflict,
|
|
154
|
+
ProviderBlocked
|
|
155
|
+
])
|
|
156
|
+
export type ProviderDecision = typeof ProviderDecision.Type
|
|
157
|
+
|
|
158
|
+
export class ProviderRejectionFact extends Schema.Class<ProviderRejectionFact>("ProviderRejectionFact")({
|
|
159
|
+
subject: SubjectId,
|
|
160
|
+
code: NonEmptyName,
|
|
161
|
+
detail: SafeReason
|
|
162
|
+
}) {}
|
|
163
|
+
|
|
164
|
+
export class ProviderMutationFact extends Schema.Class<ProviderMutationFact>("ProviderMutationFact")({
|
|
165
|
+
subject: SubjectId,
|
|
166
|
+
detail: SafeReason
|
|
167
|
+
}) {}
|
|
168
|
+
|
|
169
|
+
export class RejectedBeforeDispatch
|
|
170
|
+
extends Schema.TaggedClass<RejectedBeforeDispatch>()("RejectedBeforeDispatch", {
|
|
171
|
+
subject: SubjectId,
|
|
172
|
+
reason: SafeReason
|
|
173
|
+
}) {}
|
|
174
|
+
|
|
175
|
+
export class Started
|
|
176
|
+
extends Schema.TaggedClass<Started>()("Started", {
|
|
177
|
+
subject: SubjectId
|
|
178
|
+
}) {}
|
|
179
|
+
|
|
180
|
+
export class RejectedByProvider
|
|
181
|
+
extends Schema.TaggedClass<RejectedByProvider>()("RejectedByProvider", {
|
|
182
|
+
subject: SubjectId,
|
|
183
|
+
fact: ProviderRejectionFact
|
|
184
|
+
}) {}
|
|
185
|
+
|
|
186
|
+
export class Applied
|
|
187
|
+
extends Schema.TaggedClass<Applied>()("Applied", {
|
|
188
|
+
subject: SubjectId,
|
|
189
|
+
fact: ProviderMutationFact
|
|
190
|
+
}) {}
|
|
191
|
+
|
|
192
|
+
export class OutcomeUnknown
|
|
193
|
+
extends Schema.TaggedClass<OutcomeUnknown>()("OutcomeUnknown", {
|
|
194
|
+
subject: SubjectId,
|
|
195
|
+
reason: SafeReason
|
|
196
|
+
}) {}
|
|
197
|
+
|
|
198
|
+
export const MutationAttempt = Schema.Union([
|
|
199
|
+
RejectedBeforeDispatch,
|
|
200
|
+
Started,
|
|
201
|
+
RejectedByProvider,
|
|
202
|
+
Applied,
|
|
203
|
+
OutcomeUnknown
|
|
204
|
+
])
|
|
205
|
+
export type MutationAttempt = typeof MutationAttempt.Type
|
|
206
|
+
|
|
207
|
+
export const AuthorityGrantKind = Schema.Literals(["AnonymousAccess", "ScopedSecret", "WorkloadIdentity"])
|
|
208
|
+
export type AuthorityGrantKind = typeof AuthorityGrantKind.Type
|
|
209
|
+
|
|
210
|
+
class AuthorityAcquiredRecord
|
|
211
|
+
extends Schema.TaggedClass<AuthorityAcquiredRecord>()("AuthorityAcquired", {
|
|
212
|
+
subject: SubjectId,
|
|
213
|
+
provider: ProviderId,
|
|
214
|
+
audience: CanonicalAudience,
|
|
215
|
+
requestedPurpose: CredentialPurpose,
|
|
216
|
+
grantKind: AuthorityGrantKind,
|
|
217
|
+
purposes: Schema.NonEmptyArray(CredentialPurpose)
|
|
218
|
+
}) {}
|
|
219
|
+
|
|
220
|
+
const authorityAcquiredIssue = (value: AuthorityAcquiredRecord): string | undefined => {
|
|
221
|
+
const purposes = new Set(value.purposes)
|
|
222
|
+
if (purposes.size !== value.purposes.length) return "Acquired authority purposes must be unique."
|
|
223
|
+
if (!purposes.has(value.requestedPurpose)) {
|
|
224
|
+
return "Acquired authority must include the purpose requested when it was acquired."
|
|
225
|
+
}
|
|
226
|
+
if (value.grantKind === "AnonymousAccess" &&
|
|
227
|
+
(value.requestedPurpose !== "observe" || purposes.size !== 1 || !purposes.has("observe"))) {
|
|
228
|
+
return "Anonymous authority must be acquired for observation with exactly the observe purpose."
|
|
229
|
+
}
|
|
230
|
+
return undefined
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export const AuthorityAcquired = AuthorityAcquiredRecord.pipe(Schema.check(
|
|
234
|
+
Schema.makeFilter((value) => authorityAcquiredIssue(value))
|
|
235
|
+
))
|
|
236
|
+
export type AuthorityAcquired = typeof AuthorityAcquired.Type
|
|
237
|
+
|
|
238
|
+
const observationAuthorityIssue = (value: AuthorityAcquired): string | undefined =>
|
|
239
|
+
authorityAcquiredIssue(value) ??
|
|
240
|
+
(value.requestedPurpose === "observe" && value.purposes.includes("observe")
|
|
241
|
+
? undefined
|
|
242
|
+
: "Observation authority must be acquired for and include the observe purpose.")
|
|
243
|
+
|
|
244
|
+
const mutationAuthorityIssue = (value: AuthorityAcquired): string | undefined =>
|
|
245
|
+
authorityAcquiredIssue(value) ??
|
|
246
|
+
(value.requestedPurpose === "publish" || value.requestedPurpose === "correct"
|
|
247
|
+
? undefined
|
|
248
|
+
: "Mutation authority must be acquired for publish or correct.")
|
|
249
|
+
|
|
250
|
+
class AuthorityAcquiredButMutationNotDispatchedRecord
|
|
251
|
+
extends Schema.TaggedClass<AuthorityAcquiredButMutationNotDispatchedRecord>()(
|
|
252
|
+
"AuthorityAcquiredButMutationNotDispatched",
|
|
253
|
+
{
|
|
254
|
+
subject: SubjectId,
|
|
255
|
+
authority: AuthorityAcquired,
|
|
256
|
+
attempt: RejectedBeforeDispatch
|
|
257
|
+
}
|
|
258
|
+
) {}
|
|
259
|
+
|
|
260
|
+
const authorityNotDispatchedIssue = (
|
|
261
|
+
value: AuthorityAcquiredButMutationNotDispatchedRecord
|
|
262
|
+
): string | undefined => {
|
|
263
|
+
const mutationIssue = mutationAuthorityIssue(value.authority)
|
|
264
|
+
if (mutationIssue !== undefined) return mutationIssue
|
|
265
|
+
return value.subject === value.authority.subject && value.subject === value.attempt.subject
|
|
266
|
+
? undefined
|
|
267
|
+
: "Acquired authority and rejected attempt must describe the same subject."
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export const AuthorityAcquiredButMutationNotDispatched =
|
|
271
|
+
AuthorityAcquiredButMutationNotDispatchedRecord.pipe(Schema.check(
|
|
272
|
+
Schema.makeFilter((value) => authorityNotDispatchedIssue(value))
|
|
273
|
+
))
|
|
274
|
+
export type AuthorityAcquiredButMutationNotDispatched =
|
|
275
|
+
typeof AuthorityAcquiredButMutationNotDispatched.Type
|
|
276
|
+
|
|
277
|
+
export const AuthorityEvidence = Schema.Union([
|
|
278
|
+
AuthorityAcquired,
|
|
279
|
+
AuthorityAcquiredButMutationNotDispatched
|
|
280
|
+
])
|
|
281
|
+
export type AuthorityEvidence = typeof AuthorityEvidence.Type
|
|
282
|
+
|
|
283
|
+
export class DependencyBlocked
|
|
284
|
+
extends Schema.TaggedClass<DependencyBlocked>()("DependencyBlocked", {
|
|
285
|
+
prerequisite: SubjectId
|
|
286
|
+
}) {}
|
|
287
|
+
|
|
288
|
+
export class RunAborted
|
|
289
|
+
extends Schema.TaggedClass<RunAborted>()("RunAborted", {
|
|
290
|
+
cause: SafeReason
|
|
291
|
+
}) {}
|
|
292
|
+
|
|
293
|
+
export const NotReachedReason = Schema.Union([DependencyBlocked, RunAborted])
|
|
294
|
+
export type NotReachedReason = typeof NotReachedReason.Type
|
|
295
|
+
|
|
296
|
+
export class ConclusiveProviderRejection
|
|
297
|
+
extends Schema.TaggedClass<ConclusiveProviderRejection>()("ConclusiveProviderRejection", {
|
|
298
|
+
subject: SubjectId,
|
|
299
|
+
fact: ProviderRejectionFact,
|
|
300
|
+
postObservations: Schema.NonEmptyArray(Observation)
|
|
301
|
+
}) {}
|
|
302
|
+
|
|
303
|
+
export const BlockedSubjectCause = Schema.Union([
|
|
304
|
+
Conflict,
|
|
305
|
+
ProviderBlocked,
|
|
306
|
+
RejectedBeforeDispatch,
|
|
307
|
+
AuthorityAcquiredButMutationNotDispatched,
|
|
308
|
+
ConclusiveProviderRejection
|
|
309
|
+
])
|
|
310
|
+
export type BlockedSubjectCause = typeof BlockedSubjectCause.Type
|
|
311
|
+
|
|
312
|
+
class NotReachedRecord
|
|
313
|
+
extends Schema.TaggedClass<NotReachedRecord>()("NotReached", {
|
|
314
|
+
subject: SubjectId,
|
|
315
|
+
reason: NotReachedReason
|
|
316
|
+
}) {}
|
|
317
|
+
|
|
318
|
+
class AlreadyEquivalentRecord
|
|
319
|
+
extends Schema.TaggedClass<AlreadyEquivalentRecord>()("AlreadyEquivalent", {
|
|
320
|
+
subject: SubjectId,
|
|
321
|
+
observationAuthorities: Schema.Array(AuthorityAcquired),
|
|
322
|
+
observations: Schema.NonEmptyArray(Observation)
|
|
323
|
+
}) {}
|
|
324
|
+
|
|
325
|
+
class ConvergedAfterMutationRecord
|
|
326
|
+
extends Schema.TaggedClass<ConvergedAfterMutationRecord>()("ConvergedAfterMutation", {
|
|
327
|
+
subject: SubjectId,
|
|
328
|
+
observationAuthorities: Schema.Array(AuthorityAcquired),
|
|
329
|
+
preObservations: Schema.NonEmptyArray(Observation),
|
|
330
|
+
decision: MutationDecision,
|
|
331
|
+
authority: AuthorityAcquired,
|
|
332
|
+
attempt: Schema.Union([Applied, OutcomeUnknown, RejectedByProvider]),
|
|
333
|
+
postObservations: Schema.NonEmptyArray(Observation)
|
|
334
|
+
}) {}
|
|
335
|
+
|
|
336
|
+
class BlockedSubjectRecord
|
|
337
|
+
extends Schema.TaggedClass<BlockedSubjectRecord>()("BlockedSubject", {
|
|
338
|
+
subject: SubjectId,
|
|
339
|
+
observationAuthorities: Schema.Array(AuthorityAcquired),
|
|
340
|
+
observations: Schema.NonEmptyArray(Observation),
|
|
341
|
+
cause: BlockedSubjectCause
|
|
342
|
+
}) {}
|
|
343
|
+
|
|
344
|
+
class UncertainSubjectRecord
|
|
345
|
+
extends Schema.TaggedClass<UncertainSubjectRecord>()("UncertainSubject", {
|
|
346
|
+
subject: SubjectId,
|
|
347
|
+
observationAuthorities: Schema.Array(AuthorityAcquired),
|
|
348
|
+
observations: Schema.NonEmptyArray(Observation),
|
|
349
|
+
decision: Schema.optionalKey(ProviderDecision),
|
|
350
|
+
authority: AuthorityAcquired,
|
|
351
|
+
attempt: Schema.Union([Started, Applied, OutcomeUnknown, RejectedByProvider]),
|
|
352
|
+
trace: Schema.NonEmptyArray(Observation)
|
|
353
|
+
}) {}
|
|
354
|
+
|
|
355
|
+
export type NotReached = typeof NotReachedRecord.Type
|
|
356
|
+
export type AlreadyEquivalent = typeof AlreadyEquivalentRecord.Type
|
|
357
|
+
export type ConvergedAfterMutation = typeof ConvergedAfterMutationRecord.Type
|
|
358
|
+
export type BlockedSubject = typeof BlockedSubjectRecord.Type
|
|
359
|
+
export type UncertainSubject = typeof UncertainSubjectRecord.Type
|
|
360
|
+
|
|
361
|
+
const sameSubject = (
|
|
362
|
+
subject: SubjectId,
|
|
363
|
+
values: ReadonlyArray<{ readonly subject: SubjectId }>
|
|
364
|
+
): boolean => values.every((value) => value.subject === subject)
|
|
365
|
+
|
|
366
|
+
const observationAuthoritiesIssue = (
|
|
367
|
+
subject: SubjectId,
|
|
368
|
+
authorities: ReadonlyArray<AuthorityAcquired>
|
|
369
|
+
): string | undefined => {
|
|
370
|
+
if (!sameSubject(subject, authorities)) {
|
|
371
|
+
return "Observation authority must describe the report subject."
|
|
372
|
+
}
|
|
373
|
+
return authorities.map(observationAuthorityIssue).find((issue) => issue !== undefined)
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const subjectReportCorrelation = (
|
|
377
|
+
value: NotReached | AlreadyEquivalent | ConvergedAfterMutation | BlockedSubject | UncertainSubject
|
|
378
|
+
): string | undefined => {
|
|
379
|
+
switch (value._tag) {
|
|
380
|
+
case "NotReached":
|
|
381
|
+
return undefined
|
|
382
|
+
case "AlreadyEquivalent": {
|
|
383
|
+
const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
|
|
384
|
+
return observationIssue === undefined && sameSubject(value.subject, value.observations) &&
|
|
385
|
+
value.observations.at(-1)?._tag === "PresentEquivalent"
|
|
386
|
+
? undefined
|
|
387
|
+
: observationIssue ?? "AlreadyEquivalent requires same-subject observations ending in PresentEquivalent."
|
|
388
|
+
}
|
|
389
|
+
case "ConvergedAfterMutation": {
|
|
390
|
+
const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
|
|
391
|
+
const mutationIssue = mutationAuthorityIssue(value.authority)
|
|
392
|
+
return sameSubject(value.subject, [
|
|
393
|
+
...value.preObservations,
|
|
394
|
+
value.decision,
|
|
395
|
+
value.authority,
|
|
396
|
+
value.attempt,
|
|
397
|
+
...value.postObservations
|
|
398
|
+
]) && observationIssue === undefined && mutationIssue === undefined &&
|
|
399
|
+
value.postObservations.at(-1)?._tag === "PresentEquivalent"
|
|
400
|
+
? undefined
|
|
401
|
+
: observationIssue ?? mutationIssue ??
|
|
402
|
+
"ConvergedAfterMutation requires one subject and a final PresentEquivalent observation."
|
|
403
|
+
}
|
|
404
|
+
case "BlockedSubject": {
|
|
405
|
+
const nested = value.cause._tag === "ConclusiveProviderRejection"
|
|
406
|
+
? [value.cause, value.cause.fact, ...value.cause.postObservations]
|
|
407
|
+
: value.cause._tag === "AuthorityAcquiredButMutationNotDispatched"
|
|
408
|
+
? [value.cause, value.cause.authority, value.cause.attempt]
|
|
409
|
+
: value.cause._tag === "Conflict"
|
|
410
|
+
? [value.cause]
|
|
411
|
+
: [value.cause]
|
|
412
|
+
const evidenceIssue = value.cause._tag === "AuthorityAcquiredButMutationNotDispatched"
|
|
413
|
+
? authorityNotDispatchedIssue(value.cause)
|
|
414
|
+
: undefined
|
|
415
|
+
const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
|
|
416
|
+
return sameSubject(value.subject, [...value.observations, ...nested]) && evidenceIssue === undefined &&
|
|
417
|
+
observationIssue === undefined
|
|
418
|
+
? undefined
|
|
419
|
+
: observationIssue ?? evidenceIssue ?? "BlockedSubject evidence must describe the report subject."
|
|
420
|
+
}
|
|
421
|
+
case "UncertainSubject": {
|
|
422
|
+
const observationIssue = observationAuthoritiesIssue(value.subject, value.observationAuthorities)
|
|
423
|
+
const mutationIssue = mutationAuthorityIssue(value.authority)
|
|
424
|
+
return sameSubject(value.subject, [
|
|
425
|
+
...value.observations,
|
|
426
|
+
...(value.decision === undefined ? [] : [value.decision]),
|
|
427
|
+
value.authority,
|
|
428
|
+
value.attempt,
|
|
429
|
+
...value.trace
|
|
430
|
+
]) && observationIssue === undefined && mutationIssue === undefined
|
|
431
|
+
? undefined
|
|
432
|
+
: observationIssue ?? mutationIssue ?? "UncertainSubject evidence must describe the report subject."
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const SubjectReportVariants = Schema.Union([
|
|
438
|
+
NotReachedRecord,
|
|
439
|
+
AlreadyEquivalentRecord,
|
|
440
|
+
ConvergedAfterMutationRecord,
|
|
441
|
+
BlockedSubjectRecord,
|
|
442
|
+
UncertainSubjectRecord
|
|
443
|
+
])
|
|
444
|
+
|
|
445
|
+
export const SubjectReport = SubjectReportVariants.pipe(Schema.check(
|
|
446
|
+
Schema.makeFilter((value) => subjectReportCorrelation(value))
|
|
447
|
+
))
|
|
448
|
+
export type SubjectReport = typeof SubjectReport.Type
|
|
449
|
+
|
|
450
|
+
export class ReportConstructionError
|
|
451
|
+
extends Schema.TaggedErrorClass<ReportConstructionError>()("ReportConstructionError", {
|
|
452
|
+
reason: SafeReason
|
|
453
|
+
}) {}
|
|
454
|
+
|
|
455
|
+
const invalid = <A>(reason: SafeReason): Result.Result<A, ReportConstructionError> =>
|
|
456
|
+
Result.fail(new ReportConstructionError({ reason }))
|
|
457
|
+
|
|
458
|
+
const validateSubjectReport = <A extends SubjectReport>(value: A): Result.Result<A, ReportConstructionError> => {
|
|
459
|
+
const issue = subjectReportCorrelation(value)
|
|
460
|
+
return issue === undefined ? Result.succeed(value) : invalid(SafeReason.make(issue))
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
export const makeAuthorityAcquired = (input: {
|
|
464
|
+
readonly subject: SubjectId
|
|
465
|
+
readonly provider: ProviderId
|
|
466
|
+
readonly audience: CanonicalAudience
|
|
467
|
+
readonly requestedPurpose: CredentialPurpose
|
|
468
|
+
readonly grantKind: AuthorityGrantKind
|
|
469
|
+
readonly purposes: readonly [CredentialPurpose, ...Array<CredentialPurpose>]
|
|
470
|
+
}): Result.Result<AuthorityAcquired, ReportConstructionError> => {
|
|
471
|
+
const value = new AuthorityAcquiredRecord(input)
|
|
472
|
+
const issue = authorityAcquiredIssue(value)
|
|
473
|
+
return issue === undefined ? Result.succeed(value) : invalid(SafeReason.make(issue))
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export const makeAuthorityAcquiredButMutationNotDispatched = (input: {
|
|
477
|
+
readonly subject: SubjectId
|
|
478
|
+
readonly authority: AuthorityAcquired
|
|
479
|
+
readonly attempt: RejectedBeforeDispatch
|
|
480
|
+
}): Result.Result<AuthorityAcquiredButMutationNotDispatched, ReportConstructionError> => {
|
|
481
|
+
const value = new AuthorityAcquiredButMutationNotDispatchedRecord(input)
|
|
482
|
+
const issue = authorityAcquiredIssue(value.authority) ?? authorityNotDispatchedIssue(value)
|
|
483
|
+
return issue === undefined ? Result.succeed(value) : invalid(SafeReason.make(issue))
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
export const makeNotReached = (
|
|
487
|
+
subject: SubjectId,
|
|
488
|
+
reason: NotReachedReason
|
|
489
|
+
): Result.Result<NotReached, ReportConstructionError> =>
|
|
490
|
+
validateSubjectReport(new NotReachedRecord({ subject, reason }))
|
|
491
|
+
|
|
492
|
+
export const makeAlreadyEquivalent = (
|
|
493
|
+
subject: SubjectId,
|
|
494
|
+
observations: readonly [Observation, ...Array<Observation>],
|
|
495
|
+
observationAuthorities: ReadonlyArray<AuthorityAcquired>
|
|
496
|
+
): Result.Result<AlreadyEquivalent, ReportConstructionError> =>
|
|
497
|
+
validateSubjectReport(new AlreadyEquivalentRecord({ subject, observationAuthorities, observations }))
|
|
498
|
+
|
|
499
|
+
export const makeConvergedAfterMutation = (input: {
|
|
500
|
+
readonly subject: SubjectId
|
|
501
|
+
readonly observationAuthorities: ReadonlyArray<AuthorityAcquired>
|
|
502
|
+
readonly preObservations: readonly [Observation, ...Array<Observation>]
|
|
503
|
+
readonly decision: MutationDecision
|
|
504
|
+
readonly authority: AuthorityAcquired
|
|
505
|
+
readonly attempt: Applied | OutcomeUnknown | RejectedByProvider
|
|
506
|
+
readonly postObservations: readonly [Observation, ...Array<Observation>]
|
|
507
|
+
}): Result.Result<ConvergedAfterMutation, ReportConstructionError> =>
|
|
508
|
+
validateSubjectReport(new ConvergedAfterMutationRecord(input))
|
|
509
|
+
|
|
510
|
+
export const makeBlockedSubject = (input: {
|
|
511
|
+
readonly subject: SubjectId
|
|
512
|
+
readonly observationAuthorities: ReadonlyArray<AuthorityAcquired>
|
|
513
|
+
readonly observations: readonly [Observation, ...Array<Observation>]
|
|
514
|
+
readonly cause: BlockedSubjectCause
|
|
515
|
+
}): Result.Result<BlockedSubject, ReportConstructionError> =>
|
|
516
|
+
validateSubjectReport(new BlockedSubjectRecord(input))
|
|
517
|
+
|
|
518
|
+
export const makeUncertainSubject = (input: {
|
|
519
|
+
readonly subject: SubjectId
|
|
520
|
+
readonly observationAuthorities: ReadonlyArray<AuthorityAcquired>
|
|
521
|
+
readonly observations: readonly [Observation, ...Array<Observation>]
|
|
522
|
+
readonly decision?: ProviderDecision
|
|
523
|
+
readonly authority: AuthorityAcquired
|
|
524
|
+
readonly attempt: Started | Applied | OutcomeUnknown | RejectedByProvider
|
|
525
|
+
readonly trace: readonly [Observation, ...Array<Observation>]
|
|
526
|
+
}): Result.Result<UncertainSubject, ReportConstructionError> =>
|
|
527
|
+
validateSubjectReport(new UncertainSubjectRecord(input))
|
|
528
|
+
|
|
529
|
+
export const ReleaseStatus = Schema.Literals(["complete", "blocked", "uncertain"])
|
|
530
|
+
export type ReleaseStatus = typeof ReleaseStatus.Type
|
|
531
|
+
|
|
532
|
+
const deriveReleaseStatus = (
|
|
533
|
+
subjects: readonly [SubjectReport, ...Array<SubjectReport>]
|
|
534
|
+
): ReleaseStatus => subjects.some((subject) => subject._tag === "UncertainSubject")
|
|
535
|
+
? "uncertain"
|
|
536
|
+
: subjects.every((subject) => subject._tag === "AlreadyEquivalent" || subject._tag === "ConvergedAfterMutation")
|
|
537
|
+
? "complete"
|
|
538
|
+
: "blocked"
|
|
539
|
+
|
|
540
|
+
const ReleaseReportRecord = Schema.Struct({
|
|
541
|
+
subjects: Schema.NonEmptyArray(SubjectReport),
|
|
542
|
+
status: ReleaseStatus
|
|
543
|
+
}).pipe(Schema.check(Schema.makeFilter((value) =>
|
|
544
|
+
value.status === deriveReleaseStatus(value.subjects)
|
|
545
|
+
? undefined
|
|
546
|
+
: "ReleaseReport status must be derived from its subjects.")))
|
|
547
|
+
|
|
548
|
+
export const ReleaseReport = ReleaseReportRecord
|
|
549
|
+
export type ReleaseReport = typeof ReleaseReport.Type
|
|
550
|
+
|
|
551
|
+
export const makeReleaseReport = (
|
|
552
|
+
subjects: readonly [SubjectReport, ...Array<SubjectReport>]
|
|
553
|
+
): ReleaseReport => ({ subjects, status: deriveReleaseStatus(subjects) })
|
|
554
|
+
|
|
555
|
+
class ReadOnlyEquivalent
|
|
556
|
+
extends Schema.TaggedClass<ReadOnlyEquivalent>()("Equivalent", {}) {}
|
|
557
|
+
|
|
558
|
+
class ReadOnlyDifferent
|
|
559
|
+
extends Schema.TaggedClass<ReadOnlyDifferent>()("Different", {
|
|
560
|
+
differences: Schema.NonEmptyArray(Difference)
|
|
561
|
+
}) {}
|
|
562
|
+
|
|
563
|
+
class ReadOnlyAbsent
|
|
564
|
+
extends Schema.TaggedClass<ReadOnlyAbsent>()("Absent", {
|
|
565
|
+
basis: AbsenceBasis
|
|
566
|
+
}) {}
|
|
567
|
+
|
|
568
|
+
class ReadOnlyInconclusive
|
|
569
|
+
extends Schema.TaggedClass<ReadOnlyInconclusive>()("Inconclusive", {
|
|
570
|
+
reason: SafeReason,
|
|
571
|
+
cause: Schema.optionalKey(CredentialFailureCause)
|
|
572
|
+
}) {}
|
|
573
|
+
|
|
574
|
+
export const ObservationClassification = Schema.Union([
|
|
575
|
+
ReadOnlyEquivalent,
|
|
576
|
+
ReadOnlyDifferent,
|
|
577
|
+
ReadOnlyAbsent,
|
|
578
|
+
ReadOnlyInconclusive
|
|
579
|
+
])
|
|
580
|
+
export type ObservationClassification = typeof ObservationClassification.Type
|
|
581
|
+
|
|
582
|
+
export const equivalentObservation = (): ObservationClassification => new ReadOnlyEquivalent()
|
|
583
|
+
export const differentObservation = (
|
|
584
|
+
differences: readonly [Difference, ...Array<Difference>]
|
|
585
|
+
): ObservationClassification => new ReadOnlyDifferent({ differences })
|
|
586
|
+
export const absentObservation = (basis: AbsenceBasis): ObservationClassification =>
|
|
587
|
+
new ReadOnlyAbsent({ basis })
|
|
588
|
+
export const inconclusiveObservation = (
|
|
589
|
+
reason: SafeReason,
|
|
590
|
+
cause?: CredentialFailureCause
|
|
591
|
+
): ObservationClassification => new ReadOnlyInconclusive({
|
|
592
|
+
reason,
|
|
593
|
+
...(cause === undefined ? {} : { cause })
|
|
594
|
+
})
|
|
595
|
+
|
|
596
|
+
export class ObservedSubject extends Schema.Class<ObservedSubject>("ObservedSubject")({
|
|
597
|
+
subject: SubjectId,
|
|
598
|
+
observationAuthorities: Schema.Array(AuthorityAcquired),
|
|
599
|
+
observation: ObservationClassification
|
|
600
|
+
}) {}
|
|
601
|
+
|
|
602
|
+
export const ObservationStatus = Schema.Literals(["equivalent", "different", "inconclusive"])
|
|
603
|
+
export type ObservationStatus = typeof ObservationStatus.Type
|
|
604
|
+
|
|
605
|
+
const deriveObservationStatus = (
|
|
606
|
+
subjects: readonly [ObservedSubject, ...Array<ObservedSubject>]
|
|
607
|
+
): ObservationStatus => subjects.some(({ observation }) => observation._tag === "Inconclusive")
|
|
608
|
+
? "inconclusive"
|
|
609
|
+
: subjects.every(({ observation }) => observation._tag === "Equivalent")
|
|
610
|
+
? "equivalent"
|
|
611
|
+
: "different"
|
|
612
|
+
|
|
613
|
+
const observedSubjectIssue = (value: ObservedSubject): string | undefined =>
|
|
614
|
+
observationAuthoritiesIssue(value.subject, value.observationAuthorities)
|
|
615
|
+
|
|
616
|
+
export const ObservationReport = Schema.Struct({
|
|
617
|
+
subjects: Schema.NonEmptyArray(ObservedSubject),
|
|
618
|
+
status: ObservationStatus
|
|
619
|
+
}).pipe(Schema.check(Schema.makeFilter((value) =>
|
|
620
|
+
value.subjects.map(observedSubjectIssue).find((issue) => issue !== undefined) ??
|
|
621
|
+
(value.status === deriveObservationStatus(value.subjects)
|
|
622
|
+
? undefined
|
|
623
|
+
: "ObservationReport status must be derived from its subjects."))))
|
|
624
|
+
export type ObservationReport = typeof ObservationReport.Type
|
|
625
|
+
|
|
626
|
+
export const makeObservationReport = (
|
|
627
|
+
subjects: readonly [ObservedSubject, ...Array<ObservedSubject>]
|
|
628
|
+
): ObservationReport => ({ subjects, status: deriveObservationStatus(subjects) })
|