@go-to-k/cdkd 0.256.0 → 0.257.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as BOOTSTRAP_MARKER_PREFIX, A as refStateLookupFromResource, At as AssemblyReader, B as TemplateParser, C as ProviderRegistry, Ct as warnDeprecatedNoPrefixCliFlag, D as isTerminationProtectionPropagationError, Dt as findLargeInlineResources, E as disableInstanceApiTermination, Et as MIGRATE_TMP_PREFIX, F as resolveExplicitPhysicalId, Ft as resetAwsClients, G as AssetPublisher, Gt as MissingCdkCliError, H as S3StateBackend, Ht as LocalMigrateError, I as assertRegionMatch, It as setAwsClients, J as buildAssetRedirectMap, Jt as ProvisioningError, K as stringifyValue, Kt as NestedStackChildDirectDestroyError, L as applyRoleArnIfSet, M as CDK_PATH_TAG, Mt as resolveBucketRegion, N as matchesCdkPath, Nt as AwsClients, O as IntrinsicFunctionResolver, Ot as uploadCfnTemplate, P as normalizeAwsTagsToCfn, Pt as getAwsClients, Q as AssetModeResolver, Qt as StackTerminationProtectionError, R as DiffCalculator, Rt as CdkdError, S as isRetryableTransientError, St as resolveUseCdkBootstrapAssets, T as CloudControlProvider, Tt as CFN_TEMPLATE_URL_LIMIT, U as rebuildClientForBucketRegion, Ut as LocalStartServiceError, V as LockManager, Vt as LocalInvokeBuildError$1, W as shouldRetainResource, X as loadPublishableAssetManifest, Xt as ResourceUpdateNotSupportedError, Y as createAssetRedirectResolver, Yt as ResourceTimeoutError, Z as rewriteTemplateAssetReferences, Zt as StackHasActiveImportsError, _ as yellow, _t as resolveAutoAssetStorage, a as IMPLICIT_DELETE_DEPENDENCIES, at as buildDockerImage, b as importTagWalk, bt as resolveStateBucketWithDefault, c as MULTI_REGION_RECREATE_BLOCKED_TYPES, ct as runDockerForeground, d as formatResourceLine, dt as getDockerImageBySourceHash, et as ensureAssetStorage, f as bold, ft as Synthesizer, g as red, gt as resolveApp, h as green, ht as getLegacyStateBucketName, i as withResourceDeadline, in as withErrorHandling, it as validateContainerRepoName, j as WAFv2WebACLProvider, k as cfnRefValueFromPhysicalId, kt as expectedOwnerParam, l as isStatefulRecreateTargetSync, lt as runDockerStreaming, m as gray, mt as getDefaultStateBucketName, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as parseBootstrapMarker, o as computeImplicitDeleteEdges, ot as formatDockerLoginError, p as cyan, pt as synthesisStatusMessage, q as WorkGraph, qt as PartialFailureError, r as DeployEngine, rn as normalizeAwsError, rt as validateAssetBucketName, s as extractDeploymentEventError, st as getDockerCmd, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as getBootstrapMarkerKey, u as renderStatefulReason, ut as AssetManifestLoader, v as IAMRoleProvider, vt as resolveCaptureObservedState, w as findActionableSilentDrops, wt as CFN_TEMPLATE_BODY_LIMIT, x as withRetry, xt as resolveStateBucketWithDefaultAndSource, y as collectInlinePolicyNamesManagedBySiblings, yt as resolveSkipPrefix, z as DagBuilder } from "./deploy-engine-vUgwldVH.js";
2
+ import { $ as BOOTSTRAP_MARKER_PREFIX, A as withRetry, At as AssemblyReader, B as TemplateParser, C as disableInstanceApiTermination, Ct as warnDeprecatedNoPrefixCliFlag, D as refStateLookupFromResource, Dt as findLargeInlineResources, E as cfnRefValueFromPhysicalId, Et as MIGRATE_TMP_PREFIX, F as resolveExplicitPhysicalId, Ft as resetAwsClients, G as AssetPublisher, Gt as MissingCdkCliError, H as S3StateBackend, Ht as LocalMigrateError, I as assertRegionMatch, It as setAwsClients, J as buildAssetRedirectMap, Jt as ProvisioningError, K as stringifyValue, Kt as NestedStackChildDirectDestroyError, L as applyRoleArnIfSet, M as CDK_PATH_TAG, Mt as resolveBucketRegion, N as matchesCdkPath, Nt as AwsClients, O as WAFv2WebACLProvider, Ot as uploadCfnTemplate, P as normalizeAwsTagsToCfn, Pt as getAwsClients, Q as AssetModeResolver, Qt as StackTerminationProtectionError, R as DiffCalculator, Rt as CdkdError, S as CloudControlProvider, St as resolveUseCdkBootstrapAssets, T as IntrinsicFunctionResolver, Tt as CFN_TEMPLATE_URL_LIMIT, U as rebuildClientForBucketRegion, Ut as LocalStartServiceError, V as LockManager, Vt as LocalInvokeBuildError$1, W as shouldRetainResource, X as loadPublishableAssetManifest, Xt as ResourceUpdateNotSupportedError, Y as createAssetRedirectResolver, Yt as ResourceTimeoutError, Z as rewriteTemplateAssetReferences, Zt as StackHasActiveImportsError, _ as yellow, _t as resolveAutoAssetStorage, a as IMPLICIT_DELETE_DEPENDENCIES, at as buildDockerImage, b as ProviderRegistry, bt as resolveStateBucketWithDefault, c as MULTI_REGION_RECREATE_BLOCKED_TYPES, ct as runDockerForeground, d as formatResourceLine, dt as getDockerImageBySourceHash, et as ensureAssetStorage, f as bold, ft as Synthesizer, g as red, gt as resolveApp, h as green, ht as getLegacyStateBucketName, i as withResourceDeadline, in as withErrorHandling, it as validateContainerRepoName, j as isRetryableTransientError, k as importTagWalk, kt as expectedOwnerParam, l as isStatefulRecreateTargetSync, lt as runDockerStreaming, m as gray, mt as getDefaultStateBucketName, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as parseBootstrapMarker, o as computeImplicitDeleteEdges, ot as formatDockerLoginError, p as cyan, pt as synthesisStatusMessage, q as WorkGraph, qt as PartialFailureError, r as DeployEngine, rn as normalizeAwsError, rt as validateAssetBucketName, s as extractDeploymentEventError, st as getDockerCmd, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as getBootstrapMarkerKey, u as renderStatefulReason, ut as AssetManifestLoader, v as IAMRoleProvider, vt as resolveCaptureObservedState, w as isTerminationProtectionPropagationError, wt as CFN_TEMPLATE_BODY_LIMIT, x as findActionableSilentDrops, xt as resolveStateBucketWithDefaultAndSource, y as collectInlinePolicyNamesManagedBySiblings, yt as resolveSkipPrefix, z as DagBuilder } from "./deploy-engine-DOPBIRKR.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
4
- import { t as ASGProvider } from "./asg-provider-DbIC4hWG.js";
4
+ import { t as ASGProvider } from "./asg-provider-6IZKZOKp.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListBucketsCommand, ListDirectoryBucketsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -1899,7 +1899,7 @@ const FLUSH_INTERVAL_MS = 2e3;
1899
1899
  const FLUSH_EVENT_THRESHOLD = 50;
1900
1900
  /** Build-time cdkd version, with a dev fallback for non-built contexts. */
1901
1901
  function getCdkdVersion() {
1902
- return "0.256.0";
1902
+ return "0.257.0";
1903
1903
  }
1904
1904
  /**
1905
1905
  * Generate a time-sortable unique run id, e.g.
@@ -12698,24 +12698,33 @@ var DynamoDBGlobalTableProvider = class {
12698
12698
  if (err instanceof ResourceNotFoundException$1) return null;
12699
12699
  throw err;
12700
12700
  }
12701
- if (!input.cdkPath) return null;
12702
- let exclusiveStartTableName;
12703
- do {
12704
- const list = await this.dynamoDBClient.send(new ListTablesCommand({ ...exclusiveStartTableName && { ExclusiveStartTableName: exclusiveStartTableName } }));
12705
- for (const name of list.TableNames ?? []) try {
12706
- const arn = (await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: name }))).Table?.TableArn;
12707
- if (!arn) continue;
12708
- if (matchesCdkPath((await this.dynamoDBClient.send(new ListTagsOfResourceCommand({ ResourceArn: arn }))).Tags, input.cdkPath)) return {
12709
- physicalId: name,
12710
- attributes: {}
12701
+ const match = await importTagWalk({
12702
+ cdkPath: input.cdkPath,
12703
+ logicalId: input.logicalId,
12704
+ listPage: async (marker) => {
12705
+ const list = await this.dynamoDBClient.send(new ListTablesCommand({ ...marker && { ExclusiveStartTableName: marker } }));
12706
+ return {
12707
+ items: list.TableNames,
12708
+ nextMarker: list.LastEvaluatedTableName
12711
12709
  };
12712
- } catch (err) {
12713
- if (err instanceof ResourceNotFoundException$1) continue;
12714
- throw err;
12715
- }
12716
- exclusiveStartTableName = list.LastEvaluatedTableName;
12717
- } while (exclusiveStartTableName);
12718
- return null;
12710
+ },
12711
+ describe: async (name) => {
12712
+ try {
12713
+ const arn = (await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: name }))).Table?.TableArn;
12714
+ if (!arn) return void 0;
12715
+ return await this.dynamoDBClient.send(new ListTagsOfResourceCommand({ ResourceArn: arn }));
12716
+ } catch (err) {
12717
+ if (err instanceof ResourceNotFoundException$1) return void 0;
12718
+ throw err;
12719
+ }
12720
+ },
12721
+ tagsOf: (tagsResp) => tagsResp.Tags
12722
+ });
12723
+ if (!match) return null;
12724
+ return {
12725
+ physicalId: match.summary,
12726
+ attributes: {}
12727
+ };
12719
12728
  }
12720
12729
  async waitForTableActive(tableName, logicalId, maxAttempts = 120) {
12721
12730
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
@@ -14579,23 +14588,30 @@ var EventBridgeRuleProvider = class {
14579
14588
  if (err instanceof ResourceNotFoundException$2) return null;
14580
14589
  throw err;
14581
14590
  }
14582
- if (!input.cdkPath) return null;
14583
- let nextToken;
14584
- do {
14585
- const list = await this.eventBridgeClient.send(new ListRulesCommand({
14586
- ...eventBusName && { EventBusName: eventBusName },
14587
- ...nextToken && { NextToken: nextToken }
14588
- }));
14589
- for (const rule of list.Rules ?? []) {
14590
- if (!rule.Arn) continue;
14591
- if (matchesCdkPath((await this.eventBridgeClient.send(new ListTagsForResourceCommand$1({ ResourceARN: rule.Arn }))).Tags, input.cdkPath)) return {
14592
- physicalId: rule.Arn,
14593
- attributes: {}
14591
+ const match = await importTagWalk({
14592
+ cdkPath: input.cdkPath,
14593
+ logicalId: input.logicalId,
14594
+ listPage: async (marker) => {
14595
+ const list = await this.eventBridgeClient.send(new ListRulesCommand({
14596
+ ...eventBusName && { EventBusName: eventBusName },
14597
+ ...marker && { NextToken: marker }
14598
+ }));
14599
+ return {
14600
+ items: list.Rules,
14601
+ nextMarker: list.NextToken
14594
14602
  };
14595
- }
14596
- nextToken = list.NextToken;
14597
- } while (nextToken);
14598
- return null;
14603
+ },
14604
+ describe: async (rule) => {
14605
+ if (!rule.Arn) return void 0;
14606
+ return await this.eventBridgeClient.send(new ListTagsForResourceCommand$1({ ResourceARN: rule.Arn }));
14607
+ },
14608
+ tagsOf: (tagsResp) => tagsResp.Tags
14609
+ });
14610
+ if (!match) return null;
14611
+ return {
14612
+ physicalId: match.summary.Arn,
14613
+ attributes: {}
14614
+ };
14599
14615
  }
14600
14616
  /**
14601
14617
  * Extract rule name from an ARN
@@ -14880,25 +14896,32 @@ var EventBridgeBusProvider = class {
14880
14896
  if (err instanceof ResourceNotFoundException$2) return null;
14881
14897
  throw err;
14882
14898
  }
14883
- if (!input.cdkPath) return null;
14884
- let nextToken;
14885
- do {
14886
- const list = await this.eventBridgeClient.send(new ListEventBusesCommand({ ...nextToken && { NextToken: nextToken } }));
14887
- for (const bus of list.EventBuses ?? []) {
14888
- if (!bus.Name || !bus.Arn) continue;
14899
+ const match = await importTagWalk({
14900
+ cdkPath: input.cdkPath,
14901
+ logicalId: input.logicalId,
14902
+ listPage: async (marker) => {
14903
+ const list = await this.eventBridgeClient.send(new ListEventBusesCommand({ ...marker && { NextToken: marker } }));
14904
+ return {
14905
+ items: list.EventBuses,
14906
+ nextMarker: list.NextToken
14907
+ };
14908
+ },
14909
+ describe: async (bus) => {
14910
+ if (!bus.Name || !bus.Arn) return void 0;
14889
14911
  try {
14890
- if (matchesCdkPath((await this.eventBridgeClient.send(new ListTagsForResourceCommand$1({ ResourceARN: bus.Arn }))).Tags, input.cdkPath)) return {
14891
- physicalId: bus.Name,
14892
- attributes: {}
14893
- };
14912
+ return await this.eventBridgeClient.send(new ListTagsForResourceCommand$1({ ResourceARN: bus.Arn }));
14894
14913
  } catch (err) {
14895
- if (err instanceof ResourceNotFoundException$2) continue;
14914
+ if (err instanceof ResourceNotFoundException$2) return void 0;
14896
14915
  throw err;
14897
14916
  }
14898
- }
14899
- nextToken = list.NextToken;
14900
- } while (nextToken);
14901
- return null;
14917
+ },
14918
+ tagsOf: (tagsResp) => tagsResp.Tags
14919
+ });
14920
+ if (!match) return null;
14921
+ return {
14922
+ physicalId: match.summary.Name,
14923
+ attributes: {}
14924
+ };
14902
14925
  }
14903
14926
  };
14904
14927
 
@@ -20449,25 +20472,32 @@ var CloudFrontDistributionProvider = class {
20449
20472
  if (err instanceof NoSuchDistribution) return null;
20450
20473
  throw err;
20451
20474
  }
20452
- if (!input.cdkPath) return null;
20453
- let marker;
20454
- do {
20455
- const list = await this.cloudFrontClient.send(new ListDistributionsCommand({ ...marker && { Marker: marker } }));
20456
- for (const d of list.DistributionList?.Items ?? []) {
20457
- if (!d.Id || !d.ARN) continue;
20475
+ const match = await importTagWalk({
20476
+ cdkPath: input.cdkPath,
20477
+ logicalId: input.logicalId,
20478
+ listPage: async (marker) => {
20479
+ const list = await this.cloudFrontClient.send(new ListDistributionsCommand({ ...marker && { Marker: marker } }));
20480
+ return {
20481
+ items: list.DistributionList?.Items,
20482
+ nextMarker: list.DistributionList?.IsTruncated ? list.DistributionList?.NextMarker : void 0
20483
+ };
20484
+ },
20485
+ describe: async (d) => {
20486
+ if (!d.Id || !d.ARN) return void 0;
20458
20487
  try {
20459
- if (matchesCdkPath((await this.cloudFrontClient.send(new ListTagsForResourceCommand$3({ Resource: d.ARN }))).Tags?.Items, input.cdkPath)) return {
20460
- physicalId: d.Id,
20461
- attributes: {}
20462
- };
20488
+ return await this.cloudFrontClient.send(new ListTagsForResourceCommand$3({ Resource: d.ARN }));
20463
20489
  } catch (err) {
20464
- if (err instanceof NoSuchDistribution) continue;
20490
+ if (err instanceof NoSuchDistribution) return void 0;
20465
20491
  throw err;
20466
20492
  }
20467
- }
20468
- marker = list.DistributionList?.IsTruncated ? list.DistributionList?.NextMarker : void 0;
20469
- } while (marker);
20470
- return null;
20493
+ },
20494
+ tagsOf: (tagsResp) => tagsResp.Tags?.Items
20495
+ });
20496
+ if (!match) return null;
20497
+ return {
20498
+ physicalId: match.summary.Id,
20499
+ attributes: {}
20500
+ };
20471
20501
  }
20472
20502
  };
20473
20503
 
@@ -21468,10 +21498,10 @@ var StepFunctionsProvider = class {
21468
21498
  *
21469
21499
  * Lookup order:
21470
21500
  * 1. `--resource <id>=<arn>` override → verify with `DescribeStateMachine`.
21471
- * 2. Walk `ListStateMachines` paginator → `ListTagsForResource(arn)`,
21472
- * match the lowercase `key`/`value` `aws:cdk:path` tag (SFN uses
21473
- * lowercase tags, so `matchesCdkPath` from import-helpers does not
21474
- * apply directly).
21501
+ * 2. Walk `ListStateMachines` → `ListTagsForResource(arn)` via the shared
21502
+ * `importTagWalk` helper. SFN returns lowercase `key`/`value` tags, so
21503
+ * `tagsOf` maps them to the `Key`/`Value` shape the walk's
21504
+ * `aws:cdk:path` matcher expects.
21475
21505
  *
21476
21506
  * SFN state machines do not expose a template-supplied name field
21477
21507
  * usable as a stable physicalId — the physicalId is the ARN — so the
@@ -21489,21 +21519,30 @@ var StepFunctionsProvider = class {
21489
21519
  if (err instanceof StateMachineDoesNotExist) return null;
21490
21520
  throw err;
21491
21521
  }
21492
- if (!input.cdkPath) return null;
21493
- let nextToken;
21494
- do {
21495
- const list = await this.getClient().send(new ListStateMachinesCommand({ ...nextToken && { nextToken } }));
21496
- for (const sm of list.stateMachines ?? []) {
21497
- if (!sm.stateMachineArn) continue;
21498
- const tagsResp = await this.getClient().send(new ListTagsForResourceCommand$11({ resourceArn: sm.stateMachineArn }));
21499
- if (this.tagsMatchCdkPath(tagsResp.tags, input.cdkPath)) return {
21500
- physicalId: sm.stateMachineArn,
21501
- attributes: {}
21522
+ const match = await importTagWalk({
21523
+ cdkPath: input.cdkPath,
21524
+ logicalId: input.logicalId,
21525
+ listPage: async (marker) => {
21526
+ const list = await this.getClient().send(new ListStateMachinesCommand({ ...marker && { nextToken: marker } }));
21527
+ return {
21528
+ items: list.stateMachines,
21529
+ nextMarker: list.nextToken
21502
21530
  };
21503
- }
21504
- nextToken = list.nextToken;
21505
- } while (nextToken);
21506
- return null;
21531
+ },
21532
+ describe: async (sm) => {
21533
+ if (!sm.stateMachineArn) return void 0;
21534
+ return await this.getClient().send(new ListTagsForResourceCommand$11({ resourceArn: sm.stateMachineArn }));
21535
+ },
21536
+ tagsOf: (tagsResp) => (tagsResp.tags ?? []).map((t) => ({
21537
+ Key: t.key,
21538
+ Value: t.value
21539
+ }))
21540
+ });
21541
+ if (!match) return null;
21542
+ return {
21543
+ physicalId: match.summary.stateMachineArn,
21544
+ attributes: {}
21545
+ };
21507
21546
  }
21508
21547
  /**
21509
21548
  * Apply a diff between old and new CFn-shape Tags arrays via SFN's
@@ -21541,14 +21580,6 @@ var StepFunctionsProvider = class {
21541
21580
  }
21542
21581
  }
21543
21582
  /**
21544
- * Match SFN's lowercase `key`/`value` tag shape against the CDK path.
21545
- */
21546
- tagsMatchCdkPath(tags, cdkPath) {
21547
- if (!tags) return false;
21548
- for (const t of tags) if (t.key === "aws:cdk:path" && t.value === cdkPath) return true;
21549
- return false;
21550
- }
21551
- /**
21552
21583
  * Build the state-machine definition string from CDK properties.
21553
21584
  *
21554
21585
  * Precedence (mirrors CloudFormation): an inline `DefinitionString` /
@@ -27959,6 +27990,16 @@ var CognitoUserPoolProvider = class {
27959
27990
  * 3. `aws:cdk:path` tag match via `ListUserPools` +
27960
27991
  * `ListTagsForResource(<arn>)`. Cognito's tag map uses the same
27961
27992
  * `Tags: { [key]: value }` shape as Lambda.
27993
+ *
27994
+ * Steps 2 and 3 share ONE `ListUserPools` walk (per candidate: name check
27995
+ * first, then the two tag reads, only when a `cdkPath` is present), which
27996
+ * runs through the shared `importTagWalk` helper so the N+1 read burst
27997
+ * (DescribeUserPool for the ARN, then ListTagsForResource) is retried with
27998
+ * exponential backoff when AWS throttles it instead of aborting the whole
27999
+ * import. The name match is expressed to the walk as a synthetic
28000
+ * `aws:cdk:path` tag carrying the walk's own lookup key, so a name-only
28001
+ * template (no CDK path metadata) still resolves without any per-candidate
28002
+ * API call, matching the previous inline loop.
27962
28003
  */
27963
28004
  async import(input) {
27964
28005
  if (input.knownPhysicalId) try {
@@ -27972,33 +28013,48 @@ var CognitoUserPoolProvider = class {
27972
28013
  throw err;
27973
28014
  }
27974
28015
  const desiredName = typeof input.properties?.["UserPoolName"] === "string" ? input.properties["UserPoolName"] : void 0;
27975
- let nextToken;
27976
- do {
27977
- const list = await this.getClient().send(new ListUserPoolsCommand({
27978
- MaxResults: 60,
27979
- ...nextToken && { NextToken: nextToken }
27980
- }));
27981
- for (const pool of list.UserPools ?? []) {
27982
- if (!pool.Id) continue;
27983
- if (desiredName && pool.Name === desiredName) return {
27984
- physicalId: pool.Id,
27985
- attributes: {}
28016
+ const walkCdkPath = input.cdkPath || (desiredName ? `cdkd:cognito-user-pool-name:${desiredName}` : void 0);
28017
+ /** Sentinel detail for a candidate matched by its user pool name. */
28018
+ const NAME_MATCH = { nameMatch: true };
28019
+ const match = await importTagWalk({
28020
+ cdkPath: walkCdkPath,
28021
+ logicalId: input.logicalId,
28022
+ listPage: async (marker) => {
28023
+ const list = await this.getClient().send(new ListUserPoolsCommand({
28024
+ MaxResults: 60,
28025
+ ...marker && { NextToken: marker }
28026
+ }));
28027
+ return {
28028
+ items: list.UserPools,
28029
+ nextMarker: list.NextToken
27986
28030
  };
27987
- if (input.cdkPath) try {
28031
+ },
28032
+ describe: async (pool) => {
28033
+ if (!pool.Id) return void 0;
28034
+ if (desiredName && pool.Name === desiredName) return NAME_MATCH;
28035
+ if (!input.cdkPath) return void 0;
28036
+ try {
27988
28037
  const arn = (await this.getClient().send(new DescribeUserPoolCommand({ UserPoolId: pool.Id }))).UserPool?.Arn;
27989
- if (!arn) continue;
27990
- if ((await this.getClient().send(new ListTagsForResourceCommand$15({ ResourceArn: arn }))).Tags?.["aws:cdk:path"] === input.cdkPath) return {
27991
- physicalId: pool.Id,
27992
- attributes: {}
27993
- };
28038
+ if (!arn) return void 0;
28039
+ return await this.getClient().send(new ListTagsForResourceCommand$15({ ResourceArn: arn }));
27994
28040
  } catch (err) {
27995
- if (err instanceof ResourceNotFoundException$7) continue;
28041
+ if (err instanceof ResourceNotFoundException$7) return void 0;
27996
28042
  throw err;
27997
28043
  }
27998
- }
27999
- nextToken = list.NextToken;
28000
- } while (nextToken);
28001
- return null;
28044
+ },
28045
+ tagsOf: (detail) => "nameMatch" in detail ? [{
28046
+ Key: CDK_PATH_TAG,
28047
+ Value: walkCdkPath
28048
+ }] : Object.entries(detail.Tags ?? {}).map(([Key, Value]) => ({
28049
+ Key,
28050
+ Value
28051
+ }))
28052
+ });
28053
+ if (!match) return null;
28054
+ return {
28055
+ physicalId: match.summary.Id,
28056
+ attributes: {}
28057
+ };
28002
28058
  }
28003
28059
  };
28004
28060
 
@@ -32984,23 +33040,31 @@ var BudgetsBudgetProvider = class {
32984
33040
  if (error instanceof NotFoundException$5) return null;
32985
33041
  throw error;
32986
33042
  }
32987
- if (!input.cdkPath) return null;
32988
- let nextToken;
32989
- do {
32990
- const list = await client.send(new DescribeBudgetsCommand({
32991
- AccountId: accountId,
32992
- ...nextToken && { NextToken: nextToken }
32993
- }));
32994
- for (const budget of list.Budgets ?? []) {
32995
- if (!budget.BudgetName) continue;
32996
- if (matchesCdkPath((await client.send(new ListTagsForResourceCommand$17({ ResourceARN: this.budgetArn(accountId, budget.BudgetName) }))).ResourceTags, input.cdkPath)) return {
32997
- physicalId: budget.BudgetName,
32998
- attributes: { Arn: this.budgetArn(accountId, budget.BudgetName) }
33043
+ const match = await importTagWalk({
33044
+ cdkPath: input.cdkPath,
33045
+ logicalId: input.logicalId,
33046
+ listPage: async (marker) => {
33047
+ const list = await client.send(new DescribeBudgetsCommand({
33048
+ AccountId: accountId,
33049
+ ...marker && { NextToken: marker }
33050
+ }));
33051
+ return {
33052
+ items: list.Budgets,
33053
+ nextMarker: list.NextToken
32999
33054
  };
33000
- }
33001
- nextToken = list.NextToken;
33002
- } while (nextToken);
33003
- return null;
33055
+ },
33056
+ describe: async (budget) => {
33057
+ if (!budget.BudgetName) return void 0;
33058
+ return await client.send(new ListTagsForResourceCommand$17({ ResourceARN: this.budgetArn(accountId, budget.BudgetName) }));
33059
+ },
33060
+ tagsOf: (tags) => tags.ResourceTags
33061
+ });
33062
+ if (!match) return null;
33063
+ const budgetName = match.summary.BudgetName;
33064
+ return {
33065
+ physicalId: budgetName,
33066
+ attributes: { Arn: this.budgetArn(accountId, budgetName) }
33067
+ };
33004
33068
  }
33005
33069
  };
33006
33070
 
@@ -38200,19 +38264,25 @@ var FirehoseProvider = class {
38200
38264
  if (err instanceof ResourceNotFoundException$10) return null;
38201
38265
  throw err;
38202
38266
  }
38203
- if (!input.cdkPath) return null;
38204
- let exclusiveStartDeliveryStreamName;
38205
- while (true) {
38206
- const list = await this.getClient().send(new ListDeliveryStreamsCommand({ ...exclusiveStartDeliveryStreamName && { ExclusiveStartDeliveryStreamName: exclusiveStartDeliveryStreamName } }));
38207
- const names = list.DeliveryStreamNames ?? [];
38208
- for (const name of names) if (matchesCdkPath((await this.getClient().send(new ListTagsForDeliveryStreamCommand({ DeliveryStreamName: name }))).Tags, input.cdkPath)) return {
38209
- physicalId: name,
38210
- attributes: {}
38211
- };
38212
- if (!list.HasMoreDeliveryStreams || names.length === 0) break;
38213
- exclusiveStartDeliveryStreamName = names[names.length - 1];
38214
- }
38215
- return null;
38267
+ const match = await importTagWalk({
38268
+ cdkPath: input.cdkPath,
38269
+ logicalId: input.logicalId,
38270
+ listPage: async (marker) => {
38271
+ const list = await this.getClient().send(new ListDeliveryStreamsCommand({ ...marker && { ExclusiveStartDeliveryStreamName: marker } }));
38272
+ const names = list.DeliveryStreamNames ?? [];
38273
+ return {
38274
+ items: names,
38275
+ nextMarker: list.HasMoreDeliveryStreams && names.length > 0 ? names[names.length - 1] : void 0
38276
+ };
38277
+ },
38278
+ describe: async (name) => await this.getClient().send(new ListTagsForDeliveryStreamCommand({ DeliveryStreamName: name })),
38279
+ tagsOf: (tagsResp) => tagsResp.Tags
38280
+ });
38281
+ if (!match) return null;
38282
+ return {
38283
+ physicalId: match.summary,
38284
+ attributes: {}
38285
+ };
38216
38286
  }
38217
38287
  /**
38218
38288
  * Wait for a delivery stream to become ACTIVE.
@@ -38718,26 +38788,32 @@ var CloudTrailProvider = class {
38718
38788
  if (err instanceof TrailNotFoundException) return null;
38719
38789
  throw err;
38720
38790
  }
38721
- if (!input.cdkPath) return null;
38722
- let nextToken;
38723
- do {
38724
- const list = await this.getClient().send(new ListTrailsCommand({ ...nextToken && { NextToken: nextToken } }));
38725
- for (const trail of list.Trails ?? []) {
38726
- if (!trail.TrailARN || !trail.Name) continue;
38791
+ const match = await importTagWalk({
38792
+ cdkPath: input.cdkPath,
38793
+ logicalId: input.logicalId,
38794
+ listPage: async (marker) => {
38795
+ const list = await this.getClient().send(new ListTrailsCommand({ ...marker && { NextToken: marker } }));
38796
+ return {
38797
+ items: list.Trails,
38798
+ nextMarker: list.NextToken
38799
+ };
38800
+ },
38801
+ describe: async (trail) => {
38802
+ if (!trail.TrailARN || !trail.Name) return void 0;
38727
38803
  try {
38728
- const list2 = (await this.getClient().send(new ListTagsCommand$1({ ResourceIdList: [trail.TrailARN] }))).ResourceTagList?.[0];
38729
- if (matchesCdkPath(list2?.TagsList, input.cdkPath)) return {
38730
- physicalId: trail.Name,
38731
- attributes: {}
38732
- };
38804
+ return await this.getClient().send(new ListTagsCommand$1({ ResourceIdList: [trail.TrailARN] }));
38733
38805
  } catch (err) {
38734
- if (err instanceof TrailNotFoundException) continue;
38806
+ if (err instanceof TrailNotFoundException) return void 0;
38735
38807
  throw err;
38736
38808
  }
38737
- }
38738
- nextToken = list.NextToken;
38739
- } while (nextToken);
38740
- return null;
38809
+ },
38810
+ tagsOf: (tagsResp) => tagsResp.ResourceTagList?.[0]?.TagsList
38811
+ });
38812
+ if (!match) return null;
38813
+ return {
38814
+ physicalId: match.summary.Name,
38815
+ attributes: {}
38816
+ };
38741
38817
  }
38742
38818
  };
38743
38819
 
@@ -40458,26 +40534,33 @@ var S3DirectoryBucketProvider = class {
40458
40534
  if (e.name === "NotFound" || e.name === "NoSuchBucket") return null;
40459
40535
  throw err;
40460
40536
  }
40461
- if (!input.cdkPath) return null;
40462
- let token;
40463
- do {
40464
- const list = await this.s3Client.send(new ListDirectoryBucketsCommand({ ...token && { ContinuationToken: token } }));
40465
- for (const b of list.Buckets ?? []) {
40466
- if (!b.Name) continue;
40537
+ const match = await importTagWalk({
40538
+ cdkPath: input.cdkPath,
40539
+ logicalId: input.logicalId,
40540
+ listPage: async (token) => {
40541
+ const list = await this.s3Client.send(new ListDirectoryBucketsCommand({ ...token && { ContinuationToken: token } }));
40542
+ return {
40543
+ items: list.Buckets,
40544
+ nextMarker: list.ContinuationToken
40545
+ };
40546
+ },
40547
+ describe: async (b) => {
40548
+ if (!b.Name) return void 0;
40467
40549
  try {
40468
- if (matchesCdkPath((await this.s3Client.send(new GetBucketTaggingCommand({ Bucket: b.Name }))).TagSet, input.cdkPath)) return {
40469
- physicalId: b.Name,
40470
- attributes: {}
40471
- };
40550
+ return await this.s3Client.send(new GetBucketTaggingCommand({ Bucket: b.Name }));
40472
40551
  } catch (err) {
40473
40552
  const e = err;
40474
- if (e.name === "NoSuchTagSet" || e.name === "AccessDenied") continue;
40553
+ if (e.name === "NoSuchTagSet" || e.name === "AccessDenied") return void 0;
40475
40554
  throw err;
40476
40555
  }
40477
- }
40478
- token = list.ContinuationToken;
40479
- } while (token);
40480
- return null;
40556
+ },
40557
+ tagsOf: (tagging) => tagging.TagSet
40558
+ });
40559
+ if (!match) return null;
40560
+ return {
40561
+ physicalId: match.summary.Name,
40562
+ attributes: {}
40563
+ };
40481
40564
  }
40482
40565
  };
40483
40566
 
@@ -42510,28 +42593,36 @@ var ACMCertificateProvider = class {
42510
42593
  throw err;
42511
42594
  }
42512
42595
  }
42513
- if (!input.cdkPath) return null;
42514
- let nextToken;
42515
- do {
42516
- const list = await this.acmClient.send(new ListCertificatesCommand({ ...nextToken ? { NextToken: nextToken } : {} }));
42517
- for (const summary of list.CertificateSummaryList ?? []) {
42518
- if (!summary.CertificateArn) continue;
42596
+ const match = await importTagWalk({
42597
+ cdkPath: input.cdkPath,
42598
+ logicalId: input.logicalId,
42599
+ listPage: async (marker) => {
42600
+ const list = await this.acmClient.send(new ListCertificatesCommand({ ...marker && { NextToken: marker } }));
42601
+ return {
42602
+ items: list.CertificateSummaryList,
42603
+ nextMarker: list.NextToken
42604
+ };
42605
+ },
42606
+ describe: async (summary) => {
42607
+ if (!summary.CertificateArn) return void 0;
42519
42608
  try {
42520
- if (matchesCdkPath((await this.acmClient.send(new ListTagsForCertificateCommand({ CertificateArn: summary.CertificateArn }))).Tags, input.cdkPath)) return {
42521
- physicalId: summary.CertificateArn,
42522
- attributes: {
42523
- Arn: summary.CertificateArn,
42524
- CertificateArn: summary.CertificateArn
42525
- }
42526
- };
42609
+ return await this.acmClient.send(new ListTagsForCertificateCommand({ CertificateArn: summary.CertificateArn }));
42527
42610
  } catch (err) {
42528
- if (err instanceof ResourceNotFoundException$6) continue;
42611
+ if (err instanceof ResourceNotFoundException$6) return void 0;
42529
42612
  throw err;
42530
42613
  }
42614
+ },
42615
+ tagsOf: (tagsResp) => tagsResp.Tags
42616
+ });
42617
+ if (!match) return null;
42618
+ const arn = match.summary.CertificateArn;
42619
+ return {
42620
+ physicalId: arn,
42621
+ attributes: {
42622
+ Arn: arn,
42623
+ CertificateArn: arn
42531
42624
  }
42532
- nextToken = list.NextToken;
42533
- } while (nextToken);
42534
- return null;
42625
+ };
42535
42626
  }
42536
42627
  /**
42537
42628
  * Poll `DescribeCertificate` until status === `ISSUED`. On the FIRST poll
@@ -62081,7 +62172,7 @@ function createMigrateCommand() {
62081
62172
  */
62082
62173
  function buildProgram() {
62083
62174
  const program = new Command();
62084
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.256.0");
62175
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.257.0");
62085
62176
  program.addCommand(createBootstrapCommand());
62086
62177
  program.addCommand(createSynthCommand());
62087
62178
  program.addCommand(createListCommand());