@analogjs/vite-plugin-angular 3.0.0-alpha.36 → 3.0.0-alpha.38
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/README.md +22 -0
- package/package.json +3 -4
- package/src/lib/angular-jit-plugin.js +3 -0
- package/src/lib/angular-jit-plugin.js.map +1 -1
- package/src/lib/angular-vite-plugin.d.ts +12 -7
- package/src/lib/angular-vite-plugin.js +7 -5
- package/src/lib/angular-vite-plugin.js.map +1 -1
- package/src/lib/compiler/angular-version.d.ts +19 -0
- package/src/lib/compiler/angular-version.js +16 -0
- package/src/lib/compiler/angular-version.js.map +1 -0
- package/src/lib/compiler/class-field-lowering.d.ts +23 -0
- package/src/lib/compiler/class-field-lowering.js +131 -0
- package/src/lib/compiler/class-field-lowering.js.map +1 -0
- package/src/lib/compiler/compile.d.ts +44 -0
- package/src/lib/compiler/compile.js +731 -0
- package/src/lib/compiler/compile.js.map +1 -0
- package/src/lib/compiler/constants.d.ts +18 -0
- package/src/lib/compiler/constants.js +52 -0
- package/src/lib/compiler/constants.js.map +1 -0
- package/src/lib/compiler/debug.d.ts +22 -0
- package/src/lib/compiler/debug.js +20 -0
- package/src/lib/compiler/debug.js.map +1 -0
- package/src/lib/compiler/defer.d.ts +47 -0
- package/src/lib/compiler/defer.js +138 -0
- package/src/lib/compiler/defer.js.map +1 -0
- package/src/lib/compiler/dts-reader.d.ts +35 -0
- package/src/lib/compiler/dts-reader.js +365 -0
- package/src/lib/compiler/dts-reader.js.map +1 -0
- package/src/lib/compiler/hmr.d.ts +16 -0
- package/src/lib/compiler/hmr.js +69 -0
- package/src/lib/compiler/hmr.js.map +1 -0
- package/src/lib/compiler/index.d.ts +7 -0
- package/src/lib/compiler/index.js +7 -0
- package/src/lib/compiler/jit-metadata.d.ts +14 -0
- package/src/lib/compiler/jit-metadata.js +146 -0
- package/src/lib/compiler/jit-metadata.js.map +1 -0
- package/src/lib/compiler/jit-transform.d.ts +24 -0
- package/src/lib/compiler/jit-transform.js +200 -0
- package/src/lib/compiler/jit-transform.js.map +1 -0
- package/src/lib/compiler/js-emitter.d.ts +10 -0
- package/src/lib/compiler/js-emitter.js +420 -0
- package/src/lib/compiler/js-emitter.js.map +1 -0
- package/src/lib/compiler/metadata.d.ts +45 -0
- package/src/lib/compiler/metadata.js +633 -0
- package/src/lib/compiler/metadata.js.map +1 -0
- package/src/lib/compiler/registry.d.ts +49 -0
- package/src/lib/compiler/registry.js +164 -0
- package/src/lib/compiler/registry.js.map +1 -0
- package/src/lib/compiler/resource-inliner.d.ts +21 -0
- package/src/lib/compiler/resource-inliner.js +152 -0
- package/src/lib/compiler/resource-inliner.js.map +1 -0
- package/src/lib/compiler/style-ast.d.ts +8 -0
- package/src/lib/compiler/style-ast.js +54 -0
- package/src/lib/compiler/style-ast.js.map +1 -0
- package/src/lib/compiler/styles.d.ts +13 -0
- package/src/lib/compiler/test-helpers.d.ts +7 -0
- package/src/lib/compiler/type-elision.d.ts +26 -0
- package/src/lib/compiler/type-elision.js +211 -0
- package/src/lib/compiler/type-elision.js.map +1 -0
- package/src/lib/compiler/utils.d.ts +10 -0
- package/src/lib/compiler/utils.js +35 -0
- package/src/lib/compiler/utils.js.map +1 -0
- package/src/lib/{analog-compiler-plugin.d.ts → fast-compile-plugin.d.ts} +3 -3
- package/src/lib/{analog-compiler-plugin.js → fast-compile-plugin.js} +46 -33
- package/src/lib/fast-compile-plugin.js.map +1 -0
- package/src/lib/utils/virtual-resources.d.ts +16 -0
- package/src/lib/utils/virtual-resources.js +31 -2
- package/src/lib/utils/virtual-resources.js.map +1 -1
- package/src/lib/analog-compiler-plugin.js.map +0 -1
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import * as o from "@angular/compiler";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
//#region packages/vite-plugin-angular/src/lib/compiler/js-emitter.ts
|
|
4
|
+
/** Shared printer — only used as fallback for complex WrappedNodeExpr (e.g. decorator args). */
|
|
5
|
+
var sharedPrinter = ts.createPrinter({ removeComments: true });
|
|
6
|
+
var emptySourceFile = ts.createSourceFile("_.ts", "", ts.ScriptTarget.Latest, false);
|
|
7
|
+
var OP_DEFINITIONS = [
|
|
8
|
+
[
|
|
9
|
+
"Assign",
|
|
10
|
+
"=",
|
|
11
|
+
2
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"AdditionAssignment",
|
|
15
|
+
"+=",
|
|
16
|
+
2
|
|
17
|
+
],
|
|
18
|
+
[
|
|
19
|
+
"SubtractionAssignment",
|
|
20
|
+
"-=",
|
|
21
|
+
2
|
|
22
|
+
],
|
|
23
|
+
[
|
|
24
|
+
"MultiplicationAssignment",
|
|
25
|
+
"*=",
|
|
26
|
+
2
|
|
27
|
+
],
|
|
28
|
+
[
|
|
29
|
+
"DivisionAssignment",
|
|
30
|
+
"/=",
|
|
31
|
+
2
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
"RemainderAssignment",
|
|
35
|
+
"%=",
|
|
36
|
+
2
|
|
37
|
+
],
|
|
38
|
+
[
|
|
39
|
+
"ExponentiationAssignment",
|
|
40
|
+
"**=",
|
|
41
|
+
2
|
|
42
|
+
],
|
|
43
|
+
[
|
|
44
|
+
"AndAssignment",
|
|
45
|
+
"&&=",
|
|
46
|
+
2
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
"OrAssignment",
|
|
50
|
+
"||=",
|
|
51
|
+
2
|
|
52
|
+
],
|
|
53
|
+
[
|
|
54
|
+
"NullishCoalesceAssignment",
|
|
55
|
+
"??=",
|
|
56
|
+
2
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
"NullishCoalesce",
|
|
60
|
+
"??",
|
|
61
|
+
4
|
|
62
|
+
],
|
|
63
|
+
[
|
|
64
|
+
"Or",
|
|
65
|
+
"||",
|
|
66
|
+
4
|
|
67
|
+
],
|
|
68
|
+
[
|
|
69
|
+
"And",
|
|
70
|
+
"&&",
|
|
71
|
+
5
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
"BitwiseOr",
|
|
75
|
+
"|",
|
|
76
|
+
6
|
|
77
|
+
],
|
|
78
|
+
[
|
|
79
|
+
"BitwiseAnd",
|
|
80
|
+
"&",
|
|
81
|
+
8
|
|
82
|
+
],
|
|
83
|
+
[
|
|
84
|
+
"Equals",
|
|
85
|
+
"==",
|
|
86
|
+
9
|
|
87
|
+
],
|
|
88
|
+
[
|
|
89
|
+
"NotEquals",
|
|
90
|
+
"!=",
|
|
91
|
+
9
|
|
92
|
+
],
|
|
93
|
+
[
|
|
94
|
+
"Identical",
|
|
95
|
+
"===",
|
|
96
|
+
9
|
|
97
|
+
],
|
|
98
|
+
[
|
|
99
|
+
"NotIdentical",
|
|
100
|
+
"!==",
|
|
101
|
+
9
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
"Lower",
|
|
105
|
+
"<",
|
|
106
|
+
10
|
|
107
|
+
],
|
|
108
|
+
[
|
|
109
|
+
"LowerEquals",
|
|
110
|
+
"<=",
|
|
111
|
+
10
|
|
112
|
+
],
|
|
113
|
+
[
|
|
114
|
+
"Bigger",
|
|
115
|
+
">",
|
|
116
|
+
10
|
|
117
|
+
],
|
|
118
|
+
[
|
|
119
|
+
"BiggerEquals",
|
|
120
|
+
">=",
|
|
121
|
+
10
|
|
122
|
+
],
|
|
123
|
+
[
|
|
124
|
+
"In",
|
|
125
|
+
"in",
|
|
126
|
+
10
|
|
127
|
+
],
|
|
128
|
+
[
|
|
129
|
+
"InstanceOf",
|
|
130
|
+
"instanceof",
|
|
131
|
+
10
|
|
132
|
+
],
|
|
133
|
+
[
|
|
134
|
+
"Plus",
|
|
135
|
+
"+",
|
|
136
|
+
12
|
|
137
|
+
],
|
|
138
|
+
[
|
|
139
|
+
"Minus",
|
|
140
|
+
"-",
|
|
141
|
+
12
|
|
142
|
+
],
|
|
143
|
+
[
|
|
144
|
+
"Multiply",
|
|
145
|
+
"*",
|
|
146
|
+
13
|
|
147
|
+
],
|
|
148
|
+
[
|
|
149
|
+
"Divide",
|
|
150
|
+
"/",
|
|
151
|
+
13
|
|
152
|
+
],
|
|
153
|
+
[
|
|
154
|
+
"Modulo",
|
|
155
|
+
"%",
|
|
156
|
+
13
|
|
157
|
+
],
|
|
158
|
+
[
|
|
159
|
+
"Exponentiation",
|
|
160
|
+
"**",
|
|
161
|
+
14
|
|
162
|
+
]
|
|
163
|
+
];
|
|
164
|
+
/** Operator integer values that represent assignment forms (`=`, `+=`, etc.). */
|
|
165
|
+
var ASSIGNMENT_OP_NAMES = new Set([
|
|
166
|
+
"Assign",
|
|
167
|
+
"AdditionAssignment",
|
|
168
|
+
"SubtractionAssignment",
|
|
169
|
+
"MultiplicationAssignment",
|
|
170
|
+
"DivisionAssignment",
|
|
171
|
+
"RemainderAssignment",
|
|
172
|
+
"ExponentiationAssignment",
|
|
173
|
+
"AndAssignment",
|
|
174
|
+
"OrAssignment",
|
|
175
|
+
"NullishCoalesceAssignment"
|
|
176
|
+
]);
|
|
177
|
+
var BINARY_OP_STR = /* @__PURE__ */ new Map();
|
|
178
|
+
var BINARY_PRECEDENCE = /* @__PURE__ */ new Map();
|
|
179
|
+
var ASSIGNMENT_OP_VALUES = /* @__PURE__ */ new Set();
|
|
180
|
+
for (const [name, str, precedence] of OP_DEFINITIONS) {
|
|
181
|
+
const value = o.BinaryOperator[name];
|
|
182
|
+
if (typeof value !== "number") continue;
|
|
183
|
+
BINARY_OP_STR.set(value, str);
|
|
184
|
+
BINARY_PRECEDENCE.set(value, precedence);
|
|
185
|
+
if (ASSIGNMENT_OP_NAMES.has(name)) ASSIGNMENT_OP_VALUES.add(value);
|
|
186
|
+
}
|
|
187
|
+
/** Returns true when `op` represents any kind of assignment (`=`, `+=`, etc.). */
|
|
188
|
+
function isAssignmentOperator(op) {
|
|
189
|
+
return ASSIGNMENT_OP_VALUES.has(op);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Determine whether a child expression needs parentheses when it appears
|
|
193
|
+
* as an operand of `parentOp`.
|
|
194
|
+
*/
|
|
195
|
+
function childNeedsParens(parentOp, child, isRhs) {
|
|
196
|
+
if (!(child instanceof o.BinaryOperatorExpr)) return false;
|
|
197
|
+
const childOp = child.operator;
|
|
198
|
+
const parentPrec = BINARY_PRECEDENCE.get(parentOp);
|
|
199
|
+
const childPrec = BINARY_PRECEDENCE.get(childOp);
|
|
200
|
+
if (parentPrec === void 0 || childPrec === void 0) return false;
|
|
201
|
+
if (parentOp === o.BinaryOperator.NullishCoalesce && (childOp === o.BinaryOperator.And || childOp === o.BinaryOperator.Or) || childOp === o.BinaryOperator.NullishCoalesce && (parentOp === o.BinaryOperator.And || parentOp === o.BinaryOperator.Or)) return true;
|
|
202
|
+
if (childPrec < parentPrec) return true;
|
|
203
|
+
if (childPrec === parentPrec) {
|
|
204
|
+
if (parentOp === o.BinaryOperator.Exponentiation) return !isRhs;
|
|
205
|
+
return isRhs;
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
/** Polyfill for `__makeTemplateObject` used in downleveled `$localize` calls. */
|
|
210
|
+
var MAKE_TEMPLATE_OBJECT_POLYFILL = "(this&&this.__makeTemplateObject||function(e,t){return Object.defineProperty?Object.defineProperty(e,\"raw\",{value:t}):e.raw=t,e})";
|
|
211
|
+
var SINGLE_QUOTE_ESCAPE_RE = /[\\'\n\r]/g;
|
|
212
|
+
/** Escape a string for use as a single-quoted string literal. */
|
|
213
|
+
function escapeForLocalize(input) {
|
|
214
|
+
return `'${input.replace(SINGLE_QUOTE_ESCAPE_RE, (match) => {
|
|
215
|
+
if (match === "\n") return "\\n";
|
|
216
|
+
if (match === "\r") return "\\r";
|
|
217
|
+
return `\\${match}`;
|
|
218
|
+
})}'`;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Emits Angular output AST directly to JavaScript strings, bypassing
|
|
222
|
+
* ts.factory node creation and ts.Printer serialization (~4x faster).
|
|
223
|
+
*/
|
|
224
|
+
var JSEmitter = class JSEmitter {
|
|
225
|
+
/** Set by compile() so WrappedNodeExpr fallback can print with correct source context. */
|
|
226
|
+
static _currentSourceFile;
|
|
227
|
+
/** Set by compile() so OXC-based WrappedNodeExpr can slice original source. */
|
|
228
|
+
static _currentSourceCode;
|
|
229
|
+
emitExpr(e) {
|
|
230
|
+
if (!e) return "null";
|
|
231
|
+
if (typeof e.visitExpression === "function") return e.visitExpression(this, null);
|
|
232
|
+
if ("key" in e && "value" in e) return (e.quoted ? JSON.stringify(e.key) : e.key) + ": " + this.emitExpr(e.value);
|
|
233
|
+
return "null";
|
|
234
|
+
}
|
|
235
|
+
visitWrappedNodeExpr(ast) {
|
|
236
|
+
const node = ast.node;
|
|
237
|
+
if (typeof node === "string") return node;
|
|
238
|
+
if (typeof node.type === "string" && typeof node.start === "number") {
|
|
239
|
+
const src = JSEmitter._currentSourceCode;
|
|
240
|
+
if (node.type === "Identifier") return node.name;
|
|
241
|
+
if (node.type === "StringLiteral") return JSON.stringify(node.value);
|
|
242
|
+
if (node.type === "NumericLiteral") return String(node.value);
|
|
243
|
+
if (node.type === "BooleanLiteral") return node.value ? "true" : "false";
|
|
244
|
+
if (node.type === "NullLiteral") return "null";
|
|
245
|
+
if (node.type === "TemplateLiteral" && !node.expressions?.length) return "`" + node.quasis[0].value.raw + "`";
|
|
246
|
+
if (src) return src.slice(node.start, node.end);
|
|
247
|
+
return "null";
|
|
248
|
+
}
|
|
249
|
+
if (node.kind === ts.SyntaxKind.Identifier) return node.escapedText;
|
|
250
|
+
if (node.kind === ts.SyntaxKind.StringLiteral) return JSON.stringify(node.text);
|
|
251
|
+
if (node.kind === ts.SyntaxKind.NumericLiteral) return node.text;
|
|
252
|
+
if (node.kind === ts.SyntaxKind.TrueKeyword) return "true";
|
|
253
|
+
if (node.kind === ts.SyntaxKind.FalseKeyword) return "false";
|
|
254
|
+
if (node.kind === ts.SyntaxKind.NullKeyword) return "null";
|
|
255
|
+
if (node.kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral) return "`" + node.text + "`";
|
|
256
|
+
return sharedPrinter.printNode(ts.EmitHint.Unspecified, node, JSEmitter._currentSourceFile || emptySourceFile);
|
|
257
|
+
}
|
|
258
|
+
visitExternalExpr(ast) {
|
|
259
|
+
const name = ast.value.name;
|
|
260
|
+
if (name === "ngDevMode") return name;
|
|
261
|
+
if (!name) return "i0";
|
|
262
|
+
return "i0." + name;
|
|
263
|
+
}
|
|
264
|
+
visitLiteralExpr(ast) {
|
|
265
|
+
const v = ast.value;
|
|
266
|
+
if (typeof v === "string") return JSON.stringify(v);
|
|
267
|
+
if (typeof v === "number") return v < 0 ? "(-" + -v + ")" : "" + v;
|
|
268
|
+
if (typeof v === "boolean") return v ? "true" : "false";
|
|
269
|
+
if (v === void 0) return "void 0";
|
|
270
|
+
return "null";
|
|
271
|
+
}
|
|
272
|
+
visitLiteralArrayExpr(ast) {
|
|
273
|
+
return "[" + ast.entries.map((e) => this.emitExpr(e)).join(", ") + "]";
|
|
274
|
+
}
|
|
275
|
+
visitLiteralMapExpr(ast) {
|
|
276
|
+
return "{" + ast.entries.map((e) => this.emitExpr(e)).join(", ") + "}";
|
|
277
|
+
}
|
|
278
|
+
visitInvokeFunctionExpr(ast) {
|
|
279
|
+
const fn = ast.fn.visitExpression(this, null);
|
|
280
|
+
const args = ast.args.map((a) => this.emitExpr(a)).join(", ");
|
|
281
|
+
if (ast.fn instanceof o.ArrowFunctionExpr || ast.fn instanceof o.FunctionExpr) return "(" + fn + ")(" + args + ")";
|
|
282
|
+
return fn + "(" + args + ")";
|
|
283
|
+
}
|
|
284
|
+
visitReadVarExpr(ast) {
|
|
285
|
+
if (ast.name === "this") return "this";
|
|
286
|
+
if (ast.name === "super") return "super";
|
|
287
|
+
return ast.name;
|
|
288
|
+
}
|
|
289
|
+
visitReadPropExpr(ast) {
|
|
290
|
+
return ast.receiver.visitExpression(this, null) + "." + ast.name;
|
|
291
|
+
}
|
|
292
|
+
visitReadKeyExpr(ast) {
|
|
293
|
+
return ast.receiver.visitExpression(this, null) + "[" + ast.index.visitExpression(this, null) + "]";
|
|
294
|
+
}
|
|
295
|
+
visitConditionalExpr(ast) {
|
|
296
|
+
return "(" + ast.condition.visitExpression(this, null) + " ? " + ast.trueCase.visitExpression(this, null) + " : " + ast.falseCase.visitExpression(this, null) + ")";
|
|
297
|
+
}
|
|
298
|
+
visitBinaryOperatorExpr(ast) {
|
|
299
|
+
const op = BINARY_OP_STR.get(ast.operator);
|
|
300
|
+
if (op === void 0) throw new Error(`[fast-compile] Unsupported BinaryOperator value ${ast.operator} on @angular/compiler ${o.VERSION?.full ?? "(unknown version)"}`);
|
|
301
|
+
const lhsRaw = ast.lhs.visitExpression(this, null);
|
|
302
|
+
const rhsRaw = ast.rhs.visitExpression(this, null);
|
|
303
|
+
const lhs = childNeedsParens(ast.operator, ast.lhs, false) ? "(" + lhsRaw + ")" : lhsRaw;
|
|
304
|
+
const rhs = childNeedsParens(ast.operator, ast.rhs, true) ? "(" + rhsRaw + ")" : rhsRaw;
|
|
305
|
+
const expr = lhs + " " + op + " " + rhs;
|
|
306
|
+
if (isAssignmentOperator(ast.operator)) return "(" + expr + ")";
|
|
307
|
+
return expr;
|
|
308
|
+
}
|
|
309
|
+
visitNotExpr(ast) {
|
|
310
|
+
return "!(" + ast.condition.visitExpression(this, null) + ")";
|
|
311
|
+
}
|
|
312
|
+
visitFunctionExpr(ast) {
|
|
313
|
+
return "(" + ast.params.map((p) => p.name).join(", ") + ") => {" + ast.statements.map((s) => s.visitStatement(this, null)).join(" ") + "}";
|
|
314
|
+
}
|
|
315
|
+
visitArrowFunctionExpr(ast) {
|
|
316
|
+
const params = "(" + ast.params.map((p) => p.name).join(", ") + ")";
|
|
317
|
+
if (Array.isArray(ast.body)) return params + " => {" + ast.body.map((s) => s.visitStatement(this, null)).join(" ") + "}";
|
|
318
|
+
const bodyExpr = ast.body.visitExpression(this, null);
|
|
319
|
+
if (ast.body instanceof o.LiteralMapExpr) return params + " => (" + bodyExpr + ")";
|
|
320
|
+
return params + " => " + bodyExpr;
|
|
321
|
+
}
|
|
322
|
+
visitWriteVarExpr(ast) {
|
|
323
|
+
return "(" + ast.name + " = " + ast.value.visitExpression(this, null) + ")";
|
|
324
|
+
}
|
|
325
|
+
visitWritePropExpr(ast) {
|
|
326
|
+
return "(" + ast.receiver.visitExpression(this, null) + "." + ast.name + " = " + ast.value.visitExpression(this, null) + ")";
|
|
327
|
+
}
|
|
328
|
+
visitWriteKeyExpr(ast) {
|
|
329
|
+
return "(" + ast.receiver.visitExpression(this, null) + "[" + ast.index.visitExpression(this, null) + "] = " + ast.value.visitExpression(this, null) + ")";
|
|
330
|
+
}
|
|
331
|
+
visitInvokeMethodExpr(ast) {
|
|
332
|
+
return ast.receiver.visitExpression(this, null) + "." + ast.name + "(" + ast.args.map((a) => this.emitExpr(a)).join(", ") + ")";
|
|
333
|
+
}
|
|
334
|
+
visitTypeofExpr(ast) {
|
|
335
|
+
return "typeof " + ast.expr.visitExpression(this, null);
|
|
336
|
+
}
|
|
337
|
+
visitUnaryOperatorExpr(ast) {
|
|
338
|
+
return "-(" + ast.expr.visitExpression(this, null) + ")";
|
|
339
|
+
}
|
|
340
|
+
visitInstantiateExpr(ast) {
|
|
341
|
+
return "new (" + ast.classExpr.visitExpression(this, null) + ")(" + ast.args.map((a) => this.emitExpr(a)).join(", ") + ")";
|
|
342
|
+
}
|
|
343
|
+
visitCommaExpr(ast) {
|
|
344
|
+
return ast.parts.map((p) => p.visitExpression(this, null)).join(", ");
|
|
345
|
+
}
|
|
346
|
+
visitParenthesizedExpr(ast) {
|
|
347
|
+
return "(" + ast.expr.visitExpression(this, null) + ")";
|
|
348
|
+
}
|
|
349
|
+
visitVoidExpr(ast) {
|
|
350
|
+
return "void " + ast.expr.visitExpression(this, null);
|
|
351
|
+
}
|
|
352
|
+
visitSpreadElementExpr(ast) {
|
|
353
|
+
return "..." + ast.expression.visitExpression(this, null);
|
|
354
|
+
}
|
|
355
|
+
visitDynamicImportExpr(ast) {
|
|
356
|
+
return "import(" + (typeof ast.url === "string" ? JSON.stringify(ast.url) : ast.url.visitExpression(this, null)) + ")";
|
|
357
|
+
}
|
|
358
|
+
visitTemplateLiteralExpr(ast) {
|
|
359
|
+
return "`" + ast.elements[0].text + ast.expressions.map((e, i) => "${" + e.visitExpression(this, null) + "}" + ast.elements[i + 1].text).join("") + "`";
|
|
360
|
+
}
|
|
361
|
+
visitTaggedTemplateLiteralExpr(ast) {
|
|
362
|
+
const elements = ast.template.elements;
|
|
363
|
+
const expressions = ast.template.expressions;
|
|
364
|
+
const head = elements[0].text;
|
|
365
|
+
const spans = expressions.map((e, i) => "${" + e.visitExpression(this, null) + "}" + elements[i + 1].text).join("");
|
|
366
|
+
return ast.tag.visitExpression(this, null) + "`" + head + spans + "`";
|
|
367
|
+
}
|
|
368
|
+
visitLocalizedString(ast) {
|
|
369
|
+
const parts = [ast.serializeI18nHead()];
|
|
370
|
+
for (let i = 1; i < ast.messageParts.length; i++) parts.push(ast.serializeI18nTemplatePart(i));
|
|
371
|
+
const cooked = parts.map((p) => escapeForLocalize(p.cooked)).join(", ");
|
|
372
|
+
const raw = parts.map((p) => escapeForLocalize(p.raw)).join(", ");
|
|
373
|
+
const exprs = ast.expressions.map((e) => this.emitExpr(e));
|
|
374
|
+
return "$localize(" + MAKE_TEMPLATE_OBJECT_POLYFILL + "([" + cooked + "], [" + raw + "])" + (exprs.length > 0 ? ", " + exprs.join(", ") : "") + ")";
|
|
375
|
+
}
|
|
376
|
+
visitRegularExpressionLiteral(ast) {
|
|
377
|
+
return "/" + (ast.body ?? ast.pattern) + "/" + ast.flags;
|
|
378
|
+
}
|
|
379
|
+
visitTemplateLiteralElementExpr(ast) {
|
|
380
|
+
return JSON.stringify(ast.text);
|
|
381
|
+
}
|
|
382
|
+
visitReturnStmt(stmt) {
|
|
383
|
+
return "return " + stmt.value.visitExpression(this, null) + ";";
|
|
384
|
+
}
|
|
385
|
+
visitExpressionStmt(stmt) {
|
|
386
|
+
return stmt.expr.visitExpression(this, null) + ";";
|
|
387
|
+
}
|
|
388
|
+
visitIfStmt(stmt) {
|
|
389
|
+
let s = "if (" + stmt.condition.visitExpression(this, null) + ") {" + stmt.trueCase.map((s2) => s2.visitStatement(this, null)).join(" ") + "}";
|
|
390
|
+
if (stmt.falseCase.length) s += " else {" + stmt.falseCase.map((s2) => s2.visitStatement(this, null)).join(" ") + "}";
|
|
391
|
+
return s;
|
|
392
|
+
}
|
|
393
|
+
visitDeclareVarStmt(stmt) {
|
|
394
|
+
return (stmt.hasModifier(o.StmtModifier.Final) ? "const" : "let") + " " + stmt.name + (stmt.value ? " = " + stmt.value.visitExpression(this, null) : "") + ";";
|
|
395
|
+
}
|
|
396
|
+
visitDeclareFunctionStmt(stmt) {
|
|
397
|
+
return "function " + stmt.name + "(" + stmt.params.map((p) => p.name).join(", ") + ") {" + stmt.statements.map((s) => s.visitStatement(this, null)).join(" ") + "}";
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
var stringEmitter = new JSEmitter();
|
|
401
|
+
/** Emit Angular output AST expression directly to a JavaScript string. */
|
|
402
|
+
function emitAngularExpr(expr) {
|
|
403
|
+
return expr.visitExpression(stringEmitter, null);
|
|
404
|
+
}
|
|
405
|
+
/** Emit Angular output AST statement directly to a JavaScript string. */
|
|
406
|
+
function emitAngularStmt(stmt) {
|
|
407
|
+
return stmt.visitStatement(stringEmitter, null);
|
|
408
|
+
}
|
|
409
|
+
/** Set the current source file for WrappedNodeExpr fallback printing. */
|
|
410
|
+
function setEmitterSourceFile(sf) {
|
|
411
|
+
JSEmitter._currentSourceFile = sf;
|
|
412
|
+
}
|
|
413
|
+
/** Set the current source code for OXC-based WrappedNodeExpr slice fallback. */
|
|
414
|
+
function setEmitterSourceCode(code) {
|
|
415
|
+
JSEmitter._currentSourceCode = code;
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
export { emitAngularExpr, emitAngularStmt, setEmitterSourceCode, setEmitterSourceFile };
|
|
419
|
+
|
|
420
|
+
//# sourceMappingURL=js-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-emitter.js","names":[],"sources":["../../../../src/lib/compiler/js-emitter.ts"],"sourcesContent":["import * as ts from 'typescript';\nimport * as o from '@angular/compiler';\n\n/** Shared printer — only used as fallback for complex WrappedNodeExpr (e.g. decorator args). */\nconst sharedPrinter = ts.createPrinter({ removeComments: true });\nconst emptySourceFile = ts.createSourceFile(\n '_.ts',\n '',\n ts.ScriptTarget.Latest,\n false,\n);\n\n// Operator metadata table — name, JS string, and precedence (higher = tighter\n// binding). Used to build version-aware lookup maps below.\n//\n// Why a runtime build instead of static `[o.BinaryOperator.Equals]: '=='`\n// literals: Angular's `BinaryOperator` enum gains members between major\n// versions (Assign and the 9 compound assignments were added in v21,\n// Exponentiation/In in v20, InstanceOf in v21). On older Angular versions\n// the missing members evaluate to `undefined` at module load time, and\n// every `[undefined]: '...'` entry collides on the single string key\n// `\"undefined\"` — last write wins. Pre-Phase-1, that gave the v19 install\n// `BINARY_OP_STR[\"undefined\"] === '??='`, so any expression with an\n// unknown operator emitted `??=` instead of failing loudly. Building the\n// table by iterating known names and skipping `undefined` values\n// eliminates the collision: members that don't exist on the installed\n// Angular are simply absent from the map.\n//\n// Precedence values match MDN's table, skipping levels not used by Angular\n// (bitwise XOR, shifts).\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_precedence\nconst OP_DEFINITIONS: ReadonlyArray<\n readonly [name: string, str: string, precedence: number]\n> = [\n ['Assign', '=', 2],\n ['AdditionAssignment', '+=', 2],\n ['SubtractionAssignment', '-=', 2],\n ['MultiplicationAssignment', '*=', 2],\n ['DivisionAssignment', '/=', 2],\n ['RemainderAssignment', '%=', 2],\n ['ExponentiationAssignment', '**=', 2],\n ['AndAssignment', '&&=', 2],\n ['OrAssignment', '||=', 2],\n ['NullishCoalesceAssignment', '??=', 2],\n ['NullishCoalesce', '??', 4],\n ['Or', '||', 4],\n ['And', '&&', 5],\n ['BitwiseOr', '|', 6],\n ['BitwiseAnd', '&', 8],\n ['Equals', '==', 9],\n ['NotEquals', '!=', 9],\n ['Identical', '===', 9],\n ['NotIdentical', '!==', 9],\n ['Lower', '<', 10],\n ['LowerEquals', '<=', 10],\n ['Bigger', '>', 10],\n ['BiggerEquals', '>=', 10],\n ['In', 'in', 10],\n ['InstanceOf', 'instanceof', 10],\n ['Plus', '+', 12],\n ['Minus', '-', 12],\n ['Multiply', '*', 13],\n ['Divide', '/', 13],\n ['Modulo', '%', 13],\n ['Exponentiation', '**', 14],\n];\n\n/** Operator integer values that represent assignment forms (`=`, `+=`, etc.). */\nconst ASSIGNMENT_OP_NAMES: ReadonlySet<string> = new Set([\n 'Assign',\n 'AdditionAssignment',\n 'SubtractionAssignment',\n 'MultiplicationAssignment',\n 'DivisionAssignment',\n 'RemainderAssignment',\n 'ExponentiationAssignment',\n 'AndAssignment',\n 'OrAssignment',\n 'NullishCoalesceAssignment',\n]);\n\nconst BINARY_OP_STR = new Map<number, string>();\nconst BINARY_PRECEDENCE = new Map<number, number>();\nconst ASSIGNMENT_OP_VALUES = new Set<number>();\n\nfor (const [name, str, precedence] of OP_DEFINITIONS) {\n const value = (o.BinaryOperator as Record<string, unknown>)[name];\n if (typeof value !== 'number') continue;\n BINARY_OP_STR.set(value, str);\n BINARY_PRECEDENCE.set(value, precedence);\n if (ASSIGNMENT_OP_NAMES.has(name)) {\n ASSIGNMENT_OP_VALUES.add(value);\n }\n}\n\n/** Returns true when `op` represents any kind of assignment (`=`, `+=`, etc.). */\nfunction isAssignmentOperator(op: o.BinaryOperator): boolean {\n return ASSIGNMENT_OP_VALUES.has(op);\n}\n\n/**\n * Determine whether a child expression needs parentheses when it appears\n * as an operand of `parentOp`.\n */\nfunction childNeedsParens(\n parentOp: o.BinaryOperator,\n child: o.Expression,\n isRhs: boolean,\n): boolean {\n if (!(child instanceof o.BinaryOperatorExpr)) return false;\n\n const childOp = child.operator;\n const parentPrec = BINARY_PRECEDENCE.get(parentOp);\n const childPrec = BINARY_PRECEDENCE.get(childOp);\n if (parentPrec === undefined || childPrec === undefined) return false;\n\n // ?? cannot appear with || or && without explicit grouping (JS spec)\n if (\n (parentOp === o.BinaryOperator.NullishCoalesce &&\n (childOp === o.BinaryOperator.And || childOp === o.BinaryOperator.Or)) ||\n (childOp === o.BinaryOperator.NullishCoalesce &&\n (parentOp === o.BinaryOperator.And || parentOp === o.BinaryOperator.Or))\n ) {\n return true;\n }\n\n // Child has strictly lower precedence\n if (childPrec < parentPrec) return true;\n\n // Same precedence — depends on associativity and position\n if (childPrec === parentPrec) {\n // ** is right-associative: LHS same-prec needs parens, RHS does not\n if (parentOp === o.BinaryOperator.Exponentiation) return !isRhs;\n // All other ops are left-associative: RHS same-prec needs parens\n return isRhs;\n }\n\n return false;\n}\n\n/** Polyfill for `__makeTemplateObject` used in downleveled `$localize` calls. */\nconst MAKE_TEMPLATE_OBJECT_POLYFILL =\n '(this&&this.__makeTemplateObject||function(e,t){return Object.defineProperty?Object.defineProperty(e,\"raw\",{value:t}):e.raw=t,e})';\n\nconst SINGLE_QUOTE_ESCAPE_RE = /[\\\\'\\n\\r]/g;\n\n/** Escape a string for use as a single-quoted string literal. */\nfunction escapeForLocalize(input: string): string {\n const body = input.replace(SINGLE_QUOTE_ESCAPE_RE, (match) => {\n if (match === '\\n') return '\\\\n';\n if (match === '\\r') return '\\\\r';\n return `\\\\${match}`;\n });\n return `'${body}'`;\n}\n\n/**\n * Emits Angular output AST directly to JavaScript strings, bypassing\n * ts.factory node creation and ts.Printer serialization (~4x faster).\n */\nclass JSEmitter implements o.ExpressionVisitor, o.StatementVisitor {\n /** Set by compile() so WrappedNodeExpr fallback can print with correct source context. */\n static _currentSourceFile: ts.SourceFile | undefined;\n /** Set by compile() so OXC-based WrappedNodeExpr can slice original source. */\n static _currentSourceCode: string | undefined;\n\n private emitExpr(e: any): string {\n if (!e) return 'null';\n if (typeof e.visitExpression === 'function')\n return e.visitExpression(this, null);\n // Angular v21 LiteralMapPropertyAssignment: {key, value, quoted}\n if ('key' in e && 'value' in e) {\n const key = e.quoted ? JSON.stringify(e.key) : e.key;\n return key + ': ' + this.emitExpr(e.value);\n }\n return 'null';\n }\n visitWrappedNodeExpr(ast: o.WrappedNodeExpr<any>) {\n const node = ast.node;\n\n // Raw source text: already resolved to a string at wrap time\n if (typeof node === 'string') return node;\n\n // OXC AST nodes: identified by string `type` property + numeric start/end\n if (typeof node.type === 'string' && typeof node.start === 'number') {\n const src = JSEmitter._currentSourceCode;\n if (node.type === 'Identifier') return node.name;\n if (node.type === 'StringLiteral') return JSON.stringify(node.value);\n if (node.type === 'NumericLiteral') return String(node.value);\n if (node.type === 'BooleanLiteral') return node.value ? 'true' : 'false';\n if (node.type === 'NullLiteral') return 'null';\n if (node.type === 'TemplateLiteral' && !node.expressions?.length)\n return '`' + node.quasis[0].value.raw + '`';\n // Fallback: slice original source for complex OXC nodes\n if (src) return src.slice(node.start, node.end);\n return 'null';\n }\n\n // TypeScript AST nodes: identified by numeric `kind` property\n if (node.kind === ts.SyntaxKind.Identifier)\n return (node as ts.Identifier).escapedText as string;\n if (node.kind === ts.SyntaxKind.StringLiteral)\n return JSON.stringify((node as ts.StringLiteral).text);\n if (node.kind === ts.SyntaxKind.NumericLiteral)\n return (node as ts.NumericLiteral).text;\n if (node.kind === ts.SyntaxKind.TrueKeyword) return 'true';\n if (node.kind === ts.SyntaxKind.FalseKeyword) return 'false';\n if (node.kind === ts.SyntaxKind.NullKeyword) return 'null';\n if (node.kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral)\n return '`' + (node as ts.NoSubstitutionTemplateLiteral).text + '`';\n // Fallback for complex wrapped TS nodes (e.g. decorator arguments, array literals).\n // Use currentSourceFile when available for correct position-based printing.\n return sharedPrinter.printNode(\n ts.EmitHint.Unspecified,\n node,\n JSEmitter._currentSourceFile || emptySourceFile,\n );\n }\n visitExternalExpr(ast: o.ExternalExpr) {\n const name = ast.value.name;\n if (name === 'ngDevMode') return name;\n // When name is null/undefined, this is a bare module reference (e.g. ngImport: i0)\n if (!name) return 'i0';\n return 'i0.' + name;\n }\n visitLiteralExpr(ast: o.LiteralExpr) {\n const v = ast.value;\n if (typeof v === 'string') return JSON.stringify(v);\n if (typeof v === 'number') return v < 0 ? '(-' + -v + ')' : '' + v;\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n if (v === undefined) return 'void 0';\n return 'null';\n }\n visitLiteralArrayExpr(ast: o.LiteralArrayExpr) {\n return '[' + ast.entries.map((e) => this.emitExpr(e)).join(', ') + ']';\n }\n visitLiteralMapExpr(ast: o.LiteralMapExpr) {\n return '{' + ast.entries.map((e) => this.emitExpr(e)).join(', ') + '}';\n }\n visitInvokeFunctionExpr(ast: o.InvokeFunctionExpr) {\n const fn = ast.fn.visitExpression(this, null);\n const args = ast.args.map((a: any) => this.emitExpr(a)).join(', ');\n // Wrap arrow/function expressions in parens for valid IIFE syntax\n if (\n ast.fn instanceof o.ArrowFunctionExpr ||\n ast.fn instanceof o.FunctionExpr\n ) {\n return '(' + fn + ')(' + args + ')';\n }\n return fn + '(' + args + ')';\n }\n visitReadVarExpr(ast: o.ReadVarExpr) {\n if (ast.name === 'this') return 'this';\n if (ast.name === 'super') return 'super';\n return ast.name!;\n }\n visitReadPropExpr(ast: o.ReadPropExpr) {\n return ast.receiver.visitExpression(this, null) + '.' + ast.name;\n }\n visitReadKeyExpr(ast: o.ReadKeyExpr) {\n return (\n ast.receiver.visitExpression(this, null) +\n '[' +\n ast.index.visitExpression(this, null) +\n ']'\n );\n }\n visitConditionalExpr(ast: o.ConditionalExpr) {\n return (\n '(' +\n ast.condition.visitExpression(this, null) +\n ' ? ' +\n ast.trueCase.visitExpression(this, null) +\n ' : ' +\n ast.falseCase!.visitExpression(this, null) +\n ')'\n );\n }\n visitBinaryOperatorExpr(ast: o.BinaryOperatorExpr) {\n // `BINARY_OP_STR.get(...)` returns `undefined` when the operator value\n // doesn't exist in the installed Angular's `BinaryOperator` enum (the\n // enum is missing 13 members on v19, 11 on v20). Falling back to `'='`\n // would silently produce wrong code; instead, we throw so the error\n // surfaces in the DEBUG output and the calling test fails loudly.\n const op = BINARY_OP_STR.get(ast.operator);\n if (op === undefined) {\n throw new Error(\n `[fast-compile] Unsupported BinaryOperator value ${ast.operator} ` +\n `on @angular/compiler ${o.VERSION?.full ?? '(unknown version)'}`,\n );\n }\n\n const lhsRaw = ast.lhs.visitExpression(this, null);\n const rhsRaw = ast.rhs.visitExpression(this, null);\n\n const lhs = childNeedsParens(ast.operator, ast.lhs, false)\n ? '(' + lhsRaw + ')'\n : lhsRaw;\n const rhs = childNeedsParens(ast.operator, ast.rhs, true)\n ? '(' + rhsRaw + ')'\n : rhsRaw;\n\n const expr = lhs + ' ' + op + ' ' + rhs;\n\n // Wrap assignments in parens so they work correctly as ternary conditions:\n // (tmp = val) ? a : b vs tmp = val ? a : b\n //\n // `isAssignmentOperator` is built at module load time from the operator\n // names that actually exist on the installed Angular's enum. This\n // works whether `Assign` is present (v21+) or absent (v19/v20) — on\n // older versions the assignment branch is simply unreachable because\n // Angular's compiler never constructs an Assign-operator expression.\n if (isAssignmentOperator(ast.operator)) {\n return '(' + expr + ')';\n }\n return expr;\n }\n visitNotExpr(ast: o.NotExpr) {\n return '!(' + ast.condition.visitExpression(this, null) + ')';\n }\n visitFunctionExpr(ast: o.FunctionExpr) {\n return (\n '(' +\n ast.params.map((p: any) => p.name).join(', ') +\n ') => {' +\n ast.statements.map((s: any) => s.visitStatement(this, null)).join(' ') +\n '}'\n );\n }\n visitArrowFunctionExpr(ast: o.ArrowFunctionExpr) {\n const params = '(' + ast.params.map((p: any) => p.name).join(', ') + ')';\n if (Array.isArray(ast.body))\n return (\n params +\n ' => {' +\n ast.body.map((s: any) => s.visitStatement(this, null)).join(' ') +\n '}'\n );\n const bodyExpr = (ast.body as o.Expression).visitExpression(this, null);\n // Wrap object literals in parens so `() => {key: val}` isn't parsed\n // as a block with a labeled statement.\n if (ast.body instanceof o.LiteralMapExpr) {\n return params + ' => (' + bodyExpr + ')';\n }\n return params + ' => ' + bodyExpr;\n }\n // `Write*Expr` visitors must wrap the assignment in parentheses so that\n // it composes correctly when nested inside higher-precedence parents\n // (e.g. as the test of a `ConditionalExpr`). Without the wrapping,\n // tmp = ctx.data() ? 0 : -1\n // parses as `tmp = (ctx.data() ? 0 : -1)` because assignment binds\n // looser than the ternary, which silently assigns the wrong value to\n // `tmp`. Angular's own `AbstractEmitterVisitor.visitWriteVarExpr`\n // applies the same context-sensitive wrapping (it skips the parens\n // when the assignment is a top-level statement to avoid `(x = 1);`\n // noise; we always wrap for simplicity — the redundant parens at\n // statement level are harmless).\n //\n // This matters specifically on Angular v19/v20, where assignment is\n // represented in the IR via `WriteVarExpr` / `AssignTemporaryExpr →\n // WriteVarExpr`. On v21+ the same construct is represented via\n // `BinaryOperatorExpr(Assign, ...)`, which `visitBinaryOperatorExpr`\n // already wraps via `isAssignmentOperator`. Without these wrappers,\n // `@if (data(); as item)` and similar conditional alias forms emit\n // runtime-broken code on v19/v20.\n visitWriteVarExpr(ast: any) {\n return '(' + ast.name + ' = ' + ast.value.visitExpression(this, null) + ')';\n }\n visitWritePropExpr(ast: any) {\n return (\n '(' +\n ast.receiver.visitExpression(this, null) +\n '.' +\n ast.name +\n ' = ' +\n ast.value.visitExpression(this, null) +\n ')'\n );\n }\n visitWriteKeyExpr(ast: any) {\n return (\n '(' +\n ast.receiver.visitExpression(this, null) +\n '[' +\n ast.index.visitExpression(this, null) +\n '] = ' +\n ast.value.visitExpression(this, null) +\n ')'\n );\n }\n visitInvokeMethodExpr(ast: any) {\n return (\n ast.receiver.visitExpression(this, null) +\n '.' +\n ast.name +\n '(' +\n ast.args.map((a: any) => this.emitExpr(a)).join(', ') +\n ')'\n );\n }\n visitTypeofExpr(ast: o.TypeofExpr) {\n return 'typeof ' + ast.expr.visitExpression(this, null);\n }\n visitUnaryOperatorExpr(ast: o.UnaryOperatorExpr) {\n return '-(' + ast.expr.visitExpression(this, null) + ')';\n }\n visitInstantiateExpr(ast: o.InstantiateExpr) {\n return (\n 'new (' +\n ast.classExpr.visitExpression(this, null) +\n ')(' +\n ast.args.map((a: any) => this.emitExpr(a)).join(', ') +\n ')'\n );\n }\n visitCommaExpr(ast: o.CommaExpr) {\n return ast.parts.map((p: any) => p.visitExpression(this, null)).join(', ');\n }\n visitParenthesizedExpr(ast: o.ParenthesizedExpr) {\n return '(' + ast.expr.visitExpression(this, null) + ')';\n }\n visitVoidExpr(ast: o.VoidExpr) {\n return 'void ' + ast.expr.visitExpression(this, null);\n }\n visitSpreadElementExpr(ast: o.SpreadElementExpr) {\n return '...' + (ast as any).expression.visitExpression(this, null);\n }\n visitDynamicImportExpr(ast: o.DynamicImportExpr) {\n return (\n 'import(' +\n (typeof ast.url === 'string'\n ? JSON.stringify(ast.url)\n : ast.url.visitExpression(this, null)) +\n ')'\n );\n }\n visitTemplateLiteralExpr(ast: o.TemplateLiteralExpr) {\n return (\n '`' +\n ast.elements[0].text +\n ast.expressions\n .map(\n (e: any, i: number) =>\n '${' +\n e.visitExpression(this, null) +\n '}' +\n ast.elements[i + 1].text,\n )\n .join('') +\n '`'\n );\n }\n visitTaggedTemplateLiteralExpr(ast: any) {\n const elements = ast.template.elements;\n const expressions = ast.template.expressions;\n const head = elements[0].text;\n const spans = expressions\n .map(\n (e: any, i: number) =>\n '${' + e.visitExpression(this, null) + '}' + elements[i + 1].text,\n )\n .join('');\n return ast.tag.visitExpression(this, null) + '`' + head + spans + '`';\n }\n visitLocalizedString(ast: o.LocalizedString) {\n // Emit the downleveled form:\n // $localize(makeTemplateObject(cooked, raw), expr1, expr2, ...)\n const parts: { cooked: string; raw: string }[] = [ast.serializeI18nHead()];\n for (let i = 1; i < ast.messageParts.length; i++) {\n parts.push(ast.serializeI18nTemplatePart(i));\n }\n const cooked = parts.map((p) => escapeForLocalize(p.cooked)).join(', ');\n const raw = parts.map((p) => escapeForLocalize(p.raw)).join(', ');\n const exprs = ast.expressions.map((e) => this.emitExpr(e));\n return (\n '$localize(' +\n MAKE_TEMPLATE_OBJECT_POLYFILL +\n '([' +\n cooked +\n '], [' +\n raw +\n '])' +\n (exprs.length > 0 ? ', ' + exprs.join(', ') : '') +\n ')'\n );\n }\n visitRegularExpressionLiteral(ast: any) {\n return '/' + (ast.body ?? ast.pattern) + '/' + ast.flags;\n }\n visitTemplateLiteralElementExpr(ast: o.TemplateLiteralElementExpr) {\n return JSON.stringify(ast.text);\n }\n // Statement visitors\n visitReturnStmt(stmt: o.ReturnStatement) {\n return 'return ' + stmt.value.visitExpression(this, null) + ';';\n }\n visitExpressionStmt(stmt: o.ExpressionStatement) {\n return stmt.expr.visitExpression(this, null) + ';';\n }\n visitIfStmt(stmt: o.IfStmt) {\n let s =\n 'if (' +\n stmt.condition.visitExpression(this, null) +\n ') {' +\n stmt.trueCase.map((s2: any) => s2.visitStatement(this, null)).join(' ') +\n '}';\n if (stmt.falseCase.length)\n s +=\n ' else {' +\n stmt.falseCase\n .map((s2: any) => s2.visitStatement(this, null))\n .join(' ') +\n '}';\n return s;\n }\n visitDeclareVarStmt(stmt: o.DeclareVarStmt) {\n const kw = stmt.hasModifier(o.StmtModifier.Final) ? 'const' : 'let';\n return (\n kw +\n ' ' +\n stmt.name +\n (stmt.value ? ' = ' + stmt.value.visitExpression(this, null) : '') +\n ';'\n );\n }\n visitDeclareFunctionStmt(stmt: o.DeclareFunctionStmt) {\n return (\n 'function ' +\n stmt.name +\n '(' +\n stmt.params.map((p: any) => p.name).join(', ') +\n ') {' +\n stmt.statements.map((s: any) => s.visitStatement(this, null)).join(' ') +\n '}'\n );\n }\n}\n\nconst stringEmitter = new JSEmitter();\n\n/** Emit Angular output AST expression directly to a JavaScript string. */\nexport function emitAngularExpr(expr: o.Expression): string {\n return expr.visitExpression(stringEmitter, null);\n}\n\n/** Emit Angular output AST statement directly to a JavaScript string. */\nexport function emitAngularStmt(stmt: o.Statement): string {\n return stmt.visitStatement(stringEmitter, null);\n}\n\n/** Set the current source file for WrappedNodeExpr fallback printing. */\nexport function setEmitterSourceFile(sf: ts.SourceFile | undefined): void {\n JSEmitter._currentSourceFile = sf;\n}\n\n/** Set the current source code for OXC-based WrappedNodeExpr slice fallback. */\nexport function setEmitterSourceCode(code: string | undefined): void {\n JSEmitter._currentSourceCode = code;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk the top-level statements of an OXC program and collect a map of
|
|
3
|
+
* statically-resolvable string-valued `const NAME = ...` declarations.
|
|
4
|
+
*
|
|
5
|
+
* Used so decorator metadata fields like `template:` can reference
|
|
6
|
+
* module-level Tailwind class chains (or any other string constants) via
|
|
7
|
+
* JS template-literal interpolation. Resolution is iterative: a const may
|
|
8
|
+
* reference earlier-resolved consts via `${other}` interpolation.
|
|
9
|
+
*
|
|
10
|
+
* Only `const` declarations are considered. Non-string initializers,
|
|
11
|
+
* function calls, member access, and any expression that cannot be reduced
|
|
12
|
+
* to a string at parse time are ignored.
|
|
13
|
+
*/
|
|
14
|
+
export declare function collectStringConstants(oxcProgram: any): Map<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Extract decorator metadata from an OXC decorator AST node.
|
|
17
|
+
* Parses @Component, @Directive, @Pipe, @Injectable, @NgModule arguments.
|
|
18
|
+
*
|
|
19
|
+
* `stringConsts`, when provided, lets string-typed metadata fields
|
|
20
|
+
* (`template`, `selector`, `templateUrl`, `styles`, `styleUrl`, `styleUrls`,
|
|
21
|
+
* `name`, `exportAs`, `providedIn`) resolve module-level string constants
|
|
22
|
+
* referenced via template-literal interpolation, e.g.
|
|
23
|
+
* `template: \`<div class="${tw}">x</div>\``.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractMetadata(dec: any | undefined, sourceCode: string, stringConsts?: Map<string, string>): any;
|
|
26
|
+
/**
|
|
27
|
+
* Detect signal-based APIs on class members: input(), model(), output(),
|
|
28
|
+
* viewChild(), contentChild(), viewChildren(), contentChildren().
|
|
29
|
+
*/
|
|
30
|
+
export declare function detectSignals(classNode: any, sourceCode: string): {};
|
|
31
|
+
/**
|
|
32
|
+
* Detect decorator-based field metadata: @Input, @Output, @ViewChild,
|
|
33
|
+
* @ContentChild, @ViewChildren, @ContentChildren, @HostBinding, @HostListener.
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectFieldDecorators(classNode: any, sourceCode: string): {};
|
|
36
|
+
/**
|
|
37
|
+
* Analyze constructor parameters for dependency injection.
|
|
38
|
+
* Returns:
|
|
39
|
+
* - R3DependencyMetadata[] for normal constructors
|
|
40
|
+
* - null if class extends another without own constructor (use inherited factory)
|
|
41
|
+
* - 'invalid' if any parameter has a type-only import token
|
|
42
|
+
*
|
|
43
|
+
* Accepts an OXC ClassDeclaration node and the original source string.
|
|
44
|
+
*/
|
|
45
|
+
export declare function extractConstructorDeps(classNode: any, sourceCode: string, typeOnlyImports: Set<string>): any[] | "invalid" | null;
|