@go-to-k/cdkd 0.291.15 → 0.291.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{asg-provider-CEGHMZnN.js → asg-provider-CHM7_WdJ.js} +2 -2
- package/dist/{asg-provider-CEGHMZnN.js.map → asg-provider-CHM7_WdJ.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-Bt0ttXRi.js → deploy-engine-xxVOQPPr.js} +102 -15
- package/dist/deploy-engine-xxVOQPPr.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{program-CGsbW6A4.js → program-hXXls0hg.js} +191 -184
- package/dist/{program-CGsbW6A4.js.map → program-hXXls0hg.js.map} +1 -1
- package/dist/{version-2myEXI65.js → version-DMRkEtU2.js} +2 -2
- package/dist/{version-2myEXI65.js.map → version-DMRkEtU2.js.map} +1 -1
- package/package.json +2 -2
- package/dist/deploy-engine-Bt0ttXRi.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { $ as yellow, $
|
|
1
|
+
import { $ as yellow, $i as findLargeInlineResources, $n as repairMalformedOutputsForReadOnly, $r as WorkGraph, $t as replayWarn, A as createPreDeleteFinalSnapshot, Aa as setAwsClients, Ai as runDockerStreaming, An as malformedOrphansRefusalMessage, Ar as scrubResourceRecord, At as isTerminationProtectionPropagationError, B as isStatefulRecreateTargetSync, Ba as LocalStartServiceError, Bi as resolveApp, Bn as refuseMalformedNestedChildOutputs, Br as DEFAULT_STATE_PREFIX, Bt as parameterTypeMayLoseSecretIdentity, C as namesAnyDeclaredParameter, Ca as resolveAssemblyPath, Ci as formatDockerLoginError, Cn as hasReadableOutputs, Cr as maskSecretsInError, Ct as CloudControlProvider, D as PRE_DELETE_SNAPSHOT_TYPES, Da as getAwsClients, Di as partitionSensitiveEnv, Dn as malformedExportSourceWarning, Dr as recordMaskOnlyValuesIn, Dt as deleteSkipReason, E as ATOMIC_FINAL_SNAPSHOT_TYPES, Ea as AwsClients, Ei as isMalformedEnvKey, En as malformedExportNamesWarning, Er as recordMaskOnlyValue, Et as deleteIndeterminateGuards, F as extractDeploymentEventError, Fi as getDockerImageBySourceHash, Fn as malformedResourceEntriesWarning, Fr as buildForceUnlockCommand, Ft as coerceParameterTypedValue, G as toCfnInteger, Ga as ProvisioningError, Gi as resolveStateBucketWithDefaultAndSource, Gn as refuseMalformedOutputsForDestroy, Gr as importableOutputKeys, Gt as resolveExplicitPhysicalId, H as WARM_THROUGHPUT_MEMBERS, Ha as MalformedProducerRecordRefusalError, Hi as resolveCaptureObservedState, Hn as refuseMalformedOrphansForDestroy, Hr as hasReadableExportSet, Ht as isSettledInstanceState, I as makeSiblingClaimReader, Ia as DeployCancelledError, Ii as Synthesizer, In as malformedResourcePropertiesWarning, Ir as buildLockContentionMessage, It as getAccountInfo, J as bold, Ja as StackHasActiveImportsError, Ji as warnDeprecatedNoPrefixCliFlag, Jn as refuseMalformedResourceEntriesForOrphan, Jr as orphansAfterRollback, Jt as coerceCfnInteger, K as toFiniteNumber, Ka as ResourceTimeoutError, Ki as resolveUseCdkBootstrapAssets, Kn as refuseMalformedResourceAttributesForOrphan, Kr as importableOutputs, Kt as assertRegionMatch, L as planOrphanAdoption, La as DynamicReferenceRegionAmbiguousError, Li as synthesisStatusMessage, Ln as malformedResourcesWarning, Lr as forceQuitRecoveryClause, Lt as isImpossibleEmptyStoredAttribute, M as refusesFinalSnapshot, Ma as CdkdError, Mi as escapeRegExp, Mn as malformedOutputsRefusalMessage, Mr as S3StateBackend, Mt as carriesDynamicReference, N as unsupportedFinalSnapshotError, Ni as stripControlChars, Nn as malformedOutputsWarning, Nr as rebuildClientForBucketRegion, Nt as carriesFetchableDynamicReference, O as buildFinalSnapshotIdentifier, Oa as resetAwsClients, Oi as redactDockerArgvValues, On as malformedLocalOutputsWarning, Or as recoverMaskedOutput, Ot as isWaitAbandonedError, P as makeCanonicalizePropertiesFn, Pa as CrossAccountSecretRefusalError, Pi as AssetManifestLoader, Pn as malformedRenderedContainersWarning, Pr as UNREPRODUCIBLE_LOCK_CLAUSE, Pt as cfnRefValueFromPhysicalId, Q as red, Qi as MIGRATE_TMP_PREFIX, Qn as repairMalformedOrphansForReadOnly, Qr as stringifyValue, Qt as readConfigString, R as MULTI_REGION_RECREATE_BLOCKED_TYPES, Ra as IntrinsicResolutionRefusalError, Ri as getDefaultStateBucketName, Rn as malformedStateRefusalMessage, Rr as formatLockExpiry, Rt as isNamelessDynamicReferenceError, S as computeParameterTaint, Sa as renderAssemblyPathEscape, Si as finchSecretArgvRefusal, Sn as hasReadableOrphans, Sr as markSameGenerationBag, St as startInterruptWatch, T as resourcesNamingDeclaredParameter, Ta as resolveBucketRegion, Ti as isDockerClientEnvKey, Tn as isReadableResourceEntry, Tr as pathCrossesDottedKey, Tt as UNSPECIFIED_SKIP_REASON, U as coerceWarmThroughput$1, Ua as NestedStackChildDirectDestroyError, Ui as resolveSkipPrefix, Un as refuseMalformedOrphansForOrphan, Ur as hasReasonlessBaselineRefusal, Ut as WAFv2WebACLProvider, V as renderStatefulReason, Vi as resolveAutoAssetStorage, Vn as refuseMalformedOrphans, Vr as exportNamesCarriedFrom, Vt as refStateLookupFromResource, W as isWarmThroughputDecrease, Wa as PartialFailureError, Wi as resolveStateBucketWithDefault, Wn as refuseMalformedOutputs, Wr as hasUnverifiableParameterRefusal, Wt as normalizeAwsTagsToCfn, X as gray, Xi as CFN_TEMPLATE_BODY_LIMIT, Xn as refuseMalformedResourcesForDestroy, Xr as shouldRetainResource, Xt as configIntegerRefusal, Y as cyan, Ya as StackTerminationProtectionError, Yi as ssmResolvedValueType, Yn as refuseMalformedResourcePropertiesForOrphan, Yr as orphansCarriedFrom, Yt as configBooleanRefusal, Z as green, Za as SynthesisError, Zi as CFN_TEMPLATE_URL_LIMIT, Zn as refuseMalformedState, Zr as AssetPublisher, Zt as configStringRefusal, _ as bagHoldsSecretExpression, _a as hasPlainPrototype, _i as resolveDockerContextDirectory, _n as INTRINSIC_KEYS, _r as dynamicReferenceTokens, _t as maskerOrIdentity, a as DeploymentEventsStore, aa as producerRecordKey, ai as BOOTSTRAP_MARKER_PREFIX, an as withSharedDrainBudget, ao as isRetryableTransientError, ar as findActionableSilentDrops, at as secretBearingStateKeyWarning, b as mergeNoChangeOutputs, ba as absoluteAssemblyPathEscape, bi as describeDockerFailure, bn as UNREADABLE_RESOURCES_MAP_ROW, br as isSingleDynamicReferenceToken, bt as interruptWatchListenerCount, c as replayFailedOperations, ca as PARTITION_TABLE, ci as getBootstrapMarkerKey, cn as s3BucketDualStackDomainName, co as markNonRetryable, cr as withRetry, ct as IAMRoleProvider, d as updatePartialMessage, da as AssemblyReader, di as readBootstrapMarkerBody, dn as applyRoleArnIfSet, do as describeAwsFailure, dr as STATE_SOURCED_BASELINE_RULES, dt as definedAttributes, ea as uploadCfnTemplate, ei as buildAssetRedirectMap, en as requireConfigArray, eo as normalizeAwsError, er as repairMalformedResourceEntriesForReadOnly, et as collectDeclaredOutputNames, f as updatePartialReason, fa as failedStageNote, fi as validateAssetBucketName, fn as AWS_CREDENTIAL_ENV_KEYS, fo as safeStringify, fr as STATE_SOURCED_CROSS_GENERATION_RULES, ft as stringifyIfAssigned, g as computeImplicitDeleteEdges, ga as hasOwnKey, gi as buildDockerImage, gn as DiffCalculator, gr as createSecretMasker, gt as maskDeep, h as IMPLICIT_DELETE_DEPENDENCIES, ha as defineOwnKey, hi as assertCdkLocalDockerContextContained, hn as envCredentialsAreAssumedRole, hr as carriesSecretMask, ht as createMaskedRetryLogger, i as DeploymentEventsReader, ia as producerCoordinateKey, ii as AssetModeResolver, in as producerRegionsFromState, io as isMarkedNonRetryable, ir as safeStackName, it as secretBearing, j as isFinalSnapshotError, ji as warnFinchArgvExposure, jn as malformedOrphansWarning, jr as LockManager, jt as IntrinsicFunctionResolver, k as ccRoutedFinalSnapshotError, ka as runWithStackAwsClients, ki as runDockerForeground, kn as malformedOrphanRecordsWarning, kr as redactSecretsForState, kt as disableInstanceApiTermination, l as replayRollback, la as canonicalizeRegion, li as isCrossRegionRedirect, ln as s3BucketRegionalDomainName, lo as markRedactedCause, lr as DagBuilder, lt as collectInlinePolicyNamesManagedBySiblings, m as maskingRetryLogger, ma as processStackMessages, mi as buildDenyExternalAccessPolicy, mn as callerEnvCredentials, mr as TEMPLATE_SOURCED_RULES, mt as wouldReturnToSdkProvider, n as DEFAULT_RESOURCE_WARN_AFTER_MS, na as injectiveKey, ni as loadPublishableAssetManifest, nn as requireConfigString, no as pasteableCommand, nr as repairMalformedResourcesForReadOnly, nt as exportAliasCollisionScrubWarning, o as planFailedOps, oa as decodeListingKey, oi as assertAssetBucketRegion, on as s3BucketArn, oo as isThrottlingError, or as findSilentDropProperties, ot as secretSafeKeyDisplay, p as withResourceDeadline, pa as globMatches, pi as validateContainerRepoName, pn as applyCallerIdentityCredentials, pr as STATE_SOURCED_READBACK_RULES, pt as ProviderRegistry, q as formatResourceLine, qa as ResourceUpdateNotSupportedError, qi as stateBucketExistenceConfirmed, qn as refuseMalformedResourceEntries, qr as isReadableBag, qt as coerceCfnBoolean, r as DeployEngine, ra as injectiveKeyPrefix, ri as rewriteTemplateAssetReferences, rn as classifyReplaySecretRegion, ro as shellQuote, rr as safeRegion, rt as isExportAliasCollision, s as planRollback, sa as expectedOwnerParam, si as ensureAssetStorage, sn as s3BucketDomainName, so as isTransientServerError, sr as describeTypeWithThrottleRetry, st as getCurrentResourceSecrets, t as DEFAULT_RESOURCE_TIMEOUT_MS, ta as CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION, ti as createAssetRedirectResolver, tn as requireConfigObject, to as withErrorHandling, tr as repairMalformedResourcePropertiesForReadOnly, tt as collectPublishedOutputNames, u as resolveReplacementOldType, ua as derivePartitionAndUrlSuffix, ui as parseBootstrapMarker, un as s3BucketWebsiteUrl, uo as retryClassificationText, ur as TemplateParser, ut as clearOnUpdateRemoval, v as isSecretBearingReferenceString, va as nullPrototypeRecord, vi as describeDockerCapturedOutput, vn as STATE_RESOURCES_MALFORMED, vr as errorCauseChain, vt as beginCommandInterruptScope, w as reachableDivergentParameters, wi as getDockerCmd, wn as hasReadableResources, wr as maskSecretsInText, wt as slowCcOperationTimeoutMs, x as bindingSkippedOutputs, xa as displayAssemblyPath, xi as dockerSpawnEnvWithSensitive, xn as displayLogicalId, xr as isUncertifiedBaselineMaskPosition, xt as isInterruptedWaitError, y as keptWholeReasonText, ya as ownValue, yi as describeDockerExecFailure, yn as UNREADABLE_ORPHANS_CONTAINER_ROW, yr as identityKeyFor, yt as endCommandInterruptScope, z as isStatefulRecreateTargetForReplace, za as LocalInvokeBuildError$1, zi as getLegacyStateBucketName, zn as refuseDivergentRecordRegionForDestroy, zr as CUSTOM_RESOURCE_RESPONSE_PREFIX, zt as isUnboundTemplateParameter } from "./deploy-engine-xxVOQPPr.js";
|
|
2
2
|
import { C as displayAwsMessage, D as truncateCodePoints, E as isPasteableIdent, S as UNRENDERABLE, T as displaySafe, _ as withSkipPrefix, b as SECRET_REF_MAX_CODE_POINTS, c as PATTERN_B_NAME_OPTIONS, f as explicitNamePropertyFor, h as getCurrentStackName, i as reserveStdoutForPayload, l as PATTERN_B_NAME_PROPERTIES, m as generateResourceNameWithFallback, n as getLogger, o as runStackBuffered, p as generateResourceName, s as getLiveRenderer, u as PATTERN_B_RESOURCE_TYPES, v as withStackName, w as displayIdent, x as STACK_REF_MAX_CODE_POINTS } from "./logger-GASr9bAF.js";
|
|
3
3
|
import { n as awsClientDefaults, s as ambientRegion } from "./aws-client-defaults-jISU4PHo.js";
|
|
4
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
-
import { a as renderDisableCommand, i as protectedReplacementAdvice, r as UNNAMEABLE_ID_CLAUSE, t as ASGProvider } from "./asg-provider-
|
|
4
|
+
import { t as getCdkdVersion } from "./version-DMRkEtU2.js";
|
|
5
|
+
import { a as renderDisableCommand, i as protectedReplacementAdvice, r as UNNAMEABLE_ID_CLAUSE, t as ASGProvider } from "./asg-provider-CHM7_WdJ.js";
|
|
6
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
7
7
|
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
8
8
|
import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketEncryptionCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketOwnershipControlsCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketOwnershipControlsCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, NotFound, 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";
|
|
@@ -767,7 +767,7 @@ const RESOURCE_PROPERTY_FORMAT = /^[A-Z][A-Za-z0-9]+(::[A-Z][A-Za-z0-9]+)+:[A-Z]
|
|
|
767
767
|
function parseRouteEntries(value, previous, flag) {
|
|
768
768
|
const parsed = value.split(",").map((s) => s.trim()).filter(Boolean);
|
|
769
769
|
for (const token of parsed) {
|
|
770
|
-
if (!RESOURCE_PROPERTY_FORMAT.test(token)) throw new Error(`Invalid ${flag} value "${token}": expected <ResourceType>:<PropertyName> with PascalCase on both halves (e.g. AWS::
|
|
770
|
+
if (!RESOURCE_PROPERTY_FORMAT.test(token)) throw new Error(`Invalid ${flag} value "${token}": expected <ResourceType>:<PropertyName> with PascalCase on both halves (e.g. AWS::ApiGatewayV2::Api:Body).`);
|
|
771
771
|
if (token.startsWith("Custom::")) throw new Error(`Invalid ${flag} value "${token}": Custom:: resources are routed through cfn-response and have no write-side silent drop at cdkd, so the flag would have no effect. Use --allow-unsupported-types for type-level escape hatches instead.`);
|
|
772
772
|
}
|
|
773
773
|
return [...previous ?? [], ...parsed];
|
|
@@ -813,7 +813,7 @@ function parseAllowUnsupportedPropertiesToken(value, previous) {
|
|
|
813
813
|
* values go UNWRITTEN when the preference is honoured, and that it is ignored
|
|
814
814
|
* when the resource routes to Cloud Control for another reason.
|
|
815
815
|
*/
|
|
816
|
-
const preferSdkRouteOption = new Option("--prefer-sdk-route <entries>", "Comma-separated <ResourceType>:<PropertyName> tokens to keep on the SDK provider instead of auto-routing the resource to Cloud Control. The named values are then NOT written to AWS — the deployed resource is missing the field. Ignored for a resource that routes to Cloud Control for another reason (a sibling unwired property, or a sticky cc-api state record), where the values are written after all. Example: --prefer-sdk-route AWS::
|
|
816
|
+
const preferSdkRouteOption = new Option("--prefer-sdk-route <entries>", "Comma-separated <ResourceType>:<PropertyName> tokens to keep on the SDK provider instead of auto-routing the resource to Cloud Control. The named values are then NOT written to AWS — the deployed resource is missing the field. Ignored for a resource that routes to Cloud Control for another reason (a sibling unwired property, or a sticky cc-api state record), where the values are written after all. Example: --prefer-sdk-route AWS::ApiGatewayV2::Api:Body").argParser(parsePreferSdkRouteToken);
|
|
817
817
|
/**
|
|
818
818
|
* The deprecated spelling. HIDDEN from `--help` so new users meet only the
|
|
819
819
|
* successor, but still parsed so existing scripts keep working; it warns once
|
|
@@ -2937,9 +2937,9 @@ function isPromptAbortError(error) {
|
|
|
2937
2937
|
* scope for v1; no `--force-stateful-recreation` bypass since
|
|
2938
2938
|
* this is a structural limitation, not a data-loss footgun.
|
|
2939
2939
|
*
|
|
2940
|
-
* Plus one cross-flag invariant: `--recreate-via-cc-api
|
|
2941
|
-
* combined with `--
|
|
2942
|
-
* on a resource whose template carries `
|
|
2940
|
+
* Plus one cross-flag invariant: `--recreate-via-cc-api MyApi`
|
|
2941
|
+
* combined with `--prefer-sdk-route AWS::ApiGatewayV2::Api:Body`
|
|
2942
|
+
* on a resource whose template carries `Body` is **ambiguous
|
|
2943
2943
|
* intent** — does the user want SDK + silent drop, or CC migration?
|
|
2944
2944
|
* Fail fast and let the user pick one strategy per resource.
|
|
2945
2945
|
*/
|
|
@@ -12537,6 +12537,16 @@ function isSqsQueueUrl(value) {
|
|
|
12537
12537
|
*/
|
|
12538
12538
|
const SNS_MAXIMUM_MESSAGE_SIZE_DEFAULT = "262144";
|
|
12539
12539
|
/**
|
|
12540
|
+
* The attribute map `create()` records, from the topic ARN (the physical id).
|
|
12541
|
+
* `import()` returns it too (issue #3627).
|
|
12542
|
+
*/
|
|
12543
|
+
function snsTopicAttributes(topicArn) {
|
|
12544
|
+
return {
|
|
12545
|
+
TopicArn: topicArn,
|
|
12546
|
+
TopicName: topicArn.split(":").pop()
|
|
12547
|
+
};
|
|
12548
|
+
}
|
|
12549
|
+
/**
|
|
12540
12550
|
* AWS SNS Topic Provider
|
|
12541
12551
|
*
|
|
12542
12552
|
* Implements resource provisioning for AWS::SNS::Topic using the SNS SDK.
|
|
@@ -13038,7 +13048,7 @@ var SNSTopicProvider = class {
|
|
|
13038
13048
|
await this.snsClient.send(new GetTopicAttributesCommand({ TopicArn: input.knownPhysicalId }));
|
|
13039
13049
|
return {
|
|
13040
13050
|
physicalId: input.knownPhysicalId,
|
|
13041
|
-
attributes:
|
|
13051
|
+
attributes: snsTopicAttributes(input.knownPhysicalId)
|
|
13042
13052
|
};
|
|
13043
13053
|
} catch (err) {
|
|
13044
13054
|
if (err instanceof NotFoundException) return null;
|
|
@@ -13053,7 +13063,7 @@ var SNSTopicProvider = class {
|
|
|
13053
13063
|
if (!t.TopicArn) continue;
|
|
13054
13064
|
if (t.TopicArn.substring(t.TopicArn.lastIndexOf(":") + 1) === desiredName) return {
|
|
13055
13065
|
physicalId: t.TopicArn,
|
|
13056
|
-
attributes:
|
|
13066
|
+
attributes: snsTopicAttributes(t.TopicArn)
|
|
13057
13067
|
};
|
|
13058
13068
|
}
|
|
13059
13069
|
marker = list.NextToken;
|
|
@@ -13377,88 +13387,6 @@ function mapDeliveryStatusLogging(attrs, stateCaseMap = /* @__PURE__ */ new Map(
|
|
|
13377
13387
|
return result;
|
|
13378
13388
|
}
|
|
13379
13389
|
|
|
13380
|
-
//#endregion
|
|
13381
|
-
//#region src/provisioning/attribute-map.ts
|
|
13382
|
-
/**
|
|
13383
|
-
* The ONE spelling of the attribute-map rule an SDK provider's `create()` /
|
|
13384
|
-
* `update()` / `import()` result follows (issue #3077, closing the `?? ''`
|
|
13385
|
-
* shape `docs/provider-development.md` forbids under "Never store an
|
|
13386
|
-
* empty-string placeholder"):
|
|
13387
|
-
*
|
|
13388
|
-
* an attribute cdkd could not read back is ABSENT from the map — never
|
|
13389
|
-
* recorded as the empty string, and never as a present-but-`undefined` key.
|
|
13390
|
-
*
|
|
13391
|
-
* The consumers of `ResourceState.attributes` all key off exactly that
|
|
13392
|
-
* distinction, and a sentinel puts every one of them on the wrong branch:
|
|
13393
|
-
*
|
|
13394
|
-
* - the deploy engine persists the map as-is, so `''` becomes the recorded
|
|
13395
|
-
* value of a field AWS never assigned;
|
|
13396
|
-
* - the intrinsic resolver serves a stored attribute whenever it is not
|
|
13397
|
-
* `undefined`, so `''` shadows `constructAttribute` forever — the
|
|
13398
|
-
* `AWS::EC2::Instance` IP / DNS / AZ arm re-describes the instance from
|
|
13399
|
-
* AWS only on a MISS, the `Arn` arms of the RDS family rebuild the ARN
|
|
13400
|
-
* only on a MISS;
|
|
13401
|
-
* - the Outputs export pass publishes whatever the resolver returned, so a
|
|
13402
|
-
* stored `''` is exported to every `Fn::ImportValue` consumer.
|
|
13403
|
-
*
|
|
13404
|
-
* It exists as a MODULE rather than a per-provider idiom because the rule was
|
|
13405
|
-
* prose and 96 attribute-position `?? ''` / `|| ''` / bare `''` sites across
|
|
13406
|
-
* 18 providers shipped anyway (measured 2026-09-14 with the TypeScript-compiler
|
|
13407
|
-
* walk that is now `tests/unit/provisioning/attribute-map.test.ts`). A helper
|
|
13408
|
-
* that DROPS the key is the one form a provider cannot spell wrong by habit.
|
|
13409
|
-
*
|
|
13410
|
-
* Two values are treated as "not read back":
|
|
13411
|
-
*
|
|
13412
|
-
* - `undefined`: the SDK's spelling of an unassigned optional member.
|
|
13413
|
-
* - `null`: no AWS SDK v3 read-back reports a scalar attribute as `null`, and
|
|
13414
|
-
* a stored `null` takes the resolver's "not `undefined`" hit branch exactly
|
|
13415
|
-
* like `''` does.
|
|
13416
|
-
*
|
|
13417
|
-
* Every other value is kept verbatim — INCLUDING an empty string AWS itself
|
|
13418
|
-
* reported (`false`, `0`, an empty array and an object likewise). The helper
|
|
13419
|
-
* stops cdkd MANUFACTURING `''` for a field it never read; a `''` that came
|
|
13420
|
-
* off the wire is a known value with a meaning the provider owns. The EC2
|
|
13421
|
-
* Instance provider is where that distinction is load-bearing: a `running`
|
|
13422
|
-
* instance with no public address is described with `PublicDnsName: ''` and
|
|
13423
|
-
* no `PublicIpAddress`, and CloudFormation answers `''` for both — a KNOWN
|
|
13424
|
-
* empty, recorded as such so a reference does not degrade to the instance id
|
|
13425
|
-
* on every resolution — while the same `''` on a `pending` instance means
|
|
13426
|
-
* "not yet", which that provider maps to `undefined` BEFORE calling this
|
|
13427
|
-
* helper (its `describedInstanceAttributes`). A caller that knows a `''`
|
|
13428
|
-
* means "unknown" is the one that must say so; this helper cannot tell.
|
|
13429
|
-
*
|
|
13430
|
-
* Deliberately NOT a general "compact this record" utility: it is scoped to
|
|
13431
|
-
* attribute maps. A property bag keeps its `undefined`-valued keys out by other
|
|
13432
|
-
* means (`.claude/rules/provider-property-fidelity.md`, "Remove the key rather
|
|
13433
|
-
* than setting it to `undefined`").
|
|
13434
|
-
*
|
|
13435
|
-
* A LEAF module (imports nothing) so every provider can take it without adding
|
|
13436
|
-
* an edge to the provider import ring.
|
|
13437
|
-
*/
|
|
13438
|
-
/**
|
|
13439
|
-
* Build an attribute map from read-back values, omitting every key whose value
|
|
13440
|
-
* is `undefined` or `null`.
|
|
13441
|
-
*/
|
|
13442
|
-
function definedAttributes(entries) {
|
|
13443
|
-
const out = {};
|
|
13444
|
-
for (const [key, value] of Object.entries(entries)) {
|
|
13445
|
-
if (value === void 0 || value === null) continue;
|
|
13446
|
-
out[key] = value;
|
|
13447
|
-
}
|
|
13448
|
-
return out;
|
|
13449
|
-
}
|
|
13450
|
-
/**
|
|
13451
|
-
* `String(value)` for a numeric read-back whose CloudFormation attribute is a
|
|
13452
|
-
* string (`Endpoint.Port`), or `undefined` when the field is unassigned — so
|
|
13453
|
-
* `definedAttributes` drops the key instead of recording the literal
|
|
13454
|
-
* `'undefined'`, which is what `String(described?.Port ?? '')` yields once its
|
|
13455
|
-
* `?? ''` is merely deleted.
|
|
13456
|
-
*/
|
|
13457
|
-
function stringifyIfAssigned(value) {
|
|
13458
|
-
if (value === void 0 || value === null) return void 0;
|
|
13459
|
-
return String(value);
|
|
13460
|
-
}
|
|
13461
|
-
|
|
13462
13390
|
//#endregion
|
|
13463
13391
|
//#region src/provisioning/providers/sns-subscription-provider.ts
|
|
13464
13392
|
/**
|
|
@@ -15949,11 +15877,21 @@ var LambdaEventSourceMappingProvider = class {
|
|
|
15949
15877
|
* returned by `create()`).
|
|
15950
15878
|
*/
|
|
15951
15879
|
async import(input) {
|
|
15952
|
-
if (input.knownPhysicalId) return
|
|
15880
|
+
if (!input.knownPhysicalId) return null;
|
|
15881
|
+
let resp;
|
|
15882
|
+
try {
|
|
15883
|
+
resp = await this.lambdaClient.send(new GetEventSourceMappingCommand({ UUID: input.knownPhysicalId }));
|
|
15884
|
+
} catch (err) {
|
|
15885
|
+
if (err instanceof ResourceNotFoundException) return null;
|
|
15886
|
+
throw err;
|
|
15887
|
+
}
|
|
15888
|
+
return {
|
|
15953
15889
|
physicalId: input.knownPhysicalId,
|
|
15954
|
-
attributes: {
|
|
15890
|
+
attributes: definedAttributes({
|
|
15891
|
+
Id: input.knownPhysicalId,
|
|
15892
|
+
EventSourceMappingArn: resp.EventSourceMappingArn
|
|
15893
|
+
})
|
|
15955
15894
|
};
|
|
15956
|
-
return null;
|
|
15957
15895
|
}
|
|
15958
15896
|
};
|
|
15959
15897
|
|
|
@@ -21919,10 +21857,15 @@ var DynamoDBTableProvider = class {
|
|
|
21919
21857
|
async import(input) {
|
|
21920
21858
|
const explicit = resolveExplicitPhysicalId(input, "TableName");
|
|
21921
21859
|
if (explicit) try {
|
|
21922
|
-
await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: explicit }));
|
|
21860
|
+
const resp = await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: explicit }));
|
|
21923
21861
|
return {
|
|
21924
21862
|
physicalId: explicit,
|
|
21925
|
-
attributes: {
|
|
21863
|
+
attributes: definedAttributes({
|
|
21864
|
+
Arn: resp.Table?.TableArn,
|
|
21865
|
+
TableId: resp.Table?.TableId,
|
|
21866
|
+
StreamArn: resp.Table?.LatestStreamArn,
|
|
21867
|
+
TableName: resp.Table?.TableName ?? explicit
|
|
21868
|
+
})
|
|
21926
21869
|
};
|
|
21927
21870
|
} catch (err) {
|
|
21928
21871
|
if (err instanceof ResourceNotFoundException$1) return null;
|
|
@@ -24096,10 +24039,15 @@ var DynamoDBGlobalTableProvider = class {
|
|
|
24096
24039
|
async import(input) {
|
|
24097
24040
|
const explicit = resolveExplicitPhysicalId(input, "TableName");
|
|
24098
24041
|
if (explicit) try {
|
|
24099
|
-
await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: explicit }));
|
|
24042
|
+
const resp = await this.dynamoDBClient.send(new DescribeTableCommand({ TableName: explicit }));
|
|
24100
24043
|
return {
|
|
24101
24044
|
physicalId: explicit,
|
|
24102
|
-
attributes: {
|
|
24045
|
+
attributes: definedAttributes({
|
|
24046
|
+
Arn: resp.Table?.TableArn,
|
|
24047
|
+
TableId: resp.Table?.TableId,
|
|
24048
|
+
StreamArn: resp.Table?.LatestStreamArn,
|
|
24049
|
+
TableName: resp.Table?.TableName ?? explicit
|
|
24050
|
+
})
|
|
24103
24051
|
};
|
|
24104
24052
|
} catch (err) {
|
|
24105
24053
|
if (err instanceof ResourceNotFoundException$1) return null;
|
|
@@ -43419,6 +43367,39 @@ var RDSDBProxyTargetGroupProvider = class {
|
|
|
43419
43367
|
//#endregion
|
|
43420
43368
|
//#region src/provisioning/providers/docdb-provider.ts
|
|
43421
43369
|
/**
|
|
43370
|
+
* The attribute map a DocumentDB DB cluster records (issue #3650), under
|
|
43371
|
+
* CloudFormation's `Fn::GetAtt` names (`Endpoint`, `Port`, `ReadEndpoint`,
|
|
43372
|
+
* `ClusterResourceId`). The RDS-style dotted keys (`Endpoint.Address`, ...)
|
|
43373
|
+
* are kept for records and readers that already use them; no
|
|
43374
|
+
* `Fn::GetAtt` names them for this service, so on their own they left
|
|
43375
|
+
* `Fn::GetAtt [Cluster, Endpoint]` resolving to the cluster identifier.
|
|
43376
|
+
*/
|
|
43377
|
+
function clusterAttributes$1(cluster) {
|
|
43378
|
+
return definedAttributes({
|
|
43379
|
+
Endpoint: cluster?.Endpoint,
|
|
43380
|
+
Port: stringifyIfAssigned(cluster?.Port),
|
|
43381
|
+
ReadEndpoint: cluster?.ReaderEndpoint,
|
|
43382
|
+
"Endpoint.Address": cluster?.Endpoint,
|
|
43383
|
+
"Endpoint.Port": stringifyIfAssigned(cluster?.Port),
|
|
43384
|
+
"ReadEndpoint.Address": cluster?.ReaderEndpoint,
|
|
43385
|
+
Arn: cluster?.DBClusterArn,
|
|
43386
|
+
ClusterResourceId: cluster?.DbClusterResourceId
|
|
43387
|
+
});
|
|
43388
|
+
}
|
|
43389
|
+
/**
|
|
43390
|
+
* The attribute map a DocumentDB DB instance records (issue #3650): `Endpoint` /
|
|
43391
|
+
* `Port` are CloudFormation's `Fn::GetAtt` names, the dotted keys are kept.
|
|
43392
|
+
*/
|
|
43393
|
+
function instanceAttributes$1(instance) {
|
|
43394
|
+
return definedAttributes({
|
|
43395
|
+
Endpoint: instance?.Endpoint?.Address,
|
|
43396
|
+
Port: stringifyIfAssigned(instance?.Endpoint?.Port),
|
|
43397
|
+
"Endpoint.Address": instance?.Endpoint?.Address,
|
|
43398
|
+
"Endpoint.Port": stringifyIfAssigned(instance?.Endpoint?.Port),
|
|
43399
|
+
Arn: instance?.DBInstanceArn
|
|
43400
|
+
});
|
|
43401
|
+
}
|
|
43402
|
+
/**
|
|
43422
43403
|
* AWS DocumentDB Provider
|
|
43423
43404
|
*
|
|
43424
43405
|
* Implements resource provisioning for DocumentDB resources:
|
|
@@ -43601,16 +43582,9 @@ var DocDBProvider = class {
|
|
|
43601
43582
|
}))).DBCluster) throw new Error("CreateDBCluster did not return DBCluster");
|
|
43602
43583
|
this.logger.debug(`Successfully created DocDB DBCluster ${logicalId}: ${dbClusterIdentifier}`);
|
|
43603
43584
|
if (process.env["CDKD_NO_WAIT"] !== "true") await this.waitForClusterAvailable(dbClusterIdentifier);
|
|
43604
|
-
const described = await this.describeDBCluster(dbClusterIdentifier);
|
|
43605
43585
|
return {
|
|
43606
43586
|
physicalId: dbClusterIdentifier,
|
|
43607
|
-
attributes:
|
|
43608
|
-
"Endpoint.Address": described?.Endpoint,
|
|
43609
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Port),
|
|
43610
|
-
"ReadEndpoint.Address": described?.ReaderEndpoint,
|
|
43611
|
-
Arn: described?.DBClusterArn,
|
|
43612
|
-
ClusterResourceId: described?.DbClusterResourceId
|
|
43613
|
-
})
|
|
43587
|
+
attributes: clusterAttributes$1(await this.describeDBCluster(dbClusterIdentifier))
|
|
43614
43588
|
};
|
|
43615
43589
|
} catch (error) {
|
|
43616
43590
|
if (error instanceof ProvisioningError) throw error;
|
|
@@ -43642,13 +43616,7 @@ var DocDBProvider = class {
|
|
|
43642
43616
|
return {
|
|
43643
43617
|
physicalId,
|
|
43644
43618
|
wasReplaced: false,
|
|
43645
|
-
attributes:
|
|
43646
|
-
"Endpoint.Address": described?.Endpoint,
|
|
43647
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Port),
|
|
43648
|
-
"ReadEndpoint.Address": described?.ReaderEndpoint,
|
|
43649
|
-
Arn: described?.DBClusterArn,
|
|
43650
|
-
ClusterResourceId: described?.DbClusterResourceId
|
|
43651
|
-
})
|
|
43619
|
+
attributes: clusterAttributes$1(described)
|
|
43652
43620
|
};
|
|
43653
43621
|
} catch (error) {
|
|
43654
43622
|
const cause = error instanceof Error ? error : void 0;
|
|
@@ -43710,14 +43678,9 @@ var DocDBProvider = class {
|
|
|
43710
43678
|
}))).DBInstance) throw new Error("CreateDBInstance did not return DBInstance");
|
|
43711
43679
|
this.logger.debug(`Successfully created DocDB DBInstance ${logicalId}: ${dbInstanceIdentifier}`);
|
|
43712
43680
|
if (process.env["CDKD_NO_WAIT"] !== "true") await this.waitForInstanceAvailable(dbInstanceIdentifier);
|
|
43713
|
-
const described = await this.describeDBInstance(dbInstanceIdentifier);
|
|
43714
43681
|
return {
|
|
43715
43682
|
physicalId: dbInstanceIdentifier,
|
|
43716
|
-
attributes:
|
|
43717
|
-
"Endpoint.Address": described?.Endpoint?.Address,
|
|
43718
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Endpoint?.Port),
|
|
43719
|
-
Arn: described?.DBInstanceArn
|
|
43720
|
-
})
|
|
43683
|
+
attributes: instanceAttributes$1(await this.describeDBInstance(dbInstanceIdentifier))
|
|
43721
43684
|
};
|
|
43722
43685
|
} catch (error) {
|
|
43723
43686
|
if (error instanceof ProvisioningError) throw error;
|
|
@@ -43741,11 +43704,7 @@ var DocDBProvider = class {
|
|
|
43741
43704
|
return {
|
|
43742
43705
|
physicalId,
|
|
43743
43706
|
wasReplaced: false,
|
|
43744
|
-
attributes:
|
|
43745
|
-
"Endpoint.Address": described?.Endpoint?.Address,
|
|
43746
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Endpoint?.Port),
|
|
43747
|
-
Arn: described?.DBInstanceArn
|
|
43748
|
-
})
|
|
43707
|
+
attributes: instanceAttributes$1(described)
|
|
43749
43708
|
};
|
|
43750
43709
|
} catch (error) {
|
|
43751
43710
|
const cause = error instanceof Error ? error : void 0;
|
|
@@ -44014,11 +43973,7 @@ var DocDBProvider = class {
|
|
|
44014
43973
|
const described = (await this.getClient().send(new DescribeDBInstancesCommand$1({ DBInstanceIdentifier: explicit }))).DBInstances?.[0];
|
|
44015
43974
|
return {
|
|
44016
43975
|
physicalId: explicit,
|
|
44017
|
-
attributes:
|
|
44018
|
-
"Endpoint.Address": described?.Endpoint?.Address,
|
|
44019
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Endpoint?.Port),
|
|
44020
|
-
Arn: described?.DBInstanceArn
|
|
44021
|
-
})
|
|
43976
|
+
attributes: instanceAttributes$1(described)
|
|
44022
43977
|
};
|
|
44023
43978
|
} catch (err) {
|
|
44024
43979
|
if (err.name === "DBInstanceNotFoundFault") return null;
|
|
@@ -44029,10 +43984,9 @@ var DocDBProvider = class {
|
|
|
44029
43984
|
async importDBCluster(input) {
|
|
44030
43985
|
const explicit = resolveExplicitPhysicalId(input, "DBClusterIdentifier");
|
|
44031
43986
|
if (explicit) try {
|
|
44032
|
-
await this.getClient().send(new DescribeDBClustersCommand$1({ DBClusterIdentifier: explicit }));
|
|
44033
43987
|
return {
|
|
44034
43988
|
physicalId: explicit,
|
|
44035
|
-
attributes: {}
|
|
43989
|
+
attributes: clusterAttributes$1((await this.getClient().send(new DescribeDBClustersCommand$1({ DBClusterIdentifier: explicit }))).DBClusters?.[0])
|
|
44036
43990
|
};
|
|
44037
43991
|
} catch (err) {
|
|
44038
43992
|
if (err.name === "DBClusterNotFoundFault") return null;
|
|
@@ -44059,6 +44013,38 @@ var DocDBProvider = class {
|
|
|
44059
44013
|
//#endregion
|
|
44060
44014
|
//#region src/provisioning/providers/neptune-provider.ts
|
|
44061
44015
|
/**
|
|
44016
|
+
* The attribute map a Neptune DB cluster records (issue #3650), under
|
|
44017
|
+
* CloudFormation's `Fn::GetAtt` names (`Endpoint`, `Port`, `ReadEndpoint`,
|
|
44018
|
+
* `ClusterResourceId`). The RDS-style dotted keys (`Endpoint.Address`, ...)
|
|
44019
|
+
* are kept for records and readers that already use them; no
|
|
44020
|
+
* `Fn::GetAtt` names them for this service, so on their own they left
|
|
44021
|
+
* `Fn::GetAtt [Cluster, Endpoint]` resolving to the cluster identifier.
|
|
44022
|
+
*/
|
|
44023
|
+
function clusterAttributes(cluster) {
|
|
44024
|
+
return definedAttributes({
|
|
44025
|
+
Endpoint: cluster?.Endpoint,
|
|
44026
|
+
Port: stringifyIfAssigned(cluster?.Port),
|
|
44027
|
+
ReadEndpoint: cluster?.ReaderEndpoint,
|
|
44028
|
+
"Endpoint.Address": cluster?.Endpoint,
|
|
44029
|
+
"Endpoint.Port": stringifyIfAssigned(cluster?.Port),
|
|
44030
|
+
"ReadEndpoint.Address": cluster?.ReaderEndpoint,
|
|
44031
|
+
ClusterResourceId: cluster?.DbClusterResourceId
|
|
44032
|
+
});
|
|
44033
|
+
}
|
|
44034
|
+
/**
|
|
44035
|
+
* The attribute map a Neptune DB instance records (issue #3650): `Endpoint` /
|
|
44036
|
+
* `Port` are CloudFormation's `Fn::GetAtt` names, the dotted keys are kept.
|
|
44037
|
+
*/
|
|
44038
|
+
function instanceAttributes(instance) {
|
|
44039
|
+
return definedAttributes({
|
|
44040
|
+
Endpoint: instance?.Endpoint?.Address,
|
|
44041
|
+
Port: stringifyIfAssigned(instance?.Endpoint?.Port),
|
|
44042
|
+
"Endpoint.Address": instance?.Endpoint?.Address,
|
|
44043
|
+
"Endpoint.Port": stringifyIfAssigned(instance?.Endpoint?.Port),
|
|
44044
|
+
Arn: instance?.DBInstanceArn
|
|
44045
|
+
});
|
|
44046
|
+
}
|
|
44047
|
+
/**
|
|
44062
44048
|
* AWS Neptune Provider
|
|
44063
44049
|
*
|
|
44064
44050
|
* Implements resource provisioning for Neptune resources:
|
|
@@ -44244,15 +44230,9 @@ var NeptuneProvider = class {
|
|
|
44244
44230
|
}))).DBCluster) throw new Error("CreateDBCluster did not return DBCluster");
|
|
44245
44231
|
this.logger.debug(`Successfully created Neptune DBCluster ${logicalId}: ${dbClusterIdentifier}`);
|
|
44246
44232
|
if (process.env["CDKD_NO_WAIT"] !== "true") await this.waitForClusterAvailable(dbClusterIdentifier);
|
|
44247
|
-
const described = await this.describeDBCluster(dbClusterIdentifier);
|
|
44248
44233
|
return {
|
|
44249
44234
|
physicalId: dbClusterIdentifier,
|
|
44250
|
-
attributes:
|
|
44251
|
-
"Endpoint.Address": described?.Endpoint,
|
|
44252
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Port),
|
|
44253
|
-
"ReadEndpoint.Address": described?.ReaderEndpoint,
|
|
44254
|
-
ClusterResourceId: described?.DbClusterResourceId
|
|
44255
|
-
})
|
|
44235
|
+
attributes: clusterAttributes(await this.describeDBCluster(dbClusterIdentifier))
|
|
44256
44236
|
};
|
|
44257
44237
|
} catch (error) {
|
|
44258
44238
|
if (error instanceof ProvisioningError) throw error;
|
|
@@ -44284,12 +44264,7 @@ var NeptuneProvider = class {
|
|
|
44284
44264
|
return {
|
|
44285
44265
|
physicalId,
|
|
44286
44266
|
wasReplaced: false,
|
|
44287
|
-
attributes:
|
|
44288
|
-
"Endpoint.Address": described?.Endpoint,
|
|
44289
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Port),
|
|
44290
|
-
"ReadEndpoint.Address": described?.ReaderEndpoint,
|
|
44291
|
-
ClusterResourceId: described?.DbClusterResourceId
|
|
44292
|
-
})
|
|
44267
|
+
attributes: clusterAttributes(described)
|
|
44293
44268
|
};
|
|
44294
44269
|
} catch (error) {
|
|
44295
44270
|
const cause = error instanceof Error ? error : void 0;
|
|
@@ -44354,13 +44329,9 @@ var NeptuneProvider = class {
|
|
|
44354
44329
|
}))).DBInstance) throw new Error("CreateDBInstance did not return DBInstance");
|
|
44355
44330
|
this.logger.debug(`Successfully created Neptune DBInstance ${logicalId}: ${dbInstanceIdentifier}`);
|
|
44356
44331
|
if (process.env["CDKD_NO_WAIT"] !== "true") await this.waitForInstanceAvailable(dbInstanceIdentifier);
|
|
44357
|
-
const described = await this.describeDBInstance(dbInstanceIdentifier);
|
|
44358
44332
|
return {
|
|
44359
44333
|
physicalId: dbInstanceIdentifier,
|
|
44360
|
-
attributes:
|
|
44361
|
-
"Endpoint.Address": described?.Endpoint?.Address,
|
|
44362
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Endpoint?.Port)
|
|
44363
|
-
})
|
|
44334
|
+
attributes: instanceAttributes(await this.describeDBInstance(dbInstanceIdentifier))
|
|
44364
44335
|
};
|
|
44365
44336
|
} catch (error) {
|
|
44366
44337
|
if (error instanceof ProvisioningError) throw error;
|
|
@@ -44386,10 +44357,7 @@ var NeptuneProvider = class {
|
|
|
44386
44357
|
return {
|
|
44387
44358
|
physicalId,
|
|
44388
44359
|
wasReplaced: false,
|
|
44389
|
-
attributes:
|
|
44390
|
-
"Endpoint.Address": described?.Endpoint?.Address,
|
|
44391
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Endpoint?.Port)
|
|
44392
|
-
})
|
|
44360
|
+
attributes: instanceAttributes(described)
|
|
44393
44361
|
};
|
|
44394
44362
|
} catch (error) {
|
|
44395
44363
|
const cause = error instanceof Error ? error : void 0;
|
|
@@ -44661,11 +44629,7 @@ var NeptuneProvider = class {
|
|
|
44661
44629
|
const described = (await this.getClient().send(new DescribeDBInstancesCommand$2({ DBInstanceIdentifier: explicit }))).DBInstances?.[0];
|
|
44662
44630
|
return {
|
|
44663
44631
|
physicalId: explicit,
|
|
44664
|
-
attributes:
|
|
44665
|
-
"Endpoint.Address": described?.Endpoint?.Address,
|
|
44666
|
-
"Endpoint.Port": stringifyIfAssigned(described?.Endpoint?.Port),
|
|
44667
|
-
Arn: described?.DBInstanceArn
|
|
44668
|
-
})
|
|
44632
|
+
attributes: instanceAttributes(described)
|
|
44669
44633
|
};
|
|
44670
44634
|
} catch (err) {
|
|
44671
44635
|
if (err.name === "DBInstanceNotFoundFault") return null;
|
|
@@ -44676,10 +44640,9 @@ var NeptuneProvider = class {
|
|
|
44676
44640
|
async importDBCluster(input) {
|
|
44677
44641
|
const explicit = resolveExplicitPhysicalId(input, "DBClusterIdentifier");
|
|
44678
44642
|
if (explicit) try {
|
|
44679
|
-
await this.getClient().send(new DescribeDBClustersCommand$2({ DBClusterIdentifier: explicit }));
|
|
44680
44643
|
return {
|
|
44681
44644
|
physicalId: explicit,
|
|
44682
|
-
attributes: {}
|
|
44645
|
+
attributes: clusterAttributes((await this.getClient().send(new DescribeDBClustersCommand$2({ DBClusterIdentifier: explicit }))).DBClusters?.[0])
|
|
44683
44646
|
};
|
|
44684
44647
|
} catch (err) {
|
|
44685
44648
|
if (err.name === "DBClusterNotFoundFault") return null;
|
|
@@ -68865,7 +68828,7 @@ const EMPTY_ALLOW_SET = /* @__PURE__ */ new Set();
|
|
|
68865
68828
|
*
|
|
68866
68829
|
* - **Fresh hits**: a resource whose template uses one or more
|
|
68867
68830
|
* silent-drop top-level CFn properties. Annotation value is the list
|
|
68868
|
-
* of property names (e.g. `
|
|
68831
|
+
* of property names (e.g. `Body`).
|
|
68869
68832
|
* - **Sticky hits**: a resource whose deployed state records
|
|
68870
68833
|
* `provisionedBy: 'cc-api'` (from a prior deploy) even when the
|
|
68871
68834
|
* current template's silent-drop set is empty. Annotation value is
|
|
@@ -87799,6 +87762,8 @@ function buildStackState(stackName, region, rows, templateParser, template, exis
|
|
|
87799
87762
|
properties: tmplResource.Properties ?? {},
|
|
87800
87763
|
attributes: rowAttributes ?? priorAttributes ?? {},
|
|
87801
87764
|
dependencies: deps,
|
|
87765
|
+
deletionPolicy: tmplResource.DeletionPolicy,
|
|
87766
|
+
updateReplacePolicy: tmplResource.UpdateReplacePolicy,
|
|
87802
87767
|
provisionedBy: "sdk",
|
|
87803
87768
|
...prior && prior.physicalId === row.physicalId && (hasUnverifiableParameterRefusal(prior) || hasReasonlessBaselineRefusal(prior) && (namesParameter ??= resourcesNamingDeclaredParameter(template))(row.logicalId)) && {
|
|
87804
87769
|
observedBaselineRefused: true,
|
|
@@ -91369,24 +91334,26 @@ const SENSITIVE_ENV_KEYS = /* @__PURE__ */ new Set([
|
|
|
91369
91334
|
* boundary, so a local-invoke build failure still surfaces with cdkd's exit code
|
|
91370
91335
|
* / branding. `architectureToPlatform` is a pure helper (re-exported directly).
|
|
91371
91336
|
*
|
|
91372
|
-
*
|
|
91373
|
-
*
|
|
91374
|
-
*
|
|
91375
|
-
*
|
|
91337
|
+
* The build context is CONTAINED twice, against one REQUIRED `assetOutdir`
|
|
91338
|
+
* bound (issue [#3503](https://github.com/go-to-k/cdkd/issues/3503)). The
|
|
91339
|
+
* engine refuses an escaping `source.directory` itself since cdk-local 0.149.3,
|
|
91340
|
+
* and the bound is FORWARDED to it: without one the engine narrows to the
|
|
91341
|
+
* manifest directory and refuses a `cdk.Stage` image's `../asset.<hash>`
|
|
91342
|
+
* (issue [#3597](https://github.com/go-to-k/cdkd/issues/3597)). cdkd still
|
|
91343
|
+
* refuses first, because the engine's refusal quotes the manifest value in a
|
|
91344
|
+
* boundary the value itself can close (go-to-k/cdk-local#758); once that
|
|
91345
|
+
* ships, go-to-k/cdkd#3652 drops cdkd's copy.
|
|
91376
91346
|
* See cdk-local's `src/local/docker-image-builder.ts`.
|
|
91377
91347
|
*/
|
|
91378
91348
|
async function buildContainerImage$1(asset, cdkOutDir, options) {
|
|
91379
|
-
const executable = asset?.source?.executable;
|
|
91380
|
-
if (executable && executable.length > 0) warnManifestExecutable(executable);
|
|
91381
|
-
const { assetOutdir, ...implOptions } = options;
|
|
91382
91349
|
assertCdkLocalDockerContextContained({
|
|
91383
91350
|
manifestDir: cdkOutDir,
|
|
91384
91351
|
source: asset.source,
|
|
91385
|
-
assetOutdir,
|
|
91352
|
+
assetOutdir: options.assetOutdir,
|
|
91386
91353
|
wrapError: (message) => new LocalInvokeBuildError$1(`Refusing to build the container image: ${message}`)
|
|
91387
91354
|
});
|
|
91388
91355
|
try {
|
|
91389
|
-
return await buildContainerImage(asset, cdkOutDir,
|
|
91356
|
+
return await buildContainerImage(asset, cdkOutDir, options);
|
|
91390
91357
|
} catch (e) {
|
|
91391
91358
|
if (e instanceof LocalInvokeBuildError) throw new LocalInvokeBuildError$1(e.message);
|
|
91392
91359
|
throw e;
|
|
@@ -91430,7 +91397,25 @@ function canonicalizeImageUriHost(imageUri) {
|
|
|
91430
91397
|
if (slash < 0) return imageUri;
|
|
91431
91398
|
const host = imageUri.slice(0, slash);
|
|
91432
91399
|
if (!isRegistryHostComponent(host)) return imageUri;
|
|
91433
|
-
return host
|
|
91400
|
+
return foldAsciiUpperCase(host) + imageUri.slice(slash);
|
|
91401
|
+
}
|
|
91402
|
+
/**
|
|
91403
|
+
* Lower-case ONLY the ASCII letters `A`-`Z`, leaving every other code point
|
|
91404
|
+
* as written.
|
|
91405
|
+
*
|
|
91406
|
+
* `String.prototype.toLowerCase` performs full Unicode case folding, so the
|
|
91407
|
+
* Kelvin sign U+212A folds to a plain ASCII `k`. Folding with it here, BEFORE
|
|
91408
|
+
* `parseEcrRegistryHost`, handed that parser an already-ASCII host and defeated
|
|
91409
|
+
* the raw-capture charset guard it applies to the region and suffix (see
|
|
91410
|
+
* `CANONICAL_REGION_SEGMENT` in `src/utils/ecr-uri.ts`):
|
|
91411
|
+
* `<acct>.dkr.ecr-fips.us-<U+212A>east-1.amazonaws.com/...` parsed as the
|
|
91412
|
+
* region `us-keast-1`, a region the host does not name, and a Kelvin sign in
|
|
91413
|
+
* the LABELS resolved to the plain form. An ASCII-only fold keeps the case
|
|
91414
|
+
* fold the #1801 login / pull agreement needs (DNS case-insensitivity is
|
|
91415
|
+
* ASCII-only) while leaving any other code point for that guard to refuse.
|
|
91416
|
+
*/
|
|
91417
|
+
function foldAsciiUpperCase(value) {
|
|
91418
|
+
return value.replace(/[A-Z]+/g, (run) => run.toLowerCase());
|
|
91434
91419
|
}
|
|
91435
91420
|
/** Docker's rule for "component 1 is a registry, not a repository segment". */
|
|
91436
91421
|
function isRegistryHostComponent(component) {
|
|
@@ -91503,7 +91488,9 @@ function isCredentialFresh(creds) {
|
|
|
91503
91488
|
* the same one the DERIVED `docker login` endpoint names — an
|
|
91504
91489
|
* AWS-reported `proxyEndpoint` still wins over that fallback (it can be
|
|
91505
91490
|
* a VPC-endpoint host), which is correct: AWS names the endpoint its own
|
|
91506
|
-
* token authenticates, and it reports it lower-cased.
|
|
91491
|
+
* token authenticates, and it reports it lower-cased. That precedence holds
|
|
91492
|
+
* only for the PLAIN host form: a FIPS or dual-stack pull logs in to its own
|
|
91493
|
+
* host, since `proxyEndpoint` always names the plain one (issue #1855).
|
|
91507
91494
|
*/
|
|
91508
91495
|
async function pullEcrImage(imageUri, options) {
|
|
91509
91496
|
const logger = getLogger().child("ecr-puller");
|
|
@@ -91554,7 +91541,11 @@ async function pullEcrImage(imageUri, options) {
|
|
|
91554
91541
|
...assumed && { credentials: assumed }
|
|
91555
91542
|
});
|
|
91556
91543
|
try {
|
|
91557
|
-
await ecrLogin(ecr,
|
|
91544
|
+
await ecrLogin(ecr, {
|
|
91545
|
+
accountId: parsed.accountId,
|
|
91546
|
+
region: parsed.region,
|
|
91547
|
+
registryHost: canonicalUri.slice(0, canonicalUri.indexOf("/"))
|
|
91548
|
+
});
|
|
91558
91549
|
} finally {
|
|
91559
91550
|
ecr.destroy();
|
|
91560
91551
|
}
|
|
@@ -91605,14 +91596,26 @@ async function assumeRoleForEcr(roleArn, callerRegion, logger) {
|
|
|
91605
91596
|
* Authenticate the local docker daemon against the target ECR registry.
|
|
91606
91597
|
* Mirrors `DockerAssetPublisher.ecrLogin` but stays in this module so the
|
|
91607
91598
|
* local-invoke path doesn't depend on the publisher's larger surface area.
|
|
91608
|
-
|
|
91609
|
-
|
|
91610
|
-
|
|
91599
|
+
*
|
|
91600
|
+
* The login endpoint must name the host the PULL targets (issue #1855):
|
|
91601
|
+
* docker's credential store is keyed on the hostname verbatim, so a login to
|
|
91602
|
+
* the plain host followed by a pull from a FIPS or dual-stack host sends no
|
|
91603
|
+
* credentials (`no basic auth credentials`). `GetAuthorizationToken` reports
|
|
91604
|
+
* the PLAIN host as its `proxyEndpoint`, so that value, and the derived
|
|
91605
|
+
* fallback, are used only when the pull targets the plain form; every other
|
|
91606
|
+
* form logs in to `registryHost` itself. The token is registry-scoped, not
|
|
91607
|
+
* host-scoped: measured against real ECR, one token authenticated `/v2/` on
|
|
91608
|
+
* all four host forms `ECR_REGISTRY_HOST_FORMS` lists.
|
|
91609
|
+
*/
|
|
91610
|
+
async function ecrLogin(client, target) {
|
|
91611
|
+
const { accountId, region, registryHost } = target;
|
|
91612
|
+
getLogger().child("ecr-puller").debug(`ECR login (account=${accountId}, region=${region}, host=${registryHost})`);
|
|
91611
91613
|
const authData = (await client.send(new GetAuthorizationTokenCommand({}))).authorizationData?.[0];
|
|
91612
91614
|
if (!authData?.authorizationToken) throw new LocalInvokeBuildError$1("Failed to get ECR authorization token");
|
|
91613
91615
|
const [username, password] = Buffer.from(authData.authorizationToken, "base64").toString().split(":");
|
|
91614
91616
|
if (!username || password === void 0) throw new LocalInvokeBuildError$1("ECR authorization token has unexpected shape (missing username/password)");
|
|
91615
|
-
const
|
|
91617
|
+
const plainHost = `${accountId}.dkr.ecr.${region}.${ecrUrlSuffix(region)}`;
|
|
91618
|
+
const endpoint = registryHost === plainHost ? authData.proxyEndpoint || `https://${plainHost}` : `https://${registryHost}`;
|
|
91616
91619
|
const loginArgs = [
|
|
91617
91620
|
"login",
|
|
91618
91621
|
"--username",
|
|
@@ -95798,10 +95801,14 @@ function createLocalRunTaskCommand() {
|
|
|
95798
95801
|
* (issue [#3503](https://github.com/go-to-k/cdkd/issues/3503)).
|
|
95799
95802
|
*
|
|
95800
95803
|
* `cdkd local start-service` / `start-alb` hand the whole run to cdk-local's
|
|
95801
|
-
* `runEcsServiceEmulator`, which reads each stack's asset manifest itself
|
|
95802
|
-
*
|
|
95803
|
-
*
|
|
95804
|
-
*
|
|
95804
|
+
* `runEcsServiceEmulator`, which reads each stack's asset manifest itself —
|
|
95805
|
+
* for an ECS container image and for an ALB Lambda target's container image
|
|
95806
|
+
* alike. Since cdk-local 0.149.3 the engine refuses an escaping
|
|
95807
|
+
* `source.directory` at each build and each `--watch` soft reload
|
|
95808
|
+
* (go-to-k/cdkd#3597). This check stays in front of it, for the whole
|
|
95809
|
+
* assembly at once, because the engine's refusal quotes the assembly-chosen
|
|
95810
|
+
* value in a boundary the value can close (go-to-k/cdk-local#758);
|
|
95811
|
+
* go-to-k/cdkd#3652 removes it once that ships.
|
|
95805
95812
|
*
|
|
95806
95813
|
* `resolveBoots` is the seam because the engine calls it after every synth —
|
|
95807
95814
|
* at boot, and again on every `--watch` reload — and before any image is
|
|
@@ -95871,7 +95878,7 @@ function assertEmulatorDockerContextsContained(stacks) {
|
|
|
95871
95878
|
* only while the directory is named `assembly-*` AND its parent's
|
|
95872
95879
|
* `manifest.json` declares it as a `cdk:cloud-assembly` artifact, and WARN
|
|
95873
95880
|
* whenever a climb happens, since the predicate is read from the tree being
|
|
95874
|
-
* judged.
|
|
95881
|
+
* judged. Deleted with this module by go-to-k/cdkd#3652.
|
|
95875
95882
|
*/
|
|
95876
95883
|
function engineAssemblyRoot(outdir) {
|
|
95877
95884
|
let dir = resolve(outdir);
|
|
@@ -98812,4 +98819,4 @@ function buildProgram() {
|
|
|
98812
98819
|
|
|
98813
98820
|
//#endregion
|
|
98814
98821
|
export { buildProgram };
|
|
98815
|
-
//# sourceMappingURL=program-
|
|
98822
|
+
//# sourceMappingURL=program-hXXls0hg.js.map
|