@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.
Files changed (54) hide show
  1. package/COMPILER.md +474 -0
  2. package/README.md +5 -0
  3. package/package.json +51 -0
  4. package/src/index.d.ts +5 -0
  5. package/src/index.js +6 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/ast-translator.d.ts +40 -0
  8. package/src/lib/ast-translator.js +243 -0
  9. package/src/lib/ast-translator.js.map +1 -0
  10. package/src/lib/compile.d.ts +24 -0
  11. package/src/lib/compile.js +630 -0
  12. package/src/lib/compile.js.map +1 -0
  13. package/src/lib/defer.d.ts +23 -0
  14. package/src/lib/defer.js +158 -0
  15. package/src/lib/defer.js.map +1 -0
  16. package/src/lib/dts-reader.d.ts +25 -0
  17. package/src/lib/dts-reader.js +326 -0
  18. package/src/lib/dts-reader.js.map +1 -0
  19. package/src/lib/hmr.d.ts +12 -0
  20. package/src/lib/hmr.js +49 -0
  21. package/src/lib/hmr.js.map +1 -0
  22. package/src/lib/index.d.ts +5 -0
  23. package/src/lib/index.js +6 -0
  24. package/src/lib/index.js.map +1 -0
  25. package/src/lib/jit-metadata.d.ts +11 -0
  26. package/src/lib/jit-metadata.js +201 -0
  27. package/src/lib/jit-metadata.js.map +1 -0
  28. package/src/lib/jit-transform.d.ts +21 -0
  29. package/src/lib/jit-transform.js +207 -0
  30. package/src/lib/jit-transform.js.map +1 -0
  31. package/src/lib/js-emitter.d.ts +8 -0
  32. package/src/lib/js-emitter.js +317 -0
  33. package/src/lib/js-emitter.js.map +1 -0
  34. package/src/lib/metadata.d.ts +36 -0
  35. package/src/lib/metadata.js +465 -0
  36. package/src/lib/metadata.js.map +1 -0
  37. package/src/lib/registry.d.ts +32 -0
  38. package/src/lib/registry.js +177 -0
  39. package/src/lib/registry.js.map +1 -0
  40. package/src/lib/resource-inliner.d.ts +17 -0
  41. package/src/lib/resource-inliner.js +109 -0
  42. package/src/lib/resource-inliner.js.map +1 -0
  43. package/src/lib/style-ast.d.ts +8 -0
  44. package/src/lib/style-ast.js +110 -0
  45. package/src/lib/style-ast.js.map +1 -0
  46. package/src/lib/styles.d.ts +13 -0
  47. package/src/lib/styles.js +60 -0
  48. package/src/lib/styles.js.map +1 -0
  49. package/src/lib/utils.d.ts +8 -0
  50. package/src/lib/utils.js +71 -0
  51. package/src/lib/utils.js.map +1 -0
  52. package/vite.config.d.ts +2 -0
  53. package/vite.config.js +19 -0
  54. package/vite.config.js.map +1 -0
@@ -0,0 +1,177 @@
1
+ import { parseSync } from 'oxc-parser';
2
+ const ANGULAR_DECORATORS = new Set([
3
+ 'Component',
4
+ 'Directive',
5
+ 'Pipe',
6
+ 'NgModule',
7
+ ]);
8
+ const DECORATOR_RE = /@(Component|Directive|Pipe|NgModule)/;
9
+ /**
10
+ * Lightweight scan of a TypeScript file to extract Angular decorator metadata
11
+ * without performing full compilation. Uses OXC's native Rust parser for speed.
12
+ */
13
+ export function scanFile(code, fileName) {
14
+ const entries = [];
15
+ // Fast regex pre-filter before parsing
16
+ if (!DECORATOR_RE.test(code)) {
17
+ return entries;
18
+ }
19
+ const { program } = parseSync(fileName, code);
20
+ for (const node of program.body) {
21
+ // Handle `class Foo {}`, `export class Foo {}`, and `export default class Foo {}`
22
+ const decl = node.type === 'ExportNamedDeclaration' ||
23
+ node.type === 'ExportDefaultDeclaration'
24
+ ? node.declaration
25
+ : node;
26
+ if (!decl || decl.type !== 'ClassDeclaration')
27
+ continue;
28
+ // Skip anonymous default exports (no name to register)
29
+ if (!decl.id?.name)
30
+ continue;
31
+ const className = decl.id.name;
32
+ const decorators = decl.decorators || [];
33
+ for (const dec of decorators) {
34
+ const expr = dec.expression;
35
+ if (!expr || expr.type !== 'CallExpression')
36
+ continue;
37
+ const decoratorName = expr.callee?.name;
38
+ if (!ANGULAR_DECORATORS.has(decoratorName))
39
+ continue;
40
+ const arg = expr.arguments?.[0];
41
+ if (!arg || arg.type !== 'ObjectExpression')
42
+ continue;
43
+ let selector;
44
+ let pipeName;
45
+ let moduleExports;
46
+ for (const prop of arg.properties) {
47
+ if (prop.type !== 'Property')
48
+ continue;
49
+ const key = prop.key?.name || prop.key?.value;
50
+ const val = prop.value;
51
+ if (key === 'selector' &&
52
+ val?.type === 'Literal' &&
53
+ typeof val.value === 'string') {
54
+ selector = val.value;
55
+ }
56
+ if (key === 'name' &&
57
+ val?.type === 'Literal' &&
58
+ typeof val.value === 'string' &&
59
+ decoratorName === 'Pipe') {
60
+ pipeName = val.value;
61
+ }
62
+ if (key === 'exports' &&
63
+ val?.type === 'ArrayExpression' &&
64
+ decoratorName === 'NgModule') {
65
+ moduleExports = val.elements
66
+ .filter((e) => e?.type === 'Identifier')
67
+ .map((e) => e.name);
68
+ }
69
+ }
70
+ if (decoratorName === 'NgModule') {
71
+ entries.push({
72
+ selector: className,
73
+ kind: 'ngmodule',
74
+ exports: moduleExports || [],
75
+ fileName,
76
+ className,
77
+ });
78
+ }
79
+ else if (decoratorName === 'Pipe' && pipeName) {
80
+ entries.push({
81
+ selector: pipeName,
82
+ kind: 'pipe',
83
+ pipeName,
84
+ fileName,
85
+ className,
86
+ });
87
+ }
88
+ else if (selector) {
89
+ // Extract inputs/outputs from class members
90
+ const inputs = {};
91
+ const outputs = {};
92
+ const members = decl.body?.body || [];
93
+ for (const member of members) {
94
+ if (member.type !== 'PropertyDefinition' || !member.key?.name)
95
+ continue;
96
+ const name = member.key.name;
97
+ const init = member.value;
98
+ // Signal APIs: input(), input.required(), model(), output()
99
+ if (init?.type === 'CallExpression') {
100
+ const callee = init.callee;
101
+ let calleeName = '';
102
+ if (callee?.type === 'Identifier') {
103
+ calleeName = callee.name;
104
+ }
105
+ else if (callee?.type === 'StaticMemberExpression' ||
106
+ callee?.type === 'MemberExpression') {
107
+ calleeName =
108
+ (callee.object?.name || '') +
109
+ '.' +
110
+ (callee.property?.name || '');
111
+ }
112
+ if (calleeName === 'input' || calleeName === 'input.required') {
113
+ inputs[name] = {
114
+ classPropertyName: name,
115
+ bindingPropertyName: name,
116
+ isSignal: true,
117
+ required: calleeName === 'input.required',
118
+ };
119
+ }
120
+ else if (calleeName === 'model' ||
121
+ calleeName === 'model.required') {
122
+ inputs[name] = {
123
+ classPropertyName: name,
124
+ bindingPropertyName: name,
125
+ isSignal: true,
126
+ required: calleeName === 'model.required',
127
+ };
128
+ outputs[name + 'Change'] = name + 'Change';
129
+ }
130
+ else if (calleeName === 'output') {
131
+ outputs[name] = name;
132
+ }
133
+ }
134
+ // Decorator-based: @Input(), @Output()
135
+ const memberDecorators = member.decorators || [];
136
+ for (const mdec of memberDecorators) {
137
+ const mexpr = mdec.expression;
138
+ if (!mexpr)
139
+ continue;
140
+ const mdecName = mexpr.type === 'CallExpression'
141
+ ? mexpr.callee?.name
142
+ : mexpr.type === 'Identifier'
143
+ ? mexpr.name
144
+ : undefined;
145
+ if (mdecName === 'Input') {
146
+ const alias = mexpr.arguments?.[0]?.type === 'Literal'
147
+ ? mexpr.arguments[0].value
148
+ : name;
149
+ inputs[name] = {
150
+ classPropertyName: name,
151
+ bindingPropertyName: alias || name,
152
+ isSignal: false,
153
+ required: false,
154
+ };
155
+ }
156
+ else if (mdecName === 'Output') {
157
+ const alias = mexpr.arguments?.[0]?.type === 'Literal'
158
+ ? mexpr.arguments[0].value
159
+ : name;
160
+ outputs[name] = alias || name;
161
+ }
162
+ }
163
+ }
164
+ entries.push({
165
+ selector: selector.split(',')[0].trim(),
166
+ kind: decoratorName === 'Component' ? 'component' : 'directive',
167
+ fileName,
168
+ className,
169
+ ...(Object.keys(inputs).length > 0 ? { inputs } : {}),
170
+ ...(Object.keys(outputs).length > 0 ? { outputs } : {}),
171
+ });
172
+ }
173
+ }
174
+ }
175
+ return entries;
176
+ }
177
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Inline external templateUrl and styleUrl/styleUrls into the source code
3
+ * using OXC parser for precise AST-based rewriting.
4
+ *
5
+ * Replaces:
6
+ * templateUrl: './file.html' → template: "...file contents..."
7
+ * styleUrl: './file.css' → styles: ["...file contents..."]
8
+ * styleUrls: ['./a.css'] → styles: ["...contents..."]
9
+ *
10
+ * Returns the modified source code, or the original if no changes were needed.
11
+ */
12
+ export declare function inlineResourceUrls(code: string, fileName: string): string;
13
+ /**
14
+ * Extract inline style strings from Angular @Component decorator using OXC parser.
15
+ * Returns an array of style string values for preprocessing.
16
+ */
17
+ export declare function extractInlineStyles(code: string, fileName: string): string[];
@@ -0,0 +1,109 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { parseSync } from 'oxc-parser';
4
+ import MagicString from 'magic-string';
5
+ import { extractInlineStyles as extractStylesFromAst } from './style-ast.js';
6
+ /**
7
+ * Inline external templateUrl and styleUrl/styleUrls into the source code
8
+ * using OXC parser for precise AST-based rewriting.
9
+ *
10
+ * Replaces:
11
+ * templateUrl: './file.html' → template: "...file contents..."
12
+ * styleUrl: './file.css' → styles: ["...file contents..."]
13
+ * styleUrls: ['./a.css'] → styles: ["...contents..."]
14
+ *
15
+ * Returns the modified source code, or the original if no changes were needed.
16
+ */
17
+ export function inlineResourceUrls(code, fileName) {
18
+ if (!code.includes('templateUrl') && !code.includes('styleUrl')) {
19
+ return code;
20
+ }
21
+ const { program } = parseSync(fileName, code);
22
+ const ms = new MagicString(code);
23
+ let changed = false;
24
+ const dir = path.dirname(fileName);
25
+ for (const node of program.body) {
26
+ const decl = node.type === 'ExportNamedDeclaration' ||
27
+ node.type === 'ExportDefaultDeclaration'
28
+ ? node.declaration
29
+ : node;
30
+ if (!decl || decl.type !== 'ClassDeclaration')
31
+ continue;
32
+ for (const dec of decl.decorators || []) {
33
+ const expr = dec.expression;
34
+ if (!expr || expr.type !== 'CallExpression')
35
+ continue;
36
+ if (expr.callee?.name !== 'Component')
37
+ continue;
38
+ const arg = expr.arguments?.[0];
39
+ if (!arg || arg.type !== 'ObjectExpression')
40
+ continue;
41
+ for (const prop of arg.properties) {
42
+ if (prop.type !== 'Property')
43
+ continue;
44
+ const key = prop.key?.name || prop.key?.value;
45
+ const val = prop.value;
46
+ // templateUrl: './file.html' → template: "...contents..."
47
+ if (key === 'templateUrl' &&
48
+ val?.type === 'Literal' &&
49
+ typeof val.value === 'string') {
50
+ try {
51
+ const filePath = path.resolve(dir, val.value);
52
+ const content = fs.readFileSync(filePath, 'utf-8');
53
+ ms.overwrite(prop.start, prop.end, `template: ${JSON.stringify(content)}`);
54
+ changed = true;
55
+ }
56
+ catch {
57
+ // Keep original if file can't be read
58
+ }
59
+ }
60
+ // styleUrl: './file.css' → styles: ["...contents..."]
61
+ if (key === 'styleUrl' &&
62
+ val?.type === 'Literal' &&
63
+ typeof val.value === 'string') {
64
+ try {
65
+ const filePath = path.resolve(dir, val.value);
66
+ const content = fs.readFileSync(filePath, 'utf-8');
67
+ ms.overwrite(prop.start, prop.end, `styles: [${JSON.stringify(content)}]`);
68
+ changed = true;
69
+ }
70
+ catch {
71
+ // Keep original if file can't be read
72
+ }
73
+ }
74
+ // styleUrls: ['./a.css', './b.css'] → styles: ["...a...", "...b..."]
75
+ if (key === 'styleUrls' && val?.type === 'ArrayExpression') {
76
+ const contents = [];
77
+ let allRead = true;
78
+ for (const el of val.elements) {
79
+ if (el?.type === 'Literal' && typeof el.value === 'string') {
80
+ try {
81
+ const filePath = path.resolve(dir, el.value);
82
+ contents.push(fs.readFileSync(filePath, 'utf-8'));
83
+ }
84
+ catch {
85
+ allRead = false;
86
+ break;
87
+ }
88
+ }
89
+ }
90
+ if (allRead && contents.length > 0) {
91
+ ms.overwrite(prop.start, prop.end, `styles: [${contents.map((c) => JSON.stringify(c)).join(', ')}]`);
92
+ changed = true;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ return changed ? ms.toString() : code;
99
+ }
100
+ /**
101
+ * Extract inline style strings from Angular @Component decorator using OXC parser.
102
+ * Returns an array of style string values for preprocessing.
103
+ */
104
+ export function extractInlineStyles(code, fileName) {
105
+ if (!code.includes('styles'))
106
+ return [];
107
+ return extractStylesFromAst(code, fileName);
108
+ }
109
+ //# sourceMappingURL=resource-inliner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-inliner.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/resource-inliner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Extract styleUrl/styleUrls values from Angular @Component decorators.
3
+ */
4
+ export declare function extractStyleUrls(code: string, fileName: string): string[];
5
+ /**
6
+ * Extract inline style strings from Angular @Component decorators.
7
+ */
8
+ export declare function extractInlineStyles(code: string, fileName: string): string[];
@@ -0,0 +1,110 @@
1
+ import { parseSync } from 'oxc-parser';
2
+ function getClassDeclaration(node) {
3
+ return node.type === 'ExportNamedDeclaration' ||
4
+ node.type === 'ExportDefaultDeclaration'
5
+ ? node.declaration
6
+ : node;
7
+ }
8
+ function getPropertyKey(prop) {
9
+ return prop.key?.name || prop.key?.value;
10
+ }
11
+ function getTemplateLiteralText(node) {
12
+ if (node?.type !== 'TemplateLiteral' || node.quasis?.length !== 1) {
13
+ return undefined;
14
+ }
15
+ return node.quasis[0].value.cooked || node.quasis[0].value.raw;
16
+ }
17
+ /**
18
+ * Extract styleUrl/styleUrls values from Angular @Component decorators.
19
+ */
20
+ export function extractStyleUrls(code, fileName) {
21
+ const urls = [];
22
+ const { program } = parseSync(fileName, code);
23
+ for (const node of program.body) {
24
+ const decl = getClassDeclaration(node);
25
+ if (!decl || decl.type !== 'ClassDeclaration')
26
+ continue;
27
+ for (const dec of decl.decorators || []) {
28
+ const expr = dec.expression;
29
+ if (!expr || expr.type !== 'CallExpression')
30
+ continue;
31
+ if (expr.callee?.name !== 'Component')
32
+ continue;
33
+ const arg = expr.arguments?.[0];
34
+ if (!arg || arg.type !== 'ObjectExpression')
35
+ continue;
36
+ for (const prop of arg.properties) {
37
+ if (prop.type !== 'Property')
38
+ continue;
39
+ const key = getPropertyKey(prop);
40
+ const val = prop.value;
41
+ if (key === 'styleUrl' &&
42
+ val?.type === 'Literal' &&
43
+ typeof val.value === 'string') {
44
+ urls.push(val.value);
45
+ }
46
+ if (key === 'styleUrls' && val?.type === 'ArrayExpression') {
47
+ for (const el of val.elements) {
48
+ if (el?.type === 'Literal' && typeof el.value === 'string') {
49
+ urls.push(el.value);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ return urls;
57
+ }
58
+ /**
59
+ * Extract inline style strings from Angular @Component decorators.
60
+ */
61
+ export function extractInlineStyles(code, fileName) {
62
+ const styles = [];
63
+ const { program } = parseSync(fileName, code);
64
+ for (const node of program.body) {
65
+ const decl = getClassDeclaration(node);
66
+ if (!decl || decl.type !== 'ClassDeclaration')
67
+ continue;
68
+ for (const dec of decl.decorators || []) {
69
+ const expr = dec.expression;
70
+ if (!expr || expr.type !== 'CallExpression')
71
+ continue;
72
+ if (expr.callee?.name !== 'Component')
73
+ continue;
74
+ const arg = expr.arguments?.[0];
75
+ if (!arg || arg.type !== 'ObjectExpression')
76
+ continue;
77
+ for (const prop of arg.properties) {
78
+ if (prop.type !== 'Property')
79
+ continue;
80
+ const key = getPropertyKey(prop);
81
+ const val = prop.value;
82
+ if (key !== 'styles')
83
+ continue;
84
+ if (val?.type === 'ArrayExpression') {
85
+ for (const el of val.elements) {
86
+ if (el?.type === 'Literal' && typeof el.value === 'string') {
87
+ styles.push(el.value);
88
+ continue;
89
+ }
90
+ const templateText = getTemplateLiteralText(el);
91
+ if (templateText !== undefined) {
92
+ styles.push(templateText);
93
+ }
94
+ }
95
+ }
96
+ else if (val?.type === 'Literal' && typeof val.value === 'string') {
97
+ styles.push(val.value);
98
+ }
99
+ else {
100
+ const templateText = getTemplateLiteralText(val);
101
+ if (templateText !== undefined) {
102
+ styles.push(templateText);
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ return styles;
109
+ }
110
+ //# sourceMappingURL=style-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-ast.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/style-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ResolvedConfig } from 'vite';
2
+ /**
3
+ * Extract styleUrl/styleUrls from source using OXC parser,
4
+ * read and preprocess them via Vite.
5
+ * Returns a Map of absolute path → compiled CSS for the compiler to use.
6
+ */
7
+ export declare function resolveStyleFiles(code: string, id: string, resolvedConfig: ResolvedConfig): Promise<Map<string, string> | undefined>;
8
+ /**
9
+ * Preprocess inline styles that contain SCSS/Sass syntax.
10
+ * Uses OXC parser to extract style strings from decorator arguments
11
+ * and runs them through Vite's preprocessCSS.
12
+ */
13
+ export declare function preprocessInlineStyles(code: string, id: string, inlineStyleLanguage: string, resolvedConfig: ResolvedConfig): Promise<Map<number, string> | undefined>;
@@ -0,0 +1,60 @@
1
+ import * as path from 'node:path';
2
+ import * as fs from 'node:fs';
3
+ import { preprocessCSS } from 'vite';
4
+ import { extractInlineStyles, extractStyleUrls } from './style-ast.js';
5
+ const STYLE_EXTS = new Set(['.scss', '.sass', '.less', '.styl']);
6
+ /**
7
+ * Extract styleUrl/styleUrls from source using OXC parser,
8
+ * read and preprocess them via Vite.
9
+ * Returns a Map of absolute path → compiled CSS for the compiler to use.
10
+ */
11
+ export async function resolveStyleFiles(code, id, resolvedConfig) {
12
+ if (!code.includes('styleUrl'))
13
+ return undefined;
14
+ const styleUrls = extractStyleUrls(code, id);
15
+ if (styleUrls.length === 0)
16
+ return undefined;
17
+ const result = new Map();
18
+ const dir = path.dirname(id);
19
+ for (const url of styleUrls) {
20
+ if (!STYLE_EXTS.has(path.extname(url)))
21
+ continue;
22
+ const filePath = path.resolve(dir, url);
23
+ try {
24
+ const source = fs.readFileSync(filePath, 'utf-8');
25
+ const processed = await preprocessCSS(source, filePath, resolvedConfig);
26
+ result.set(filePath, processed.code);
27
+ }
28
+ catch (e) {
29
+ console.warn(`[angular-compiler] Style preprocessing failed for ${filePath}: ${e.message}`);
30
+ }
31
+ }
32
+ return result.size > 0 ? result : undefined;
33
+ }
34
+ /**
35
+ * Preprocess inline styles that contain SCSS/Sass syntax.
36
+ * Uses OXC parser to extract style strings from decorator arguments
37
+ * and runs them through Vite's preprocessCSS.
38
+ */
39
+ export async function preprocessInlineStyles(code, id, inlineStyleLanguage, resolvedConfig) {
40
+ if (inlineStyleLanguage === 'css')
41
+ return undefined;
42
+ if (!code.includes('styles'))
43
+ return undefined;
44
+ const styleStrings = extractInlineStyles(code, id);
45
+ if (styleStrings.length === 0)
46
+ return undefined;
47
+ const result = new Map();
48
+ for (let i = 0; i < styleStrings.length; i++) {
49
+ try {
50
+ const fakePath = id.replace(/\.ts$/, `.inline-${i}.${inlineStyleLanguage}`);
51
+ const processed = await preprocessCSS(styleStrings[i], fakePath, resolvedConfig);
52
+ result.set(i, processed.code);
53
+ }
54
+ catch (e) {
55
+ console.warn(`[angular-compiler] Inline style preprocessing failed in ${id}: ${e.message}`);
56
+ }
57
+ }
58
+ return result.size > 0 ? result : undefined;
59
+ }
60
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import * as ts from 'typescript';
2
+ /** Collect type-only imported names: `import type { X }` and `import { type X }`. */
3
+ export declare function collectTypeOnlyImports(sf: ts.SourceFile): Set<string>;
4
+ /** Recursively find all class declarations in a source file, including nested scopes. */
5
+ export declare function findAllClasses(sf: ts.SourceFile): ts.ClassDeclaration[];
6
+ /** Unwrap forwardRef(() => X) to X. Returns the original node if not a forwardRef call. */
7
+ export declare function unwrapForwardRef(node: ts.Expression): ts.Expression;
8
+ export declare const ANGULAR_DECORATORS: Set<string>;
@@ -0,0 +1,71 @@
1
+ import * as ts from 'typescript';
2
+ /** Collect type-only imported names: `import type { X }` and `import { type X }`. */
3
+ export function collectTypeOnlyImports(sf) {
4
+ const result = new Set();
5
+ for (const stmt of sf.statements) {
6
+ if (!ts.isImportDeclaration(stmt) || !stmt.importClause)
7
+ continue;
8
+ const clause = stmt.importClause;
9
+ if (clause.isTypeOnly) {
10
+ if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {
11
+ for (const el of clause.namedBindings.elements)
12
+ result.add(el.name.text);
13
+ }
14
+ if (clause.name)
15
+ result.add(clause.name.text);
16
+ }
17
+ else if (clause.namedBindings &&
18
+ ts.isNamedImports(clause.namedBindings)) {
19
+ for (const el of clause.namedBindings.elements) {
20
+ if (el.isTypeOnly)
21
+ result.add(el.name.text);
22
+ }
23
+ }
24
+ }
25
+ return result;
26
+ }
27
+ /** Recursively find all class declarations in a source file, including nested scopes. */
28
+ export function findAllClasses(sf) {
29
+ const result = [];
30
+ function walk(node) {
31
+ if (ts.isClassDeclaration(node))
32
+ result.push(node);
33
+ ts.forEachChild(node, walk);
34
+ }
35
+ walk(sf);
36
+ return result;
37
+ }
38
+ /** Unwrap forwardRef(() => X) to X. Returns the original node if not a forwardRef call. */
39
+ export function unwrapForwardRef(node) {
40
+ if (ts.isCallExpression(node) &&
41
+ ts.isIdentifier(node.expression) &&
42
+ node.expression.text === 'forwardRef') {
43
+ const arg = node.arguments[0];
44
+ if (arg && ts.isArrowFunction(arg)) {
45
+ if (ts.isBlock(arg.body)) {
46
+ const stmt = arg.body.statements[0];
47
+ if (stmt && ts.isReturnStatement(stmt) && stmt.expression)
48
+ return stmt.expression;
49
+ }
50
+ else {
51
+ return arg.body;
52
+ }
53
+ }
54
+ if (arg &&
55
+ ts.isFunctionExpression(arg) &&
56
+ arg.body.statements.length === 1) {
57
+ const stmt = arg.body.statements[0];
58
+ if (ts.isReturnStatement(stmt) && stmt.expression)
59
+ return stmt.expression;
60
+ }
61
+ }
62
+ return node;
63
+ }
64
+ export const ANGULAR_DECORATORS = new Set([
65
+ 'Component',
66
+ 'Directive',
67
+ 'Pipe',
68
+ 'Injectable',
69
+ 'NgModule',
70
+ ]);
71
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../packages/angular-compiler/src/lib/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vite").UserConfigFnObject;
2
+ export default _default;
package/vite.config.js ADDED
@@ -0,0 +1,19 @@
1
+ /// <reference types="vitest" />
2
+ import { defineConfig } from 'vite';
3
+ // https://vitejs.dev/config/
4
+ export default defineConfig(({ mode }) => ({
5
+ build: {
6
+ target: ['es2020'],
7
+ },
8
+ resolve: {
9
+ mainFields: ['module'],
10
+ },
11
+ test: {
12
+ globals: true,
13
+ environment: 'jsdom',
14
+ setupFiles: ['src/test-setup.ts'],
15
+ include: ['**/*.spec.ts'],
16
+ reporters: ['default'],
17
+ },
18
+ }));
19
+ //# sourceMappingURL=vite.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.js","sourceRoot":"","sources":["../../../packages/angular-compiler/vite.config.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAEpC,6BAA6B;AAC7B,eAAe,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzC,KAAK,EAAE;QACL,MAAM,EAAE,CAAC,QAAQ,CAAC;KACnB;IACD,OAAO,EAAE;QACP,UAAU,EAAE,CAAC,QAAQ,CAAC;KACvB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,OAAO;QACpB,UAAU,EAAE,CAAC,mBAAmB,CAAC;QACjC,OAAO,EAAE,CAAC,cAAc,CAAC;QACzB,SAAS,EAAE,CAAC,SAAS,CAAC;KACvB;CACF,CAAC,CAAC,CAAC"}