@analogjs/angular-compiler 2.5.0-beta.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/COMPILER.md +474 -0
- package/README.md +5 -0
- package/package.json +51 -0
- package/src/index.d.ts +5 -0
- package/src/index.js +6 -0
- package/src/index.js.map +1 -0
- package/src/lib/ast-translator.d.ts +40 -0
- package/src/lib/ast-translator.js +243 -0
- package/src/lib/ast-translator.js.map +1 -0
- package/src/lib/compile.d.ts +24 -0
- package/src/lib/compile.js +630 -0
- package/src/lib/compile.js.map +1 -0
- package/src/lib/defer.d.ts +23 -0
- package/src/lib/defer.js +158 -0
- package/src/lib/defer.js.map +1 -0
- package/src/lib/dts-reader.d.ts +25 -0
- package/src/lib/dts-reader.js +326 -0
- package/src/lib/dts-reader.js.map +1 -0
- package/src/lib/hmr.d.ts +12 -0
- package/src/lib/hmr.js +49 -0
- package/src/lib/hmr.js.map +1 -0
- package/src/lib/index.d.ts +5 -0
- package/src/lib/index.js +6 -0
- package/src/lib/index.js.map +1 -0
- package/src/lib/jit-metadata.d.ts +11 -0
- package/src/lib/jit-metadata.js +201 -0
- package/src/lib/jit-metadata.js.map +1 -0
- package/src/lib/jit-transform.d.ts +21 -0
- package/src/lib/jit-transform.js +207 -0
- package/src/lib/jit-transform.js.map +1 -0
- package/src/lib/js-emitter.d.ts +8 -0
- package/src/lib/js-emitter.js +317 -0
- package/src/lib/js-emitter.js.map +1 -0
- package/src/lib/metadata.d.ts +36 -0
- package/src/lib/metadata.js +465 -0
- package/src/lib/metadata.js.map +1 -0
- package/src/lib/registry.d.ts +32 -0
- package/src/lib/registry.js +177 -0
- package/src/lib/registry.js.map +1 -0
- package/src/lib/resource-inliner.d.ts +17 -0
- package/src/lib/resource-inliner.js +109 -0
- package/src/lib/resource-inliner.js.map +1 -0
- package/src/lib/style-ast.d.ts +8 -0
- package/src/lib/style-ast.js +110 -0
- package/src/lib/style-ast.js.map +1 -0
- package/src/lib/styles.d.ts +13 -0
- package/src/lib/styles.js +60 -0
- package/src/lib/styles.js.map +1 -0
- package/src/lib/utils.d.ts +8 -0
- package/src/lib/utils.js +71 -0
- package/src/lib/utils.js.map +1 -0
- package/vite.config.d.ts +2 -0
- package/vite.config.js +19 -0
- package/vite.config.js.map +1 -0
package/src/lib/hmr.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate HMR code using Angular's ɵɵreplaceMetadata.
|
|
3
|
+
*
|
|
4
|
+
* The applyMetadata callback re-defines ɵcmp and ɵfac on the old class
|
|
5
|
+
* by copying from the newly compiled class in the hot-updated module.
|
|
6
|
+
* ɵɵreplaceMetadata then merges the old/new definitions and recreates
|
|
7
|
+
* matching LViews in the component tree.
|
|
8
|
+
*
|
|
9
|
+
* Falls back to page reload if ɵɵreplaceMetadata throws.
|
|
10
|
+
*/
|
|
11
|
+
export function generateHmrCode(components) {
|
|
12
|
+
// Export applyMetadata functions so the accept callback can access them
|
|
13
|
+
const applyFns = components
|
|
14
|
+
.map((c) => `
|
|
15
|
+
export function ɵhmr_${c.className}(type, namespaces) {
|
|
16
|
+
type.ɵcmp = ${c.className}.ɵcmp;
|
|
17
|
+
type.ɵfac = ${c.className}.ɵfac;
|
|
18
|
+
}`)
|
|
19
|
+
.join('\n');
|
|
20
|
+
const replaceBlocks = components
|
|
21
|
+
.map((c) => `
|
|
22
|
+
try {
|
|
23
|
+
i0.ɵɵreplaceMetadata(
|
|
24
|
+
${c.className},
|
|
25
|
+
newModule.ɵhmr_${c.className},
|
|
26
|
+
{ i0 },
|
|
27
|
+
[],
|
|
28
|
+
import.meta,
|
|
29
|
+
"${c.className}"
|
|
30
|
+
);
|
|
31
|
+
replaced = true;
|
|
32
|
+
} catch(e) {
|
|
33
|
+
// ɵɵreplaceMetadata failed — will fall back to page reload
|
|
34
|
+
}`)
|
|
35
|
+
.join('\n');
|
|
36
|
+
return `\n${applyFns}
|
|
37
|
+
if (import.meta.hot) {
|
|
38
|
+
import.meta.hot.accept((newModule) => {
|
|
39
|
+
if (!newModule) return;
|
|
40
|
+
let replaced = false;${replaceBlocks}
|
|
41
|
+
if (!replaced) {
|
|
42
|
+
// Fallback: if no component was successfully replaced (e.g. root component),
|
|
43
|
+
// trigger a full page reload
|
|
44
|
+
import.meta.hot.invalidate('Component HMR failed, reloading');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=hmr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/hmr.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,UAA2B;IACzD,wEAAwE;IACxE,MAAM,QAAQ,GAAG,UAAU;SACxB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC;uBACU,CAAC,CAAC,SAAS;gBAClB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS;EACzB,CACG;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG,UAAU;SAC7B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC;;;YAGD,CAAC,CAAC,SAAS;2BACI,CAAC,CAAC,SAAS;;;;aAIzB,CAAC,CAAC,SAAS;;;;;QAKhB,CACH;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,KAAK,QAAQ;;;;2BAIK,aAAa;;;;;;;EAOtC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { compile, type CompileResult, type CompileOptions } from './compile.js';
|
|
2
|
+
export { scanFile, type RegistryEntry, type ComponentRegistry, } from './registry.js';
|
|
3
|
+
export { scanDtsFile, scanPackageDts, collectImportedPackages, } from './dts-reader.js';
|
|
4
|
+
export { jitTransform, type JitTransformResult } from './jit-transform.js';
|
|
5
|
+
export { inlineResourceUrls, extractInlineStyles } from './resource-inliner.js';
|
package/src/lib/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { compile } from './compile.js';
|
|
2
|
+
export { scanFile, } from './registry.js';
|
|
3
|
+
export { scanDtsFile, scanPackageDts, collectImportedPackages, } from './dts-reader.js';
|
|
4
|
+
export { jitTransform } from './jit-transform.js';
|
|
5
|
+
export { inlineResourceUrls, extractInlineStyles } from './resource-inliner.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2C,MAAM,cAAc,CAAC;AAChF,OAAO,EACL,QAAQ,GAGT,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,WAAW,EACX,cAAc,EACd,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
/**
|
|
3
|
+
* Build ctorParameters for constructor DI in JIT format:
|
|
4
|
+
* [{ type: ServiceA }, { type: ServiceB, decorators: [{type: Optional}] }]
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildCtorParameters(node: ts.ClassDeclaration, sf: ts.SourceFile, typeOnlyImports: Set<string>): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Build propDecorators for field decorators + signal API downleveling.
|
|
9
|
+
* Returns a JS object literal string or null if no props.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildPropDecorators(node: ts.ClassDeclaration, sf: ts.SourceFile): string | null;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
function getCallApi(call) {
|
|
3
|
+
const expr = call.expression;
|
|
4
|
+
if (ts.isIdentifier(expr)) {
|
|
5
|
+
return { api: expr.text, required: false };
|
|
6
|
+
}
|
|
7
|
+
if (ts.isPropertyAccessExpression(expr) &&
|
|
8
|
+
ts.isIdentifier(expr.expression) &&
|
|
9
|
+
expr.name.text === 'required') {
|
|
10
|
+
return { api: expr.expression.text, required: true };
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build ctorParameters for constructor DI in JIT format:
|
|
16
|
+
* [{ type: ServiceA }, { type: ServiceB, decorators: [{type: Optional}] }]
|
|
17
|
+
*/
|
|
18
|
+
export function buildCtorParameters(node, sf, typeOnlyImports) {
|
|
19
|
+
const ctor = node.members.find(ts.isConstructorDeclaration);
|
|
20
|
+
if (!ctor || ctor.parameters.length === 0)
|
|
21
|
+
return null;
|
|
22
|
+
const params = [];
|
|
23
|
+
for (const param of ctor.parameters) {
|
|
24
|
+
const parts = [];
|
|
25
|
+
// Extract type
|
|
26
|
+
let typeName = null;
|
|
27
|
+
if (param.type && ts.isTypeReferenceNode(param.type)) {
|
|
28
|
+
typeName = param.type.typeName.getText(sf);
|
|
29
|
+
}
|
|
30
|
+
else if (param.type && ts.isUnionTypeNode(param.type)) {
|
|
31
|
+
for (const t of param.type.types) {
|
|
32
|
+
if (ts.isTypeReferenceNode(t)) {
|
|
33
|
+
typeName = t.typeName.getText(sf);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (typeName && !typeOnlyImports.has(typeName)) {
|
|
39
|
+
parts.push(`type: ${typeName}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
parts.push(`type: undefined`);
|
|
43
|
+
}
|
|
44
|
+
// Extract parameter decorators
|
|
45
|
+
const paramDecs = ts.getDecorators(param);
|
|
46
|
+
if (paramDecs && paramDecs.length > 0) {
|
|
47
|
+
const decEntries = paramDecs
|
|
48
|
+
.map((dec) => {
|
|
49
|
+
if (!ts.isCallExpression(dec.expression))
|
|
50
|
+
return '';
|
|
51
|
+
const name = dec.expression.expression.getText(sf);
|
|
52
|
+
const args = dec.expression.arguments;
|
|
53
|
+
if (args.length > 0) {
|
|
54
|
+
return `{type: ${name}, args: [${args.map((a) => a.getText(sf)).join(', ')}]}`;
|
|
55
|
+
}
|
|
56
|
+
return `{type: ${name}}`;
|
|
57
|
+
})
|
|
58
|
+
.filter(Boolean);
|
|
59
|
+
if (decEntries.length > 0) {
|
|
60
|
+
parts.push(`decorators: [${decEntries.join(', ')}]`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
params.push(`{${parts.join(', ')}}`);
|
|
64
|
+
}
|
|
65
|
+
return params.join(', ');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build propDecorators for field decorators + signal API downleveling.
|
|
69
|
+
* Returns a JS object literal string or null if no props.
|
|
70
|
+
*/
|
|
71
|
+
export function buildPropDecorators(node, sf) {
|
|
72
|
+
const props = {};
|
|
73
|
+
for (const member of node.members) {
|
|
74
|
+
const memberName = member.name?.getText(sf);
|
|
75
|
+
if (!memberName)
|
|
76
|
+
continue;
|
|
77
|
+
// Check for field decorators (@Input, @Output, @ViewChild, etc.)
|
|
78
|
+
const decorators = ts.getDecorators(member);
|
|
79
|
+
if (decorators) {
|
|
80
|
+
for (const dec of decorators) {
|
|
81
|
+
if (!ts.isCallExpression(dec.expression))
|
|
82
|
+
continue;
|
|
83
|
+
const decName = dec.expression.expression.getText(sf);
|
|
84
|
+
if ([
|
|
85
|
+
'Input',
|
|
86
|
+
'Output',
|
|
87
|
+
'ViewChild',
|
|
88
|
+
'ViewChildren',
|
|
89
|
+
'ContentChild',
|
|
90
|
+
'ContentChildren',
|
|
91
|
+
'HostBinding',
|
|
92
|
+
'HostListener',
|
|
93
|
+
].includes(decName)) {
|
|
94
|
+
if (!props[memberName])
|
|
95
|
+
props[memberName] = [];
|
|
96
|
+
const args = dec.expression.arguments;
|
|
97
|
+
if (args.length > 0) {
|
|
98
|
+
props[memberName].push(`{type: ${decName}, args: [${args.map((a) => a.getText(sf)).join(', ')}]}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
props[memberName].push(`{type: ${decName}}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Signal API downleveling
|
|
107
|
+
if (ts.isPropertyDeclaration(member) &&
|
|
108
|
+
member.initializer &&
|
|
109
|
+
ts.isCallExpression(member.initializer)) {
|
|
110
|
+
const signalCall = getCallApi(member.initializer);
|
|
111
|
+
if (!signalCall)
|
|
112
|
+
continue;
|
|
113
|
+
const { api, required } = signalCall;
|
|
114
|
+
const args = member.initializer.arguments;
|
|
115
|
+
if (api === 'input') {
|
|
116
|
+
if (!props[memberName])
|
|
117
|
+
props[memberName] = [];
|
|
118
|
+
// Extract alias from options
|
|
119
|
+
let alias = null;
|
|
120
|
+
const optArg = required ? args[0] : args[1];
|
|
121
|
+
if (optArg && ts.isObjectLiteralExpression(optArg)) {
|
|
122
|
+
for (const p of optArg.properties) {
|
|
123
|
+
if (ts.isPropertyAssignment(p) &&
|
|
124
|
+
p.name.getText(sf) === 'alias' &&
|
|
125
|
+
ts.isStringLiteral(p.initializer)) {
|
|
126
|
+
alias = p.initializer.text;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const inputArgs = [];
|
|
131
|
+
if (alias)
|
|
132
|
+
inputArgs.push(`{alias: '${alias}', isSignal: true, required: ${required}}`);
|
|
133
|
+
else
|
|
134
|
+
inputArgs.push(`{isSignal: true, required: ${required}}`);
|
|
135
|
+
props[memberName].push(`{type: Input, args: [${inputArgs.join(', ')}]}`);
|
|
136
|
+
}
|
|
137
|
+
else if (api === 'model') {
|
|
138
|
+
if (!props[memberName])
|
|
139
|
+
props[memberName] = [];
|
|
140
|
+
props[memberName].push(`{type: Input, args: [{isSignal: true}]}`);
|
|
141
|
+
// Model also generates a Change output
|
|
142
|
+
const changeName = memberName + 'Change';
|
|
143
|
+
if (!props[changeName])
|
|
144
|
+
props[changeName] = [];
|
|
145
|
+
props[changeName].push(`{type: Output, args: ['${changeName}']}`);
|
|
146
|
+
}
|
|
147
|
+
else if (api === 'output' || api === 'outputFromObservable') {
|
|
148
|
+
if (!props[memberName])
|
|
149
|
+
props[memberName] = [];
|
|
150
|
+
// Extract alias
|
|
151
|
+
let alias = null;
|
|
152
|
+
const optArg = args[0];
|
|
153
|
+
if (optArg && ts.isObjectLiteralExpression(optArg)) {
|
|
154
|
+
for (const p of optArg.properties) {
|
|
155
|
+
if (ts.isPropertyAssignment(p) &&
|
|
156
|
+
p.name.getText(sf) === 'alias' &&
|
|
157
|
+
ts.isStringLiteral(p.initializer)) {
|
|
158
|
+
alias = p.initializer.text;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (alias) {
|
|
163
|
+
props[memberName].push(`{type: Output, args: ['${alias}']}`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
props[memberName].push(`{type: Output}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (api === 'viewChild' || api === 'viewChildren') {
|
|
170
|
+
if (!props[memberName])
|
|
171
|
+
props[memberName] = [];
|
|
172
|
+
const queryType = api === 'viewChildren' ? 'ViewChildren' : 'ViewChild';
|
|
173
|
+
if (args.length > 0) {
|
|
174
|
+
props[memberName].push(`{type: ${queryType}, args: [${args[0].getText(sf)}]}`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
props[memberName].push(`{type: ${queryType}}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else if (api === 'contentChild' || api === 'contentChildren') {
|
|
181
|
+
if (!props[memberName])
|
|
182
|
+
props[memberName] = [];
|
|
183
|
+
const queryType = api === 'contentChildren' ? 'ContentChildren' : 'ContentChild';
|
|
184
|
+
if (args.length > 0) {
|
|
185
|
+
props[memberName].push(`{type: ${queryType}, args: [${args[0].getText(sf)}]}`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
props[memberName].push(`{type: ${queryType}}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const entries = Object.entries(props);
|
|
194
|
+
if (entries.length === 0)
|
|
195
|
+
return null;
|
|
196
|
+
const propsStr = entries
|
|
197
|
+
.map(([key, decs]) => `${key}: [${decs.join(', ')}]`)
|
|
198
|
+
.join(', ');
|
|
199
|
+
return `{${propsStr}}`;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=jit-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jit-metadata.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/jit-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface JitTransformResult {
|
|
2
|
+
code: string;
|
|
3
|
+
map: any;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* JIT transform for Angular files.
|
|
7
|
+
*
|
|
8
|
+
* Converts Angular decorators to static metadata arrays that Angular's
|
|
9
|
+
* runtime JIT compiler reads via ReflectionCapabilities:
|
|
10
|
+
*
|
|
11
|
+
* - Class.decorators = [{ type: Component, args: [{...}] }]
|
|
12
|
+
* - Class.ctorParameters = () => [{ type: ServiceA, decorators: [{type: Optional}] }]
|
|
13
|
+
* - Class.propDecorators = { name: [{ type: Input }], ... }
|
|
14
|
+
*
|
|
15
|
+
* Also emits ɵfac (factory function) with constructor DI and downlevels
|
|
16
|
+
* signal APIs (input, model, output, viewChild, etc.) to propDecorators.
|
|
17
|
+
*
|
|
18
|
+
* No template compilation — Angular's JIT compiler handles that at runtime.
|
|
19
|
+
* Requires `import '@angular/compiler'` in main.ts for the browser JIT.
|
|
20
|
+
*/
|
|
21
|
+
export declare function jitTransform(sourceCode: string, fileName: string): JitTransformResult;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
import MagicString from 'magic-string';
|
|
3
|
+
import { collectTypeOnlyImports, findAllClasses, ANGULAR_DECORATORS, } from './utils.js';
|
|
4
|
+
import { buildCtorParameters, buildPropDecorators } from './jit-metadata.js';
|
|
5
|
+
/**
|
|
6
|
+
* JIT transform for Angular files.
|
|
7
|
+
*
|
|
8
|
+
* Converts Angular decorators to static metadata arrays that Angular's
|
|
9
|
+
* runtime JIT compiler reads via ReflectionCapabilities:
|
|
10
|
+
*
|
|
11
|
+
* - Class.decorators = [{ type: Component, args: [{...}] }]
|
|
12
|
+
* - Class.ctorParameters = () => [{ type: ServiceA, decorators: [{type: Optional}] }]
|
|
13
|
+
* - Class.propDecorators = { name: [{ type: Input }], ... }
|
|
14
|
+
*
|
|
15
|
+
* Also emits ɵfac (factory function) with constructor DI and downlevels
|
|
16
|
+
* signal APIs (input, model, output, viewChild, etc.) to propDecorators.
|
|
17
|
+
*
|
|
18
|
+
* No template compilation — Angular's JIT compiler handles that at runtime.
|
|
19
|
+
* Requires `import '@angular/compiler'` in main.ts for the browser JIT.
|
|
20
|
+
*/
|
|
21
|
+
export function jitTransform(sourceCode, fileName) {
|
|
22
|
+
const sourceFile = ts.createSourceFile(fileName, sourceCode, ts.ScriptTarget.Latest, true);
|
|
23
|
+
const ms = new MagicString(sourceCode, { filename: fileName });
|
|
24
|
+
const typeOnlyImports = collectTypeOnlyImports(sourceFile);
|
|
25
|
+
let hasAngularClass = false;
|
|
26
|
+
const allClasses = findAllClasses(sourceFile);
|
|
27
|
+
const postClassStatements = [];
|
|
28
|
+
let importCounter = 0;
|
|
29
|
+
const resourceImports = [];
|
|
30
|
+
let needsJitImport = false;
|
|
31
|
+
for (const node of allClasses) {
|
|
32
|
+
const decorators = ts.getDecorators(node);
|
|
33
|
+
if (!decorators)
|
|
34
|
+
continue;
|
|
35
|
+
const angularDecs = decorators.filter((dec) => {
|
|
36
|
+
if (!ts.isCallExpression(dec.expression))
|
|
37
|
+
return false;
|
|
38
|
+
return ANGULAR_DECORATORS.has(dec.expression.expression.getText(sourceFile));
|
|
39
|
+
});
|
|
40
|
+
if (angularDecs.length === 0)
|
|
41
|
+
continue;
|
|
42
|
+
const className = node.name?.text;
|
|
43
|
+
if (!className)
|
|
44
|
+
continue;
|
|
45
|
+
hasAngularClass = true;
|
|
46
|
+
// 1. Remove Angular decorators from source
|
|
47
|
+
for (const dec of angularDecs) {
|
|
48
|
+
const start = dec.getStart(sourceFile);
|
|
49
|
+
const end = dec.getEnd();
|
|
50
|
+
let trimEnd = end;
|
|
51
|
+
while (trimEnd < sourceCode.length && /\s/.test(sourceCode[trimEnd]))
|
|
52
|
+
trimEnd++;
|
|
53
|
+
ms.remove(start, trimEnd);
|
|
54
|
+
}
|
|
55
|
+
// 2. Emit Class.decorators = [{ type: DecName, args: [...] }]
|
|
56
|
+
// For @Component: convert templateUrl/styleUrl/styleUrls to ESM imports
|
|
57
|
+
const decoratorMeta = [];
|
|
58
|
+
const decoratorEntries = angularDecs.map((dec) => {
|
|
59
|
+
const call = dec.expression;
|
|
60
|
+
const decName = call.expression.getText(sourceFile);
|
|
61
|
+
const args = call.arguments;
|
|
62
|
+
if (args.length > 0 &&
|
|
63
|
+
decName === 'Component' &&
|
|
64
|
+
ts.isObjectLiteralExpression(args[0])) {
|
|
65
|
+
// Rewrite component metadata: convert external resources to imports
|
|
66
|
+
const obj = args[0];
|
|
67
|
+
const rewrittenProps = [];
|
|
68
|
+
for (const prop of obj.properties) {
|
|
69
|
+
if (!ts.isPropertyAssignment(prop)) {
|
|
70
|
+
rewrittenProps.push(prop.getText(sourceFile));
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const key = prop.name.getText(sourceFile);
|
|
74
|
+
const val = prop.initializer;
|
|
75
|
+
if (key === 'templateUrl' &&
|
|
76
|
+
(ts.isStringLiteral(val) || ts.isNoSubstitutionTemplateLiteral(val))) {
|
|
77
|
+
// templateUrl: './foo.html' → template: _tpl0 (with import)
|
|
78
|
+
const varName = `_jit_tpl_${importCounter++}`;
|
|
79
|
+
resourceImports.push(`import ${varName} from '${val.text}?raw';`);
|
|
80
|
+
rewrittenProps.push(`template: ${varName}`);
|
|
81
|
+
}
|
|
82
|
+
else if (key === 'styleUrl' &&
|
|
83
|
+
(ts.isStringLiteral(val) || ts.isNoSubstitutionTemplateLiteral(val))) {
|
|
84
|
+
// styleUrl: './foo.scss' → styles: [_style0]
|
|
85
|
+
const varName = `_jit_style_${importCounter++}`;
|
|
86
|
+
resourceImports.push(`import ${varName} from '${val.text}?inline';`);
|
|
87
|
+
rewrittenProps.push(`styles: [${varName}]`);
|
|
88
|
+
}
|
|
89
|
+
else if (key === 'styleUrls' && ts.isArrayLiteralExpression(val)) {
|
|
90
|
+
// styleUrls: ['./a.scss', './b.css'] → styles: [_style0, _style1]
|
|
91
|
+
const vars = [];
|
|
92
|
+
for (const el of val.elements) {
|
|
93
|
+
if (ts.isStringLiteral(el) ||
|
|
94
|
+
ts.isNoSubstitutionTemplateLiteral(el)) {
|
|
95
|
+
const varName = `_jit_style_${importCounter++}`;
|
|
96
|
+
resourceImports.push(`import ${varName} from '${el.text}?inline';`);
|
|
97
|
+
vars.push(varName);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
rewrittenProps.push(`styles: [${vars.join(', ')}]`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
rewrittenProps.push(prop.getText(sourceFile));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const rewrittenArgsText = `{${rewrittenProps.join(', ')}}`;
|
|
107
|
+
decoratorMeta.push({
|
|
108
|
+
name: decName,
|
|
109
|
+
argsText: rewrittenArgsText,
|
|
110
|
+
entry: '',
|
|
111
|
+
});
|
|
112
|
+
return `{ type: ${decName}, args: [${rewrittenArgsText}] }`;
|
|
113
|
+
}
|
|
114
|
+
if (args.length > 0) {
|
|
115
|
+
const argsText = args.map((a) => a.getText(sourceFile)).join(', ');
|
|
116
|
+
decoratorMeta.push({ name: decName, argsText, entry: '' });
|
|
117
|
+
return `{ type: ${decName}, args: [${argsText}] }`;
|
|
118
|
+
}
|
|
119
|
+
decoratorMeta.push({ name: decName, argsText: '{}', entry: '' });
|
|
120
|
+
return `{ type: ${decName} }`;
|
|
121
|
+
});
|
|
122
|
+
postClassStatements.push(`${className}.decorators = [${decoratorEntries.join(', ')}];`);
|
|
123
|
+
// 2b. Trigger JIT compilation with the rewritten decorator metadata
|
|
124
|
+
for (const dm of decoratorMeta) {
|
|
125
|
+
needsJitImport = true;
|
|
126
|
+
switch (dm.name) {
|
|
127
|
+
case 'Component':
|
|
128
|
+
postClassStatements.push(`_jitCompileComponent(${className}, ${dm.argsText});`);
|
|
129
|
+
break;
|
|
130
|
+
case 'Directive':
|
|
131
|
+
postClassStatements.push(`_jitCompileDirective(${className}, ${dm.argsText});`);
|
|
132
|
+
break;
|
|
133
|
+
case 'Pipe':
|
|
134
|
+
postClassStatements.push(`_jitCompilePipe(${className}, ${dm.argsText});`);
|
|
135
|
+
break;
|
|
136
|
+
case 'NgModule':
|
|
137
|
+
postClassStatements.push(`_jitCompileNgModule(${className}, ${dm.argsText});`);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// 3. Emit Class.ctorParameters for constructor DI
|
|
142
|
+
const ctorParams = buildCtorParameters(node, sourceFile, typeOnlyImports);
|
|
143
|
+
if (ctorParams) {
|
|
144
|
+
postClassStatements.push(`${className}.ctorParameters = () => [${ctorParams}];`);
|
|
145
|
+
}
|
|
146
|
+
// 4. Emit Class.propDecorators for field decorators + signal APIs
|
|
147
|
+
const propDecorators = buildPropDecorators(node, sourceFile);
|
|
148
|
+
if (propDecorators) {
|
|
149
|
+
postClassStatements.push(`${className}.propDecorators = ${propDecorators};`);
|
|
150
|
+
}
|
|
151
|
+
// 5. Remove member and parameter decorators from source now that
|
|
152
|
+
// they have been extracted into static metadata above.
|
|
153
|
+
for (const member of node.members) {
|
|
154
|
+
const memberDecs = ts.getDecorators(member);
|
|
155
|
+
if (memberDecs) {
|
|
156
|
+
for (const dec of memberDecs) {
|
|
157
|
+
const start = dec.getStart(sourceFile);
|
|
158
|
+
const end = dec.getEnd();
|
|
159
|
+
let trimEnd = end;
|
|
160
|
+
while (trimEnd < sourceCode.length && /\s/.test(sourceCode[trimEnd]))
|
|
161
|
+
trimEnd++;
|
|
162
|
+
ms.remove(start, trimEnd);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Constructor parameter decorators
|
|
166
|
+
if (ts.isConstructorDeclaration(member)) {
|
|
167
|
+
for (const param of member.parameters) {
|
|
168
|
+
const paramDecs = ts.getDecorators(param);
|
|
169
|
+
if (paramDecs) {
|
|
170
|
+
for (const dec of paramDecs) {
|
|
171
|
+
const start = dec.getStart(sourceFile);
|
|
172
|
+
const end = dec.getEnd();
|
|
173
|
+
let trimEnd = end;
|
|
174
|
+
while (trimEnd < sourceCode.length &&
|
|
175
|
+
/\s/.test(sourceCode[trimEnd]))
|
|
176
|
+
trimEnd++;
|
|
177
|
+
ms.remove(start, trimEnd);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!hasAngularClass) {
|
|
185
|
+
return { code: sourceCode, map: null };
|
|
186
|
+
}
|
|
187
|
+
// Prepend ESM imports for external templates/styles
|
|
188
|
+
if (resourceImports.length > 0) {
|
|
189
|
+
ms.prepend(resourceImports.join('\n') + '\n');
|
|
190
|
+
}
|
|
191
|
+
// Prepend JIT compiler imports
|
|
192
|
+
if (needsJitImport) {
|
|
193
|
+
ms.prepend(`import { ɵcompileComponent as _jitCompileComponent, ɵcompileDirective as _jitCompileDirective, ɵcompilePipe as _jitCompilePipe, ɵcompileNgModule as _jitCompileNgModule } from '@angular/core';\n`);
|
|
194
|
+
}
|
|
195
|
+
// Append all post-class statements at the end
|
|
196
|
+
if (postClassStatements.length > 0) {
|
|
197
|
+
ms.append('\n' + postClassStatements.join('\n') + '\n');
|
|
198
|
+
}
|
|
199
|
+
const map = ms.generateMap({
|
|
200
|
+
source: fileName,
|
|
201
|
+
file: fileName + '.js',
|
|
202
|
+
includeContent: true,
|
|
203
|
+
hires: 'boundary',
|
|
204
|
+
});
|
|
205
|
+
return { code: ms.toString(), map };
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=jit-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jit-transform.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/jit-transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as ts from 'typescript';
|
|
2
|
+
import * as o from '@angular/compiler';
|
|
3
|
+
/** Emit Angular output AST expression directly to a JavaScript string. */
|
|
4
|
+
export declare function emitAngularExpr(expr: o.Expression): string;
|
|
5
|
+
/** Emit Angular output AST statement directly to a JavaScript string. */
|
|
6
|
+
export declare function emitAngularStmt(stmt: o.Statement): string;
|
|
7
|
+
/** Set the current source file for WrappedNodeExpr fallback printing. */
|
|
8
|
+
export declare function setEmitterSourceFile(sf: ts.SourceFile | undefined): void;
|