cloudflare-expression-lint 0.7.1 → 0.8.1
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/ast-utils.d.ts +19 -0
- package/dist/ast-utils.js +87 -0
- package/dist/ast-utils.js.map +1 -0
- package/dist/builder-compat.d.ts +14 -0
- package/dist/builder-compat.js +302 -0
- package/dist/builder-compat.js.map +1 -0
- package/dist/fixer.js +2 -68
- package/dist/fixer.js.map +1 -1
- package/dist/formatter.js +1 -78
- package/dist/formatter.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rewriter.d.ts +1 -12
- package/dist/rewriter.js +3 -122
- package/dist/rewriter.js.map +1 -1
- package/dist/template-detection.d.ts +21 -0
- package/dist/template-detection.js +102 -0
- package/dist/template-detection.js.map +1 -0
- package/dist/validator.js +2 -485
- package/dist/validator.js.map +1 -1
- package/dist/yaml-locator.d.ts +22 -0
- package/dist/yaml-locator.js +158 -0
- package/dist/yaml-locator.js.map +1 -0
- package/dist/yaml-scanner.js +2 -0
- package/dist/yaml-scanner.js.map +1 -1
- package/package.json +1 -1
package/dist/formatter.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { parse } from './parser.js';
|
|
8
8
|
import { substitutePlaceholders, restorePlaceholders } from './placeholders.js';
|
|
9
|
+
import { printNode, normalizeOp, collectChain } from './ast-utils.js';
|
|
9
10
|
const DEFAULT_OPTIONS = {
|
|
10
11
|
maxWidth: 100,
|
|
11
12
|
indent: ' ',
|
|
@@ -35,59 +36,6 @@ export function formatExpression(expression, options) {
|
|
|
35
36
|
// Format with line breaks
|
|
36
37
|
return restorePlaceholders(printNodeMultiline(ast, 0, opts), map);
|
|
37
38
|
}
|
|
38
|
-
// ── Single-line printer ──────────────────────────────────────────────
|
|
39
|
-
/** Print an AST node as a single-line string (canonical form). */
|
|
40
|
-
function printNode(node) {
|
|
41
|
-
switch (node.kind) {
|
|
42
|
-
case 'BooleanLiteral':
|
|
43
|
-
return String(node.value);
|
|
44
|
-
case 'StringLiteral':
|
|
45
|
-
if (node.raw)
|
|
46
|
-
return `r"${node.value}"`;
|
|
47
|
-
return `"${escapeString(node.value)}"`;
|
|
48
|
-
case 'IntegerLiteral':
|
|
49
|
-
return String(node.value);
|
|
50
|
-
case 'FloatLiteral':
|
|
51
|
-
return String(node.value);
|
|
52
|
-
case 'IPLiteral':
|
|
53
|
-
return node.cidr !== undefined ? `${node.value}/${node.cidr}` : node.value;
|
|
54
|
-
case 'FieldAccess': {
|
|
55
|
-
let s = node.field;
|
|
56
|
-
if (node.mapKey !== undefined)
|
|
57
|
-
s += `["${escapeString(node.mapKey)}"]`;
|
|
58
|
-
if (node.arrayIndex !== undefined)
|
|
59
|
-
s += `[${node.arrayIndex}]`;
|
|
60
|
-
return s;
|
|
61
|
-
}
|
|
62
|
-
case 'NamedList':
|
|
63
|
-
return node.name.startsWith('$') ? node.name : `$${node.name}`;
|
|
64
|
-
case 'FunctionCall': {
|
|
65
|
-
const args = node.args.map(a => printNode(a)).join(', ');
|
|
66
|
-
return `${node.name}(${args})`;
|
|
67
|
-
}
|
|
68
|
-
case 'Comparison':
|
|
69
|
-
return `${printNode(node.left)} ${node.operator} ${printNode(node.right)}`;
|
|
70
|
-
case 'Logical':
|
|
71
|
-
return `${printNode(node.left)} ${node.operator} ${printNode(node.right)}`;
|
|
72
|
-
case 'Not':
|
|
73
|
-
return `not ${printNode(node.operand)}`;
|
|
74
|
-
case 'InExpression': {
|
|
75
|
-
const field = printNode(node.field);
|
|
76
|
-
const neg = node.negated ? 'not ' : '';
|
|
77
|
-
// Named list: ip.src in $list (no braces)
|
|
78
|
-
if (node.values.length === 1 && node.values[0].kind === 'NamedList') {
|
|
79
|
-
return `${neg}${field} in ${printNode(node.values[0])}`;
|
|
80
|
-
}
|
|
81
|
-
// Value list: ip.src in {1.2.3.4 5.6.7.8}
|
|
82
|
-
const values = node.values.map(v => printNode(v)).join(' ');
|
|
83
|
-
return `${neg}${field} in {${values}}`;
|
|
84
|
-
}
|
|
85
|
-
case 'Group':
|
|
86
|
-
return `(${printNode(node.expression)})`;
|
|
87
|
-
case 'ArrayUnpack':
|
|
88
|
-
return `${printNode(node.field)}[*]`;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
39
|
// ── Multi-line printer ───────────────────────────────────────────────
|
|
92
40
|
/** Print an AST node with line breaks for readability. */
|
|
93
41
|
function printNodeMultiline(node, depth, opts) {
|
|
@@ -167,24 +115,6 @@ function printLogicalChain(node, depth, opts) {
|
|
|
167
115
|
}
|
|
168
116
|
return lines.join('\n');
|
|
169
117
|
}
|
|
170
|
-
/** Collect branches of the same operator into a flat list. */
|
|
171
|
-
function collectChain(node, op, branches) {
|
|
172
|
-
if (node.kind === 'Logical' && normalizeOp(node.operator) === op) {
|
|
173
|
-
collectChain(node.left, op, branches);
|
|
174
|
-
collectChain(node.right, op, branches);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
branches.push(node);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/** Normalize operator to English form for consistency. */
|
|
181
|
-
function normalizeOp(op) {
|
|
182
|
-
switch (op) {
|
|
183
|
-
case '&&': return 'and';
|
|
184
|
-
case '||': return 'or';
|
|
185
|
-
default: return op;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
118
|
/** Print an in-expression with values broken across lines if needed. */
|
|
189
119
|
function printInExpressionMultiline(node, depth, opts) {
|
|
190
120
|
const ind = opts.indent.repeat(depth);
|
|
@@ -201,11 +131,4 @@ function printInExpressionMultiline(node, depth, opts) {
|
|
|
201
131
|
const valueLines = values.map(v => `${indValues}${v}`).join('\n');
|
|
202
132
|
return `${ind}${neg}${field} in {\n${valueLines}\n${ind}}`;
|
|
203
133
|
}
|
|
204
|
-
/** Escape special characters in a string literal. */
|
|
205
|
-
/** Escape for Cloudflare expression string literals.
|
|
206
|
-
* Only `"` needs escaping (to `\"`). Backslashes pass through as-is
|
|
207
|
-
* because they're regex escapes in Cloudflare expressions, not string escapes. */
|
|
208
|
-
function escapeString(s) {
|
|
209
|
-
return s.replace(/"/g, '\\"');
|
|
210
|
-
}
|
|
211
134
|
//# sourceMappingURL=formatter.js.map
|
package/dist/formatter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { tokenize } from './lexer.js';
|
|
8
8
|
export { parse } from './parser.js';
|
|
9
|
+
export { printNode, normalizeOp, collectChain, stripGroup } from './ast-utils.js';
|
|
9
10
|
export { validate } from './validator.js';
|
|
10
11
|
export { formatExpression } from './formatter.js';
|
|
11
12
|
export type { FormatOptions } from './formatter.js';
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { tokenize } from './lexer.js';
|
|
8
8
|
export { parse } from './parser.js';
|
|
9
|
+
export { printNode, normalizeOp, collectChain, stripGroup } from './ast-utils.js';
|
|
9
10
|
export { validate } from './validator.js';
|
|
10
11
|
export { formatExpression } from './formatter.js';
|
|
11
12
|
export { fixExpression } from './fixer.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAc3C,0DAA0D;AAC1D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EACL,oBAAoB,EAAE,iBAAiB,EACvC,sBAAsB,EAAE,mBAAmB,GAC5C,MAAM,wBAAwB,CAAC;AAGhC,yBAAyB;AACzB,OAAO,EACL,QAAQ,EACR,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAS3B,wBAAwB;AACxB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,MAAM,IAAI,8BAA8B,EACxC,sBAAsB,EACtB,4BAA4B,EAC5B,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAc3C,0DAA0D;AAC1D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EACL,oBAAoB,EAAE,iBAAiB,EACvC,sBAAsB,EAAE,mBAAmB,GAC5C,MAAM,wBAAwB,CAAC;AAGhC,yBAAyB;AACzB,OAAO,EACL,QAAQ,EACR,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAS3B,wBAAwB;AACxB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EACL,MAAM,IAAI,8BAA8B,EACxC,sBAAsB,EACtB,4BAA4B,EAC5B,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC"}
|
package/dist/rewriter.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* formatted multi-line versions using >- block scalar syntax.
|
|
6
6
|
*/
|
|
7
7
|
import { type FormatOptions } from './formatter.js';
|
|
8
|
+
export { findExpressionLocation } from './yaml-locator.js';
|
|
8
9
|
export interface RewriteOptions extends FormatOptions {
|
|
9
10
|
/** Convert existing | and |- block scalars to >- */
|
|
10
11
|
convertBlockScalars?: boolean;
|
|
@@ -25,15 +26,3 @@ export interface RewriteResult {
|
|
|
25
26
|
export declare function rewriteExpressions(content: string, expressions: {
|
|
26
27
|
expression: string;
|
|
27
28
|
}[], options?: RewriteOptions): RewriteResult;
|
|
28
|
-
/**
|
|
29
|
-
* Find the location of an expression value in YAML content,
|
|
30
|
-
* searching backwards from `beforeOffset`.
|
|
31
|
-
*/
|
|
32
|
-
export declare function findExpressionLocation(content: string, expression: string, beforeOffset?: number): {
|
|
33
|
-
lineStart: number;
|
|
34
|
-
lineEnd: number;
|
|
35
|
-
indent: string;
|
|
36
|
-
key: string;
|
|
37
|
-
/** The block scalar type if the expression uses one, or null for inline */
|
|
38
|
-
isBlockScalar?: string;
|
|
39
|
-
} | null;
|
package/dist/rewriter.js
CHANGED
|
@@ -5,12 +5,10 @@
|
|
|
5
5
|
* formatted multi-line versions using >- block scalar syntax.
|
|
6
6
|
*/
|
|
7
7
|
import { formatExpression } from './formatter.js';
|
|
8
|
+
import { findExpressionLocation } from './yaml-locator.js';
|
|
8
9
|
import { parse } from './parser.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
'expression', 'source_url_expression', 'counting_expression',
|
|
12
|
-
'rewrite_expression', 'condition',
|
|
13
|
-
]);
|
|
10
|
+
// Re-export for backwards compatibility
|
|
11
|
+
export { findExpressionLocation } from './yaml-locator.js';
|
|
14
12
|
/**
|
|
15
13
|
* Rewrite expressions in YAML content for readability.
|
|
16
14
|
* Returns the modified content and count of changes.
|
|
@@ -114,121 +112,4 @@ function deduplicateExpressions(expressions) {
|
|
|
114
112
|
return true;
|
|
115
113
|
});
|
|
116
114
|
}
|
|
117
|
-
/**
|
|
118
|
-
* Find the location of an expression value in YAML content,
|
|
119
|
-
* searching backwards from `beforeOffset`.
|
|
120
|
-
*/
|
|
121
|
-
export function findExpressionLocation(content, expression, beforeOffset) {
|
|
122
|
-
// Normalize the search expression: collapse whitespace so multi-line
|
|
123
|
-
// scanner output matches against joined block scalar content
|
|
124
|
-
const trimmed = expression.split('\n').map(l => l.trim()).filter(l => l !== '').join(' ').trim();
|
|
125
|
-
// Strip \r from lines for regex matching (CRLF files), but keep offsets based on original content
|
|
126
|
-
const rawLines = content.split('\n');
|
|
127
|
-
const lines = rawLines.map(l => l.replace(/\r$/, ''));
|
|
128
|
-
let offset = 0;
|
|
129
|
-
const offsets = [];
|
|
130
|
-
// Build line offset index using raw line lengths to preserve correct byte offsets
|
|
131
|
-
for (const line of rawLines) {
|
|
132
|
-
offsets.push(offset);
|
|
133
|
-
offset += line.length + 1;
|
|
134
|
-
}
|
|
135
|
-
// Search backwards from beforeOffset (or end of file)
|
|
136
|
-
const maxOffset = beforeOffset ?? content.length;
|
|
137
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
138
|
-
if (offsets[i] >= maxOffset)
|
|
139
|
-
continue;
|
|
140
|
-
const line = lines[i];
|
|
141
|
-
const keyMatch = line.match(/^(\s*(?:-\s+)?)([\w_]+):\s*(.*)$/);
|
|
142
|
-
if (!keyMatch)
|
|
143
|
-
continue;
|
|
144
|
-
const [, fullIndent, key, value] = keyMatch;
|
|
145
|
-
if (!EXPRESSION_KEYS.has(key))
|
|
146
|
-
continue;
|
|
147
|
-
// Use the whitespace portion for indentation (without list marker)
|
|
148
|
-
const indent = fullIndent;
|
|
149
|
-
// Inline value
|
|
150
|
-
if (value && !['|', '>-', '>', '|+', '|-', '>+'].includes(value.trim())) {
|
|
151
|
-
let unquoted = value.replace(/^['"]|['"]$/g, '').trim();
|
|
152
|
-
// Unescape YAML double-quoted string escapes
|
|
153
|
-
if (value.trim().startsWith('"')) {
|
|
154
|
-
unquoted = unquoted.replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
|
155
|
-
}
|
|
156
|
-
if (unquoted === trimmed || value.trim() === trimmed) {
|
|
157
|
-
const lineEnd = offsets[i] + line.length + 1;
|
|
158
|
-
return { lineStart: offsets[i], lineEnd, indent, key: `${key}:` };
|
|
159
|
-
}
|
|
160
|
-
// Plain multi-line value (wraps across lines without block scalar indicator)
|
|
161
|
-
if (unquoted && !value.trim().startsWith('"') && !value.trim().startsWith("'")) {
|
|
162
|
-
const keyIndent = indent.length;
|
|
163
|
-
let j = i + 1;
|
|
164
|
-
while (j < lines.length) {
|
|
165
|
-
const nextLine = lines[j];
|
|
166
|
-
if (nextLine.trim() === '' || countIndent(nextLine) > keyIndent) {
|
|
167
|
-
j++;
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (j > i + 1) {
|
|
174
|
-
const allLines = [value, ...lines.slice(i + 1, j)].map(l => l.trim()).filter(l => l !== '').join(' ').trim();
|
|
175
|
-
if (allLines === trimmed) {
|
|
176
|
-
const blockEnd = j < lines.length ? offsets[j] : content.length;
|
|
177
|
-
return { lineStart: offsets[i], lineEnd: blockEnd, indent, key: `${key}:`, isBlockScalar: 'plain-multiline' };
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Block scalar (| or >-)
|
|
183
|
-
if (['|', '>-', '>', '|+', '|-', '>+'].includes(value.trim())) {
|
|
184
|
-
const blockIndent = indent.length + 2;
|
|
185
|
-
let j = i + 1;
|
|
186
|
-
while (j < lines.length) {
|
|
187
|
-
const nextLine = lines[j];
|
|
188
|
-
if (nextLine.trim() === '' || countIndent(nextLine) >= blockIndent) {
|
|
189
|
-
j++;
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
// Trim trailing blank lines — they're YAML structure, not block content
|
|
196
|
-
while (j > i + 1 && lines[j - 1].trim() === '')
|
|
197
|
-
j--;
|
|
198
|
-
const blockContent = lines.slice(i + 1, j).map(l => l.trim()).filter(l => l !== '').join(' ').trim();
|
|
199
|
-
if (blockContent === trimmed) {
|
|
200
|
-
const blockEnd = j < lines.length ? offsets[j] : content.length;
|
|
201
|
-
return { lineStart: offsets[i], lineEnd: blockEnd, indent, key: `${key}:`, isBlockScalar: value.trim() };
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
// Value starts on the next line (key: \n value...)
|
|
205
|
-
if (!value || !value.trim()) {
|
|
206
|
-
const keyIndent = indent.length;
|
|
207
|
-
let j = i + 1;
|
|
208
|
-
while (j < lines.length) {
|
|
209
|
-
const nextLine = lines[j];
|
|
210
|
-
if (nextLine.trim() === '' || countIndent(nextLine) > keyIndent) {
|
|
211
|
-
j++;
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
break;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
while (j > i + 1 && lines[j - 1].trim() === '')
|
|
218
|
-
j--;
|
|
219
|
-
if (j > i + 1) {
|
|
220
|
-
const allLines = lines.slice(i + 1, j).map(l => l.trim()).filter(l => l !== '').join(' ').trim();
|
|
221
|
-
if (allLines === trimmed) {
|
|
222
|
-
const blockEnd = j < lines.length ? offsets[j] : content.length;
|
|
223
|
-
return { lineStart: offsets[i], lineEnd: blockEnd, indent, key: `${key}:`, isBlockScalar: 'plain-multiline' };
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
function countIndent(line) {
|
|
231
|
-
const m = line.match(/^(\s*)/);
|
|
232
|
-
return m ? m[1].length : 0;
|
|
233
|
-
}
|
|
234
115
|
//# sourceMappingURL=rewriter.js.map
|
package/dist/rewriter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../src/rewriter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAsB,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../src/rewriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template placeholder detection.
|
|
3
|
+
*
|
|
4
|
+
* Detects template variables in expression strings that will be
|
|
5
|
+
* substituted before deployment (e.g., by Terraform templatefile()).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Detect if an expression contains template placeholders.
|
|
9
|
+
*
|
|
10
|
+
* Common patterns:
|
|
11
|
+
* - UPPER_CASE_IDENTIFIERS inside expressions (not quoted)
|
|
12
|
+
* - ${variable} Terraform interpolation
|
|
13
|
+
* - __NAME__ double-underscore convention
|
|
14
|
+
*/
|
|
15
|
+
export declare function containsTemplatePlaceholders(expression: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Detect if an expression contains legacy-format placeholders (UPPER_CASE_VAR
|
|
18
|
+
* without __double_underscore__ delimiters). Returns false if all placeholders
|
|
19
|
+
* use the preferred __NAME__ format.
|
|
20
|
+
*/
|
|
21
|
+
export declare function containsLegacyPlaceholders(expression: string): boolean;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template placeholder detection.
|
|
3
|
+
*
|
|
4
|
+
* Detects template variables in expression strings that will be
|
|
5
|
+
* substituted before deployment (e.g., by Terraform templatefile()).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Detect if an expression contains template placeholders.
|
|
9
|
+
*
|
|
10
|
+
* Common patterns:
|
|
11
|
+
* - UPPER_CASE_IDENTIFIERS inside expressions (not quoted)
|
|
12
|
+
* - ${variable} Terraform interpolation
|
|
13
|
+
* - __NAME__ double-underscore convention
|
|
14
|
+
*/
|
|
15
|
+
export function containsTemplatePlaceholders(expression) {
|
|
16
|
+
let inQuote = false;
|
|
17
|
+
let escaped = false;
|
|
18
|
+
for (let i = 0; i < expression.length; i++) {
|
|
19
|
+
const ch = expression[i];
|
|
20
|
+
if (escaped) {
|
|
21
|
+
escaped = false;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (ch === '\\') {
|
|
25
|
+
escaped = true;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (ch === '"') {
|
|
29
|
+
inQuote = !inQuote;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (inQuote)
|
|
33
|
+
continue;
|
|
34
|
+
// Check for ${...} interpolation
|
|
35
|
+
if (ch === '$' && expression[i + 1] === '{')
|
|
36
|
+
return true;
|
|
37
|
+
// Check for UPPER_CASE_IDENTIFIER (at least 4 chars with underscore)
|
|
38
|
+
if (/[A-Z]/.test(ch)) {
|
|
39
|
+
let j = i;
|
|
40
|
+
while (j < expression.length && /[A-Z0-9_]/.test(expression[j]))
|
|
41
|
+
j++;
|
|
42
|
+
const word = expression.slice(i, j);
|
|
43
|
+
if (word.length >= 4 && word.includes('_') && /^[A-Z][A-Z0-9_]+$/.test(word)) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Detect if an expression contains legacy-format placeholders (UPPER_CASE_VAR
|
|
52
|
+
* without __double_underscore__ delimiters). Returns false if all placeholders
|
|
53
|
+
* use the preferred __NAME__ format.
|
|
54
|
+
*/
|
|
55
|
+
export function containsLegacyPlaceholders(expression) {
|
|
56
|
+
let inQuote = false;
|
|
57
|
+
let escaped = false;
|
|
58
|
+
for (let i = 0; i < expression.length; i++) {
|
|
59
|
+
const ch = expression[i];
|
|
60
|
+
if (escaped) {
|
|
61
|
+
escaped = false;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (ch === '\\') {
|
|
65
|
+
escaped = true;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (ch === '"') {
|
|
69
|
+
inQuote = !inQuote;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (inQuote)
|
|
73
|
+
continue;
|
|
74
|
+
// Skip __NAME__ patterns (preferred format)
|
|
75
|
+
if (ch === '_' && expression[i + 1] === '_') {
|
|
76
|
+
let j = i + 2;
|
|
77
|
+
while (j < expression.length && /[A-Z0-9_]/.test(expression[j]))
|
|
78
|
+
j++;
|
|
79
|
+
const word = expression.slice(i, j);
|
|
80
|
+
if (word.length >= 6 && word.endsWith('__')) {
|
|
81
|
+
i = j - 1;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Check for bare UPPER_CASE_IDENTIFIER (legacy)
|
|
86
|
+
if (/[A-Z]/.test(ch)) {
|
|
87
|
+
if (i > 0 && expression[i - 1] === '.')
|
|
88
|
+
continue;
|
|
89
|
+
if (i > 0 && /[a-zA-Z]/.test(expression[i - 1]))
|
|
90
|
+
continue;
|
|
91
|
+
let j = i;
|
|
92
|
+
while (j < expression.length && /[A-Z0-9_]/.test(expression[j]))
|
|
93
|
+
j++;
|
|
94
|
+
const word = expression.slice(i, j);
|
|
95
|
+
if (word.length >= 4 && word.includes('_') && /^[A-Z][A-Z0-9_]+$/.test(word)) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=template-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-detection.js","sourceRoot":"","sources":["../src/template-detection.ts"],"names":[],"mappings":"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"}
|