@astrale-os/sdk 0.6.0-beta.23 → 0.6.0-beta.24
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 +30 -36
- package/dist/application/define.d.ts +3 -1
- package/dist/application/define.js +16 -2
- package/dist/application/domain.d.ts +3 -1
- package/dist/application/index.d.ts +1 -1
- package/dist/application/mutation/index.d.ts +1 -1
- package/dist/application/query/composite/plan.d.ts +0 -4
- package/dist/application/query/composite/plan.js +0 -2
- package/dist/application/view/define.js +4 -6
- package/dist/application/view/frontend.d.ts +2 -2
- package/dist/application/view/index.d.ts +1 -1
- package/dist/application/view/route.d.ts +0 -14
- package/dist/application/view/route.js +1 -64
- package/dist/deployment/adapter/adapter.d.ts +3 -20
- package/dist/deployment/adapter/bundle/file.d.ts +1 -1
- package/dist/deployment/adapter/define.d.ts +4 -25
- package/dist/deployment/adapter/define.js +12 -44
- package/dist/deployment/adapter/index.d.ts +0 -2
- package/dist/deployment/adapter/release/list.d.ts +1 -2
- package/dist/deployment/address/summary.d.ts +3 -7
- package/dist/deployment/authoring.d.ts +0 -2
- package/dist/deployment/authoring.js +0 -1
- package/dist/deployment/build/build.d.ts +6 -0
- package/dist/deployment/build/compile.js +2 -0
- package/dist/deployment/build/frontend/compilation.d.ts +2 -4
- package/dist/deployment/build/frontend/compilation.js +0 -5
- package/dist/deployment/build/frontend/digest.js +1 -5
- package/dist/deployment/build/material.d.ts +2 -2
- package/dist/deployment/build/material.js +28 -13
- package/dist/deployment/deployment.d.ts +4 -8
- package/dist/deployment/index.d.ts +3 -5
- package/dist/deployment/index.js +1 -2
- package/dist/deployment/release/addressing.d.ts +2 -9
- package/dist/deployment/release/addressing.js +2 -3
- package/dist/deployment/release/index.d.ts +0 -2
- package/dist/deployment/release/index.js +0 -2
- package/dist/deployment/release/release.d.ts +1 -1
- package/dist/deployment/release/runtime.d.ts +0 -2
- package/dist/deployment/release/runtime.js +0 -2
- package/dist/deployment/release/served/index.d.ts +1 -2
- package/dist/deployment/release/served/index.js +7 -3
- package/dist/deployment/release/served/views.js +0 -1
- package/dist/deployment/verify/index.d.ts +2 -4
- package/dist/deployment/verify/index.js +1 -3
- package/dist/deployment/verify/preflight/index.d.ts +0 -12
- package/dist/deployment/verify/preflight/index.js +0 -12
- package/dist/deployment/verify/readiness/index.d.ts +2 -6
- package/dist/deployment/verify/readiness/index.js +3 -12
- package/dist/deployment/worker/response.d.ts +1 -4
- package/dist/deployment/worker/response.js +2 -8
- package/dist/execution/identity/delivery.d.ts +2 -7
- package/dist/execution/identity/delivery.js +1 -23
- package/dist/execution/identity/identity.d.ts +2 -3
- package/dist/execution/index.d.ts +1 -3
- package/dist/execution/index.js +1 -2
- package/dist/execution/invocation/admission/authority.d.ts +4 -5
- package/dist/execution/invocation/admission/authority.js +1 -2
- package/dist/execution/invocation/index.d.ts +2 -2
- package/dist/execution/invocation/index.js +1 -1
- package/dist/execution/invocation/invocation.js +3 -12
- package/dist/execution/invocation/result/errors.d.ts +0 -10
- package/dist/execution/invocation/result/errors.js +0 -17
- package/dist/execution/invocation/result/index.d.ts +2 -2
- package/dist/execution/invocation/result/index.js +1 -1
- package/dist/execution/runtime/release.d.ts +6 -11
- package/dist/execution/runtime/release.js +2 -9
- package/dist/execution/service/create.js +3 -1
- package/dist/execution/service/service.d.ts +2 -3
- package/dist/execution/service/serving/delivery.d.ts +1 -2
- package/dist/execution/service/serving/delivery.js +1 -2
- package/dist/execution/service/serving/source.d.ts +3 -10
- package/dist/execution/service/serving/source.js +1 -5
- package/dist/execution/workflows/index.d.ts +1 -1
- package/dist/execution/workflows/index.js +1 -1
- package/dist/execution/workflows/options.d.ts +0 -6
- package/dist/execution/workflows/options.js +0 -18
- package/dist/execution/workflows/receiver.d.ts +1 -2
- package/dist/execution/workflows/receiver.js +13 -20
- package/dist/execution/workflows/route.d.ts +1 -3
- package/dist/execution/workflows/route.js +4 -9
- package/dist/execution/workflows/run.d.ts +1 -1
- package/dist/execution/workflows/run.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/platform/graph/alias.d.ts +1 -5
- package/dist/platform/graph/alias.js +1 -5
- package/dist/platform/graph/document/index.d.ts +1 -1
- package/dist/platform/graph/document/index.js +1 -1
- package/dist/platform/graph/index.d.ts +1 -1
- package/dist/platform/graph/index.js +1 -1
- package/dist/platform/release/index.d.ts +1 -26
- package/dist/platform/release/index.js +1 -26
- package/dist/platform/schema/class-icon-svg.d.ts +9 -0
- package/dist/platform/schema/class-icon-svg.js +29 -0
- package/dist/platform/schema/class-icon.d.ts +3 -8
- package/dist/platform/schema/class-icon.js +2 -29
- package/dist/platform/schema/index.d.ts +1 -1
- package/dist/platform/schema/schema-authoring.d.ts +14 -7
- package/dist/platform/schema/schema-authoring.js +5 -1
- package/dist/project/admit.js +0 -4
- package/dist/project/install-command.d.ts +0 -4
- package/dist/project/install-command.js +1 -5
- package/dist/tooling/cli/deploy-mode.d.ts +3 -59
- package/dist/tooling/cli/deploy-mode.js +46 -122
- package/dist/tooling/cli/deploy-result.d.ts +10 -15
- package/dist/tooling/cli/help.js +9 -16
- package/dist/tooling/cli/immutable-deployment.d.ts +3 -3
- package/dist/tooling/cli/index.d.ts +1 -1
- package/dist/tooling/cli/list.d.ts +5 -7
- package/dist/tooling/cli/list.js +9 -61
- package/dist/tooling/cli/orchestrate.js +6 -16
- package/dist/tooling/cli/publish/index.d.ts +2 -2
- package/dist/tooling/cli/registry/client.js +1 -1
- package/dist/tooling/cli/secrets.d.ts +2 -2
- package/dist/tooling/linter/implementations/source/global.js +0 -1
- package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
- package/dist/tooling/linter/policy/generated.js +2 -51
- package/dist/tooling/linter/requirements/registry.js +0 -6
- package/package.json +6 -6
- package/dist/application/query/execution/projection.d.ts +0 -3
- package/dist/application/query/execution/projection.js +0 -3
- package/dist/deployment/adapter/legacy/adapter.d.ts +0 -40
- package/dist/deployment/adapter/legacy/adapter.js +0 -1
- package/dist/deployment/adapter/legacy/deploy/context.d.ts +0 -19
- package/dist/deployment/adapter/legacy/deploy/context.js +0 -1
- package/dist/deployment/adapter/legacy/deploy/index.d.ts +0 -2
- package/dist/deployment/adapter/legacy/deploy/index.js +0 -1
- package/dist/deployment/adapter/legacy/deploy/result.d.ts +0 -89
- package/dist/deployment/adapter/legacy/deploy/result.js +0 -1
- package/dist/deployment/adapter/legacy/index.d.ts +0 -24
- package/dist/deployment/adapter/legacy/index.js +0 -1
- package/dist/deployment/adapter/legacy/prepare/artifact.d.ts +0 -43
- package/dist/deployment/adapter/legacy/prepare/artifact.js +0 -1
- package/dist/deployment/adapter/legacy/prepare/context.d.ts +0 -33
- package/dist/deployment/adapter/legacy/prepare/context.js +0 -1
- package/dist/deployment/adapter/legacy/prepare/index.d.ts +0 -2
- package/dist/deployment/adapter/legacy/prepare/index.js +0 -1
- package/dist/deployment/deploy.d.ts +0 -20
- package/dist/deployment/deploy.js +0 -31
- package/dist/deployment/release/legacy/admission.d.ts +0 -3
- package/dist/deployment/release/legacy/admission.js +0 -8
- package/dist/deployment/release/legacy/assemble.d.ts +0 -5
- package/dist/deployment/release/legacy/assemble.js +0 -20
- package/dist/deployment/release/legacy/index.d.ts +0 -35
- package/dist/deployment/release/legacy/index.js +0 -34
- package/dist/deployment/release/legacy/release.d.ts +0 -12
- package/dist/deployment/release/legacy/release.js +0 -1
- package/dist/deployment/release/legacy/seal.d.ts +0 -10
- package/dist/deployment/release/legacy/seal.js +0 -17
- package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
- package/dist/deployment/verify/preflight/artifact.js +0 -122
- package/dist/deployment/verify/preflight/publication.d.ts +0 -4
- package/dist/deployment/verify/preflight/publication.js +0 -15
- package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
- package/dist/deployment/verify/readiness/deployment.js +0 -143
- package/dist/deployment/verify/readiness/legacy/index.d.ts +0 -2
- package/dist/deployment/verify/readiness/legacy/index.js +0 -2
- package/dist/deployment/verify/readiness/legacy/publication.d.ts +0 -12
- package/dist/deployment/verify/readiness/legacy/publication.js +0 -23
- package/dist/execution/service/errors.d.ts +0 -3
- package/dist/execution/service/errors.js +0 -3
- package/dist/execution/service/serving/legacy/index.d.ts +0 -15
- package/dist/execution/service/serving/legacy/index.js +0 -19
- package/dist/tooling/cli/deprecations.d.ts +0 -9
- package/dist/tooling/cli/deprecations.js +0 -15
- package/dist/tooling/cli/legacy/deploy-result.d.ts +0 -28
- package/dist/tooling/cli/legacy/deploy-result.js +0 -37
- package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +0 -21
- package/dist/tooling/cli/legacy/stable-target-adapter.js +0 -14
- package/dist/tooling/cli/legacy/stable-target-deploy.d.ts +0 -40
- package/dist/tooling/cli/legacy/stable-target-deploy.js +0 -102
- package/dist/tooling/cli/legacy/uploaded-build.d.ts +0 -11
- package/dist/tooling/cli/legacy/uploaded-build.js +0 -22
- package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
- package/dist/tooling/linter/implementations/source/migrations.js +0 -113
- package/dist/tooling/linter/qualification/index.d.ts +0 -10
- package/dist/tooling/linter/qualification/index.js +0 -2
- package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
- package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
- package/dist/tooling/linter/qualification/runner.d.ts +0 -3
- package/dist/tooling/linter/qualification/runner.js +0 -6
|
@@ -1,27 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical `DomainRelease` v4 wire contract and admission owned by the Astrale platform: the
|
|
3
|
-
* document a deployment serves at `release.json`, its release digest and `ReleaseRef`.
|
|
4
|
-
*/
|
|
1
|
+
/** Canonical DomainRelease v4 and Delivery v2 wire contracts. */
|
|
5
2
|
export * from '@astrale-os/kernel-protocol/release';
|
|
6
|
-
/**
|
|
7
|
-
* The Kernel's Publication v2/v3 codec (`@astrale-os/kernel-protocol/release/legacy`): `accept`,
|
|
8
|
-
* `seal`, `encode`, `url`/`PATH`, the bundle helpers, `PublicationError` and Delivery v1, which
|
|
9
|
-
* stable targets and pre-v4 Kernels still serve and read.
|
|
10
|
-
*
|
|
11
|
-
* @deprecated Read and seal `DomainRelease` v4 with this module's root exports.
|
|
12
|
-
*
|
|
13
|
-
* Short-term consumers, which took it from the removed `@astrale-os/sdk/publication`:
|
|
14
|
-
* - cli `src/lib/domain-publication.ts` and its test (C1a: `accept`, `PATH`, `PublicationError`);
|
|
15
|
-
* - admin `domain/providers/http-publication/resolver.ts`,
|
|
16
|
-
* `domain/providers/remote-kernel/instance-gateway.ts`,
|
|
17
|
-
* `domain/providers/scaleway/machine-provider.ts`, `domain/scripts/admin-bootstrap/cli.ts`,
|
|
18
|
-
* `domain/scripts/e2e/install-domain-set.ts`, their tests and two `worker/src` tests, which also
|
|
19
|
-
* seal v2/v3 fixtures (A10a);
|
|
20
|
-
* - domains issues `tests/deployment/archived-errors.test.ts` (SV16).
|
|
21
|
-
*
|
|
22
|
-
* Removal, in a breaking SDK release: once those consumers no longer import it (the CLI and Admin
|
|
23
|
-
* read `release.json`), at the latest with the Kernel folder it re-exports, which the Kernel
|
|
24
|
-
* removes once no supported Kernel predates v4, no installation pins a v2/v3 document and no
|
|
25
|
-
* stable Worker serves one (D10).
|
|
26
|
-
*/
|
|
27
|
-
export { legacy } from '@astrale-os/kernel-protocol/release';
|
|
@@ -1,27 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical `DomainRelease` v4 wire contract and admission owned by the Astrale platform: the
|
|
3
|
-
* document a deployment serves at `release.json`, its release digest and `ReleaseRef`.
|
|
4
|
-
*/
|
|
1
|
+
/** Canonical DomainRelease v4 and Delivery v2 wire contracts. */
|
|
5
2
|
export * from '@astrale-os/kernel-protocol/release';
|
|
6
|
-
/**
|
|
7
|
-
* The Kernel's Publication v2/v3 codec (`@astrale-os/kernel-protocol/release/legacy`): `accept`,
|
|
8
|
-
* `seal`, `encode`, `url`/`PATH`, the bundle helpers, `PublicationError` and Delivery v1, which
|
|
9
|
-
* stable targets and pre-v4 Kernels still serve and read.
|
|
10
|
-
*
|
|
11
|
-
* @deprecated Read and seal `DomainRelease` v4 with this module's root exports.
|
|
12
|
-
*
|
|
13
|
-
* Short-term consumers, which took it from the removed `@astrale-os/sdk/publication`:
|
|
14
|
-
* - cli `src/lib/domain-publication.ts` and its test (C1a: `accept`, `PATH`, `PublicationError`);
|
|
15
|
-
* - admin `domain/providers/http-publication/resolver.ts`,
|
|
16
|
-
* `domain/providers/remote-kernel/instance-gateway.ts`,
|
|
17
|
-
* `domain/providers/scaleway/machine-provider.ts`, `domain/scripts/admin-bootstrap/cli.ts`,
|
|
18
|
-
* `domain/scripts/e2e/install-domain-set.ts`, their tests and two `worker/src` tests, which also
|
|
19
|
-
* seal v2/v3 fixtures (A10a);
|
|
20
|
-
* - domains issues `tests/deployment/archived-errors.test.ts` (SV16).
|
|
21
|
-
*
|
|
22
|
-
* Removal, in a breaking SDK release: once those consumers no longer import it (the CLI and Admin
|
|
23
|
-
* read `release.json`), at the latest with the Kernel folder it re-exports, which the Kernel
|
|
24
|
-
* removes once no supported Kernel predates v4, no installation pins a v2/v3 document and no
|
|
25
|
-
* stable Worker serves one (D10).
|
|
26
|
-
*/
|
|
27
|
-
export { legacy } from '@astrale-os/kernel-protocol/release';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare const CLASS_ICON: unique symbol;
|
|
2
|
+
/** An admitted, self-contained SVG suitable for a Node Class presentation icon. */
|
|
3
|
+
export type ClassIcon = string & {
|
|
4
|
+
readonly [CLASS_ICON]: true;
|
|
5
|
+
};
|
|
6
|
+
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
7
|
+
export declare const NEUTRAL_CLASS_ICON_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"></svg>";
|
|
8
|
+
export declare function admitClassIconSvg(source: string): ClassIcon;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const MAX_CLASS_ICON_LENGTH = 8_000;
|
|
2
|
+
const SVG_ROOT = /^<svg(?:\s[^>]*)?>[\s\S]*<\/svg>$/u;
|
|
3
|
+
const SVG_ROOT_OPEN = /<svg(?:\s|>)/gu;
|
|
4
|
+
const SVG_ROOT_CLOSE = /<\/svg\s*>/gu;
|
|
5
|
+
const SVG_GRAPHIC = /<(?:circle|ellipse|line|path|polygon|polyline|rect)\b/iu;
|
|
6
|
+
const UNSAFE_SVG = /<\s*(?:animate|discard|embed|foreignObject|iframe|image|object|script|set|style|use)\b|<!DOCTYPE\b|<!ENTITY\b|\son[a-z][\w:.-]*\s*=|(?:href|xlink:href)\s*=|javascript\s*:|url\s*\(/iu;
|
|
7
|
+
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
8
|
+
export const NEUTRAL_CLASS_ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>';
|
|
9
|
+
export function admitClassIconSvg(source) {
|
|
10
|
+
if (typeof source !== 'string') {
|
|
11
|
+
throw new TypeError('Class icon must be an inline SVG string.');
|
|
12
|
+
}
|
|
13
|
+
const value = source.trim();
|
|
14
|
+
if (Array.from(value).length > MAX_CLASS_ICON_LENGTH) {
|
|
15
|
+
throw new TypeError(`Class icon must contain at most ${MAX_CLASS_ICON_LENGTH} characters.`);
|
|
16
|
+
}
|
|
17
|
+
if (!SVG_ROOT.test(value) ||
|
|
18
|
+
(value.match(SVG_ROOT_OPEN)?.length ?? 0) !== 1 ||
|
|
19
|
+
(value.match(SVG_ROOT_CLOSE)?.length ?? 0) !== 1) {
|
|
20
|
+
throw new TypeError('Class icon must be one complete inline <svg> element.');
|
|
21
|
+
}
|
|
22
|
+
if (UNSAFE_SVG.test(value)) {
|
|
23
|
+
throw new TypeError('Class icon SVG must be self-contained and contain no executable content.');
|
|
24
|
+
}
|
|
25
|
+
if (value !== NEUTRAL_CLASS_ICON_SVG && !SVG_GRAPHIC.test(value)) {
|
|
26
|
+
throw new TypeError('Class icon SVG must contain a visible vector element.');
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import type { LucideIconData } from '@lucide/icons';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
readonly [CLASS_ICON]: true;
|
|
6
|
-
};
|
|
7
|
-
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
8
|
-
export declare const NEUTRAL_CLASS_ICON_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"></svg>";
|
|
2
|
+
import type { ClassIcon } from './class-icon-svg.js';
|
|
3
|
+
export type { ClassIcon } from './class-icon-svg.js';
|
|
4
|
+
export { NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
|
|
9
5
|
/** Framework-neutral constructors for canonical Node Class icons. */
|
|
10
6
|
export declare const classIcon: Readonly<{
|
|
11
7
|
readonly neutral: ClassIcon;
|
|
12
8
|
svg(source: string): ClassIcon;
|
|
13
9
|
lucide(icon: LucideIconData): ClassIcon;
|
|
14
10
|
}>;
|
|
15
|
-
export {};
|
|
@@ -1,33 +1,6 @@
|
|
|
1
1
|
import { buildLucideSvg } from '@lucide/icons/build';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const SVG_ROOT_OPEN = /<svg(?:\s|>)/gu;
|
|
5
|
-
const SVG_ROOT_CLOSE = /<\/svg\s*>/gu;
|
|
6
|
-
const SVG_GRAPHIC = /<(?:circle|ellipse|line|path|polygon|polyline|rect)\b/iu;
|
|
7
|
-
const UNSAFE_SVG = /<\s*(?:animate|discard|embed|foreignObject|iframe|image|object|script|set|style|use)\b|<!DOCTYPE\b|<!ENTITY\b|\son[a-z][\w:.-]*\s*=|(?:href|xlink:href)\s*=|javascript\s*:|url\s*\(/iu;
|
|
8
|
-
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
9
|
-
export const NEUTRAL_CLASS_ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>';
|
|
10
|
-
function svg(source) {
|
|
11
|
-
if (typeof source !== 'string') {
|
|
12
|
-
throw new TypeError('Class icon must be an inline SVG string.');
|
|
13
|
-
}
|
|
14
|
-
const value = source.trim();
|
|
15
|
-
if (Array.from(value).length > MAX_CLASS_ICON_LENGTH) {
|
|
16
|
-
throw new TypeError(`Class icon must contain at most ${MAX_CLASS_ICON_LENGTH} characters.`);
|
|
17
|
-
}
|
|
18
|
-
if (!SVG_ROOT.test(value) ||
|
|
19
|
-
(value.match(SVG_ROOT_OPEN)?.length ?? 0) !== 1 ||
|
|
20
|
-
(value.match(SVG_ROOT_CLOSE)?.length ?? 0) !== 1) {
|
|
21
|
-
throw new TypeError('Class icon must be one complete inline <svg> element.');
|
|
22
|
-
}
|
|
23
|
-
if (UNSAFE_SVG.test(value)) {
|
|
24
|
-
throw new TypeError('Class icon SVG must be self-contained and contain no executable content.');
|
|
25
|
-
}
|
|
26
|
-
if (value !== NEUTRAL_CLASS_ICON_SVG && !SVG_GRAPHIC.test(value)) {
|
|
27
|
-
throw new TypeError('Class icon SVG must contain a visible vector element.');
|
|
28
|
-
}
|
|
29
|
-
return value;
|
|
30
|
-
}
|
|
2
|
+
import { admitClassIconSvg as svg, NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
|
|
3
|
+
export { NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
|
|
31
4
|
function lucide(icon) {
|
|
32
5
|
let source;
|
|
33
6
|
try {
|
|
@@ -16,7 +16,7 @@ export type { ClassIcon } from './class-icon.js';
|
|
|
16
16
|
export type { StoredPropertyInputOf } from './property-input.js';
|
|
17
17
|
export type { CallablePolicyBuilder, CallablePolicyContext, CallableProjection, AuthoredMethodProjection, AuthoredPropertyProjection, ClassIdentityProjection, ClassOwnerProjection, CoreEdge, CoreEndpoint, CoreNode, DefinedSchema, DirectedEdgeClass, ClassReferenceProjection, ClassProjection, FunctionProjection, EdgeClass, Function, Method, MethodProjection, Lazy, NodeClass, Policy, PolicyExistsContext, PolicyNodeBinder, PolicyPatternContext, Property, PropertyProjection, ResolvedDomainOfInput, View, } from '@astrale-os/kernel-dsl/v1/builder';
|
|
18
18
|
export type { Array, Object, Value } from '@astrale-os/kernel-dsl/value';
|
|
19
|
-
export type { CallableExecution, ClassKind, DirectedEdgeContract, EdgeClassPolicies, NodeClassDefinition, PolicyCheckObject, PolicyObjectRef, PropertyFacet, StateTopology, UndirectedEdgeContract, } from '@astrale-os/kernel-dsl/v1/language';
|
|
19
|
+
export type { CallableExecution, ClassKind, DirectedEdgeContract, EdgeClassPolicies, NodeClassDefinition, PolicyCheckObject, PolicyObjectRef, PropertyFacet, PropertyImmutability, StateTopology, UndirectedEdgeContract, } from '@astrale-os/kernel-dsl/v1/language';
|
|
20
20
|
export type { DomainSchema } from '@astrale-os/kernel-dsl/v1/schema';
|
|
21
21
|
/** Kernel-owned Schema values used by authored product Schemas and graph operations. */
|
|
22
22
|
export { AuthorityOperationOrder, AuthorityOperations, AuthorityRelations, KernelRootFunctions, OperationCore, operationOf, } from '@astrale-os/kernel-core/schema';
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type { DefinedSchema, ResolvedDomainOfInput } from '@astrale-os/kernel-dsl/v1/builder';
|
|
1
|
+
import type { DefinedSchema, EntrypointOf, ResolvedDomainOfInput, SchemaInput } from '@astrale-os/kernel-dsl/v1/builder';
|
|
2
2
|
import type { DomainSchema } from '@astrale-os/kernel-dsl/v1/schema';
|
|
3
|
-
|
|
4
|
-
type DomainSchemaInput = Parameters<typeof kernelDefineSchema>[1];
|
|
3
|
+
type DomainSchemaInput = SchemaInput;
|
|
5
4
|
declare const authoredGraph: unique symbol;
|
|
6
|
-
/**
|
|
5
|
+
/** Resolved Schemas retain their witness; authored Schemas retain input and dependency edges. */
|
|
7
6
|
type Entry = readonly [origin: string, schema: DomainSchema] | readonly [
|
|
8
7
|
origin: string,
|
|
9
8
|
input: DomainSchemaInput,
|
|
@@ -34,7 +33,7 @@ type InputOf<Origin extends string, Graph extends Entry> = Extract<Graph, readon
|
|
|
34
33
|
readonly [Alias in keyof Dependencies]: SchemaOf<Dependencies[Alias], Graph>;
|
|
35
34
|
};
|
|
36
35
|
} : never;
|
|
37
|
-
type SchemaOf<Origin extends string, Graph extends Entry> = Extract<Graph, readonly [Origin, DomainSchema]> extends infer
|
|
36
|
+
type SchemaOf<Origin extends string, Graph extends Entry> = Extract<Graph, readonly [Origin, DomainSchema]> extends infer Resolved ? [Resolved] extends [never] ? AuthoredSchema<Origin, Graph> : Resolved extends readonly [string, infer Schema extends DomainSchema] ? Schema : never : never;
|
|
38
37
|
/** Resolve a dependency graph without expanding a shared Schema at each dependency edge. */
|
|
39
38
|
export interface AuthoredDomain<Origin extends string, Graph extends Entry> extends ResolvedDomainOfInput<Origin, InputOf<Origin, Graph>> {
|
|
40
39
|
}
|
|
@@ -42,7 +41,15 @@ export interface AuthoredDomain<Origin extends string, Graph extends Entry> exte
|
|
|
42
41
|
export interface AuthoredSchema<Origin extends string, Graph extends Entry> extends DefinedSchema<Origin, AuthoredDomain<Origin, Graph>> {
|
|
43
42
|
readonly [authoredGraph]?: Graph;
|
|
44
43
|
}
|
|
45
|
-
type DefineSchema = <const Origin extends string, const Input extends DomainSchemaInput
|
|
46
|
-
|
|
44
|
+
type DefineSchema = <const Origin extends string, const Input extends DomainSchemaInput & {
|
|
45
|
+
readonly name: string;
|
|
46
|
+
}>(origin: Origin, input: Input & {
|
|
47
|
+
readonly entrypoint?: EntrypointOf<Input>;
|
|
48
|
+
}) => string extends Origin | Extract<Dependencies<Input>[keyof Dependencies<Input>], DomainSchema>['origin'] ? DefinedSchema<Origin, ResolvedDomainOfInput<Origin, Input>> : AuthoredSchema<Origin, Extract<UniqueEntries<GraphOfInput<Origin, Input>>, Entry>>;
|
|
49
|
+
/**
|
|
50
|
+
* The canonical implementation with a portable, automatically inferred declaration. Its type
|
|
51
|
+
* requires the Domain `name`, which the Kernel requires to install a new revision; `defineDomain`
|
|
52
|
+
* refuses an unnamed root Schema at runtime. `entrypoint` names one of the declared Views.
|
|
53
|
+
*/
|
|
47
54
|
export declare const defineSchema: DefineSchema;
|
|
48
55
|
export {};
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { defineSchema as kernelDefineSchema } from '@astrale-os/kernel-dsl/v1';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* The canonical implementation with a portable, automatically inferred declaration. Its type
|
|
4
|
+
* requires the Domain `name`, which the Kernel requires to install a new revision; `defineDomain`
|
|
5
|
+
* refuses an unnamed root Schema at runtime. `entrypoint` names one of the declared Views.
|
|
6
|
+
*/
|
|
3
7
|
export const defineSchema = kernelDefineSchema;
|
package/dist/project/admit.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isLegacyDeployment } from '../deployment/deploy.js';
|
|
2
1
|
import { isProject } from './define.js';
|
|
3
2
|
export const PROJECT_EXPORT_HINT = 'astrale.config.ts must export exactly one default Project:\n' +
|
|
4
3
|
" import { defineProject } from '@astrale-os/sdk/project'\n" +
|
|
@@ -15,8 +14,5 @@ export function admitProjectModule(loaded) {
|
|
|
15
14
|
const value = Reflect.get(loaded, 'default');
|
|
16
15
|
if (isProject(value))
|
|
17
16
|
return value;
|
|
18
|
-
if (isLegacyDeployment(value)) {
|
|
19
|
-
throw new TypeError(`astrale.config.ts exports the legacy deploy() aggregate; migrate the Domain and Environments into defineProject().\n${PROJECT_EXPORT_HINT}`);
|
|
20
|
-
}
|
|
21
17
|
throw new TypeError(`Default export must be created by defineProject().\n${PROJECT_EXPORT_HINT}`);
|
|
22
18
|
}
|
|
@@ -2,9 +2,5 @@
|
|
|
2
2
|
* The command that installs a deployed URL on an instance, as every SDK refusal and help text
|
|
3
3
|
* names it. A deploy never installs (DX [.81399], AM-72): `astrale-domain deploy <environment>`
|
|
4
4
|
* prints a URL, and this command installs it.
|
|
5
|
-
*
|
|
6
|
-
* `--direct` sends a URL install to the instance Kernel, which the astrale CLI requires today and
|
|
7
|
-
* accepts until D13. When the CLI retires it, this is the one SDK text to change; the adapter and
|
|
8
|
-
* scaffold READMEs and templates repeat it as prose.
|
|
9
5
|
*/
|
|
10
6
|
export declare function installCommand(instance?: string, identity?: string): string;
|
|
@@ -2,12 +2,8 @@
|
|
|
2
2
|
* The command that installs a deployed URL on an instance, as every SDK refusal and help text
|
|
3
3
|
* names it. A deploy never installs (DX [.81399], AM-72): `astrale-domain deploy <environment>`
|
|
4
4
|
* prints a URL, and this command installs it.
|
|
5
|
-
*
|
|
6
|
-
* `--direct` sends a URL install to the instance Kernel, which the astrale CLI requires today and
|
|
7
|
-
* accepts until D13. When the CLI retires it, this is the one SDK text to change; the adapter and
|
|
8
|
-
* scaffold READMEs and templates repeat it as prose.
|
|
9
5
|
*/
|
|
10
6
|
export function installCommand(instance = '<instance>', identity) {
|
|
11
|
-
return (`astrale domain install <url>
|
|
7
|
+
return (`astrale domain install <url> -i ${instance}` +
|
|
12
8
|
(identity === undefined ? '' : ` --as ${identity}`));
|
|
13
9
|
}
|
|
@@ -1,75 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The deploy mode of one Environment for one command (CT33), chosen by the configuration itself:
|
|
3
|
-
* an unchanged configuration keeps its mode, and so its behaviour, across an SDK upgrade, as long as
|
|
4
|
-
* that mode still has a consumer (AM-16, AM-72).
|
|
5
|
-
*
|
|
6
|
-
* - `canonical`: an immutable deployment of one sealed release through the adapter's
|
|
7
|
-
* `deployRelease`, with a key generated for it, and no call to any instance.
|
|
8
|
-
* - `legacy-direct`: today's stable target, replaced in place through `prepare` and `deploy`, which
|
|
9
|
-
* serves a v3 Publication only. Its `reasons` name what selected it.
|
|
10
|
-
* - `refused`: a shape no deploy of this SDK serves, refused before any effect. Each refusal
|
|
11
|
-
* carries the configuration or command to write instead.
|
|
12
|
-
*
|
|
13
|
-
* A deploy never installs, so two shapes are refused before a mode is selected at all: an
|
|
14
|
-
* Environment that declares `installation` by `defineProject`, and `--deploy-only` by the
|
|
15
|
-
* command-line parser (AM-72).
|
|
16
|
-
*/
|
|
1
|
+
/** A supported immutable deployment, or a configuration refused before provider effects. */
|
|
17
2
|
export type DeployMode = {
|
|
18
3
|
readonly kind: 'canonical';
|
|
19
|
-
} | {
|
|
20
|
-
readonly kind: 'legacy-direct';
|
|
21
|
-
readonly reasons: readonly LegacyDirectReason[];
|
|
22
4
|
} | {
|
|
23
5
|
readonly kind: 'refused';
|
|
24
6
|
readonly refusals: readonly DeployRefusal[];
|
|
25
7
|
};
|
|
26
|
-
/** What puts an Environment on the legacy direct-mode path. */
|
|
27
|
-
export type LegacyDirectReason =
|
|
28
|
-
/** An adapter-cloudflare parameter of direct mode. */
|
|
29
|
-
{
|
|
30
|
-
readonly reason: 'direct-parameter';
|
|
31
|
-
readonly parameter: CloudflareDirectParameter;
|
|
32
|
-
}
|
|
33
|
-
/** adapter-cloudflare without a dispatch `namespace`: direct mode is its default. */
|
|
34
|
-
| {
|
|
35
|
-
readonly reason: 'no-namespace';
|
|
36
|
-
}
|
|
37
|
-
/** An adapter that declares no `deployRelease`: the contract before adapter interface v2. */
|
|
38
|
-
| {
|
|
39
|
-
readonly reason: 'no-deploy-release';
|
|
40
|
-
};
|
|
41
|
-
export type CloudflareDirectParameter = 'route' | 'workerName' | 'identityIssuer' | 'addressing' | 'signingIdentity';
|
|
42
8
|
export interface DeployRefusal {
|
|
43
|
-
readonly reason: '
|
|
44
|
-
/** The configuration or command to write instead, for the author. */
|
|
9
|
+
readonly reason: 'invalid-parameters' | 'missing-namespace' | 'scheduled-triggers' | 'unsupported-adapter';
|
|
45
10
|
readonly guidance: string;
|
|
46
11
|
}
|
|
47
|
-
/**
|
|
48
|
-
* The commands that select a deploy mode. `publish` names only an immutable deployment, so it
|
|
49
|
-
* refuses every Environment that is not canonical (CT33, R-G03).
|
|
50
|
-
*/
|
|
51
12
|
export type DeployModeCommand = 'deploy' | 'publish';
|
|
52
|
-
/**
|
|
53
|
-
* Select the deploy mode of one Environment (CT33). It reads the configuration and the command
|
|
54
|
-
* only, and has no effect.
|
|
55
|
-
*
|
|
56
|
-
* A refusal wins over every other reason. adapter-astrale deploys immutable deployments only
|
|
57
|
-
* (`deployRelease`): its removed instance mode's `instance` and `signingIdentity` are refused
|
|
58
|
-
* before any effect, since their one consumer pins an older SDK (AM-72). Otherwise the Environment
|
|
59
|
-
* is on the legacy direct-mode path when adapter-cloudflare names a direct-mode parameter or no
|
|
60
|
-
* `namespace`, or when its adapter declares no `deployRelease`. Everything else is canonical,
|
|
61
|
-
* and `publish` refuses the legacy direct-mode path: a stable target serves no release, so no
|
|
62
|
-
* version can name it.
|
|
63
|
-
*
|
|
64
|
-
* Within canonical adapter-cloudflare (with `namespace`), a direct-mode parameter is refused
|
|
65
|
-
* rather than silently selecting either mode, and so is `wrangler.triggers`: an immutable
|
|
66
|
-
* deployment runs no cron of its own (D13). The bundling-affecting `wrangler` keys are refused by
|
|
67
|
-
* adapter-cloudflare itself for every Environment (AM-51).
|
|
68
|
-
*/
|
|
13
|
+
/** Inspect one Environment's deployment contract without building or changing any provider. */
|
|
69
14
|
export declare function selectDeployMode(input: {
|
|
70
15
|
readonly command: DeployModeCommand;
|
|
71
16
|
readonly environment: string;
|
|
72
|
-
/** The Environment's definition, of which selection reads only the adapter and its parameters. */
|
|
73
17
|
readonly definition: {
|
|
74
18
|
readonly deployment: {
|
|
75
19
|
readonly adapter: {
|
|
@@ -1,135 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
/** The adapter names of the first-party adapters whose parameters CT33 classifies. */
|
|
3
|
-
const CLOUDFLARE = 'cloudflare';
|
|
4
|
-
const ASTRALE = 'astrale';
|
|
5
|
-
/** The parameters that named the stable Service of adapter-astrale's removed instance mode. */
|
|
6
|
-
const ASTRALE_SERVICE_PARAMETERS = ['serviceKey', 'name'];
|
|
7
|
-
const CLOUDFLARE_DIRECT_PARAMETERS = [
|
|
8
|
-
'route',
|
|
9
|
-
'workerName',
|
|
10
|
-
'identityIssuer',
|
|
11
|
-
'addressing',
|
|
12
|
-
'signingIdentity',
|
|
13
|
-
];
|
|
14
|
-
/**
|
|
15
|
-
* Select the deploy mode of one Environment (CT33). It reads the configuration and the command
|
|
16
|
-
* only, and has no effect.
|
|
17
|
-
*
|
|
18
|
-
* A refusal wins over every other reason. adapter-astrale deploys immutable deployments only
|
|
19
|
-
* (`deployRelease`): its removed instance mode's `instance` and `signingIdentity` are refused
|
|
20
|
-
* before any effect, since their one consumer pins an older SDK (AM-72). Otherwise the Environment
|
|
21
|
-
* is on the legacy direct-mode path when adapter-cloudflare names a direct-mode parameter or no
|
|
22
|
-
* `namespace`, or when its adapter declares no `deployRelease`. Everything else is canonical,
|
|
23
|
-
* and `publish` refuses the legacy direct-mode path: a stable target serves no release, so no
|
|
24
|
-
* version can name it.
|
|
25
|
-
*
|
|
26
|
-
* Within canonical adapter-cloudflare (with `namespace`), a direct-mode parameter is refused
|
|
27
|
-
* rather than silently selecting either mode, and so is `wrangler.triggers`: an immutable
|
|
28
|
-
* deployment runs no cron of its own (D13). The bundling-affecting `wrangler` keys are refused by
|
|
29
|
-
* adapter-cloudflare itself for every Environment (AM-51).
|
|
30
|
-
*/
|
|
1
|
+
/** Inspect one Environment's deployment contract without building or changing any provider. */
|
|
31
2
|
export function selectDeployMode(input) {
|
|
32
|
-
const {
|
|
33
|
-
const
|
|
34
|
-
const parameters = definition.deployment.parameters;
|
|
3
|
+
const { adapter, parameters } = input.definition.deployment;
|
|
4
|
+
const values = parameters;
|
|
35
5
|
const refusals = [];
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
6
|
+
if (typeof adapter.deployRelease !== 'function') {
|
|
7
|
+
refusals.push({
|
|
8
|
+
reason: 'unsupported-adapter',
|
|
9
|
+
guidance: `Adapter ${adapter.name} must implement configure, placement and deployRelease for immutable deployments.`,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
if (adapter.name === 'cloudflare') {
|
|
13
|
+
if (values.namespace === undefined) {
|
|
40
14
|
refusals.push({
|
|
41
|
-
reason: '
|
|
42
|
-
guidance:
|
|
15
|
+
reason: 'missing-namespace',
|
|
16
|
+
guidance: 'cloudflare requires namespace: { name, routingDomain }. Use astrale() for managed deployments.',
|
|
43
17
|
});
|
|
44
18
|
}
|
|
45
|
-
|
|
19
|
+
const allowed = [
|
|
20
|
+
'namespace',
|
|
21
|
+
'secrets',
|
|
22
|
+
'vars',
|
|
23
|
+
'maximumRequestBytes',
|
|
24
|
+
'invocationTimeoutMs',
|
|
25
|
+
'tokenExchange',
|
|
26
|
+
'durable',
|
|
27
|
+
'wrangler',
|
|
28
|
+
'router',
|
|
29
|
+
];
|
|
30
|
+
const unknown = Reflect.ownKeys(values).filter((key) => typeof key !== 'string' || !allowed.includes(key));
|
|
31
|
+
if (unknown.length > 0)
|
|
32
|
+
refusals.push({
|
|
33
|
+
reason: 'invalid-parameters',
|
|
34
|
+
guidance: `Cloudflare Environment ${input.environment} declares unknown parameters ${unknown.map(String).join(', ')}.`,
|
|
35
|
+
});
|
|
36
|
+
const wrangler = values.wrangler;
|
|
37
|
+
if (wrangler !== undefined && Object.hasOwn(wrangler, 'triggers')) {
|
|
46
38
|
refusals.push({
|
|
47
|
-
reason: '
|
|
48
|
-
guidance: '
|
|
49
|
-
'generated when it is deployed. Remove `signingIdentity`.',
|
|
39
|
+
reason: 'scheduled-triggers',
|
|
40
|
+
guidance: 'Immutable deployments run no cron of their own. Remove wrangler.triggers.',
|
|
50
41
|
});
|
|
51
42
|
}
|
|
52
43
|
}
|
|
53
|
-
if (adapter.name ===
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
`remove ${direct.join(', ')}, or remove \`namespace\` to stay on the direct mode.`,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
const wrangler = parameters.wrangler;
|
|
65
|
-
if (wrangler !== undefined && declares(wrangler, 'triggers')) {
|
|
66
|
-
refusals.push({
|
|
67
|
-
reason: 'scheduled-triggers',
|
|
68
|
-
guidance: 'cloudflare({ namespace }) refuses `wrangler.triggers`: an immutable deployment runs ' +
|
|
69
|
-
'no cron of its own. Remove `wrangler.triggers`, or keep the cron on a direct-mode ' +
|
|
70
|
-
'Environment.',
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
reasons.push(...direct.map((parameter) => ({ reason: 'direct-parameter', parameter })), { reason: 'no-namespace' });
|
|
76
|
-
}
|
|
44
|
+
if (adapter.name === 'astrale') {
|
|
45
|
+
const allowed = ['admin', 'secrets', 'vars', 'maximumRequestBytes', 'tokenExchange', 'durable'];
|
|
46
|
+
const unknown = Reflect.ownKeys(values).filter((key) => typeof key !== 'string' || !allowed.includes(key));
|
|
47
|
+
if (unknown.length > 0)
|
|
48
|
+
refusals.push({
|
|
49
|
+
reason: 'invalid-parameters',
|
|
50
|
+
guidance: `Astrale Environment ${input.environment} declares unknown parameters ${unknown.map(String).join(', ')}.`,
|
|
51
|
+
});
|
|
77
52
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return Object.freeze({ kind: 'refused', refusals: freeze(refusals) });
|
|
82
|
-
if (reasons.length > 0 && command === 'publish') {
|
|
83
|
-
return Object.freeze({
|
|
53
|
+
return refusals.length === 0
|
|
54
|
+
? Object.freeze({ kind: 'canonical' })
|
|
55
|
+
: Object.freeze({
|
|
84
56
|
kind: 'refused',
|
|
85
|
-
refusals: freeze(
|
|
86
|
-
{ reason: 'publish-legacy-direct', guidance: publishGuidance(environment, reasons) },
|
|
87
|
-
]),
|
|
57
|
+
refusals: Object.freeze(refusals.map((r) => Object.freeze(r))),
|
|
88
58
|
});
|
|
89
|
-
}
|
|
90
|
-
if (reasons.length > 0)
|
|
91
|
-
return Object.freeze({ kind: 'legacy-direct', reasons: freeze(reasons) });
|
|
92
|
-
return Object.freeze({ kind: 'canonical' });
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* How an adapter-astrale Environment of the removed instance mode deploys now: without `instance`
|
|
96
|
-
* (nor `serviceKey` and `name`, which named its stable Service), then installed by URL on the
|
|
97
|
-
* instance it used to deploy through.
|
|
98
|
-
*/
|
|
99
|
-
function astraleInstanceGuidance(parameters, environment) {
|
|
100
|
-
const instance = String(parameters.instance);
|
|
101
|
-
const service = ASTRALE_SERVICE_PARAMETERS.filter((name) => declares(parameters, name));
|
|
102
|
-
const removed = service.length === 0
|
|
103
|
-
? 'Remove `instance`'
|
|
104
|
-
: `Remove \`instance\` with ${service.map((name) => `\`${name}\``).join(' and ')}, ` +
|
|
105
|
-
`which named its stable Service`;
|
|
106
|
-
return (`astrale({ instance: '${instance}' }) deployed through that instance's Services, which no ` +
|
|
107
|
-
`longer hosts deployments. ${removed}: \`astrale-domain deploy ${environment}\` ` +
|
|
108
|
-
`makes an immutable deployment on Admin's Services, and \`${installCommand(instance)}\` ` +
|
|
109
|
-
'installs it.');
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Why a legacy direct-mode Environment cannot be published, and the configuration that makes it
|
|
113
|
-
* publishable: a version names an immutable deployment's release, which a stable target never
|
|
114
|
-
* serves.
|
|
115
|
-
*/
|
|
116
|
-
function publishGuidance(environment, reasons) {
|
|
117
|
-
const deploys = `\`astrale-domain publish ${environment}\` names an immutable deployment's release, and ${environment} deploys`;
|
|
118
|
-
if (reasons.some(({ reason }) => reason === 'no-deploy-release')) {
|
|
119
|
-
return (`${deploys} through an adapter without deployRelease, which replaces a stable target in ` +
|
|
120
|
-
'place and serves no release. Use an adapter that implements deployRelease (adapter ' +
|
|
121
|
-
"interface v2), such as astrale() on Admin's Services.");
|
|
122
|
-
}
|
|
123
|
-
const direct = reasons.flatMap((reason) => reason.reason === 'direct-parameter' ? [reason.parameter] : []);
|
|
124
|
-
return (`${deploys} on cloudflare()'s legacy direct mode, which serves no release. Deploy it into a ` +
|
|
125
|
-
'dispatch namespace with cloudflare({ namespace })' +
|
|
126
|
-
(direct.length === 0 ? '' : ` and remove ${direct.join(', ')}`) +
|
|
127
|
-
", or on Admin's Services with astrale().");
|
|
128
|
-
}
|
|
129
|
-
/** A parameter is declared when its value is not `undefined`, as optional adapter parameters read. */
|
|
130
|
-
function declares(parameters, name) {
|
|
131
|
-
return Object.hasOwn(parameters, name) && parameters[name] !== undefined;
|
|
132
|
-
}
|
|
133
|
-
function freeze(values) {
|
|
134
|
-
return Object.freeze(values.map((value) => Object.freeze(value)));
|
|
135
59
|
}
|
|
@@ -15,23 +15,21 @@ export interface DeployResultV1 {
|
|
|
15
15
|
readonly environment: string;
|
|
16
16
|
/**
|
|
17
17
|
* The URL `astrale domain install <url>` takes: an immutable deployment's URL, which is also its
|
|
18
|
-
* issuer
|
|
18
|
+
* issuer.
|
|
19
19
|
*/
|
|
20
20
|
readonly url: string;
|
|
21
21
|
/**
|
|
22
|
-
* The digest of the
|
|
23
|
-
* stable target, which serves a v3 Publication and no release.
|
|
22
|
+
* The digest of the DomainRelease v4 served at release.json.
|
|
24
23
|
*/
|
|
25
24
|
readonly release: {
|
|
26
25
|
readonly digest: ReleaseDigest;
|
|
27
|
-
}
|
|
26
|
+
};
|
|
28
27
|
/**
|
|
29
|
-
* The build digest of the code the deployment runs, as
|
|
30
|
-
* for a stable target, which never serves a build digest.
|
|
28
|
+
* The build digest of the code the deployment runs, as astrale-domain build prints it.
|
|
31
29
|
*/
|
|
32
30
|
readonly build: {
|
|
33
31
|
readonly digest: BuildDigest;
|
|
34
|
-
}
|
|
32
|
+
};
|
|
35
33
|
readonly schema: {
|
|
36
34
|
readonly revision: Revision;
|
|
37
35
|
};
|
|
@@ -40,24 +38,21 @@ export interface DeployResultV1 {
|
|
|
40
38
|
readonly adapter: string;
|
|
41
39
|
/**
|
|
42
40
|
* The provider script that serves this deployment: an immutable deployment's label, which is
|
|
43
|
-
* also the first label of its URL.
|
|
44
|
-
* never report the script they replace.
|
|
41
|
+
* also the first label of its URL.
|
|
45
42
|
*/
|
|
46
|
-
readonly script: string
|
|
43
|
+
readonly script: string;
|
|
47
44
|
/**
|
|
48
45
|
* `created`: a new immutable deployment. `reused`: the immutable deployment of this exact
|
|
49
|
-
* release already existed.
|
|
50
|
-
* ran, if anything (the legacy direct-mode path cannot tell a first deploy from a later one);
|
|
51
|
-
* only that path replaces.
|
|
46
|
+
* release already existed.
|
|
52
47
|
*/
|
|
53
|
-
readonly state: 'created' | 'reused'
|
|
48
|
+
readonly state: 'created' | 'reused';
|
|
54
49
|
};
|
|
55
50
|
/**
|
|
56
51
|
* Immutable deployments only: the environment's current secrets were `bound` to a new
|
|
57
52
|
* deployment, or `updated` or left `unchanged` in place on the reused one. A deploy never writes
|
|
58
53
|
* the secrets of any other deployment.
|
|
59
54
|
*/
|
|
60
|
-
readonly secrets
|
|
55
|
+
readonly secrets: {
|
|
61
56
|
readonly state: DeploymentSecretsState;
|
|
62
57
|
};
|
|
63
58
|
/**
|
package/dist/tooling/cli/help.js
CHANGED
|
@@ -101,16 +101,11 @@ Behavior:
|
|
|
101
101
|
does, loads declared secrets, and deploys through the selected adapter. It never
|
|
102
102
|
installs the Domain: install the URL it prints with
|
|
103
103
|
${installCommand()}.
|
|
104
|
-
|
|
105
|
-
deployRelease
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
Environment's current secrets; a reused one has its own secrets updated in place,
|
|
110
|
-
served once propagated; no other deployment's secrets change. Any other Environment
|
|
111
|
-
replaces its stable target in place (legacy direct mode, deprecated), warns on
|
|
112
|
-
stderr, serves a v3 Publication only, and warns when the uploaded code has another
|
|
113
|
-
build digest than the Bundle.
|
|
104
|
+
Each Environment deploys one immutable release through configure, placement and
|
|
105
|
+
deployRelease. The SDK seals the release at the deployment URL and records the
|
|
106
|
+
source commit. Its adapter creates that deployment or reuses it. A new deployment
|
|
107
|
+
binds the Environment's current secrets; reuse updates only that deployment's
|
|
108
|
+
secrets. Cloudflare requires a dispatch namespace; astrale() uses Admin's Services.
|
|
114
109
|
With --json, stdout holds only one DeployResultV1: the deployment's URL, which
|
|
115
110
|
astrale domain install takes, its digests, adapter and state. Exit status: 0 deployed,
|
|
116
111
|
1 failed or refused, 2 usage error; a failed run prints nothing on stdout.
|
|
@@ -131,8 +126,7 @@ Options:
|
|
|
131
126
|
Behavior:
|
|
132
127
|
Asks the adapter of each Environment that deploys immutable deployments for the
|
|
133
128
|
deployments its host keeps for the caller, and prints each one's release, its version
|
|
134
|
-
or name, Environment and state, the instances it is installed on,
|
|
135
|
-
its expiry, and the URL ${installCommand()} takes.
|
|
129
|
+
or name, Environment and state, the instances it is installed on, and the URL ${installCommand()} takes.
|
|
136
130
|
A deployment is named by the registry's version of its release (1.5.0) or of its build
|
|
137
131
|
(1.5.0 · staging), else from its record's commit, such as 1.4.2 + 7 commits · a1b2c3d ·
|
|
138
132
|
staging. Names are computed, never stored, and printed whole.
|
|
@@ -144,11 +138,10 @@ Behavior:
|
|
|
144
138
|
The registry and the instances are read through the Astrale CLI (${MINIMUM_INSTALLATIONS_CLI_VERSION} or
|
|
145
139
|
newer) with the caller's identity, only once a deployment is listed.
|
|
146
140
|
A registry that cannot be read fails the listing; an unknown instance never does.
|
|
147
|
-
Admin's Services and a Cloudflare dispatch namespace keep
|
|
148
|
-
owner retires
|
|
149
|
-
only when an older adapter reports it.
|
|
141
|
+
Admin's Services and a Cloudflare dispatch namespace keep deployments until their
|
|
142
|
+
owner retires them.
|
|
150
143
|
Listing changes nothing, at any host, registry or instance.
|
|
151
|
-
An Environment
|
|
144
|
+
An Environment refused by deploy, or whose adapter lists no
|
|
152
145
|
deployments is reported on stderr and, with --json, under unlisted. A deployment
|
|
153
146
|
whose record this SDK does not admit is still listed, from what its host knows.
|
|
154
147
|
With --json, each deployment carries its installedOn and its call target: the path of
|