@go-to-k/cdkd 0.132.3 → 0.132.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +172 -73
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -41767,6 +41767,23 @@ function compareValues(lhs, rhs, op) {
|
|
|
41767
41767
|
case ">=": return sa >= sb;
|
|
41768
41768
|
}
|
|
41769
41769
|
}
|
|
41770
|
+
/**
|
|
41771
|
+
* `==` / `!=` semantics for the VTL evaluator. Mirrors Apache Velocity's
|
|
41772
|
+
* lenient equality: same-type primitives compare via `===`; nested objects
|
|
41773
|
+
* / arrays compare structurally via canonical JSON; cross-type pairs (the
|
|
41774
|
+
* common case in AWS API Gateway templates, e.g. `#if($x == "true")` where
|
|
41775
|
+
* `$x` is a boolean from `$input.json('$.flag')`) fall back to comparing
|
|
41776
|
+
* each side coerced through {@link safeStringify}. The cross-type fall-back
|
|
41777
|
+
* is what Velocity itself does in this context, NOT JavaScript's
|
|
41778
|
+
* `==` operator (which has its own well-known foot-guns around `null` /
|
|
41779
|
+
* `undefined` / `NaN`). See the Velocity reference for the canonical
|
|
41780
|
+
* semantics: <https://velocity.apache.org/engine/2.0/vtl-reference.html#a3.4.4.RelationalOperators>
|
|
41781
|
+
* (look for the "Equivalent" / "Not Equivalent" rows).
|
|
41782
|
+
*
|
|
41783
|
+
* Both `null` and `undefined` collapse to a single sentinel — two
|
|
41784
|
+
* unset variables are considered equal. This matches Velocity's lenient
|
|
41785
|
+
* `null` handling (Issue (#507) item 8).
|
|
41786
|
+
*/
|
|
41770
41787
|
function looseEqual(a, b) {
|
|
41771
41788
|
if (a === b) return true;
|
|
41772
41789
|
if (a == null || b == null) return a == null && b == null;
|
|
@@ -41807,6 +41824,19 @@ function isTruthy(v) {
|
|
|
41807
41824
|
* `json(jsonPath)` returns a JSON-stringified slice of the parsed body;
|
|
41808
41825
|
* `path(jsonPath)` returns the raw native value (primitives unquoted).
|
|
41809
41826
|
*
|
|
41827
|
+
* Case-sensitivity contract (Issue (#507) item 5; mirrored on the write
|
|
41828
|
+
* side by `rest-v1-integrations.ts` `resolveRequestParameterValue` /
|
|
41829
|
+
* `applyRequestParameters`):
|
|
41830
|
+
*
|
|
41831
|
+
* - `$input.params('<name>')` resolves PATH (case-sensitive) →
|
|
41832
|
+
* QUERYSTRING (case-sensitive, last-wins on duplicates) → HEADER
|
|
41833
|
+
* (case-insensitive — first the input's pre-lowercased map, then a
|
|
41834
|
+
* last-resort case-insensitive scan; multi-value duplicates are
|
|
41835
|
+
* comma-joined by the http-server before reaching VTL).
|
|
41836
|
+
* - `$input.params('header')` / `$input.params('querystring')` /
|
|
41837
|
+
* `$input.params('path')` return the raw category maps without
|
|
41838
|
+
* case-folding the keys further.
|
|
41839
|
+
*
|
|
41810
41840
|
* JSONPath support is minimal: supports `$` (root), `$.field`,
|
|
41811
41841
|
* `$.field.subField`, `$.array[0]`. AWS supports more (filter
|
|
41812
41842
|
* expressions, recursive descent); cdkd surfaces a clear error on
|
|
@@ -41815,20 +41845,24 @@ function isTruthy(v) {
|
|
|
41815
41845
|
function buildVtlInput(body, headers, querystring, pathParams) {
|
|
41816
41846
|
let jsonBodyCache;
|
|
41817
41847
|
let jsonBodyParsed = false;
|
|
41818
|
-
|
|
41848
|
+
let jsonBodyParseError = false;
|
|
41849
|
+
function lazyJson(opts) {
|
|
41819
41850
|
if (!jsonBodyParsed) {
|
|
41820
41851
|
jsonBodyParsed = true;
|
|
41821
|
-
|
|
41822
|
-
|
|
41852
|
+
if (body.length === 0) jsonBodyCache = null;
|
|
41853
|
+
else try {
|
|
41854
|
+
jsonBodyCache = JSON.parse(body);
|
|
41823
41855
|
} catch {
|
|
41824
41856
|
jsonBodyCache = null;
|
|
41857
|
+
jsonBodyParseError = true;
|
|
41825
41858
|
}
|
|
41826
41859
|
}
|
|
41860
|
+
if (jsonBodyParseError && opts?.throwOnParseError) throw new VtlEvaluationError("$input.json(...) cannot be evaluated: request body is not valid JSON. On AWS API Gateway this surface returns HTTP 400 with {\"message\":\"Invalid JSON request body\"}; use $input.body or $input.path(...) when the upstream may emit non-JSON content.");
|
|
41827
41861
|
return jsonBodyCache;
|
|
41828
41862
|
}
|
|
41829
41863
|
function jsonFn(...args) {
|
|
41830
41864
|
const expr = args.length > 0 ? String(args[0]) : "$";
|
|
41831
|
-
const val = applyJsonPath(lazyJson(), expr);
|
|
41865
|
+
const val = applyJsonPath(lazyJson({ throwOnParseError: true }), expr);
|
|
41832
41866
|
return JSON.stringify(val ?? null);
|
|
41833
41867
|
}
|
|
41834
41868
|
function pathFn(...args) {
|
|
@@ -41968,12 +42002,17 @@ function selectIntegrationResponse(entries, matchTarget, fallbackStatusCode = 20
|
|
|
41968
42002
|
};
|
|
41969
42003
|
}
|
|
41970
42004
|
function parseStatus$1(raw, fallback) {
|
|
41971
|
-
if (typeof raw === "number"
|
|
41972
|
-
|
|
41973
|
-
|
|
41974
|
-
|
|
41975
|
-
|
|
41976
|
-
|
|
42005
|
+
if (typeof raw === "number") {
|
|
42006
|
+
if (Number.isInteger(raw) && raw >= 100 && raw < 600) return raw;
|
|
42007
|
+
return fallback;
|
|
42008
|
+
}
|
|
42009
|
+
if (typeof raw !== "string") return fallback;
|
|
42010
|
+
const trimmed = raw.trim();
|
|
42011
|
+
if (trimmed === "") return fallback;
|
|
42012
|
+
const parsed = Number(trimmed);
|
|
42013
|
+
if (!Number.isInteger(parsed)) return fallback;
|
|
42014
|
+
if (parsed < 100 || parsed >= 600) return fallback;
|
|
42015
|
+
return parsed;
|
|
41977
42016
|
}
|
|
41978
42017
|
/**
|
|
41979
42018
|
* Evaluate `IntegrationResponse.ResponseParameters` — header literals
|
|
@@ -41985,6 +42024,17 @@ function parseStatus$1(raw, fallback) {
|
|
|
41985
42024
|
* are `'literal'` (with single quotes) or mapping expressions
|
|
41986
42025
|
* (`integration.response.body.X` / `integration.response.header.X` /
|
|
41987
42026
|
* `context.X`). cdkd v1 supports the literal form only.
|
|
42027
|
+
*
|
|
42028
|
+
* PR #511 review fix-back: header names are lowercased here so the
|
|
42029
|
+
* returned map shares the same key namespace as the dispatcher's
|
|
42030
|
+
* default-initialized headers (`{'content-type': '...'}`). Without
|
|
42031
|
+
* normalization a template that sets `Content-Type` PascalCase via
|
|
42032
|
+
* ResponseParameters produced a headers object carrying BOTH
|
|
42033
|
+
* `'content-type': 'application/json'` (default) AND
|
|
42034
|
+
* `'Content-Type': 'text/xml'` (overlay), which downstream HTTP
|
|
42035
|
+
* serialization rendered as two conflicting headers — AWS-deployed
|
|
42036
|
+
* only ever returns one. By lowercasing every key, overlays simply
|
|
42037
|
+
* overwrite the default-initializer entry like AWS does.
|
|
41988
42038
|
*/
|
|
41989
42039
|
function evaluateResponseParameters(responseParameters, opts = {}) {
|
|
41990
42040
|
if (!responseParameters) return {};
|
|
@@ -41995,7 +42045,7 @@ function evaluateResponseParameters(responseParameters, opts = {}) {
|
|
|
41995
42045
|
opts.onUnsupported?.(key, value, `Only method.response.header.<name> keys are supported on REST v1 ResponseParameters; cdkd cannot map ${key}.`);
|
|
41996
42046
|
continue;
|
|
41997
42047
|
}
|
|
41998
|
-
const headerName = headerMatch[1];
|
|
42048
|
+
const headerName = headerMatch[1].toLowerCase();
|
|
41999
42049
|
if (typeof value !== "string") {
|
|
42000
42050
|
opts.onUnsupported?.(key, String(value), `non-string ResponseParameter value`);
|
|
42001
42051
|
continue;
|
|
@@ -42091,6 +42141,7 @@ function dispatchMockIntegration(config, req) {
|
|
|
42091
42141
|
}
|
|
42092
42142
|
const headers = { "content-type": contentType };
|
|
42093
42143
|
Object.assign(headers, evaluateResponseParameters(entry.ResponseParameters, { onUnsupported: (_k, _v, reason) => logger.warn(`MOCK response: ${reason}`) }));
|
|
42144
|
+
if (body === "" && headers["content-type"] === contentType) delete headers["content-type"];
|
|
42094
42145
|
return {
|
|
42095
42146
|
statusCode: parseStatus(entry.StatusCode) ?? 200,
|
|
42096
42147
|
headers,
|
|
@@ -42113,10 +42164,7 @@ async function dispatchHttpProxyIntegration(config, req, deps) {
|
|
|
42113
42164
|
"content-length",
|
|
42114
42165
|
"transfer-encoding"
|
|
42115
42166
|
]) delete outHeaders[drop];
|
|
42116
|
-
applyRequestParameters(config.requestParameters, req, {
|
|
42117
|
-
headers: outHeaders,
|
|
42118
|
-
urlObj: void 0
|
|
42119
|
-
});
|
|
42167
|
+
applyRequestParameters(config.requestParameters, req, { headers: outHeaders });
|
|
42120
42168
|
const fetchImpl = deps.fetch ?? globalThis.fetch;
|
|
42121
42169
|
const fetchInit = {
|
|
42122
42170
|
method,
|
|
@@ -42184,10 +42232,7 @@ async function dispatchHttpIntegration(config, req, deps) {
|
|
|
42184
42232
|
"content-length",
|
|
42185
42233
|
"transfer-encoding"
|
|
42186
42234
|
]) delete outHeaders[drop];
|
|
42187
|
-
applyRequestParameters(config.requestParameters, req, {
|
|
42188
|
-
headers: outHeaders,
|
|
42189
|
-
urlObj: void 0
|
|
42190
|
-
});
|
|
42235
|
+
applyRequestParameters(config.requestParameters, req, { headers: outHeaders });
|
|
42191
42236
|
const fetchImpl = deps.fetch ?? globalThis.fetch;
|
|
42192
42237
|
const fetchInit = {
|
|
42193
42238
|
method,
|
|
@@ -42282,46 +42327,48 @@ async function dispatchAwsLambdaIntegration(config, req, deps) {
|
|
|
42282
42327
|
})
|
|
42283
42328
|
};
|
|
42284
42329
|
}
|
|
42285
|
-
let invokeOutcome;
|
|
42286
42330
|
try {
|
|
42287
|
-
invokeOutcome
|
|
42288
|
-
|
|
42289
|
-
|
|
42331
|
+
let invokeOutcome;
|
|
42332
|
+
try {
|
|
42333
|
+
invokeOutcome = await invokeRie(handle.containerHost, handle.hostPort, eventPayload, deps.rieTimeoutMs);
|
|
42334
|
+
} catch (err) {
|
|
42335
|
+
return {
|
|
42336
|
+
statusCode: 502,
|
|
42337
|
+
headers: { "content-type": "application/json" },
|
|
42338
|
+
body: JSON.stringify({
|
|
42339
|
+
message: "AWS Lambda non-proxy invocation failed",
|
|
42340
|
+
reason: err instanceof Error ? err.message : String(err)
|
|
42341
|
+
})
|
|
42342
|
+
};
|
|
42343
|
+
}
|
|
42344
|
+
const payload = invokeOutcome.payload;
|
|
42345
|
+
const isError = payload !== null && typeof payload === "object" && "errorMessage" in payload;
|
|
42346
|
+
const matchTarget = isError ? String(payload["errorMessage"]) : "success";
|
|
42347
|
+
const selected = selectIntegrationResponse(config.responses, matchTarget, isError ? 500 : 200);
|
|
42348
|
+
const respCtx = buildVtlContextFromRequest(req, JSON.stringify(payload ?? null), payload);
|
|
42349
|
+
let body = "";
|
|
42350
|
+
let contentType = "application/json";
|
|
42351
|
+
if (selected.entry) {
|
|
42352
|
+
const picked = pickResponseTemplate(selected.entry.ResponseTemplates, req.headers["accept"]);
|
|
42353
|
+
if (picked) {
|
|
42354
|
+
try {
|
|
42355
|
+
body = evaluateVtl(picked.template, respCtx);
|
|
42356
|
+
} catch (err) {
|
|
42357
|
+
return vtlFailure("response", err, picked.template);
|
|
42358
|
+
}
|
|
42359
|
+
contentType = picked.contentType;
|
|
42360
|
+
} else body = JSON.stringify(payload ?? null);
|
|
42361
|
+
} else body = JSON.stringify(payload ?? null);
|
|
42362
|
+
const headers = { "content-type": contentType };
|
|
42363
|
+
Object.assign(headers, evaluateResponseParameters(selected.entry?.ResponseParameters, { onUnsupported: (_k, _v, reason) => logger.warn(`AWS Lambda non-proxy response: ${reason}`) }));
|
|
42290
42364
|
return {
|
|
42291
|
-
statusCode:
|
|
42292
|
-
headers
|
|
42293
|
-
body
|
|
42294
|
-
message: "AWS Lambda non-proxy invocation failed",
|
|
42295
|
-
reason: err instanceof Error ? err.message : String(err)
|
|
42296
|
-
})
|
|
42365
|
+
statusCode: selected.statusCode,
|
|
42366
|
+
headers,
|
|
42367
|
+
body
|
|
42297
42368
|
};
|
|
42369
|
+
} finally {
|
|
42370
|
+
deps.pool.release(handle);
|
|
42298
42371
|
}
|
|
42299
|
-
deps.pool.release(handle);
|
|
42300
|
-
const payload = invokeOutcome.payload;
|
|
42301
|
-
const isError = payload !== null && typeof payload === "object" && "errorMessage" in payload;
|
|
42302
|
-
const matchTarget = isError ? String(payload["errorMessage"]) : "success";
|
|
42303
|
-
const selected = selectIntegrationResponse(config.responses, matchTarget, isError ? 500 : 200);
|
|
42304
|
-
const respCtx = buildVtlContextFromRequest(req, JSON.stringify(payload ?? null), payload);
|
|
42305
|
-
let body = "";
|
|
42306
|
-
let contentType = "application/json";
|
|
42307
|
-
if (selected.entry) {
|
|
42308
|
-
const picked = pickResponseTemplate(selected.entry.ResponseTemplates, req.headers["accept"]);
|
|
42309
|
-
if (picked) {
|
|
42310
|
-
try {
|
|
42311
|
-
body = evaluateVtl(picked.template, respCtx);
|
|
42312
|
-
} catch (err) {
|
|
42313
|
-
return vtlFailure("response", err, picked.template);
|
|
42314
|
-
}
|
|
42315
|
-
contentType = picked.contentType;
|
|
42316
|
-
} else body = JSON.stringify(payload ?? null);
|
|
42317
|
-
} else body = JSON.stringify(payload ?? null);
|
|
42318
|
-
const headers = { "content-type": contentType };
|
|
42319
|
-
Object.assign(headers, evaluateResponseParameters(selected.entry?.ResponseParameters, { onUnsupported: (_k, _v, reason) => logger.warn(`AWS Lambda non-proxy response: ${reason}`) }));
|
|
42320
|
-
return {
|
|
42321
|
-
statusCode: selected.statusCode,
|
|
42322
|
-
headers,
|
|
42323
|
-
body
|
|
42324
|
-
};
|
|
42325
42372
|
}
|
|
42326
42373
|
function buildVtlContextFromRequest(req, body, inputRoot) {
|
|
42327
42374
|
return {
|
|
@@ -42362,29 +42409,57 @@ function pickRequestTemplate(requestTemplates, contentType) {
|
|
|
42362
42409
|
/**
|
|
42363
42410
|
* Extract `{"statusCode": <N>}` from a rendered MOCK request template.
|
|
42364
42411
|
* AWS uses this single key to drive `IntegrationResponses[]` selection.
|
|
42412
|
+
*
|
|
42413
|
+
* Returns `undefined` when the rendered template is not JSON OR does not
|
|
42414
|
+
* carry a `{statusCode: N}` object OR the value is not a positive integer
|
|
42415
|
+
* (Issue (#507) item 6 — `Number.isInteger` rejects `"200abc"` /
|
|
42416
|
+
* fractional values that `Number.parseInt` would silently accept). On any
|
|
42417
|
+
* fallback case the caller falls back to the default `IntegrationResponses[]`
|
|
42418
|
+
* entry. The fallback path is logged at debug (Issue (#507) item 3) so
|
|
42419
|
+
* users diagnosing a MOCK dispatch see what AWS would have seen.
|
|
42365
42420
|
*/
|
|
42366
42421
|
function extractStatusCodeFromRendered(rendered) {
|
|
42422
|
+
const logFallback = (reason) => {
|
|
42423
|
+
const truncated = rendered.length > 200 ? rendered.slice(0, 200) + "..." : rendered;
|
|
42424
|
+
getLogger().child("start-api").debug(`MOCK request template did not yield a statusCode selection driver (${reason}); falling back to the default IntegrationResponses[] entry. Rendered output: ${truncated}`);
|
|
42425
|
+
};
|
|
42426
|
+
let parsed;
|
|
42367
42427
|
try {
|
|
42368
|
-
|
|
42369
|
-
|
|
42370
|
-
|
|
42371
|
-
|
|
42372
|
-
|
|
42373
|
-
|
|
42374
|
-
|
|
42375
|
-
|
|
42376
|
-
}
|
|
42377
|
-
}
|
|
42428
|
+
parsed = JSON.parse(rendered);
|
|
42429
|
+
} catch {
|
|
42430
|
+
return logFallback("rendered output is not valid JSON");
|
|
42431
|
+
}
|
|
42432
|
+
if (!parsed || typeof parsed !== "object" || !("statusCode" in parsed)) return logFallback("rendered output has no statusCode field");
|
|
42433
|
+
const val = parsed["statusCode"];
|
|
42434
|
+
if (typeof val === "number") {
|
|
42435
|
+
if (Number.isInteger(val) && val >= 100 && val < 600) return val;
|
|
42436
|
+
return logFallback(`statusCode ${val} is out of HTTP range [100, 600)`);
|
|
42437
|
+
}
|
|
42438
|
+
if (typeof val === "string") {
|
|
42439
|
+
const trimmed = val.trim();
|
|
42440
|
+
if (trimmed === "") return logFallback("statusCode is empty / whitespace");
|
|
42441
|
+
const n = Number(trimmed);
|
|
42442
|
+
if (!Number.isInteger(n)) return logFallback(`statusCode '${val}' is not a valid integer`);
|
|
42443
|
+
if (n < 100 || n >= 600) return logFallback(`statusCode ${n} is out of HTTP range [100, 600)`);
|
|
42444
|
+
return n;
|
|
42445
|
+
}
|
|
42446
|
+
return logFallback(`statusCode has unexpected type '${typeof val}'`);
|
|
42378
42447
|
}
|
|
42379
42448
|
function defaultResponseEntry(entries) {
|
|
42380
42449
|
return entries.find((e) => e.SelectionPattern === void 0 || e.SelectionPattern === "") ?? null;
|
|
42381
42450
|
}
|
|
42382
42451
|
function parseStatus(raw) {
|
|
42383
|
-
if (typeof raw === "number"
|
|
42384
|
-
|
|
42385
|
-
|
|
42386
|
-
if (Number.isFinite(n)) return n;
|
|
42452
|
+
if (typeof raw === "number") {
|
|
42453
|
+
if (Number.isInteger(raw) && raw >= 100 && raw < 600) return raw;
|
|
42454
|
+
return;
|
|
42387
42455
|
}
|
|
42456
|
+
if (typeof raw !== "string") return void 0;
|
|
42457
|
+
const trimmed = raw.trim();
|
|
42458
|
+
if (trimmed === "") return void 0;
|
|
42459
|
+
const n = Number(trimmed);
|
|
42460
|
+
if (!Number.isInteger(n)) return void 0;
|
|
42461
|
+
if (n < 100 || n >= 600) return void 0;
|
|
42462
|
+
return n;
|
|
42388
42463
|
}
|
|
42389
42464
|
/**
|
|
42390
42465
|
* Heuristic: is the given HTTP `Content-Type` header value likely to
|
|
@@ -42463,10 +42538,12 @@ function safeJsonParse(s) {
|
|
|
42463
42538
|
*
|
|
42464
42539
|
* Supported key shapes:
|
|
42465
42540
|
* - `integration.request.header.<name>` → outgoing header
|
|
42466
|
-
* - `integration.request.querystring.<name>` → query string param
|
|
42467
|
-
* - `integration.request.path.<name>` → path placeholder substitution
|
|
42541
|
+
* - `integration.request.querystring.<name>` → query string param (warn-and-skip)
|
|
42542
|
+
* - `integration.request.path.<name>` → path placeholder substitution (warn-and-skip)
|
|
42468
42543
|
*
|
|
42469
|
-
* Supported value shapes
|
|
42544
|
+
* Supported value shapes (header case-insensitive + multi-value comma-joined,
|
|
42545
|
+
* querystring case-sensitive + last-wins; see {@link resolveRequestParameterValue}
|
|
42546
|
+
* and `vtl-engine.ts` `$input.params` for the matching read-side semantics):
|
|
42470
42547
|
* - `method.request.header.<name>` → read incoming header
|
|
42471
42548
|
* - `method.request.querystring.<name>` → read incoming query param
|
|
42472
42549
|
* - `method.request.path.<name>` → read path parameter
|
|
@@ -42474,6 +42551,12 @@ function safeJsonParse(s) {
|
|
|
42474
42551
|
*
|
|
42475
42552
|
* Unsupported mapping expressions are logged at warn and skipped (matches
|
|
42476
42553
|
* the ResponseParameters handling in `integration-response-selector.ts`).
|
|
42554
|
+
*
|
|
42555
|
+
* Note: querystring / path-rewrite branches currently warn-and-skip; cdkd
|
|
42556
|
+
* relies on `{paramName}` URI substitution for the canonical case (see
|
|
42557
|
+
* {@link substituteUriPlaceholders}). The previous `urlObj` parameter was
|
|
42558
|
+
* never used by the unimplemented querystring rewrite branch and has been
|
|
42559
|
+
* dropped (Issue (#507) item 2).
|
|
42477
42560
|
*/
|
|
42478
42561
|
function applyRequestParameters(requestParameters, req, out) {
|
|
42479
42562
|
if (!requestParameters) return;
|
|
@@ -42493,6 +42576,22 @@ function applyRequestParameters(requestParameters, req, out) {
|
|
|
42493
42576
|
else logger.warn(`Unsupported RequestParameter key '${key}'; skipping.`);
|
|
42494
42577
|
}
|
|
42495
42578
|
}
|
|
42579
|
+
/**
|
|
42580
|
+
* Resolve a single `RequestParameters` value to a string.
|
|
42581
|
+
*
|
|
42582
|
+
* Case-sensitivity contract (Issue (#507) item 5; mirrored on the VTL
|
|
42583
|
+
* read side by `vtl-engine.ts` `$input.params`):
|
|
42584
|
+
*
|
|
42585
|
+
* - Header lookups are **case-insensitive** (the incoming-header map is
|
|
42586
|
+
* pre-lowercased by the http-server) and multi-value duplicates are
|
|
42587
|
+
* comma-joined.
|
|
42588
|
+
* - Querystring lookups are **case-sensitive** (matches AWS API Gateway's
|
|
42589
|
+
* deployed behavior) and multi-value duplicates surface only the
|
|
42590
|
+
* last-wins string (the http-server's request snapshot collapses
|
|
42591
|
+
* duplicates at parse time).
|
|
42592
|
+
* - Path parameters are case-sensitive (CFn template `{paramName}`
|
|
42593
|
+
* placeholders are case-sensitive by construction).
|
|
42594
|
+
*/
|
|
42496
42595
|
function resolveRequestParameterValue(raw, req) {
|
|
42497
42596
|
if (raw.length >= 2 && raw.startsWith("'") && raw.endsWith("'")) return raw.slice(1, -1);
|
|
42498
42597
|
const headerMatch = /^method\.request\.header\.(.+)$/.exec(raw);
|
|
@@ -51774,7 +51873,7 @@ function reorderArgs(argv) {
|
|
|
51774
51873
|
*/
|
|
51775
51874
|
async function main() {
|
|
51776
51875
|
const program = new Command();
|
|
51777
|
-
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.132.
|
|
51876
|
+
program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.132.4");
|
|
51778
51877
|
program.addCommand(createBootstrapCommand());
|
|
51779
51878
|
program.addCommand(createSynthCommand());
|
|
51780
51879
|
program.addCommand(createListCommand());
|