@empire-builder-kit/nx 1.0.0-rc.30 → 1.0.0-rc.31
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/executors.json +8 -3
- package/package.json +10 -7
- package/src/aws/child-environment.d.ts +10 -0
- package/src/aws/child-environment.js +77 -0
- package/src/aws/child-environment.js.map +1 -0
- package/src/aws/identity.d.ts +13 -0
- package/src/aws/identity.js +41 -0
- package/src/aws/identity.js.map +1 -0
- package/src/aws-authority/index.d.ts +1 -0
- package/src/aws-authority/index.js +5 -0
- package/src/aws-authority/index.js.map +1 -0
- package/src/aws-authority/stage-authority.d.ts +238 -0
- package/src/aws-authority/stage-authority.js +2836 -0
- package/src/aws-authority/stage-authority.js.map +1 -0
- package/src/developer-agent/generator-planning.js +4 -4
- package/src/developer-agent/generator-planning.js.map +1 -1
- package/src/developer-agent/operation-registry.js +14 -6
- package/src/developer-agent/operation-registry.js.map +1 -1
- package/src/executors/deployment-plan/deployment-plan.js +1 -1
- package/src/executors/deployment-plan/deployment-plan.js.map +1 -1
- package/src/executors/foundation-preflight/foundation-preflight.d.ts +0 -1
- package/src/executors/foundation-preflight/foundation-preflight.js.map +1 -1
- package/src/executors/foundation-preflight/schema.json +0 -5
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.d.ts +12 -3
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js +95 -32
- package/src/executors/foundation-profile-preflight/foundation-profile-preflight.js.map +1 -1
- package/src/executors/foundation-profile-preflight/production-database-safeguard.d.ts +64 -0
- package/src/executors/foundation-profile-preflight/production-database-safeguard.js +221 -0
- package/src/executors/foundation-profile-preflight/production-database-safeguard.js.map +1 -0
- package/src/executors/foundation-profile-preflight/schema.json +1 -6
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.d.ts +11 -1
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js +44 -21
- package/src/executors/foundation-remove-preflight/foundation-remove-preflight.js.map +1 -1
- package/src/executors/foundation-remove-preflight/schema.json +6 -1
- package/src/executors/infrastructure-plan/infrastructure-plan.d.ts +25 -369
- package/src/executors/infrastructure-plan/infrastructure-plan.js +222 -5472
- package/src/executors/infrastructure-plan/infrastructure-plan.js.map +1 -1
- package/src/executors/infrastructure-plan/schema.json +8 -64
- package/src/executors/local-deploy/federated-credential-transport.d.ts +48 -0
- package/src/executors/local-deploy/federated-credential-transport.js +252 -0
- package/src/executors/local-deploy/federated-credential-transport.js.map +1 -0
- package/src/executors/local-deploy/local-approval.d.ts +4 -9
- package/src/executors/local-deploy/local-approval.js +3 -7
- package/src/executors/local-deploy/local-approval.js.map +1 -1
- package/src/executors/local-deploy/local-deploy.d.ts +58 -43
- package/src/executors/local-deploy/local-deploy.js +938 -804
- package/src/executors/local-deploy/local-deploy.js.map +1 -1
- package/src/executors/local-deploy/schema.json +3 -20
- package/src/executors/refresh/refresh.js +2 -2
- package/src/executors/refresh/refresh.js.map +1 -1
- package/src/executors/remove/remove.js +2 -2
- package/src/executors/remove/remove.js.map +1 -1
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.d.ts +25 -1
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js +905 -22
- package/src/executors/router-waf-rehearsal/router-waf-rehearsal.js.map +1 -1
- package/src/executors/router-waf-rehearsal/schema.json +17 -2
- package/src/executors/secret-initialize/schema.json +42 -0
- package/src/executors/secret-initialize/secret-initialize.d.ts +30 -0
- package/src/executors/secret-initialize/secret-initialize.js +229 -0
- package/src/executors/secret-initialize/secret-initialize.js.map +1 -0
- package/src/executors/secret-metadata/secret-metadata.d.ts +2 -1
- package/src/executors/secret-metadata/secret-metadata.js +62 -29
- package/src/executors/secret-metadata/secret-metadata.js.map +1 -1
- package/src/executors/sst-lifecycle/generated-secret-retirement.d.ts +53 -0
- package/src/executors/sst-lifecycle/generated-secret-retirement.js +192 -0
- package/src/executors/sst-lifecycle/generated-secret-retirement.js.map +1 -0
- package/src/executors/sst-lifecycle/governed-native-operation.d.ts +46 -0
- package/src/executors/sst-lifecycle/governed-native-operation.js +153 -0
- package/src/executors/sst-lifecycle/governed-native-operation.js.map +1 -0
- package/src/executors/sst-lifecycle/run-sst-command.d.ts +25 -7
- package/src/executors/sst-lifecycle/run-sst-command.js +459 -89
- package/src/executors/sst-lifecycle/run-sst-command.js.map +1 -1
- package/src/executors/sst-lifecycle/schema.json +0 -5
- package/src/executors/sst-lifecycle/secret-preflight.d.ts +2 -0
- package/src/executors/sst-lifecycle/secret-preflight.js +13 -7
- package/src/executors/sst-lifecycle/secret-preflight.js.map +1 -1
- package/src/executors/unlock/unlock.js +2 -2
- package/src/executors/unlock/unlock.js.map +1 -1
- package/src/foundation/router-waf-rate-rehearsal.d.ts +97 -0
- package/src/foundation/router-waf-rate-rehearsal.js +210 -0
- package/src/foundation/router-waf-rate-rehearsal.js.map +1 -0
- package/src/foundation/router-waf.d.ts +59 -9
- package/src/foundation/router-waf.js +427 -32
- package/src/foundation/router-waf.js.map +1 -1
- package/src/foundation/stages.d.ts +1 -0
- package/src/foundation/stages.js +11 -0
- package/src/foundation/stages.js.map +1 -1
- package/src/generators/formatting.d.ts +8 -0
- package/src/generators/formatting.js +118 -0
- package/src/generators/formatting.js.map +1 -0
- package/src/generators/function/function.js +37 -17
- package/src/generators/function/function.js.map +1 -1
- package/src/generators/post-generation-install.js +2 -2
- package/src/generators/post-generation-install.js.map +1 -1
- package/src/generators/preset/generator.js +22 -7
- package/src/generators/preset/generator.js.map +1 -1
- package/src/generators/preset/workspace-files-developer-agent.js +15 -7
- package/src/generators/preset/workspace-files-developer-agent.js.map +1 -1
- package/src/generators/preset/workspace-files-ecr-inspector.d.ts +18 -0
- package/src/generators/preset/workspace-files-ecr-inspector.js +298 -0
- package/src/generators/preset/workspace-files-ecr-inspector.js.map +1 -0
- package/src/generators/preset/workspace-files-performance-cost.d.ts +2 -2
- package/src/generators/preset/workspace-files-performance-cost.js +8 -8
- package/src/generators/preset/workspace-files-performance-cost.js.map +1 -1
- package/src/generators/preset/workspace-files-performance-load.d.ts +1 -1
- package/src/generators/preset/workspace-files-performance-load.js +8 -12
- package/src/generators/preset/workspace-files-performance-load.js.map +1 -1
- package/src/generators/preset/workspace-files-stage-authority.d.ts +4 -0
- package/src/generators/preset/workspace-files-stage-authority.js +275 -0
- package/src/generators/preset/workspace-files-stage-authority.js.map +1 -0
- package/src/generators/preset/workspace-files-thin-deploy.d.ts +35 -0
- package/src/generators/preset/workspace-files-thin-deploy.js +1434 -0
- package/src/generators/preset/workspace-files-thin-deploy.js.map +1 -0
- package/src/generators/preset/workspace-files-thin-docs.d.ts +5 -0
- package/src/generators/preset/workspace-files-thin-docs.js +224 -0
- package/src/generators/preset/workspace-files-thin-docs.js.map +1 -0
- package/src/generators/preset/workspace-files-thin-release.d.ts +14 -0
- package/src/generators/preset/workspace-files-thin-release.js +26 -0
- package/src/generators/preset/workspace-files-thin-release.js.map +1 -0
- package/src/generators/preset/workspace-files.d.ts +1 -1
- package/src/generators/preset/workspace-files.js +373 -223
- package/src/generators/preset/workspace-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-api-files.js +1 -0
- package/src/generators/slice/built-in-plan-api-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js +4 -0
- package/src/generators/slice/built-in-plan-authorization-infrastructure-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js +5 -31
- package/src/generators/slice/built-in-plan-data-export-infrastructure-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-data-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-data-files.js +89 -30
- package/src/generators/slice/built-in-plan-data-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-foundation-files.js +3 -5
- package/src/generators/slice/built-in-plan-foundation-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-frontend-files.js +5 -1
- package/src/generators/slice/built-in-plan-frontend-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-infrastructure-files.js +199 -188
- package/src/generators/slice/built-in-plan-infrastructure-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-metadata-files.js +13 -0
- package/src/generators/slice/built-in-plan-metadata-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.d.ts +2 -0
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js +307 -0
- package/src/generators/slice/built-in-plan-native-runtime-authority-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-operations-files.js +43 -49
- package/src/generators/slice/built-in-plan-operations-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-performance-files.js +37 -19
- package/src/generators/slice/built-in-plan-performance-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-project-files.js +9 -68
- package/src/generators/slice/built-in-plan-project-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.d.ts +1 -1
- package/src/generators/slice/built-in-plan-secret-runtime-files.js +74 -76
- package/src/generators/slice/built-in-plan-secret-runtime-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-testing-files.js +74 -47
- package/src/generators/slice/built-in-plan-testing-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-thin-release-files.d.ts +11 -0
- package/src/generators/slice/built-in-plan-thin-release-files.js +129 -0
- package/src/generators/slice/built-in-plan-thin-release-files.js.map +1 -0
- package/src/generators/slice/built-in-plan-verification-files.js +6 -2
- package/src/generators/slice/built-in-plan-verification-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-web-files.js +4 -2
- package/src/generators/slice/built-in-plan-web-files.js.map +1 -1
- package/src/generators/slice/built-in-plan-workload-role-files.js +26 -4
- package/src/generators/slice/built-in-plan-workload-role-files.js.map +1 -1
- package/src/generators/slice/built-in-plan.d.ts +1 -0
- package/src/generators/slice/built-in-plan.js +28 -11
- package/src/generators/slice/built-in-plan.js.map +1 -1
- package/src/generators/slice/slice.js +27 -29
- package/src/generators/slice/slice.js.map +1 -1
- package/src/generators/upgrade/upgrade.d.ts +1 -1
- package/src/generators/upgrade/upgrade.js +224 -69
- package/src/generators/upgrade/upgrade.js.map +1 -1
- package/src/generators/workload/performance-registration.d.ts +1 -0
- package/src/generators/workload/performance-registration.js +6 -4
- package/src/generators/workload/performance-registration.js.map +1 -1
- package/src/generators/workload/service-performance-files.d.ts +1 -0
- package/src/generators/workload/service-performance-files.js +27 -7
- package/src/generators/workload/service-performance-files.js.map +1 -1
- package/src/generators/workload/workload.d.ts +1 -1
- package/src/generators/workload/workload.js +55 -28
- package/src/generators/workload/workload.js.map +1 -1
- package/src/git-policy/github-bootstrap.d.ts +19 -6
- package/src/git-policy/github-bootstrap.js +103 -157
- package/src/git-policy/github-bootstrap.js.map +1 -1
- package/src/local-dev/private-state.d.ts +3 -0
- package/src/local-dev/private-state.js +17 -5
- package/src/local-dev/private-state.js.map +1 -1
- package/src/performance/cost-collection.d.ts +1 -1
- package/src/performance/cost-collection.js +4 -2
- package/src/performance/cost-collection.js.map +1 -1
- package/src/performance/cost-controls.d.ts +3 -1
- package/src/performance/cost-controls.js +9 -4
- package/src/performance/cost-controls.js.map +1 -1
- package/src/performance/evidence.d.ts +1 -1
- package/src/performance/evidence.js +5 -3
- package/src/performance/evidence.js.map +1 -1
- package/src/performance/load-safety.js +5 -3
- package/src/performance/load-safety.js.map +1 -1
- package/src/performance/model.d.ts +2 -2
- package/src/performance/model.js +4 -3
- package/src/performance/model.js.map +1 -1
- package/src/release/index.d.ts +0 -2
- package/src/release/index.js +0 -2
- package/src/release/index.js.map +1 -1
- package/src/release/source-authority.d.ts +4 -5
- package/src/release/source-authority.js +13 -123
- package/src/release/source-authority.js.map +1 -1
- package/src/repository-policy/aurora-preflight.d.ts +1 -1
- package/src/repository-policy/aurora-preflight.js +4 -1
- package/src/repository-policy/aurora-preflight.js.map +1 -1
- package/src/repository-policy/policy.d.ts +5 -1
- package/src/repository-policy/policy.js +64 -13
- package/src/repository-policy/policy.js.map +1 -1
- package/src/schemas/performance-policy-v1.json +3 -1
- package/src/secrets/adapters.d.ts +5 -1
- package/src/secrets/adapters.js +22 -1
- package/src/secrets/adapters.js.map +1 -1
- package/src/secrets/aws-control-plane.d.ts +10 -1
- package/src/secrets/aws-control-plane.js +67 -0
- package/src/secrets/aws-control-plane.js.map +1 -1
- package/src/secrets/generated-aws-control-plane.d.ts +23 -0
- package/src/secrets/generated-aws-control-plane.js +259 -0
- package/src/secrets/generated-aws-control-plane.js.map +1 -0
- package/src/secrets/metadata.js +38 -10
- package/src/secrets/metadata.js.map +1 -1
- package/src/secrets/model.d.ts +8 -1
- package/src/secrets/model.js +24 -3
- package/src/secrets/model.js.map +1 -1
- package/src/secrets/operator.d.ts +89 -3
- package/src/secrets/operator.js +422 -9
- package/src/secrets/operator.js.map +1 -1
- package/src/secrets/registry.d.ts +2 -1
- package/src/secrets/registry.js +18 -1
- package/src/secrets/registry.js.map +1 -1
- package/src/secrets/workload-access.js +10 -2
- package/src/secrets/workload-access.js.map +1 -1
- package/src/supply-chain/action-pins.js +61 -7
- package/src/supply-chain/action-pins.js.map +1 -1
- package/src/supply-chain/build-output-bounds.d.ts +2 -0
- package/src/supply-chain/build-output-bounds.js +12 -0
- package/src/supply-chain/build-output-bounds.js.map +1 -0
- package/src/supply-chain/build-output.js +2 -4
- package/src/supply-chain/build-output.js.map +1 -1
- package/src/supply-chain/ecr-scanning.d.ts +5 -3
- package/src/supply-chain/ecr-scanning.js +11 -7
- package/src/supply-chain/ecr-scanning.js.map +1 -1
- package/src/supply-chain/ecs-deployed-image.d.ts +5 -3
- package/src/supply-chain/ecs-deployed-image.js +6 -4
- package/src/supply-chain/ecs-deployed-image.js.map +1 -1
- package/src/supply-chain/generated-container-release-command.js +816 -34
- package/src/supply-chain/generated-container-release-command.js.map +1 -1
- package/src/supply-chain/generated-ecr-collector-command.d.ts +0 -1
- package/src/supply-chain/generated-ecr-collector-command.js +188 -91
- package/src/supply-chain/generated-ecr-collector-command.js.map +1 -1
- package/src/supply-chain/generated-files.js +4 -3
- package/src/supply-chain/generated-files.js.map +1 -1
- package/src/supply-chain/index.d.ts +1 -1
- package/src/supply-chain/index.js +2 -1
- package/src/supply-chain/index.js.map +1 -1
- package/src/workload-roles/index.d.ts +10 -17
- package/src/workload-roles/index.js +5 -18
- package/src/workload-roles/index.js.map +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type PrivateStateSecurity } from '../../local-dev/private-state.js';
|
|
2
|
+
declare const CHILD_PROFILE = "ebk-sst-federated";
|
|
3
|
+
declare const GOVERNED_SIGNALS: readonly ["SIGINT", "SIGTERM"];
|
|
4
|
+
type GovernedSignal = (typeof GOVERNED_SIGNALS)[number];
|
|
5
|
+
interface GovernedSignalCleanup {
|
|
6
|
+
readonly priority: number;
|
|
7
|
+
run(signal: GovernedSignal): Promise<void> | void;
|
|
8
|
+
}
|
|
9
|
+
/** Coordinate an exact child shutdown or private-state cleanup before the
|
|
10
|
+
* current process preserves its normal SIGINT/SIGTERM behavior. Higher
|
|
11
|
+
* priorities run first so mutation children stop before credentials vanish. */
|
|
12
|
+
export declare function registerGovernedSignalCleanup(run: GovernedSignalCleanup['run'], priority?: number): () => void;
|
|
13
|
+
export declare function governedSignalCleanupInProgress(): boolean;
|
|
14
|
+
interface FederatedCredentialIdentity {
|
|
15
|
+
accessKeyId: string;
|
|
16
|
+
expiration?: Date;
|
|
17
|
+
secretAccessKey: string;
|
|
18
|
+
sessionToken?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface LocalFederatedCredentialTransport {
|
|
21
|
+
readonly profile: typeof CHILD_PROFILE;
|
|
22
|
+
childEnvironment(ambient: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
23
|
+
cleanup(): void;
|
|
24
|
+
refresh(): Promise<{
|
|
25
|
+
actorArn: string;
|
|
26
|
+
expiresAt: string;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
export interface LocalFederatedCredentialTransportInput {
|
|
30
|
+
account: string;
|
|
31
|
+
expectedRoleArn: string;
|
|
32
|
+
profile?: string;
|
|
33
|
+
region: string;
|
|
34
|
+
}
|
|
35
|
+
export interface LocalFederatedCredentialTransportDependencies {
|
|
36
|
+
identify?: (credentials: FederatedCredentialIdentity, region: string) => Promise<{
|
|
37
|
+
Account?: string;
|
|
38
|
+
Arn?: string;
|
|
39
|
+
}>;
|
|
40
|
+
now?: () => Date;
|
|
41
|
+
removeDirectory?: (path: string) => void;
|
|
42
|
+
resolve?: () => Promise<FederatedCredentialIdentity>;
|
|
43
|
+
security?: PrivateStateSecurity;
|
|
44
|
+
}
|
|
45
|
+
/** Materialize temporary federated credentials for tools that cannot resolve a
|
|
46
|
+
* modern IAM Identity Center source-profile chain themselves. */
|
|
47
|
+
export declare function createLocalFederatedCredentialTransport(input: LocalFederatedCredentialTransportInput, dependencies?: LocalFederatedCredentialTransportDependencies): Promise<LocalFederatedCredentialTransport>;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerGovernedSignalCleanup = registerGovernedSignalCleanup;
|
|
4
|
+
exports.governedSignalCleanupInProgress = governedSignalCleanupInProgress;
|
|
5
|
+
exports.createLocalFederatedCredentialTransport = createLocalFederatedCredentialTransport;
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_os_1 = require("node:os");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const client_sts_1 = require("@aws-sdk/client-sts");
|
|
10
|
+
const credential_providers_1 = require("@aws-sdk/credential-providers");
|
|
11
|
+
const child_environment_js_1 = require("../../aws/child-environment.js");
|
|
12
|
+
const identity_js_1 = require("../../aws/identity.js");
|
|
13
|
+
const private_state_js_1 = require("../../local-dev/private-state.js");
|
|
14
|
+
const CHILD_PROFILE = 'ebk-sst-federated';
|
|
15
|
+
const MINIMUM_REMAINING_LIFETIME_MS = 30 * 60 * 1000;
|
|
16
|
+
const PROFILE = /^[A-Za-z0-9_+=,.@-]{1,128}$/u;
|
|
17
|
+
const REGION = /^[a-z]{2}(?:-gov)?-[a-z]+-\d$/u;
|
|
18
|
+
const ROLE = /^arn:(aws|aws-us-gov|aws-cn):iam::\d{12}:role\/[A-Za-z0-9+=,.@_/-]{1,512}$/u;
|
|
19
|
+
const AMBIENT_CREDENTIAL_KEYS = [
|
|
20
|
+
'AWS_ACCESS_KEY_ID',
|
|
21
|
+
'AWS_SECRET_ACCESS_KEY',
|
|
22
|
+
'AWS_SESSION_TOKEN',
|
|
23
|
+
'AWS_SECURITY_TOKEN',
|
|
24
|
+
'AWS_ROLE_ARN',
|
|
25
|
+
'AWS_ROLE_SESSION_NAME',
|
|
26
|
+
'AWS_WEB_IDENTITY_TOKEN_FILE',
|
|
27
|
+
'AWS_CONTAINER_AUTHORIZATION_TOKEN',
|
|
28
|
+
'AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE',
|
|
29
|
+
'AWS_CONTAINER_CREDENTIALS_FULL_URI',
|
|
30
|
+
'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI',
|
|
31
|
+
'AWS_CONFIG_FILE',
|
|
32
|
+
'AWS_CREDENTIAL_EXPIRATION',
|
|
33
|
+
'AWS_DEFAULT_PROFILE',
|
|
34
|
+
'AWS_DEFAULT_REGION',
|
|
35
|
+
'AWS_SHARED_CREDENTIALS_FILE',
|
|
36
|
+
'AWS_PROFILE',
|
|
37
|
+
'AWS_REGION',
|
|
38
|
+
'EBK_GOVERNED_PROCESS_GROUP',
|
|
39
|
+
];
|
|
40
|
+
const GOVERNED_SIGNALS = ['SIGINT', 'SIGTERM'];
|
|
41
|
+
const governedSignalCleanups = new Set();
|
|
42
|
+
const governedSignalHandlers = new Map();
|
|
43
|
+
let governedSignalInProgress;
|
|
44
|
+
function removeGovernedSignalHandlers() {
|
|
45
|
+
if (governedSignalCleanups.size > 0 || governedSignalInProgress)
|
|
46
|
+
return;
|
|
47
|
+
for (const [signal, handler] of governedSignalHandlers) {
|
|
48
|
+
process.removeListener(signal, handler);
|
|
49
|
+
}
|
|
50
|
+
governedSignalHandlers.clear();
|
|
51
|
+
}
|
|
52
|
+
async function handleGovernedSignal(signal, handler) {
|
|
53
|
+
if (governedSignalInProgress)
|
|
54
|
+
return;
|
|
55
|
+
governedSignalInProgress = signal;
|
|
56
|
+
const hasExternalListener = process
|
|
57
|
+
.listeners(signal)
|
|
58
|
+
.some((listener) => listener !== handler);
|
|
59
|
+
let cleanupFailed = false;
|
|
60
|
+
for (const cleanup of [...governedSignalCleanups].sort((left, right) => right.priority - left.priority)) {
|
|
61
|
+
try {
|
|
62
|
+
await cleanup.run(signal);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
cleanupFailed = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
governedSignalInProgress = undefined;
|
|
69
|
+
removeGovernedSignalHandlers();
|
|
70
|
+
if (cleanupFailed) {
|
|
71
|
+
process.stderr.write('Governed signal cleanup failed; private recovery evidence was retained.\n');
|
|
72
|
+
}
|
|
73
|
+
if (!hasExternalListener) {
|
|
74
|
+
const retainedHandler = governedSignalHandlers.get(signal);
|
|
75
|
+
if (retainedHandler) {
|
|
76
|
+
process.removeListener(signal, retainedHandler);
|
|
77
|
+
governedSignalHandlers.delete(signal);
|
|
78
|
+
}
|
|
79
|
+
process.kill(process.pid, signal);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function ensureGovernedSignalHandlers() {
|
|
83
|
+
for (const signal of GOVERNED_SIGNALS) {
|
|
84
|
+
if (governedSignalHandlers.has(signal))
|
|
85
|
+
continue;
|
|
86
|
+
const handler = () => {
|
|
87
|
+
void handleGovernedSignal(signal, handler);
|
|
88
|
+
};
|
|
89
|
+
governedSignalHandlers.set(signal, handler);
|
|
90
|
+
process.prependListener(signal, handler);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Coordinate an exact child shutdown or private-state cleanup before the
|
|
94
|
+
* current process preserves its normal SIGINT/SIGTERM behavior. Higher
|
|
95
|
+
* priorities run first so mutation children stop before credentials vanish. */
|
|
96
|
+
function registerGovernedSignalCleanup(run, priority = 0) {
|
|
97
|
+
const cleanup = { priority, run };
|
|
98
|
+
governedSignalCleanups.add(cleanup);
|
|
99
|
+
ensureGovernedSignalHandlers();
|
|
100
|
+
let registered = true;
|
|
101
|
+
return () => {
|
|
102
|
+
if (!registered)
|
|
103
|
+
return;
|
|
104
|
+
registered = false;
|
|
105
|
+
governedSignalCleanups.delete(cleanup);
|
|
106
|
+
removeGovernedSignalHandlers();
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function governedSignalCleanupInProgress() {
|
|
110
|
+
return governedSignalInProgress !== undefined;
|
|
111
|
+
}
|
|
112
|
+
function requireCredentialValue(value, label) {
|
|
113
|
+
if (!value || value !== value.trim() || /[\r\n]/u.test(value)) {
|
|
114
|
+
throw new Error(`Temporary federated ${label} is missing or malformed.`);
|
|
115
|
+
}
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
function credentialsFile(identity) {
|
|
119
|
+
return `[${CHILD_PROFILE}]\naws_access_key_id = ${requireCredentialValue(identity.accessKeyId, 'access key')}\naws_secret_access_key = ${requireCredentialValue(identity.secretAccessKey, 'secret key')}\naws_session_token = ${requireCredentialValue(identity.sessionToken, 'session token')}\n`;
|
|
120
|
+
}
|
|
121
|
+
function configFile(region) {
|
|
122
|
+
return `[profile ${CHILD_PROFILE}]\nregion = ${region}\noutput = json\n`;
|
|
123
|
+
}
|
|
124
|
+
/** Materialize temporary federated credentials for tools that cannot resolve a
|
|
125
|
+
* modern IAM Identity Center source-profile chain themselves. */
|
|
126
|
+
async function createLocalFederatedCredentialTransport(input, dependencies = {}) {
|
|
127
|
+
if (!/^\d{12}$/u.test(input.account) ||
|
|
128
|
+
!ROLE.test(input.expectedRoleArn) ||
|
|
129
|
+
(input.profile !== undefined && !PROFILE.test(input.profile)) ||
|
|
130
|
+
!REGION.test(input.region)) {
|
|
131
|
+
throw new Error('Local federated credential transport input is invalid.');
|
|
132
|
+
}
|
|
133
|
+
const security = dependencies.security ?? {};
|
|
134
|
+
const directory = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'ebk-sst-federated-'));
|
|
135
|
+
const configurationPath = (0, node_path_1.join)(directory, 'config');
|
|
136
|
+
const credentialsPath = (0, node_path_1.join)(directory, 'credentials');
|
|
137
|
+
let closed = false;
|
|
138
|
+
let disposed = false;
|
|
139
|
+
let actorArn = '';
|
|
140
|
+
let expiresAt = '';
|
|
141
|
+
let unregisterSignalCleanup = () => undefined;
|
|
142
|
+
(0, private_state_js_1.hardenPrivatePath)(directory, 'directory', security);
|
|
143
|
+
(0, private_state_js_1.assertPrivatePath)(directory, 'directory', security);
|
|
144
|
+
const cleanupFiles = (signalCoordinator = false) => {
|
|
145
|
+
if (disposed)
|
|
146
|
+
return true;
|
|
147
|
+
closed = true;
|
|
148
|
+
if (governedSignalInProgress && !signalCoordinator)
|
|
149
|
+
return false;
|
|
150
|
+
try {
|
|
151
|
+
(dependencies.removeDirectory ??
|
|
152
|
+
((path) => (0, node_fs_1.rmSync)(path, { force: true, recursive: true })))(directory);
|
|
153
|
+
disposed = true;
|
|
154
|
+
unregisterSignalCleanup();
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
throw new Error('Local federated credential transport cleanup failed.');
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const onExit = () => {
|
|
162
|
+
try {
|
|
163
|
+
cleanupFiles(true);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Credentials are temporary and the directory remains user-private if
|
|
167
|
+
// process-exit cleanup itself cannot report an error.
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
unregisterSignalCleanup = registerGovernedSignalCleanup(() => {
|
|
171
|
+
cleanupFiles(true);
|
|
172
|
+
process.removeListener('exit', onExit);
|
|
173
|
+
});
|
|
174
|
+
process.once('exit', onExit);
|
|
175
|
+
const resolve = dependencies.resolve ??
|
|
176
|
+
(input.profile
|
|
177
|
+
? (0, credential_providers_1.fromIni)({ profile: input.profile })
|
|
178
|
+
: (0, credential_providers_1.fromNodeProviderChain)());
|
|
179
|
+
const identify = dependencies.identify ??
|
|
180
|
+
(async (credentials, region) => new client_sts_1.STSClient({
|
|
181
|
+
credentials,
|
|
182
|
+
endpoint: (0, identity_js_1.canonicalStsEndpoint)(region),
|
|
183
|
+
region,
|
|
184
|
+
}).send(new client_sts_1.GetCallerIdentityCommand({})));
|
|
185
|
+
const refresh = async () => {
|
|
186
|
+
if (closed || disposed) {
|
|
187
|
+
throw new Error('Local federated credential transport is already closed.');
|
|
188
|
+
}
|
|
189
|
+
const identity = await resolve();
|
|
190
|
+
requireCredentialValue(identity.accessKeyId, 'access key');
|
|
191
|
+
requireCredentialValue(identity.secretAccessKey, 'secret key');
|
|
192
|
+
requireCredentialValue(identity.sessionToken, 'session token');
|
|
193
|
+
const expiration = identity.expiration;
|
|
194
|
+
const now = (dependencies.now ?? (() => new Date()))();
|
|
195
|
+
if (!(expiration instanceof Date) ||
|
|
196
|
+
!Number.isFinite(expiration.getTime()) ||
|
|
197
|
+
expiration.getTime() - now.getTime() < MINIMUM_REMAINING_LIFETIME_MS) {
|
|
198
|
+
throw new Error('Local deployment requires temporary federated credentials with at least 30 minutes remaining.');
|
|
199
|
+
}
|
|
200
|
+
const caller = await identify(identity, input.region);
|
|
201
|
+
const callerArn = caller.Arn?.trim() ?? '';
|
|
202
|
+
if (caller.Account?.trim() !== input.account ||
|
|
203
|
+
!(0, identity_js_1.matchesExpectedAssumedRoleArn)(input.account, callerArn, input.expectedRoleArn)) {
|
|
204
|
+
throw new Error('Temporary SST child credentials do not match the committed account and exact assumed role.');
|
|
205
|
+
}
|
|
206
|
+
(0, private_state_js_1.atomicWritePrivateFile)(configurationPath, configFile(input.region), security);
|
|
207
|
+
(0, private_state_js_1.atomicWritePrivateFile)(credentialsPath, credentialsFile(identity), security);
|
|
208
|
+
(0, private_state_js_1.assertPrivatePath)(directory, 'directory', security);
|
|
209
|
+
(0, private_state_js_1.assertPrivatePath)(configurationPath, 'file', security);
|
|
210
|
+
(0, private_state_js_1.assertPrivatePath)(credentialsPath, 'file', security);
|
|
211
|
+
actorArn = callerArn;
|
|
212
|
+
expiresAt = expiration.toISOString();
|
|
213
|
+
return { actorArn, expiresAt };
|
|
214
|
+
};
|
|
215
|
+
try {
|
|
216
|
+
await refresh();
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (cleanupFiles())
|
|
220
|
+
process.removeListener('exit', onExit);
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
profile: CHILD_PROFILE,
|
|
225
|
+
childEnvironment(ambient) {
|
|
226
|
+
if (closed || disposed || !expiresAt) {
|
|
227
|
+
throw new Error('Local federated credential transport is unavailable.');
|
|
228
|
+
}
|
|
229
|
+
(0, private_state_js_1.assertPrivatePath)(directory, 'directory', security);
|
|
230
|
+
(0, private_state_js_1.assertPrivatePath)(configurationPath, 'file', security);
|
|
231
|
+
(0, private_state_js_1.assertPrivatePath)(credentialsPath, 'file', security);
|
|
232
|
+
const environment = (0, child_environment_js_1.sanitizeGovernedAwsChildEnvironment)(ambient);
|
|
233
|
+
for (const key of AMBIENT_CREDENTIAL_KEYS)
|
|
234
|
+
delete environment[key];
|
|
235
|
+
return {
|
|
236
|
+
...environment,
|
|
237
|
+
AWS_CONFIG_FILE: configurationPath,
|
|
238
|
+
AWS_DEFAULT_REGION: input.region,
|
|
239
|
+
AWS_PROFILE: CHILD_PROFILE,
|
|
240
|
+
AWS_REGION: input.region,
|
|
241
|
+
AWS_SDK_LOAD_CONFIG: '1',
|
|
242
|
+
AWS_SHARED_CREDENTIALS_FILE: credentialsPath,
|
|
243
|
+
};
|
|
244
|
+
},
|
|
245
|
+
cleanup() {
|
|
246
|
+
if (cleanupFiles())
|
|
247
|
+
process.removeListener('exit', onExit);
|
|
248
|
+
},
|
|
249
|
+
refresh,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=federated-credential-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"federated-credential-transport.js","sourceRoot":"","sources":["../../../../../../packages/nx/src/executors/local-deploy/federated-credential-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import type { ReadStream, WriteStream } from 'node:tty';
|
|
2
2
|
export interface LocalMutationApprovalRequest {
|
|
3
|
-
action: 'deploy'
|
|
3
|
+
action: 'deploy';
|
|
4
4
|
challenge: string;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
stage: 'development' | 'staging' | 'production';
|
|
5
|
+
sourceCommit: string;
|
|
6
|
+
stage: 'production' | 'staging';
|
|
8
7
|
}
|
|
9
8
|
export type LocalMutationApprover = (request: LocalMutationApprovalRequest) => Promise<boolean>;
|
|
10
9
|
export declare class LocalMutationApprovalUnavailableError extends Error {
|
|
@@ -14,10 +13,6 @@ interface LocalApprovalTerminal {
|
|
|
14
13
|
input: ReadStream;
|
|
15
14
|
output: WriteStream;
|
|
16
15
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Creates the public, non-secret operator acknowledgement used by deploy-local
|
|
19
|
-
* and refresh-local. This is an active-operator boundary, not an independent
|
|
20
|
-
* human-review claim: an authorized agent controlling a real TTY may answer it.
|
|
21
|
-
*/
|
|
16
|
+
/** Active operator acknowledgement, not an independent-review claim. */
|
|
22
17
|
export declare function createTtyLocalMutationApprover(terminal?: LocalApprovalTerminal): LocalMutationApprover;
|
|
23
18
|
export {};
|
|
@@ -5,16 +5,12 @@ exports.createTtyLocalMutationApprover = createTtyLocalMutationApprover;
|
|
|
5
5
|
const promises_1 = require("node:readline/promises");
|
|
6
6
|
class LocalMutationApprovalUnavailableError extends Error {
|
|
7
7
|
constructor() {
|
|
8
|
-
super('Local
|
|
8
|
+
super('Local protected-stage mutation requires an interactive TTY operated by a human or authorized agent.');
|
|
9
9
|
this.name = 'LocalMutationApprovalUnavailableError';
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
exports.LocalMutationApprovalUnavailableError = LocalMutationApprovalUnavailableError;
|
|
13
|
-
/**
|
|
14
|
-
* Creates the public, non-secret operator acknowledgement used by deploy-local
|
|
15
|
-
* and refresh-local. This is an active-operator boundary, not an independent
|
|
16
|
-
* human-review claim: an authorized agent controlling a real TTY may answer it.
|
|
17
|
-
*/
|
|
13
|
+
/** Active operator acknowledgement, not an independent-review claim. */
|
|
18
14
|
function createTtyLocalMutationApprover(terminal = {
|
|
19
15
|
input: process.stdin,
|
|
20
16
|
output: process.stderr,
|
|
@@ -29,7 +25,7 @@ function createTtyLocalMutationApprover(terminal = {
|
|
|
29
25
|
terminal: true,
|
|
30
26
|
});
|
|
31
27
|
try {
|
|
32
|
-
const response = await prompt.question(`Type ${challenge} to
|
|
28
|
+
const response = await prompt.question(`Type ${challenge} to continue: `);
|
|
33
29
|
return response === challenge;
|
|
34
30
|
}
|
|
35
31
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-approval.js","sourceRoot":"","sources":["../../../../../../packages/nx/src/executors/local-deploy/local-approval.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"local-approval.js","sourceRoot":"","sources":["../../../../../../packages/nx/src/executors/local-deploy/local-approval.ts"],"names":[],"mappings":";;;AA6BA,wEAwBC;AArDD,qDAAyD;AAczD,MAAa,qCAAsC,SAAQ,KAAK;IAC9D;QACE,KAAK,CACH,qGAAqG,CACtG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uCAAuC,CAAC;IACtD,CAAC;CACF;AAPD,sFAOC;AAOD,wEAAwE;AACxE,SAAgB,8BAA8B,CAC5C,WAAkC;IAChC,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB;IAED,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpD,MAAM,IAAI,qCAAqC,EAAE,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC;YAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAAS,gBAAgB,CAAC,CAAC;YAC1E,OAAO,QAAQ,KAAK,SAAS,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,qCAAqC,EAAE,CAAC;QACpD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,67 +1,82 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
2
|
-
import { GetParameterCommand, PutParameterCommand } from '@aws-sdk/client-ssm';
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
3
2
|
import { type ExecutorContext, type PromiseExecutor } from '@nx/devkit';
|
|
4
|
-
import { type
|
|
5
|
-
import {
|
|
3
|
+
import { type CanonicalDeploymentStage, type RepositoryOperatingPolicy } from '../../repository-policy/index.js';
|
|
4
|
+
import { attestProductionDatabaseLifecycle } from '../foundation-profile-preflight/production-database-safeguard.js';
|
|
5
|
+
import { createLocalFederatedCredentialTransport } from './federated-credential-transport.js';
|
|
6
6
|
import { type LocalMutationApprover } from './local-approval.js';
|
|
7
7
|
interface LocalDeployOptions {
|
|
8
|
-
action?: 'deploy' | 'refresh';
|
|
9
|
-
confirmation?: string;
|
|
10
8
|
expectedRoleArn: string;
|
|
11
|
-
phase?: 'foundation-bootstrap' | 'full-stage';
|
|
12
9
|
profile?: string;
|
|
13
10
|
stage: CanonicalDeploymentStage;
|
|
14
11
|
}
|
|
15
12
|
interface LocalDeployDependencies {
|
|
16
13
|
approve?: LocalMutationApprover;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
region: string;
|
|
22
|
-
stage: CanonicalDeploymentStage;
|
|
23
|
-
}) => Promise<LocalSstBackendAuthority>;
|
|
24
|
-
now?: () => Date;
|
|
25
|
-
run?: typeof spawnSync;
|
|
26
|
-
caller?: (region: string) => Promise<{
|
|
14
|
+
attestContainerBinding?: typeof attestLocalContainerBinding;
|
|
15
|
+
attestProductionDatabase?: typeof attestProductionDatabaseLifecycle;
|
|
16
|
+
createTransport?: typeof createLocalFederatedCredentialTransport;
|
|
17
|
+
identifyGithubCaller?: (region: string) => Promise<{
|
|
27
18
|
Account?: string;
|
|
28
19
|
Arn?: string;
|
|
29
20
|
}>;
|
|
21
|
+
now?: () => Date;
|
|
22
|
+
platform?: NodeJS.Platform;
|
|
23
|
+
run?: typeof spawnSync;
|
|
24
|
+
spawnChild?: typeof spawn;
|
|
30
25
|
}
|
|
31
|
-
interface
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
interface ProjectDescriptor {
|
|
27
|
+
name: string;
|
|
28
|
+
root: string;
|
|
29
|
+
tags: readonly string[];
|
|
30
|
+
targets: Readonly<Record<string, unknown>>;
|
|
35
31
|
}
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
interface ChildReceipt {
|
|
33
|
+
completedAt: string;
|
|
34
|
+
outcome: 'failed' | 'succeeded';
|
|
35
|
+
project: string;
|
|
36
|
+
startedAt: string;
|
|
37
|
+
target: 'container-release-amd64' | 'container-release-arm64' | 'container-release-assemble' | 'deploy' | 'production-database-final-postflight' | 'production-database-postflight' | 'profile-preflight' | 'release-candidate' | 'smoke-deployed';
|
|
38
|
+
}
|
|
39
|
+
export interface DeploymentReceipt {
|
|
38
40
|
account: string;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
actor: string;
|
|
42
|
+
authority: 'github' | 'local';
|
|
43
|
+
children: readonly ChildReceipt[];
|
|
44
|
+
completedAt: string;
|
|
45
|
+
frameworkVersion: string;
|
|
46
|
+
kind: 'ebk-deployment-receipt';
|
|
47
|
+
migrations: Readonly<Record<string, 'completed-by-deploy-target' | 'not-applicable'>>;
|
|
48
|
+
outcome: 'failed' | 'review-required' | 'succeeded';
|
|
49
|
+
profile: RepositoryOperatingPolicy['deploymentProfile'];
|
|
41
50
|
region: string;
|
|
51
|
+
schemaVersion: 1;
|
|
52
|
+
smoke: Readonly<Record<string, 'not-applicable' | 'passed'>>;
|
|
53
|
+
source: {
|
|
54
|
+
clean: boolean;
|
|
55
|
+
commit: string;
|
|
56
|
+
workingTreeDigest: string;
|
|
57
|
+
};
|
|
42
58
|
stage: CanonicalDeploymentStage;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
/** @internal */
|
|
55
|
-
export declare function localPlanSummaryDigest(input: {
|
|
56
|
-
action?: 'deploy' | 'refresh';
|
|
59
|
+
startedAt: string;
|
|
60
|
+
}
|
|
61
|
+
/** Bind a development deployment to the exact tracked diff and untracked
|
|
62
|
+
* source bytes without requiring a commit. Ignored caches and build output are
|
|
63
|
+
* intentionally outside this identity. */
|
|
64
|
+
export declare function localWorkingTreeDigest(root: string, run?: typeof spawnSync): {
|
|
65
|
+
clean: boolean;
|
|
66
|
+
commit: string;
|
|
67
|
+
digest: string;
|
|
68
|
+
};
|
|
69
|
+
declare function attestLocalContainerBinding(input: {
|
|
57
70
|
account: string;
|
|
58
|
-
|
|
59
|
-
phase: 'foundation-bootstrap' | 'full-stage';
|
|
60
|
-
plans: Readonly<Record<string, InfrastructurePlanV1>>;
|
|
71
|
+
project: ProjectDescriptor;
|
|
61
72
|
region: string;
|
|
73
|
+
root: string;
|
|
62
74
|
sourceCommit: string;
|
|
63
75
|
stage: CanonicalDeploymentStage;
|
|
64
|
-
}):
|
|
76
|
+
}): void;
|
|
77
|
+
/** Determine the one native deployment order. Foundation is always first and
|
|
78
|
+
* production Slice admission remains a committed policy decision. */
|
|
79
|
+
export declare function localDeploymentProjectOrder(policy: RepositoryOperatingPolicy, context: ExecutorContext, stage: CanonicalDeploymentStage): string[];
|
|
65
80
|
export declare function runLocalDeploy(options: LocalDeployOptions, context: ExecutorContext, dependencies?: LocalDeployDependencies): Promise<{
|
|
66
81
|
success: boolean;
|
|
67
82
|
}>;
|