@go-to-k/cdkd 0.91.1 → 0.91.2

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
@@ -70168,6 +70168,268 @@ async function loadStateForStack(stackName, synthRegion, opts) {
70168
70168
  // src/local/lambda-resolver.ts
70169
70169
  import { existsSync as existsSync4, statSync as statSync3 } from "node:fs";
70170
70170
  import { dirname, isAbsolute, resolve as resolve4 } from "node:path";
70171
+
70172
+ // src/local/intrinsic-image.ts
70173
+ function tryResolveImageFnJoin(raw, resources, context) {
70174
+ if (!raw || typeof raw !== "object")
70175
+ return { kind: "not-applicable" };
70176
+ const obj = raw;
70177
+ const arg = obj["Fn::Join"];
70178
+ if (arg === void 0)
70179
+ return { kind: "not-applicable" };
70180
+ if (!Array.isArray(arg) || arg.length !== 2 || !Array.isArray(arg[1])) {
70181
+ return { kind: "unsupported-join", reason: "Fn::Join must be [delimiter, [elements]]" };
70182
+ }
70183
+ const [delimiter, elements] = arg;
70184
+ if (typeof delimiter !== "string") {
70185
+ return {
70186
+ kind: "unsupported-join",
70187
+ reason: `Fn::Join delimiter must be a string, got ${typeof delimiter}`
70188
+ };
70189
+ }
70190
+ const repoLogicalId = findEcrRepositoryRefInTree(elements, resources);
70191
+ const stateResources = context?.stateResources;
70192
+ if (repoLogicalId && !stateResources) {
70193
+ return { kind: "needs-state", repoLogicalId };
70194
+ }
70195
+ const parts = [];
70196
+ for (const element of elements) {
70197
+ const r = resolveImageIntrinsic(element, resources, context);
70198
+ if (r === void 0) {
70199
+ if (!repoLogicalId)
70200
+ return { kind: "not-applicable" };
70201
+ return {
70202
+ kind: "unsupported-join",
70203
+ reason: "one or more Fn::Join elements could not be resolved"
70204
+ };
70205
+ }
70206
+ parts.push(r);
70207
+ }
70208
+ return { kind: "resolved", uri: parts.join(delimiter) };
70209
+ }
70210
+ function findEcrRepositoryRefInTree(node, resources) {
70211
+ if (node === null || node === void 0)
70212
+ return void 0;
70213
+ if (typeof node === "string" || typeof node === "number" || typeof node === "boolean") {
70214
+ return void 0;
70215
+ }
70216
+ if (Array.isArray(node)) {
70217
+ for (const item of node) {
70218
+ const hit = findEcrRepositoryRefInTree(item, resources);
70219
+ if (hit)
70220
+ return hit;
70221
+ }
70222
+ return void 0;
70223
+ }
70224
+ if (typeof node !== "object")
70225
+ return void 0;
70226
+ const obj = node;
70227
+ if (typeof obj["Ref"] === "string") {
70228
+ const target = obj["Ref"];
70229
+ if (resources[target]?.Type === "AWS::ECR::Repository")
70230
+ return target;
70231
+ return void 0;
70232
+ }
70233
+ const getAtt = obj["Fn::GetAtt"];
70234
+ if (getAtt !== void 0) {
70235
+ let lid;
70236
+ if (Array.isArray(getAtt) && typeof getAtt[0] === "string")
70237
+ lid = getAtt[0];
70238
+ else if (typeof getAtt === "string")
70239
+ lid = getAtt.split(".")[0];
70240
+ if (lid && resources[lid]?.Type === "AWS::ECR::Repository")
70241
+ return lid;
70242
+ return void 0;
70243
+ }
70244
+ for (const value of Object.values(obj)) {
70245
+ const hit = findEcrRepositoryRefInTree(value, resources);
70246
+ if (hit)
70247
+ return hit;
70248
+ }
70249
+ return void 0;
70250
+ }
70251
+ function resolveImageIntrinsic(node, resources, context) {
70252
+ const v = resolveImageIntrinsicAny(node, resources, context);
70253
+ if (typeof v === "string")
70254
+ return v;
70255
+ if (typeof v === "number" || typeof v === "boolean")
70256
+ return String(v);
70257
+ return void 0;
70258
+ }
70259
+ function resolveImageIntrinsicAny(node, resources, context) {
70260
+ if (node === null || node === void 0)
70261
+ return void 0;
70262
+ if (typeof node === "string" || typeof node === "number" || typeof node === "boolean") {
70263
+ return node;
70264
+ }
70265
+ if (Array.isArray(node)) {
70266
+ return void 0;
70267
+ }
70268
+ if (typeof node !== "object")
70269
+ return void 0;
70270
+ const obj = node;
70271
+ const keys = Object.keys(obj);
70272
+ if (keys.length !== 1)
70273
+ return void 0;
70274
+ const intrinsic = keys[0];
70275
+ const arg = obj[intrinsic];
70276
+ if (intrinsic === "Ref") {
70277
+ if (typeof arg !== "string")
70278
+ return void 0;
70279
+ if (arg.startsWith("AWS::")) {
70280
+ const p = context?.pseudoParameters;
70281
+ if (!p)
70282
+ return void 0;
70283
+ if (arg === "AWS::URLSuffix")
70284
+ return p.urlSuffix;
70285
+ if (arg === "AWS::Partition")
70286
+ return p.partition;
70287
+ if (arg === "AWS::Region")
70288
+ return p.region;
70289
+ if (arg === "AWS::AccountId")
70290
+ return p.accountId;
70291
+ return void 0;
70292
+ }
70293
+ const refResource = resources[arg];
70294
+ if (refResource?.Type !== "AWS::ECR::Repository")
70295
+ return void 0;
70296
+ const stateEntry = context?.stateResources?.[arg];
70297
+ if (!stateEntry)
70298
+ return void 0;
70299
+ return stateEntry.physicalId;
70300
+ }
70301
+ if (intrinsic === "Fn::GetAtt") {
70302
+ let logicalId;
70303
+ let attr;
70304
+ if (Array.isArray(arg) && arg.length === 2 && typeof arg[0] === "string" && typeof arg[1] === "string") {
70305
+ logicalId = arg[0];
70306
+ attr = arg[1];
70307
+ } else if (typeof arg === "string") {
70308
+ const dot = arg.indexOf(".");
70309
+ if (dot > 0 && dot < arg.length - 1) {
70310
+ logicalId = arg.slice(0, dot);
70311
+ attr = arg.slice(dot + 1);
70312
+ }
70313
+ }
70314
+ if (!logicalId || !attr)
70315
+ return void 0;
70316
+ if (resources[logicalId]?.Type !== "AWS::ECR::Repository")
70317
+ return void 0;
70318
+ const cached = context?.stateResources?.[logicalId]?.attributes?.[attr];
70319
+ if (typeof cached === "string" && cached.length > 0)
70320
+ return cached;
70321
+ return void 0;
70322
+ }
70323
+ if (intrinsic === "Fn::Split") {
70324
+ if (!Array.isArray(arg) || arg.length !== 2)
70325
+ return void 0;
70326
+ const argArr = arg;
70327
+ const delim = argArr[0];
70328
+ if (typeof delim !== "string")
70329
+ return void 0;
70330
+ const src = resolveImageIntrinsicAny(argArr[1], resources, context);
70331
+ if (typeof src !== "string")
70332
+ return void 0;
70333
+ return src.split(delim);
70334
+ }
70335
+ if (intrinsic === "Fn::Select") {
70336
+ if (!Array.isArray(arg) || arg.length !== 2)
70337
+ return void 0;
70338
+ const argArr = arg;
70339
+ const rawIndex = argArr[0];
70340
+ let index;
70341
+ if (typeof rawIndex === "number") {
70342
+ index = rawIndex;
70343
+ } else if (typeof rawIndex === "string" && /^-?\d+$/.test(rawIndex)) {
70344
+ index = Number.parseInt(rawIndex, 10);
70345
+ }
70346
+ if (index === void 0 || !Number.isFinite(index))
70347
+ return void 0;
70348
+ const list = resolveImageIntrinsicAny(argArr[1], resources, context);
70349
+ if (Array.isArray(list)) {
70350
+ if (index < 0 || index >= list.length)
70351
+ return void 0;
70352
+ const picked = list[index];
70353
+ if (typeof picked === "string")
70354
+ return picked;
70355
+ return void 0;
70356
+ }
70357
+ if (Array.isArray(argArr[1])) {
70358
+ const listLiteral = argArr[1];
70359
+ if (index < 0 || index >= listLiteral.length)
70360
+ return void 0;
70361
+ return resolveImageIntrinsic(listLiteral[index], resources, context);
70362
+ }
70363
+ return void 0;
70364
+ }
70365
+ if (intrinsic === "Fn::Join") {
70366
+ if (!Array.isArray(arg) || arg.length !== 2)
70367
+ return void 0;
70368
+ const [delim, parts] = arg;
70369
+ if (typeof delim !== "string" || !Array.isArray(parts))
70370
+ return void 0;
70371
+ const resolved = [];
70372
+ for (const part of parts) {
70373
+ const r = resolveImageIntrinsic(part, resources, context);
70374
+ if (r === void 0)
70375
+ return void 0;
70376
+ resolved.push(r);
70377
+ }
70378
+ return resolved.join(delim);
70379
+ }
70380
+ if (intrinsic === "Fn::Sub") {
70381
+ let template;
70382
+ if (typeof arg === "string")
70383
+ template = arg;
70384
+ else if (Array.isArray(arg) && typeof arg[0] === "string")
70385
+ template = arg[0];
70386
+ if (template === void 0)
70387
+ return void 0;
70388
+ const out = substituteImagePlaceholders(template, resources, context);
70389
+ if (out.includes("${"))
70390
+ return void 0;
70391
+ return out;
70392
+ }
70393
+ return void 0;
70394
+ }
70395
+ function substituteImagePlaceholders(flat, resources, context) {
70396
+ if (!flat.includes("${"))
70397
+ return flat;
70398
+ return flat.replace(/\$\{([^}]+)\}/g, (full, key) => {
70399
+ if (context?.pseudoParameters) {
70400
+ if (key === "AWS::AccountId" && context.pseudoParameters.accountId) {
70401
+ return context.pseudoParameters.accountId;
70402
+ }
70403
+ if (key === "AWS::Region" && context.pseudoParameters.region) {
70404
+ return context.pseudoParameters.region;
70405
+ }
70406
+ if (key === "AWS::Partition" && context.pseudoParameters.partition) {
70407
+ return context.pseudoParameters.partition;
70408
+ }
70409
+ if (key === "AWS::URLSuffix" && context.pseudoParameters.urlSuffix) {
70410
+ return context.pseudoParameters.urlSuffix;
70411
+ }
70412
+ }
70413
+ if (context?.stateResources) {
70414
+ const dot = key.indexOf(".");
70415
+ const logicalId = dot === -1 ? key : key.slice(0, dot);
70416
+ const refResource = resources[logicalId];
70417
+ const stateEntry = context.stateResources[logicalId];
70418
+ if (refResource?.Type === "AWS::ECR::Repository" && stateEntry) {
70419
+ if (dot === -1) {
70420
+ return stateEntry.physicalId;
70421
+ }
70422
+ const attr = key.slice(dot + 1);
70423
+ const cached = stateEntry.attributes?.[attr];
70424
+ if (typeof cached === "string")
70425
+ return cached;
70426
+ }
70427
+ }
70428
+ return full;
70429
+ });
70430
+ }
70431
+
70432
+ // src/local/lambda-resolver.ts
70171
70433
  var LocalInvokeResolutionError = class _LocalInvokeResolutionError extends Error {
70172
70434
  constructor(message) {
70173
70435
  super(message);
@@ -70239,7 +70501,7 @@ function resolveLambdaTarget(target, stacks) {
70239
70501
  `Resource '${logicalId}' in ${stack.stackName} is ${resource.Type}, not a Lambda function. cdkd local invoke only works on AWS::Lambda::Function resources in v1.`
70240
70502
  );
70241
70503
  }
70242
- return extractLambdaProperties(stack, logicalId, resource);
70504
+ return extractLambdaProperties(stack, logicalId, resource, resources);
70243
70505
  }
70244
70506
  function pickStack(parsed, stacks) {
70245
70507
  if (parsed.stackPattern === null) {
@@ -70262,12 +70524,12 @@ function pickStack(parsed, stacks) {
70262
70524
  }
70263
70525
  return matched[0];
70264
70526
  }
70265
- function extractLambdaProperties(stack, logicalId, resource) {
70527
+ function extractLambdaProperties(stack, logicalId, resource, resources) {
70266
70528
  const props = resource.Properties ?? {};
70267
70529
  const memoryMb = typeof props["MemorySize"] === "number" ? props["MemorySize"] : 128;
70268
70530
  const timeoutSec = typeof props["Timeout"] === "number" ? props["Timeout"] : 3;
70269
70531
  const code = props["Code"] ?? {};
70270
- const imageUri = extractImageUri(code["ImageUri"]);
70532
+ const imageUri = extractImageUri(code["ImageUri"], logicalId, stack.stackName, resources);
70271
70533
  if (imageUri !== void 0) {
70272
70534
  return extractImageLambdaProperties({
70273
70535
  stack,
@@ -70309,7 +70571,7 @@ function extractLambdaProperties(stack, logicalId, resource) {
70309
70571
  ...inlineCode !== void 0 && { inlineCode }
70310
70572
  };
70311
70573
  }
70312
- function extractImageUri(value) {
70574
+ function extractImageUri(value, logicalId, stackName, resources) {
70313
70575
  if (typeof value === "string" && value.length > 0)
70314
70576
  return value;
70315
70577
  if (value && typeof value === "object" && !Array.isArray(value)) {
@@ -70319,6 +70581,24 @@ function extractImageUri(value) {
70319
70581
  return sub;
70320
70582
  if (Array.isArray(sub) && typeof sub[0] === "string")
70321
70583
  return sub[0];
70584
+ if ("Fn::Join" in obj) {
70585
+ const joinResolved = tryResolveImageFnJoin(value, resources, void 0);
70586
+ if (joinResolved.kind === "resolved")
70587
+ return joinResolved.uri;
70588
+ if (joinResolved.kind === "needs-state") {
70589
+ throw new LocalInvokeResolutionError(
70590
+ `Lambda '${logicalId}' in ${stackName} references same-stack ECR repository '${joinResolved.repoLogicalId}' via Fn::Join. cdkd local invoke cannot resolve the repository URI without state \u2014 deploy the stack first (so cdkd records the repository physical id), rebuild via lambda.DockerImageCode.fromImageAsset, or pin a public image.`
70591
+ );
70592
+ }
70593
+ if (joinResolved.kind === "unsupported-join") {
70594
+ throw new LocalInvokeResolutionError(
70595
+ `Lambda '${logicalId}' in ${stackName} has an unsupported Fn::Join Code.ImageUri shape: ${joinResolved.reason}. cdkd local invoke recognizes the canonical CDK 2.x lambda.DockerImageCode.fromEcr Fn::Join shape (delimiter "" with nested Fn::Select/Fn::Split over an ECR Repository Arn GetAtt + Ref to the repo).`
70596
+ );
70597
+ }
70598
+ throw new LocalInvokeResolutionError(
70599
+ `Lambda '${logicalId}' in ${stackName} has an Fn::Join Code.ImageUri that cdkd local invoke cannot resolve. The shape likely references AWS pseudo parameters (e.g. \${AWS::URLSuffix}) for an imported ECR repository. Workarounds: rebuild via lambda.DockerImageCode.fromImageAsset, or pin a fully-literal public image URI.`
70600
+ );
70601
+ }
70322
70602
  }
70323
70603
  return void 0;
70324
70604
  }
@@ -77255,76 +77535,40 @@ function parseContainerImage(raw, containerName, taskLogicalId, resources, _stac
77255
77535
  throw new EcsTaskResolutionError(
77256
77536
  `Container '${containerName}' in task '${taskLogicalId}' has an Image with unresolved \${...} placeholders (${substituted}). cdkd local run-task v1 only resolves AWS pseudo parameters and same-stack AWS::ECR::Repository refs.`
77257
77537
  );
77258
- }
77259
- const ecrMatch = /^(\d{12})\.dkr\.ecr\.([^.]+)\.amazonaws\.com(?:\.cn)?\//.exec(substituted);
77260
- if (ecrMatch) {
77261
- return { kind: "ecr", uri: substituted, account: ecrMatch[1], region: ecrMatch[2] };
77262
- }
77263
- return { kind: "public", uri: substituted };
77264
- }
77265
- function findUnresolvedEcrRepositoryRef(substituted, resources) {
77266
- const placeholderRegex = /\$\{([^}]+)\}/g;
77267
- let m;
77268
- while ((m = placeholderRegex.exec(substituted)) !== null) {
77269
- const key = m[1];
77270
- if (key.startsWith("AWS::"))
77271
- continue;
77272
- const dot = key.indexOf(".");
77273
- const lid = dot === -1 ? key : key.slice(0, dot);
77274
- if (resources[lid]?.Type === "AWS::ECR::Repository")
77275
- return lid;
77276
- }
77277
- return void 0;
77278
- }
77279
- function classifyResolvedImage(uri) {
77280
- if (uri.includes("cdk-hnb659fds-container-assets-")) {
77281
- const hashMatch = /:([a-f0-9]{8,})$/.exec(uri);
77282
- const out = { kind: "cdk-asset" };
77283
- if (hashMatch)
77284
- out.assetHash = hashMatch[1];
77285
- return out;
77286
- }
77287
- const ecrMatch = /^(\d{12})\.dkr\.ecr\.([^.]+)\.amazonaws\.com(?:\.cn)?\//.exec(uri);
77288
- if (ecrMatch) {
77289
- return { kind: "ecr", uri, account: ecrMatch[1], region: ecrMatch[2] };
77290
- }
77291
- return { kind: "public", uri };
77292
- }
77293
- function substituteImagePlaceholders(flat, resources, context) {
77294
- if (!flat.includes("${"))
77295
- return flat;
77296
- return flat.replace(/\$\{([^}]+)\}/g, (full, key) => {
77297
- if (context?.pseudoParameters) {
77298
- if (key === "AWS::AccountId" && context.pseudoParameters.accountId) {
77299
- return context.pseudoParameters.accountId;
77300
- }
77301
- if (key === "AWS::Region" && context.pseudoParameters.region) {
77302
- return context.pseudoParameters.region;
77303
- }
77304
- if (key === "AWS::Partition" && context.pseudoParameters.partition) {
77305
- return context.pseudoParameters.partition;
77306
- }
77307
- if (key === "AWS::URLSuffix" && context.pseudoParameters.urlSuffix) {
77308
- return context.pseudoParameters.urlSuffix;
77309
- }
77310
- }
77311
- if (context?.stateResources) {
77312
- const dot = key.indexOf(".");
77313
- const logicalId = dot === -1 ? key : key.slice(0, dot);
77314
- const refResource = resources[logicalId];
77315
- const stateEntry = context.stateResources[logicalId];
77316
- if (refResource?.Type === "AWS::ECR::Repository" && stateEntry) {
77317
- if (dot === -1) {
77318
- return stateEntry.physicalId;
77319
- }
77320
- const attr = key.slice(dot + 1);
77321
- const cached = stateEntry.attributes?.[attr];
77322
- if (typeof cached === "string")
77323
- return cached;
77324
- }
77325
- }
77326
- return full;
77327
- });
77538
+ }
77539
+ const ecrMatch = /^(\d{12})\.dkr\.ecr\.([^.]+)\.amazonaws\.com(?:\.cn)?\//.exec(substituted);
77540
+ if (ecrMatch) {
77541
+ return { kind: "ecr", uri: substituted, account: ecrMatch[1], region: ecrMatch[2] };
77542
+ }
77543
+ return { kind: "public", uri: substituted };
77544
+ }
77545
+ function findUnresolvedEcrRepositoryRef(substituted, resources) {
77546
+ const placeholderRegex = /\$\{([^}]+)\}/g;
77547
+ let m;
77548
+ while ((m = placeholderRegex.exec(substituted)) !== null) {
77549
+ const key = m[1];
77550
+ if (key.startsWith("AWS::"))
77551
+ continue;
77552
+ const dot = key.indexOf(".");
77553
+ const lid = dot === -1 ? key : key.slice(0, dot);
77554
+ if (resources[lid]?.Type === "AWS::ECR::Repository")
77555
+ return lid;
77556
+ }
77557
+ return void 0;
77558
+ }
77559
+ function classifyResolvedImage(uri) {
77560
+ if (uri.includes("cdk-hnb659fds-container-assets-")) {
77561
+ const hashMatch = /:([a-f0-9]{8,})$/.exec(uri);
77562
+ const out = { kind: "cdk-asset" };
77563
+ if (hashMatch)
77564
+ out.assetHash = hashMatch[1];
77565
+ return out;
77566
+ }
77567
+ const ecrMatch = /^(\d{12})\.dkr\.ecr\.([^.]+)\.amazonaws\.com(?:\.cn)?\//.exec(uri);
77568
+ if (ecrMatch) {
77569
+ return { kind: "ecr", uri, account: ecrMatch[1], region: ecrMatch[2] };
77570
+ }
77571
+ return { kind: "public", uri };
77328
77572
  }
77329
77573
  function tryResolveImageGetAtt(raw, resources, context) {
77330
77574
  if (!raw || typeof raw !== "object")
@@ -77377,228 +77621,6 @@ function extractImageString(value) {
77377
77621
  }
77378
77622
  return void 0;
77379
77623
  }
77380
- function tryResolveImageFnJoin(raw, resources, context) {
77381
- if (!raw || typeof raw !== "object")
77382
- return { kind: "not-applicable" };
77383
- const obj = raw;
77384
- const arg = obj["Fn::Join"];
77385
- if (arg === void 0)
77386
- return { kind: "not-applicable" };
77387
- if (!Array.isArray(arg) || arg.length !== 2 || !Array.isArray(arg[1])) {
77388
- return { kind: "unsupported-join", reason: "Fn::Join must be [delimiter, [elements]]" };
77389
- }
77390
- const [delimiter, elements] = arg;
77391
- if (typeof delimiter !== "string") {
77392
- return {
77393
- kind: "unsupported-join",
77394
- reason: `Fn::Join delimiter must be a string, got ${typeof delimiter}`
77395
- };
77396
- }
77397
- const repoLogicalId = findEcrRepositoryRefInTree(elements, resources);
77398
- const stateResources = context?.stateResources;
77399
- if (repoLogicalId && !stateResources) {
77400
- return { kind: "needs-state", repoLogicalId };
77401
- }
77402
- const parts = [];
77403
- for (const element of elements) {
77404
- const r = resolveImageIntrinsic(element, resources, context);
77405
- if (r === void 0) {
77406
- if (!repoLogicalId)
77407
- return { kind: "not-applicable" };
77408
- return {
77409
- kind: "unsupported-join",
77410
- reason: "one or more Fn::Join elements could not be resolved"
77411
- };
77412
- }
77413
- parts.push(r);
77414
- }
77415
- return { kind: "resolved", uri: parts.join(delimiter) };
77416
- }
77417
- function findEcrRepositoryRefInTree(node, resources) {
77418
- if (node === null || node === void 0)
77419
- return void 0;
77420
- if (typeof node === "string" || typeof node === "number" || typeof node === "boolean") {
77421
- return void 0;
77422
- }
77423
- if (Array.isArray(node)) {
77424
- for (const item of node) {
77425
- const hit = findEcrRepositoryRefInTree(item, resources);
77426
- if (hit)
77427
- return hit;
77428
- }
77429
- return void 0;
77430
- }
77431
- if (typeof node !== "object")
77432
- return void 0;
77433
- const obj = node;
77434
- if (typeof obj["Ref"] === "string") {
77435
- const target = obj["Ref"];
77436
- if (resources[target]?.Type === "AWS::ECR::Repository")
77437
- return target;
77438
- return void 0;
77439
- }
77440
- const getAtt = obj["Fn::GetAtt"];
77441
- if (getAtt !== void 0) {
77442
- let lid;
77443
- if (Array.isArray(getAtt) && typeof getAtt[0] === "string")
77444
- lid = getAtt[0];
77445
- else if (typeof getAtt === "string")
77446
- lid = getAtt.split(".")[0];
77447
- if (lid && resources[lid]?.Type === "AWS::ECR::Repository")
77448
- return lid;
77449
- return void 0;
77450
- }
77451
- for (const value of Object.values(obj)) {
77452
- const hit = findEcrRepositoryRefInTree(value, resources);
77453
- if (hit)
77454
- return hit;
77455
- }
77456
- return void 0;
77457
- }
77458
- function resolveImageIntrinsic(node, resources, context) {
77459
- const v = resolveImageIntrinsicAny(node, resources, context);
77460
- if (typeof v === "string")
77461
- return v;
77462
- if (typeof v === "number" || typeof v === "boolean")
77463
- return String(v);
77464
- return void 0;
77465
- }
77466
- function resolveImageIntrinsicAny(node, resources, context) {
77467
- if (node === null || node === void 0)
77468
- return void 0;
77469
- if (typeof node === "string" || typeof node === "number" || typeof node === "boolean") {
77470
- return node;
77471
- }
77472
- if (Array.isArray(node)) {
77473
- return void 0;
77474
- }
77475
- if (typeof node !== "object")
77476
- return void 0;
77477
- const obj = node;
77478
- const keys = Object.keys(obj);
77479
- if (keys.length !== 1)
77480
- return void 0;
77481
- const intrinsic = keys[0];
77482
- const arg = obj[intrinsic];
77483
- if (intrinsic === "Ref") {
77484
- if (typeof arg !== "string")
77485
- return void 0;
77486
- if (arg.startsWith("AWS::")) {
77487
- const p = context?.pseudoParameters;
77488
- if (!p)
77489
- return void 0;
77490
- if (arg === "AWS::URLSuffix")
77491
- return p.urlSuffix;
77492
- if (arg === "AWS::Partition")
77493
- return p.partition;
77494
- if (arg === "AWS::Region")
77495
- return p.region;
77496
- if (arg === "AWS::AccountId")
77497
- return p.accountId;
77498
- return void 0;
77499
- }
77500
- const refResource = resources[arg];
77501
- if (refResource?.Type !== "AWS::ECR::Repository")
77502
- return void 0;
77503
- const stateEntry = context?.stateResources?.[arg];
77504
- if (!stateEntry)
77505
- return void 0;
77506
- return stateEntry.physicalId;
77507
- }
77508
- if (intrinsic === "Fn::GetAtt") {
77509
- let logicalId;
77510
- let attr;
77511
- if (Array.isArray(arg) && arg.length === 2 && typeof arg[0] === "string" && typeof arg[1] === "string") {
77512
- logicalId = arg[0];
77513
- attr = arg[1];
77514
- } else if (typeof arg === "string") {
77515
- const dot = arg.indexOf(".");
77516
- if (dot > 0 && dot < arg.length - 1) {
77517
- logicalId = arg.slice(0, dot);
77518
- attr = arg.slice(dot + 1);
77519
- }
77520
- }
77521
- if (!logicalId || !attr)
77522
- return void 0;
77523
- if (resources[logicalId]?.Type !== "AWS::ECR::Repository")
77524
- return void 0;
77525
- const cached = context?.stateResources?.[logicalId]?.attributes?.[attr];
77526
- if (typeof cached === "string" && cached.length > 0)
77527
- return cached;
77528
- return void 0;
77529
- }
77530
- if (intrinsic === "Fn::Split") {
77531
- if (!Array.isArray(arg) || arg.length !== 2)
77532
- return void 0;
77533
- const argArr = arg;
77534
- const delim = argArr[0];
77535
- if (typeof delim !== "string")
77536
- return void 0;
77537
- const src = resolveImageIntrinsicAny(argArr[1], resources, context);
77538
- if (typeof src !== "string")
77539
- return void 0;
77540
- return src.split(delim);
77541
- }
77542
- if (intrinsic === "Fn::Select") {
77543
- if (!Array.isArray(arg) || arg.length !== 2)
77544
- return void 0;
77545
- const argArr = arg;
77546
- const rawIndex = argArr[0];
77547
- let index;
77548
- if (typeof rawIndex === "number") {
77549
- index = rawIndex;
77550
- } else if (typeof rawIndex === "string" && /^-?\d+$/.test(rawIndex)) {
77551
- index = Number.parseInt(rawIndex, 10);
77552
- }
77553
- if (index === void 0 || !Number.isFinite(index))
77554
- return void 0;
77555
- const list = resolveImageIntrinsicAny(argArr[1], resources, context);
77556
- if (Array.isArray(list)) {
77557
- if (index < 0 || index >= list.length)
77558
- return void 0;
77559
- const picked = list[index];
77560
- if (typeof picked === "string")
77561
- return picked;
77562
- return void 0;
77563
- }
77564
- if (Array.isArray(argArr[1])) {
77565
- const listLiteral = argArr[1];
77566
- if (index < 0 || index >= listLiteral.length)
77567
- return void 0;
77568
- return resolveImageIntrinsic(listLiteral[index], resources, context);
77569
- }
77570
- return void 0;
77571
- }
77572
- if (intrinsic === "Fn::Join") {
77573
- if (!Array.isArray(arg) || arg.length !== 2)
77574
- return void 0;
77575
- const [delim, parts] = arg;
77576
- if (typeof delim !== "string" || !Array.isArray(parts))
77577
- return void 0;
77578
- const resolved = [];
77579
- for (const part of parts) {
77580
- const r = resolveImageIntrinsic(part, resources, context);
77581
- if (r === void 0)
77582
- return void 0;
77583
- resolved.push(r);
77584
- }
77585
- return resolved.join(delim);
77586
- }
77587
- if (intrinsic === "Fn::Sub") {
77588
- let template;
77589
- if (typeof arg === "string")
77590
- template = arg;
77591
- else if (Array.isArray(arg) && typeof arg[0] === "string")
77592
- template = arg[0];
77593
- if (template === void 0)
77594
- return void 0;
77595
- const out = substituteImagePlaceholders(template, resources, context);
77596
- if (out.includes("${"))
77597
- return void 0;
77598
- return out;
77599
- }
77600
- return void 0;
77601
- }
77602
77624
  function parseVolume(raw, idx, taskLogicalId) {
77603
77625
  if (!raw || typeof raw !== "object") {
77604
77626
  throw new EcsTaskResolutionError(`Task '${taskLogicalId}' Volumes[${idx}] is not an object.`);
@@ -80286,7 +80308,7 @@ function reorderArgs(argv) {
80286
80308
  }
80287
80309
  async function main() {
80288
80310
  const program = new Command18();
80289
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.91.1");
80311
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.91.2");
80290
80312
  program.addCommand(createBootstrapCommand());
80291
80313
  program.addCommand(createSynthCommand());
80292
80314
  program.addCommand(createListCommand());