@go-to-k/cdkd 0.284.63 → 0.284.65
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/dist/{asg-provider-B9V61Fbq.js → asg-provider-CNwOmQGg.js} +2 -2
- package/dist/{asg-provider-B9V61Fbq.js.map → asg-provider-CNwOmQGg.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-B-RuozdO.js → deploy-engine-52VBVCWI.js} +164 -20
- package/dist/deploy-engine-52VBVCWI.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/{program-alOnKpLV.js → program-BfK9a98r.js} +189 -268
- package/dist/{program-alOnKpLV.js.map → program-BfK9a98r.js.map} +1 -1
- package/dist/{version-Cmw63bLc.js → version-BtkYYOb6.js} +2 -2
- package/dist/{version-Cmw63bLc.js.map → version-BtkYYOb6.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-B-RuozdO.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as getLiveRenderer, d as generateResourceNameWithFallback, f as getCurrentStackName, h as withStackName, l as applyDefaultNameForFallback, n as getLogger, p as looksLikeCdkdGeneratedName, u as generateResourceName } from "./logger-zRrlbaQt.js";
|
|
2
|
-
import { t as getCdkdVersion } from "./version-
|
|
2
|
+
import { t as getCdkdVersion } from "./version-BtkYYOb6.js";
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
5
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -18844,7 +18844,7 @@ var CloudControlProvider = class {
|
|
|
18844
18844
|
if (context?.finalSnapshotIdentifier !== void 0) throw new ProvisioningError(`${logicalId} (${resourceType}) requires a final snapshot (DeletionPolicy: Snapshot), but the Cloud Control API delete route has no final-snapshot parameter. Re-run with --skip-final-snapshot after snapshotting manually, or retain the resource.`, resourceType, logicalId, physicalId);
|
|
18845
18845
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
18846
18846
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
18847
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
18847
|
+
const { ASGProvider } = await import("./asg-provider-CNwOmQGg.js").then((n) => n.n);
|
|
18848
18848
|
return await new ASGProvider().delete(logicalId, physicalId, resourceType, _properties, context);
|
|
18849
18849
|
}
|
|
18850
18850
|
const isProtectedEc2Instance = context?.removeProtection === true && resourceType === "AWS::EC2::Instance";
|
|
@@ -19878,9 +19878,147 @@ const DEFAULT_STATE_PREFIX = "cdkd";
|
|
|
19878
19878
|
*/
|
|
19879
19879
|
const CUSTOM_RESOURCE_RESPONSE_PREFIX = "custom-resource-responses";
|
|
19880
19880
|
|
|
19881
|
+
//#endregion
|
|
19882
|
+
//#region src/provisioning/masked-retry-logger.ts
|
|
19883
|
+
/**
|
|
19884
|
+
* The masker a caller supplied, or the identity function when it supplied
|
|
19885
|
+
* none.
|
|
19886
|
+
*
|
|
19887
|
+
* ABSENT MEANS UNMASKED, and that is the back-compatible default the contract
|
|
19888
|
+
* mandates — `create()` / `update()` are also reached from the import path,
|
|
19889
|
+
* from `cdkd drift --revert`, and from tests, and a provider must not care
|
|
19890
|
+
* which caller it got. Centralised here so no call site re-spells the `??`
|
|
19891
|
+
* and accidentally makes the capability required.
|
|
19892
|
+
*/
|
|
19893
|
+
function maskerOrIdentity(maskSecrets) {
|
|
19894
|
+
return maskSecrets ?? ((text) => text);
|
|
19895
|
+
}
|
|
19896
|
+
/**
|
|
19897
|
+
* A {@link RetryLogger} whose every line is routed through `maskSecrets`.
|
|
19898
|
+
*
|
|
19899
|
+
* `warn` is ALWAYS provided, never omitted. It is optional on `RetryLogger`,
|
|
19900
|
+
* and dropping it would silence the give-up summary on the calling path only —
|
|
19901
|
+
* trading a disclosure for the reporting hole issue #2018 closed. It goes
|
|
19902
|
+
* through the SAME mask as `debug` precisely because it is the line that
|
|
19903
|
+
* survives a run without `--verbose`; forwarding it unmasked would defeat the
|
|
19904
|
+
* fence at a HIGHER log level than the one the fence was written for.
|
|
19905
|
+
*
|
|
19906
|
+
* `logger` is typed structurally rather than as the concrete `Logger` so this
|
|
19907
|
+
* module stays a leaf and a test can pass two spies. That matches the
|
|
19908
|
+
* precedent already in the tree (`buildMfaConfigRequest` in
|
|
19909
|
+
* `cognito-provider.ts` takes an injected `logger?: { warn }`).
|
|
19910
|
+
*/
|
|
19911
|
+
function createMaskedRetryLogger(logger, maskSecrets) {
|
|
19912
|
+
const mask = maskerOrIdentity(maskSecrets);
|
|
19913
|
+
return {
|
|
19914
|
+
debug: (message) => logger.debug(mask(message)),
|
|
19915
|
+
warn: (message) => logger.warn(mask(message))
|
|
19916
|
+
};
|
|
19917
|
+
}
|
|
19918
|
+
/**
|
|
19919
|
+
* Depth cap for {@link maskDeep}.
|
|
19920
|
+
*
|
|
19921
|
+
* What it actually bounds is unbounded WORK on a pathologically deep bag — see
|
|
19922
|
+
* the rationale at the cap itself, which is the authority. It is NOT primarily
|
|
19923
|
+
* a cycle guard: a template-derived bag cannot be cyclic, so that justification
|
|
19924
|
+
* over-claims (issue #2176 security review). It does still terminate one, which
|
|
19925
|
+
* is why the walk is safe to share with a caller that might hand it something
|
|
19926
|
+
* other than a template bag.
|
|
19927
|
+
*
|
|
19928
|
+
* Deliberately generous. Every shape these warnings exist to describe is a
|
|
19929
|
+
* scalar, a list of scalars, or a small record, so the walk does not reach
|
|
19930
|
+
* depth 2 in practice.
|
|
19931
|
+
*/
|
|
19932
|
+
const MASK_WALK_MAX_DEPTH = 8;
|
|
19933
|
+
/**
|
|
19934
|
+
* What {@link maskDeep} substitutes for a subtree it declines to descend into.
|
|
19935
|
+
*
|
|
19936
|
+
* MUST equal `SECRET_MASK` in `src/deployment/secret-redaction.ts`. It is
|
|
19937
|
+
* spelled here rather than imported so this module keeps its single-import leaf
|
|
19938
|
+
* property (see the module note above); the two are fenced against drift by a
|
|
19939
|
+
* test that imports both.
|
|
19940
|
+
*/
|
|
19941
|
+
const MASK_WALK_DEPTH_CAP_MARKER = "***";
|
|
19942
|
+
/**
|
|
19943
|
+
* Mask every string LEAF and KEY of an arbitrary value, returning a structure
|
|
19944
|
+
* safe to `JSON.stringify` into a log line or an error message (issue
|
|
19945
|
+
* [#2176](https://github.com/go-to-k/cdkd/issues/2176)).
|
|
19946
|
+
*
|
|
19947
|
+
* THE ORDERING IS THE WHOLE POINT, and it is why masking the finished message
|
|
19948
|
+
* is not a substitute. `maskSecretsInText` matches by literal occurrence, so:
|
|
19949
|
+
*
|
|
19950
|
+
* 1. ESCAPING. `JSON.stringify` escapes `"`, `\` and newlines, so a secret
|
|
19951
|
+
* containing any of them no longer OCCURS in the stringified text and a
|
|
19952
|
+
* mask applied afterwards cannot find it. That is not an exotic case — it
|
|
19953
|
+
* is every Secrets Manager JSON document, the commonest real secret shape.
|
|
19954
|
+
* Measured on the pre-fix tree for #2176: a plaintext of
|
|
19955
|
+
* `{"user":"admin","pw":"hunter2"}` interpolated as
|
|
19956
|
+
* `${JSON.stringify(value)}` came through a message-level mask COMPLETELY
|
|
19957
|
+
* unchanged, while masking the leaves first rendered it `"***"`.
|
|
19958
|
+
* 2. LENGTH. A finished message is always longer than the value inside it, so
|
|
19959
|
+
* it can only ever reach `maskSecretsInText`'s SUBSTRING arm, which ignores
|
|
19960
|
+
* needles below `MIN_NEEDLE_LENGTH` (4). Handing the masker each RAW leaf
|
|
19961
|
+
* reaches the WHOLE-VALUE arm, which has no floor. Measured the same way: a
|
|
19962
|
+
* 3-character secret survived `Value 'abc' at 'pin' failed ...` intact.
|
|
19963
|
+
*
|
|
19964
|
+
* Neither pass subsumes the other, so providers do BOTH — this walk on the
|
|
19965
|
+
* value, and the assembled message through the masker as well. The masker is
|
|
19966
|
+
* idempotent, so the overlap is free.
|
|
19967
|
+
*
|
|
19968
|
+
* Keys are masked as well as values: `JSON.stringify` renders them into the
|
|
19969
|
+
* same line, so a resolved secret used as a map key would otherwise escape.
|
|
19970
|
+
*
|
|
19971
|
+
* WHY THIS LIVES HERE rather than as a private walk per provider. SIX
|
|
19972
|
+
* hand-rolled copies had already accumulated — `elbv2-provider.ts`,
|
|
19973
|
+
* `cognito-provider.ts`, `sns-topic-provider.ts`, `dynamodb-table-provider.ts`,
|
|
19974
|
+
* `dynamodb-globaltable-provider.ts` and `apigatewayv2-provider.ts` — and
|
|
19975
|
+
* `elbv2-provider.ts` carried the standing instruction that "a THIRD site is
|
|
19976
|
+
* the point at which this should move into `../masked-retry-logger.ts` ... and
|
|
19977
|
+
* all three converge on it". That trigger had fired and been missed twice over,
|
|
19978
|
+
* and the copies had already diverged exactly as predicted: FOUR of the six
|
|
19979
|
+
* carried NO depth cap at all.
|
|
19980
|
+
*
|
|
19981
|
+
* Worth recording how the last two were nearly missed AGAIN, because it is the
|
|
19982
|
+
* same failure one level up: the first sweep for this issue grepped for
|
|
19983
|
+
* `maskDeep` / `MASK_WALK_MAX_DEPTH` — the SPELLINGS the known copies used —
|
|
19984
|
+
* and the two survivors spell it `maskLeaf` / `maskLeafValue` with no named
|
|
19985
|
+
* constant. Grep for the SHAPE, not the name. These copies encode a security
|
|
19986
|
+
* contract, and a hardening applied to one silently leaves the others behind.
|
|
19987
|
+
*/
|
|
19988
|
+
function maskDeep(value, mask, depth = 0) {
|
|
19989
|
+
if (typeof value === "string") return mask(value);
|
|
19990
|
+
if (depth >= 8) return "***";
|
|
19991
|
+
if (Array.isArray(value)) return value.map((entry) => maskDeep(entry, mask, depth + 1));
|
|
19992
|
+
if (value !== null && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([k, v]) => [mask(k), maskDeep(v, mask, depth + 1)]));
|
|
19993
|
+
return value;
|
|
19994
|
+
}
|
|
19995
|
+
|
|
19881
19996
|
//#endregion
|
|
19882
19997
|
//#region src/provisioning/providers/custom-resource-provider.ts
|
|
19883
19998
|
/**
|
|
19999
|
+
* The DELETE path threads NO masker (issue #2178).
|
|
20000
|
+
*
|
|
20001
|
+
* `DeleteContext` carries no masker by the `SecretMaskingContext` contract — a
|
|
20002
|
+
* delete's payload is a physical id rather than a resolved property bag — so
|
|
20003
|
+
* there is no capability to thread here.
|
|
20004
|
+
*
|
|
20005
|
+
* This is deliberately `undefined` and NOT `maskerOrIdentity(undefined)`, which
|
|
20006
|
+
* is what it was until the review of this change. An identity function typed
|
|
20007
|
+
* `MaskerFn` is a masker that fences nothing, and issue
|
|
20008
|
+
* [#2007](https://github.com/go-to-k/cdkd/issues/2007) records why that is
|
|
20009
|
+
* WORSE than no masker at all: its presence stops the next author looking. The
|
|
20010
|
+
* critic now REFUSES an identity-bound masker (see
|
|
20011
|
+
* `scripts/check-provider-secret-mask.ts`), so this spelling is the only one
|
|
20012
|
+
* that both compiles and states the truth — and the message site it feeds is
|
|
20013
|
+
* recorded in that critic's `EXEMPT` list, where it is counted and re-audited
|
|
20014
|
+
* on every run rather than hidden inside the masked count.
|
|
20015
|
+
*
|
|
20016
|
+
* `src/types/resource.ts` requires the capability to be THREADED before a
|
|
20017
|
+
* delete-path message may claim to mask; retiring this constant is that work,
|
|
20018
|
+
* not a rename.
|
|
20019
|
+
*/
|
|
20020
|
+
const DELETE_PATH_UNMASKED = void 0;
|
|
20021
|
+
/**
|
|
19884
20022
|
* The short `ResourceDeleteResult.reason` the no-properties DELETE arm reports
|
|
19885
20023
|
* (issue [#1770](https://github.com/go-to-k/cdkd/issues/1770)).
|
|
19886
20024
|
*
|
|
@@ -20012,12 +20150,15 @@ function isCustomResourceResponsePayload(value) {
|
|
|
20012
20150
|
/**
|
|
20013
20151
|
* Parse Lambda response payload with type safety
|
|
20014
20152
|
*/
|
|
20015
|
-
function parseLambdaPayload(payloadBytes) {
|
|
20153
|
+
function parseLambdaPayload(payloadBytes, mask) {
|
|
20016
20154
|
if (!payloadBytes) return {};
|
|
20017
20155
|
const payloadString = Buffer.from(payloadBytes).toString();
|
|
20018
20156
|
if (!payloadString || payloadString === "null" || payloadString === "\"\"") return {};
|
|
20019
20157
|
const parsed = JSON.parse(payloadString);
|
|
20020
|
-
if (!isCustomResourceResponsePayload(parsed))
|
|
20158
|
+
if (!isCustomResourceResponsePayload(parsed)) {
|
|
20159
|
+
if (mask === void 0) throw new Error(`Invalid Lambda response payload format: ${JSON.stringify(parsed)}`);
|
|
20160
|
+
throw new Error(`Invalid Lambda response payload format: ${JSON.stringify(maskDeep(parsed, mask))}`);
|
|
20161
|
+
}
|
|
20021
20162
|
return parsed;
|
|
20022
20163
|
}
|
|
20023
20164
|
/**
|
|
@@ -20683,7 +20824,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20683
20824
|
/**
|
|
20684
20825
|
* Create a custom resource by invoking its Lambda handler
|
|
20685
20826
|
*/
|
|
20686
|
-
async create(logicalId, resourceType, properties) {
|
|
20827
|
+
async create(logicalId, resourceType, properties, context) {
|
|
20687
20828
|
this.logger.debug(`Creating custom resource ${logicalId} (${resourceType})`);
|
|
20688
20829
|
const serviceToken = properties["ServiceToken"];
|
|
20689
20830
|
if (!serviceToken) throw new ProvisioningError(`ServiceToken is required for custom resource ${logicalId}`, resourceType, logicalId);
|
|
@@ -20697,7 +20838,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20697
20838
|
LogicalResourceId: logicalId,
|
|
20698
20839
|
StackId: invocation.stackId,
|
|
20699
20840
|
ResourceProperties: this.stringifyProperties(properties)
|
|
20700
|
-
}));
|
|
20841
|
+
}), maskerOrIdentity(context?.maskSecrets));
|
|
20701
20842
|
if (cfnResponse.Status === "FAILED") throw new Error(`Custom resource handler returned FAILED: ${cfnResponse.Reason || "Unknown reason"}`);
|
|
20702
20843
|
const physicalId = cfnResponse.PhysicalResourceId || logicalId;
|
|
20703
20844
|
const attributes = cfnResponse.Data || {};
|
|
@@ -20714,7 +20855,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20714
20855
|
/**
|
|
20715
20856
|
* Update a custom resource by invoking its Lambda handler
|
|
20716
20857
|
*/
|
|
20717
|
-
async update(logicalId, physicalId, resourceType, properties, previousProperties) {
|
|
20858
|
+
async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
|
|
20718
20859
|
this.logger.debug(`Updating custom resource ${logicalId}: ${physicalId} (${resourceType})`);
|
|
20719
20860
|
const serviceToken = properties["ServiceToken"];
|
|
20720
20861
|
if (!serviceToken) throw new ProvisioningError(`ServiceToken is required for custom resource ${logicalId}`, resourceType, logicalId, physicalId);
|
|
@@ -20730,7 +20871,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20730
20871
|
StackId: invocation.stackId,
|
|
20731
20872
|
ResourceProperties: this.stringifyProperties(properties),
|
|
20732
20873
|
OldResourceProperties: this.stringifyProperties(previousProperties)
|
|
20733
|
-
}));
|
|
20874
|
+
}), maskerOrIdentity(context?.maskSecrets));
|
|
20734
20875
|
if (cfnResponse.Status === "FAILED") throw new Error(`Custom resource handler returned FAILED: ${cfnResponse.Reason || "Unknown reason"}`);
|
|
20735
20876
|
const newPhysicalId = cfnResponse.PhysicalResourceId || physicalId;
|
|
20736
20877
|
const wasReplaced = newPhysicalId !== physicalId;
|
|
@@ -20781,7 +20922,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20781
20922
|
PhysicalResourceId: physicalId,
|
|
20782
20923
|
StackId: invocation.stackId,
|
|
20783
20924
|
ResourceProperties: this.stringifyProperties(properties)
|
|
20784
|
-
}));
|
|
20925
|
+
}), DELETE_PATH_UNMASKED);
|
|
20785
20926
|
if (cfnResponse.Status === "FAILED") {
|
|
20786
20927
|
this.logger.warn(`Custom resource delete handler returned FAILED for ${logicalId}: ${cfnResponse.Reason || "Unknown reason"}. The handler reported that it did NOT delete, so anything this custom resource manages is LEFT IN PLACE — cdkd is KEEPING the state record and the run exits non-zero. ${CR_SKIP_NOT_A_RETRY_CAVEAT} ('cdkd deploy' also accepts --allow-unaddressed, which forces exit 0; 'cdkd destroy' has no such flag.) ${DEPLOY_SKIP_CAVEAT}`);
|
|
20787
20928
|
return {
|
|
@@ -20879,7 +21020,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20879
21020
|
* (create / update throw; delete warns and returns `'skipped'` — issue
|
|
20880
21021
|
* #2054, which replaced its warn-and-continue).
|
|
20881
21022
|
*/
|
|
20882
|
-
async invokeCustomResourceWithRetry(serviceToken, logicalId, operation, buildRequest) {
|
|
21023
|
+
async invokeCustomResourceWithRetry(serviceToken, logicalId, operation, buildRequest, mask) {
|
|
20883
21024
|
const watch = startInterruptWatch(`Custom resource ${logicalId}`);
|
|
20884
21025
|
try {
|
|
20885
21026
|
const stackId = await this.resolveSyntheticStackId(logicalId);
|
|
@@ -20899,7 +21040,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
20899
21040
|
this.logger.debug(`Sending custom resource ${operation.toLowerCase()} request: ${serviceToken}`);
|
|
20900
21041
|
const sent = await this.sendRequest(serviceToken, request, invocation.responseKey, logicalId, operation, () => {
|
|
20901
21042
|
delivered = true;
|
|
20902
|
-
});
|
|
21043
|
+
}, mask);
|
|
20903
21044
|
cfnResponse = sent.response;
|
|
20904
21045
|
logResult = sent.logResult;
|
|
20905
21046
|
} catch (error) {
|
|
@@ -21101,7 +21242,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
21101
21242
|
* (the IAM-propagation class this arm exists for) means the handler never ran,
|
|
21102
21243
|
* and treating that as delivered would leave the reported failure single-shot.
|
|
21103
21244
|
*/
|
|
21104
|
-
async sendRequest(serviceToken, request, responseKey, logicalId, operation, onDelivered) {
|
|
21245
|
+
async sendRequest(serviceToken, request, responseKey, logicalId, operation, onDelivered, mask) {
|
|
21105
21246
|
if (this.isSnsServiceToken(serviceToken)) {
|
|
21106
21247
|
this.logger.debug(`ServiceToken is SNS topic, publishing to: ${serviceToken}`);
|
|
21107
21248
|
await this.publishToSns(serviceToken, request);
|
|
@@ -21112,7 +21253,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
21112
21253
|
const invokeResponse = await this.invokeLambda(serviceToken, request);
|
|
21113
21254
|
onDelivered();
|
|
21114
21255
|
return {
|
|
21115
|
-
response: await this.getCustomResourceResponse(invokeResponse, responseKey, logicalId, operation),
|
|
21256
|
+
response: await this.getCustomResourceResponse(invokeResponse, responseKey, logicalId, operation, mask),
|
|
21116
21257
|
...invokeResponse.LogResult === void 0 ? {} : { logResult: invokeResponse.LogResult }
|
|
21117
21258
|
};
|
|
21118
21259
|
}
|
|
@@ -21230,7 +21371,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
21230
21371
|
* 2. If Lambda returned a payload with PhysicalResourceId → use it (simple handler)
|
|
21231
21372
|
* 3. Otherwise, poll S3 for the response (cfn-response via ResponseURL)
|
|
21232
21373
|
*/
|
|
21233
|
-
async getCustomResourceResponse(lambdaResponse, responseKey, logicalId, operation) {
|
|
21374
|
+
async getCustomResourceResponse(lambdaResponse, responseKey, logicalId, operation, mask) {
|
|
21234
21375
|
if (lambdaResponse.FunctionError) {
|
|
21235
21376
|
const errorPayload = lambdaResponse.Payload ? Buffer.from(lambdaResponse.Payload).toString() : "Unknown";
|
|
21236
21377
|
const logTail = decodeInvokeLogTail(lambdaResponse.LogResult);
|
|
@@ -21239,7 +21380,7 @@ var CustomResourceProvider = class CustomResourceProvider {
|
|
|
21239
21380
|
}
|
|
21240
21381
|
let hasDirectPayload = false;
|
|
21241
21382
|
try {
|
|
21242
|
-
const payload = parseLambdaPayload(lambdaResponse.Payload);
|
|
21383
|
+
const payload = parseLambdaPayload(lambdaResponse.Payload, mask);
|
|
21243
21384
|
if ("Status" in payload && (payload["Status"] === "SUCCESS" || payload["Status"] === "FAILED")) {
|
|
21244
21385
|
this.logger.debug(`Got direct cfn-response from Lambda for ${logicalId}`);
|
|
21245
21386
|
await this.cleanupResponseObject(responseKey);
|
|
@@ -25148,9 +25289,12 @@ function exportAliasCollisionWarning(outputKey, exportName) {
|
|
|
25148
25289
|
* {@link collectDeclaredOutputNames}.
|
|
25149
25290
|
*/
|
|
25150
25291
|
function exportAliasCollisionScrubWarning(outputKey, exportName, secrets) {
|
|
25151
|
-
const
|
|
25152
|
-
|
|
25153
|
-
|
|
25292
|
+
const mask = (name) => {
|
|
25293
|
+
const exposure = secretsPresentIn(name, secrets);
|
|
25294
|
+
return stripControlChars(exposure ? maskEveryOccurrence(name, exposure) : name);
|
|
25295
|
+
};
|
|
25296
|
+
const shown = mask(exportName);
|
|
25297
|
+
return `Output ${mask(outputKey)} exports as "${shown}", which is also the name of another output in this stack — state cannot say which of the two the stored value under "${shown}" came from, so that key is redacted by value match instead of by template position, and two references resolving to the same value could still collapse there. Rename the export, or the colliding output, and redeploy.`;
|
|
25154
25298
|
}
|
|
25155
25299
|
|
|
25156
25300
|
//#endregion
|
|
@@ -30399,5 +30543,5 @@ var DeployEngine = class {
|
|
|
30399
30543
|
};
|
|
30400
30544
|
|
|
30401
30545
|
//#endregion
|
|
30402
|
-
export {
|
|
30403
|
-
//# sourceMappingURL=deploy-engine-
|
|
30546
|
+
export { maskerOrIdentity as $, findLargeInlineResources as $n, TemplateParser as $t, renderStatefulReason as A, formatDockerLoginError as An, StackHasActiveImportsError as Ar, STATE_SOURCED_READBACK_RULES as At, exportAliasCollisionScrubWarning as B, getLegacyStateBucketName as Bn, isThrottlingError as Br, classifyReplaySecretRegion as Bt, isFinalSnapshotError as C, parseBootstrapMarker as Cn, LockError as Cr, configStringRefusal as Ct, extractDeploymentEventError as D, buildDenyExternalAccessPolicy as Dn, ProvisioningError as Dr, requireConfigObject as Dt, makeCanonicalizePropertiesFn as E, validateContainerRepoName as En, PartialFailureError as Er, requireConfigArray as Et, green as F, AssetManifestLoader as Fn, isCdkdError as Fr, isSingleDynamicReferenceToken as Ft, IAMRoleProvider as G, resolveStateBucketWithDefault as Gn, s3BucketRegionalDomainName as Gt, secretBearingStateKeyWarning as H, resolveAutoAssetStorage as Hn, __exportAll as Hr, s3BucketArn as Ht, red as I, getDockerImageBySourceHash as In, normalizeAwsError as Ir, maskSecretsInError as It, ProviderRegistry as J, stateBucketExistenceConfirmed as Jn, DiffCalculator as Jt, collectInlinePolicyNamesManagedBySiblings as K, resolveStateBucketWithDefaultAndSource as Kn, s3BucketWebsiteUrl as Kt, yellow as L, Synthesizer as Ln, withErrorHandling as Lr, maskSecretsInText as Lt, bold as M, partitionSensitiveEnv as Mn, StateError as Mr, createSecretMasker as Mt, cyan as N, runDockerForeground as Nn, SynthesisError as Nr, dynamicReferenceTokens as Nt, MULTI_REGION_RECREATE_BLOCKED_TYPES as O, buildDockerImage as On, ResourceTimeoutError as Or, requireConfigString as Ot, gray as P, runDockerStreaming as Pn, formatError as Pr, errorCauseChain as Pt, maskDeep as Q, MIGRATE_TMP_PREFIX as Qn, DagBuilder as Qt, collectDeclaredOutputNames as R, synthesisStatusMessage as Rn, isMarkedNonRetryable as Rr, redactSecretsForState as Rt, createPreDeleteFinalSnapshot as S, isCrossRegionRedirect as Sn, LocalStartServiceError as Sr, configBooleanRefusal as St, unsupportedFinalSnapshotError as T, validateAssetBucketName as Tn, NestedStackChildDirectDestroyError as Tr, replayWarn as Tt, stateKeySecretExposure as U, resolveCaptureObservedState as Un, s3BucketDomainName as Ut, isExportAliasCollision as V, resolveApp as Vn, markNonRetryable as Vr, producerRegionsFromState as Vt, getCurrentResourceSecrets as W, resolveSkipPrefix as Wn, s3BucketDualStackDomainName as Wt, findSilentDropProperties as X, CFN_TEMPLATE_BODY_LIMIT as Xn, describeTypeWithThrottleRetry as Xt, findActionableSilentDrops as Y, warnDeprecatedNoPrefixCliFlag as Yn, INTRINSIC_KEYS as Yt, createMaskedRetryLogger as Z, CFN_TEMPLATE_URL_LIMIT as Zn, withRetry as Zt, computeImplicitDeleteEdges as _, AssetModeResolver as _n, DependencyError as _r, WAFv2WebACLProvider as _t, DeploymentEventsStore as a, importableOutputKeys as an, AssemblyReader as ar, isInterruptedWaitError as at, buildFinalSnapshotIdentifier as b, ensureAssetStorage as bn, LocalInvokeBuildError as br, assertRegionMatch as bt, replayFailedOperations as c, AssetPublisher as cn, resolveBucketRegion as cr, slowCcOperationTimeoutMs as ct, updatePartialReason as d, buildAssetRedirectMap as dn, resetAwsClients as dr, IntrinsicFunctionResolver as dt, LockManager as en, uploadCfnTemplate as er, CUSTOM_RESOURCE_RESPONSE_PREFIX as et, UNSPECIFIED_SKIP_REASON as f, createAssetRedirectResolver as fn, setAwsClients as fr, carriesDynamicReference as ft, IMPLICIT_DELETE_DEPENDENCIES as g, stripControlChars as gn, CrossAccountSecretRefusalError as gr, refStateLookupFromResource as gt, maskingRetryLogger as h, escapeRegExp$1 as hn, ConfigError as hr, parameterTypeMayLoseSecretIdentity as ht, DeploymentEventsReader as i, exportNamesCarriedFrom as in, derivePartitionAndUrlSuffix as ir, interruptWatchListenerCount as it, formatResourceLine as j, getDockerCmd as jn, StackTerminationProtectionError as jr, TEMPLATE_SOURCED_RULES as jt, isStatefulRecreateTargetSync as k, dockerSpawnEnvWithSensitive as kn, ResourceUpdateNotSupportedError as kr, STATE_SOURCED_CROSS_GENERATION_RULES as kt, replayRollback as l, stringifyValue as ln, AwsClients as lr, disableInstanceApiTermination as lt, withResourceDeadline as m, rewriteTemplateAssetReferences as mn, CdkdError as mr, getAccountInfo as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, S3StateBackend as nn, PARTITION_TABLE as nr, beginCommandInterruptScope as nt, planFailedOps as o, importableOutputs as on, processStackMessages as or, startInterruptWatch as ot, deleteSkipReason as p, loadPublishableAssetManifest as pn, AssetError as pr, cfnRefValueFromPhysicalId as pt, clearOnUpdateRemoval as q, resolveUseCdkBootstrapAssets as qn, applyRoleArnIfSet as qt, DeployEngine as r, rebuildClientForBucketRegion as rn, canonicalizeRegion as rr, endCommandInterruptScope as rt, planRollback as s, shouldRetainResource as sn, clearBucketRegionCache as sr, CloudControlProvider as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, displaySafe as tn, expectedOwnerParam as tr, DEFAULT_STATE_PREFIX as tt, updatePartialMessage as u, WorkGraph as un, getAwsClients as ur, isTerminationProtectionPropagationError as ut, ATOMIC_FINAL_SNAPSHOT_TYPES as v, BOOTSTRAP_MARKER_PREFIX as vn, DeployCancelledError as vr, normalizeAwsTagsToCfn as vt, refusesFinalSnapshot as w, readBootstrapMarkerBody as wn, MissingCdkCliError as wr, readConfigString as wt, ccRoutedFinalSnapshotError as x, getBootstrapMarkerKey as xn, LocalMigrateError as xr, coerceCfnBoolean as xt, PRE_DELETE_SNAPSHOT_TYPES as y, assertAssetBucketRegion as yn, DynamicReferenceRegionAmbiguousError as yr, resolveExplicitPhysicalId as yt, collectPublishedOutputNames as z, getDefaultStateBucketName as zn, isRetryableTransientError as zr, scrubResourceRecord as zt };
|
|
30547
|
+
//# sourceMappingURL=deploy-engine-52VBVCWI.js.map
|