@go-to-k/cdkd 0.291.18 → 0.291.19

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 isPasteableIdent, E as displayStackName, O as truncateCodePoints, 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-Bt0RGDfb.js";
2
2
  import { a as setAssumedRoleCredentials, c as currentStackAwsScope, i as getPreAssumeEnvCredentials, l as runInStackAwsScope, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-jISU4PHo.js";
3
- import { t as getCdkdVersion } from "./version-CJkb2usU.js";
3
+ import { t as getCdkdVersion } from "./version-2QIPw29e.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";
@@ -4120,6 +4120,109 @@ var ContextStore = class {
4120
4120
  }
4121
4121
  };
4122
4122
 
4123
+ //#endregion
4124
+ //#region src/utils/ambient-client-defaults.ts
4125
+ /**
4126
+ * Client config for an SDK client built OUTSIDE `AwsClients` (issue
4127
+ * [#3588](https://github.com/go-to-k/cdkd/issues/3588)).
4128
+ *
4129
+ * `awsClientDefaults()` alone carries the ambient ENVIRONMENT — `AWS_PROFILE`,
4130
+ * a published `--role-arn` role, the proxy handler, a stack scope's region — but
4131
+ * not an explicit `AwsClientConfig.credentials` object, which has no
4132
+ * environment path at all. A LIBRARY caller that installs
4133
+ * `new AwsClients({ credentials })` (`AwsClients` / `setAwsClients` are public
4134
+ * exports) therefore had every client a provider, context provider,
4135
+ * asset publisher or the cross-account STS hop built for itself signing with
4136
+ * the default credential chain: a different identity from the one it
4137
+ * configured. {@link ambientClientDefaults} closes that for every site at once
4138
+ * by reading the ACTIVE clients' {@link AwsClients.credentialConfig}.
4139
+ *
4140
+ * BOUND: a site that caches its client (every SDK provider's lazy
4141
+ * `getClient()`) captures the identity active at its FIRST call. cdkd builds a
4142
+ * provider registry per stack inside that stack's scope, so this is the stack's
4143
+ * identity; a library caller that reuses one registry across `setAwsClients`
4144
+ * switches keeps the first identity's clients.
4145
+ *
4146
+ * SPREAD IT FIRST, exactly where `awsClientDefaults()` was spread:
4147
+ *
4148
+ * `new GlueClient({ ...ambientClientDefaults(), ...(region && { region }) })`
4149
+ *
4150
+ * The site's own keys still win, so a site that names its own `region` or its
4151
+ * own `credentials` keeps them. `scripts/check-aws-client-defaults.ts` accepts
4152
+ * this helper as the defaults spread (it calls `awsClientDefaults` afresh per
4153
+ * call, so each client still gets its own routing agent), and
4154
+ * `tests/unit/utils/ambient-client-defaults-fence.test.ts` refuses a new
4155
+ * `awsClientDefaults()`-only construction under `src/**`.
4156
+ *
4157
+ * Its own module rather than a member of `aws-clients.ts` so that a test which
4158
+ * `vi.mock`s `aws-clients.js` with a `getAwsClients` double still reaches this
4159
+ * code and degrades, instead of losing the export. It is deliberately OUTSIDE
4160
+ * the literal-`.ts` closure `scripts/audit-provider-coverage.ts` resolves
4161
+ * (nothing in that closure imports it), and neither module it imports imports
4162
+ * it back, so there is no cycle.
4163
+ */
4164
+ /**
4165
+ * The ACTIVE clients' credential configuration: the stack scope's
4166
+ * `AwsClients` inside `runWithStackAwsClients`, else the process-global one.
4167
+ *
4168
+ * `{}` when those clients carry none (every CLI run passes no explicit
4169
+ * `credentials`, and `--profile` alone yields `{ profile }`), and also for a
4170
+ * test double that has no `credentialConfig` getter — degrading to the plain
4171
+ * `awsClientDefaults()` answer rather than throwing.
4172
+ *
4173
+ * Read through `getAwsClients()`, which creates an unconfigured global on first
4174
+ * use when nothing installed one. That is side-effect free here: its service
4175
+ * clients are lazy, no production call passes `getAwsClients(config)` (so no
4176
+ * later configuration is shadowed), and `setAwsClients` replaces it.
4177
+ */
4178
+ function ambientCredentialConfig() {
4179
+ return getAwsClients()?.credentialConfig ?? {};
4180
+ }
4181
+ /**
4182
+ * `awsClientDefaults(...)` plus `credentialConfig`, in `AwsClients.clientOptions`'
4183
+ * spread order: the defaults FIRST, so an explicit `credentials` outranks a
4184
+ * published `--role-arn` role, then `profile`, then `credentials`.
4185
+ *
4186
+ * Takes the configuration as an argument for the callers that must key a cache
4187
+ * on the SAME reading they build from ({@link credentialFingerprint}); every
4188
+ * other site calls {@link ambientClientDefaults}.
4189
+ */
4190
+ function clientDefaultsFor(credentialConfig) {
4191
+ return {
4192
+ ...awsClientDefaults({ profile: credentialConfig.profile }),
4193
+ ...credentialConfig.profile && { profile: credentialConfig.profile },
4194
+ ...credentialConfig.credentials && { credentials: { ...credentialConfig.credentials } }
4195
+ };
4196
+ }
4197
+ /**
4198
+ * The config every SDK client built outside `AwsClients` spreads first: the
4199
+ * proxy / role / scope-region defaults plus the ACTIVE clients' profile and
4200
+ * explicit credentials.
4201
+ */
4202
+ function ambientClientDefaults() {
4203
+ return clientDefaultsFor(ambientCredentialConfig());
4204
+ }
4205
+ /**
4206
+ * A cache-key component naming WHICH identity a credential configuration
4207
+ * selects, for a cache that holds a client (or credentials) built from it.
4208
+ *
4209
+ * `profile` plus the explicit credentials' ACCESS KEY ID — never the secret
4210
+ * key or the session token. The access key id is an identifier rather than a
4211
+ * secret (`expected-bucket-owner.ts` already keys its account cache on it), and
4212
+ * STS issues a distinct one per session, so two different explicit bags are
4213
+ * told apart. The one collision is two bags sharing an access key id with
4214
+ * different secrets, at most one of which can be valid.
4215
+ *
4216
+ * What it does NOT carry, because it is PROCESS-WIDE rather than per
4217
+ * configuration: a published `--role-arn` role (set once, refused a second
4218
+ * time), the proxy, and `AWS_PROFILE` / the environment chain. Two readings
4219
+ * with equal fingerprints within one process therefore resolve to the same
4220
+ * identity. Do not log it.
4221
+ */
4222
+ function credentialFingerprint(credentialConfig) {
4223
+ return JSON.stringify([credentialConfig.profile ?? null, credentialConfig.credentials?.accessKeyId ?? null]);
4224
+ }
4225
+
4123
4226
  //#endregion
4124
4227
  //#region src/synthesis/context-providers/az-provider.ts
4125
4228
  /**
@@ -4138,7 +4241,7 @@ var AZContextProvider = class {
4138
4241
  const region = props["region"] || this.awsConfig?.region;
4139
4242
  this.logger.debug(`Fetching availability zones for region: ${region}`);
4140
4243
  const client = new EC2Client({
4141
- ...awsClientDefaults(),
4244
+ ...ambientClientDefaults(),
4142
4245
  ...region && { region }
4143
4246
  });
4144
4247
  try {
@@ -4171,7 +4274,7 @@ var SSMContextProvider = class {
4171
4274
  if (!parameterName) throw new Error("SSM context provider requires parameterName property");
4172
4275
  this.logger.debug(`Reading SSM parameter: ${parameterName} (region: ${region})`);
4173
4276
  const client = new SSMClient({
4174
- ...awsClientDefaults(),
4277
+ ...ambientClientDefaults(),
4175
4278
  ...region && { region }
4176
4279
  });
4177
4280
  try {
@@ -4213,7 +4316,7 @@ var HostedZoneContextProvider = class {
4213
4316
  if (!domainName) throw new Error("Hosted zone context provider requires domainName property");
4214
4317
  this.logger.debug(`Looking up hosted zone: ${domainName} (private: ${privateZone})`);
4215
4318
  const client = new Route53Client({
4216
- ...awsClientDefaults(),
4319
+ ...ambientClientDefaults(),
4217
4320
  ...region && { region }
4218
4321
  });
4219
4322
  try {
@@ -4267,7 +4370,7 @@ var VpcContextProvider = class {
4267
4370
  const returnVpnGateways = props["returnVpnGateways"];
4268
4371
  this.logger.debug(`Looking up VPC (region: ${region}, filter: ${JSON.stringify(filter)})`);
4269
4372
  const client = new EC2Client({
4270
- ...awsClientDefaults(),
4373
+ ...ambientClientDefaults(),
4271
4374
  ...region && { region }
4272
4375
  });
4273
4376
  try {
@@ -4433,7 +4536,7 @@ var CcApiContextProvider = class {
4433
4536
  if (!typeName) throw new Error("CC API context provider requires typeName property");
4434
4537
  this.logger.debug(`CC API lookup: ${typeName}${exactIdentifier ? ` (id: ${exactIdentifier})` : ""} (region: ${region})`);
4435
4538
  const client = new CloudControlClient({
4436
- ...awsClientDefaults(),
4539
+ ...ambientClientDefaults(),
4437
4540
  ...region && { region }
4438
4541
  });
4439
4542
  try {
@@ -4560,7 +4663,7 @@ var AmiContextProvider = class {
4560
4663
  const filters = props["filters"];
4561
4664
  this.logger.debug(`Looking up AMI (region: ${region})`);
4562
4665
  const client = new EC2Client({
4563
- ...awsClientDefaults(),
4666
+ ...ambientClientDefaults(),
4564
4667
  ...region && { region }
4565
4668
  });
4566
4669
  try {
@@ -4603,7 +4706,7 @@ var SecurityGroupContextProvider = class {
4603
4706
  const vpcId = props["vpcId"];
4604
4707
  this.logger.debug(`Looking up security group (id: ${securityGroupId}, name: ${securityGroupName}, region: ${region})`);
4605
4708
  const client = new EC2Client({
4606
- ...awsClientDefaults(),
4709
+ ...ambientClientDefaults(),
4607
4710
  ...region && { region }
4608
4711
  });
4609
4712
  try {
@@ -4657,7 +4760,7 @@ var LoadBalancerContextProvider = class {
4657
4760
  const loadBalancerType = props["loadBalancerType"];
4658
4761
  this.logger.debug(`Looking up load balancer (arn: ${loadBalancerArn}, region: ${region})`);
4659
4762
  const client = new ElasticLoadBalancingV2Client({
4660
- ...awsClientDefaults(),
4763
+ ...ambientClientDefaults(),
4661
4764
  ...region && { region }
4662
4765
  });
4663
4766
  try {
@@ -4699,7 +4802,7 @@ var LoadBalancerListenerContextProvider = class {
4699
4802
  const listenerProtocol = props["listenerProtocol"];
4700
4803
  this.logger.debug(`Looking up load balancer listener (arn: ${listenerArn}, lb: ${loadBalancerArn}, region: ${region})`);
4701
4804
  const client = new ElasticLoadBalancingV2Client({
4702
- ...awsClientDefaults(),
4805
+ ...ambientClientDefaults(),
4703
4806
  ...region && { region }
4704
4807
  });
4705
4808
  try {
@@ -4743,7 +4846,7 @@ var KeyContextProvider = class {
4743
4846
  if (!aliasName) throw new Error("Key context provider requires aliasName property");
4744
4847
  this.logger.debug(`Looking up KMS key by alias: ${aliasName} (region: ${region})`);
4745
4848
  const client = new KMSClient({
4746
- ...awsClientDefaults(),
4849
+ ...ambientClientDefaults(),
4747
4850
  ...region && { region }
4748
4851
  });
4749
4852
  try {
@@ -6647,7 +6750,7 @@ async function expandMacrosAttempt(template, opts, logger) {
6647
6750
  const parameters = buildParameterValues(template, logger);
6648
6751
  ownsClient = opts.cfnClient === void 0;
6649
6752
  cfn = opts.cfnClient ?? new CloudFormationClient({
6650
- ...awsClientDefaults(),
6753
+ ...ambientClientDefaults(),
6651
6754
  region
6652
6755
  });
6653
6756
  let templateInput;
@@ -7778,7 +7881,7 @@ var FileAssetPublisher = class {
7778
7881
  const destRegion = dest.region ? this.resolvePlaceholders(dest.region, accountId, region) : region;
7779
7882
  this.logger.debug(`Publishing file asset ${asset.displayName || assetHash} → s3://${bucketName}/${objectKey}`);
7780
7883
  const client = new S3Client({
7781
- ...awsClientDefaults(),
7884
+ ...ambientClientDefaults(),
7782
7885
  region: destRegion
7783
7886
  });
7784
7887
  try {
@@ -9740,7 +9843,7 @@ var DockerAssetPublisher = class {
9740
9843
  const ecrUri = `${accountId}.dkr.ecr.${destRegion}.${ecrUrlSuffix(destRegion)}/${repositoryName}:${imageTag}`;
9741
9844
  this.logger.debug(`Publishing Docker image ${asset.displayName || assetHash} → ${ecrUri}`);
9742
9845
  const client = new ECRClient({
9743
- ...awsClientDefaults(),
9846
+ ...ambientClientDefaults(),
9744
9847
  region: destRegion
9745
9848
  });
9746
9849
  try {
@@ -9779,7 +9882,7 @@ var DockerAssetPublisher = class {
9779
9882
  const destRegion = dest.region ? this.resolvePlaceholders(dest.region, accountId, region) : region;
9780
9883
  const ecrUri = `${accountId}.dkr.ecr.${destRegion}.${ecrUrlSuffix(destRegion)}/${repositoryName}:${imageTag}`;
9781
9884
  const client = new ECRClient({
9782
- ...awsClientDefaults(),
9885
+ ...ambientClientDefaults(),
9783
9886
  region: destRegion
9784
9887
  });
9785
9888
  try {
@@ -11322,7 +11425,7 @@ var AssetPublisher = class {
11322
11425
  if (!accountId) {
11323
11426
  const { STSClient, GetCallerIdentityCommand } = await import("@aws-sdk/client-sts");
11324
11427
  const stsClient = new STSClient({
11325
- ...awsClientDefaults(),
11428
+ ...ambientClientDefaults(),
11326
11429
  region
11327
11430
  });
11328
11431
  accountId = (await stsClient.send(new GetCallerIdentityCommand({}))).Account;
@@ -26557,7 +26660,8 @@ function applyCallerIdentityCredentials(env) {
26557
26660
  //#endregion
26558
26661
  //#region src/utils/role-arn.ts
26559
26662
  /**
26560
- * Process-lifetime cache of assumed credentials keyed by RoleArn.
26663
+ * Process-lifetime cache of assumed credentials keyed by RoleArn AND the
26664
+ * SOURCE identity the `sts:AssumeRole` hop runs as.
26561
26665
  *
26562
26666
  * Storing the in-flight `Promise` (rather than the resolved value) collapses
26563
26667
  * concurrent first-time callers into a single `sts:AssumeRole` request. After
@@ -26565,10 +26669,19 @@ function applyCallerIdentityCredentials(env) {
26565
26669
  * stack that references the same producer N times via `Fn::GetStackOutput`
26566
26670
  * only pays the STS hop once.
26567
26671
  *
26568
- * The cache is keyed by RoleArn alone (not RoleArn + region) because STS
26569
- * credentials are global — assumed credentials work against any region's
26570
- * service endpoint. The downstream S3 client built from these credentials
26571
- * picks its own region via `GetBucketLocation`.
26672
+ * Not keyed by region, because STS credentials are global — assumed
26673
+ * credentials work against any region's service endpoint. The downstream S3
26674
+ * client built from these credentials picks its own region via
26675
+ * `GetBucketLocation`.
26676
+ *
26677
+ * KEYED BY THE SOURCE IDENTITY TOO (issue
26678
+ * [#3588](https://github.com/go-to-k/cdkd/issues/3588)): the hop runs as the
26679
+ * ACTIVE `AwsClients`' credential configuration, and a library caller can
26680
+ * install (`setAwsClients`) two different explicit credentials in one process,
26681
+ * as can cdkd's own per-stack scopes. Keyed by RoleArn alone, the second would be handed
26682
+ * credentials the FIRST identity obtained — a role the second one may not even
26683
+ * be trusted to assume. The source half is `credentialFingerprint`'s (profile +
26684
+ * access key id, never secret material).
26572
26685
  *
26573
26686
  * **Expiration handling**: on every cache hit, the cached credentials'
26574
26687
  * `expiration` is compared against `Date.now()` with a 60-second safety
@@ -26628,7 +26741,7 @@ function parseIamRoleArn(roleArn) {
26628
26741
  * the consumer account's normal credentials). Threading the credentials
26629
26742
  * through a fresh `S3Client` via this helper keeps the scope narrow.
26630
26743
  *
26631
- * **Why cache per-RoleArn for the process lifetime.** A multi-resource
26744
+ * **Why cache per RoleArn (and source identity) for the process lifetime.** A multi-resource
26632
26745
  * stack typically references `Fn::GetStackOutput` from many template sites
26633
26746
  * (every IAM policy / Lambda env / ALB listener that pulls a shared VPC ID
26634
26747
  * from a platform stack). Assuming the role once per deploy is sufficient;
@@ -26651,17 +26764,19 @@ function parseIamRoleArn(roleArn) {
26651
26764
  * uniformly), but the next caller after rejection gets a clean slate.
26652
26765
  */
26653
26766
  async function assumeRoleForCrossAccountStateRead(roleArn) {
26654
- const cached = crossAccountCredentialsCache.get(roleArn);
26767
+ const sourceConfig = ambientCredentialConfig();
26768
+ const cacheKey = JSON.stringify([credentialFingerprint(sourceConfig), roleArn]);
26769
+ const cached = crossAccountCredentialsCache.get(cacheKey);
26655
26770
  if (cached) {
26656
26771
  const cachedCreds = await cached;
26657
26772
  if (!cachedCreds.expiration || Date.now() < cachedCreds.expiration.getTime() - CRED_EXPIRY_SAFETY_MS) return cachedCreds;
26658
- crossAccountCredentialsCache.delete(roleArn);
26773
+ crossAccountCredentialsCache.delete(cacheKey);
26659
26774
  }
26660
26775
  const promise = (async () => {
26661
26776
  const logger = getLogger().child("role-arn");
26662
26777
  const displayRoleArn = displayIdent(roleArn, { maxCodePoints: 613 });
26663
26778
  logger.debug(`Assuming role for cross-account state read: ${displayRoleArn}`);
26664
- const sts = new STSClient({ ...awsClientDefaults() });
26779
+ const sts = new STSClient({ ...clientDefaultsFor(sourceConfig) });
26665
26780
  try {
26666
26781
  let response;
26667
26782
  try {
@@ -26688,10 +26803,10 @@ async function assumeRoleForCrossAccountStateRead(roleArn) {
26688
26803
  sts.destroy();
26689
26804
  }
26690
26805
  })().catch((err) => {
26691
- if (crossAccountCredentialsCache.get(roleArn) === promise) crossAccountCredentialsCache.delete(roleArn);
26806
+ if (crossAccountCredentialsCache.get(cacheKey) === promise) crossAccountCredentialsCache.delete(cacheKey);
26692
26807
  throw err;
26693
26808
  });
26694
- crossAccountCredentialsCache.set(roleArn, promise);
26809
+ crossAccountCredentialsCache.set(cacheKey, promise);
26695
26810
  return promise;
26696
26811
  }
26697
26812
  /**
@@ -28588,7 +28703,7 @@ var WAFv2WebACLProvider = class {
28588
28703
  ])]]);
28589
28704
  getClient() {
28590
28705
  if (!this.wafv2Client) this.wafv2Client = new WAFV2Client({
28591
- ...awsClientDefaults(),
28706
+ ...ambientClientDefaults(),
28592
28707
  ...this.providerRegion ? { region: this.providerRegion } : {}
28593
28708
  });
28594
28709
  return this.wafv2Client;
@@ -30012,6 +30127,18 @@ async function allSettledKeepingFirstRejection(promises, onAbandoned) {
30012
30127
  }
30013
30128
  }
30014
30129
  /**
30130
+ * The key for the resolver's per-region SDK client caches ({@link
30131
+ * IntrinsicFunctionResolver}'s `cfnClients`, `regionScopedClients` and
30132
+ * `serviceDiscoveryClients`): the region PLUS the credential fingerprint of the
30133
+ * configuration the cached client was built from (issue
30134
+ * [#3588](https://github.com/go-to-k/cdkd/issues/3588)). Encoded through
30135
+ * {@link injectiveKey}, so no region or profile spelling can forge another
30136
+ * pair's key.
30137
+ */
30138
+ function clientCacheKey(region, credentialConfig) {
30139
+ return injectiveKey(region, credentialFingerprint(credentialConfig));
30140
+ }
30141
+ /**
30015
30142
  * Is `region` safe to build an AWS SDK client from?
30016
30143
  *
30017
30144
  * This is a SECURITY gate, not an AWS region registry, and the distinction
@@ -30493,15 +30620,22 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30493
30620
  * foreign region per resolver, versus the ambient clients which are already
30494
30621
  * created and destroyed per stack by `deploy.ts`.
30495
30622
  *
30496
- * KEYED BY REGION ALONE, which means an entry also pins the CREDENTIAL
30497
- * configuration of whichever ambient instance was current at the first
30498
- * mismatch for that region. That is sound today because the credential half
30499
- * is process-wide rather than per-stack: `--profile` comes from one CLI
30500
- * option and `--role-arn` lands in `process.env`, so every ambient instance
30501
- * a run installs carries the same one. Widen the key to include
30502
- * {@link AwsClients.credentialConfig} the moment that stops being true —
30503
- * per-stack credentials would otherwise let one stack's lookups run under
30504
- * another's identity, which is a worse bug than the one this cache serves.
30623
+ * KEYED BY REGION AND CREDENTIAL FINGERPRINT ({@link clientCacheKey}, issue
30624
+ * [#3588](https://github.com/go-to-k/cdkd/issues/3588)). An entry pins the
30625
+ * credential configuration of the ambient instance it was derived from, and
30626
+ * that half is process-wide only for the CLI (one `--profile`, one
30627
+ * `--role-arn`): a LIBRARY caller can drive one resolver across two
30628
+ * `setAwsClients` installs (or cdkd's per-stack scopes) with different
30629
+ * explicit credentials, and keyed by region alone the second's lookups ran under the first's
30630
+ * identity. {@link cfnClients} and {@link serviceDiscoveryClients} share the
30631
+ * key for the same reason, and the two CloudFormation fallback memos
30632
+ * ({@link cfnExportsPromises}, {@link cfnStackOutputsCache}) carry the
30633
+ * fingerprint too.
30634
+ *
30635
+ * THE CLIENT HALF IS CLOSED, NOT THE WHOLE CLASS: {@link cachedDynamicReferences}
30636
+ * (keyed by the expression alone) and the PROCESS-GLOBAL account identity
30637
+ * behind `getAccountInfo` still assume one identity per resolver and per
30638
+ * process respectively — a value one identity read is served to the next.
30505
30639
  */
30506
30640
  regionScopedClients = /* @__PURE__ */ new Map();
30507
30641
  /**
@@ -30568,9 +30702,10 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30568
30702
  /**
30569
30703
  * Per-region CloudFormation clients for the cross-stack fallback
30570
30704
  * lookups (issue #1697). Keyed by region because `Fn::GetStackOutput`
30571
- * may target a region different from the consumer's deploy region.
30705
+ * may target a region different from the consumer's deploy region, and by
30706
+ * the credential fingerprint for {@link regionScopedClients}' reason.
30572
30707
  */
30573
- cfnClients = {};
30708
+ cfnClients = /* @__PURE__ */ new Map();
30574
30709
  /**
30575
30710
  * Memoized full `ListExports` listing for the `Fn::ImportValue`
30576
30711
  * fallback (issue #1697 review). Without it, EVERY cdkd-miss import
@@ -30582,14 +30717,18 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30582
30717
  * deploys. FAILED fetches are not cached (the rejection handler
30583
30718
  * clears the slot) so a transient throttle does not poison the rest
30584
30719
  * of the deploy's lookups.
30720
+ *
30721
+ * Keyed by the credential fingerprint (issue #3588): a listing is an answer
30722
+ * one identity was allowed to read, so it is never handed to another.
30585
30723
  */
30586
- cfnExportsPromise;
30724
+ cfnExportsPromises = /* @__PURE__ */ new Map();
30587
30725
  /**
30588
30726
  * Memoized per-(region, stack) `DescribeStacks` outputs for the
30589
30727
  * `Fn::GetStackOutput` fallback (issue #1697 review) — a stack
30590
30728
  * referencing the same CFn producer N times pays one call. Successful
30591
30729
  * lookups (including the definitive "stack does not exist" miss) are
30592
- * cached; lookup FAILURES are evicted so they are retried.
30730
+ * cached; lookup FAILURES are evicted so they are retried. Keyed by the
30731
+ * credential fingerprint as well, for {@link cfnExportsPromises}' reason.
30593
30732
  */
30594
30733
  cfnStackOutputsCache = /* @__PURE__ */ new Map();
30595
30734
  /**
@@ -30821,11 +30960,12 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30821
30960
  const loggedTarget = targetLogText ?? (targetRegion === this.explicitRegion ? this.explicitRegionLogText : void 0) ?? target;
30822
30961
  if (!isClientSafeRegion(target)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to build AWS clients for the region '${displaySafe(stripControlChars(loggedTarget)).slice(0, 64)}': it is not a valid AWS region name, and a region is substituted into the AWS service hostname.`));
30823
30962
  if (typeof ambient.withRegion !== "function") return ambient;
30824
- const cached = this.regionScopedClients.get(target);
30963
+ const cacheKey = clientCacheKey(target, ambient.credentialConfig ?? {});
30964
+ const cached = this.regionScopedClients.get(cacheKey);
30825
30965
  if (cached) return cached;
30826
30966
  if (canonicalizeRegion(ambient.configuredRegion) === target) return ambient;
30827
30967
  const scoped = ambient.withRegion(target);
30828
- this.regionScopedClients.set(target, scoped);
30968
+ this.regionScopedClients.set(cacheKey, scoped);
30829
30969
  this.logger.debug(`Using region-scoped AWS clients for ${displaySafe(loggedTarget)}`);
30830
30970
  return scoped;
30831
30971
  }
@@ -30856,21 +30996,21 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
30856
30996
  * `getAccountInfo`'s in-flight promise and reach here one at a time, which
30857
30997
  * the case says out loud. A REJECTED import is evicted
30858
30998
  * so a transient failure does not poison the rest of the deploy, mirroring
30859
- * `cfnExportsPromise`. Lifetime is the resolver's own, like
30999
+ * `cfnExportsPromises`. Lifetime is the resolver's own, like
30860
31000
  * {@link regionScopedClients} and {@link cfnClients}: at most one per region
30861
31001
  * per resolver, versus the one-per-CALL this replaces.
30862
31002
  */
30863
31003
  async serviceDiscoveryClient() {
30864
31004
  const scoped = this.clientsForRegion(this.explicitRegion);
30865
31005
  const region = scoped.configuredRegion;
30866
- const key = region ?? "";
31006
+ const credentialConfig = scoped.credentialConfig ?? {};
31007
+ const key = clientCacheKey(region ?? "", credentialConfig);
30867
31008
  const cached = this.serviceDiscoveryClients.get(key);
30868
31009
  if (cached) return cached;
30869
31010
  const building = (async () => {
30870
31011
  const { ServiceDiscoveryClient } = await import("@aws-sdk/client-servicediscovery");
30871
31012
  return new ServiceDiscoveryClient({
30872
- ...awsClientDefaults({ profile: scoped.credentialConfig?.profile }),
30873
- ...scoped.credentialConfig ?? {},
31013
+ ...clientDefaultsFor(credentialConfig),
30874
31014
  ...region ? { region } : {}
30875
31015
  });
30876
31016
  })();
@@ -33276,12 +33416,14 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33276
33416
  * the same not-found error anyway.
33277
33417
  */
33278
33418
  async lookupCfnExport(exportName, context) {
33279
- let listing = this.cfnExportsPromise;
33419
+ const listingKey = credentialFingerprint(ambientCredentialConfig());
33420
+ let listing = this.cfnExportsPromises.get(listingKey);
33280
33421
  if (!listing) {
33281
- listing = this.fetchAllCfnExports();
33282
- this.cfnExportsPromise = listing;
33283
- listing.catch(() => {
33284
- if (this.cfnExportsPromise === listing) this.cfnExportsPromise = void 0;
33422
+ const fetched = this.fetchAllCfnExports();
33423
+ listing = fetched;
33424
+ this.cfnExportsPromises.set(listingKey, fetched);
33425
+ fetched.catch(() => {
33426
+ if (this.cfnExportsPromises.get(listingKey) === fetched) this.cfnExportsPromises.delete(listingKey);
33285
33427
  });
33286
33428
  }
33287
33429
  try {
@@ -33351,7 +33493,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33351
33493
  * contract as {@link lookupCfnExport}.
33352
33494
  */
33353
33495
  async lookupCfnStackOutputs(stackName, region, context, loggedRegionText) {
33354
- const cacheKey = injectiveKey(region, stackName);
33496
+ const cacheKey = injectiveKey(region, stackName, credentialFingerprint(ambientCredentialConfig()));
33355
33497
  let fetch = this.cfnStackOutputsCache.get(cacheKey);
33356
33498
  if (!fetch) {
33357
33499
  fetch = this.fetchCfnStackOutputs(stackName, region);
@@ -33402,19 +33544,19 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
33402
33544
  * Not routed through {@link clientsForRegion}: the region here is always
33403
33545
  * the one the caller named, never the ambient's, and a test double without
33404
33546
  * `credentialConfig` degrades to the default chain rather than throwing.
33405
- * Keyed by region alone for the reason {@link regionScopedClients} gives:
33406
- * the credential half is process-wide.
33547
+ * Keyed by region AND credential fingerprint for the reason
33548
+ * {@link regionScopedClients} gives (issue #3588).
33407
33549
  */
33408
33550
  getCfnClient(region) {
33409
- let client = this.cfnClients[region];
33551
+ const credentialConfig = ambientCredentialConfig();
33552
+ const key = clientCacheKey(region, credentialConfig);
33553
+ let client = this.cfnClients.get(key);
33410
33554
  if (!client) {
33411
- const credentialConfig = getAwsClients().credentialConfig ?? {};
33412
33555
  client = new CloudFormationClient({
33413
- ...awsClientDefaults({ profile: credentialConfig.profile }),
33414
- ...credentialConfig,
33556
+ ...clientDefaultsFor(credentialConfig),
33415
33557
  region
33416
33558
  });
33417
- this.cfnClients[region] = client;
33559
+ this.cfnClients.set(key, client);
33418
33560
  }
33419
33561
  return client;
33420
33562
  }
@@ -36756,7 +36898,7 @@ var CloudControlProvider = class {
36756
36898
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
36757
36899
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
36758
36900
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
36759
- const { ASGProvider } = await import("./asg-provider-DR5gOGbi.js").then((n) => n.n);
36901
+ const { ASGProvider } = await import("./asg-provider-Dpki2-Xd.js").then((n) => n.n);
36760
36902
  const asgProvider = new ASGProvider();
36761
36903
  return withIndeterminateGuard(await asgProvider.delete(logicalId, physicalId, resourceType, _properties, context), indeterminateGuard);
36762
36904
  }
@@ -37306,7 +37448,7 @@ var CloudControlProvider = class {
37306
37448
  break;
37307
37449
  case "AWS::RDS::DBCluster":
37308
37450
  try {
37309
- const cluster = (await new RDSClient({ ...awsClientDefaults() }).send(new DescribeDBClustersCommand({ DBClusterIdentifier: physicalId }))).DBClusters?.[0];
37451
+ const cluster = (await new RDSClient({ ...ambientClientDefaults() }).send(new DescribeDBClustersCommand({ DBClusterIdentifier: physicalId }))).DBClusters?.[0];
37310
37452
  if (cluster) {
37311
37453
  if (cluster.Endpoint) enriched["Endpoint.Address"] = cluster.Endpoint;
37312
37454
  if (cluster.Port !== void 0) enriched["Endpoint.Port"] = String(cluster.Port);
@@ -37321,7 +37463,7 @@ var CloudControlProvider = class {
37321
37463
  break;
37322
37464
  case "AWS::RDS::DBInstance":
37323
37465
  try {
37324
- const inst = (await new RDSClient({ ...awsClientDefaults() }).send(new DescribeDBInstancesCommand({ DBInstanceIdentifier: physicalId }))).DBInstances?.[0];
37466
+ const inst = (await new RDSClient({ ...ambientClientDefaults() }).send(new DescribeDBInstancesCommand({ DBInstanceIdentifier: physicalId }))).DBInstances?.[0];
37325
37467
  if (inst) {
37326
37468
  if (inst.Endpoint?.Address) enriched["Endpoint.Address"] = inst.Endpoint.Address;
37327
37469
  if (inst.Endpoint?.Port !== void 0) enriched["Endpoint.Port"] = String(inst.Endpoint.Port);
@@ -37475,7 +37617,7 @@ var CloudControlProvider = class {
37475
37617
  break;
37476
37618
  case "AWS::ElastiCache::ReplicationGroup":
37477
37619
  try {
37478
- const rg = (await new ElastiCacheClient({ ...awsClientDefaults() }).send(new DescribeReplicationGroupsCommand({ ReplicationGroupId: physicalId }))).ReplicationGroups?.[0];
37620
+ const rg = (await new ElastiCacheClient({ ...ambientClientDefaults() }).send(new DescribeReplicationGroupsCommand({ ReplicationGroupId: physicalId }))).ReplicationGroups?.[0];
37479
37621
  if (rg) {
37480
37622
  const primaryNode = rg.NodeGroups?.[0];
37481
37623
  if (primaryNode?.PrimaryEndpoint?.Address) enriched["PrimaryEndPoint.Address"] = primaryNode.PrimaryEndpoint.Address;
@@ -37497,7 +37639,7 @@ var CloudControlProvider = class {
37497
37639
  break;
37498
37640
  case "AWS::Redshift::Cluster":
37499
37641
  try {
37500
- const cluster = (await new RedshiftClient({ ...awsClientDefaults() }).send(new DescribeClustersCommand({ ClusterIdentifier: physicalId }))).Clusters?.[0];
37642
+ const cluster = (await new RedshiftClient({ ...ambientClientDefaults() }).send(new DescribeClustersCommand({ ClusterIdentifier: physicalId }))).Clusters?.[0];
37501
37643
  if (cluster?.Endpoint) {
37502
37644
  if (cluster.Endpoint.Address) enriched["Endpoint.Address"] = cluster.Endpoint.Address;
37503
37645
  if (cluster.Endpoint.Port !== void 0) enriched["Endpoint.Port"] = String(cluster.Endpoint.Port);
@@ -37509,7 +37651,7 @@ var CloudControlProvider = class {
37509
37651
  break;
37510
37652
  case "AWS::OpenSearchService::Domain":
37511
37653
  try {
37512
- const domain = (await new OpenSearchClient({ ...awsClientDefaults() }).send(new DescribeDomainCommand({ DomainName: physicalId }))).DomainStatus;
37654
+ const domain = (await new OpenSearchClient({ ...ambientClientDefaults() }).send(new DescribeDomainCommand({ DomainName: physicalId }))).DomainStatus;
37513
37655
  if (domain) {
37514
37656
  const endpoint = domain.Endpoint ?? domain.Endpoints?.["vpc"];
37515
37657
  if (endpoint) enriched["DomainEndpoint"] = endpoint;
@@ -44746,8 +44888,11 @@ async function planOrphanAdoption(params) {
44746
44888
  const claims = async () => siblingClaims ??= await params.readSiblingClaims();
44747
44889
  for (const record of params.records) {
44748
44890
  const { logicalId, state } = record;
44891
+ const shownId = displayIdent(logicalId);
44892
+ const shownType = displayIdent(state.resourceType);
44893
+ const shownPhysicalId = displaySafe(state.physicalId);
44749
44894
  if (params.managedLogicalIds.has(logicalId)) {
44750
- params.logger.debug(`orphan ${logicalId}: already present in state.resources — dropping the stale record`);
44895
+ params.logger.debug(`orphan ${shownId}: already present in state.resources — dropping the stale record`);
44751
44896
  continue;
44752
44897
  }
44753
44898
  let provider;
@@ -44755,12 +44900,12 @@ async function planOrphanAdoption(params) {
44755
44900
  provider = params.getProvider(state.resourceType, state.provisionedBy);
44756
44901
  } catch (error) {
44757
44902
  outcome.remaining.push(record);
44758
- outcome.notices.push(`${logicalId} (${state.resourceType}) is still in AWS as ${state.physicalId} from an earlier rollback, but this build cannot route that type (${error instanceof Error ? error.message : String(error)}) — cdkd is not adopting it.`);
44903
+ outcome.notices.push(`${shownId} (${shownType}) is still in AWS as ${shownPhysicalId} from an earlier rollback, but this build cannot route that type (${displayAwsMessage(error instanceof Error ? error.message : String(error))}) — cdkd is not adopting it.`);
44759
44904
  continue;
44760
44905
  }
44761
44906
  if (!provider.import) {
44762
44907
  outcome.remaining.push(record);
44763
- outcome.notices.push(`${logicalId} (${state.resourceType}) was left in AWS by an earlier rollback as ${state.physicalId}, but its provider cannot verify it — cdkd is not adopting it.`);
44908
+ outcome.notices.push(`${shownId} (${shownType}) was left in AWS by an earlier rollback as ${shownPhysicalId}, but its provider cannot verify it — cdkd is not adopting it.`);
44764
44909
  continue;
44765
44910
  }
44766
44911
  let found;
@@ -44774,32 +44919,32 @@ async function planOrphanAdoption(params) {
44774
44919
  knownPhysicalId: state.physicalId
44775
44920
  });
44776
44921
  } catch (error) {
44777
- outcome.notices.push(`${logicalId} (${state.resourceType}) is recorded as left in AWS as ${state.physicalId}, but cdkd could not confirm it exists (${error instanceof Error ? error.message : String(error)}) — keeping the record and not adopting it this run.`);
44922
+ outcome.notices.push(`${shownId} (${shownType}) is recorded as left in AWS as ${shownPhysicalId}, but cdkd could not confirm it exists (${displayAwsMessage(error instanceof Error ? error.message : String(error))}) — keeping the record and not adopting it this run.`);
44778
44923
  outcome.remaining.push(record);
44779
44924
  continue;
44780
44925
  }
44781
44926
  if (found !== null && found.physicalId !== state.physicalId) {
44782
44927
  outcome.remaining.push(record);
44783
- outcome.notices.push(`${logicalId} (${state.resourceType}): cdkd asked about ${state.physicalId} and its provider answered for ${found.physicalId} — not adopting.`);
44928
+ outcome.notices.push(`${shownId} (${shownType}): cdkd asked about ${shownPhysicalId} and its provider answered for ${displaySafe(found.physicalId)} — not adopting.`);
44784
44929
  continue;
44785
44930
  }
44786
44931
  if (found === null) {
44787
- params.logger.debug(`orphan ${logicalId}: ${state.physicalId} no longer exists in AWS — dropping the record`);
44932
+ params.logger.debug(`orphan ${shownId}: ${shownPhysicalId} no longer exists in AWS — dropping the record`);
44788
44933
  continue;
44789
44934
  }
44790
44935
  if (params.nameProperties(state.resourceType).length === 0 || ADOPTION_REFUSED_TYPES.has(state.resourceType)) {
44791
44936
  outcome.remaining.push(record);
44792
44937
  const why = ADOPTION_REFUSED_TYPES.has(state.resourceType) ? "a new deploy of it mints a new resource rather than colliding, and cdkd cannot update one in place — so adopting it would end in a replacement that destroys what DeletionPolicy: Retain preserved" : "cdkd does not derive that resource's physical name, so a new deploy mints a new resource instead of colliding";
44793
- outcome.notices.push(`${logicalId} (${state.resourceType}) is still in AWS as ${state.physicalId} from an earlier rollback. cdkd does not re-adopt this type: ${why}. Delete it yourself when you no longer need it.`);
44938
+ outcome.notices.push(`${shownId} (${shownType}) is still in AWS as ${shownPhysicalId} from an earlier rollback. cdkd does not re-adopt this type: ${why}. Delete it yourself when you no longer need it.`);
44794
44939
  continue;
44795
44940
  }
44796
44941
  if (!templateStillDeclares(params.template, record, params.nameProperties(state.resourceType))) {
44797
44942
  outcome.remaining.push(record);
44798
- outcome.notices.push(`${logicalId} (${state.resourceType}) is still in AWS as ${state.physicalId} from an earlier rollback. This deploy does not create it under that name, so cdkd is leaving it alone.`);
44943
+ outcome.notices.push(`${shownId} (${shownType}) is still in AWS as ${shownPhysicalId} from an earlier rollback. This deploy does not create it under that name, so cdkd is leaving it alone.`);
44799
44944
  continue;
44800
44945
  }
44801
44946
  if ((await claims()).has(state.physicalId)) {
44802
- outcome.refusals.push(`${logicalId}: ${state.physicalId} is already recorded by another cdkd stack. cdkd will not adopt a resource another stack manages.`);
44947
+ outcome.refusals.push(`${shownId}: ${shownPhysicalId} is already recorded by another cdkd stack. cdkd will not adopt a resource another stack manages.`);
44803
44948
  outcome.remaining.push(record);
44804
44949
  continue;
44805
44950
  }
@@ -44852,7 +44997,7 @@ function makeSiblingClaimReader(params) {
44852
44997
  try {
44853
44998
  refs = await stateBackend.listStacks();
44854
44999
  } catch (error) {
44855
- logger.debug(`orphan adoption: could not list sibling stacks — ${error instanceof Error ? error.message : String(error)}`);
45000
+ logger.debug(`orphan adoption: could not list sibling stacks — ${displayAwsMessage(error instanceof Error ? error.message : String(error))}`);
44856
45001
  return claimed;
44857
45002
  }
44858
45003
  for (const ref of refs) {
@@ -44862,7 +45007,7 @@ function makeSiblingClaimReader(params) {
44862
45007
  const sibling = await stateBackend.getState(ref.stackName, ref.region);
44863
45008
  for (const record of Object.values(sibling?.state.resources ?? {})) claimed.add(record.physicalId);
44864
45009
  } catch (error) {
44865
- logger.debug(`orphan adoption: skipping unreadable state for ${ref.stackName} — ${error instanceof Error ? error.message : String(error)}`);
45010
+ logger.debug(`orphan adoption: skipping unreadable state for ${displayStackName(ref.stackName)} — ${displayAwsMessage(error instanceof Error ? error.message : String(error))}`);
44866
45011
  }
44867
45012
  }
44868
45013
  return claimed;
@@ -50785,7 +50930,7 @@ var DeployEngine = class DeployEngine {
50785
50930
  if (plan.refusals.length > 0) throw new Error(`Deploy refused — cdkd left ${plan.refusals.length} resource(s) in AWS that it cannot safely re-adopt:\n ${plan.refusals.join("\n ")}`);
50786
50931
  for (const [logicalId, record] of Object.entries(plan.adopted)) {
50787
50932
  currentState.resources[logicalId] = record;
50788
- this.logger.info(`Adopting ${logicalId} (${record.resourceType}) left in AWS by an earlier rollback as ${record.physicalId}`);
50933
+ this.logger.info(`Adopting ${displayIdent(logicalId)} (${displayIdent(record.resourceType)}) left in AWS by an earlier rollback as ${displaySafe(record.physicalId)}`);
50789
50934
  }
50790
50935
  if (records.length > 0) currentState.orphans = plan.remaining;
50791
50936
  return plan;
@@ -52252,5 +52397,5 @@ var DeployEngine = class DeployEngine {
52252
52397
  };
52253
52398
 
52254
52399
  //#endregion
52255
- export { yellow as $, NestedStackChildDirectDestroyError as $a, resolveSkipPrefix as $i, refuseMalformedOutputsForDestroy as $n, hasReadableExportSet as $r, readConfigString as $t, createPreDeleteFinalSnapshot as A, absoluteAssemblyPathEscape as Aa, describeDockerFailure as Ai, malformedExportSourceWarning as An, identityKeyFor as Ar, disableInstanceApiTermination as At, isStatefulRecreateTargetSync as B, setAwsClients as Ba, runDockerStreaming as Bi, malformedResourceEntriesWarning as Bn, redactSecretsForState as Br, isUnboundTemplateParameter as Bt, namesAnyDeclaredParameter as C, globMatches as Ca, validateAssetBucketName as Ci, displayLogicalId as Cn, __exportAll as Co, STATE_SOURCED_CROSS_GENERATION_RULES as Cr, CloudControlProvider as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, hasPlainPrototype$1 as Da, resolveDockerContextDirectory as Di, isReadableOrphanRecord as Dn, createSecretMasker as Dr, deleteIndeterminateGuards as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, hasOwnKey as Ea, buildDockerImage as Ei, hasReadableResources as En, carriesSecretMask as Er, UNSPECIFIED_SKIP_REASON as Et, extractDeploymentEventError as F, resolveBucketRegion as Fa, isDockerClientEnvKey as Fi, malformedOrphansRefusalMessage as Fn, maskSecretsInText as Fr, cfnRefValueFromPhysicalId as Ft, toCfnInteger as G, DependencyError as Ga, getDockerImageBySourceHash as Gi, refuseDivergentRecordRegionForDestroy as Gn, UNREPRODUCIBLE_LOCK_CLAUSE as Gr, normalizeAwsTagsToCfn as Gt, WARM_THROUGHPUT_MEMBERS as H, CdkdError as Ha, escapeRegExp$1 as Hi, malformedResourcesWarning as Hn, LockManager as Hr, refStateLookupFromResource as Ht, makeSiblingClaimReader as I, AwsClients as Ia, isMalformedEnvKey as Ii, malformedOrphansWarning as In, pathCrossesDottedKey as Ir, coerceParameterTypedValue as It, bold as J, IntrinsicResolutionRefusalError as Ja, getDefaultStateBucketName as Ji, refuseMalformedOrphanRecordsForDestroy as Jn, forceQuitRecoveryClause as Jr, coerceCfnBoolean as Jt, toFiniteNumber as K, DeployCancelledError as Ka, Synthesizer as Ki, refuseMalformedNestedChildOutputs as Kn, buildForceUnlockCommand as Kr, resolveExplicitPhysicalId as Kt, planOrphanAdoption as L, getAwsClients as La, partitionSensitiveEnv as Li, malformedOutputsRefusalMessage as Ln, recordMaskOnlyValue as Lr, getAccountInfo as Lt, refusesFinalSnapshot as M, renderAssemblyPathEscape as Ma, finchSecretArgvRefusal as Mi, malformedOrphanRecordsRefusalMessage as Mn, isUncertifiedBaselineMaskPosition as Mr, IntrinsicFunctionResolver as Mt, unsupportedFinalSnapshotError as N, resolveAssemblyPath as Na, formatDockerLoginError as Ni, malformedOrphanRecordsWarning as Nn, markSameGenerationBag as Nr, carriesDynamicReference as Nt, buildFinalSnapshotIdentifier as O, nullPrototypeRecord as Oa, describeDockerCapturedOutput as Oi, isReadableResourceEntry as On, dynamicReferenceTokens as Or, deleteSkipReason as Ot, makeCanonicalizePropertiesFn as P, clearBucketRegionCache as Pa, getDockerCmd as Pi, malformedOrphanRowsKeptWarning as Pn, maskSecretsInError as Pr, carriesFetchableDynamicReference as Pt, red as Q, MalformedProducerRecordRefusalError as Qa, resolveCaptureObservedState as Qi, refuseMalformedOutputs as Qn, exportNamesCarriedFrom as Qr, configStringRefusal as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, resetAwsClients as Ra, redactDockerArgvValues as Ri, malformedOutputsWarning as Rn, recordMaskOnlyValuesIn as Rr, isImpossibleEmptyStoredAttribute as Rt, computeParameterTaint as S, failedStageNote as Sa, readBootstrapMarkerBody as Si, deployRefusesOrphanRowsReason as Sn, safeStringify$1 as So, STATE_SOURCED_BASELINE_RULES as Sr, startInterruptWatch as St, resourcesNamingDeclaredParameter as T, defineOwnKey as Ta, buildDenyExternalAccessPolicy as Ti, hasReadableOutputs as Tn, TEMPLATE_SOURCED_RULES as Tr, ccProtectionRegistryTypes as Tt, coerceWarmThroughput as U, ConfigError as Ua, stripControlChars as Ui, malformedStateRefusalMessage as Un, S3StateBackend as Ur, isSettledInstanceState as Ut, renderStatefulReason as V, AssetError as Va, warnFinchArgvExposure as Vi, malformedResourcePropertiesWarning as Vn, scrubResourceRecord as Vr, parameterTypeMayLoseSecretIdentity as Vt, isWarmThroughputDecrease as W, CrossAccountSecretRefusalError as Wa, AssetManifestLoader as Wi, previewableOrphanRecords as Wn, rebuildClientForBucketRegion as Wr, WAFv2WebACLProvider as Wt, gray as X, LocalStartServiceError as Xa, resolveApp as Xi, refuseMalformedOrphansForDestroy as Xn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Xr, configBooleanRefusal as Xt, cyan as Y, LocalInvokeBuildError as Ya, getLegacyStateBucketName as Yi, refuseMalformedOrphans as Yn, formatLockExpiry as Yr, coerceCfnInteger as Yt, green as Z, LockError as Za, resolveAutoAssetStorage as Zi, refuseMalformedOrphansForOrphan as Zn, DEFAULT_STATE_PREFIX as Zr, configIntegerRefusal as Zt, bagHoldsSecretExpression as _, expectedOwnerParam as _a, assertAssetBucketRegion as _i, DiffCalculator as _n, isTransientServerError as _o, findSilentDropProperties as _r, maskerOrIdentity as _t, DeploymentEventsStore as a, ssmResolvedValueType as aa, orphansAfterRollback as ai, producerRegionsFromState as an, StackTerminationProtectionError as ao, refuseMalformedState as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, derivePartitionAndUrlSuffix as ba, isCrossRegionRedirect as bi, UNREADABLE_ORPHANS_CONTAINER_ROW as bn, retryClassificationText as bo, DagBuilder as br, interruptWatchListenerCount as bt, replayFailedOperations as c, MIGRATE_TMP_PREFIX as ca, AssetPublisher as ci, s3BucketDomainName as cn, formatError as co, repairMalformedOutputsForReadOnly as cr, IAMRoleProvider as ct, updatePartialMessage as d, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as da, buildAssetRedirectMap as di, s3BucketWebsiteUrl as dn, withErrorHandling as do, repairMalformedResourcesForReadOnly as dr, definedAttributes as dt, resolveStateBucketWithDefault as ea, hasReasonlessBaselineRefusal as ei, replayWarn as en, PartialFailureError as eo, refuseMalformedResourceAttributesForOrphan as er, collectDeclaredOutputNames as et, updatePartialReason as f, injectiveKey as fa, createAssetRedirectResolver as fi, applyRoleArnIfSet as fn, pasteableCommand as fo, safeRegion as fr, stringifyIfAssigned as ft, computeImplicitDeleteEdges as g, decodeListingKey as ga, BOOTSTRAP_MARKER_PREFIX as gi, envCredentialsAreAssumedRole as gn, isThrottlingError as go, findActionableSilentDrops as gr, maskDeep as gt, IMPLICIT_DELETE_DEPENDENCIES as h, producerRecordKey as ha, AssetModeResolver as hi, callerEnvCredentials as hn, isRetryableTransientError as ho, unreadableOrphanRecords as hr, createMaskedRetryLogger as ht, DeploymentEventsReader as i, warnDeprecatedNoPrefixCliFlag as ia, isReadableBag as ii, classifyReplaySecretRegion as in, StackHasActiveImportsError as io, refuseMalformedResourcesForDestroy as ir, secretBearing as it, isFinalSnapshotError as j, displayAssemblyPath as ja, dockerSpawnEnvWithSensitive as ji, malformedLocalOutputsWarning as jn, isSingleDynamicReferenceToken as jr, isTerminationProtectionPropagationError as jt, ccRoutedFinalSnapshotError as k, ownValue as ka, describeDockerExecFailure as ki, malformedExportNamesWarning as kn, errorCauseChain as kr, isWaitAbandonedError as kt, replayRollback as l, findLargeInlineResources as la, stringifyValue as li, s3BucketDualStackDomainName as ln, isCdkdError as lo, repairMalformedResourceEntriesForReadOnly as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, producerCoordinateKey as ma, rewriteTemplateAssetReferences as mi, applyCallerIdentityCredentials as mn, isMarkedNonRetryable as mo, unpreviewableOrphanRecords as mr, wouldReturnToSdkProvider as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, resolveUseCdkBootstrapAssets as na, importableOutputKeys as ni, requireConfigObject as nn, ResourceTimeoutError as no, refuseMalformedResourceEntriesForOrphan as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, CFN_TEMPLATE_BODY_LIMIT as oa, orphansCarriedFrom as oi, withSharedDrainBudget as on, StateError as oo, repairMalformedOrphanRecordsForReadOnly as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, injectiveKeyPrefix as pa, loadPublishableAssetManifest as pi, AWS_CREDENTIAL_ENV_KEYS as pn, shellQuote as po, safeStackName as pr, ProviderRegistry as pt, formatResourceLine as q, DynamicReferenceRegionAmbiguousError as qa, synthesisStatusMessage as qi, refuseMalformedOrphanRecords as qn, buildLockContentionMessage as qr, assertRegionMatch as qt, DeployEngine as r, stateBucketExistenceConfirmed as ra, importableOutputs as ri, requireConfigString as rn, ResourceUpdateNotSupportedError as ro, refuseMalformedResourcePropertiesForOrphan as rr, isExportAliasCollision as rt, planRollback as s, CFN_TEMPLATE_URL_LIMIT as sa, shouldRetainResource as si, s3BucketArn as sn, SynthesisError as so, repairMalformedOrphansForReadOnly as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, resolveStateBucketWithDefaultAndSource as ta, hasUnverifiableParameterRefusal as ti, requireConfigArray as tn, ProvisioningError as to, refuseMalformedResourceEntries as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, uploadCfnTemplate as ua, WorkGraph as ui, s3BucketRegionalDomainName as un, normalizeAwsError as uo, repairMalformedResourcePropertiesForReadOnly as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, PARTITION_TABLE as va, ensureAssetStorage as vi, INTRINSIC_KEYS as vn, markNonRetryable as vo, describeTypeWithThrottleRetry as vr, beginCommandInterruptScope as vt, reachableDivergentParameters as w, processStackMessages as wa, validateContainerRepoName as wi, hasReadableOrphans as wn, STATE_SOURCED_READBACK_RULES as wr, slowCcOperationTimeoutMs as wt, bindingSkippedOutputs as x, AssemblyReader as xa, parseBootstrapMarker as xi, UNREADABLE_RESOURCES_MAP_ROW as xn, describeAwsFailure as xo, TemplateParser as xr, isInterruptedWaitError as xt, keptWholeReasonText as y, canonicalizeRegion as ya, getBootstrapMarkerKey as yi, STATE_RESOURCES_MALFORMED as yn, markRedactedCause as yo, withRetry as yr, endCommandInterruptScope as yt, isStatefulRecreateTargetForReplace as z, runWithStackAwsClients as za, runDockerForeground as zi, malformedRenderedContainersWarning as zn, recoverMaskedOutput as zr, isNamelessDynamicReferenceError as zt };
52256
- //# sourceMappingURL=deploy-engine-BwDlgFRs.js.map
52400
+ export { yellow as $, MalformedProducerRecordRefusalError as $a, resolveSkipPrefix as $i, refuseMalformedOutputsForDestroy as $n, hasReadableExportSet as $r, readConfigString as $t, createPreDeleteFinalSnapshot as A, ownValue as Aa, describeDockerFailure as Ai, malformedExportSourceWarning as An, identityKeyFor as Ar, disableInstanceApiTermination as At, isStatefulRecreateTargetSync as B, runWithStackAwsClients as Ba, runDockerStreaming as Bi, malformedResourceEntriesWarning as Bn, redactSecretsForState as Br, isUnboundTemplateParameter as Bt, namesAnyDeclaredParameter as C, failedStageNote as Ca, validateAssetBucketName as Ci, displayLogicalId as Cn, safeStringify$1 as Co, STATE_SOURCED_CROSS_GENERATION_RULES as Cr, CloudControlProvider as Ct, PRE_DELETE_SNAPSHOT_TYPES as D, hasOwnKey as Da, resolveDockerContextDirectory as Di, isReadableOrphanRecord as Dn, createSecretMasker as Dr, deleteIndeterminateGuards as Dt, ATOMIC_FINAL_SNAPSHOT_TYPES as E, defineOwnKey as Ea, buildDockerImage as Ei, hasReadableResources as En, carriesSecretMask as Er, UNSPECIFIED_SKIP_REASON as Et, extractDeploymentEventError as F, clearBucketRegionCache as Fa, isDockerClientEnvKey as Fi, malformedOrphansRefusalMessage as Fn, maskSecretsInText as Fr, cfnRefValueFromPhysicalId as Ft, toCfnInteger as G, CrossAccountSecretRefusalError as Ga, getDockerImageBySourceHash as Gi, refuseDivergentRecordRegionForDestroy as Gn, UNREPRODUCIBLE_LOCK_CLAUSE as Gr, normalizeAwsTagsToCfn as Gt, WARM_THROUGHPUT_MEMBERS as H, AssetError as Ha, escapeRegExp$1 as Hi, malformedResourcesWarning as Hn, LockManager as Hr, refStateLookupFromResource as Ht, makeSiblingClaimReader as I, resolveBucketRegion as Ia, isMalformedEnvKey as Ii, malformedOrphansWarning as In, pathCrossesDottedKey as Ir, coerceParameterTypedValue as It, bold as J, DynamicReferenceRegionAmbiguousError as Ja, getDefaultStateBucketName as Ji, refuseMalformedOrphanRecordsForDestroy as Jn, forceQuitRecoveryClause as Jr, coerceCfnBoolean as Jt, toFiniteNumber as K, DependencyError as Ka, Synthesizer as Ki, refuseMalformedNestedChildOutputs as Kn, buildForceUnlockCommand as Kr, resolveExplicitPhysicalId as Kt, planOrphanAdoption as L, AwsClients as La, partitionSensitiveEnv as Li, malformedOutputsRefusalMessage as Ln, recordMaskOnlyValue as Lr, getAccountInfo as Lt, refusesFinalSnapshot as M, displayAssemblyPath as Ma, finchSecretArgvRefusal as Mi, malformedOrphanRecordsRefusalMessage as Mn, isUncertifiedBaselineMaskPosition as Mr, IntrinsicFunctionResolver as Mt, unsupportedFinalSnapshotError as N, renderAssemblyPathEscape as Na, formatDockerLoginError as Ni, malformedOrphanRecordsWarning as Nn, markSameGenerationBag as Nr, carriesDynamicReference as Nt, buildFinalSnapshotIdentifier as O, hasPlainPrototype$1 as Oa, describeDockerCapturedOutput as Oi, isReadableResourceEntry as On, dynamicReferenceTokens as Or, deleteSkipReason as Ot, makeCanonicalizePropertiesFn as P, resolveAssemblyPath as Pa, getDockerCmd as Pi, malformedOrphanRowsKeptWarning as Pn, maskSecretsInError as Pr, carriesFetchableDynamicReference as Pt, red as Q, LockError as Qa, resolveCaptureObservedState as Qi, refuseMalformedOutputs as Qn, exportNamesCarriedFrom as Qr, configStringRefusal as Qt, MULTI_REGION_RECREATE_BLOCKED_TYPES as R, getAwsClients as Ra, redactDockerArgvValues as Ri, malformedOutputsWarning as Rn, recordMaskOnlyValuesIn as Rr, isImpossibleEmptyStoredAttribute as Rt, computeParameterTaint as S, AssemblyReader as Sa, readBootstrapMarkerBody as Si, deployRefusesOrphanRowsReason as Sn, describeAwsFailure as So, STATE_SOURCED_BASELINE_RULES as Sr, startInterruptWatch as St, resourcesNamingDeclaredParameter as T, processStackMessages as Ta, buildDenyExternalAccessPolicy as Ti, hasReadableOutputs as Tn, TEMPLATE_SOURCED_RULES as Tr, ccProtectionRegistryTypes as Tt, coerceWarmThroughput as U, CdkdError as Ua, stripControlChars as Ui, malformedStateRefusalMessage as Un, S3StateBackend as Ur, isSettledInstanceState as Ut, renderStatefulReason as V, setAwsClients as Va, warnFinchArgvExposure as Vi, malformedResourcePropertiesWarning as Vn, scrubResourceRecord as Vr, parameterTypeMayLoseSecretIdentity as Vt, isWarmThroughputDecrease as W, ConfigError as Wa, AssetManifestLoader as Wi, previewableOrphanRecords as Wn, rebuildClientForBucketRegion as Wr, WAFv2WebACLProvider as Wt, gray as X, LocalInvokeBuildError as Xa, resolveApp as Xi, refuseMalformedOrphansForDestroy as Xn, CUSTOM_RESOURCE_RESPONSE_PREFIX as Xr, configBooleanRefusal as Xt, cyan as Y, IntrinsicResolutionRefusalError as Ya, getLegacyStateBucketName as Yi, refuseMalformedOrphans as Yn, formatLockExpiry as Yr, coerceCfnInteger as Yt, green as Z, LocalStartServiceError as Za, resolveAutoAssetStorage as Zi, refuseMalformedOrphansForOrphan as Zn, DEFAULT_STATE_PREFIX as Zr, configIntegerRefusal as Zt, bagHoldsSecretExpression as _, expectedOwnerParam as _a, assertAssetBucketRegion as _i, DiffCalculator as _n, isThrottlingError as _o, findSilentDropProperties as _r, maskerOrIdentity as _t, DeploymentEventsStore as a, ssmResolvedValueType as aa, orphansAfterRollback as ai, producerRegionsFromState as an, StackHasActiveImportsError as ao, refuseMalformedState as ar, secretBearingStateKeyWarning as at, mergeNoChangeOutputs as b, derivePartitionAndUrlSuffix as ba, isCrossRegionRedirect as bi, UNREADABLE_ORPHANS_CONTAINER_ROW as bn, markRedactedCause as bo, DagBuilder as br, interruptWatchListenerCount as bt, replayFailedOperations as c, MIGRATE_TMP_PREFIX as ca, AssetPublisher as ci, s3BucketDomainName as cn, SynthesisError as co, repairMalformedOutputsForReadOnly as cr, IAMRoleProvider as ct, updatePartialMessage as d, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as da, buildAssetRedirectMap as di, s3BucketWebsiteUrl as dn, normalizeAwsError as do, repairMalformedResourcesForReadOnly as dr, definedAttributes as dt, resolveStateBucketWithDefault as ea, hasReasonlessBaselineRefusal as ei, replayWarn as en, NestedStackChildDirectDestroyError as eo, refuseMalformedResourceAttributesForOrphan as er, collectDeclaredOutputNames as et, updatePartialReason as f, injectiveKey as fa, createAssetRedirectResolver as fi, applyRoleArnIfSet as fn, withErrorHandling as fo, safeRegion as fr, stringifyIfAssigned as ft, computeImplicitDeleteEdges as g, decodeListingKey as ga, BOOTSTRAP_MARKER_PREFIX as gi, envCredentialsAreAssumedRole as gn, isRetryableTransientError as go, findActionableSilentDrops as gr, maskDeep as gt, IMPLICIT_DELETE_DEPENDENCIES as h, producerRecordKey as ha, AssetModeResolver as hi, callerEnvCredentials as hn, isMarkedNonRetryable as ho, unreadableOrphanRecords as hr, createMaskedRetryLogger as ht, DeploymentEventsReader as i, warnDeprecatedNoPrefixCliFlag as ia, isReadableBag as ii, classifyReplaySecretRegion as in, ResourceUpdateNotSupportedError as io, refuseMalformedResourcesForDestroy as ir, secretBearing as it, isFinalSnapshotError as j, absoluteAssemblyPathEscape as ja, dockerSpawnEnvWithSensitive as ji, malformedLocalOutputsWarning as jn, isSingleDynamicReferenceToken as jr, isTerminationProtectionPropagationError as jt, ccRoutedFinalSnapshotError as k, nullPrototypeRecord as ka, describeDockerExecFailure as ki, malformedExportNamesWarning as kn, errorCauseChain as kr, isWaitAbandonedError as kt, replayRollback as l, findLargeInlineResources as la, stringifyValue as li, s3BucketDualStackDomainName as ln, formatError as lo, repairMalformedResourceEntriesForReadOnly as lr, collectInlinePolicyNamesManagedBySiblings as lt, maskingRetryLogger as m, producerCoordinateKey as ma, rewriteTemplateAssetReferences as mi, applyCallerIdentityCredentials as mn, shellQuote as mo, unpreviewableOrphanRecords as mr, wouldReturnToSdkProvider as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, resolveUseCdkBootstrapAssets as na, importableOutputKeys as ni, requireConfigObject as nn, ProvisioningError as no, refuseMalformedResourceEntriesForOrphan as nr, exportAliasCollisionScrubWarning as nt, planFailedOps as o, CFN_TEMPLATE_BODY_LIMIT as oa, orphansCarriedFrom as oi, withSharedDrainBudget as on, StackTerminationProtectionError as oo, repairMalformedOrphanRecordsForReadOnly as or, secretSafeKeyDisplay as ot, withResourceDeadline as p, injectiveKeyPrefix as pa, loadPublishableAssetManifest as pi, AWS_CREDENTIAL_ENV_KEYS as pn, pasteableCommand as po, safeStackName as pr, ProviderRegistry as pt, formatResourceLine as q, DeployCancelledError as qa, synthesisStatusMessage as qi, refuseMalformedOrphanRecords as qn, buildLockContentionMessage as qr, assertRegionMatch as qt, DeployEngine as r, stateBucketExistenceConfirmed as ra, importableOutputs as ri, requireConfigString as rn, ResourceTimeoutError as ro, refuseMalformedResourcePropertiesForOrphan as rr, isExportAliasCollision as rt, planRollback as s, CFN_TEMPLATE_URL_LIMIT as sa, shouldRetainResource as si, s3BucketArn as sn, StateError as so, repairMalformedOrphansForReadOnly as sr, getCurrentResourceSecrets as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, resolveStateBucketWithDefaultAndSource as ta, hasUnverifiableParameterRefusal as ti, requireConfigArray as tn, PartialFailureError as to, refuseMalformedResourceEntries as tr, collectPublishedOutputNames as tt, resolveReplacementOldType as u, uploadCfnTemplate as ua, WorkGraph as ui, s3BucketRegionalDomainName as un, isCdkdError as uo, repairMalformedResourcePropertiesForReadOnly as ur, clearOnUpdateRemoval as ut, isSecretBearingReferenceString as v, PARTITION_TABLE as va, ensureAssetStorage as vi, INTRINSIC_KEYS as vn, isTransientServerError as vo, describeTypeWithThrottleRetry as vr, beginCommandInterruptScope as vt, reachableDivergentParameters as w, globMatches as wa, validateContainerRepoName as wi, hasReadableOrphans as wn, __exportAll as wo, STATE_SOURCED_READBACK_RULES as wr, slowCcOperationTimeoutMs as wt, bindingSkippedOutputs as x, ambientClientDefaults as xa, parseBootstrapMarker as xi, UNREADABLE_RESOURCES_MAP_ROW as xn, retryClassificationText as xo, TemplateParser as xr, isInterruptedWaitError as xt, keptWholeReasonText as y, canonicalizeRegion as ya, getBootstrapMarkerKey as yi, STATE_RESOURCES_MALFORMED as yn, markNonRetryable as yo, withRetry as yr, endCommandInterruptScope as yt, isStatefulRecreateTargetForReplace as z, resetAwsClients as za, runDockerForeground as zi, malformedRenderedContainersWarning as zn, recoverMaskedOutput as zr, isNamelessDynamicReferenceError as zt };
52401
+ //# sourceMappingURL=deploy-engine-OgrMdBRR.js.map