@go-to-k/cdkd 0.291.3 → 0.291.4

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.
@@ -1,6 +1,6 @@
1
1
  import { C as displayAwsMessage, D as truncateCodePoints, E as isPasteableIdent, S as UNRENDERABLE, T as displaySafe, d as applyDefaultNameForFallback, f as explicitNamePropertyFor, g as looksLikeCdkdGeneratedName, h as getCurrentStackName, m as generateResourceNameWithFallback, n as getLogger, p as generateResourceName, r as isStdoutReservedForPayload, s as getLiveRenderer, v as withStackName, w as displayIdent, x as STACK_REF_MAX_CODE_POINTS, y as withoutGeneratedFallbackName } from "./logger-GASr9bAF.js";
2
2
  import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-BoIxyCir.js";
3
- import { t as getCdkdVersion } from "./version-BKm47b9j.js";
3
+ import { t as getCdkdVersion } from "./version-ChuDKy_E.js";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
5
  import { createHash, randomUUID } from "node:crypto";
6
6
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -3330,6 +3330,53 @@ function processStackMessages(stacks, logger, options = {}) {
3330
3330
  if (hasWarnings && failAt === "warn") throw new SynthesisError("Found warnings (--strict mode)");
3331
3331
  }
3332
3332
 
3333
+ //#endregion
3334
+ //#region src/utils/glob-match.ts
3335
+ /**
3336
+ * Whether `subject` matches the glob `pattern`, where `*` matches any run of
3337
+ * characters (the empty run included) and EVERY other character is literal.
3338
+ *
3339
+ * The one answer to "what does a stack-selection pattern mean", shared by
3340
+ * `stackMatchesPattern` (`src/cli/stack-matcher.ts`) and the failed-Stage
3341
+ * attribution in `src/synthesis/failed-stages.ts`, so the two cannot disagree
3342
+ * ([#3508](https://github.com/go-to-k/cdkd/issues/3508)). An import-free LEAF,
3343
+ * so both layers may import it.
3344
+ *
3345
+ * **Never a RegExp.** Both sites used to expand `*` into `.*` and compile the
3346
+ * result, which had two defects: a pattern with several `*` separated by
3347
+ * literals backtracked EXPONENTIALLY in the length of the subject (a stack
3348
+ * name or Stage path from the Cloud Assembly), and the other characters were
3349
+ * live regex syntax only when the pattern held a `*` — `My.Stage*` matched
3350
+ * `MyXStage1` while `My.Stage` matched only itself, and `My(Stage*` threw a
3351
+ * `SyntaxError`.
3352
+ *
3353
+ * The walk anchors the text before the first `*` at the start and the text
3354
+ * after the last `*` at the end, then places each middle segment at its
3355
+ * LEFTMOST occurrence after the previous one. Leftmost placement is optimal
3356
+ * when `*` is the only wildcard — any later placement leaves strictly less room
3357
+ * for the segments after it — so no backtracking is needed. The cost is one
3358
+ * `indexOf` per segment, O(|subject| x |pattern|) in the worst case:
3359
+ * polynomial, where the RegExp was exponential.
3360
+ */
3361
+ function globMatches(pattern, subject) {
3362
+ const segments = pattern.split("*");
3363
+ if (segments.length === 1) return pattern === subject;
3364
+ const head = segments[0];
3365
+ const tail = segments[segments.length - 1];
3366
+ if (subject.length < head.length + tail.length) return false;
3367
+ if (!subject.startsWith(head) || !subject.endsWith(tail)) return false;
3368
+ const end = subject.length - tail.length;
3369
+ let cursor = head.length;
3370
+ for (let i = 1; i < segments.length - 1; i++) {
3371
+ const segment = segments[i];
3372
+ if (segment === "") continue;
3373
+ const at = subject.indexOf(segment, cursor);
3374
+ if (at === -1 || at + segment.length > end) return false;
3375
+ cursor = at + segment.length;
3376
+ }
3377
+ return true;
3378
+ }
3379
+
3333
3380
  //#endregion
3334
3381
  //#region src/synthesis/failed-stages.ts
3335
3382
  /**
@@ -3431,29 +3478,7 @@ function patternTargetsStage(pattern, stagePath) {
3431
3478
  const patternSegments = pattern.split("/");
3432
3479
  const stageSegments = stagePath.split("/");
3433
3480
  if (patternSegments.length < stageSegments.length) return false;
3434
- return stageSegments.every((segment, i) => segmentMatches(patternSegments[i], segment));
3435
- }
3436
- /**
3437
- * Wildcard-aware comparison of ONE path segment, matching how
3438
- * `stackMatchesPattern` expands `*` in `src/cli/stack-matcher.ts`. The pattern
3439
- * is the USER's own input, not an assembly-supplied value, so it is expanded
3440
- * there the same way — metacharacters and all, so the two cannot disagree
3441
- * about what a pattern means.
3442
- *
3443
- * The construction is guarded because SPLITTING on `/` can make an invalid
3444
- * segment out of a valid pattern (`'(*x/y*)'` splits into `'(*x'`), and this
3445
- * helper runs when the stack list is EMPTY, which is exactly when
3446
- * `stackMatchesPattern` never evaluates and therefore never raises first. An
3447
- * unusable pattern is simply not attributed: the note still prints, hedged,
3448
- * instead of a `SyntaxError` replacing the message the user needed.
3449
- */
3450
- function segmentMatches(patternSegment, segment) {
3451
- if (!patternSegment.includes("*")) return patternSegment === segment;
3452
- try {
3453
- return new RegExp("^" + patternSegment.replace(/\*/g, ".*") + "$").test(segment);
3454
- } catch {
3455
- return false;
3456
- }
3481
+ return stageSegments.every((segment, i) => globMatches(patternSegments[i], segment));
3457
3482
  }
3458
3483
 
3459
3484
  //#endregion
@@ -3750,7 +3775,7 @@ var ContextStore = class {
3750
3775
  this.logger.debug(`Skipping transient context value for key: ${key}`);
3751
3776
  continue;
3752
3777
  }
3753
- existing[key] = value;
3778
+ defineOwnKey(existing, key, value);
3754
3779
  }
3755
3780
  writeFileSync(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
3756
3781
  this.logger.debug(`Saved ${Object.keys(updates).length} context value(s) to cdk.context.json`);
@@ -4450,7 +4475,7 @@ var ContextProviderRegistry = class {
4450
4475
  * @returns Map of context key → resolved value
4451
4476
  */
4452
4477
  async resolve(missing) {
4453
- const results = {};
4478
+ const results = nullPrototypeRecord();
4454
4479
  for (const entry of missing) {
4455
4480
  const provider = this.providers.get(entry.provider);
4456
4481
  const shownProvider = displaySafe(entry.provider);
@@ -18325,12 +18350,12 @@ var TemplateParser = class {
18325
18350
  const resources = t["Resources"];
18326
18351
  for (const [logicalId, resource] of Object.entries(resources)) {
18327
18352
  if (typeof resource !== "object" || resource === null) {
18328
- this.logger.error(`Resource ${logicalId} is not an object`);
18353
+ this.logger.error(`Resource ${displaySafe(logicalId)} is not an object`);
18329
18354
  return false;
18330
18355
  }
18331
18356
  const r = resource;
18332
18357
  if (!("Type" in r) || typeof r["Type"] !== "string") {
18333
- this.logger.error(`Resource ${logicalId} missing Type or Type is not a string`);
18358
+ this.logger.error(`Resource ${displaySafe(logicalId)} missing Type or Type is not a string`);
18334
18359
  return false;
18335
18360
  }
18336
18361
  }
@@ -18387,7 +18412,7 @@ var TemplateParser = class {
18387
18412
  for (const [logicalId, resource] of Object.entries(template.Resources)) {
18388
18413
  const conditionName = resource.Condition;
18389
18414
  if (conditionName !== void 0 && Object.hasOwn(conditions, conditionName) && conditions[conditionName] === false) {
18390
- this.logger.debug(`Excluding resource ${logicalId} — condition ${conditionName} is false`);
18415
+ this.logger.debug(`Excluding resource ${displaySafe(logicalId)} — condition ${displaySafe(conditionName)} is false`);
18391
18416
  continue;
18392
18417
  }
18393
18418
  if (logicalId === "__proto__") Object.defineProperty(filteredResources, logicalId, {
@@ -20383,14 +20408,11 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
20383
20408
  "UserPoolTags",
20384
20409
  "UserPoolTier",
20385
20410
  "VerificationMessageTemplate",
20411
+ "WebAuthnFactorConfiguration",
20386
20412
  "WebAuthnRelyingPartyID",
20387
20413
  "WebAuthnUserVerification"
20388
20414
  ]),
20389
- silentDrop: /* @__PURE__ */ new Map([
20390
- ["IssuerConfiguration", "not yet implemented by cdkd"],
20391
- ["KeyConfiguration", "not yet implemented by cdkd"],
20392
- ["WebAuthnFactorConfiguration", "No wire path in the PINNED SDK (@aws-sdk/client-cognito-identity-provider 3.1018.0): WebAuthnConfigurationType is {RelyingPartyId?, UserVerification?} and no CreateUserPool/UpdateUserPool field accepts SINGLE_FACTOR | MULTI_FACTOR_WITH_USER_VERIFICATION. This is an SDK-VERSION limit, NOT an API one -- the live API does honour FactorConfiguration (measured us-east-1 2026-08-20: SetUserPoolMfaConfig(ON) on a pool allowing WEB_AUTHN as a first auth factor is rejected with \"Cannot set WebAuthn factor configuration to SINGLE_FACTOR if MFA is required and WebAuthn is an allowed first auth factor\", i.e. the service reads a field the SDK cannot send). RE-EVALUATE THIS ENTRY ON AN SDK BUMP: if WebAuthnConfigurationType gains FactorConfiguration, the property becomes handleable and this entry must go"]
20393
- ]),
20415
+ silentDrop: /* @__PURE__ */ new Map([["IssuerConfiguration", "not yet implemented by cdkd"], ["KeyConfiguration", "not yet implemented by cdkd"]]),
20394
20416
  createOnlyDrops: /* @__PURE__ */ new Set()
20395
20417
  }],
20396
20418
  ["AWS::DLM::LifecyclePolicy", {
@@ -22698,10 +22720,31 @@ function repairMalformedResourcesForReadOnly(state) {
22698
22720
  * documents `2` as "PARTIAL — journal kept, idempotent re-run", so a `2` here
22699
22721
  * would tell an operator to re-run a command that attempted nothing.
22700
22722
  */
22701
- function malformedStateRefusalMessage(rawStackName, rawRegion) {
22723
+ function malformedStateRefusalMessage(rawStackName, rawRegion, recovery) {
22702
22724
  const stackName = absentIfEmpty(rawStackName);
22703
22725
  const region = absentIfEmpty(rawRegion);
22704
- return `${malformedStateDiagnosis(stackName, region)} This command can WRITE state, so it refuses rather than continuing: saving over a record whose resource map could not be read would replace the evidence with a well-formed empty one and lose it permanently. Repair or remove the record first. Inspect it with: ${inspectCommand(stackName, region)}`;
22726
+ return inspectTail(`${malformedStateDiagnosis(stackName, region)} This command can WRITE state, so it refuses rather than continuing: saving over a record whose resource map could not be read would replace the evidence with a well-formed empty one and lose it permanently. Repair or remove the record first.`, stackName, region, recovery);
22727
+ }
22728
+ /**
22729
+ * How a READ-ONLY remedy ends a single-command message: on
22730
+ * `Inspect it with: <inspectCommand>` — unless the record is a region-less
22731
+ * LEGACY one, which that command cannot read (go-to-k/cdkd#3388).
22732
+ *
22733
+ * A KNOWN stack with NO region is what `cdkd orphan` hands for a legacy
22734
+ * `<prefix>/<stack>/state.json` listed with no region, and `cdkd state show`
22735
+ * refuses such a record with or without `--stack-region`, so ending on it hands
22736
+ * the operator a dead end. That arm names the S3 object instead, through
22737
+ * {@link orphanInspectClause}, which already owns the shape (the object path
22738
+ * gated on the name rendering exactly, the real prefix and bucket when
22739
+ * `recovery` carries them, one location per trailing line).
22740
+ *
22741
+ * Every other identity keeps the command, so a region-keyed record's text is
22742
+ * byte-identical to what it was.
22743
+ */
22744
+ function inspectTail(prose, stackName, region, recovery) {
22745
+ if (stackName === void 0 || region !== void 0) return `${prose} Inspect it with: ${inspectCommand(stackName, region)}`;
22746
+ const legacy = orphanInspectClause(stackName, void 0, recovery);
22747
+ return [`${prose} ${legacy.sentence ?? ""}`.trimEnd(), ...legacy.locations ?? []].join("\n");
22705
22748
  }
22706
22749
  /**
22707
22750
  * The destructive template, in the three messages that offer one.
@@ -22746,7 +22789,7 @@ const DROP_RECORD_LINE = `Drop the record: ${DROP_RECORD_TEMPLATE}`;
22746
22789
  * identity here.
22747
22790
  */
22748
22791
  function mayNameTargetWithDestructiveRemedy(stackName, region) {
22749
- return safeStackName(stackName) === stackName && safeRegion(region) === region && isPasteableIdent(stackName) && isPasteableIdent(region);
22792
+ return rendersExactly(stackName) && rendersExactly(region, SHORT_NAME_MAX_CODE_POINTS) && isPasteableIdent(stackName) && isPasteableIdent(region);
22750
22793
  }
22751
22794
  /**
22752
22795
  * The DESTROY refusal text for the `resources` bag (issue
@@ -22955,7 +22998,7 @@ const STATE_REGION_DIVERGED = "STATE_REGION_DIVERGED";
22955
22998
  */
22956
22999
  function divergentRecordRegionRefusalMessage(stackName, keyRegion, divergentBodyRegion, resourceCount) {
22957
23000
  const cap = STACK_REF_MAX_CODE_POINTS;
22958
- const exact = safeIdentifier(stackName, cap) === stackName && safeIdentifier(keyRegion, cap) === keyRegion && isPasteableIdent(stackName) && isPasteableIdent(keyRegion);
23001
+ const exact = rendersExactly(stackName, cap) && rendersExactly(keyRegion, cap) && isPasteableIdent(stackName) && isPasteableIdent(keyRegion);
22959
23002
  const lists = resourceCount === void 0 ? "its resources map cannot be read" : `it still lists ${resourceCount} resource${resourceCount === 1 ? "" : "s"}`;
22960
23003
  const kind = describeRegionValueKind(divergentBodyRegion);
22961
23004
  const opening = exact ? `cdkd will not destroy stack ${shellQuote(safeIdentifier(stackName, cap))} (${shellQuote(safeIdentifier(keyRegion, cap))}): the state record read from that region's key carries a 'region' of its own (${kind}) that is not the key's, and ${lists}` : `cdkd will not destroy the state record this command loaded: it carries a 'region' of its own (${kind}) that is not the region of the key it was read from, and ${lists}`;
@@ -23252,9 +23295,9 @@ function malformedOutputsWarning(rawStackName, rawRegion) {
23252
23295
  * this names the stack, the region, the defect and the remedy, and exits on a
23253
23296
  * code rather than on a stack trace.
23254
23297
  */
23255
- function refuseMalformedState(state, stackName, region) {
23298
+ function refuseMalformedState(state, stackName, region, recovery) {
23256
23299
  if (hasReadableResources(state)) return;
23257
- throw new CdkdError(malformedStateRefusalMessage(stackName, region), STATE_RESOURCES_MALFORMED);
23300
+ throw new CdkdError(malformedStateRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED);
23258
23301
  }
23259
23302
  /**
23260
23303
  * The `outputs` half of {@link malformedStateRefusalMessage}, for the same
@@ -23273,10 +23316,10 @@ function refuseMalformedState(state, stackName, region) {
23273
23316
  * Identifiers are sanitized and THEN shell-quoted and the command is emitted
23274
23317
  * LAST and UNWRAPPED, for the reasons {@link safeIdentifier}'s note gives.
23275
23318
  */
23276
- function malformedOutputsRefusalMessage(rawStackName, rawRegion) {
23319
+ function malformedOutputsRefusalMessage(rawStackName, rawRegion, recovery) {
23277
23320
  const stackName = absentIfEmpty(rawStackName);
23278
23321
  const region = absentIfEmpty(rawRegion);
23279
- return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. This command can WRITE state, so it refuses rather than continuing: it REBUILDS the bag before saving, and 'Object.entries' walks a string or a list as readily as a map, so a six-character value would be saved back as a well-formed six-key map (a null one as an empty map). That replaces the only signal anything is wrong with a legitimate-looking record, permanently — and the next deploy republishes it into the shared exports index every other stack's Fn::ImportValue resolves against. Repair or remove the record first. Inspect it with: ` + inspectCommand(stackName, region);
23322
+ return inspectTail(`${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. This command can WRITE state, so it refuses rather than continuing: it REBUILDS the bag before saving, and 'Object.entries' walks a string or a list as readily as a map, so a six-character value would be saved back as a well-formed six-key map (a null one as an empty map). That replaces the only signal anything is wrong with a legitimate-looking record, permanently — and the next deploy republishes it into the shared exports index every other stack's Fn::ImportValue resolves against. Repair or remove the record first.`, stackName, region, recovery);
23280
23323
  }
23281
23324
  /**
23282
23325
  * The line `ExportIndexStore`'s rebuild emits for a producer record whose
@@ -23360,9 +23403,9 @@ function malformedExportNamesWarning(rawStackName, rawRegion) {
23360
23403
  * records: a guard written at the rebuild leaves every earlier dereference in
23361
23404
  * front of it.
23362
23405
  */
23363
- function refuseMalformedOutputs(state, stackName, region) {
23406
+ function refuseMalformedOutputs(state, stackName, region, recovery) {
23364
23407
  if (hasReadableOutputs(state)) return;
23365
- throw markNonRetryable(new CdkdError(malformedOutputsRefusalMessage(stackName, region), STATE_RESOURCES_MALFORMED));
23408
+ throw markNonRetryable(new CdkdError(malformedOutputsRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED));
23366
23409
  }
23367
23410
  /**
23368
23411
  * The stand-in row a read-only view lists in its `unreadable` set for an
@@ -23393,9 +23436,9 @@ const UNREADABLE_ORPHANS_CONTAINER_ROW = "(orphans container)";
23393
23436
  * ones it cannot see.
23394
23437
  *
23395
23438
  * The ENTRIES are a separate question with a separate answer —
23396
- * `orphans[<i>].properties` is go-to-k/cdkd#3344, and
23397
- * {@link refuseMalformedResourcePropertiesForOrphan} is the guard there. This
23398
- * one says only that the container is a list.
23439
+ * {@link unreadableOrphanRecords}, which `cdkd orphan` refuses on through
23440
+ * {@link refuseMalformedOrphansForOrphan} (go-to-k/cdkd#3344). This one says
23441
+ * only that the container is a list.
23399
23442
  */
23400
23443
  function hasReadableOrphans(state) {
23401
23444
  return state.orphans === void 0 || Array.isArray(state.orphans);
@@ -23766,15 +23809,26 @@ function dropRecordCommand(stackName, region, recovery) {
23766
23809
  * drop command from a legacy record whose name merely needs quoting — the very
23767
23810
  * path go-to-k/cdkd#3359 built, where `cdkd state show` refuses outright and
23768
23811
  * this command is the way out. Measured: `It's Legacy` loses it.
23812
+ *
23813
+ * **The ONE spelling of the exactness test in this module** (go-to-k/cdkd#3388).
23814
+ * The two DESTROY gates measure through it too, each at the cap its own clause
23815
+ * renders at: {@link mayNameTargetWithDestructiveRemedy} passes a region's
23816
+ * `SHORT_NAME_MAX_CODE_POINTS`, and `divergentRecordRegionRefusalMessage`
23817
+ * this default for both identities. `safeStackName(x) === x` and
23818
+ * `safeRegion(x) === x` are this predicate at those two caps, so a site
23819
+ * wanting either says so here instead of re-spelling the comparison —
23820
+ * `tests/unit/state/malformed-resources-bag.test.ts` refuses a second inline
23821
+ * spelling.
23769
23822
  */
23770
- function rendersExactly(value) {
23771
- return safeIdentifier(value, STACK_REF_MAX_CODE_POINTS) === value;
23823
+ function rendersExactly(value, maxCodePoints = STACK_REF_MAX_CODE_POINTS) {
23824
+ return safeIdentifier(value, maxCodePoints) === value;
23772
23825
  }
23773
23826
  /**
23774
23827
  * The remedy command a message ends ON — unless the message also offers the
23775
23828
  * destructive template, in which case it ends the READ's own LINE and
23776
- * {@link DROP_RECORD_LINE} is last (go-to-k/cdkd#3516). Two of the eight call
23777
- * sites are that shape; the rest close their string with it.
23829
+ * {@link DROP_RECORD_LINE} is last (go-to-k/cdkd#3516) — the two DESTROY
23830
+ * refusals; the rest close their string with it, directly or through
23831
+ * {@link inspectTail}.
23778
23832
  */
23779
23833
  function inspectCommand(stackName, region) {
23780
23834
  if (stackName === void 0) return `cdkd state show ${commandHole("stack")} --stack-region ${commandHole("region")} --json`;
@@ -24094,6 +24148,32 @@ function malformedResourcePropertiesRefusalMessage(rawStackName, rawRegion, logi
24094
24148
  function malformedOrphanResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
24095
24149
  const stackName = absentIfEmpty(rawStackName);
24096
24150
  const region = absentIfEmpty(rawRegion);
24151
+ return orphanRefusal(stackName, region, recovery, `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, because the rewrite audit table a dry run prints is the wrong one. It is not that the save would fabricate a map: an unreadable bag is carried through VERBATIM. It is that this command exists to leave the record deployable by rewriting every reference to an orphaned resource, and a map it cannot read hides whichever references it holds — a string or a number presents none to find, and a list is walked, so its rewrites are recorded into a container that is still not a map. Continuing would rewrite, save, and report success over a record 'cdkd deploy' then REFUSES.`, SURVIVOR_THIRD_WAY_OUT);
24152
+ }
24153
+ /**
24154
+ * The third way out every `cdkd orphan` refusal over a `resources` ENTRY
24155
+ * offers, conditioned as {@link malformedOrphanResourcePropertiesRefusalMessage}'s
24156
+ * note requires. One spelling for the three refusals scoped to the survivors
24157
+ * (the entry, its `properties` and its `attributes`), which make the same
24158
+ * promise for the same reason: each subtracts the orphan set.
24159
+ */
24160
+ const SURVIVOR_THIRD_WAY_OUT = "A third works only while the CDK app STILL DECLARES the named resource — this refusal covers just the records that would SURVIVE the save, so 'cdkd orphan <its construct path>' removes it and repairs the rest; construct paths come from the synthesized template, so a resource the app no longer declares has none and must take one of the first two.";
24161
+ /**
24162
+ * What every `cdkd orphan` refusal shares after its own diagnosis: the two
24163
+ * template-free ways out, the caller's third, and the pasteable lines.
24164
+ *
24165
+ * `lead` is the diagnosis AND the harm, which is what differs per container —
24166
+ * the rule this module follows for every text. The remedy half does not
24167
+ * differ, and a second copy of it is what would drift: it carries the
24168
+ * substitution gate, the withheld-identity clause and the per-line commands
24169
+ * go-to-k/cdkd#3363 settled. `thirdWayOut` is a full sentence; the ones naming
24170
+ * a record outside `resources` cannot offer `cdkd orphan <construct path>` and
24171
+ * say so instead.
24172
+ *
24173
+ * Takes identities ALREADY normalised by the exported builder's
24174
+ * {@link absentIfEmpty}, which is where that floor lives.
24175
+ */
24176
+ function orphanRefusal(stackName, region, recovery, lead, thirdWayOut, dropCaveat = "") {
24097
24177
  const inspect = orphanInspectClause(stackName, region, recovery);
24098
24178
  const listCommand = withheldIdentityListCommand(stackName, region, recovery);
24099
24179
  const commands = [
@@ -24102,7 +24182,7 @@ function malformedOrphanResourcePropertiesRefusalMessage(rawStackName, rawRegion
24102
24182
  ...inspect.command === void 0 ? [] : [`Inspect the record: ${inspect.command}`]
24103
24183
  ];
24104
24184
  return [
24105
- `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, because the rewrite audit table a dry run prints is the wrong one. It is not that the save would fabricate a map: an unreadable bag is carried through VERBATIM. It is that this command exists to leave the record deployable by rewriting every reference to an orphaned resource, and a map it cannot read hides whichever references it holds — a string or a number presents none to find, and a list is walked, so its rewrites are recorded into a container that is still not a map. Continuing would rewrite, save, and report success over a record 'cdkd deploy' then REFUSES. No state was written. Two ways out need no CDK app: repair the record by hand, or drop it whole with the 'Drop the record' command below, which leaves the live AWS resources standing${withheldIdentityClause(stackName, region)}${withheldRecoveryClause(recovery)}. A third works only while the CDK app STILL DECLARES the named resource — this refusal covers just the records that would SURVIVE the save, so 'cdkd orphan <its construct path>' removes it and repairs the rest; construct paths come from the synthesized template, so a resource the app no longer declares has none and must take one of the first two.` + (inspect.sentence === void 0 ? "" : ` ${inspect.sentence}`),
24185
+ `${lead} No state was written. Two ways out need no CDK app: repair the record by hand, or drop it whole with the 'Drop the record' command below, which leaves the live AWS resources standing${dropCaveat}${withheldIdentityClause(stackName, region)}${withheldRecoveryClause(recovery)}. ` + thirdWayOut + (inspect.sentence === void 0 ? "" : ` ${inspect.sentence}`),
24106
24186
  ...commands,
24107
24187
  ...inspect.locations ?? []
24108
24188
  ].join("\n");
@@ -24210,6 +24290,9 @@ function orphanInspectCommand(stackName, region, recovery) {
24210
24290
  * With `recovery` the path carries the REAL prefix and names the bucket, the
24211
24291
  * way the drop remedy above it is qualified; without it the prefix is a
24212
24292
  * placeholder and the sentence says how to fill it.
24293
+ *
24294
+ * Its region-less arm is also {@link inspectTail}'s, for the state and outputs
24295
+ * refusals `cdkd orphan` raises over the same legacy record (go-to-k/cdkd#3388).
24213
24296
  */
24214
24297
  function orphanInspectClause(stackName, region, recovery) {
24215
24298
  if (stackName === void 0 || stackName === "") return { command: [`cdkd state show ${commandHole("stack")} --stack-region ${commandHole("region")} --json`, ...recoveryCommandFlags(recovery).flags].join(" ") };
@@ -24247,34 +24330,18 @@ function orphanInspectClause(stackName, region, recovery) {
24247
24330
  * cannot persist a record it is deleting, and because refusing on one would
24248
24331
  * break the recovery path the refusal is otherwise meant to preserve.
24249
24332
  *
24250
- * **It covers `state.resources` ONLY, and the save keeps more than that.**
24251
- * `rewriteResourceReferences` spreads `carriedState`, so `state.orphans[]` —
24252
- * rollback-orphaned records each holding a whole `ResourceState`
24253
- * (go-to-k/cdkd#2934) — rides through untouched, and
24254
- * {@link unreadableResourcePropertyBags} never walks it. A torn bag parked
24255
- * there is therefore still saved, and `computeStackDiff` splices those records
24256
- * into `state.resources` on the next preview. Stated rather than implied,
24257
- * because "the records the save would KEEP" reads wider than what this scans:
24258
- * the gap is go-to-k/cdkd#3344, filed rather than folded in because the remedy
24259
- * differs — an entry in that container has no construct path, so the message's
24260
- * third way out is meaningless for it.
24261
- *
24262
- * **A surviving ENTRY that is not a map is the other gap, and it DOES launder.**
24263
- * This scan asks whether a resource's `properties` is readable; it never asks
24264
- * whether the resource RECORD is. `isReadableBag('abcdef')` is false, so a
24265
- * string entry is skipped here, and then `rewriteResourceReferences`'s
24266
- * `{ ...resource }` spreads it into per-character keys — the record is SAVED as
24267
- * `{"0":"a",…,"dependencies":[]}` and the run reports success. A number entry
24268
- * saves as `{"dependencies":[]}`, a record with no `physicalId`. So the
24269
- * refusal's own text, which says a torn `properties` map is persisted verbatim
24270
- * rather than reshaped, is true of the container it scans and NOT of the one
24271
- * above it.
24272
- *
24273
- * That gap is NOT go-to-k/cdkd#3202's as filed — that issue records only the
24274
- * `null`-entry `TypeError` — and NOT open PR go-to-k/cdkd#3226's, whose file
24275
- * list carries neither `orphan.ts` nor `orphan-rewriter.ts`. A lane closing
24276
- * either one leaves this open, which is why it is named here rather than
24277
- * deferred to them by reference. Filed as go-to-k/cdkd#3350.
24333
+ * **It covers the `properties` map of a `state.resources` entry ONLY, and the
24334
+ * save keeps more than that.** Three siblings answer for the rest, each its
24335
+ * own call because each is its own container with its own consequence:
24336
+ * {@link refuseMalformedResourceEntriesForOrphan} for an entry that is not a
24337
+ * record at all — the one shape the save RESHAPES rather than carries
24338
+ * (go-to-k/cdkd#3350) — {@link refuseMalformedResourceAttributesForOrphan} for
24339
+ * the entry's `attributes` map (go-to-k/cdkd#3345), and
24340
+ * {@link refuseMalformedOrphansForOrphan} for `state.orphans[]`, which the
24341
+ * rewrite spreads through `carriedState` without reading (go-to-k/cdkd#3344).
24342
+ * This scan skips an entry that is not an object, which is why the first of
24343
+ * them has to exist: its "carried through VERBATIM" sentence is true of the
24344
+ * container it scans and false of the one above it.
24278
24345
  *
24279
24346
  * CALL IT AT THE LOAD, beside {@link refuseMalformedState} and
24280
24347
  * {@link refuseMalformedOutputs}, above `rewriteResourceReferences` — the
@@ -24362,8 +24429,9 @@ function isReadableResourceEntry(entry) {
24362
24429
  * and refusing would stop the command documented as the way to UNWIND a stack
24363
24430
  * whose state is already suspect. The other callers (`cdkd import`,
24364
24431
  * `cdkd orphan`, `cdkd scrub`) each owe their own classification; `cdkd orphan`
24365
- * does still throw on an unreadable sibling, which is why that one is tracked on
24366
- * go-to-k/cdkd#3202 rather than answered here by a shared refusal.
24432
+ * answers through its own entry point on this class,
24433
+ * {@link refuseMalformedResourceEntriesForOrphan}, scoped to the records its
24434
+ * save keeps (go-to-k/cdkd#3350).
24367
24435
  *
24368
24436
  * So the entry rule is OPT-IN, taken by a flow that dereferences EVERY entry and
24369
24437
  * writes the record back.
@@ -24503,6 +24571,171 @@ function malformedResourceEntriesRefusalMessage(rawStackName, rawRegion, logical
24503
24571
  const region = absentIfEmpty(rawRegion);
24504
24572
  return `${namedEntriesClause(stackName, region, logicalIds)} This command can WRITE state, so it refuses rather than skipping them: saving over the record would report a clean run for entries nothing could read, and would leave the next command to fail on them with no more to go on. Nothing was locked, read from AWS or written FOR THIS STACK. Inspect it with: ` + inspectCommand(stackName, region);
24505
24573
  }
24574
+ /**
24575
+ * For `cdkd orphan`: refuse a record whose SURVIVING `resources` entries are
24576
+ * not readable resource records (go-to-k/cdkd#3350).
24577
+ *
24578
+ * The ENTRY class's predicate ({@link unreadableResourceEntries}), scoped to
24579
+ * the survivors exactly as the `properties` refusal is: an entry this run
24580
+ * DROPS is never saved, and `cdkd orphan` over the damaged record is the way
24581
+ * out of it, so the orphan set is subtracted. The drop is safe because the
24582
+ * rewriter will not RESOLVE a reference through an unreadable orphaned record —
24583
+ * it reports the site as unresolvable instead (`src/analyzer/orphan-rewriter.ts`).
24584
+ *
24585
+ * A second entry point on the class rather than a widening of
24586
+ * {@link refuseMalformedResourceEntries}, whose text says nothing was LOCKED —
24587
+ * false here, where the lock is taken before the load — and names no way out.
24588
+ */
24589
+ function refuseMalformedResourceEntriesForOrphan(state, removedLogicalIds, stackName, region, recovery) {
24590
+ const removed = new Set(removedLogicalIds);
24591
+ const unreadable = unreadableResourceEntries(state).filter((id) => !removed.has(id));
24592
+ if (unreadable.length === 0) return;
24593
+ throw new CdkdError(malformedOrphanResourceEntriesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
24594
+ }
24595
+ /**
24596
+ * The text {@link refuseMalformedResourceEntriesForOrphan} raises.
24597
+ *
24598
+ * **This is the one container the save RESHAPES**, so the `properties`
24599
+ * refusal's "carried through VERBATIM" must not be borrowed. Measured through
24600
+ * the real rewrite, which rebuilds each kept record as
24601
+ * `{ ...resource, properties, dependencies }`: `"abcdef"` saved as
24602
+ * `{"0":"a",…,"5":"f","dependencies":[]}`, `5` and `true` as
24603
+ * `{"dependencies":[]}` (no `physicalId` at all), `[{"Ref":"O"}]` as
24604
+ * `{"0":{"Ref":"O"},"dependencies":[]}` with the reference to the orphan left
24605
+ * UNREWRITTEN — the failure this command exists to prevent — and `null` threw
24606
+ * `Cannot read properties of null`. An object with no `resourceType` is the
24607
+ * one shape carried as it stands.
24608
+ */
24609
+ function malformedOrphanResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
24610
+ const stackName = absentIfEmpty(rawStackName);
24611
+ const region = absentIfEmpty(rawRegion);
24612
+ return orphanRefusal(stackName, region, recovery, `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, so a dry run never prints a plan the real run refuses. The rewrite rebuilds each kept record by copying its fields, and a value that is not an object does not survive the copy: a string or a list is saved as one key per character or element — a list's references to an orphaned resource left UNREWRITTEN — a number or a boolean as a record with no physical id, and null stops the run on a bare TypeError. An object with no resource type is saved as it stands. Continuing would save a record no cdkd command wrote and report success.`, SURVIVOR_THIRD_WAY_OUT);
24613
+ }
24614
+ /**
24615
+ * Whether an ENTRY's `attributes` map — the `Fn::GetAtt` cache — can be read.
24616
+ *
24617
+ * ABSENT IS READABLE: the field is optional on `ResourceState` and plenty of
24618
+ * records carry none. `null` is NOT, the split {@link hasReadableOutputs}
24619
+ * draws for its own container: the resolver's cached-attribute read gates on
24620
+ * `!== undefined` and then indexes the map, so a `null` passes the gate and a
24621
+ * string or a list answers for keys it does not hold.
24622
+ */
24623
+ function hasReadableAttributes(entry) {
24624
+ const attributes = entry.attributes;
24625
+ return attributes === void 0 || isReadableBag(attributes);
24626
+ }
24627
+ /**
24628
+ * The logical ids whose `resources` entry carries an `attributes` map that
24629
+ * cannot be read (go-to-k/cdkd#3345). Like {@link unreadableResourcePropertyBags}
24630
+ * it skips an entry that is not an object — that is the ENTRY class's to name —
24631
+ * and returns `[]` for an unreadable bag.
24632
+ */
24633
+ function unreadableResourceAttributeBags(state) {
24634
+ if (!hasReadableResources(state)) return [];
24635
+ return Object.entries(state.resources).filter(([, entry]) => isReadableBag(entry) && !hasReadableAttributes(entry)).map(([logicalId]) => logicalId);
24636
+ }
24637
+ /**
24638
+ * For `cdkd orphan`: refuse a record whose SURVIVING entries carry an
24639
+ * unreadable `attributes` map (go-to-k/cdkd#3345). Scoped to the survivors for
24640
+ * the reason {@link refuseMalformedResourceEntriesForOrphan} is; an ORPHANED
24641
+ * entry's map is the `--force` cache, and the rewriter reads that one as
24642
+ * holding nothing instead of indexing it.
24643
+ */
24644
+ function refuseMalformedResourceAttributesForOrphan(state, removedLogicalIds, stackName, region, recovery) {
24645
+ const removed = new Set(removedLogicalIds);
24646
+ const unreadable = unreadableResourceAttributeBags(state).filter((id) => !removed.has(id));
24647
+ if (unreadable.length === 0) return;
24648
+ throw new CdkdError(malformedOrphanResourceAttributesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
24649
+ }
24650
+ /**
24651
+ * The text {@link refuseMalformedResourceAttributesForOrphan} raises.
24652
+ *
24653
+ * Measured through the real rewrite: `"abcdef"`, `5`, `0`, `""`, `false` and
24654
+ * `null` are carried into the save byte for byte (the falsy ones skip
24655
+ * `rewriteValue` and survive through the spread), and `[{"Ref":"O"}]` is
24656
+ * WALKED, coming back `["<physical id>"]` — a rewrite recorded into a container
24657
+ * that is still not a map, the `properties` refusal's list case one field over.
24658
+ */
24659
+ function malformedOrphanResourceAttributesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
24660
+ const stackName = absentIfEmpty(rawStackName);
24661
+ const region = absentIfEmpty(rawRegion);
24662
+ const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
24663
+ const rest = logicalIds.length - NAMED_UNREADABLE_ENTRIES;
24664
+ const more = rest > 0 ? ` and ${rest} more` : "";
24665
+ return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} holds ${logicalIds.length} resource record(s) whose 'attributes' map cannot be read — ${named}${more} — because it is null or not an object. The record is malformed or truncated. 'cdkd orphan' REWRITES and SAVES every record it keeps, so it refuses rather than continuing — under '--dry-run' too, so a dry run never prints a plan the real run refuses. The map is carried into the save VERBATIM, and a list is walked, so its rewrites are recorded into a container that is still not a map. It is the cache a later 'cdkd deploy' reads another resource's 'Fn::GetAtt' of this one from, so continuing would report success over the one map that read depends on.`, SURVIVOR_THIRD_WAY_OUT);
24666
+ }
24667
+ /**
24668
+ * The `orphans[]` records a reader cannot use: a record that is not an object
24669
+ * or has no string `logicalId`, whose `state` is not a readable resource entry,
24670
+ * or whose `state` carries an unreadable `properties` or `attributes` map
24671
+ * (go-to-k/cdkd#3344). The `logicalId` half is go-to-k/cdkd#3500's row
24672
+ * predicate: rows with none all key one map entry, and `orphansAfterRollback`
24673
+ * collapses them into one.
24674
+ *
24675
+ * Every `ResourceState` question the `resources` side answers in separate
24676
+ * predicates, asked in ONE here: a rollback-orphan record is reached only as a
24677
+ * whole — `computeStackDiff` and the deploy's adoption pass splice the record
24678
+ * into `resources` — so which part of it is torn does not change what a caller
24679
+ * can do with it. Returns `[]` for a container that is not a list, which is
24680
+ * {@link hasReadableOrphans}'s to report. Each record is named by its
24681
+ * `logicalId`, or `''` (rendered as the `UNRENDERABLE` stand-in) when it has
24682
+ * no string one — the convention {@link malformedOrphanRecordsWarning} takes.
24683
+ */
24684
+ function unreadableOrphanRecords(state) {
24685
+ if (!Array.isArray(state.orphans)) return [];
24686
+ return state.orphans.filter((record) => {
24687
+ if (!isReadableBag(record)) return true;
24688
+ if (typeof record.logicalId !== "string") return true;
24689
+ const entry = record.state;
24690
+ return !isReadableResourceEntry(entry) || !isReadableBag(entry.properties) || !hasReadableAttributes(entry);
24691
+ }).map((record) => {
24692
+ const id = isReadableBag(record) ? record.logicalId : void 0;
24693
+ return typeof id === "string" ? id : "";
24694
+ });
24695
+ }
24696
+ /**
24697
+ * For `cdkd orphan`: refuse a record whose `orphans` list, or any record in
24698
+ * it, cannot be read (go-to-k/cdkd#3344).
24699
+ *
24700
+ * A THIRD entry point on the `orphans` container, beside
24701
+ * {@link refuseMalformedOrphans} and its destroy twin, because neither text is
24702
+ * true here. The rewrite neither walks nor rebuilds this container — it
24703
+ * spreads it through `carriedState` VERBATIM (measured: `"abc"` comes back
24704
+ * `"abc"`, a record whose `state.properties` is `"abcdef"` comes back byte for
24705
+ * byte) — so the rollback text's "written back as a list of character-shaped
24706
+ * orphan records" would be false. What this command does is SAVE it, report
24707
+ * success, and leave the damage for the next deploy or diff to meet.
24708
+ *
24709
+ * NOT scoped by the orphan set: these records are not in `resources`, so
24710
+ * `cdkd orphan` cannot name one, and its save keeps every one of them.
24711
+ */
24712
+ function refuseMalformedOrphansForOrphan(state, stackName, region, recovery) {
24713
+ if (!hasReadableOrphans(state)) throw new CdkdError(malformedOrphansForOrphanRefusalMessage(stackName, region, void 0, recovery), STATE_RESOURCES_MALFORMED);
24714
+ const unreadable = unreadableOrphanRecords(state);
24715
+ if (unreadable.length === 0) return;
24716
+ throw new CdkdError(malformedOrphansForOrphanRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
24717
+ }
24718
+ /** See {@link orphanRefusal}'s `dropCaveat`. */
24719
+ const ORPHANS_DROP_CAVEAT = "; it also discards the 'orphans' list, the only record of resources an earlier failed deploy left live in AWS";
24720
+ /**
24721
+ * The text {@link refuseMalformedOrphansForOrphan} raises: the CONTAINER arm
24722
+ * when `logicalIds` is `undefined`, the RECORDS arm otherwise.
24723
+ *
24724
+ * Its third way out is not {@link SURVIVOR_THIRD_WAY_OUT}: a record in
24725
+ * `orphans` has no construct path, so `cdkd orphan` cannot remove it, and the
24726
+ * hand repair that remains must not be a deletion — the record is the only
24727
+ * evidence that an earlier failed deploy left its resource live in AWS.
24728
+ */
24729
+ function malformedOrphansForOrphanRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
24730
+ const stackName = absentIfEmpty(rawStackName);
24731
+ const region = absentIfEmpty(rawRegion);
24732
+ const verbatim = "'cdkd orphan' carries it into the record it saves VERBATIM, without reading it, so it refuses rather than continuing — under '--dry-run' too, so a dry run never prints a plan the real run refuses.";
24733
+ if (logicalIds === void 0) return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} has no readable 'orphans' list — the record is malformed or truncated. ${verbatim} The next 'cdkd deploy' refuses the same record, so continuing would only report success over it and leave that refusal one command later.`, "'cdkd orphan' cannot address this list at all, and rewriting it to [] by hand discards the only record of resources an earlier failed deploy left live in AWS.", ORPHANS_DROP_CAVEAT);
24734
+ const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
24735
+ const rest = logicalIds.length - NAMED_UNREADABLE_ENTRIES;
24736
+ const more = rest > 0 ? ` and ${rest} more` : "";
24737
+ return orphanRefusal(stackName, region, recovery, `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read — ${named}${more} — because the record has no string 'logicalId', its 'state' is not an object or names no resource type, or that state's 'properties' or 'attributes' map is not one. The record is malformed or truncated. ${verbatim} Those records are not inert: they are what the next 'cdkd deploy' may re-adopt into 'resources' and what 'cdkd diff' previews for adoption, so continuing would report success over damage the next command meets.`, "'cdkd orphan' cannot remove such a record itself: it is not in 'resources', so it has no construct path. Repair the record by hand rather than deleting it — it is the only record that an earlier failed deploy left its resource live in AWS.", ORPHANS_DROP_CAVEAT);
24738
+ }
24506
24739
 
24507
24740
  //#endregion
24508
24741
  //#region src/analyzer/diff-calculator.ts
@@ -29973,7 +30206,8 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
29973
30206
  if (carriedBefore === 0) return;
29974
30207
  if (inheritedSecretsCarriedBy(this.coerceParameterValue(userValue, paramDef.Type), inherited).length >= carriedBefore) return;
29975
30208
  const loggedName = this.displayMasked(name);
29976
- throw markNonRetryable(new IntrinsicResolutionRefusalError(`Nested-stack parameter '${loggedName}' is declared 'Type: ${paramDef.Type}', but the parent stack resolved a SECRET dynamic reference into it. cdkd keeps a resolved secret out of persisted state by rewriting STRING leaves back to their {{resolve:...}} expression; coercing this value to '${paramDef.Type}' destroys the plaintext cdkd would have matched on, so the DECRYPTED secret would be left in the child stack's state.json with nothing to redact it back to. Declare '${loggedName}' as 'Type: String' in the nested stack's template (CDK does this by default for cross-stack references), or stop passing a secret reference into it.`, void 0, "NESTED_STACK_SECRET_PARAMETER_TYPE"));
30209
+ const loggedType = this.displayMasked(paramDef.Type);
30210
+ throw markNonRetryable(new IntrinsicResolutionRefusalError(`Nested-stack parameter '${loggedName}' is declared 'Type: ${loggedType}', but the parent stack resolved a SECRET dynamic reference into it. cdkd keeps a resolved secret out of persisted state by rewriting STRING leaves back to their {{resolve:...}} expression; coercing this value to '${loggedType}' destroys the plaintext cdkd would have matched on, so the DECRYPTED secret would be left in the child stack's state.json with nothing to redact it back to. Declare '${loggedName}' as 'Type: String' in the nested stack's template (CDK does this by default for cross-stack references), or stop passing a secret reference into it.`, void 0, "NESTED_STACK_SECRET_PARAMETER_TYPE"));
29977
30211
  }
29978
30212
  /**
29979
30213
  * Resolve Ref intrinsic function
@@ -29987,7 +30221,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
29987
30221
  const resource = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
29988
30222
  if (resource) {
29989
30223
  const refValue = this.resolveRefValue(logicalId, resource, context);
29990
- this.logger.debug(`Resolved Ref to resource: ${this.displayMasked(logicalId, context)} -> ${refValue}`);
30224
+ this.logger.debug(`Resolved Ref to resource: ${this.displayMasked(logicalId, context)} -> ${this.displayMasked(String(refValue), context)}`);
29991
30225
  return refValue;
29992
30226
  }
29993
30227
  if (context.parameters && Object.hasOwn(context.parameters, logicalId)) {
@@ -30001,7 +30235,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30001
30235
  const pseudoValue = await this.resolvePseudoParameter(logicalId, context);
30002
30236
  if (pseudoValue !== void 0) {
30003
30237
  const valueStr = typeof pseudoValue === "symbol" ? pseudoValue.toString() : String(pseudoValue);
30004
- this.logger.debug(`Resolved Ref to pseudo parameter: ${logicalId} -> ${valueStr}`);
30238
+ this.logger.debug(`Resolved Ref to pseudo parameter: ${logicalId} -> ${this.displayMasked(valueStr, context)}`);
30005
30239
  return pseudoValue;
30006
30240
  }
30007
30241
  const loggedLogicalId = this.displayMasked(logicalId, context);
@@ -30174,7 +30408,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30174
30408
  attributeName = resolvedAttributeName;
30175
30409
  } else {
30176
30410
  const split = splitGetAttStringForm(getAtt);
30177
- if (split === void 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Invalid Fn::GetAtt format: ${getAtt}`));
30411
+ if (split === void 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Invalid Fn::GetAtt format: ${this.displayMasked(getAtt, context)}`));
30178
30412
  logicalId = split.logicalId;
30179
30413
  attributeName = split.attributeName;
30180
30414
  }
@@ -30259,8 +30493,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30259
30493
  * which reads the SAME persisted `attributes` bag and shipped without the
30260
30494
  * note (it takes it now). The rule the note actually needs is about the
30261
30495
  * SOURCE of the value — every branch serving one out of a PERSISTED
30262
- * `attributes` bag must call this — and that is not a shape a compiler can
30263
- * enforce. `constructGuardedAttribute`'s return is deliberately outside it:
30496
+ * `attributes` bag must call this, and so must one serving (or embedding) a
30497
+ * persisted `properties` leaf, which a mask-only needle masks whole
30498
+ * (go-to-k/cdkd#2936: the VPC `CidrBlock` and Events rule `Arn` arms) — and
30499
+ * that is not a shape a compiler can enforce. `constructGuardedAttribute`'s return is deliberately outside it:
30264
30500
  * that value is fetched from AWS in this run, not read back from state, so
30265
30501
  * it can be neither a stale mask nor a value a provider declared `NoEcho`.
30266
30502
  *
@@ -30348,7 +30584,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30348
30584
  * predate the enrichment and `cdkd deploy` is what heals it.
30349
30585
  */
30350
30586
  unenrichedRemedy(resourceType, attributeName, outcome, context) {
30351
- const fileIssue = `Avoid this Fn::GetAtt, or file an issue at https://github.com/go-to-k/cdkd/issues so cdkd can enrich ${resourceType}.${this.displayMasked(attributeName, context)}.`;
30587
+ const fileIssue = `Avoid this Fn::GetAtt, or file an issue at https://github.com/go-to-k/cdkd/issues so cdkd can enrich ${this.displayMasked(resourceType, context)}.${this.displayMasked(attributeName, context)}.`;
30352
30588
  if (outcome === void 0) return `If this record was written by an older cdkd that did not record the attribute yet, 'cdkd deploy' re-reads it from AWS and heals the record. ${fileIssue}`;
30353
30589
  if (outcome.kind === "read") {
30354
30590
  if (this.healWithheld(outcome, attributeName)) return this.withheldRemedy();
@@ -30491,7 +30727,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30491
30727
  async constructGuardedAttribute(resource, attributeName, context, logicalId) {
30492
30728
  const accountInfo = await getAccountInfo(this.resolverRegion);
30493
30729
  const value = await this.constructAttribute(resource, attributeName, context, logicalId, accountInfo);
30494
- if (accountInfo.fabricated && embedsAccountId(value, accountInfo.accountId)) throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resource.resourceType}: STS did not report this deploy's account id, so cdkd would build the value from the placeholder account ${accountInfo.accountId} — structurally valid, naming a different account, and indistinguishable downstream from a real one. Fix the AWS credentials (or set AWS_ACCOUNT_ID to this deploy's account) and deploy again.`);
30730
+ if (accountInfo.fabricated && embedsAccountId(value, accountInfo.accountId)) throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${this.displayMasked(resource.resourceType, context)}: STS did not report this deploy's account id, so cdkd would build the value from the placeholder account ${accountInfo.accountId} — structurally valid, naming a different account, and indistinguishable downstream from a real one. Fix the AWS credentials (or set AWS_ACCOUNT_ID to this deploy's account) and deploy again.`);
30495
30731
  return value;
30496
30732
  }
30497
30733
  /**
@@ -30528,28 +30764,29 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30528
30764
  }
30529
30765
  if (resourceType === "AWS::EC2::VPC") switch (attributeName) {
30530
30766
  case "VpcId": return physicalId;
30531
- case "CidrBlock": return resource.attributes?.["CidrBlock"] || resource.properties?.["CidrBlock"];
30767
+ case "CidrBlock": return this.noteAttributeSecrecy(logicalId, attributeName, resource.attributes?.["CidrBlock"] || resource.properties?.["CidrBlock"], context);
30532
30768
  case "Ipv6CidrBlocks": try {
30533
30769
  const ec2 = this.clientsForRegion(this.explicitRegion).ec2;
30534
30770
  const maxAttempts = 15;
30771
+ const loggedId = this.displayMasked(String(physicalId), context);
30535
30772
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
30536
30773
  const associations = (await ec2.send(new DescribeVpcsCommand({ VpcIds: [physicalId] }))).Vpcs?.[0]?.Ipv6CidrBlockAssociationSet || [];
30537
30774
  const blocks = associations.filter((a) => a.Ipv6CidrBlockState?.State === "associated").map((a) => a.Ipv6CidrBlock);
30538
30775
  if (blocks.length > 0) {
30539
- this.logger.debug(`Resolved VPC Ipv6CidrBlocks for ${physicalId}: ${this.displayMasked(JSON.stringify(this.maskValueLeaves(blocks, context)), context)}`);
30776
+ this.logger.debug(`Resolved VPC Ipv6CidrBlocks for ${loggedId}: ${this.displayMasked(JSON.stringify(this.maskValueLeaves(blocks, context)), context)}`);
30540
30777
  return blocks;
30541
30778
  }
30542
30779
  if (associations.filter((a) => a.Ipv6CidrBlockState?.State === "associating").length === 0) {
30543
- this.logger.debug(`No IPv6 CIDR associations found for VPC ${physicalId}`);
30780
+ this.logger.debug(`No IPv6 CIDR associations found for VPC ${loggedId}`);
30544
30781
  return [];
30545
30782
  }
30546
- this.logger.debug(`VPC ${physicalId} IPv6 CIDR still associating (attempt ${attempt}/${maxAttempts}), waiting...`);
30783
+ this.logger.debug(`VPC ${loggedId} IPv6 CIDR still associating (attempt ${attempt}/${maxAttempts}), waiting...`);
30547
30784
  await new Promise((resolve) => setTimeout(resolve, 2e3));
30548
30785
  }
30549
- this.logger.warn(`VPC ${physicalId} IPv6 CIDR did not reach 'associated' state after ${maxAttempts} attempts`);
30786
+ this.logger.warn(`VPC ${loggedId} IPv6 CIDR did not reach 'associated' state after ${maxAttempts} attempts`);
30550
30787
  return [];
30551
30788
  } catch (error) {
30552
- this.logger.warn(`Failed to fetch VPC Ipv6CidrBlocks for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`);
30789
+ this.logger.warn(`Failed to fetch VPC Ipv6CidrBlocks for ${this.displayMasked(String(physicalId), context)}: ${this.displayMasked(error instanceof Error ? error.message : String(error), context)}`);
30553
30790
  return [];
30554
30791
  }
30555
30792
  case "DefaultSecurityGroup": {
@@ -30626,7 +30863,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30626
30863
  if (resourceType === "AWS::Events::Rule") switch (attributeName) {
30627
30864
  case "Arn": {
30628
30865
  if (physicalId.startsWith("arn:")) return physicalId;
30629
- const busRaw = resource.properties?.["EventBusName"];
30866
+ const busRaw = this.noteAttributeSecrecy(logicalId, attributeName, resource.properties?.["EventBusName"], context);
30630
30867
  const bus = typeof busRaw === "string" && busRaw && busRaw !== "default" ? busRaw : "";
30631
30868
  const busName = bus.startsWith("arn:") ? bus.split("/").pop() || "" : bus;
30632
30869
  return busName ? `arn:${partition}:events:${region}:${accountId}:rule/${busName}/${physicalId}` : `arn:${partition}:events:${region}:${accountId}:rule/${physicalId}`;
@@ -30674,7 +30911,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30674
30911
  const { GetNamespaceCommand } = await import("@aws-sdk/client-servicediscovery");
30675
30912
  return (await (await this.serviceDiscoveryClient()).send(new GetNamespaceCommand({ Id: physicalId }))).Namespace?.Properties?.DnsProperties?.HostedZoneId;
30676
30913
  } catch (error) {
30677
- this.logger.warn(`Failed to fetch HostedZoneId for namespace ${physicalId}: ${error instanceof Error ? error.message : String(error)}`);
30914
+ this.logger.warn(`Failed to fetch HostedZoneId for namespace ${this.displayMasked(String(physicalId), context)}: ${this.displayMasked(error instanceof Error ? error.message : String(error), context)}`);
30678
30915
  return;
30679
30916
  }
30680
30917
  default: return this.guardedPhysicalIdFallback(logicalId, attributeName, resourceType, physicalId, context);
@@ -30875,7 +31112,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30875
31112
  const value = attributeName === "LatestVersionNumber" ? lt?.LatestVersionNumber : lt?.DefaultVersionNumber;
30876
31113
  if (value !== void 0 && value !== null) return String(value);
30877
31114
  } catch (err) {
30878
- this.logger.warn(`DescribeLaunchTemplates(${physicalId}) failed for ${this.displayMasked(attributeName, context)}: ${this.displayMasked(err instanceof Error ? err.message : String(err), context)}`);
31115
+ this.logger.warn(`DescribeLaunchTemplates(${this.displayMasked(String(physicalId), context)}) failed for ${this.displayMasked(attributeName, context)}: ${this.displayMasked(err instanceof Error ? err.message : String(err), context)}`);
30879
31116
  }
30880
31117
  return attributeName === "LatestVersionNumber" ? "$Latest" : "$Default";
30881
31118
  }
@@ -30982,7 +31219,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30982
31219
  */
30983
31220
  refuseUnservedAttribute(site) {
30984
31221
  const { logicalId, attributeName, resourceType, physicalId, context, observed, remedy } = site;
30985
- throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resourceType}: ${observed}. The physical id "${this.displayMasked(physicalId, context)}" is not a usable ${this.displayMasked(attributeName, context)}, so cdkd refuses to substitute it. ${remedy}`);
31222
+ throw new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${this.displayMasked(resourceType, context)}: ${observed}. The physical id "${this.displayMasked(physicalId, context)}" is not a usable ${this.displayMasked(attributeName, context)}, so cdkd refuses to substitute it. ${remedy}`);
30986
31223
  }
30987
31224
  /**
30988
31225
  * The `observed` clause of {@link refuseUnservedAttribute} for a live read
@@ -31028,20 +31265,21 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
31028
31265
  if (context?.staleAttributeHeal?.phase === "probe") throw new StaleAttributeMissSignal();
31029
31266
  const healOutcome = context?.staleAttributeHeal?.phase === "settled" ? context.staleAttributeHeal.outcome : void 0;
31030
31267
  const recordMayBeStale = healOutcome?.kind === "failed" || healOutcome?.kind === "not-found";
31268
+ const loggedType = this.displayMasked(resourceType, context);
31031
31269
  const expectsArnShape = attributeName.endsWith("Arn") && !physicalId.startsWith("arn:");
31032
31270
  const expectsUrlShape = attributeName.endsWith("Url") && !/^https?:\/\//.test(physicalId);
31033
31271
  if (expectsArnShape || expectsUrlShape) {
31034
31272
  const expectedShape = expectsArnShape ? "an ARN (arn:...)" : "a URL (http(s)://...)";
31035
- throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resourceType}: ` + (recordMayBeStale ? `the state record holds no value for it, and the physical ID ` : `attributes are not enriched for this resource type, and the physical ID `) + `fallback "${this.displayMasked(physicalId, context)}" is not ${expectedShape}. CloudFormation would return a different value here, so falling back to the physical ID would silently produce a wrong value (e.g. in stack Outputs). ` + (recordMayBeStale ? this.staleRecordRemedy(healOutcome, context) : this.unenrichedRemedy(resourceType, attributeName, healOutcome, context))));
31273
+ throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${loggedType}: ` + (recordMayBeStale ? `the state record holds no value for it, and the physical ID ` : `attributes are not enriched for this resource type, and the physical ID `) + `fallback "${this.displayMasked(physicalId, context)}" is not ${expectedShape}. CloudFormation would return a different value here, so falling back to the physical ID would silently produce a wrong value (e.g. in stack Outputs). ` + (recordMayBeStale ? this.staleRecordRemedy(healOutcome, context) : this.unenrichedRemedy(resourceType, attributeName, healOutcome, context))));
31036
31274
  }
31037
- if (this.strictGetAtt) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${resourceType}: ` + (recordMayBeStale ? `the state record holds no value for it, and --strict-getatt ` : `attributes are not enriched for this resource type, and --strict-getatt `) + `rejects the physical ID fallback "${this.displayMasked(physicalId, context)}" (which may not be the value CloudFormation would return). Drop --strict-getatt to fall back with a warning. ` + (recordMayBeStale ? this.staleRecordRemedy(healOutcome, context) : this.unenrichedRemedy(resourceType, attributeName, healOutcome, context))));
31275
+ if (this.strictGetAtt) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Cannot resolve Fn::GetAtt [${this.displayMasked(logicalId, context)}, ${this.displayMasked(attributeName, context)}] for ${loggedType}: ` + (recordMayBeStale ? `the state record holds no value for it, and --strict-getatt ` : `attributes are not enriched for this resource type, and --strict-getatt `) + `rejects the physical ID fallback "${this.displayMasked(physicalId, context)}" (which may not be the value CloudFormation would return). Drop --strict-getatt to fall back with a warning. ` + (recordMayBeStale ? this.staleRecordRemedy(healOutcome, context) : this.unenrichedRemedy(resourceType, attributeName, healOutcome, context))));
31038
31276
  this.physicalIdFallbackCount++;
31039
31277
  if (recordMayBeStale) {
31040
- this.logger.warn(`The state record for ${this.displayMasked(logicalId, context)} (${resourceType}) holds no ${this.displayMasked(attributeName, context)}, returning physical ID. ` + this.staleRecordRemedy(healOutcome, context));
31278
+ this.logger.warn(`The state record for ${this.displayMasked(logicalId, context)} (${loggedType}) holds no ${this.displayMasked(attributeName, context)}, returning physical ID. ` + this.staleRecordRemedy(healOutcome, context));
31041
31279
  return physicalId;
31042
31280
  }
31043
31281
  const withheld = healOutcome?.kind === "read" && this.healWithheld(healOutcome, attributeName) ? `. ${this.withheldRemedy()}` : "";
31044
- this.logger.warn(`Unknown attribute ${this.displayMasked(attributeName, context)} for resource type ${resourceType}, returning physical ID${withheld}`);
31282
+ this.logger.warn(`Unknown attribute ${this.displayMasked(attributeName, context)} for resource type ${loggedType}, returning physical ID${withheld}`);
31045
31283
  return physicalId;
31046
31284
  }
31047
31285
  /**
@@ -31375,11 +31613,11 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
31375
31613
  const resolvedList = await this.resolveValue(list, context);
31376
31614
  if (!Array.isArray(resolvedList)) throw new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`);
31377
31615
  if (index < 0 || index >= resolvedList.length) {
31378
- this.logger.warn(`Fn::Select: index ${index} out of bounds (array length: ${resolvedList.length})`);
31616
+ this.logger.warn(`Fn::Select: index ${this.displayMasked(String(index), context)} out of bounds (array length: ${resolvedList.length})`);
31379
31617
  return `{{Fn::Select:${index}:OutOfBounds}}`;
31380
31618
  }
31381
31619
  const result = resolvedList[index];
31382
- this.logger.debug(`Resolved Fn::Select: index ${index} -> ${JSON.stringify(this.maskValueLeaves(result, context))}`);
31620
+ this.logger.debug(`Resolved Fn::Select: index ${this.displayMasked(String(index), context)} -> ${JSON.stringify(this.maskValueLeaves(result, context))}`);
31383
31621
  return result;
31384
31622
  }
31385
31623
  /**
@@ -31524,7 +31762,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
31524
31762
  }
31525
31763
  const result = resolvedValue.split(delimiter);
31526
31764
  const pieceTwins = this.splitLogTwins(resolvedValue, delimiter, result, context);
31527
- this.logger.debug(`Resolved Fn::Split: split by "${delimiter}" -> ${JSON.stringify(this.maskValueLeaves(pieceTwins, context))}`);
31765
+ this.logger.debug(`Resolved Fn::Split: split by "${this.displayMasked(String(delimiter), context)}" -> ${JSON.stringify(this.maskValueLeaves(pieceTwins, context))}`);
31528
31766
  return result;
31529
31767
  }
31530
31768
  /**
@@ -32121,7 +32359,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32121
32359
  let roleArn;
32122
32360
  if ("RoleArn" in args && args["RoleArn"] !== void 0 && args["RoleArn"] !== null) {
32123
32361
  const raw = args["RoleArn"];
32124
- if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${JSON.stringify(raw).slice(0, 80)})` : ""}.`);
32362
+ if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`);
32125
32363
  roleArn = raw;
32126
32364
  }
32127
32365
  if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw new Error(`Fn::GetStackOutput: cannot reference own stack '${this.displayMasked(stackName, context)}' in the same region '${this.displayMasked(loggedRegionText, context)}'`);
@@ -32265,7 +32503,15 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32265
32503
  * {@link positionalNameMask} turns them into the transform and owns why.
32266
32504
  */
32267
32505
  maskStateReadError(error, pairs, context) {
32268
- const extraMask = this.positionalNameMask(pairs);
32506
+ throw this.maskNamedError(error, this.positionalNameMask(pairs), context);
32507
+ }
32508
+ /**
32509
+ * {@link maskStateReadError}'s body, RETURNING the masked clone rather than
32510
+ * throwing it, so {@link namedRequestMasks} can hand the same answer to an
32511
+ * SDK call site (go-to-k/cdkd#3171). `extraMask` is a
32512
+ * {@link positionalNameMask} transform, or `undefined` for none.
32513
+ */
32514
+ maskNamedError(error, extraMask, context) {
32269
32515
  let masked = error;
32270
32516
  let positional = extraMask;
32271
32517
  for (const bag of [context?.inheritedSecrets, context?.recordedSecretValues]) {
@@ -32274,7 +32520,57 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32274
32520
  positional = void 0;
32275
32521
  }
32276
32522
  if (positional) masked = maskSecretsInError(masked, /* @__PURE__ */ new Map(), positional);
32277
- throw masked;
32523
+ return masked;
32524
+ }
32525
+ /**
32526
+ * The three masks an AWS SDK call site owes the text the SDK produces about a
32527
+ * request that carried template-derived NAMES (go-to-k/cdkd#3171).
32528
+ *
32529
+ * The resolver masks every name it prints ITSELF through the name's log text
32530
+ * (go-to-k/cdkd#3150), but an SDK rejection QUOTES the name it refused back —
32531
+ * `ParameterNotFound: <name>`, a region in a describe failure — and that
32532
+ * text reached only the needle mask, whose substring arm has the
32533
+ * {@link MIN_NEEDLE_LENGTH} floor. A name an `Fn::Sub` assembled around a
32534
+ * 1-3 character secret printed masked in the resolver's own words and in the
32535
+ * clear a few characters later, in the SDK's.
32536
+ *
32537
+ * `pairs` are (raw name as SENT, that name's log text), the same shape
32538
+ * {@link positionalNameMask} takes and for the same reason; an unmasked pair
32539
+ * is dropped there. ONE helper returning all three, so a call site cannot
32540
+ * adopt one and miss the others:
32541
+ *
32542
+ * - `error` — a masked CLONE of the whole cause chain
32543
+ * ({@link maskNamedError}), which keeps the class and every own descriptor,
32544
+ * so `isThrottlingError` / `isMarkedNonRetryable` still classify it;
32545
+ * - `text` — a caught message about to be interpolated into a line or a
32546
+ * throw, positional pass first, then {@link displayMasked};
32547
+ * - `retryLogger` — for `withRetry`, whose per-attempt `debug` line and
32548
+ * give-up `warn` interpolate the SDK message verbatim.
32549
+ *
32550
+ * THE WHOLE NAME is the key, never its secret span alone: the substitution
32551
+ * rewrites every occurrence of the raw name wherever the SDK put it (inside
32552
+ * an ARN, after a colon). That is what reaches a sub-floor secret — the
32553
+ * whole name is longer than the secret — and it is also the bound: a name
32554
+ * the SDK re-encodes or truncates before quoting it is not matched, and a
32555
+ * masked name of 1-3 characters is matched only where the SDK quotes it
32556
+ * exactly, which may over-mask unrelated text (the SAFE direction
32557
+ * {@link positionalNameMask} documents).
32558
+ */
32559
+ namedRequestMasks(pairs, context) {
32560
+ const positional = this.positionalNameMask(this.explicitRegion !== void 0 && this.explicitRegionLogText !== void 0 ? [...pairs, [this.explicitRegion, this.explicitRegionLogText]] : pairs);
32561
+ const text = (message) => this.displayMasked(positional ? positional(message) : message, context);
32562
+ const line = (message) => {
32563
+ const indent = /^ */.exec(message)?.[0] ?? "";
32564
+ return indent + text(message.slice(indent.length));
32565
+ };
32566
+ return {
32567
+ error: (error) => this.maskNamedError(error, positional, context),
32568
+ text,
32569
+ retryLogger: {
32570
+ debug: (message) => this.logger.debug(line(message)),
32571
+ warn: (message) => this.logger.warn(line(message))
32572
+ }
32573
+ };
32278
32574
  }
32279
32575
  /**
32280
32576
  * Read the producer's state from the SAME AWS account (no RoleArn).
@@ -32453,7 +32749,9 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32453
32749
  Values: ["available"]
32454
32750
  }] }))).AvailabilityZones || []).map((az) => az.ZoneName).filter((name) => name !== void 0).sort();
32455
32751
  } catch (error) {
32456
- throw new Error(`Fn::GetAZs: failed to describe availability zones for region '${this.displayMasked(loggedRegionText ?? region, context)}': ${this.displayMasked(error instanceof Error ? error.message : String(error), context)}`);
32752
+ const loggedRegion = this.displayMasked(loggedRegionText ?? region, context);
32753
+ const masks = this.namedRequestMasks([[region, loggedRegion]], context);
32754
+ throw new Error(`Fn::GetAZs: failed to describe availability zones for region '${loggedRegion}': ${masks.text(error instanceof Error ? error.message : String(error))}`);
32457
32755
  }
32458
32756
  if (azNames.length === 0) throw new Error(`Fn::GetAZs: no availability zones returned for region '${this.displayMasked(loggedRegionText ?? region, context)}'. Either the region is not enabled on this account (opt-in regions must be enabled before use), or the request was answered by a different region's endpoint.`);
32459
32757
  cachedAvailabilityZones[region] = azNames;
@@ -32562,9 +32860,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
32562
32860
  * One constructor for both walks so neither can grow a second masking rule:
32563
32861
  * `subject` and `message` are the only fields a consumer may render, and each
32564
32862
  * carries its own route to a plaintext — an assembled reference puts one in
32565
- * the raw token (issue #2827), and an SDK rejection arrives RAW through
32566
- * `sendWithThrottleRetry` echoing the `Name` it was handed. `error` is kept
32567
- * unmasked on purpose and is documented as classification-only.
32863
+ * the raw token (issue #2827), and an SDK rejection echoes the `Name` it was
32864
+ * handed — which `sendWithThrottleRetry` now masks by position before it
32865
+ * rethrows (go-to-k/cdkd#3171), so this is the second layer on that route.
32866
+ * `error` is not re-masked here and is documented as classification-only.
32568
32867
  */
32569
32868
  abandonedUnit(unit, subject, error, context, rawInput, preRedact) {
32570
32869
  const raw = error instanceof Error ? error.message : String(error);
@@ -33320,7 +33619,11 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33320
33619
  ...versionStage && versionStage !== "" && { VersionStage: versionStage },
33321
33620
  ...versionId && versionId !== "" && { VersionId: versionId }
33322
33621
  });
33323
- const secretString = (await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}`)).SecretString;
33622
+ const secretString = (await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}`, this.namedRequestMasks([
33623
+ [secretId, loggedSecretId],
33624
+ [versionStage, this.displayMasked(nameLogText(versionStage), context)],
33625
+ [versionId, this.displayMasked(nameLogText(versionId), context)]
33626
+ ], context))).SecretString;
33324
33627
  if (!secretString) throw new Error(`Dynamic reference: secret '${loggedSecretId}' does not contain a SecretString value`);
33325
33628
  if (jsonKey) try {
33326
33629
  const parsed = JSON.parse(secretString);
@@ -33355,7 +33658,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33355
33658
  const count = Number(await this.resolveValue(rawCount, context));
33356
33659
  const cidrBits = Number(await this.resolveValue(rawCidrBits, context));
33357
33660
  if (!ipBlock || typeof ipBlock !== "string") throw new Error(`Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(this.maskValueLeaves(ipBlock, context))}`);
33358
- this.logger.debug(`Resolving Fn::Cidr: ipBlock=${this.displayMasked(JSON.stringify(this.maskValueLeaves(ipBlock, context)), context)}, count=${count}, cidrBits=${cidrBits}`);
33661
+ this.logger.debug(`Resolving Fn::Cidr: ipBlock=${this.displayMasked(JSON.stringify(this.maskValueLeaves(ipBlock, context)), context)}, count=${this.displayMasked(String(count), context)}, cidrBits=${this.displayMasked(String(cidrBits), context)}`);
33359
33662
  const isIpv6 = ipBlock.includes(":");
33360
33663
  const results = [];
33361
33664
  if (isIpv6) {
@@ -33451,13 +33754,17 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33451
33754
  * sibling in the SAME region still shares the ambient instance, so the
33452
33755
  * window survives exactly where the two stacks agree on the region.
33453
33756
  */
33454
- sendWithThrottleRetry(operation, label) {
33455
- return withRetry(operation, label, {
33456
- maxRetries: MAX_DYNAMIC_REFERENCE_THROTTLE_RETRIES,
33457
- isRetryable: (_message, error) => isThrottlingError(error),
33458
- logger: this.logger,
33459
- ...dynamicReferenceRetryDelays.sleep ? { sleep: dynamicReferenceRetryDelays.sleep } : {}
33460
- });
33757
+ async sendWithThrottleRetry(operation, label, masks) {
33758
+ try {
33759
+ return await withRetry(operation, label, {
33760
+ maxRetries: MAX_DYNAMIC_REFERENCE_THROTTLE_RETRIES,
33761
+ isRetryable: (_message, error) => isThrottlingError(error),
33762
+ logger: masks.retryLogger,
33763
+ ...dynamicReferenceRetryDelays.sleep ? { sleep: dynamicReferenceRetryDelays.sleep } : {}
33764
+ });
33765
+ } catch (error) {
33766
+ throw masks.error(error);
33767
+ }
33461
33768
  }
33462
33769
  /**
33463
33770
  * Resolve an `{{resolve:ssm:...}}` dynamic reference, reporting whether the
@@ -33484,14 +33791,14 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33484
33791
  Name: parameterName,
33485
33792
  WithDecryption: decrypt
33486
33793
  });
33487
- const response = await this.sendWithThrottleRetry(() => client.send(command), `${service}:${loggedParameterName}`);
33794
+ const response = await this.sendWithThrottleRetry(() => client.send(command), `${service}:${loggedParameterName}`, this.namedRequestMasks([[parameterName, loggedParameterName]], context));
33488
33795
  const paramValue = response.Parameter?.Value;
33489
33796
  if (paramValue === void 0 || paramValue === null) throw new Error(`Dynamic reference: SSM parameter '${loggedParameterName}' not found or has no value`);
33490
33797
  const paramType = response.Parameter?.Type;
33491
33798
  const secure = paramType !== "String" && paramType !== "StringList";
33492
33799
  if (secure && paramType !== "SecureString" && !this.warnedUnrecognizedSsmTypes.has(injectiveKey(parameterName, String(paramType)))) {
33493
33800
  this.warnedUnrecognizedSsmTypes.add(injectiveKey(parameterName, String(paramType)));
33494
- const reported = paramType === void 0 ? "(absent)" : `'${String(paramType)}'`;
33801
+ const reported = paramType === void 0 ? "(absent)" : `'${this.displayMasked(String(paramType), context)}'`;
33495
33802
  this.logger.warn(`SSM parameter '${loggedParameterName}' reported an unrecognized Type ${reported} — treating its value as a secret, so cdkd will persist the {{resolve:${service}:...}} expression rather than the resolved value. Declare the parameter as String / StringList if it is public config.`);
33496
33803
  }
33497
33804
  return {
@@ -35175,7 +35482,7 @@ var CloudControlProvider = class {
35175
35482
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
35176
35483
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
35177
35484
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
35178
- const { ASGProvider } = await import("./asg-provider-CLqajoRp.js").then((n) => n.n);
35485
+ const { ASGProvider } = await import("./asg-provider-_vdcb9QG.js").then((n) => n.n);
35179
35486
  const asgProvider = new ASGProvider();
35180
35487
  return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
35181
35488
  }
@@ -38598,7 +38905,7 @@ const MUTUALLY_EXCLUSIVE_PROPERTIES = /* @__PURE__ */ new Map([["AWS::EC2::Route
38598
38905
  * different questions about the shape and should not drift into one another's
38599
38906
  * behavior by accident.
38600
38907
  */
38601
- function isUnresolvedIntrinsic(value) {
38908
+ function isUnresolvedIntrinsic$1(value) {
38602
38909
  if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
38603
38910
  const keys = Object.keys(value);
38604
38911
  return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
@@ -38615,7 +38922,7 @@ function isUnresolvedIntrinsic(value) {
38615
38922
  * NOT yet known, so it is excluded ahead of the truthiness test.
38616
38923
  */
38617
38924
  function isDeclared(value) {
38618
- if (isUnresolvedIntrinsic(value)) return false;
38925
+ if (isUnresolvedIntrinsic$1(value)) return false;
38619
38926
  return Boolean(value);
38620
38927
  }
38621
38928
  /**
@@ -38643,7 +38950,7 @@ function findViolationsForRules(resourceType, rules, templateProperties) {
38643
38950
  for (const rule of rules) {
38644
38951
  const declared = rule.properties.filter((property) => isDeclared(templateProperties[property]));
38645
38952
  if (declared.length <= 1) continue;
38646
- const winnerCertain = !rule.properties.slice(0, rule.properties.indexOf(declared[0])).some((property) => isUnresolvedIntrinsic(templateProperties[property]));
38953
+ const winnerCertain = !rule.properties.slice(0, rule.properties.indexOf(declared[0])).some((property) => isUnresolvedIntrinsic$1(templateProperties[property]));
38647
38954
  violations.push({
38648
38955
  resourceType,
38649
38956
  rule,
@@ -38677,6 +38984,1526 @@ function buildMutuallyExclusiveMessage(logicalId, violation) {
38677
38984
  return ` - ${logicalId} (${resourceType}) declares ${declared.join(" and ")}\n ${rule.rationale}${winnerNote}\n Declare at most one of: ${rule.properties.join(" / ")}`;
38678
38985
  }
38679
38986
 
38987
+ //#endregion
38988
+ //#region src/provisioning/nested-required.generated.ts
38989
+ /**
38990
+ * AUTO-GENERATED by scripts/gen-nested-required.ts — DO NOT EDIT BY HAND.
38991
+ * Source: the `nestedRequired` section of tests/fixtures/cfn-schemas/*.json.
38992
+ * Regenerate: `vp run gen:nested-required`.
38993
+ *
38994
+ * Per resource type, each nested property PATH (dotted, arrays transparent)
38995
+ * mapped to the members its schema definition lists as `required`. What the
38996
+ * SCHEMA says, not what CloudFormation enforces: the pre-flight refusal in
38997
+ * `nested-required.ts` reads it only for types measured to be enforced.
38998
+ */
38999
+ const NESTED_REQUIRED = /* @__PURE__ */ new Map([
39000
+ ["AWS::ApiGateway::Deployment", /* @__PURE__ */ new Map([["StageDescription.Tags", ["Key", "Value"]]])],
39001
+ ["AWS::ApiGateway::Method", /* @__PURE__ */ new Map([
39002
+ ["Integration", ["Type"]],
39003
+ ["Integration.IntegrationResponses", ["StatusCode"]],
39004
+ ["MethodResponses", ["StatusCode"]]
39005
+ ])],
39006
+ ["AWS::ApiGateway::Stage", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39007
+ ["AWS::ApiGatewayV2::Route", /* @__PURE__ */ new Map([["RequestParameters", ["Required"]]])],
39008
+ ["AWS::AppSync::DataSource", /* @__PURE__ */ new Map([
39009
+ ["DynamoDBConfig", ["AwsRegion", "TableName"]],
39010
+ ["DynamoDBConfig.DeltaSyncConfig", [
39011
+ "BaseTableTTL",
39012
+ "DeltaSyncTableName",
39013
+ "DeltaSyncTableTTL"
39014
+ ]],
39015
+ ["ElasticsearchConfig", ["AwsRegion", "Endpoint"]],
39016
+ ["EventBridgeConfig", ["EventBusArn"]],
39017
+ ["HttpConfig", ["Endpoint"]],
39018
+ ["HttpConfig.AuthorizationConfig", ["AuthorizationType"]],
39019
+ ["LambdaConfig", ["LambdaFunctionArn"]],
39020
+ ["OpenSearchServiceConfig", ["AwsRegion", "Endpoint"]],
39021
+ ["RelationalDatabaseConfig", ["RelationalDatabaseSourceType"]],
39022
+ ["RelationalDatabaseConfig.RdsHttpEndpointConfig", [
39023
+ "AwsRegion",
39024
+ "AwsSecretStoreArn",
39025
+ "DbClusterIdentifier"
39026
+ ]]
39027
+ ])],
39028
+ ["AWS::AppSync::GraphQLApi", /* @__PURE__ */ new Map([
39029
+ ["AdditionalAuthenticationProviders", ["AuthenticationType"]],
39030
+ ["EnhancedMetricsConfig", [
39031
+ "DataSourceLevelMetricsBehavior",
39032
+ "OperationLevelMetricsConfig",
39033
+ "ResolverLevelMetricsBehavior"
39034
+ ]],
39035
+ ["LogConfig", ["CloudWatchLogsRoleArn", "FieldLogLevel"]],
39036
+ ["Tags", ["Key", "Value"]]
39037
+ ])],
39038
+ ["AWS::AppSync::Resolver", /* @__PURE__ */ new Map([
39039
+ ["CachingConfig", ["Ttl"]],
39040
+ ["Runtime", ["Name", "RuntimeVersion"]],
39041
+ ["SyncConfig", ["ConflictDetection"]]
39042
+ ])],
39043
+ ["AWS::AutoScaling::AutoScalingGroup", /* @__PURE__ */ new Map([
39044
+ ["AvailabilityZoneImpairmentPolicy", ["ImpairedZoneHealthCheckBehavior", "ZonalShiftEnabled"]],
39045
+ ["CapacityReservationSpecification", ["CapacityReservationPreference"]],
39046
+ ["LaunchTemplate", ["Version"]],
39047
+ ["LifecycleHookSpecificationList", ["LifecycleHookName", "LifecycleTransition"]],
39048
+ ["MetricsCollection", ["Granularity"]],
39049
+ ["MixedInstancesPolicy", ["LaunchTemplate"]],
39050
+ ["MixedInstancesPolicy.InstancesDistribution.DistributionSegments", ["TargetCapacityTypes"]],
39051
+ ["MixedInstancesPolicy.LaunchTemplate", ["LaunchTemplateSpecification"]],
39052
+ ["MixedInstancesPolicy.LaunchTemplate.LaunchTemplateSpecification", ["Version"]],
39053
+ ["MixedInstancesPolicy.LaunchTemplate.Overrides.InstanceRequirements", ["MemoryMiB", "VCpuCount"]],
39054
+ ["MixedInstancesPolicy.LaunchTemplate.Overrides.LaunchTemplateSpecification", ["Version"]],
39055
+ ["NotificationConfiguration", ["TopicARN"]],
39056
+ ["NotificationConfigurations", ["TopicARN"]],
39057
+ ["Tags", [
39058
+ "Key",
39059
+ "PropagateAtLaunch",
39060
+ "Value"
39061
+ ]],
39062
+ ["TrafficSources", ["Identifier", "Type"]]
39063
+ ])],
39064
+ ["AWS::BedrockAgentCore::Evaluator", /* @__PURE__ */ new Map([
39065
+ ["EvaluatorConfig.CodeBased", ["LambdaConfig"]],
39066
+ ["EvaluatorConfig.CodeBased.LambdaConfig", ["LambdaArn"]],
39067
+ ["EvaluatorConfig.LlmAsAJudge", [
39068
+ "Instructions",
39069
+ "ModelConfig",
39070
+ "RatingScale"
39071
+ ]],
39072
+ ["EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig", ["ModelId"]],
39073
+ ["EvaluatorConfig.LlmAsAJudge.ModelConfig.ResponsesEvaluatorModelConfig", ["ModelId"]],
39074
+ ["EvaluatorConfig.LlmAsAJudge.RatingScale.Categorical", ["Definition", "Label"]],
39075
+ ["EvaluatorConfig.LlmAsAJudge.RatingScale.Numerical", [
39076
+ "Definition",
39077
+ "Label",
39078
+ "Value"
39079
+ ]],
39080
+ ["Tags", ["Key", "Value"]]
39081
+ ])],
39082
+ ["AWS::BedrockAgentCore::Runtime", /* @__PURE__ */ new Map([
39083
+ ["AgentRuntimeArtifact.CodeConfiguration", [
39084
+ "Code",
39085
+ "EntryPoint",
39086
+ "Runtime"
39087
+ ]],
39088
+ ["AgentRuntimeArtifact.CodeConfiguration.Code.S3", ["Bucket", "Prefix"]],
39089
+ ["AgentRuntimeArtifact.ContainerConfiguration", ["ContainerUri"]],
39090
+ ["AuthorizerConfiguration.CustomJWTAuthorizer", ["DiscoveryUrl"]],
39091
+ ["AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.HostingEnvironments", ["Arn"]],
39092
+ ["AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims", [
39093
+ "AuthorizingClaimMatchValue",
39094
+ "InboundTokenClaimName",
39095
+ "InboundTokenClaimValueType"
39096
+ ]],
39097
+ ["AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims.AuthorizingClaimMatchValue", ["ClaimMatchOperator", "ClaimMatchValue"]],
39098
+ ["AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides", ["Domain", "PrivateEndpoint"]],
39099
+ ["CapacityProviderConfiguration", ["CapacityProviderArn"]],
39100
+ ["FilesystemConfigurations.CapacityProviderVolume", ["MountPath", "VolumeName"]],
39101
+ ["FilesystemConfigurations.EfsAccessPoint", ["AccessPointArn", "MountPath"]],
39102
+ ["FilesystemConfigurations.S3FilesAccessPoint", ["AccessPointArn", "MountPath"]],
39103
+ ["FilesystemConfigurations.SessionStorage", ["MountPath"]],
39104
+ ["NetworkConfiguration", ["NetworkMode"]],
39105
+ ["NetworkConfiguration.NetworkModeConfig", ["SecurityGroups", "Subnets"]],
39106
+ ["WorkloadIdentityDetails", ["WorkloadIdentityArn"]]
39107
+ ])],
39108
+ ["AWS::Budgets::Budget", /* @__PURE__ */ new Map([
39109
+ ["Budget", ["BudgetType", "TimeUnit"]],
39110
+ ["Budget.AutoAdjustData", ["AutoAdjustType"]],
39111
+ ["Budget.AutoAdjustData.HistoricalOptions", ["BudgetAdjustmentPeriod"]],
39112
+ ["Budget.BudgetLimit", ["Amount", "Unit"]],
39113
+ ["NotificationsWithSubscribers", ["Notification", "Subscribers"]],
39114
+ ["NotificationsWithSubscribers.Notification", [
39115
+ "ComparisonOperator",
39116
+ "NotificationType",
39117
+ "Threshold"
39118
+ ]],
39119
+ ["NotificationsWithSubscribers.Subscribers", ["Address", "SubscriptionType"]],
39120
+ ["ResourceTags", ["Key"]]
39121
+ ])],
39122
+ ["AWS::CertificateManager::Certificate", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39123
+ ["AWS::CloudFormation::Stack", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39124
+ ["AWS::CloudFront::CloudFrontOriginAccessIdentity", /* @__PURE__ */ new Map([["CloudFrontOriginAccessIdentityConfig", ["Comment"]]])],
39125
+ ["AWS::CloudFront::Distribution", /* @__PURE__ */ new Map([
39126
+ ["DistributionConfig", ["DefaultCacheBehavior", "Enabled"]],
39127
+ ["DistributionConfig.CacheBehaviors", [
39128
+ "PathPattern",
39129
+ "TargetOriginId",
39130
+ "ViewerProtocolPolicy"
39131
+ ]],
39132
+ ["DistributionConfig.CacheBehaviors.ForwardedValues", ["QueryString"]],
39133
+ ["DistributionConfig.CacheBehaviors.ForwardedValues.Cookies", ["Forward"]],
39134
+ ["DistributionConfig.CacheBehaviors.GrpcConfig", ["Enabled"]],
39135
+ ["DistributionConfig.CacheTagConfig", ["HeaderName"]],
39136
+ ["DistributionConfig.ConnectionFunctionAssociation", ["Id"]],
39137
+ ["DistributionConfig.CustomErrorResponses", ["ErrorCode"]],
39138
+ ["DistributionConfig.CustomOrigin", [
39139
+ "DNSName",
39140
+ "OriginProtocolPolicy",
39141
+ "OriginSSLProtocols"
39142
+ ]],
39143
+ ["DistributionConfig.DefaultCacheBehavior", ["TargetOriginId", "ViewerProtocolPolicy"]],
39144
+ ["DistributionConfig.DefaultCacheBehavior.ForwardedValues", ["QueryString"]],
39145
+ ["DistributionConfig.DefaultCacheBehavior.ForwardedValues.Cookies", ["Forward"]],
39146
+ ["DistributionConfig.DefaultCacheBehavior.GrpcConfig", ["Enabled"]],
39147
+ ["DistributionConfig.OriginGroups", ["Quantity"]],
39148
+ ["DistributionConfig.OriginGroups.Items", [
39149
+ "FailoverCriteria",
39150
+ "Id",
39151
+ "Members"
39152
+ ]],
39153
+ ["DistributionConfig.OriginGroups.Items.FailoverCriteria", ["StatusCodes"]],
39154
+ ["DistributionConfig.OriginGroups.Items.FailoverCriteria.StatusCodes", ["Items", "Quantity"]],
39155
+ ["DistributionConfig.OriginGroups.Items.Members", ["Items", "Quantity"]],
39156
+ ["DistributionConfig.OriginGroups.Items.Members.Items", ["OriginId"]],
39157
+ ["DistributionConfig.Origins", ["DomainName", "Id"]],
39158
+ ["DistributionConfig.Origins.CustomOriginConfig", ["OriginProtocolPolicy"]],
39159
+ ["DistributionConfig.Origins.CustomOriginConfig.OriginMtlsConfig", ["ClientCertificateArn"]],
39160
+ ["DistributionConfig.Origins.OriginCustomHeaders", ["HeaderName", "HeaderValue"]],
39161
+ ["DistributionConfig.Origins.VpcOriginConfig", ["VpcOriginId"]],
39162
+ ["DistributionConfig.Restrictions", ["GeoRestriction"]],
39163
+ ["DistributionConfig.Restrictions.GeoRestriction", ["RestrictionType"]],
39164
+ ["DistributionConfig.S3Origin", ["DNSName"]],
39165
+ ["DistributionConfig.TenantConfig.ParameterDefinitions", ["Definition", "Name"]],
39166
+ ["DistributionConfig.TenantConfig.ParameterDefinitions.Definition.StringSchema", ["Required"]],
39167
+ ["DistributionConfig.ViewerMtlsConfig.TrustStoreConfig", ["TrustStoreId"]],
39168
+ ["Tags", ["Key", "Value"]]
39169
+ ])],
39170
+ ["AWS::CloudFront::OriginAccessControl", /* @__PURE__ */ new Map([["OriginAccessControlConfig", [
39171
+ "Name",
39172
+ "OriginAccessControlOriginType",
39173
+ "SigningBehavior",
39174
+ "SigningProtocol"
39175
+ ]]])],
39176
+ ["AWS::CloudTrail::Trail", /* @__PURE__ */ new Map([
39177
+ ["AdvancedEventSelectors", ["FieldSelectors"]],
39178
+ ["AdvancedEventSelectors.FieldSelectors", ["Field"]],
39179
+ ["AggregationConfigurations", ["EventCategory", "Templates"]],
39180
+ ["EventSelectors.DataResources", ["Type"]],
39181
+ ["Tags", ["Key", "Value"]]
39182
+ ])],
39183
+ ["AWS::CloudWatch::Alarm", /* @__PURE__ */ new Map([
39184
+ ["Dimensions", ["Name", "Value"]],
39185
+ ["Metrics", ["Id"]],
39186
+ ["Metrics.MetricStat", [
39187
+ "Metric",
39188
+ "Period",
39189
+ "Stat"
39190
+ ]],
39191
+ ["Metrics.MetricStat.Metric.Dimensions", ["Name", "Value"]],
39192
+ ["Tags", ["Key", "Value"]]
39193
+ ])],
39194
+ ["AWS::CloudWatch::AnomalyDetector", /* @__PURE__ */ new Map([
39195
+ ["Configuration.ExcludedTimeRanges", ["EndTime", "StartTime"]],
39196
+ ["Dimensions", ["Name", "Value"]],
39197
+ ["MetricMathAnomalyDetector.MetricDataQueries", ["Id"]],
39198
+ ["MetricMathAnomalyDetector.MetricDataQueries.MetricStat", [
39199
+ "Metric",
39200
+ "Period",
39201
+ "Stat"
39202
+ ]],
39203
+ ["MetricMathAnomalyDetector.MetricDataQueries.MetricStat.Metric", ["MetricName", "Namespace"]],
39204
+ ["MetricMathAnomalyDetector.MetricDataQueries.MetricStat.Metric.Dimensions", ["Name", "Value"]],
39205
+ ["SingleMetricAnomalyDetector.Dimensions", ["Name", "Value"]]
39206
+ ])],
39207
+ ["AWS::CodeBuild::Project", /* @__PURE__ */ new Map([
39208
+ ["Artifacts", ["Type"]],
39209
+ ["Cache", ["Type"]],
39210
+ ["Environment", [
39211
+ "ComputeType",
39212
+ "Image",
39213
+ "Type"
39214
+ ]],
39215
+ ["Environment.DockerServer", ["ComputeType"]],
39216
+ ["Environment.EnvironmentVariables", ["Name", "Value"]],
39217
+ ["Environment.RegistryCredential", ["Credential", "CredentialProvider"]],
39218
+ ["FileSystemLocations", [
39219
+ "Identifier",
39220
+ "Location",
39221
+ "MountPoint",
39222
+ "Type"
39223
+ ]],
39224
+ ["LogsConfig.CloudWatchLogs", ["Status"]],
39225
+ ["LogsConfig.S3Logs", ["Status"]],
39226
+ ["SecondaryArtifacts", ["Type"]],
39227
+ ["SecondarySourceVersions", ["SourceIdentifier"]],
39228
+ ["SecondarySources", ["Type"]],
39229
+ ["SecondarySources.Auth", ["Type"]],
39230
+ ["SecondarySources.GitSubmodulesConfig", ["FetchSubmodules"]],
39231
+ ["Source", ["Type"]],
39232
+ ["Source.Auth", ["Type"]],
39233
+ ["Source.GitSubmodulesConfig", ["FetchSubmodules"]],
39234
+ ["Tags", ["Key", "Value"]],
39235
+ ["Triggers.PullRequestBuildPolicy", ["RequiresCommentApproval"]],
39236
+ ["Triggers.ScopeConfiguration", ["Name"]]
39237
+ ])],
39238
+ ["AWS::CodeCommit::Repository", /* @__PURE__ */ new Map([
39239
+ ["Code", ["S3"]],
39240
+ ["Code.S3", ["Bucket", "Key"]],
39241
+ ["Tags", ["Key", "Value"]],
39242
+ ["Triggers", [
39243
+ "DestinationArn",
39244
+ "Events",
39245
+ "Name"
39246
+ ]]
39247
+ ])],
39248
+ ["AWS::Cognito::UserPool", /* @__PURE__ */ new Map([["SmsConfiguration.EumsSms", ["CallerArn"]], ["UserAttributeUpdateSettings", ["AttributesRequireVerificationBeforeUpdate"]]])],
39249
+ ["AWS::DLM::LifecyclePolicy", /* @__PURE__ */ new Map([
39250
+ ["Exclusions.ExcludeTags", ["Key", "Value"]],
39251
+ ["PolicyDetails.Actions", ["CrossRegionCopy", "Name"]],
39252
+ ["PolicyDetails.Actions.CrossRegionCopy", ["EncryptionConfiguration", "Target"]],
39253
+ ["PolicyDetails.Actions.CrossRegionCopy.EncryptionConfiguration", ["Encrypted"]],
39254
+ ["PolicyDetails.Actions.CrossRegionCopy.RetainRule", ["Interval", "IntervalUnit"]],
39255
+ ["PolicyDetails.EventSource", ["Type"]],
39256
+ ["PolicyDetails.EventSource.Parameters", ["EventType", "SnapshotOwner"]],
39257
+ ["PolicyDetails.Exclusions.ExcludeTags", ["Key", "Value"]],
39258
+ ["PolicyDetails.Parameters.ExcludeDataVolumeTags", ["Key", "Value"]],
39259
+ ["PolicyDetails.Schedules.ArchiveRule", ["RetainRule"]],
39260
+ ["PolicyDetails.Schedules.ArchiveRule.RetainRule", ["RetentionArchiveTier"]],
39261
+ ["PolicyDetails.Schedules.CrossRegionCopyRules", ["Encrypted"]],
39262
+ ["PolicyDetails.Schedules.CrossRegionCopyRules.DeprecateRule", ["Interval", "IntervalUnit"]],
39263
+ ["PolicyDetails.Schedules.CrossRegionCopyRules.RetainRule", ["Interval", "IntervalUnit"]],
39264
+ ["PolicyDetails.Schedules.TagsToAdd", ["Key", "Value"]],
39265
+ ["PolicyDetails.Schedules.VariableTags", ["Key", "Value"]],
39266
+ ["PolicyDetails.TargetTags", ["Key", "Value"]],
39267
+ ["Tags", ["Key", "Value"]]
39268
+ ])],
39269
+ ["AWS::DocDB::DBCluster", /* @__PURE__ */ new Map([["ServerlessV2ScalingConfiguration", ["MaxCapacity", "MinCapacity"]], ["Tags", ["Key", "Value"]]])],
39270
+ ["AWS::DocDB::DBInstance", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39271
+ ["AWS::DocDB::DBSubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39272
+ ["AWS::DynamoDB::GlobalTable", /* @__PURE__ */ new Map([
39273
+ ["AttributeDefinitions", ["AttributeName", "AttributeType"]],
39274
+ ["GlobalSecondaryIndexes", [
39275
+ "IndexName",
39276
+ "KeySchema",
39277
+ "Projection"
39278
+ ]],
39279
+ ["GlobalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
39280
+ ["GlobalSecondaryIndexes.WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings", [
39281
+ "MaxCapacity",
39282
+ "MinCapacity",
39283
+ "TargetTrackingScalingPolicyConfiguration"
39284
+ ]],
39285
+ ["GlobalSecondaryIndexes.WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]],
39286
+ ["KeySchema", ["AttributeName", "KeyType"]],
39287
+ ["LocalSecondaryIndexes", [
39288
+ "IndexName",
39289
+ "KeySchema",
39290
+ "Projection"
39291
+ ]],
39292
+ ["LocalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
39293
+ ["Replicas", ["Region"]],
39294
+ ["Replicas.ContributorInsightsSpecification", ["Enabled"]],
39295
+ ["Replicas.GlobalSecondaryIndexes", ["IndexName"]],
39296
+ ["Replicas.GlobalSecondaryIndexes.ContributorInsightsSpecification", ["Enabled"]],
39297
+ ["Replicas.GlobalSecondaryIndexes.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings", [
39298
+ "MaxCapacity",
39299
+ "MinCapacity",
39300
+ "TargetTrackingScalingPolicyConfiguration"
39301
+ ]],
39302
+ ["Replicas.GlobalSecondaryIndexes.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]],
39303
+ ["Replicas.KinesisStreamSpecification", ["StreamArn"]],
39304
+ ["Replicas.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings", [
39305
+ "MaxCapacity",
39306
+ "MinCapacity",
39307
+ "TargetTrackingScalingPolicyConfiguration"
39308
+ ]],
39309
+ ["Replicas.ReadProvisionedThroughputSettings.ReadCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]],
39310
+ ["Replicas.ReplicaStreamSpecification.ResourcePolicy", ["PolicyDocument"]],
39311
+ ["Replicas.ReplicaStreamSpecification.Tags", ["Key", "Value"]],
39312
+ ["Replicas.ResourcePolicy", ["PolicyDocument"]],
39313
+ ["Replicas.SSESpecification", ["KMSMasterKeyId"]],
39314
+ ["Replicas.Tags", ["Key", "Value"]],
39315
+ ["SSESpecification", ["SSEEnabled"]],
39316
+ ["StreamSpecification", ["StreamViewType"]],
39317
+ ["TimeToLiveSpecification", ["Enabled"]],
39318
+ ["VectorIndexes", [
39319
+ "Dimensions",
39320
+ "DistanceFunction",
39321
+ "IndexName",
39322
+ "Projection",
39323
+ "VectorAttribute"
39324
+ ]],
39325
+ ["VectorIndexes.SearchSchema", ["AttributeName", "SearchSchemaElementType"]],
39326
+ ["VectorIndexes.VectorAttribute", ["AttributeName"]],
39327
+ ["WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings", [
39328
+ "MaxCapacity",
39329
+ "MinCapacity",
39330
+ "TargetTrackingScalingPolicyConfiguration"
39331
+ ]],
39332
+ ["WriteProvisionedThroughputSettings.WriteCapacityAutoScalingSettings.TargetTrackingScalingPolicyConfiguration", ["TargetValue"]]
39333
+ ])],
39334
+ ["AWS::DynamoDB::Table", /* @__PURE__ */ new Map([
39335
+ ["AttributeDefinitions", ["AttributeName", "AttributeType"]],
39336
+ ["ContributorInsightsSpecification", ["Enabled"]],
39337
+ ["GlobalSecondaryIndexes", [
39338
+ "IndexName",
39339
+ "KeySchema",
39340
+ "Projection"
39341
+ ]],
39342
+ ["GlobalSecondaryIndexes.ContributorInsightsSpecification", ["Enabled"]],
39343
+ ["GlobalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
39344
+ ["GlobalSecondaryIndexes.ProvisionedThroughput", ["ReadCapacityUnits", "WriteCapacityUnits"]],
39345
+ ["ImportSourceSpecification", ["InputFormat", "S3BucketSource"]],
39346
+ ["ImportSourceSpecification.S3BucketSource", ["S3Bucket"]],
39347
+ ["KinesisStreamSpecification", ["StreamArn"]],
39348
+ ["LocalSecondaryIndexes", [
39349
+ "IndexName",
39350
+ "KeySchema",
39351
+ "Projection"
39352
+ ]],
39353
+ ["LocalSecondaryIndexes.KeySchema", ["AttributeName", "KeyType"]],
39354
+ ["ProvisionedThroughput", ["ReadCapacityUnits", "WriteCapacityUnits"]],
39355
+ ["ResourcePolicy", ["PolicyDocument"]],
39356
+ ["SSESpecification", ["SSEEnabled"]],
39357
+ ["StreamSpecification", ["StreamViewType"]],
39358
+ ["StreamSpecification.ResourcePolicy", ["PolicyDocument"]],
39359
+ ["StreamSpecification.Tags", ["Key", "Value"]],
39360
+ ["Tags", ["Key", "Value"]],
39361
+ ["TimeToLiveSpecification", ["Enabled"]],
39362
+ ["VectorIndexes", [
39363
+ "Dimensions",
39364
+ "DistanceFunction",
39365
+ "IndexName",
39366
+ "Projection",
39367
+ "VectorAttribute"
39368
+ ]],
39369
+ ["VectorIndexes.SearchSchema", ["AttributeName", "SearchSchemaElementType"]],
39370
+ ["VectorIndexes.VectorAttribute", ["AttributeName"]]
39371
+ ])],
39372
+ ["AWS::EC2::EIP", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39373
+ ["AWS::EC2::Instance", /* @__PURE__ */ new Map([
39374
+ ["BlockDeviceMappings", ["DeviceName"]],
39375
+ ["ElasticGpuSpecifications", ["Type"]],
39376
+ ["ElasticInferenceAccelerators", ["Type"]],
39377
+ ["Ipv6Addresses", ["Ipv6Address"]],
39378
+ ["LicenseSpecifications", ["LicenseConfigurationArn"]],
39379
+ ["NetworkInterfaces", ["DeviceIndex"]],
39380
+ ["NetworkInterfaces.Ipv6Addresses", ["Ipv6Address"]],
39381
+ ["NetworkInterfaces.PrivateIpAddresses", ["Primary", "PrivateIpAddress"]],
39382
+ ["SsmAssociations", ["DocumentName"]],
39383
+ ["SsmAssociations.AssociationParameters", ["Key", "Value"]],
39384
+ ["Tags", ["Key", "Value"]],
39385
+ ["Volumes", ["Device", "VolumeId"]]
39386
+ ])],
39387
+ ["AWS::EC2::InternetGateway", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39388
+ ["AWS::EC2::NatGateway", /* @__PURE__ */ new Map([["AvailabilityZoneAddresses", ["AllocationIds"]], ["Tags", ["Key", "Value"]]])],
39389
+ ["AWS::EC2::NetworkAcl", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39390
+ ["AWS::EC2::RouteTable", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39391
+ ["AWS::EC2::SecurityGroup", /* @__PURE__ */ new Map([
39392
+ ["SecurityGroupEgress", ["IpProtocol"]],
39393
+ ["SecurityGroupIngress", ["IpProtocol"]],
39394
+ ["Tags", ["Key", "Value"]]
39395
+ ])],
39396
+ ["AWS::EC2::Subnet", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39397
+ ["AWS::EC2::VPC", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39398
+ ["AWS::ECR::Repository", /* @__PURE__ */ new Map([
39399
+ ["EncryptionConfiguration", ["EncryptionType"]],
39400
+ ["ImageTagMutabilityExclusionFilters", ["ImageTagMutabilityExclusionFilterType", "ImageTagMutabilityExclusionFilterValue"]],
39401
+ ["Tags", ["Key", "Value"]]
39402
+ ])],
39403
+ ["AWS::ECS::Service", /* @__PURE__ */ new Map([
39404
+ ["DeploymentConfiguration.Alarms", [
39405
+ "AlarmNames",
39406
+ "Enable",
39407
+ "Rollback"
39408
+ ]],
39409
+ ["DeploymentConfiguration.DeploymentCircuitBreaker", ["Enable", "Rollback"]],
39410
+ ["DeploymentConfiguration.DeploymentCircuitBreaker.ThresholdConfiguration", ["Type", "Value"]],
39411
+ ["DeploymentConfiguration.LifecycleHooks", ["LifecycleStages"]],
39412
+ ["ForceNewDeployment", ["EnableForceNewDeployment"]],
39413
+ ["LoadBalancers.AdvancedConfiguration", ["AlternateTargetGroupArn"]],
39414
+ ["Monitoring", ["MetricConfigurations"]],
39415
+ ["Monitoring.MetricConfigurations", ["MetricNames", "ResolutionSeconds"]],
39416
+ ["PlacementConstraints", ["Type"]],
39417
+ ["PlacementStrategies", ["Type"]],
39418
+ ["ServiceConnectConfiguration", ["Enabled"]],
39419
+ ["ServiceConnectConfiguration.AccessLogConfiguration", ["Format"]],
39420
+ ["ServiceConnectConfiguration.LogConfiguration.SecretOptions", ["Name", "ValueFrom"]],
39421
+ ["ServiceConnectConfiguration.Services", ["PortName"]],
39422
+ ["ServiceConnectConfiguration.Services.ClientAliases", ["Port"]],
39423
+ ["ServiceConnectConfiguration.Services.ClientAliases.TestTrafficRules", ["Header"]],
39424
+ ["ServiceConnectConfiguration.Services.ClientAliases.TestTrafficRules.Header", ["Name"]],
39425
+ ["ServiceConnectConfiguration.Services.ClientAliases.TestTrafficRules.Header.Value", ["Exact"]],
39426
+ ["ServiceConnectConfiguration.Services.Tls", ["IssuerCertificateAuthority"]],
39427
+ ["VolumeConfigurations", ["Name"]],
39428
+ ["VolumeConfigurations.ManagedEBSVolume", ["RoleArn"]],
39429
+ ["VolumeConfigurations.ManagedEBSVolume.TagSpecifications", ["ResourceType"]],
39430
+ ["VpcLatticeConfigurations", [
39431
+ "PortName",
39432
+ "RoleArn",
39433
+ "TargetGroupArn"
39434
+ ]]
39435
+ ])],
39436
+ ["AWS::ECS::TaskDefinition", /* @__PURE__ */ new Map([
39437
+ ["ContainerDefinitions", ["Image", "Name"]],
39438
+ ["ContainerDefinitions.LinuxParameters.Tmpfs", ["Size"]],
39439
+ ["ContainerDefinitions.LogConfiguration", ["LogDriver"]],
39440
+ ["ContainerDefinitions.LogConfiguration.SecretOptions", ["Name", "ValueFrom"]],
39441
+ ["ContainerDefinitions.ResourceRequirements", ["Type", "Value"]],
39442
+ ["ContainerDefinitions.Secrets", ["Name", "ValueFrom"]],
39443
+ ["ContainerDefinitions.Ulimits", [
39444
+ "HardLimit",
39445
+ "Name",
39446
+ "SoftLimit"
39447
+ ]],
39448
+ ["PlacementConstraints", ["Type"]],
39449
+ ["ProxyConfiguration", ["ContainerName"]],
39450
+ ["Volumes.EFSVolumeConfiguration", ["FilesystemId"]],
39451
+ ["Volumes.FSxWindowsFileServerVolumeConfiguration", ["FileSystemId", "RootDirectory"]],
39452
+ ["Volumes.FSxWindowsFileServerVolumeConfiguration.AuthorizationConfig", ["CredentialsParameter", "Domain"]],
39453
+ ["Volumes.S3FilesVolumeConfiguration", ["FileSystemArn"]]
39454
+ ])],
39455
+ ["AWS::EFS::AccessPoint", /* @__PURE__ */ new Map([["PosixUser", ["Gid", "Uid"]], ["RootDirectory.CreationInfo", [
39456
+ "OwnerGid",
39457
+ "OwnerUid",
39458
+ "Permissions"
39459
+ ]]])],
39460
+ ["AWS::EFS::FileSystem", /* @__PURE__ */ new Map([["BackupPolicy", ["Status"]], ["FileSystemTags", ["Key", "Value"]]])],
39461
+ ["AWS::ElastiCache::CacheCluster", /* @__PURE__ */ new Map([
39462
+ ["LogDeliveryConfigurations", [
39463
+ "DestinationDetails",
39464
+ "DestinationType",
39465
+ "LogFormat",
39466
+ "LogType"
39467
+ ]],
39468
+ ["LogDeliveryConfigurations.DestinationDetails.CloudWatchLogsDetails", ["LogGroup"]],
39469
+ ["LogDeliveryConfigurations.DestinationDetails.KinesisFirehoseDetails", ["DeliveryStream"]],
39470
+ ["Tags", ["Key", "Value"]]
39471
+ ])],
39472
+ ["AWS::ElastiCache::SubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39473
+ ["AWS::ElasticLoadBalancingV2::Listener", /* @__PURE__ */ new Map([
39474
+ ["DefaultActions", ["Type"]],
39475
+ ["DefaultActions.AuthenticateCognitoConfig", [
39476
+ "UserPoolArn",
39477
+ "UserPoolClientId",
39478
+ "UserPoolDomain"
39479
+ ]],
39480
+ ["DefaultActions.AuthenticateOidcConfig", [
39481
+ "AuthorizationEndpoint",
39482
+ "ClientId",
39483
+ "Issuer",
39484
+ "TokenEndpoint",
39485
+ "UserInfoEndpoint"
39486
+ ]],
39487
+ ["DefaultActions.FixedResponseConfig", ["StatusCode"]],
39488
+ ["DefaultActions.JwtValidationConfig", ["Issuer", "JwksEndpoint"]],
39489
+ ["DefaultActions.JwtValidationConfig.AdditionalClaims", [
39490
+ "Format",
39491
+ "Name",
39492
+ "Values"
39493
+ ]],
39494
+ ["DefaultActions.RedirectConfig", ["StatusCode"]],
39495
+ ["Tags", ["Key", "Value"]]
39496
+ ])],
39497
+ ["AWS::ElasticLoadBalancingV2::LoadBalancer", /* @__PURE__ */ new Map([
39498
+ ["MinimumLoadBalancerCapacity", ["CapacityUnits"]],
39499
+ ["SubnetMappings", ["SubnetId"]],
39500
+ ["Tags", ["Key"]]
39501
+ ])],
39502
+ ["AWS::ElasticLoadBalancingV2::TargetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]], ["Targets", ["Id"]]])],
39503
+ ["AWS::EMR::Cluster", /* @__PURE__ */ new Map([
39504
+ ["BootstrapActions", ["Name", "ScriptBootstrapAction"]],
39505
+ ["BootstrapActions.ScriptBootstrapAction", ["Path"]],
39506
+ ["Instances.CoreInstanceFleet.InstanceTypeConfigs", ["InstanceType"]],
39507
+ ["Instances.CoreInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39508
+ ["Instances.CoreInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39509
+ ["Instances.CoreInstanceFleet.LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
39510
+ ["Instances.CoreInstanceFleet.LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]],
39511
+ ["Instances.CoreInstanceGroup", ["InstanceCount", "InstanceType"]],
39512
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy", ["Constraints", "Rules"]],
39513
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
39514
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules", [
39515
+ "Action",
39516
+ "Name",
39517
+ "Trigger"
39518
+ ]],
39519
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
39520
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
39521
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
39522
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
39523
+ "ComparisonOperator",
39524
+ "MetricName",
39525
+ "Period",
39526
+ "Threshold"
39527
+ ]],
39528
+ ["Instances.CoreInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
39529
+ ["Instances.CoreInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39530
+ ["Instances.CoreInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39531
+ ["Instances.MasterInstanceFleet.InstanceTypeConfigs", ["InstanceType"]],
39532
+ ["Instances.MasterInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39533
+ ["Instances.MasterInstanceFleet.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39534
+ ["Instances.MasterInstanceFleet.LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
39535
+ ["Instances.MasterInstanceFleet.LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]],
39536
+ ["Instances.MasterInstanceGroup", ["InstanceCount", "InstanceType"]],
39537
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy", ["Constraints", "Rules"]],
39538
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
39539
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules", [
39540
+ "Action",
39541
+ "Name",
39542
+ "Trigger"
39543
+ ]],
39544
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
39545
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
39546
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
39547
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
39548
+ "ComparisonOperator",
39549
+ "MetricName",
39550
+ "Period",
39551
+ "Threshold"
39552
+ ]],
39553
+ ["Instances.MasterInstanceGroup.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
39554
+ ["Instances.MasterInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39555
+ ["Instances.MasterInstanceGroup.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39556
+ ["Instances.Placement", ["AvailabilityZone"]],
39557
+ ["Instances.TaskInstanceFleets.InstanceTypeConfigs", ["InstanceType"]],
39558
+ ["Instances.TaskInstanceFleets.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39559
+ ["Instances.TaskInstanceFleets.InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39560
+ ["Instances.TaskInstanceFleets.LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
39561
+ ["Instances.TaskInstanceFleets.LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]],
39562
+ ["Instances.TaskInstanceGroups", ["InstanceCount", "InstanceType"]],
39563
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy", ["Constraints", "Rules"]],
39564
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
39565
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules", [
39566
+ "Action",
39567
+ "Name",
39568
+ "Trigger"
39569
+ ]],
39570
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
39571
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
39572
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
39573
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
39574
+ "ComparisonOperator",
39575
+ "MetricName",
39576
+ "Period",
39577
+ "Threshold"
39578
+ ]],
39579
+ ["Instances.TaskInstanceGroups.AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
39580
+ ["Instances.TaskInstanceGroups.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39581
+ ["Instances.TaskInstanceGroups.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39582
+ ["KerberosAttributes", ["KdcAdminPassword", "Realm"]],
39583
+ ["ManagedScalingPolicy.ComputeLimits", [
39584
+ "MaximumCapacityUnits",
39585
+ "MinimumCapacityUnits",
39586
+ "UnitType"
39587
+ ]],
39588
+ ["PlacementGroupConfigs", ["InstanceRole"]],
39589
+ ["Steps", ["HadoopJarStep", "Name"]],
39590
+ ["Steps.HadoopJarStep", ["Jar"]],
39591
+ ["Tags", ["Key", "Value"]]
39592
+ ])],
39593
+ ["AWS::EMR::InstanceFleetConfig", /* @__PURE__ */ new Map([
39594
+ ["InstanceTypeConfigs", ["InstanceType"]],
39595
+ ["InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39596
+ ["InstanceTypeConfigs.EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]],
39597
+ ["LaunchSpecifications.OnDemandSpecification", ["AllocationStrategy"]],
39598
+ ["LaunchSpecifications.SpotSpecification", ["TimeoutAction", "TimeoutDurationMinutes"]]
39599
+ ])],
39600
+ ["AWS::EMR::InstanceGroupConfig", /* @__PURE__ */ new Map([
39601
+ ["AutoScalingPolicy", ["Constraints", "Rules"]],
39602
+ ["AutoScalingPolicy.Constraints", ["MaxCapacity", "MinCapacity"]],
39603
+ ["AutoScalingPolicy.Rules", [
39604
+ "Action",
39605
+ "Name",
39606
+ "Trigger"
39607
+ ]],
39608
+ ["AutoScalingPolicy.Rules.Action", ["SimpleScalingPolicyConfiguration"]],
39609
+ ["AutoScalingPolicy.Rules.Action.SimpleScalingPolicyConfiguration", ["ScalingAdjustment"]],
39610
+ ["AutoScalingPolicy.Rules.Trigger", ["CloudWatchAlarmDefinition"]],
39611
+ ["AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition", [
39612
+ "ComparisonOperator",
39613
+ "MetricName",
39614
+ "Period",
39615
+ "Threshold"
39616
+ ]],
39617
+ ["AutoScalingPolicy.Rules.Trigger.CloudWatchAlarmDefinition.Dimensions", ["Key", "Value"]],
39618
+ ["EbsConfiguration.EbsBlockDeviceConfigs", ["VolumeSpecification"]],
39619
+ ["EbsConfiguration.EbsBlockDeviceConfigs.VolumeSpecification", ["SizeInGB", "VolumeType"]]
39620
+ ])],
39621
+ ["AWS::Events::EventBus", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39622
+ ["AWS::Events::Rule", /* @__PURE__ */ new Map([
39623
+ ["Targets", ["Arn", "Id"]],
39624
+ ["Targets.AppSyncParameters", ["GraphQLOperation"]],
39625
+ ["Targets.BatchParameters", ["JobDefinition", "JobName"]],
39626
+ ["Targets.EcsParameters", ["TaskDefinitionArn"]],
39627
+ ["Targets.EcsParameters.CapacityProviderStrategy", ["CapacityProvider"]],
39628
+ ["Targets.EcsParameters.NetworkConfiguration.AwsVpcConfiguration", ["Subnets"]],
39629
+ ["Targets.InputTransformer", ["InputTemplate"]],
39630
+ ["Targets.KinesisParameters", ["PartitionKeyPath"]],
39631
+ ["Targets.RedshiftDataParameters", ["Database"]],
39632
+ ["Targets.RunCommandParameters", ["RunCommandTargets"]],
39633
+ ["Targets.RunCommandParameters.RunCommandTargets", ["Key", "Values"]],
39634
+ ["Targets.SageMakerPipelineParameters.PipelineParameterList", ["Name", "Value"]],
39635
+ ["Targets.SqsParameters", ["MessageGroupId"]]
39636
+ ])],
39637
+ ["AWS::FSx::FileSystem", /* @__PURE__ */ new Map([
39638
+ ["LustreConfiguration.LogConfiguration", ["Level"]],
39639
+ ["OntapConfiguration", ["DeploymentType"]],
39640
+ ["OpenZFSConfiguration", ["DeploymentType"]],
39641
+ ["Tags", ["Key", "Value"]],
39642
+ ["WindowsConfiguration", ["ThroughputCapacity"]],
39643
+ ["WindowsConfiguration.AuditLogConfiguration", ["FileAccessAuditLogLevel", "FileShareAccessAuditLogLevel"]],
39644
+ ["WindowsConfiguration.FsrmConfiguration", ["FsrmServiceEnabled"]]
39645
+ ])],
39646
+ ["AWS::Glue::Connection", /* @__PURE__ */ new Map([["ConnectionInput", ["ConnectionType"]], ["ConnectionInput.AuthenticationConfiguration", ["AuthenticationType"]]])],
39647
+ ["AWS::Glue::Table", /* @__PURE__ */ new Map([
39648
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput", ["Location", "Schema"]],
39649
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput.PartitionSpec", ["Fields"]],
39650
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput.PartitionSpec.Fields", [
39651
+ "Name",
39652
+ "SourceId",
39653
+ "Transform"
39654
+ ]],
39655
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput.Schema", ["Fields"]],
39656
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput.Schema.Fields", [
39657
+ "Id",
39658
+ "Name",
39659
+ "Required",
39660
+ "Type"
39661
+ ]],
39662
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput.WriteOrder", ["Fields", "OrderId"]],
39663
+ ["OpenTableFormatInput.IcebergInput.IcebergTableInput.WriteOrder.Fields", [
39664
+ "Direction",
39665
+ "NullOrder",
39666
+ "SourceId",
39667
+ "Transform"
39668
+ ]],
39669
+ ["TableInput.PartitionKeys", ["Name"]],
39670
+ ["TableInput.StorageDescriptor.Columns", ["Name"]],
39671
+ ["TableInput.StorageDescriptor.SortColumns", ["Column", "SortOrder"]]
39672
+ ])],
39673
+ ["AWS::Glue::Trigger", /* @__PURE__ */ new Map([["EventBatchingCondition", ["BatchSize"]]])],
39674
+ ["AWS::IAM::Group", /* @__PURE__ */ new Map([["Policies", ["PolicyDocument", "PolicyName"]]])],
39675
+ ["AWS::IAM::Role", /* @__PURE__ */ new Map([["Policies", ["PolicyDocument", "PolicyName"]], ["Tags", ["Key", "Value"]]])],
39676
+ ["AWS::IAM::User", /* @__PURE__ */ new Map([
39677
+ ["LoginProfile", ["Password"]],
39678
+ ["Policies", ["PolicyDocument", "PolicyName"]],
39679
+ ["Tags", ["Key", "Value"]]
39680
+ ])],
39681
+ ["AWS::Kinesis::Stream", /* @__PURE__ */ new Map([
39682
+ ["StreamEncryption", ["EncryptionType", "KeyId"]],
39683
+ ["StreamModeDetails", ["StreamMode"]],
39684
+ ["Tags", ["Key", "Value"]]
39685
+ ])],
39686
+ ["AWS::Kinesis::StreamConsumer", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39687
+ ["AWS::KinesisFirehose::DeliveryStream", /* @__PURE__ */ new Map([
39688
+ ["AmazonOpenSearchServerlessDestinationConfiguration", [
39689
+ "IndexName",
39690
+ "RoleARN",
39691
+ "S3Configuration"
39692
+ ]],
39693
+ ["AmazonOpenSearchServerlessDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39694
+ ["AmazonOpenSearchServerlessDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39695
+ ["AmazonOpenSearchServerlessDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39696
+ ["AmazonOpenSearchServerlessDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39697
+ ["AmazonOpenSearchServerlessDestinationConfiguration.VpcConfiguration", [
39698
+ "RoleARN",
39699
+ "SecurityGroupIds",
39700
+ "SubnetIds"
39701
+ ]],
39702
+ ["AmazonopensearchserviceDestinationConfiguration", [
39703
+ "IndexName",
39704
+ "RoleARN",
39705
+ "S3Configuration"
39706
+ ]],
39707
+ ["AmazonopensearchserviceDestinationConfiguration.DocumentIdOptions", ["DefaultDocumentIdFormat"]],
39708
+ ["AmazonopensearchserviceDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39709
+ ["AmazonopensearchserviceDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39710
+ ["AmazonopensearchserviceDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39711
+ ["AmazonopensearchserviceDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39712
+ ["AmazonopensearchserviceDestinationConfiguration.VpcConfiguration", [
39713
+ "RoleARN",
39714
+ "SecurityGroupIds",
39715
+ "SubnetIds"
39716
+ ]],
39717
+ ["DatabaseSourceConfiguration", [
39718
+ "DatabaseSourceAuthenticationConfiguration",
39719
+ "DatabaseSourceVPCConfiguration",
39720
+ "Databases",
39721
+ "Endpoint",
39722
+ "Port",
39723
+ "SnapshotWatermarkTable",
39724
+ "Tables",
39725
+ "Type"
39726
+ ]],
39727
+ ["DatabaseSourceConfiguration.DatabaseSourceAuthenticationConfiguration", ["SecretsManagerConfiguration"]],
39728
+ ["DatabaseSourceConfiguration.DatabaseSourceAuthenticationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
39729
+ ["DatabaseSourceConfiguration.DatabaseSourceVPCConfiguration", ["VpcEndpointServiceName"]],
39730
+ ["DeliveryStreamEncryptionConfigurationInput", ["KeyType"]],
39731
+ ["ElasticsearchDestinationConfiguration", [
39732
+ "IndexName",
39733
+ "RoleARN",
39734
+ "S3Configuration"
39735
+ ]],
39736
+ ["ElasticsearchDestinationConfiguration.DocumentIdOptions", ["DefaultDocumentIdFormat"]],
39737
+ ["ElasticsearchDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39738
+ ["ElasticsearchDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39739
+ ["ElasticsearchDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39740
+ ["ElasticsearchDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39741
+ ["ElasticsearchDestinationConfiguration.VpcConfiguration", [
39742
+ "RoleARN",
39743
+ "SecurityGroupIds",
39744
+ "SubnetIds"
39745
+ ]],
39746
+ ["ExtendedS3DestinationConfiguration", ["BucketARN", "RoleARN"]],
39747
+ ["ExtendedS3DestinationConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39748
+ ["ExtendedS3DestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39749
+ ["ExtendedS3DestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39750
+ ["ExtendedS3DestinationConfiguration.S3BackupConfiguration", ["BucketARN", "RoleARN"]],
39751
+ ["ExtendedS3DestinationConfiguration.S3BackupConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39752
+ ["HttpEndpointDestinationConfiguration", ["EndpointConfiguration", "S3Configuration"]],
39753
+ ["HttpEndpointDestinationConfiguration.EndpointConfiguration", ["Url"]],
39754
+ ["HttpEndpointDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39755
+ ["HttpEndpointDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39756
+ ["HttpEndpointDestinationConfiguration.RequestConfiguration.CommonAttributes", ["AttributeName", "AttributeValue"]],
39757
+ ["HttpEndpointDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39758
+ ["HttpEndpointDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39759
+ ["HttpEndpointDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
39760
+ ["IcebergDestinationConfiguration", [
39761
+ "CatalogConfiguration",
39762
+ "RoleARN",
39763
+ "S3Configuration"
39764
+ ]],
39765
+ ["IcebergDestinationConfiguration.DestinationTableConfigurationList", ["DestinationDatabaseName", "DestinationTableName"]],
39766
+ ["IcebergDestinationConfiguration.DestinationTableConfigurationList.PartitionSpec.Identity", ["SourceName"]],
39767
+ ["IcebergDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39768
+ ["IcebergDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39769
+ ["IcebergDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39770
+ ["IcebergDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39771
+ ["KinesisStreamSourceConfiguration", ["KinesisStreamARN", "RoleARN"]],
39772
+ ["MSKSourceConfiguration", [
39773
+ "AuthenticationConfiguration",
39774
+ "MSKClusterARN",
39775
+ "TopicName"
39776
+ ]],
39777
+ ["MSKSourceConfiguration.AuthenticationConfiguration", ["Connectivity", "RoleARN"]],
39778
+ ["RedshiftDestinationConfiguration", [
39779
+ "ClusterJDBCURL",
39780
+ "CopyCommand",
39781
+ "RoleARN",
39782
+ "S3Configuration"
39783
+ ]],
39784
+ ["RedshiftDestinationConfiguration.CopyCommand", ["DataTableName"]],
39785
+ ["RedshiftDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39786
+ ["RedshiftDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39787
+ ["RedshiftDestinationConfiguration.S3BackupConfiguration", ["BucketARN", "RoleARN"]],
39788
+ ["RedshiftDestinationConfiguration.S3BackupConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39789
+ ["RedshiftDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39790
+ ["RedshiftDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39791
+ ["RedshiftDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
39792
+ ["S3DestinationConfiguration", ["BucketARN", "RoleARN"]],
39793
+ ["S3DestinationConfiguration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39794
+ ["SnowflakeDestinationConfiguration", [
39795
+ "AccountUrl",
39796
+ "Database",
39797
+ "RoleARN",
39798
+ "S3Configuration",
39799
+ "Schema",
39800
+ "Table"
39801
+ ]],
39802
+ ["SnowflakeDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39803
+ ["SnowflakeDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39804
+ ["SnowflakeDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39805
+ ["SnowflakeDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39806
+ ["SnowflakeDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
39807
+ ["SnowflakeDestinationConfiguration.SnowflakeVpcConfiguration", ["PrivateLinkVpceId"]],
39808
+ ["SplunkDestinationConfiguration", [
39809
+ "HECEndpoint",
39810
+ "HECEndpointType",
39811
+ "S3Configuration"
39812
+ ]],
39813
+ ["SplunkDestinationConfiguration.ProcessingConfiguration.Processors", ["Type"]],
39814
+ ["SplunkDestinationConfiguration.ProcessingConfiguration.Processors.Parameters", ["ParameterName", "ParameterValue"]],
39815
+ ["SplunkDestinationConfiguration.S3Configuration", ["BucketARN", "RoleARN"]],
39816
+ ["SplunkDestinationConfiguration.S3Configuration.EncryptionConfiguration.KMSEncryptionConfig", ["AWSKMSKeyARN"]],
39817
+ ["SplunkDestinationConfiguration.SecretsManagerConfiguration", ["Enabled"]],
39818
+ ["Tags", ["Key"]]
39819
+ ])],
39820
+ ["AWS::KMS::Key", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39821
+ ["AWS::Lambda::EventInvokeConfig", /* @__PURE__ */ new Map([["DestinationConfig.OnFailure", ["Destination"]], ["DestinationConfig.OnSuccess", ["Destination"]]])],
39822
+ ["AWS::Lambda::EventSourceMapping", /* @__PURE__ */ new Map([["Tags", ["Key"]]])],
39823
+ ["AWS::Lambda::Function", /* @__PURE__ */ new Map([
39824
+ ["CapacityProviderConfig", ["LambdaManagedInstancesCapacityProviderConfig"]],
39825
+ ["CapacityProviderConfig.LambdaManagedInstancesCapacityProviderConfig", ["CapacityProviderArn"]],
39826
+ ["DurableConfig", ["ExecutionTimeout"]],
39827
+ ["EphemeralStorage", ["Size"]],
39828
+ ["FileSystemConfigs", ["Arn", "LocalMountPath"]],
39829
+ ["RuntimeManagementConfig", ["UpdateRuntimeOn"]],
39830
+ ["SnapStart", ["ApplyOn"]],
39831
+ ["Tags", ["Key"]],
39832
+ ["TenancyConfig", ["TenantIsolationMode"]]
39833
+ ])],
39834
+ ["AWS::Lambda::LayerVersion", /* @__PURE__ */ new Map([["Content", ["S3Bucket", "S3Key"]]])],
39835
+ ["AWS::Lambda::MicrovmImage", /* @__PURE__ */ new Map([
39836
+ ["CodeArtifact", ["Uri"]],
39837
+ ["CpuConfigurations", ["Architecture"]],
39838
+ ["EnvironmentVariables", ["Key", "Value"]],
39839
+ ["Resources", ["MinimumMemoryInMiB"]],
39840
+ ["Tags", ["Key"]]
39841
+ ])],
39842
+ ["AWS::Logs::LogGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39843
+ ["AWS::Neptune::DBCluster", /* @__PURE__ */ new Map([
39844
+ ["AssociatedRoles", ["RoleArn"]],
39845
+ ["ServerlessScalingConfiguration", ["MaxCapacity", "MinCapacity"]],
39846
+ ["Tags", ["Key"]]
39847
+ ])],
39848
+ ["AWS::Neptune::DBInstance", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39849
+ ["AWS::Neptune::DBSubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39850
+ ["AWS::RDS::DBCluster", /* @__PURE__ */ new Map([["AssociatedRoles", ["RoleArn"]], ["Tags", ["Key"]]])],
39851
+ ["AWS::RDS::DBInstance", /* @__PURE__ */ new Map([["AssociatedRoles", ["FeatureName", "RoleArn"]], ["Tags", ["Key"]]])],
39852
+ ["AWS::RDS::DBSubnetGroup", /* @__PURE__ */ new Map([["Tags", ["Key"]]])],
39853
+ ["AWS::Route53::HostedZone", /* @__PURE__ */ new Map([
39854
+ ["HostedZoneTags", ["Key", "Value"]],
39855
+ ["QueryLoggingConfig", ["CloudWatchLogsLogGroupArn"]],
39856
+ ["VPCs", ["VPCId", "VPCRegion"]]
39857
+ ])],
39858
+ ["AWS::Route53::RecordSet", /* @__PURE__ */ new Map([["AliasTarget", ["DNSName", "HostedZoneId"]], ["CidrRoutingConfig", ["CollectionId", "LocationName"]]])],
39859
+ ["AWS::S3::Bucket", /* @__PURE__ */ new Map([
39860
+ ["AccelerateConfiguration", ["AccelerationStatus"]],
39861
+ ["AnalyticsConfigurations", ["Id", "StorageClassAnalysis"]],
39862
+ ["AnalyticsConfigurations.StorageClassAnalysis.DataExport", ["Destination", "OutputSchemaVersion"]],
39863
+ ["AnalyticsConfigurations.StorageClassAnalysis.DataExport.Destination", ["BucketArn", "Format"]],
39864
+ ["AnalyticsConfigurations.TagFilters", ["Key", "Value"]],
39865
+ ["BucketEncryption", ["ServerSideEncryptionConfiguration"]],
39866
+ ["BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault", ["SSEAlgorithm"]],
39867
+ ["CorsConfiguration", ["CorsRules"]],
39868
+ ["CorsConfiguration.CorsRules", ["AllowedMethods", "AllowedOrigins"]],
39869
+ ["IntelligentTieringConfigurations", [
39870
+ "Id",
39871
+ "Status",
39872
+ "Tierings"
39873
+ ]],
39874
+ ["IntelligentTieringConfigurations.TagFilters", ["Key", "Value"]],
39875
+ ["IntelligentTieringConfigurations.Tierings", ["AccessTier", "Days"]],
39876
+ ["InventoryConfigurations", [
39877
+ "Destination",
39878
+ "Enabled",
39879
+ "Id",
39880
+ "IncludedObjectVersions",
39881
+ "ScheduleFrequency"
39882
+ ]],
39883
+ ["InventoryConfigurations.Destination", ["BucketArn", "Format"]],
39884
+ ["LifecycleConfiguration", ["Rules"]],
39885
+ ["LifecycleConfiguration.Rules", ["Status"]],
39886
+ ["LifecycleConfiguration.Rules.AbortIncompleteMultipartUpload", ["DaysAfterInitiation"]],
39887
+ ["LifecycleConfiguration.Rules.NoncurrentVersionExpiration", ["NoncurrentDays"]],
39888
+ ["LifecycleConfiguration.Rules.NoncurrentVersionTransition", ["StorageClass", "TransitionInDays"]],
39889
+ ["LifecycleConfiguration.Rules.NoncurrentVersionTransitions", ["StorageClass", "TransitionInDays"]],
39890
+ ["LifecycleConfiguration.Rules.TagFilters", ["Key", "Value"]],
39891
+ ["LifecycleConfiguration.Rules.Transition", ["StorageClass"]],
39892
+ ["LifecycleConfiguration.Rules.Transitions", ["StorageClass"]],
39893
+ ["MetadataConfiguration", ["JournalTableConfiguration"]],
39894
+ ["MetadataConfiguration.AnnotationTableConfiguration", ["ConfigurationState"]],
39895
+ ["MetadataConfiguration.AnnotationTableConfiguration.EncryptionConfiguration", ["SseAlgorithm"]],
39896
+ ["MetadataConfiguration.Destination", ["TableBucketType"]],
39897
+ ["MetadataConfiguration.InventoryTableConfiguration", ["ConfigurationState"]],
39898
+ ["MetadataConfiguration.InventoryTableConfiguration.EncryptionConfiguration", ["SseAlgorithm"]],
39899
+ ["MetadataConfiguration.JournalTableConfiguration", ["RecordExpiration"]],
39900
+ ["MetadataConfiguration.JournalTableConfiguration.EncryptionConfiguration", ["SseAlgorithm"]],
39901
+ ["MetadataConfiguration.JournalTableConfiguration.RecordExpiration", ["Expiration"]],
39902
+ ["MetadataTableConfiguration", ["S3TablesDestination"]],
39903
+ ["MetadataTableConfiguration.S3TablesDestination", ["TableBucketArn", "TableName"]],
39904
+ ["MetricsConfigurations", ["Id"]],
39905
+ ["MetricsConfigurations.TagFilters", ["Key", "Value"]],
39906
+ ["NotificationConfiguration.EventBridgeConfiguration", ["EventBridgeEnabled"]],
39907
+ ["NotificationConfiguration.LambdaConfigurations", ["Event", "Function"]],
39908
+ ["NotificationConfiguration.LambdaConfigurations.Filter", ["S3Key"]],
39909
+ ["NotificationConfiguration.LambdaConfigurations.Filter.S3Key", ["Rules"]],
39910
+ ["NotificationConfiguration.LambdaConfigurations.Filter.S3Key.Rules", ["Name", "Value"]],
39911
+ ["NotificationConfiguration.QueueConfigurations", ["Event", "Queue"]],
39912
+ ["NotificationConfiguration.QueueConfigurations.Filter", ["S3Key"]],
39913
+ ["NotificationConfiguration.QueueConfigurations.Filter.S3Key", ["Rules"]],
39914
+ ["NotificationConfiguration.QueueConfigurations.Filter.S3Key.Rules", ["Name", "Value"]],
39915
+ ["NotificationConfiguration.TopicConfigurations", ["Event", "Topic"]],
39916
+ ["NotificationConfiguration.TopicConfigurations.Filter", ["S3Key"]],
39917
+ ["NotificationConfiguration.TopicConfigurations.Filter.S3Key", ["Rules"]],
39918
+ ["NotificationConfiguration.TopicConfigurations.Filter.S3Key.Rules", ["Name", "Value"]],
39919
+ ["OwnershipControls", ["Rules"]],
39920
+ ["ReplicationConfiguration", ["Role", "Rules"]],
39921
+ ["ReplicationConfiguration.Rules", ["Destination", "Status"]],
39922
+ ["ReplicationConfiguration.Rules.Destination", ["Bucket"]],
39923
+ ["ReplicationConfiguration.Rules.Destination.AccessControlTranslation", ["Owner"]],
39924
+ ["ReplicationConfiguration.Rules.Destination.EncryptionConfiguration", ["ReplicaKmsKeyID"]],
39925
+ ["ReplicationConfiguration.Rules.Destination.Metrics", ["Status"]],
39926
+ ["ReplicationConfiguration.Rules.Destination.Metrics.EventThreshold", ["Minutes"]],
39927
+ ["ReplicationConfiguration.Rules.Destination.ReplicationTime", ["Status", "Time"]],
39928
+ ["ReplicationConfiguration.Rules.Destination.ReplicationTime.Time", ["Minutes"]],
39929
+ ["ReplicationConfiguration.Rules.Filter.And.TagFilters", ["Key", "Value"]],
39930
+ ["ReplicationConfiguration.Rules.Filter.TagFilter", ["Key", "Value"]],
39931
+ ["ReplicationConfiguration.Rules.SourceSelectionCriteria.ReplicaModifications", ["Status"]],
39932
+ ["ReplicationConfiguration.Rules.SourceSelectionCriteria.SseKmsEncryptedObjects", ["Status"]],
39933
+ ["Tags", ["Key", "Value"]],
39934
+ ["VersioningConfiguration", ["Status"]],
39935
+ ["WebsiteConfiguration.RedirectAllRequestsTo", ["HostName"]],
39936
+ ["WebsiteConfiguration.RoutingRules", ["RedirectRule"]]
39937
+ ])],
39938
+ ["AWS::S3Express::DirectoryBucket", /* @__PURE__ */ new Map([
39939
+ ["BucketEncryption", ["ServerSideEncryptionConfiguration"]],
39940
+ ["BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault", ["SSEAlgorithm"]],
39941
+ ["InventoryConfigurations", [
39942
+ "Destination",
39943
+ "Enabled",
39944
+ "Id",
39945
+ "IncludedObjectVersions",
39946
+ "ScheduleFrequency"
39947
+ ]],
39948
+ ["InventoryConfigurations.Destination", ["BucketArn", "Format"]],
39949
+ ["LifecycleConfiguration", ["Rules"]],
39950
+ ["LifecycleConfiguration.Rules", ["Status"]],
39951
+ ["LifecycleConfiguration.Rules.AbortIncompleteMultipartUpload", ["DaysAfterInitiation"]],
39952
+ ["MetricsConfigurations", ["Id"]],
39953
+ ["Tags", ["Key", "Value"]]
39954
+ ])],
39955
+ ["AWS::S3Tables::Table", /* @__PURE__ */ new Map([
39956
+ ["IcebergMetadata.IcebergPartitionSpec", ["Fields"]],
39957
+ ["IcebergMetadata.IcebergPartitionSpec.Fields", [
39958
+ "Name",
39959
+ "SourceId",
39960
+ "Transform"
39961
+ ]],
39962
+ ["IcebergMetadata.IcebergSchema", ["SchemaFieldList"]],
39963
+ ["IcebergMetadata.IcebergSchema.SchemaFieldList", ["Name", "Type"]],
39964
+ ["IcebergMetadata.IcebergSchemaV2", ["SchemaV2FieldList", "SchemaV2FieldType"]],
39965
+ ["IcebergMetadata.IcebergSchemaV2.SchemaV2FieldList", [
39966
+ "Id",
39967
+ "Name",
39968
+ "Required",
39969
+ "Type"
39970
+ ]],
39971
+ ["IcebergMetadata.IcebergSortOrder", ["Fields"]],
39972
+ ["IcebergMetadata.IcebergSortOrder.Fields", [
39973
+ "Direction",
39974
+ "NullOrder",
39975
+ "SourceId",
39976
+ "Transform"
39977
+ ]],
39978
+ ["Tags", ["Key", "Value"]]
39979
+ ])],
39980
+ ["AWS::S3Tables::TableBucket", /* @__PURE__ */ new Map([
39981
+ ["ReplicationConfiguration", ["Role", "Rules"]],
39982
+ ["ReplicationConfiguration.Rules", ["Destinations"]],
39983
+ ["ReplicationConfiguration.Rules.Destinations", ["DestinationTableBucketARN"]],
39984
+ ["Tags", ["Key", "Value"]]
39985
+ ])],
39986
+ ["AWS::S3Vectors::VectorBucket", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39987
+ ["AWS::Scheduler::Schedule", /* @__PURE__ */ new Map([
39988
+ ["FlexibleTimeWindow", ["Mode"]],
39989
+ ["Target", ["Arn", "RoleArn"]],
39990
+ ["Target.EcsParameters", ["TaskDefinitionArn"]],
39991
+ ["Target.EcsParameters.CapacityProviderStrategy", ["CapacityProvider"]],
39992
+ ["Target.EcsParameters.NetworkConfiguration.AwsvpcConfiguration", ["Subnets"]],
39993
+ ["Target.EventBridgeParameters", ["DetailType", "Source"]],
39994
+ ["Target.KinesisParameters", ["PartitionKey"]],
39995
+ ["Target.SageMakerPipelineParameters.PipelineParameterList", ["Name", "Value"]]
39996
+ ])],
39997
+ ["AWS::SecretsManager::Secret", /* @__PURE__ */ new Map([["ReplicaRegions", ["Region"]], ["Tags", ["Key", "Value"]]])],
39998
+ ["AWS::ServiceDiscovery::HttpNamespace", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
39999
+ ["AWS::ServiceDiscovery::PrivateDnsNamespace", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
40000
+ ["AWS::ServiceDiscovery::PublicDnsNamespace", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
40001
+ ["AWS::ServiceDiscovery::Service", /* @__PURE__ */ new Map([
40002
+ ["DnsConfig", ["DnsRecords"]],
40003
+ ["DnsConfig.DnsRecords", ["TTL", "Type"]],
40004
+ ["HealthCheckConfig", ["Type"]],
40005
+ ["Tags", ["Key", "Value"]]
40006
+ ])],
40007
+ ["AWS::SNS::Topic", /* @__PURE__ */ new Map([
40008
+ ["DeliveryStatusLogging", ["Protocol"]],
40009
+ ["Subscription", ["Endpoint", "Protocol"]],
40010
+ ["Tags", ["Key", "Value"]]
40011
+ ])],
40012
+ ["AWS::SQS::Queue", /* @__PURE__ */ new Map([["Tags", ["Key", "Value"]]])],
40013
+ ["AWS::StepFunctions::StateMachine", /* @__PURE__ */ new Map([
40014
+ ["DefinitionS3Location", ["Bucket", "Key"]],
40015
+ ["EncryptionConfiguration", ["Type"]],
40016
+ ["Tags", ["Key", "Value"]]
40017
+ ])],
40018
+ ["AWS::WAFv2::WebACL", /* @__PURE__ */ new Map([
40019
+ ["ApplicationConfig", ["Attributes"]],
40020
+ ["ApplicationConfig.Attributes", ["Name", "Values"]],
40021
+ ["CaptchaConfig.ImmunityTimeProperty", ["ImmunityTime"]],
40022
+ ["ChallengeConfig.ImmunityTimeProperty", ["ImmunityTime"]],
40023
+ ["DataProtectionConfig", ["DataProtections"]],
40024
+ ["DataProtectionConfig.DataProtections", ["Action", "Field"]],
40025
+ ["DataProtectionConfig.DataProtections.Field", ["FieldType"]],
40026
+ ["DefaultAction.Allow.CustomRequestHandling", ["InsertHeaders"]],
40027
+ ["DefaultAction.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40028
+ ["DefaultAction.Block.CustomResponse", ["ResponseCode"]],
40029
+ ["DefaultAction.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
40030
+ ["MonetizationConfig.CryptoConfig", ["PaymentNetworks"]],
40031
+ ["MonetizationConfig.CryptoConfig.PaymentNetworks", [
40032
+ "Chain",
40033
+ "Prices",
40034
+ "WalletAddress"
40035
+ ]],
40036
+ ["MonetizationConfig.CryptoConfig.PaymentNetworks.Prices", ["Amount", "Currency"]],
40037
+ ["OnSourceDDoSProtectionConfig", ["ALBLowReputationMode"]],
40038
+ ["Rules", [
40039
+ "Name",
40040
+ "Priority",
40041
+ "Statement",
40042
+ "VisibilityConfig"
40043
+ ]],
40044
+ ["Rules.Action.Allow.CustomRequestHandling", ["InsertHeaders"]],
40045
+ ["Rules.Action.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40046
+ ["Rules.Action.Block.CustomResponse", ["ResponseCode"]],
40047
+ ["Rules.Action.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
40048
+ ["Rules.Action.Captcha.CustomRequestHandling", ["InsertHeaders"]],
40049
+ ["Rules.Action.Captcha.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40050
+ ["Rules.Action.Challenge.CustomRequestHandling", ["InsertHeaders"]],
40051
+ ["Rules.Action.Challenge.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40052
+ ["Rules.Action.Count.CustomRequestHandling", ["InsertHeaders"]],
40053
+ ["Rules.Action.Count.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40054
+ ["Rules.CaptchaConfig.ImmunityTimeProperty", ["ImmunityTime"]],
40055
+ ["Rules.ChallengeConfig.ImmunityTimeProperty", ["ImmunityTime"]],
40056
+ ["Rules.RuleLabels", ["Name"]],
40057
+ ["Rules.Statement.AndStatement", ["Statements"]],
40058
+ ["Rules.Statement.AsnMatchStatement.ForwardedIPConfig", ["FallbackBehavior", "HeaderName"]],
40059
+ ["Rules.Statement.ByteMatchStatement", [
40060
+ "FieldToMatch",
40061
+ "PositionalConstraint",
40062
+ "TextTransformations"
40063
+ ]],
40064
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.Cookies", [
40065
+ "MatchPattern",
40066
+ "MatchScope",
40067
+ "OversizeHandling"
40068
+ ]],
40069
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
40070
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.Headers", [
40071
+ "MatchPattern",
40072
+ "MatchScope",
40073
+ "OversizeHandling"
40074
+ ]],
40075
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
40076
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
40077
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
40078
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
40079
+ ["Rules.Statement.ByteMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
40080
+ ["Rules.Statement.ByteMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
40081
+ ["Rules.Statement.ByteMatchStatement.TextTransformations", ["Priority", "Type"]],
40082
+ ["Rules.Statement.GeoMatchStatement.ForwardedIPConfig", ["FallbackBehavior", "HeaderName"]],
40083
+ ["Rules.Statement.IPSetReferenceStatement", ["Arn"]],
40084
+ ["Rules.Statement.IPSetReferenceStatement.IPSetForwardedIPConfig", [
40085
+ "FallbackBehavior",
40086
+ "HeaderName",
40087
+ "Position"
40088
+ ]],
40089
+ ["Rules.Statement.LabelMatchStatement", ["Key", "Scope"]],
40090
+ ["Rules.Statement.ManagedRuleGroupStatement", ["Name", "VendorName"]],
40091
+ ["Rules.Statement.ManagedRuleGroupStatement.ExcludedRules", ["Name"]],
40092
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet", [
40093
+ "CreationPath",
40094
+ "RegistrationPagePath",
40095
+ "RequestInspection"
40096
+ ]],
40097
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection", ["PayloadType"]],
40098
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.AddressFields", ["Identifier"]],
40099
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.EmailField", ["Identifier"]],
40100
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.PasswordField", ["Identifier"]],
40101
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.PhoneNumberFields", ["Identifier"]],
40102
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.RequestInspection.UsernameField", ["Identifier"]],
40103
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.BodyContains", ["FailureStrings", "SuccessStrings"]],
40104
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.Header", [
40105
+ "FailureValues",
40106
+ "Name",
40107
+ "SuccessValues"
40108
+ ]],
40109
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.Json", [
40110
+ "FailureValues",
40111
+ "Identifier",
40112
+ "SuccessValues"
40113
+ ]],
40114
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesACFPRuleSet.ResponseInspection.StatusCode", ["FailureCodes", "SuccessCodes"]],
40115
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet", ["LoginPath"]],
40116
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.RequestInspection", [
40117
+ "PasswordField",
40118
+ "PayloadType",
40119
+ "UsernameField"
40120
+ ]],
40121
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.RequestInspection.PasswordField", ["Identifier"]],
40122
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.RequestInspection.UsernameField", ["Identifier"]],
40123
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.BodyContains", ["FailureStrings", "SuccessStrings"]],
40124
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.Header", [
40125
+ "FailureValues",
40126
+ "Name",
40127
+ "SuccessValues"
40128
+ ]],
40129
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.Json", [
40130
+ "FailureValues",
40131
+ "Identifier",
40132
+ "SuccessValues"
40133
+ ]],
40134
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesATPRuleSet.ResponseInspection.StatusCode", ["FailureCodes", "SuccessCodes"]],
40135
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesAntiDDoSRuleSet", ["ClientSideActionConfig"]],
40136
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesAntiDDoSRuleSet.ClientSideActionConfig", ["Challenge"]],
40137
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesAntiDDoSRuleSet.ClientSideActionConfig.Challenge", ["UsageOfAction"]],
40138
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.AWSManagedRulesBotControlRuleSet", ["InspectionLevel"]],
40139
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.PasswordField", ["Identifier"]],
40140
+ ["Rules.Statement.ManagedRuleGroupStatement.ManagedRuleGroupConfigs.UsernameField", ["Identifier"]],
40141
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides", ["ActionToUse", "Name"]],
40142
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling", ["InsertHeaders"]],
40143
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40144
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse", ["ResponseCode"]],
40145
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
40146
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling", ["InsertHeaders"]],
40147
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40148
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling", ["InsertHeaders"]],
40149
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40150
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling", ["InsertHeaders"]],
40151
+ ["Rules.Statement.ManagedRuleGroupStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40152
+ ["Rules.Statement.NotStatement", ["Statement"]],
40153
+ ["Rules.Statement.OrStatement", ["Statements"]],
40154
+ ["Rules.Statement.RateBasedStatement", ["AggregateKeyType", "Limit"]],
40155
+ ["Rules.Statement.RateBasedStatement.CustomKeys.Cookie", ["Name", "TextTransformations"]],
40156
+ ["Rules.Statement.RateBasedStatement.CustomKeys.Cookie.TextTransformations", ["Priority", "Type"]],
40157
+ ["Rules.Statement.RateBasedStatement.CustomKeys.Header", ["Name", "TextTransformations"]],
40158
+ ["Rules.Statement.RateBasedStatement.CustomKeys.Header.TextTransformations", ["Priority", "Type"]],
40159
+ ["Rules.Statement.RateBasedStatement.CustomKeys.JA3Fingerprint", ["FallbackBehavior"]],
40160
+ ["Rules.Statement.RateBasedStatement.CustomKeys.JA4Fingerprint", ["FallbackBehavior"]],
40161
+ ["Rules.Statement.RateBasedStatement.CustomKeys.LabelNamespace", ["Namespace"]],
40162
+ ["Rules.Statement.RateBasedStatement.CustomKeys.QueryArgument", ["Name", "TextTransformations"]],
40163
+ ["Rules.Statement.RateBasedStatement.CustomKeys.QueryArgument.TextTransformations", ["Priority", "Type"]],
40164
+ ["Rules.Statement.RateBasedStatement.CustomKeys.QueryString", ["TextTransformations"]],
40165
+ ["Rules.Statement.RateBasedStatement.CustomKeys.QueryString.TextTransformations", ["Priority", "Type"]],
40166
+ ["Rules.Statement.RateBasedStatement.CustomKeys.UriPath", ["TextTransformations"]],
40167
+ ["Rules.Statement.RateBasedStatement.CustomKeys.UriPath.TextTransformations", ["Priority", "Type"]],
40168
+ ["Rules.Statement.RateBasedStatement.ForwardedIPConfig", ["FallbackBehavior", "HeaderName"]],
40169
+ ["Rules.Statement.RegexMatchStatement", [
40170
+ "FieldToMatch",
40171
+ "RegexString",
40172
+ "TextTransformations"
40173
+ ]],
40174
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.Cookies", [
40175
+ "MatchPattern",
40176
+ "MatchScope",
40177
+ "OversizeHandling"
40178
+ ]],
40179
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
40180
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.Headers", [
40181
+ "MatchPattern",
40182
+ "MatchScope",
40183
+ "OversizeHandling"
40184
+ ]],
40185
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
40186
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
40187
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
40188
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
40189
+ ["Rules.Statement.RegexMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
40190
+ ["Rules.Statement.RegexMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
40191
+ ["Rules.Statement.RegexMatchStatement.TextTransformations", ["Priority", "Type"]],
40192
+ ["Rules.Statement.RegexPatternSetReferenceStatement", [
40193
+ "Arn",
40194
+ "FieldToMatch",
40195
+ "TextTransformations"
40196
+ ]],
40197
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.Cookies", [
40198
+ "MatchPattern",
40199
+ "MatchScope",
40200
+ "OversizeHandling"
40201
+ ]],
40202
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
40203
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.Headers", [
40204
+ "MatchPattern",
40205
+ "MatchScope",
40206
+ "OversizeHandling"
40207
+ ]],
40208
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
40209
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
40210
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
40211
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.SingleHeader", ["Name"]],
40212
+ ["Rules.Statement.RegexPatternSetReferenceStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
40213
+ ["Rules.Statement.RegexPatternSetReferenceStatement.PreParseTextTransformations", ["Priority", "Type"]],
40214
+ ["Rules.Statement.RegexPatternSetReferenceStatement.TextTransformations", ["Priority", "Type"]],
40215
+ ["Rules.Statement.RuleGroupReferenceStatement", ["Arn"]],
40216
+ ["Rules.Statement.RuleGroupReferenceStatement.ExcludedRules", ["Name"]],
40217
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides", ["ActionToUse", "Name"]],
40218
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling", ["InsertHeaders"]],
40219
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Allow.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40220
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse", ["ResponseCode"]],
40221
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Block.CustomResponse.ResponseHeaders", ["Name", "Value"]],
40222
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling", ["InsertHeaders"]],
40223
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Captcha.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40224
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling", ["InsertHeaders"]],
40225
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Challenge.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40226
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling", ["InsertHeaders"]],
40227
+ ["Rules.Statement.RuleGroupReferenceStatement.RuleActionOverrides.ActionToUse.Count.CustomRequestHandling.InsertHeaders", ["Name", "Value"]],
40228
+ ["Rules.Statement.SizeConstraintStatement", [
40229
+ "ComparisonOperator",
40230
+ "FieldToMatch",
40231
+ "Size",
40232
+ "TextTransformations"
40233
+ ]],
40234
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.Cookies", [
40235
+ "MatchPattern",
40236
+ "MatchScope",
40237
+ "OversizeHandling"
40238
+ ]],
40239
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
40240
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.Headers", [
40241
+ "MatchPattern",
40242
+ "MatchScope",
40243
+ "OversizeHandling"
40244
+ ]],
40245
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
40246
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
40247
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
40248
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.SingleHeader", ["Name"]],
40249
+ ["Rules.Statement.SizeConstraintStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
40250
+ ["Rules.Statement.SizeConstraintStatement.PreParseTextTransformations", ["Priority", "Type"]],
40251
+ ["Rules.Statement.SizeConstraintStatement.TextTransformations", ["Priority", "Type"]],
40252
+ ["Rules.Statement.SqliMatchStatement", ["FieldToMatch", "TextTransformations"]],
40253
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.Cookies", [
40254
+ "MatchPattern",
40255
+ "MatchScope",
40256
+ "OversizeHandling"
40257
+ ]],
40258
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
40259
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.Headers", [
40260
+ "MatchPattern",
40261
+ "MatchScope",
40262
+ "OversizeHandling"
40263
+ ]],
40264
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
40265
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
40266
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
40267
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
40268
+ ["Rules.Statement.SqliMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
40269
+ ["Rules.Statement.SqliMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
40270
+ ["Rules.Statement.SqliMatchStatement.TextTransformations", ["Priority", "Type"]],
40271
+ ["Rules.Statement.XssMatchStatement", ["FieldToMatch", "TextTransformations"]],
40272
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.Cookies", [
40273
+ "MatchPattern",
40274
+ "MatchScope",
40275
+ "OversizeHandling"
40276
+ ]],
40277
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.HeaderOrder", ["OversizeHandling"]],
40278
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.Headers", [
40279
+ "MatchPattern",
40280
+ "MatchScope",
40281
+ "OversizeHandling"
40282
+ ]],
40283
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.JA3Fingerprint", ["FallbackBehavior"]],
40284
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.JA4Fingerprint", ["FallbackBehavior"]],
40285
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.JsonBody", ["MatchPattern", "MatchScope"]],
40286
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.SingleHeader", ["Name"]],
40287
+ ["Rules.Statement.XssMatchStatement.FieldToMatch.SingleQueryArgument", ["Name"]],
40288
+ ["Rules.Statement.XssMatchStatement.PreParseTextTransformations", ["Priority", "Type"]],
40289
+ ["Rules.Statement.XssMatchStatement.TextTransformations", ["Priority", "Type"]],
40290
+ ["Rules.VisibilityConfig", [
40291
+ "CloudWatchMetricsEnabled",
40292
+ "MetricName",
40293
+ "SampledRequestsEnabled"
40294
+ ]],
40295
+ ["VisibilityConfig", [
40296
+ "CloudWatchMetricsEnabled",
40297
+ "MetricName",
40298
+ "SampledRequestsEnabled"
40299
+ ]]
40300
+ ])]
40301
+ ]);
40302
+
40303
+ //#endregion
40304
+ //#region src/provisioning/nested-required.ts
40305
+ /**
40306
+ * Pre-flight rule: a PRESENT nested property block must carry every member its
40307
+ * schema definition lists as `required` (issue
40308
+ * [#1802](https://github.com/go-to-k/cdkd/issues/1802)).
40309
+ *
40310
+ * CloudFormation refuses such a block before it touches AWS. cdkd forwarded
40311
+ * it, and where the service API replaces the nested struct wholesale the
40312
+ * result was a silent change to a live setting: a kept
40313
+ * `AWS::ECS::Service.DeploymentConfiguration.DeploymentCircuitBreaker` without
40314
+ * `Rollback` flipped the live `rollback` from true to false. Cloud Control
40315
+ * validates against the same schema server-side, so the gap is SDK-provider
40316
+ * scoped; running the check for every resource is correct-but-redundant on the
40317
+ * Cloud Control route. Same layer and same reasons as
40318
+ * {@link ./mutually-exclusive-properties}: pre-flight runs on every deploy, not
40319
+ * only when the provider is called.
40320
+ *
40321
+ * ## Refuse only what CloudFormation refuses
40322
+ *
40323
+ * - An ABSENT block is never a violation — only a present one missing a member.
40324
+ * - Pre-flight runs BEFORE intrinsic resolution, so any value along the path
40325
+ * that is an unresolved intrinsic (`Fn::If`, `Ref`, ...) is UNKNOWN and its
40326
+ * subtree is skipped. A member is present when its KEY is, whatever the value
40327
+ * (`false`, `0`, `null`, or an intrinsic that may resolve to
40328
+ * `AWS::NoValue`). Every doubt passes through: a false refusal blocks a valid
40329
+ * deploy with no escape hatch, a missed one reaches AWS as it did before.
40330
+ * - {@link CFN_ENFORCED_TYPES} gates the whole check. A schema's `required`
40331
+ * list is NOT evidence that CloudFormation enforces it: measured, CFn accepted
40332
+ * an `AWS::Logs::LogGroup` tag with neither `Key` nor `Value`, and sent an
40333
+ * `AWS::EC2::SecurityGroup` ingress rule without `IpProtocol` to the EC2 API.
40334
+ *
40335
+ * ## No override flag, by design
40336
+ *
40337
+ * The violation is in the TEMPLATE, CloudFormation rejects it too, and the
40338
+ * remedy (declare the missing member) is always available.
40339
+ */
40340
+ /**
40341
+ * Types whose nested `required` lists CloudFormation was MEASURED to enforce.
40342
+ * One template per type declared
40343
+ * every nested block of `NESTED_REQUIRED` empty; a type is listed only when
40344
+ * CloudFormation refused EVERY missing member the table predicts:
40345
+ *
40346
+ * - 64 types by early validation of a CREATE change set (nothing provisioned):
40347
+ * `PROPERTY_VALIDATION` / "Required property [X] not found".
40348
+ * - 7 types early validation passed, refused at execution before any API call:
40349
+ * `Model validation failed` / `Properties validation failed` /
40350
+ * `Property validation failure` (ECS Service + TaskDefinition, EFS
40351
+ * AccessPoint, Lambda EventSourceMapping, Step Functions StateMachine,
40352
+ * API Gateway Method, AppSync GraphQLApi).
40353
+ * - 7 types with no registry handler, refused at execution by CloudFormation's
40354
+ * own `Property validation failure` list (Budgets Budget, CloudWatch
40355
+ * AnomalyDetector, CodeBuild Project, DocDB DBCluster + DBInstance, FSx
40356
+ * FileSystem, Glue Table).
40357
+ *
40358
+ * Measured NOT enforced by a schema check (a handler or service error instead,
40359
+ * or an accepted create): ApiGatewayV2 Route, CloudFormation Stack, EC2
40360
+ * SecurityGroup, ECR Repository, EFS FileSystem, ELBv2 Listener, KMS Key,
40361
+ * KinesisFirehose DeliveryStream, Logs LogGroup, Route53 HostedZone, WAFv2
40362
+ * WebACL. Left out because CloudFormation reports only the FIRST missing member
40363
+ * (`Property X cannot be empty.`), so the rest of the table was not confirmed:
40364
+ * EMR Cluster, InstanceFleetConfig, InstanceGroupConfig. A type in none of
40365
+ * these lists (added later) is not checked until it is measured.
40366
+ */
40367
+ const CFN_ENFORCED_TYPES = /* @__PURE__ */ new Set([
40368
+ "AWS::ApiGateway::Deployment",
40369
+ "AWS::ApiGateway::Method",
40370
+ "AWS::ApiGateway::Stage",
40371
+ "AWS::AppSync::DataSource",
40372
+ "AWS::AppSync::GraphQLApi",
40373
+ "AWS::AppSync::Resolver",
40374
+ "AWS::AutoScaling::AutoScalingGroup",
40375
+ "AWS::BedrockAgentCore::Evaluator",
40376
+ "AWS::BedrockAgentCore::Runtime",
40377
+ "AWS::Budgets::Budget",
40378
+ "AWS::CertificateManager::Certificate",
40379
+ "AWS::CloudFront::CloudFrontOriginAccessIdentity",
40380
+ "AWS::CloudFront::Distribution",
40381
+ "AWS::CloudFront::OriginAccessControl",
40382
+ "AWS::CloudTrail::Trail",
40383
+ "AWS::CloudWatch::Alarm",
40384
+ "AWS::CloudWatch::AnomalyDetector",
40385
+ "AWS::CodeBuild::Project",
40386
+ "AWS::CodeCommit::Repository",
40387
+ "AWS::Cognito::UserPool",
40388
+ "AWS::DLM::LifecyclePolicy",
40389
+ "AWS::DocDB::DBCluster",
40390
+ "AWS::DocDB::DBInstance",
40391
+ "AWS::DocDB::DBSubnetGroup",
40392
+ "AWS::DynamoDB::GlobalTable",
40393
+ "AWS::DynamoDB::Table",
40394
+ "AWS::EC2::EIP",
40395
+ "AWS::EC2::Instance",
40396
+ "AWS::EC2::InternetGateway",
40397
+ "AWS::EC2::NatGateway",
40398
+ "AWS::EC2::NetworkAcl",
40399
+ "AWS::EC2::RouteTable",
40400
+ "AWS::EC2::Subnet",
40401
+ "AWS::EC2::VPC",
40402
+ "AWS::ECS::Service",
40403
+ "AWS::ECS::TaskDefinition",
40404
+ "AWS::EFS::AccessPoint",
40405
+ "AWS::ElastiCache::CacheCluster",
40406
+ "AWS::ElastiCache::SubnetGroup",
40407
+ "AWS::ElasticLoadBalancingV2::LoadBalancer",
40408
+ "AWS::ElasticLoadBalancingV2::TargetGroup",
40409
+ "AWS::Events::EventBus",
40410
+ "AWS::Events::Rule",
40411
+ "AWS::FSx::FileSystem",
40412
+ "AWS::Glue::Connection",
40413
+ "AWS::Glue::Table",
40414
+ "AWS::Glue::Trigger",
40415
+ "AWS::IAM::Group",
40416
+ "AWS::IAM::Role",
40417
+ "AWS::IAM::User",
40418
+ "AWS::Kinesis::Stream",
40419
+ "AWS::Kinesis::StreamConsumer",
40420
+ "AWS::Lambda::EventInvokeConfig",
40421
+ "AWS::Lambda::EventSourceMapping",
40422
+ "AWS::Lambda::Function",
40423
+ "AWS::Lambda::LayerVersion",
40424
+ "AWS::Lambda::MicrovmImage",
40425
+ "AWS::Neptune::DBCluster",
40426
+ "AWS::Neptune::DBInstance",
40427
+ "AWS::Neptune::DBSubnetGroup",
40428
+ "AWS::RDS::DBCluster",
40429
+ "AWS::RDS::DBInstance",
40430
+ "AWS::RDS::DBSubnetGroup",
40431
+ "AWS::Route53::RecordSet",
40432
+ "AWS::S3::Bucket",
40433
+ "AWS::S3Express::DirectoryBucket",
40434
+ "AWS::S3Tables::Table",
40435
+ "AWS::S3Tables::TableBucket",
40436
+ "AWS::S3Vectors::VectorBucket",
40437
+ "AWS::SNS::Topic",
40438
+ "AWS::SQS::Queue",
40439
+ "AWS::Scheduler::Schedule",
40440
+ "AWS::SecretsManager::Secret",
40441
+ "AWS::ServiceDiscovery::HttpNamespace",
40442
+ "AWS::ServiceDiscovery::PrivateDnsNamespace",
40443
+ "AWS::ServiceDiscovery::PublicDnsNamespace",
40444
+ "AWS::ServiceDiscovery::Service",
40445
+ "AWS::StepFunctions::StateMachine"
40446
+ ]);
40447
+ /**
40448
+ * True for a single-key object whose key is `Ref` or `Fn::*`. The same
40449
+ * predicate as `mutually-exclusive-properties.ts` keeps local, for the same
40450
+ * reason: the modules answer different questions about the shape.
40451
+ */
40452
+ function isUnresolvedIntrinsic(value) {
40453
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
40454
+ const keys = Object.keys(value);
40455
+ return keys.length === 1 && (keys[0] === "Ref" || keys[0].startsWith("Fn::"));
40456
+ }
40457
+ /** A plain object whose members can be checked: not an array, not an intrinsic. */
40458
+ function isConcreteObject(value) {
40459
+ return typeof value === "object" && value !== null && !Array.isArray(value) && !isUnresolvedIntrinsic(value);
40460
+ }
40461
+ /**
40462
+ * Find every present nested block of this resource that lacks a required
40463
+ * member. `table` defaults to the generated one gated by
40464
+ * {@link CFN_ENFORCED_TYPES}; tests pass their own to reach every shape.
40465
+ */
40466
+ function findNestedRequiredViolations(resourceType, templateProperties, table = CFN_ENFORCED_TYPES.has(resourceType) ? NESTED_REQUIRED.get(resourceType) : void 0) {
40467
+ if (!table || !isConcreteObject(templateProperties)) return [];
40468
+ const violations = [];
40469
+ for (const [path, required] of table) {
40470
+ const segments = path.split(".");
40471
+ const check = (value, display) => {
40472
+ if (Array.isArray(value)) {
40473
+ value.forEach((element, i) => check(element, `${display}[${i}]`));
40474
+ return;
40475
+ }
40476
+ if (!isConcreteObject(value)) return;
40477
+ const missing = required.filter((member) => !hasOwnKey(value, member));
40478
+ if (missing.length > 0) violations.push({
40479
+ resourceType,
40480
+ path: display,
40481
+ missing
40482
+ });
40483
+ };
40484
+ const visit = (value, depth, display) => {
40485
+ if (depth === segments.length) {
40486
+ check(value, display);
40487
+ return;
40488
+ }
40489
+ if (Array.isArray(value)) {
40490
+ value.forEach((element, i) => visit(element, depth, `${display}[${i}]`));
40491
+ return;
40492
+ }
40493
+ if (!isConcreteObject(value)) return;
40494
+ const segment = segments[depth];
40495
+ if (!hasOwnKey(value, segment)) return;
40496
+ visit(value[segment], depth + 1, display ? `${display}.${segment}` : segment);
40497
+ };
40498
+ visit(templateProperties, 0, "");
40499
+ }
40500
+ return violations;
40501
+ }
40502
+ /** Render one violation as a per-resource error line. */
40503
+ function buildNestedRequiredMessage(logicalId, violation) {
40504
+ return ` - ${logicalId} (${violation.resourceType}): ${violation.path} is missing required ${violation.missing.length === 1 ? "member" : "members"} ${violation.missing.join(", ")}`;
40505
+ }
40506
+
38680
40507
  //#endregion
38681
40508
  //#region src/provisioning/provider-registry.ts
38682
40509
  /**
@@ -39003,7 +40830,10 @@ var ProviderRegistry = class {
39003
40830
  * ALSO runs the mutually-exclusive-property check
39004
40831
  * ({@link validateMutuallyExclusiveProperties}), which throws BEFORE any
39005
40832
  * routing decision is logged — a template CloudFormation itself rejects
39006
- * should not first produce a page of routing chatter.
40833
+ * should not first produce a page of routing chatter. Issue
40834
+ * [#1802](https://github.com/go-to-k/cdkd/issues/1802) adds the nested
40835
+ * `required` check ({@link validateNestedRequiredProperties}) at the same
40836
+ * point, for the same reason.
39007
40837
  *
39008
40838
  * @see findAutoRouteHits for the pure-functional pre-deploy plan-builder
39009
40839
  * that returns the same information without logging.
@@ -39011,6 +40841,7 @@ var ProviderRegistry = class {
39011
40841
  validateResourceProperties(resources) {
39012
40842
  const materialized = [...resources];
39013
40843
  this.validateMutuallyExclusiveProperties(materialized);
40844
+ this.validateNestedRequiredProperties(materialized);
39014
40845
  this.reportSilentDropDecisions(materialized);
39015
40846
  }
39016
40847
  /**
@@ -39036,6 +40867,23 @@ var ProviderRegistry = class {
39036
40867
  throw new Error(`The following resources declare mutually exclusive properties:\n` + lines.join("\n") + "\n\nCloudFormation rejects these combinations too — edit the template to declare only one of each set.");
39037
40868
  }
39038
40869
  /**
40870
+ * Reject a template whose PRESENT nested property block lacks a member the
40871
+ * type's schema requires there, for the types CloudFormation was measured to
40872
+ * enforce that on (issue [#1802](https://github.com/go-to-k/cdkd/issues/1802);
40873
+ * the rule, its fail-safe bias and the measurement live in
40874
+ * `nested-required.ts`).
40875
+ *
40876
+ * Aggregated into ONE error, like {@link validateMutuallyExclusiveProperties},
40877
+ * and with no `--allow-*` escape hatch for the same reason: CloudFormation
40878
+ * rejects the template too, and declaring the member is always possible.
40879
+ */
40880
+ validateNestedRequiredProperties(resources) {
40881
+ const lines = [];
40882
+ for (const { logicalId, resourceType, properties } of resources) for (const violation of findNestedRequiredViolations(resourceType, properties)) lines.push(buildNestedRequiredMessage(logicalId, violation));
40883
+ if (lines.length === 0) return;
40884
+ throw new Error(`The following resources declare a nested property block without a member it requires:\n` + lines.join("\n") + "\n\nCloudFormation rejects these blocks too. Declare the missing members; leaving a whole block out is not a violation.");
40885
+ }
40886
+ /**
39039
40887
  * Info-log every silent-drop routing decision (auto-route via CC API) and
39040
40888
  * warn-log every silent drop the user explicitly opted into via
39041
40889
  * `--allow-unsupported-properties` (forced SDK path, the property will
@@ -48884,5 +50732,5 @@ var DeployEngine = class DeployEngine {
48884
50732
  };
48885
50733
 
48886
50734
  //#endregion
48887
- export { yellow as $, derivePartitionAndUrlSuffix as $i, safeStackName as $n, assertAssetBucketRegion as $r, requireConfigObject as $t, createPreDeleteFinalSnapshot as A, PartialFailureError as Aa, resolveAutoAssetStorage as Ai, malformedOutputsRefusalMessage as An, formatLockExpiry as Ar, carriesDynamicReference as At, isStatefulRecreateTargetSync as B, normalizeAwsError as Ba, CFN_TEMPLATE_URL_LIMIT as Bi, refuseMalformedOrphansForDestroy as Bn, isReadableBag as Br, isSettledInstanceState as Bt, namesAnyDeclaredParameter as C, DynamicReferenceRegionAmbiguousError as Ca, AssetManifestLoader as Ci, isReadableResourceEntry as Cn, LockManager as Cr, slowCcOperationTimeoutMs as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, LockError as Da, getDefaultStateBucketName as Di, malformedOrphanRecordsWarning as Dn, buildForceUnlockCommand as Dr, disableInstanceApiTermination as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, LocalStartServiceError as Ea, synthesisStatusMessage as Ei, malformedLocalOutputsWarning as En, UNREPRODUCIBLE_LOCK_CLAUSE as Er, deleteSkipReason as Et, extractDeploymentEventError as F, StackTerminationProtectionError as Fa, resolveUseCdkBootstrapAssets as Fi, malformedResourcesWarning as Fn, hasReadableExportSet as Fr, isImpossibleEmptyStoredAttribute as Ft, toCfnInteger as G, isTransientServerError as Ga, injectiveKey as Gi, refuseMalformedResourcesForDestroy as Gn, stringifyValue as Gr, coerceCfnBoolean as Gt, WARM_THROUGHPUT_MEMBERS as H, isMarkedNonRetryable as Ha, findLargeInlineResources as Hi, refuseMalformedOutputsForDestroy as Hn, orphansCarriedFrom as Hr, normalizeAwsTagsToCfn as Ht, makeSiblingClaimReader as I, StateError as Ia, stateBucketExistenceConfirmed as Ii, malformedStateRefusalMessage as In, hasReasonlessBaselineRefusal as Ir, isNamelessDynamicReferenceError as It, bold as J, retryClassificationText as Ja, producerRecordKey as Ji, repairMalformedOutputsForReadOnly as Jn, createAssetRedirectResolver as Jr, configIntegerRefusal as Jt, toFiniteNumber as K, markNonRetryable as Ka, injectiveKeyPrefix as Ki, refuseMalformedState as Kn, WorkGraph as Kr, coerceCfnInteger as Kt, planOrphanAdoption as L, SynthesisError as La, warnDeprecatedNoPrefixCliFlag as Li, refuseDivergentRecordRegionForDestroy as Ln, hasUnverifiableParameterRefusal as Lr, isUnboundTemplateParameter as Lt, refusesFinalSnapshot as M, ResourceTimeoutError as Ma, resolveSkipPrefix as Mi, malformedRenderedContainersWarning as Mn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Mr, cfnRefValueFromPhysicalId as Mt, unsupportedFinalSnapshotError as N, ResourceUpdateNotSupportedError as Na, resolveStateBucketWithDefault as Ni, malformedResourceEntriesWarning as Nn, DEFAULT_STATE_PREFIX as Nr, coerceParameterTypedValue as Nt, buildFinalSnapshotIdentifier as O, MalformedProducerRecordRefusalError as Oa, getLegacyStateBucketName as Oi, malformedOrphansRefusalMessage as On, buildLockContentionMessage as Or, isTerminationProtectionPropagationError as Ot, makeCanonicalizePropertiesFn as P, StackHasActiveImportsError as Pa, resolveStateBucketWithDefaultAndSource as Pi, malformedResourcePropertiesWarning as Pn, exportNamesCarriedFrom as Pr, getAccountInfo as Pt, red as Q, canonicalizeRegion as Qi, safeRegion as Qn, BOOTSTRAP_MARKER_PREFIX as Qr, requireConfigArray as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, formatError as Ra, ssmResolvedValueType as Ri, refuseMalformedNestedChildOutputs as Rn, importableOutputKeys as Rr, parameterTypeMayLoseSecretIdentity as Rt, computeParameterTaint as S, DeployCancelledError as Sa, stripControlChars as Si, hasReadableResources as Sn, scrubResourceRecord as Sr, isWaitAbandonedError as St, resourcesNamingDeclaredParameter as T, LocalInvokeBuildError as Ta, Synthesizer as Ti, malformedExportSourceWarning as Tn, rebuildClientForBucketRegion as Tr, deleteIndeterminateGuards as Tt, coerceWarmThroughput as U, isRetryableTransientError as Ua, uploadCfnTemplate as Ui, refuseMalformedResourceEntries as Un, shouldRetainResource as Ur, resolveExplicitPhysicalId as Ut, renderStatefulReason as V, withErrorHandling as Va, MIGRATE_TMP_PREFIX as Vi, refuseMalformedOutputs as Vn, orphansAfterRollback as Vr, WAFv2WebACLProvider as Vt, isWarmThroughputDecrease as W, isThrottlingError as Wa, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Wi, refuseMalformedResourcePropertiesForOrphan as Wn, AssetPublisher as Wr, assertRegionMatch as Wt, gray as X, safeStringify$1 as Xa, expectedOwnerParam as Xi, repairMalformedResourcePropertiesForReadOnly as Xn, rewriteTemplateAssetReferences as Xr, readConfigString as Xt, cyan as Y, describeAwsFailure as Ya, decodeListingKey as Yi, repairMalformedResourceEntriesForReadOnly as Yn, loadPublishableAssetManifest as Yr, configStringRefusal as Yt, green as Z, __exportAll as Za, PARTITION_TABLE as Zi, repairMalformedResourcesForReadOnly as Zn, AssetModeResolver as Zr, replayWarn as Zt, bagHoldsSecretExpression as _, AssetError as _a, partitionSensitiveEnv as _i, UNREADABLE_ORPHANS_CONTAINER_ROW as _n, maskSecretsInError as _r, endCommandInterruptScope as _t, DeploymentEventsStore as a, hasPlainPrototype$1 as aa, validateAssetBucketName as ai, s3BucketDomainName as an, TemplateParser as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, CrossAccountSecretRefusalError as ba, runDockerStreaming as bi, hasReadableOrphans as bn, recoverMaskedOutput as br, startInterruptWatch as bt, replayFailedOperations as c, absoluteAssemblyPathEscape as ca, buildDockerImage as ci, s3BucketWebsiteUrl as cn, STATE_SOURCED_READBACK_RULES as cr, IAMRoleProvider as ct, updatePartialMessage as d, clearBucketRegionCache as da, describeDockerCapturedOutput as di, applyCallerIdentityCredentials as dn, createSecretMasker as dr, ProviderRegistry as dt, AssemblyReader as ea, ensureAssetStorage as ei, requireConfigString as en, findActionableSilentDrops as er, collectDeclaredOutputNames as et, updatePartialReason as f, resolveBucketRegion as fa, describeDockerExecFailure as fi, callerEnvCredentials as fn, dynamicReferenceTokens as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, setAwsClients as ga, getDockerCmd as gi, STATE_RESOURCES_MALFORMED as gn, markSameGenerationBag as gr, beginCommandInterruptScope as gt, IMPLICIT_DELETE_DEPENDENCIES as h, resetAwsClients as ha, formatDockerLoginError as hi, INTRINSIC_KEYS as hn, isSingleDynamicReferenceToken as hr, maskerOrIdentity as ht, DeploymentEventsReader as i, hasOwnKey as ia, readBootstrapMarkerBody as ii, s3BucketArn as in, DagBuilder as ir, secretBearing as it, isFinalSnapshotError as j, ProvisioningError as ja, resolveCaptureObservedState as ji, malformedOutputsWarning as jn, shellQuote as jr, carriesFetchableDynamicReference as jt, ccRoutedFinalSnapshotError as k, NestedStackChildDirectDestroyError as ka, resolveApp as ki, malformedOrphansWarning as kn, forceQuitRecoveryClause as kr, IntrinsicFunctionResolver as kt, replayRollback as l, renderAssemblyPathEscape as la, resolveDockerContextDirectory as li, applyRoleArnIfSet as ln, TEMPLATE_SOURCED_RULES as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, getAwsClients as ma, dockerSpawnEnvWithSensitive as mi, DiffCalculator as mn, identityKeyFor as mr, maskDeep as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, processStackMessages as na, isCrossRegionRedirect as ni, producerRegionsFromState as nn, describeTypeWithThrottleRetry as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, nullPrototypeRecord as oa, validateContainerRepoName as oi, s3BucketDualStackDomainName as on, STATE_SOURCED_BASELINE_RULES as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, AwsClients as pa, describeDockerFailure as pi, envCredentialsAreAssumedRole as pn, errorCauseChain as pr, createMaskedRetryLogger as pt, formatResourceLine as q, markRedactedCause as qa, producerCoordinateKey as qi, repairMalformedOrphansForReadOnly as qn, buildAssetRedirectMap as qr, configBooleanRefusal as qt, DeployEngine as r, defineOwnKey as ra, parseBootstrapMarker as ri, withSharedDrainBudget as rn, withRetry as rr, isExportAliasCollision as rt, planRollback as s, ownValue as sa, buildDenyExternalAccessPolicy as si, s3BucketRegionalDomainName as sn, STATE_SOURCED_CROSS_GENERATION_RULES as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, failedStageNote as ta, getBootstrapMarkerKey as ti, classifyReplaySecretRegion as tn, findSilentDropProperties as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, resolveAssemblyPath as ua, warnManifestExecutable as ui, AWS_CREDENTIAL_ENV_KEYS as un, carriesSecretMask as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, CdkdError as va, redactDockerArgvValues as vi, UNREADABLE_RESOURCES_MAP_ROW as vn, maskSecretsInText as vr, interruptWatchListenerCount as vt, reachableDivergentParameters as w, IntrinsicResolutionRefusalError as wa, getDockerImageBySourceHash as wi, malformedExportNamesWarning as wn, S3StateBackend as wr, UNSPECIFIED_SKIP_REASON as wt, bindingSkippedOutputs as x, DependencyError as xa, escapeRegExp$1 as xi, hasReadableOutputs as xn, redactSecretsForState as xr, CloudControlProvider as xt, keptWholeReasonText as y, ConfigError as ya, runDockerForeground as yi, displayLogicalId as yn, recordMaskOnlyValue as yr, isInterruptedWaitError as yt, isStatefulRecreateTargetForReplace as z, isCdkdError as za, CFN_TEMPLATE_BODY_LIMIT as zi, refuseMalformedOrphans as zn, importableOutputs as zr, refStateLookupFromResource as zt };
48888
- //# sourceMappingURL=deploy-engine-5fdODHji.js.map
50735
+ export { yellow as $, describeAwsFailure as $a, expectedOwnerParam as $i, repairMalformedResourcePropertiesForReadOnly as $n, rewriteTemplateAssetReferences as $r, requireConfigObject as $t, createPreDeleteFinalSnapshot as A, LocalStartServiceError as Aa, getDefaultStateBucketName as Ai, malformedOutputsRefusalMessage as An, buildForceUnlockCommand as Ar, carriesDynamicReference as At, isStatefulRecreateTargetSync as B, StateError as Ba, warnDeprecatedNoPrefixCliFlag as Bi, refuseMalformedOrphansForDestroy as Bn, hasUnverifiableParameterRefusal as Br, isSettledInstanceState as Bt, namesAnyDeclaredParameter as C, ConfigError as Ca, runDockerStreaming as Ci, isReadableResourceEntry as Cn, recoverMaskedOutput as Cr, slowCcOperationTimeoutMs as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, DynamicReferenceRegionAmbiguousError as Da, getDockerImageBySourceHash as Di, malformedOrphanRecordsWarning as Dn, S3StateBackend as Dr, disableInstanceApiTermination as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, DeployCancelledError as Ea, AssetManifestLoader as Ei, malformedLocalOutputsWarning as En, LockManager as Er, deleteSkipReason as Et, extractDeploymentEventError as F, ProvisioningError as Fa, resolveSkipPrefix as Fi, malformedResourcesWarning as Fn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Fr, isImpossibleEmptyStoredAttribute as Ft, toCfnInteger as G, withErrorHandling as Ga, findLargeInlineResources as Gi, refuseMalformedResourceEntries as Gn, orphansCarriedFrom as Gr, coerceCfnBoolean as Gt, WARM_THROUGHPUT_MEMBERS as H, formatError as Ha, CFN_TEMPLATE_BODY_LIMIT as Hi, refuseMalformedOutputs as Hn, importableOutputs as Hr, normalizeAwsTagsToCfn as Ht, makeSiblingClaimReader as I, ResourceTimeoutError as Ia, resolveStateBucketWithDefault as Ii, malformedStateRefusalMessage as In, DEFAULT_STATE_PREFIX as Ir, isNamelessDynamicReferenceError as It, bold as J, isThrottlingError as Ja, injectiveKey as Ji, refuseMalformedResourcesForDestroy as Jn, stringifyValue as Jr, configIntegerRefusal as Jt, toFiniteNumber as K, isMarkedNonRetryable as Ka, uploadCfnTemplate as Ki, refuseMalformedResourceEntriesForOrphan as Kn, shouldRetainResource as Kr, coerceCfnInteger as Kt, planOrphanAdoption as L, ResourceUpdateNotSupportedError as La, resolveStateBucketWithDefaultAndSource as Li, refuseDivergentRecordRegionForDestroy as Ln, exportNamesCarriedFrom as Lr, isUnboundTemplateParameter as Lt, refusesFinalSnapshot as M, MalformedProducerRecordRefusalError as Ma, resolveApp as Mi, malformedRenderedContainersWarning as Mn, forceQuitRecoveryClause as Mr, cfnRefValueFromPhysicalId as Mt, unsupportedFinalSnapshotError as N, NestedStackChildDirectDestroyError as Na, resolveAutoAssetStorage as Ni, malformedResourceEntriesWarning as Nn, formatLockExpiry as Nr, coerceParameterTypedValue as Nt, buildFinalSnapshotIdentifier as O, IntrinsicResolutionRefusalError as Oa, Synthesizer as Oi, malformedOrphansRefusalMessage as On, rebuildClientForBucketRegion as Or, isTerminationProtectionPropagationError as Ot, makeCanonicalizePropertiesFn as P, PartialFailureError as Pa, resolveCaptureObservedState as Pi, malformedResourcePropertiesWarning as Pn, shellQuote as Pr, getAccountInfo as Pt, red as Q, retryClassificationText as Qa, decodeListingKey as Qi, repairMalformedResourceEntriesForReadOnly as Qn, loadPublishableAssetManifest as Qr, requireConfigArray as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, StackHasActiveImportsError as Ra, resolveUseCdkBootstrapAssets as Ri, refuseMalformedNestedChildOutputs as Rn, hasReadableExportSet as Rr, parameterTypeMayLoseSecretIdentity as Rt, computeParameterTaint as S, CdkdError as Sa, runDockerForeground as Si, hasReadableResources as Sn, recordMaskOnlyValue as Sr, isWaitAbandonedError as St, resourcesNamingDeclaredParameter as T, DependencyError as Ta, stripControlChars as Ti, malformedExportSourceWarning as Tn, scrubResourceRecord as Tr, deleteIndeterminateGuards as Tt, coerceWarmThroughput as U, isCdkdError as Ua, CFN_TEMPLATE_URL_LIMIT as Ui, refuseMalformedOutputsForDestroy as Un, isReadableBag as Ur, resolveExplicitPhysicalId as Ut, renderStatefulReason as V, SynthesisError as Va, ssmResolvedValueType as Vi, refuseMalformedOrphansForOrphan as Vn, importableOutputKeys as Vr, WAFv2WebACLProvider as Vt, isWarmThroughputDecrease as W, normalizeAwsError as Wa, MIGRATE_TMP_PREFIX as Wi, refuseMalformedResourceAttributesForOrphan as Wn, orphansAfterRollback as Wr, assertRegionMatch as Wt, gray as X, markNonRetryable as Xa, producerCoordinateKey as Xi, repairMalformedOrphansForReadOnly as Xn, buildAssetRedirectMap as Xr, readConfigString as Xt, cyan as Y, isTransientServerError as Ya, injectiveKeyPrefix as Yi, refuseMalformedState as Yn, WorkGraph as Yr, configStringRefusal as Yt, green as Z, markRedactedCause as Za, producerRecordKey as Zi, repairMalformedOutputsForReadOnly as Zn, createAssetRedirectResolver as Zr, replayWarn as Zt, bagHoldsSecretExpression as _, AwsClients as _a, dockerSpawnEnvWithSensitive as _i, UNREADABLE_ORPHANS_CONTAINER_ROW as _n, identityKeyFor as _r, endCommandInterruptScope as _t, DeploymentEventsStore as a, globMatches as aa, isCrossRegionRedirect as ai, s3BucketDomainName as an, describeTypeWithThrottleRetry as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, setAwsClients as ba, partitionSensitiveEnv as bi, hasReadableOrphans as bn, maskSecretsInError as br, startInterruptWatch as bt, replayFailedOperations as c, hasOwnKey as ca, validateAssetBucketName as ci, s3BucketWebsiteUrl as cn, TemplateParser as cr, IAMRoleProvider as ct, updatePartialMessage as d, ownValue as da, buildDockerImage as di, applyCallerIdentityCredentials as dn, STATE_SOURCED_READBACK_RULES as dr, ProviderRegistry as dt, PARTITION_TABLE as ea, AssetModeResolver as ei, requireConfigString as en, safeStringify$1 as eo, repairMalformedResourcesForReadOnly as er, collectDeclaredOutputNames as et, updatePartialReason as f, absoluteAssemblyPathEscape as fa, resolveDockerContextDirectory as fi, callerEnvCredentials as fn, TEMPLATE_SOURCED_RULES as fr, wouldReturnToSdkProvider as ft, computeImplicitDeleteEdges as g, resolveBucketRegion as ga, describeDockerFailure as gi, STATE_RESOURCES_MALFORMED as gn, errorCauseChain as gr, beginCommandInterruptScope as gt, IMPLICIT_DELETE_DEPENDENCIES as h, clearBucketRegionCache as ha, describeDockerExecFailure as hi, INTRINSIC_KEYS as hn, dynamicReferenceTokens as hr, maskerOrIdentity as ht, DeploymentEventsReader as i, failedStageNote as ia, getBootstrapMarkerKey as ii, s3BucketArn as in, findSilentDropProperties as ir, secretBearing as it, isFinalSnapshotError as j, LockError as ja, getLegacyStateBucketName as ji, malformedOutputsWarning as jn, buildLockContentionMessage as jr, carriesFetchableDynamicReference as jt, ccRoutedFinalSnapshotError as k, LocalInvokeBuildError as ka, synthesisStatusMessage as ki, malformedOrphansWarning as kn, UNREPRODUCIBLE_LOCK_CLAUSE as kr, IntrinsicFunctionResolver as kt, replayRollback as l, hasPlainPrototype$1 as la, validateContainerRepoName as li, applyRoleArnIfSet as ln, STATE_SOURCED_BASELINE_RULES as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, resolveAssemblyPath as ma, describeDockerCapturedOutput as mi, DiffCalculator as mn, createSecretMasker as mr, maskDeep as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, derivePartitionAndUrlSuffix as na, assertAssetBucketRegion as ni, producerRegionsFromState as nn, safeStackName as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, processStackMessages as oa, parseBootstrapMarker as oi, s3BucketDualStackDomainName as on, withRetry as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, renderAssemblyPathEscape as pa, warnManifestExecutable as pi, envCredentialsAreAssumedRole as pn, carriesSecretMask as pr, createMaskedRetryLogger as pt, formatResourceLine as q, isRetryableTransientError as qa, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as qi, refuseMalformedResourcePropertiesForOrphan as qn, AssetPublisher as qr, configBooleanRefusal as qt, DeployEngine as r, AssemblyReader as ra, ensureAssetStorage as ri, withSharedDrainBudget as rn, findActionableSilentDrops as rr, isExportAliasCollision as rt, planRollback as s, defineOwnKey as sa, readBootstrapMarkerBody as si, s3BucketRegionalDomainName as sn, DagBuilder as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, canonicalizeRegion as ta, BOOTSTRAP_MARKER_PREFIX as ti, classifyReplaySecretRegion as tn, __exportAll as to, safeRegion as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, nullPrototypeRecord as ua, buildDenyExternalAccessPolicy as ui, AWS_CREDENTIAL_ENV_KEYS as un, STATE_SOURCED_CROSS_GENERATION_RULES as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, getAwsClients as va, formatDockerLoginError as vi, UNREADABLE_RESOURCES_MAP_ROW as vn, isSingleDynamicReferenceToken as vr, interruptWatchListenerCount as vt, reachableDivergentParameters as w, CrossAccountSecretRefusalError as wa, escapeRegExp$1 as wi, malformedExportNamesWarning as wn, redactSecretsForState as wr, UNSPECIFIED_SKIP_REASON as wt, bindingSkippedOutputs as x, AssetError as xa, redactDockerArgvValues as xi, hasReadableOutputs as xn, maskSecretsInText as xr, CloudControlProvider as xt, keptWholeReasonText as y, resetAwsClients as ya, getDockerCmd as yi, displayLogicalId as yn, markSameGenerationBag as yr, isInterruptedWaitError as yt, isStatefulRecreateTargetForReplace as z, StackTerminationProtectionError as za, stateBucketExistenceConfirmed as zi, refuseMalformedOrphans as zn, hasReasonlessBaselineRefusal as zr, refStateLookupFromResource as zt };
50736
+ //# sourceMappingURL=deploy-engine-CpMT9Bmm.js.map