local-serverless-stack 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -3
- package/README.md +75 -26
- package/bin/cli.js +81 -15
- package/bin/i18n.js +30 -3
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/namespaces/services.d.ts +46 -0
- package/dist/client/namespaces/services.d.ts.map +1 -1
- package/dist/client/namespaces/services.js +1 -0
- package/dist/client/namespaces/services.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +17 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/server/engine/backends/self-backend.d.ts +26 -1
- package/dist/server/engine/backends/self-backend.d.ts.map +1 -1
- package/dist/server/engine/backends/self-backend.js +104 -11
- package/dist/server/engine/backends/self-backend.js.map +1 -1
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -1
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js +12 -1
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -1
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.d.ts +3 -0
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.js +78 -0
- package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts +11 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -1
- package/dist/server/engine/emulators/dynamodb/index.js +101 -7
- package/dist/server/engine/emulators/dynamodb/index.js.map +1 -1
- package/dist/server/engine/emulators/dynamodb/query.d.ts +1 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -1
- package/dist/server/engine/emulators/dynamodb/query.js +34 -6
- package/dist/server/engine/emulators/dynamodb/query.js.map +1 -1
- package/dist/server/engine/emulators/s3/index.d.ts +10 -0
- package/dist/server/engine/emulators/s3/index.d.ts.map +1 -1
- package/dist/server/engine/emulators/s3/index.js +369 -25
- package/dist/server/engine/emulators/s3/index.js.map +1 -1
- package/dist/server/engine/emulators/sqs/index.d.ts +2 -0
- package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -1
- package/dist/server/engine/emulators/sqs/index.js +70 -7
- package/dist/server/engine/emulators/sqs/index.js.map +1 -1
- package/dist/server/engine/emulators/sqs/queue.d.ts +2 -1
- package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -1
- package/dist/server/engine/emulators/sqs/queue.js +68 -35
- package/dist/server/engine/emulators/sqs/queue.js.map +1 -1
- package/dist/server/engine/emulators/ssm/index.d.ts +31 -0
- package/dist/server/engine/emulators/ssm/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/ssm/index.js +670 -0
- package/dist/server/engine/emulators/ssm/index.js.map +1 -0
- package/dist/server/engine/http/errors.d.ts +1 -0
- package/dist/server/engine/http/errors.d.ts.map +1 -1
- package/dist/server/engine/http/errors.js +13 -5
- package/dist/server/engine/http/errors.js.map +1 -1
- package/dist/server/engine/http/is-aws-request.d.ts.map +1 -1
- package/dist/server/engine/http/is-aws-request.js +13 -3
- package/dist/server/engine/http/is-aws-request.js.map +1 -1
- package/dist/server/engine/http/protocols/aws-json.d.ts +1 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -1
- package/dist/server/engine/http/protocols/aws-json.js +13 -0
- package/dist/server/engine/http/protocols/aws-json.js.map +1 -1
- package/dist/server/engine/http/reset.d.ts +4 -0
- package/dist/server/engine/http/reset.d.ts.map +1 -0
- package/dist/server/engine/http/reset.js +17 -0
- package/dist/server/engine/http/reset.js.map +1 -0
- package/dist/server/engine/http/router.d.ts +1 -0
- package/dist/server/engine/http/router.d.ts.map +1 -1
- package/dist/server/engine/http/router.js +185 -34
- package/dist/server/engine/http/router.js.map +1 -1
- package/dist/server/engine/types.d.ts +2 -1
- package/dist/server/engine/types.d.ts.map +1 -1
- package/dist/server/routes/apis.d.ts.map +1 -1
- package/dist/server/routes/apis.js +6 -0
- package/dist/server/routes/apis.js.map +1 -1
- package/dist/server/routes/config.d.ts.map +1 -1
- package/dist/server/routes/config.js +19 -1
- package/dist/server/routes/config.js.map +1 -1
- package/dist/server/routes/services.d.ts.map +1 -1
- package/dist/server/routes/services.js +49 -1
- package/dist/server/routes/services.js.map +1 -1
- package/dist/server/runtime/runtime-worker.js +33 -3
- package/dist/server/runtime/runtime-worker.js.map +1 -1
- package/dist/server/services/api-gateway-events.d.ts +14 -0
- package/dist/server/services/api-gateway-events.d.ts.map +1 -1
- package/dist/server/services/api-gateway-events.js +114 -8
- package/dist/server/services/api-gateway-events.js.map +1 -1
- package/dist/server/services/artifact-staleness.d.ts +20 -0
- package/dist/server/services/artifact-staleness.d.ts.map +1 -0
- package/dist/server/services/artifact-staleness.js +115 -0
- package/dist/server/services/artifact-staleness.js.map +1 -0
- package/dist/server/services/authorizer-service.d.ts +34 -5
- package/dist/server/services/authorizer-service.d.ts.map +1 -1
- package/dist/server/services/authorizer-service.js +0 -0
- package/dist/server/services/authorizer-service.js.map +1 -1
- package/dist/server/services/cfn-intrinsics.d.ts +63 -0
- package/dist/server/services/cfn-intrinsics.d.ts.map +1 -0
- package/dist/server/services/cfn-intrinsics.js +403 -0
- package/dist/server/services/cfn-intrinsics.js.map +1 -0
- package/dist/server/services/cfn-physical-values.d.ts +51 -0
- package/dist/server/services/cfn-physical-values.d.ts.map +1 -0
- package/dist/server/services/cfn-physical-values.js +186 -0
- package/dist/server/services/cfn-physical-values.js.map +1 -0
- package/dist/server/services/cloudformation-parser.d.ts +26 -3
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
- package/dist/server/services/cloudformation-parser.js +76 -4
- package/dist/server/services/cloudformation-parser.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +24 -2
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +60 -7
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/gateway-manager.d.ts.map +1 -1
- package/dist/server/services/gateway-manager.js +52 -20
- package/dist/server/services/gateway-manager.js.map +1 -1
- package/dist/server/services/lambda-runtime-manager.d.ts +1 -0
- package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -1
- package/dist/server/services/lambda-runtime-manager.js +36 -14
- package/dist/server/services/lambda-runtime-manager.js.map +1 -1
- package/dist/server/services/raw-api-assembler.d.ts +1 -1
- package/dist/server/services/raw-api-assembler.d.ts.map +1 -1
- package/dist/server/services/raw-api-assembler.js +18 -8
- package/dist/server/services/raw-api-assembler.js.map +1 -1
- package/dist/server/services/resource-provisioner.d.ts +12 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +128 -13
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/serverless-state-parser.d.ts +45 -2
- package/dist/server/services/serverless-state-parser.d.ts.map +1 -1
- package/dist/server/services/serverless-state-parser.js +217 -29
- package/dist/server/services/serverless-state-parser.js.map +1 -1
- package/dist/server/services/service-graph.d.ts +76 -0
- package/dist/server/services/service-graph.d.ts.map +1 -0
- package/dist/server/services/service-graph.js +914 -0
- package/dist/server/services/service-graph.js.map +1 -0
- package/dist/server/services/service-registrar.d.ts +4 -0
- package/dist/server/services/service-registrar.d.ts.map +1 -1
- package/dist/server/services/service-registrar.js +129 -55
- package/dist/server/services/service-registrar.js.map +1 -1
- package/dist/server/services/source-watcher.d.ts +1 -0
- package/dist/server/services/source-watcher.d.ts.map +1 -1
- package/dist/server/services/source-watcher.js +19 -1
- package/dist/server/services/source-watcher.js.map +1 -1
- package/dist/server/services/worker-runtime.d.ts +82 -0
- package/dist/server/services/worker-runtime.d.ts.map +1 -0
- package/dist/server/services/worker-runtime.js +303 -0
- package/dist/server/services/worker-runtime.js.map +1 -0
- package/dist/ui/assets/{ApisPage-CTOcNna-.js → ApisPage-BkW-QZ0X.js} +1 -1
- package/dist/ui/assets/BucketDetailPage-CJwTQJh7.js +1 -0
- package/dist/ui/assets/BucketsPage-B1xPVhZC.js +1 -0
- package/dist/ui/assets/{DynamoPage-BnFFKnIU.js → DynamoPage-DvbpwZDc.js} +1 -1
- package/dist/ui/assets/DynamoTablePage-xn3Lq3so.js +3 -0
- package/dist/ui/assets/LambdaDetailPage-BhUyO77H.js +4 -0
- package/dist/ui/assets/{LambdasPage-Bg-MWFBb.js → LambdasPage-CUF_4rOH.js} +1 -1
- package/dist/ui/assets/OnboardingPage-U49THUzu.js +1 -0
- package/dist/ui/assets/OpenSearchCollectionPage-BJTVNCq4.js +1 -0
- package/dist/ui/assets/OpenSearchPage-4s-egkB9.js +1 -0
- package/dist/ui/assets/OverviewPage-DJeJQktG.js +1 -0
- package/dist/ui/assets/{OverviewPage-CSWY71vZ.css → OverviewPage-DjQETmb_.css} +1 -1
- package/dist/ui/assets/QueueDetailPage-DWsy5Yt8.js +1 -0
- package/dist/ui/assets/QueuesPage-BZJSqman.js +1 -0
- package/dist/ui/assets/SecretsPage-YC9ua54G.js +1 -0
- package/dist/ui/assets/ServiceDetailPage-Cum5frP4.js +2 -0
- package/dist/ui/assets/ServicesPage-IpaPDuqx.js +2 -0
- package/dist/ui/assets/SettingsPage-BiCRU8O6.js +1 -0
- package/dist/ui/assets/index-BDlrAJhi.css +1 -0
- package/dist/ui/assets/index-BouKSS43.js +38 -0
- package/dist/ui/assets/resourceIcons-DZs28nbs.js +1 -0
- package/dist/ui/index.html +5 -2
- package/package.json +1 -1
- package/dist/ui/assets/BucketDetailPage-BXW8-FrE.js +0 -1
- package/dist/ui/assets/BucketsPage-DY_ITepb.js +0 -1
- package/dist/ui/assets/DynamoTablePage-BLCuyJHU.js +0 -3
- package/dist/ui/assets/LambdaDetailPage-D4rZNLRT.js +0 -4
- package/dist/ui/assets/OnboardingPage-nnl313Fm.js +0 -1
- package/dist/ui/assets/OpenSearchCollectionPage-Dn15lH_F.js +0 -1
- package/dist/ui/assets/OpenSearchPage-CgD5isok.js +0 -1
- package/dist/ui/assets/OverviewPage-m5sUr8IN.js +0 -1
- package/dist/ui/assets/QueueDetailPage-Ch_FDDoN.js +0 -1
- package/dist/ui/assets/QueuesPage-C_yDuGDu.js +0 -1
- package/dist/ui/assets/SecretsPage-BSGMSoqy.js +0 -1
- package/dist/ui/assets/ServiceDetailPage-6KyohyjI.js +0 -2
- package/dist/ui/assets/ServicesPage-BbSetOMo.js +0 -2
- package/dist/ui/assets/SettingsPage-BgF1jFr6.js +0 -1
- package/dist/ui/assets/index-D627ZyYU.css +0 -1
- package/dist/ui/assets/index-DuSPnI19.js +0 -37
- package/dist/ui/assets/resourceIcons-baecADXA.js +0 -1
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
// Static CloudFormation intrinsic resolution — the pass that runs before the
|
|
2
|
+
// parser reads a single resource property.
|
|
3
|
+
//
|
|
4
|
+
// A packaged template is not plain data: names are routinely written as
|
|
5
|
+
// `!Sub '${AWS::StackName}-orders'`, `!Join ['-', [!Ref Stage, 'orders']]`,
|
|
6
|
+
// `!If [IsProd, ..., ...]` or `!FindInMap [Env, !Ref Stage, Table]`. Without
|
|
7
|
+
// this pass every one of those reached the parser as an OBJECT, the `as string`
|
|
8
|
+
// casts let it through, and the provisioner was then asked to create a table
|
|
9
|
+
// literally named "[object Object]" (or skipped it). Everything here is pure —
|
|
10
|
+
// no I/O, no engine — so it is exhaustively unit-tested on its own.
|
|
11
|
+
//
|
|
12
|
+
// What is resolved statically (known before anything is provisioned):
|
|
13
|
+
// - Parameters (an explicit override, else the declared Default),
|
|
14
|
+
// - pseudo parameters (AWS::Region, AccountId, StackName, StackId, Partition,
|
|
15
|
+
// URLSuffix, NotificationARNs, NoValue),
|
|
16
|
+
// - Mappings (Fn::FindInMap) and Conditions (Fn::Equals/And/Or/Not/Condition),
|
|
17
|
+
// - the string/list functions Fn::Sub, Fn::Join, Fn::Select, Fn::Split,
|
|
18
|
+
// Fn::If, Fn::GetAZs and Fn::Base64.
|
|
19
|
+
//
|
|
20
|
+
// What is deliberately LEFT IN PLACE: a Ref / Fn::GetAtt to a RESOURCE. Its
|
|
21
|
+
// value (a queue URL, a stream ARN with its creation-time label, a secret ARN
|
|
22
|
+
// with its random suffix) is only known once the resource exists, and the
|
|
23
|
+
// parser's own readers (extractArn, extractFunctionName, resolveArnLike) key
|
|
24
|
+
// off the logical id inside those nodes to wire event sources, notifications
|
|
25
|
+
// and routes. A caller that DOES know physical values (the function
|
|
26
|
+
// environment pass, after provisioning) supplies `resolveResource` and the same
|
|
27
|
+
// walk reduces them too. A function whose arguments are only partly resolvable
|
|
28
|
+
// keeps its shape with the resolvable parts substituted — `Fn::Sub` keeps the
|
|
29
|
+
// unresolved `${Token}`s, `Fn::Join` keeps the unresolved parts — so a later
|
|
30
|
+
// pass (or resolveArnLike) still sees a valid intrinsic.
|
|
31
|
+
export const ACCOUNT_ID = '000000000000';
|
|
32
|
+
export const PARTITION = 'aws';
|
|
33
|
+
export const URL_SUFFIX = 'amazonaws.com';
|
|
34
|
+
// `Ref: AWS::NoValue` removes the enclosing property / list element. A unique
|
|
35
|
+
// symbol so no template value can ever collide with it.
|
|
36
|
+
export const NO_VALUE = Symbol('AWS::NoValue');
|
|
37
|
+
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
38
|
+
const isScalar = (value) => typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
39
|
+
// An intrinsic is a single-key object whose key is `Ref` or `Fn::*`.
|
|
40
|
+
export function intrinsicName(value) {
|
|
41
|
+
if (!isObject(value))
|
|
42
|
+
return undefined;
|
|
43
|
+
const keys = Object.keys(value);
|
|
44
|
+
if (keys.length !== 1)
|
|
45
|
+
return undefined;
|
|
46
|
+
const [key] = keys;
|
|
47
|
+
return key === 'Ref' || key.startsWith('Fn::') ? key : undefined;
|
|
48
|
+
}
|
|
49
|
+
// The pseudo parameters. `undefined` means "not a pseudo parameter" OR "not
|
|
50
|
+
// knowable here" (StackName without a stack name) — both leave the token alone.
|
|
51
|
+
function pseudoParameter(name, ctx) {
|
|
52
|
+
switch (name) {
|
|
53
|
+
case 'AWS::Region': return ctx.region;
|
|
54
|
+
case 'AWS::AccountId': return ctx.accountId;
|
|
55
|
+
case 'AWS::Partition': return ctx.partition;
|
|
56
|
+
case 'AWS::URLSuffix': return URL_SUFFIX;
|
|
57
|
+
case 'AWS::NotificationARNs': return [];
|
|
58
|
+
case 'AWS::NoValue': return NO_VALUE;
|
|
59
|
+
case 'AWS::StackName': return ctx.stackName;
|
|
60
|
+
case 'AWS::StackId':
|
|
61
|
+
// Deterministic stand-in: a real stack id ends in a UUID minted at
|
|
62
|
+
// creation, which has no local meaning — a stable one keeps re-registers
|
|
63
|
+
// idempotent.
|
|
64
|
+
return ctx.stackName && ctx.region
|
|
65
|
+
? `arn:${ctx.partition}:cloudformation:${ctx.region}:${ctx.accountId}:stack/${ctx.stackName}/00000000-0000-0000-0000-000000000000`
|
|
66
|
+
: undefined;
|
|
67
|
+
default: return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// `Fn::GetAtt` accepts `[LogicalId, Attr]` or the dotted `"LogicalId.Attr"`
|
|
71
|
+
// (the attribute itself may contain dots: `Endpoint.Address`).
|
|
72
|
+
function splitGetAtt(raw) {
|
|
73
|
+
if (Array.isArray(raw) && typeof raw[0] === 'string' && typeof raw[1] === 'string') {
|
|
74
|
+
return [raw[0], raw[1]];
|
|
75
|
+
}
|
|
76
|
+
if (typeof raw === 'string') {
|
|
77
|
+
const dot = raw.indexOf('.');
|
|
78
|
+
if (dot > 0)
|
|
79
|
+
return [raw.slice(0, dot), raw.slice(dot + 1)];
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
export class IntrinsicResolver {
|
|
84
|
+
ctx;
|
|
85
|
+
conditionCache = new Map();
|
|
86
|
+
evaluating = new Set();
|
|
87
|
+
constructor(ctx) {
|
|
88
|
+
this.ctx = ctx;
|
|
89
|
+
}
|
|
90
|
+
// Resolve any template value. Returns a concrete value, NO_VALUE, or the
|
|
91
|
+
// (partially resolved) intrinsic when something inside it is not knowable.
|
|
92
|
+
resolve(node) {
|
|
93
|
+
if (Array.isArray(node)) {
|
|
94
|
+
return node.map(item => this.resolve(item)).filter(item => item !== NO_VALUE);
|
|
95
|
+
}
|
|
96
|
+
if (!isObject(node))
|
|
97
|
+
return node;
|
|
98
|
+
const fn = intrinsicName(node);
|
|
99
|
+
if (fn)
|
|
100
|
+
return this.resolveIntrinsic(fn, node[fn], node);
|
|
101
|
+
const out = {};
|
|
102
|
+
for (const [key, value] of Object.entries(node)) {
|
|
103
|
+
const resolved = this.resolve(value);
|
|
104
|
+
if (resolved !== NO_VALUE)
|
|
105
|
+
out[key] = resolved;
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
// Condition name → boolean; undefined when it cannot be decided (unknown
|
|
110
|
+
// name, an unresolvable operand, a cycle) — each reported once.
|
|
111
|
+
evaluateCondition(name) {
|
|
112
|
+
if (this.conditionCache.has(name))
|
|
113
|
+
return this.conditionCache.get(name);
|
|
114
|
+
let result;
|
|
115
|
+
if (!(name in this.ctx.conditions)) {
|
|
116
|
+
this.ctx.warn(`Condition "${name}" is not declared in the template's Conditions — treating it as undecidable.`);
|
|
117
|
+
}
|
|
118
|
+
else if (this.evaluating.has(name)) {
|
|
119
|
+
this.ctx.warn(`Condition "${name}" references itself — treating it as undecidable.`);
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.evaluating.add(name);
|
|
124
|
+
result = this.evaluateExpression(this.ctx.conditions[name]);
|
|
125
|
+
this.evaluating.delete(name);
|
|
126
|
+
if (result === undefined) {
|
|
127
|
+
this.ctx.warn(`Condition "${name}" could not be evaluated statically (an operand is not a known value).`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
this.conditionCache.set(name, result);
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
evaluateExpression(expr) {
|
|
134
|
+
if (!isObject(expr))
|
|
135
|
+
return undefined;
|
|
136
|
+
if ('Condition' in expr && Object.keys(expr).length === 1) {
|
|
137
|
+
return typeof expr.Condition === 'string' ? this.evaluateCondition(expr.Condition) : undefined;
|
|
138
|
+
}
|
|
139
|
+
const fn = intrinsicName(expr);
|
|
140
|
+
const args = fn ? expr[fn] : undefined;
|
|
141
|
+
switch (fn) {
|
|
142
|
+
case 'Fn::Equals': {
|
|
143
|
+
if (!Array.isArray(args) || args.length !== 2)
|
|
144
|
+
return undefined;
|
|
145
|
+
const [a, b] = args.map(arg => this.resolve(arg));
|
|
146
|
+
// CFN compares string forms: `!Equals [!Ref Count, 3]` is legal.
|
|
147
|
+
return isScalar(a) && isScalar(b) ? String(a) === String(b) : undefined;
|
|
148
|
+
}
|
|
149
|
+
case 'Fn::Not': {
|
|
150
|
+
const inner = Array.isArray(args) ? this.evaluateExpression(args[0]) : undefined;
|
|
151
|
+
return inner === undefined ? undefined : !inner;
|
|
152
|
+
}
|
|
153
|
+
case 'Fn::And':
|
|
154
|
+
case 'Fn::Or': {
|
|
155
|
+
if (!Array.isArray(args))
|
|
156
|
+
return undefined;
|
|
157
|
+
const values = args.map(arg => this.evaluateExpression(arg));
|
|
158
|
+
if (values.some(v => v === undefined))
|
|
159
|
+
return undefined;
|
|
160
|
+
return fn === 'Fn::And' ? values.every(Boolean) : values.some(Boolean);
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
resolveIntrinsic(fn, args, node) {
|
|
167
|
+
switch (fn) {
|
|
168
|
+
case 'Ref': return this.resolveRef(args, node);
|
|
169
|
+
case 'Fn::GetAtt': return this.resolveGetAtt(args, node);
|
|
170
|
+
case 'Fn::Sub': return this.resolveSub(args, node);
|
|
171
|
+
case 'Fn::Join': return this.resolveJoin(args, node);
|
|
172
|
+
case 'Fn::Select': return this.resolveSelect(args, node);
|
|
173
|
+
case 'Fn::Split': return this.resolveSplit(args, node);
|
|
174
|
+
case 'Fn::If': return this.resolveIf(args, node);
|
|
175
|
+
case 'Fn::FindInMap': return this.resolveFindInMap(args, node);
|
|
176
|
+
case 'Fn::GetAZs': return this.resolveGetAZs(args, node);
|
|
177
|
+
case 'Fn::Base64': {
|
|
178
|
+
const value = this.resolve(args);
|
|
179
|
+
return typeof value === 'string' ? Buffer.from(value, 'utf-8').toString('base64') : { [fn]: value };
|
|
180
|
+
}
|
|
181
|
+
case 'Fn::ImportValue': {
|
|
182
|
+
const name = this.resolve(args);
|
|
183
|
+
const exported = typeof name === 'string' ? this.ctx.exports?.get(name) : undefined;
|
|
184
|
+
return exported ?? { [fn]: name };
|
|
185
|
+
}
|
|
186
|
+
default:
|
|
187
|
+
// Fn::Cidr, Fn::Transform, language extensions…: not evaluated, but
|
|
188
|
+
// their arguments still get the static substitutions.
|
|
189
|
+
return { [fn]: this.resolve(args) };
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
resolveRef(args, node) {
|
|
193
|
+
if (typeof args !== 'string')
|
|
194
|
+
return node;
|
|
195
|
+
const pseudo = pseudoParameter(args, this.ctx);
|
|
196
|
+
if (pseudo !== undefined)
|
|
197
|
+
return pseudo;
|
|
198
|
+
if (this.ctx.parameters.has(args))
|
|
199
|
+
return this.ctx.parameters.get(args);
|
|
200
|
+
return this.ctx.resolveResource?.(args) ?? node;
|
|
201
|
+
}
|
|
202
|
+
resolveGetAtt(args, node) {
|
|
203
|
+
// The attribute name may itself be a `Ref` to a parameter.
|
|
204
|
+
const resolvedArgs = Array.isArray(args) ? this.resolve(args) : args;
|
|
205
|
+
const parts = splitGetAtt(resolvedArgs);
|
|
206
|
+
if (!parts)
|
|
207
|
+
return node;
|
|
208
|
+
return this.ctx.resolveResource?.(parts[0], parts[1]) ?? { 'Fn::GetAtt': resolvedArgs };
|
|
209
|
+
}
|
|
210
|
+
// Fn::Sub — string form or [template, { Var: value }]. Resolvable tokens are
|
|
211
|
+
// substituted; the rest stay as `${Token}` in a still-valid Fn::Sub.
|
|
212
|
+
resolveSub(args, node) {
|
|
213
|
+
let template = args;
|
|
214
|
+
const rawVars = {};
|
|
215
|
+
if (Array.isArray(args)) {
|
|
216
|
+
template = args[0];
|
|
217
|
+
if (isObject(args[1]))
|
|
218
|
+
Object.assign(rawVars, args[1]);
|
|
219
|
+
}
|
|
220
|
+
if (typeof template !== 'string')
|
|
221
|
+
return node;
|
|
222
|
+
const vars = {};
|
|
223
|
+
for (const [key, value] of Object.entries(rawVars))
|
|
224
|
+
vars[key] = this.resolve(value);
|
|
225
|
+
let unresolved = false;
|
|
226
|
+
const substituted = template.replace(/\$\{([^}]*)\}/g, (match, token) => {
|
|
227
|
+
// `${!Literal}` is the escape for a literal `${Literal}`; kept escaped
|
|
228
|
+
// until the whole string is known.
|
|
229
|
+
if (token.startsWith('!'))
|
|
230
|
+
return match;
|
|
231
|
+
const key = token.trim();
|
|
232
|
+
const value = this.subToken(key, vars);
|
|
233
|
+
if (isScalar(value))
|
|
234
|
+
return String(value).replace(/\$\{/g, '${!');
|
|
235
|
+
unresolved = true;
|
|
236
|
+
return match;
|
|
237
|
+
});
|
|
238
|
+
if (!unresolved)
|
|
239
|
+
return substituted.replace(/\$\{!/g, '${');
|
|
240
|
+
const remaining = {};
|
|
241
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
242
|
+
if (!isScalar(value))
|
|
243
|
+
remaining[key] = value;
|
|
244
|
+
}
|
|
245
|
+
return { 'Fn::Sub': Object.keys(remaining).length > 0 ? [substituted, remaining] : substituted };
|
|
246
|
+
}
|
|
247
|
+
subToken(key, vars) {
|
|
248
|
+
if (key in vars)
|
|
249
|
+
return vars[key];
|
|
250
|
+
const pseudo = pseudoParameter(key, this.ctx);
|
|
251
|
+
if (pseudo !== undefined)
|
|
252
|
+
return pseudo;
|
|
253
|
+
if (this.ctx.parameters.has(key))
|
|
254
|
+
return this.ctx.parameters.get(key);
|
|
255
|
+
const dot = key.indexOf('.');
|
|
256
|
+
return dot > 0
|
|
257
|
+
? this.ctx.resolveResource?.(key.slice(0, dot), key.slice(dot + 1))
|
|
258
|
+
: this.ctx.resolveResource?.(key);
|
|
259
|
+
}
|
|
260
|
+
resolveJoin(args, node) {
|
|
261
|
+
if (!Array.isArray(args) || typeof args[0] !== 'string')
|
|
262
|
+
return node;
|
|
263
|
+
const list = this.resolve(args[1]);
|
|
264
|
+
if (Array.isArray(list) && list.every(isScalar))
|
|
265
|
+
return list.map(String).join(args[0]);
|
|
266
|
+
return { 'Fn::Join': [args[0], list] };
|
|
267
|
+
}
|
|
268
|
+
resolveSelect(args, node) {
|
|
269
|
+
if (!Array.isArray(args))
|
|
270
|
+
return node;
|
|
271
|
+
const index = this.resolve(args[0]);
|
|
272
|
+
const list = this.resolve(args[1]);
|
|
273
|
+
const i = Number(index);
|
|
274
|
+
if (isScalar(index) && Number.isInteger(i) && Array.isArray(list)) {
|
|
275
|
+
if (i >= 0 && i < list.length)
|
|
276
|
+
return list[i];
|
|
277
|
+
this.ctx.warn(`Fn::Select index ${i} is out of range for a list of ${list.length} element(s).`);
|
|
278
|
+
}
|
|
279
|
+
return { 'Fn::Select': [index, list] };
|
|
280
|
+
}
|
|
281
|
+
resolveSplit(args, node) {
|
|
282
|
+
if (!Array.isArray(args) || typeof args[0] !== 'string')
|
|
283
|
+
return node;
|
|
284
|
+
const source = this.resolve(args[1]);
|
|
285
|
+
return typeof source === 'string' ? source.split(args[0]) : { 'Fn::Split': [args[0], source] };
|
|
286
|
+
}
|
|
287
|
+
resolveIf(args, node) {
|
|
288
|
+
if (!Array.isArray(args) || typeof args[0] !== 'string')
|
|
289
|
+
return node;
|
|
290
|
+
const verdict = this.evaluateCondition(args[0]);
|
|
291
|
+
if (verdict === undefined)
|
|
292
|
+
return { 'Fn::If': [args[0], this.resolve(args[1]), this.resolve(args[2])] };
|
|
293
|
+
return this.resolve(verdict ? args[1] : args[2]);
|
|
294
|
+
}
|
|
295
|
+
resolveFindInMap(args, node) {
|
|
296
|
+
if (!Array.isArray(args) || args.length < 3)
|
|
297
|
+
return node;
|
|
298
|
+
const [map, top, second] = args.slice(0, 3).map(arg => this.resolve(arg));
|
|
299
|
+
if (!isScalar(map) || !isScalar(top) || !isScalar(second))
|
|
300
|
+
return { 'Fn::FindInMap': [map, top, second] };
|
|
301
|
+
const level1 = this.ctx.mappings[String(map)];
|
|
302
|
+
const level2 = isObject(level1) ? level1[String(top)] : undefined;
|
|
303
|
+
const value = isObject(level2) ? level2[String(second)] : undefined;
|
|
304
|
+
if (value === undefined) {
|
|
305
|
+
this.ctx.warn(`Fn::FindInMap [${map}, ${top}, ${second}] matches nothing in the template's Mappings.`);
|
|
306
|
+
return { 'Fn::FindInMap': [map, top, second] };
|
|
307
|
+
}
|
|
308
|
+
return this.resolve(value);
|
|
309
|
+
}
|
|
310
|
+
// Local stand-in: three zones of the requested (or current) region. Only the
|
|
311
|
+
// count and the names' shape matter to a template that indexes into it.
|
|
312
|
+
resolveGetAZs(args, node) {
|
|
313
|
+
const region = this.resolve(args);
|
|
314
|
+
const name = region || this.ctx.region;
|
|
315
|
+
if (typeof name !== 'string')
|
|
316
|
+
return node;
|
|
317
|
+
return ['a', 'b', 'c'].map(zone => `${name}${zone}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Resolve every parameter to its effective value: an override wins, then the
|
|
321
|
+
// Default. List types become string[] (what `Ref` yields for them in AWS).
|
|
322
|
+
// SSM-typed parameters are NOT resolved from their Default — that is the
|
|
323
|
+
// parameter-store PATH, not the value, and substituting it would give a table
|
|
324
|
+
// a name like "/acme/orders/table".
|
|
325
|
+
function resolveParameters(declared, overrides, warn) {
|
|
326
|
+
const values = new Map();
|
|
327
|
+
for (const [name, rawDef] of Object.entries(declared)) {
|
|
328
|
+
const def = isObject(rawDef) ? rawDef : {};
|
|
329
|
+
const type = typeof def.Type === 'string' ? def.Type : 'String';
|
|
330
|
+
let value;
|
|
331
|
+
if (name in overrides) {
|
|
332
|
+
value = overrides[name];
|
|
333
|
+
}
|
|
334
|
+
else if (type.startsWith('AWS::SSM::Parameter::Value')) {
|
|
335
|
+
warn(`Parameter "${name}" is an SSM parameter (${type}) — its value lives in the parameter store, not the template; Refs to it stay unresolved.`);
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
else if ('Default' in def) {
|
|
339
|
+
value = def.Default;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
warn(`Parameter "${name}" has no Default and no override — Refs to it stay unresolved.`);
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
const isList = type === 'CommaDelimitedList' || type.startsWith('List<');
|
|
346
|
+
values.set(name, isList && typeof value === 'string' ? value.split(',') : value);
|
|
347
|
+
}
|
|
348
|
+
return values;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* The resolution context a template defines: its Parameters (with overrides),
|
|
352
|
+
* Mappings and Conditions plus the deployment's pseudo parameters. Each
|
|
353
|
+
* distinct finding is pushed to `warnings` once.
|
|
354
|
+
*/
|
|
355
|
+
export function createIntrinsicContext(template, options, warnings) {
|
|
356
|
+
const warn = (message) => {
|
|
357
|
+
if (warnings && !warnings.includes(message))
|
|
358
|
+
warnings.push(message);
|
|
359
|
+
};
|
|
360
|
+
return {
|
|
361
|
+
region: options.region,
|
|
362
|
+
accountId: options.accountId ?? ACCOUNT_ID,
|
|
363
|
+
partition: options.partition ?? PARTITION,
|
|
364
|
+
stackName: options.stackName,
|
|
365
|
+
parameters: resolveParameters(isObject(template.Parameters) ? template.Parameters : {}, options.parameterOverrides ?? {}, warn),
|
|
366
|
+
mappings: isObject(template.Mappings) ? template.Mappings : {},
|
|
367
|
+
conditions: isObject(template.Conditions) ? template.Conditions : {},
|
|
368
|
+
warn,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* The static pass over a whole template: Resources and Outputs come back with
|
|
373
|
+
* every statically knowable intrinsic resolved, and the entries whose
|
|
374
|
+
* `Condition` is false are removed (AWS never creates them). An undecidable
|
|
375
|
+
* condition keeps its resource — dropping something the template may well
|
|
376
|
+
* create is the worse failure.
|
|
377
|
+
*/
|
|
378
|
+
export function resolveTemplate(template, options, warnings) {
|
|
379
|
+
const resolver = new IntrinsicResolver(createIntrinsicContext(template, options, warnings));
|
|
380
|
+
const droppedByCondition = [];
|
|
381
|
+
const resolveSection = (section, dropped) => {
|
|
382
|
+
if (!isObject(section))
|
|
383
|
+
return undefined;
|
|
384
|
+
const out = {};
|
|
385
|
+
for (const [logicalId, entry] of Object.entries(section)) {
|
|
386
|
+
if (isObject(entry) && typeof entry.Condition === 'string' && resolver.evaluateCondition(entry.Condition) === false) {
|
|
387
|
+
dropped?.push(logicalId);
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
out[logicalId] = resolver.resolve(entry);
|
|
391
|
+
}
|
|
392
|
+
return out;
|
|
393
|
+
};
|
|
394
|
+
const resolved = { ...template };
|
|
395
|
+
const resources = resolveSection(template.Resources, droppedByCondition);
|
|
396
|
+
if (resources)
|
|
397
|
+
resolved.Resources = resources;
|
|
398
|
+
const outputs = resolveSection(template.Outputs);
|
|
399
|
+
if (outputs)
|
|
400
|
+
resolved.Outputs = outputs;
|
|
401
|
+
return { template: resolved, droppedByCondition };
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=cfn-intrinsics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cfn-intrinsics.js","sourceRoot":"","sources":["../../../src/server/services/cfn-intrinsics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Resource } from './cloudformation-parser.js';
|
|
2
|
+
import { type TemplateResolveOptions } from './cfn-intrinsics.js';
|
|
3
|
+
export interface CollectionAttributes {
|
|
4
|
+
id?: string;
|
|
5
|
+
arn?: string;
|
|
6
|
+
endpoint?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RuntimeAttributes {
|
|
9
|
+
queueUrls: Map<string, string>;
|
|
10
|
+
streamArns: Map<string, string>;
|
|
11
|
+
secretArns: Map<string, string>;
|
|
12
|
+
collections: Map<string, CollectionAttributes>;
|
|
13
|
+
}
|
|
14
|
+
export declare function emptyRuntimeAttributes(): RuntimeAttributes;
|
|
15
|
+
export interface PhysicalContext {
|
|
16
|
+
region: string;
|
|
17
|
+
accountId?: string;
|
|
18
|
+
partition?: string;
|
|
19
|
+
runtime?: RuntimeAttributes;
|
|
20
|
+
}
|
|
21
|
+
type Resolver = (logicalId: string, attribute?: string) => string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* The value `Ref` (attribute undefined) or `Fn::GetAtt` returns for a parsed
|
|
24
|
+
* resource, or undefined when LSS cannot know it — an unsupported attribute,
|
|
25
|
+
* or a runtime attribute the engine did not report.
|
|
26
|
+
*/
|
|
27
|
+
export declare function physicalValue(resource: Resource, attribute: string | undefined, ctx: PhysicalContext, byLogicalId?: Map<string, Resource>): string | undefined;
|
|
28
|
+
export declare function createPhysicalResolver(resources: Resource[], ctx: PhysicalContext): Resolver;
|
|
29
|
+
export interface EnvironmentResolverOptions extends TemplateResolveOptions {
|
|
30
|
+
template: Record<string, unknown>;
|
|
31
|
+
resources: Resource[];
|
|
32
|
+
runtime?: RuntimeAttributes;
|
|
33
|
+
exports?: Map<string, string>;
|
|
34
|
+
warnings: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Turns a function's raw Environment.Variables into the strings the runtime
|
|
38
|
+
* injects: intrinsics resolved (statically, then to physical values), numbers
|
|
39
|
+
* and booleans stringified, `AWS::NoValue` dropped. A value that still cannot
|
|
40
|
+
* be resolved gets a recognizable fallback AND a warning naming it — never a
|
|
41
|
+
* silent JSON blob in an env var.
|
|
42
|
+
*/
|
|
43
|
+
export declare class EnvironmentResolver {
|
|
44
|
+
private readonly resolver;
|
|
45
|
+
private readonly warnings;
|
|
46
|
+
constructor(options: EnvironmentResolverOptions);
|
|
47
|
+
resolveValue(raw: unknown): string | undefined;
|
|
48
|
+
resolve(env: Record<string, unknown>): Record<string, string>;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=cfn-physical-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cfn-physical-values.d.ts","sourceRoot":"","sources":["../../../src/server/services/cfn-physical-values.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAOL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,oBAAoB;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAChD;AAED,wBAAgB,sBAAsB,IAAI,iBAAiB,CAE1D;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,KAAK,QAAQ,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAa9E;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,GAAG,EAAE,eAAe,EACpB,WAAW,GAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAa,GAC7C,MAAM,GAAG,SAAS,CAoEpB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,eAAe,GAAG,QAAQ,CAS5F;AAYD,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IAIxE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;gBAExB,OAAO,EAAE,0BAA0B;IAe/C,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAO9C,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAqB9D"}
|