@angular-modernizer/api 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +507 -0
- package/dist/analysis/complexity-metrics-calculator.d.ts +99 -0
- package/dist/analysis/complexity-metrics-calculator.d.ts.map +1 -0
- package/dist/analysis/complexity-metrics-calculator.js +195 -0
- package/dist/analysis/complexity-metrics-calculator.js.map +1 -0
- package/dist/analysis/dependency-analyzer.d.ts +227 -0
- package/dist/analysis/dependency-analyzer.d.ts.map +1 -0
- package/dist/analysis/dependency-analyzer.js +451 -0
- package/dist/analysis/dependency-analyzer.js.map +1 -0
- package/dist/analysis/external-template-loader.d.ts +44 -0
- package/dist/analysis/external-template-loader.d.ts.map +1 -0
- package/dist/analysis/external-template-loader.js +69 -0
- package/dist/analysis/external-template-loader.js.map +1 -0
- package/dist/analysis/selector-mapper.d.ts +77 -0
- package/dist/analysis/selector-mapper.d.ts.map +1 -0
- package/dist/analysis/selector-mapper.js +146 -0
- package/dist/analysis/selector-mapper.js.map +1 -0
- package/dist/analysis/service-detector.d.ts +164 -0
- package/dist/analysis/service-detector.d.ts.map +1 -0
- package/dist/analysis/service-detector.js +231 -0
- package/dist/analysis/service-detector.js.map +1 -0
- package/dist/analysis/service-pattern-recognizer.d.ts +247 -0
- package/dist/analysis/service-pattern-recognizer.d.ts.map +1 -0
- package/dist/analysis/service-pattern-recognizer.js +444 -0
- package/dist/analysis/service-pattern-recognizer.js.map +1 -0
- package/dist/analysis/symbol-locator.d.ts +81 -0
- package/dist/analysis/symbol-locator.d.ts.map +1 -0
- package/dist/analysis/symbol-locator.js +128 -0
- package/dist/analysis/symbol-locator.js.map +1 -0
- package/dist/analysis/template-analyzer-usage.d.ts +144 -0
- package/dist/analysis/template-analyzer-usage.d.ts.map +1 -0
- package/dist/analysis/template-analyzer-usage.js +474 -0
- package/dist/analysis/template-analyzer-usage.js.map +1 -0
- package/dist/analysis/template-analyzer.d.ts +80 -0
- package/dist/analysis/template-analyzer.d.ts.map +1 -0
- package/dist/analysis/template-analyzer.js +146 -0
- package/dist/analysis/template-analyzer.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/investigation/angular-symbol-finder.d.ts +76 -0
- package/dist/investigation/angular-symbol-finder.d.ts.map +1 -0
- package/dist/investigation/angular-symbol-finder.js +199 -0
- package/dist/investigation/angular-symbol-finder.js.map +1 -0
- package/dist/investigation/call-graph-builder.d.ts +85 -0
- package/dist/investigation/call-graph-builder.d.ts.map +1 -0
- package/dist/investigation/call-graph-builder.js +196 -0
- package/dist/investigation/call-graph-builder.js.map +1 -0
- package/dist/investigation/codebase-searcher.d.ts +99 -0
- package/dist/investigation/codebase-searcher.d.ts.map +1 -0
- package/dist/investigation/codebase-searcher.js +201 -0
- package/dist/investigation/codebase-searcher.js.map +1 -0
- package/dist/investigation/stack-trace-parser.d.ts +70 -0
- package/dist/investigation/stack-trace-parser.d.ts.map +1 -0
- package/dist/investigation/stack-trace-parser.js +117 -0
- package/dist/investigation/stack-trace-parser.js.map +1 -0
- package/dist/investigation/type-resolver.d.ts +59 -0
- package/dist/investigation/type-resolver.d.ts.map +1 -0
- package/dist/investigation/type-resolver.js +111 -0
- package/dist/investigation/type-resolver.js.map +1 -0
- package/dist/investigation/usage-finder.d.ts +69 -0
- package/dist/investigation/usage-finder.d.ts.map +1 -0
- package/dist/investigation/usage-finder.js +132 -0
- package/dist/investigation/usage-finder.js.map +1 -0
- package/dist/metrics/complexity-metrics.d.ts +196 -0
- package/dist/metrics/complexity-metrics.d.ts.map +1 -0
- package/dist/metrics/complexity-metrics.js +445 -0
- package/dist/metrics/complexity-metrics.js.map +1 -0
- package/dist/public-api.d.ts +77 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +50 -0
- package/dist/public-api.js.map +1 -0
- package/dist/transformation/import-manager.d.ts +276 -0
- package/dist/transformation/import-manager.d.ts.map +1 -0
- package/dist/transformation/import-manager.js +488 -0
- package/dist/transformation/import-manager.js.map +1 -0
- package/dist/transformation/ng-morph-adapter.d.ts +111 -0
- package/dist/transformation/ng-morph-adapter.d.ts.map +1 -0
- package/dist/transformation/ng-morph-adapter.js +179 -0
- package/dist/transformation/ng-morph-adapter.js.map +1 -0
- package/dist/transformation/ngmodule-manager.d.ts +145 -0
- package/dist/transformation/ngmodule-manager.d.ts.map +1 -0
- package/dist/transformation/ngmodule-manager.js +356 -0
- package/dist/transformation/ngmodule-manager.js.map +1 -0
- package/package.json +62 -0
- package/src/analysis/complexity-metrics-calculator.ts +253 -0
- package/src/analysis/dependency-analyzer.ts +720 -0
- package/src/analysis/external-template-loader.ts +79 -0
- package/src/analysis/selector-mapper.ts +186 -0
- package/src/analysis/service-detector.ts +280 -0
- package/src/analysis/service-pattern-recognizer.ts +545 -0
- package/src/analysis/symbol-locator.ts +170 -0
- package/src/analysis/template-analyzer-usage.ts +614 -0
- package/src/analysis/template-analyzer.ts +208 -0
- package/src/index.ts +51 -0
- package/src/investigation/angular-symbol-finder.ts +263 -0
- package/src/investigation/call-graph-builder.ts +298 -0
- package/src/investigation/codebase-searcher.ts +286 -0
- package/src/investigation/stack-trace-parser.ts +166 -0
- package/src/investigation/type-resolver.ts +144 -0
- package/src/investigation/usage-finder.ts +198 -0
- package/src/metrics/complexity-metrics.ts +617 -0
- package/src/public-api.ts +119 -0
- package/src/transformation/import-manager.ts +626 -0
- package/src/transformation/ng-morph-adapter.ts +252 -0
- package/src/transformation/ngmodule-manager.ts +450 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
5
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
6
|
+
/**
|
|
7
|
+
* @angular-modernizer/api - Template Usage Analyzer
|
|
8
|
+
*
|
|
9
|
+
* Intelligent template analysis for import filtering.
|
|
10
|
+
* Three-tier strategy: Fast path → Angular Compiler → Conservative fallback
|
|
11
|
+
*
|
|
12
|
+
* Philosophy: "Only Import What You Use"
|
|
13
|
+
* - Tier 1 (80%): String analysis for simple templates (~2ms)
|
|
14
|
+
* - Tier 2 (15%): Angular Compiler for complex templates (~15ms)
|
|
15
|
+
* - Tier 3 (5%): Conservative fallback (include all imports)
|
|
16
|
+
*
|
|
17
|
+
* Average overhead: ~15% (vs 30% single-tier approach)
|
|
18
|
+
*/
|
|
19
|
+
import { parseTemplate, InterpolationConfig } from '@angular/compiler';
|
|
20
|
+
import { LRUCache } from 'lru-cache';
|
|
21
|
+
import { SelectorMapper } from './selector-mapper.js';
|
|
22
|
+
import { ExternalTemplateLoader } from './external-template-loader.js';
|
|
23
|
+
/**
|
|
24
|
+
* Standard HTML5 elements that should be ignored.
|
|
25
|
+
* These are not Angular components/directives.
|
|
26
|
+
*/
|
|
27
|
+
const STANDARD_HTML_ELEMENTS = new Set([
|
|
28
|
+
'div',
|
|
29
|
+
'span',
|
|
30
|
+
'p',
|
|
31
|
+
'a',
|
|
32
|
+
'button',
|
|
33
|
+
'input',
|
|
34
|
+
'select',
|
|
35
|
+
'textarea',
|
|
36
|
+
'label',
|
|
37
|
+
'form',
|
|
38
|
+
'table',
|
|
39
|
+
'tr',
|
|
40
|
+
'td',
|
|
41
|
+
'th',
|
|
42
|
+
'thead',
|
|
43
|
+
'tbody',
|
|
44
|
+
'ul',
|
|
45
|
+
'ol',
|
|
46
|
+
'li',
|
|
47
|
+
'h1',
|
|
48
|
+
'h2',
|
|
49
|
+
'h3',
|
|
50
|
+
'h4',
|
|
51
|
+
'h5',
|
|
52
|
+
'h6',
|
|
53
|
+
'img',
|
|
54
|
+
'video',
|
|
55
|
+
'audio',
|
|
56
|
+
'canvas',
|
|
57
|
+
'svg',
|
|
58
|
+
'path',
|
|
59
|
+
'section',
|
|
60
|
+
'article',
|
|
61
|
+
'header',
|
|
62
|
+
'footer',
|
|
63
|
+
'nav',
|
|
64
|
+
'main',
|
|
65
|
+
'aside',
|
|
66
|
+
'figure',
|
|
67
|
+
'figcaption',
|
|
68
|
+
]);
|
|
69
|
+
/**
|
|
70
|
+
* CommonModule pipes that are always available.
|
|
71
|
+
*/
|
|
72
|
+
const COMMON_MODULE_PIPES = new Set([
|
|
73
|
+
'AsyncPipe',
|
|
74
|
+
'CurrencyPipe',
|
|
75
|
+
'DatePipe',
|
|
76
|
+
'DecimalPipe',
|
|
77
|
+
'I18nPluralPipe',
|
|
78
|
+
'I18nSelectPipe',
|
|
79
|
+
'JsonPipe',
|
|
80
|
+
'KeyValuePipe',
|
|
81
|
+
'LowerCasePipe',
|
|
82
|
+
'PercentPipe',
|
|
83
|
+
'SlicePipe',
|
|
84
|
+
'TitleCasePipe',
|
|
85
|
+
'UpperCasePipe',
|
|
86
|
+
]);
|
|
87
|
+
/**
|
|
88
|
+
* Template Usage Analyzer with Three-Tier Strategy.
|
|
89
|
+
*
|
|
90
|
+
* Analyzes Angular templates to determine which imports are actually used.
|
|
91
|
+
* Uses a progressive enhancement approach for optimal performance.
|
|
92
|
+
*/
|
|
93
|
+
export class TemplateUsageAnalyzer {
|
|
94
|
+
templateParseCache = new LRUCache({
|
|
95
|
+
max: 500, // Cache 500 templates
|
|
96
|
+
ttl: 1000 * 60 * 5, // 5 minutes
|
|
97
|
+
});
|
|
98
|
+
selectorMapper = new SelectorMapper();
|
|
99
|
+
templateLoader = new ExternalTemplateLoader();
|
|
100
|
+
/**
|
|
101
|
+
* Analyze template and return ONLY what's actually used.
|
|
102
|
+
*
|
|
103
|
+
* Uses three-tier strategy for optimal performance:
|
|
104
|
+
* - Tier 1: Fast path for simple templates (80% of cases, ~2ms)
|
|
105
|
+
* - Tier 2: Angular Compiler for complex templates (15% of cases, ~15ms)
|
|
106
|
+
* - Tier 3: Conservative fallback (5% of cases, include all imports)
|
|
107
|
+
*
|
|
108
|
+
* @param component - Component class declaration
|
|
109
|
+
* @param templateContent - Template HTML content
|
|
110
|
+
* @param availableImports - All imports from parent NgModule
|
|
111
|
+
* @param project - ts-morph Project (for selector mapping)
|
|
112
|
+
* @returns Array of actually-used import names
|
|
113
|
+
*/
|
|
114
|
+
analyzeTemplateUsage(component, templateContent, availableImports, project) {
|
|
115
|
+
// TIER 1: Fast path for simple templates (80% of cases)
|
|
116
|
+
if (this.isSimpleTemplate(templateContent)) {
|
|
117
|
+
console.info(` Using fast path analysis (simple template)`);
|
|
118
|
+
return this.fastPathAnalysis(templateContent, availableImports, project);
|
|
119
|
+
}
|
|
120
|
+
// TIER 2: Angular compiler for complex templates (15% of cases)
|
|
121
|
+
try {
|
|
122
|
+
console.info(` Using Angular compiler analysis (complex template)`);
|
|
123
|
+
// Check cache first
|
|
124
|
+
const cacheKey = this.getCacheKey(component, templateContent);
|
|
125
|
+
const cached = this.templateParseCache.get(cacheKey);
|
|
126
|
+
if (cached) {
|
|
127
|
+
console.info(` Cache hit for ${component.getName()}`);
|
|
128
|
+
return this.extractImportsFromParsed(cached, availableImports, project);
|
|
129
|
+
}
|
|
130
|
+
// Parse with Angular compiler
|
|
131
|
+
const parsed = parseTemplate(templateContent, 'component.html', {
|
|
132
|
+
preserveWhitespaces: false,
|
|
133
|
+
interpolationConfig: InterpolationConfig.fromArray(['{{', '}}']),
|
|
134
|
+
});
|
|
135
|
+
// Cache result
|
|
136
|
+
this.templateParseCache.set(cacheKey, parsed);
|
|
137
|
+
// Extract imports from AST
|
|
138
|
+
return this.extractImportsFromParsed(parsed, availableImports, project);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
// TIER 3: Conservative fallback (5% of cases)
|
|
142
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
143
|
+
console.warn(` Template parsing failed for ${component.getName()}, using conservative strategy`);
|
|
144
|
+
console.warn(` Error: ${errorMessage}`);
|
|
145
|
+
return this.conservativeFallback(availableImports);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Analyze external template (from templateUrl) and return ONLY what's used.
|
|
150
|
+
*
|
|
151
|
+
* Loads the external template file and analyzes it using the three-tier strategy.
|
|
152
|
+
*
|
|
153
|
+
* @param component - Component class declaration
|
|
154
|
+
* @param templateUrl - Template URL from `` metadata (e.g., './user.component.html')
|
|
155
|
+
* @param componentPath - Absolute path to the component file
|
|
156
|
+
* @param availableImports - All imports from parent NgModule
|
|
157
|
+
* @param project - ts-morph Project (for selector mapping)
|
|
158
|
+
* @returns Array of actually-used import names
|
|
159
|
+
*/
|
|
160
|
+
async analyzeExternalTemplate(component, templateUrl, componentPath, availableImports, project) {
|
|
161
|
+
console.info(` Loading external template: ${templateUrl}`);
|
|
162
|
+
const componentFilePath = component.getSourceFile().getFilePath() || componentPath;
|
|
163
|
+
// Load external template
|
|
164
|
+
const templateContent = await this.templateLoader.loadExternalTemplate(templateUrl, componentFilePath);
|
|
165
|
+
// If loading failed, use conservative fallback
|
|
166
|
+
if (!templateContent) {
|
|
167
|
+
console.warn(` External template empty or failed to load, using conservative strategy`);
|
|
168
|
+
return this.conservativeFallback(availableImports);
|
|
169
|
+
}
|
|
170
|
+
// Analyze the loaded template
|
|
171
|
+
return this.analyzeTemplateUsage(component, templateContent, availableImports, project);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Determine if template is simple (can use fast path).
|
|
175
|
+
*
|
|
176
|
+
* Simple templates:
|
|
177
|
+
* - No interpolation: {{ }}
|
|
178
|
+
* - No structural directives: *ngIf, *ngFor, *ngSwitch
|
|
179
|
+
* - No property/event bindings: [], ()
|
|
180
|
+
* - Short content (< 500 chars)
|
|
181
|
+
*/
|
|
182
|
+
isSimpleTemplate(content) {
|
|
183
|
+
return (!content.includes('{{') &&
|
|
184
|
+
!content.includes('*ng') &&
|
|
185
|
+
!content.includes('[') &&
|
|
186
|
+
!content.includes('(') &&
|
|
187
|
+
content.length < 500);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Fast path: String-based analysis for simple templates.
|
|
191
|
+
*
|
|
192
|
+
* Uses regex to extract element selectors only.
|
|
193
|
+
* ~2ms per template (very fast).
|
|
194
|
+
*/
|
|
195
|
+
fastPathAnalysis(templateContent, availableImports, project) {
|
|
196
|
+
const requiredImports = new Set();
|
|
197
|
+
// Always include CommonModule for basic directives
|
|
198
|
+
requiredImports.add('CommonModule');
|
|
199
|
+
// Extract element selectors: <app-user></app-user>
|
|
200
|
+
const elementRegex = /<([a-z][a-z0-9-]*)/gi;
|
|
201
|
+
const matches = templateContent.matchAll(elementRegex);
|
|
202
|
+
for (const match of matches) {
|
|
203
|
+
const selector = match[1];
|
|
204
|
+
// Skip if selector is undefined or empty
|
|
205
|
+
if (!selector) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
// Skip standard HTML elements
|
|
209
|
+
if (this.isStandardHtmlElement(selector)) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
// Map selector → class name via Phase 3 selector map
|
|
213
|
+
const className = this.mapSelectorToClassName(selector, availableImports, project);
|
|
214
|
+
if (className) {
|
|
215
|
+
requiredImports.add(className);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return Array.from(requiredImports);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Angular compiler-based analysis for complex templates.
|
|
222
|
+
*
|
|
223
|
+
* Parses template AST and extracts:
|
|
224
|
+
* - Element nodes (components)
|
|
225
|
+
* - Pipe nodes (pipes)
|
|
226
|
+
* - Attribute directives
|
|
227
|
+
* - Structural directives
|
|
228
|
+
*
|
|
229
|
+
* ~15ms per template (slower but accurate).
|
|
230
|
+
*/
|
|
231
|
+
extractImportsFromParsed(parsed, availableImports, project) {
|
|
232
|
+
const requiredImports = new Set();
|
|
233
|
+
// Always include CommonModule
|
|
234
|
+
requiredImports.add('CommonModule');
|
|
235
|
+
// Extract from AST nodes
|
|
236
|
+
const elements = this.extractElementsFromAST(parsed.nodes);
|
|
237
|
+
const pipes = this.extractPipesFromAST(parsed.nodes);
|
|
238
|
+
const directives = this.extractDirectivesFromAST(parsed.nodes);
|
|
239
|
+
// Map selectors to class names
|
|
240
|
+
for (const selector of elements) {
|
|
241
|
+
const className = this.mapSelectorToClassName(selector, availableImports, project);
|
|
242
|
+
if (className) {
|
|
243
|
+
requiredImports.add(className);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Map pipes to class names
|
|
247
|
+
for (const pipeName of pipes) {
|
|
248
|
+
const className = this.mapPipeToClassName(pipeName, availableImports);
|
|
249
|
+
if (className) {
|
|
250
|
+
requiredImports.add(className);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Map directives to class names
|
|
254
|
+
for (const directiveName of directives) {
|
|
255
|
+
const className = this.mapDirectiveToClassName(directiveName, availableImports);
|
|
256
|
+
if (className) {
|
|
257
|
+
requiredImports.add(className);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return Array.from(requiredImports);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* ⭐ CRITICAL: Selector-to-Class mapping using Phase 3 selector map.
|
|
264
|
+
*
|
|
265
|
+
* Reuses Phase 3's cached selector map for O(1) lookup.
|
|
266
|
+
*
|
|
267
|
+
* Example: 'app-user-profile' → 'UserProfileComponent'
|
|
268
|
+
*/
|
|
269
|
+
mapSelectorToClassName(selector, availableImports, project) {
|
|
270
|
+
// Reuse Phase 3's selector map caching (O(1) lookup)
|
|
271
|
+
const className = this.selectorMapper.findComponentBySelector(project, selector);
|
|
272
|
+
if (!className) {
|
|
273
|
+
console.warn(` ⚠️ Unknown selector: ${selector}`);
|
|
274
|
+
return undefined;
|
|
275
|
+
}
|
|
276
|
+
// Verify it's in availableImports
|
|
277
|
+
if (!availableImports.includes(className)) {
|
|
278
|
+
console.info(` Selector ${selector} → ${className} not in available imports (external component)`);
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
return className;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Map pipe name to class name.
|
|
285
|
+
*
|
|
286
|
+
* Examples:
|
|
287
|
+
* - 'ngxMask' → 'NgxMaskPipe'
|
|
288
|
+
* - 'currency' → 'CurrencyPipe' (CommonModule)
|
|
289
|
+
* - 'uppercase' → 'UpperCasePipe' (CommonModule)
|
|
290
|
+
*/
|
|
291
|
+
mapPipeToClassName(pipeName, availableImports) {
|
|
292
|
+
// Try exact match first
|
|
293
|
+
if (availableImports.includes(pipeName)) {
|
|
294
|
+
return pipeName;
|
|
295
|
+
}
|
|
296
|
+
// Try with 'Pipe' suffix
|
|
297
|
+
const withSuffix = `${pipeName.charAt(0).toUpperCase()}${pipeName.slice(1)}Pipe`;
|
|
298
|
+
if (availableImports.includes(withSuffix)) {
|
|
299
|
+
return withSuffix;
|
|
300
|
+
}
|
|
301
|
+
// CommonModule pipes (always available)
|
|
302
|
+
if (COMMON_MODULE_PIPES.has(withSuffix)) {
|
|
303
|
+
return 'CommonModule'; // Pipe comes from CommonModule
|
|
304
|
+
}
|
|
305
|
+
console.warn(` Unknown pipe: ${pipeName}`);
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Map directive name to class name.
|
|
310
|
+
*
|
|
311
|
+
* Examples:
|
|
312
|
+
* - 'ngModel' → 'NgModel'
|
|
313
|
+
* - 'ngIf' → 'NgIf' (CommonModule)
|
|
314
|
+
* - 'myDirective' → 'MyDirectiveDirective'
|
|
315
|
+
*/
|
|
316
|
+
mapDirectiveToClassName(directiveName, availableImports) {
|
|
317
|
+
// Try exact match first
|
|
318
|
+
if (availableImports.includes(directiveName)) {
|
|
319
|
+
return directiveName;
|
|
320
|
+
}
|
|
321
|
+
// Try with 'Directive' suffix
|
|
322
|
+
const withSuffix = `${directiveName.charAt(0).toUpperCase()}${directiveName.slice(1)}Directive`;
|
|
323
|
+
if (availableImports.includes(withSuffix)) {
|
|
324
|
+
return withSuffix;
|
|
325
|
+
}
|
|
326
|
+
// CommonModule directives (structural)
|
|
327
|
+
const commonDirectives = [
|
|
328
|
+
'NgIf',
|
|
329
|
+
'NgFor',
|
|
330
|
+
'NgSwitch',
|
|
331
|
+
'NgSwitchCase',
|
|
332
|
+
'NgSwitchDefault',
|
|
333
|
+
];
|
|
334
|
+
if (commonDirectives.includes(withSuffix.replace('Directive', ''))) {
|
|
335
|
+
return 'CommonModule';
|
|
336
|
+
}
|
|
337
|
+
console.warn(` Unknown directive: ${directiveName}`);
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Conservative fallback: Include all imports (safe).
|
|
342
|
+
*
|
|
343
|
+
* Used when:
|
|
344
|
+
* - Template parsing fails
|
|
345
|
+
* - Template is invalid
|
|
346
|
+
* - Compilation errors
|
|
347
|
+
*
|
|
348
|
+
* Better to include too much than break the application.
|
|
349
|
+
*/
|
|
350
|
+
conservativeFallback(availableImports) {
|
|
351
|
+
console.info(` Conservative fallback: including all ${availableImports.length} imports`);
|
|
352
|
+
return availableImports;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Check if element is a standard HTML element.
|
|
356
|
+
*/
|
|
357
|
+
isStandardHtmlElement(tagName) {
|
|
358
|
+
return STANDARD_HTML_ELEMENTS.has(tagName.toLowerCase());
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Generate cache key for template parsing.
|
|
362
|
+
*/
|
|
363
|
+
getCacheKey(component, templateContent) {
|
|
364
|
+
const componentName = component.getName() ?? 'unknown';
|
|
365
|
+
const contentHash = this.simpleHash(templateContent);
|
|
366
|
+
return `${componentName}-${contentHash}`;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Simple hash function for cache keys.
|
|
370
|
+
*/
|
|
371
|
+
simpleHash(str) {
|
|
372
|
+
let hash = 0;
|
|
373
|
+
for (let i = 0; i < str.length; i++) {
|
|
374
|
+
const char = str.codePointAt(i);
|
|
375
|
+
hash = (hash << 5) - hash + char;
|
|
376
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
377
|
+
}
|
|
378
|
+
return hash.toString(36);
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Extract element selectors from Angular Compiler AST.
|
|
382
|
+
*/
|
|
383
|
+
extractElementsFromAST(nodes) {
|
|
384
|
+
const elements = [];
|
|
385
|
+
const traverse = (node) => {
|
|
386
|
+
if (!node) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
// Element node
|
|
390
|
+
if (node.name && typeof node.name === 'string') {
|
|
391
|
+
if (!this.isStandardHtmlElement(node.name)) {
|
|
392
|
+
elements.push(node.name);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Traverse children
|
|
396
|
+
if (Array.isArray(node.children)) {
|
|
397
|
+
node.children.forEach(traverse);
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
if (Array.isArray(nodes)) {
|
|
401
|
+
nodes.forEach(traverse);
|
|
402
|
+
}
|
|
403
|
+
return elements;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Extract pipe names from Angular Compiler AST.
|
|
407
|
+
*/
|
|
408
|
+
extractPipesFromAST(nodes) {
|
|
409
|
+
const pipes = [];
|
|
410
|
+
const traverse = (node) => {
|
|
411
|
+
if (!node) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
// Pipe expression node
|
|
415
|
+
if (node.name && node.exp && typeof node.name === 'string') {
|
|
416
|
+
pipes.push(node.name);
|
|
417
|
+
}
|
|
418
|
+
// Traverse children and expressions
|
|
419
|
+
if (Array.isArray(node.children)) {
|
|
420
|
+
node.children.forEach(traverse);
|
|
421
|
+
}
|
|
422
|
+
if (node.exp) {
|
|
423
|
+
traverse(node.exp);
|
|
424
|
+
}
|
|
425
|
+
if (node.args) {
|
|
426
|
+
node.args.forEach(traverse);
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
if (Array.isArray(nodes)) {
|
|
430
|
+
nodes.forEach(traverse);
|
|
431
|
+
}
|
|
432
|
+
return pipes;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Extract directive names from Angular Compiler AST.
|
|
436
|
+
*/
|
|
437
|
+
extractDirectivesFromAST(nodes) {
|
|
438
|
+
const directives = [];
|
|
439
|
+
const traverse = (node) => {
|
|
440
|
+
if (!node) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
// Structural directive (*ngIf, *ngFor, etc.)
|
|
444
|
+
if (node.templateAttrs && Array.isArray(node.templateAttrs)) {
|
|
445
|
+
node.templateAttrs.forEach((attr) => {
|
|
446
|
+
if (attr.name && typeof attr.name === 'string') {
|
|
447
|
+
directives.push(attr.name);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
// Attribute directive
|
|
452
|
+
if (node.attributes && Array.isArray(node.attributes)) {
|
|
453
|
+
node.attributes.forEach((attr) => {
|
|
454
|
+
if (attr.name && typeof attr.name === 'string') {
|
|
455
|
+
// Skip standard HTML attributes
|
|
456
|
+
if (!this.isStandardHtmlElement(attr.name) &&
|
|
457
|
+
attr.name.includes('[')) {
|
|
458
|
+
directives.push(attr.name.replaceAll(/[[\]]/g, ''));
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
// Traverse children
|
|
464
|
+
if (Array.isArray(node.children)) {
|
|
465
|
+
node.children.forEach(traverse);
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
if (Array.isArray(nodes)) {
|
|
469
|
+
nodes.forEach(traverse);
|
|
470
|
+
}
|
|
471
|
+
return directives;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=template-analyzer-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-analyzer-usage.js","sourceRoot":"","sources":["../../src/analysis/template-analyzer-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @angular-modernizer/api - Template Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Dumb Collector - extracts ALL elements from Angular templates.
|
|
5
|
+
* Zero filtering, zero intelligence. Based on the "Trust the Map" principle.
|
|
6
|
+
*
|
|
7
|
+
* Philosophy: "Collect Everything, Filter Later"
|
|
8
|
+
* - No business logic in collectors
|
|
9
|
+
* - Plugins decide what matters
|
|
10
|
+
* - Raw data is more valuable than pre-filtered data
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Represents a single template usage (element, directive, pipe, etc.).
|
|
14
|
+
*/
|
|
15
|
+
export interface TemplateUsage {
|
|
16
|
+
/**
|
|
17
|
+
* Type of usage.
|
|
18
|
+
*/
|
|
19
|
+
type: 'element' | 'directive' | 'pipe' | 'component' | 'structural-directive' | 'control-flow';
|
|
20
|
+
/**
|
|
21
|
+
* Name/selector of the element.
|
|
22
|
+
*/
|
|
23
|
+
name: string;
|
|
24
|
+
/**
|
|
25
|
+
* Position in template (line number).
|
|
26
|
+
*/
|
|
27
|
+
line?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Position in template (column number).
|
|
30
|
+
*/
|
|
31
|
+
column?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Raw HTML/template string of this usage.
|
|
34
|
+
*/
|
|
35
|
+
raw?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Attributes/inputs on this element.
|
|
38
|
+
*/
|
|
39
|
+
attributes?: Record<string, string>;
|
|
40
|
+
/**
|
|
41
|
+
* Additional metadata.
|
|
42
|
+
*/
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Template Analyzer - extracts all usages from Angular templates.
|
|
47
|
+
*
|
|
48
|
+
* This is a "Dumb Collector" that doesn't filter or interpret.
|
|
49
|
+
* It just collects everything and lets plugins decide what's important.
|
|
50
|
+
*/
|
|
51
|
+
export declare class TemplateAnalyzer {
|
|
52
|
+
/**
|
|
53
|
+
* Analyze a template string and extract all usages.
|
|
54
|
+
*
|
|
55
|
+
* @param template - The template string to analyze
|
|
56
|
+
* @returns Array of template usages
|
|
57
|
+
*
|
|
58
|
+
* Philosophy: "Collect Everything, Filter Later"
|
|
59
|
+
* - Extracts ALL elements, attributes, pipes, directives
|
|
60
|
+
* - No filtering, no business logic
|
|
61
|
+
* - Plugins decide what's important using the SymbolMapper
|
|
62
|
+
*/
|
|
63
|
+
analyze(template: string): TemplateUsage[];
|
|
64
|
+
/**
|
|
65
|
+
* Extract inline template from component decorator.
|
|
66
|
+
*
|
|
67
|
+
* @param decoratorText - The `` decorator text
|
|
68
|
+
* @returns The template string or undefined
|
|
69
|
+
*/
|
|
70
|
+
extractInlineTemplate(decoratorText: string): string | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Check if a template uses a specific selector.
|
|
73
|
+
*
|
|
74
|
+
* @param template - The template string
|
|
75
|
+
* @param selector - The selector to search for
|
|
76
|
+
* @returns True if selector is used
|
|
77
|
+
*/
|
|
78
|
+
usesSelector(template: string, selector: string): boolean;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=template-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-analyzer.d.ts","sourceRoot":"","sources":["../../src/analysis/template-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EACA,SAAS,GACT,WAAW,GACX,MAAM,GACN,WAAW,GACX,sBAAsB,GACtB,cAAc,CAAC;IAEnB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAsG1C;;;;;OAKG;IACH,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAYhE;;;;;;OAMG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;CAI1D"}
|