@angular-modernizer/api 0.1.3 → 0.2.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/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/investigation/call-graph-builder.d.ts +95 -8
- package/dist/investigation/call-graph-builder.d.ts.map +1 -1
- package/dist/investigation/call-graph-builder.js +424 -81
- package/dist/investigation/call-graph-builder.js.map +1 -1
- package/dist/investigation/codebase-searcher.d.ts +68 -0
- package/dist/investigation/codebase-searcher.d.ts.map +1 -1
- package/dist/investigation/codebase-searcher.js +154 -10
- package/dist/investigation/codebase-searcher.js.map +1 -1
- package/dist/investigation/template-usage-finder.d.ts +64 -0
- package/dist/investigation/template-usage-finder.d.ts.map +1 -0
- package/dist/investigation/template-usage-finder.js +279 -0
- package/dist/investigation/template-usage-finder.js.map +1 -0
- package/dist/investigation/template-usage-scanner.d.ts +69 -0
- package/dist/investigation/template-usage-scanner.d.ts.map +1 -0
- package/dist/investigation/template-usage-scanner.js +375 -0
- package/dist/investigation/template-usage-scanner.js.map +1 -0
- package/dist/investigation/usage-finder.d.ts +51 -5
- package/dist/investigation/usage-finder.d.ts.map +1 -1
- package/dist/investigation/usage-finder.js +129 -36
- package/dist/investigation/usage-finder.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +16 -0
- package/src/investigation/call-graph-builder.ts +528 -103
- package/src/investigation/codebase-searcher.ts +240 -11
- package/src/investigation/template-usage-finder.ts +389 -0
- package/src/investigation/template-usage-scanner.ts +529 -0
- package/src/investigation/usage-finder.ts +194 -54
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
* `search`. For `symbol` mode only top-level named declarations are indexed;
|
|
13
13
|
* local variables and anonymous expressions are not returned.
|
|
14
14
|
*
|
|
15
|
+
* When `rootDir` is given, `text` and `pattern` modes additionally scan files
|
|
16
|
+
* under that directory which are NOT part of the ts-morph program: Angular
|
|
17
|
+
* templates (`.html`) and `.ts` files outside the tsconfig (for example
|
|
18
|
+
* `src/i18n/*.ts`). `node_modules`, `dist`, `.angular`, `coverage`, `out-tsc`
|
|
19
|
+
* and hidden directories are skipped. Use `searchWithCoverage` to learn how
|
|
20
|
+
* many files were actually searched.
|
|
21
|
+
*
|
|
15
22
|
* @example
|
|
16
23
|
* ```typescript
|
|
17
24
|
* const searcher = new CodebaseSearcher(project);
|
|
@@ -44,6 +51,29 @@ export interface SearchResult {
|
|
|
44
51
|
* Absent in `text` and `pattern` modes.
|
|
45
52
|
*/
|
|
46
53
|
symbolKind?: SymbolKind;
|
|
54
|
+
/**
|
|
55
|
+
* `program` when the file is part of the ts-morph program, `non-program`
|
|
56
|
+
* when it was found by the file-system scan (templates, non-program `.ts`).
|
|
57
|
+
*/
|
|
58
|
+
source?: 'program' | 'non-program';
|
|
59
|
+
}
|
|
60
|
+
/** Describes which files a search actually covered. */
|
|
61
|
+
export interface SearchCoverage {
|
|
62
|
+
/** Number of program source files searched (after the `include` filter). */
|
|
63
|
+
programFileCount: number;
|
|
64
|
+
/** Number of non-program files searched (templates, non-program `.ts`). */
|
|
65
|
+
extraFileCount: number;
|
|
66
|
+
/** Whether `.html` templates under `rootDir` were scanned. */
|
|
67
|
+
templatesScanned: boolean;
|
|
68
|
+
/** Whether `.ts` files outside the program were scanned. */
|
|
69
|
+
nonProgramFilesScanned: boolean;
|
|
70
|
+
/** Directory names that are never scanned. */
|
|
71
|
+
excludedDirectories: string[];
|
|
72
|
+
}
|
|
73
|
+
/** Result of `CodebaseSearcher.searchWithCoverage()`. */
|
|
74
|
+
export interface SearchWithCoverageResult {
|
|
75
|
+
results: SearchResult[];
|
|
76
|
+
coverage: SearchCoverage;
|
|
47
77
|
}
|
|
48
78
|
/** Options for `CodebaseSearcher.search()`. */
|
|
49
79
|
export interface SearchOptions {
|
|
@@ -64,7 +94,24 @@ export interface SearchOptions {
|
|
|
64
94
|
* returned.
|
|
65
95
|
*/
|
|
66
96
|
maxResults?: number;
|
|
97
|
+
/**
|
|
98
|
+
* Project root used to discover files that are not part of the ts-morph
|
|
99
|
+
* program. When omitted only program files are searched.
|
|
100
|
+
*/
|
|
101
|
+
rootDir?: string;
|
|
102
|
+
/**
|
|
103
|
+
* Scan `.html` files under `rootDir` (text/pattern modes only).
|
|
104
|
+
* Defaults to `true` when `rootDir` is set.
|
|
105
|
+
*/
|
|
106
|
+
includeTemplates?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Scan `.ts` files under `rootDir` that are not part of the program
|
|
109
|
+
* (text/pattern modes only). Defaults to `true` when `rootDir` is set.
|
|
110
|
+
*/
|
|
111
|
+
includeNonProgramFiles?: boolean;
|
|
67
112
|
}
|
|
113
|
+
/** Directory names never descended into by the non-program file scan. */
|
|
114
|
+
export declare const EXCLUDED_SEARCH_DIRECTORIES: readonly ["node_modules", "dist", ".angular", "coverage", "out-tsc"];
|
|
68
115
|
/**
|
|
69
116
|
* Searches source files in a ts-morph `Project` by text, regex, or symbol
|
|
70
117
|
* name.
|
|
@@ -86,6 +133,27 @@ export declare class CodebaseSearcher {
|
|
|
86
133
|
* ```
|
|
87
134
|
*/
|
|
88
135
|
search(query: string, options: SearchOptions): SearchResult[];
|
|
136
|
+
/**
|
|
137
|
+
* Like `search`, but also reports which files were covered. Callers should
|
|
138
|
+
* surface `coverage` whenever a search returns 0 hits: an empty result only
|
|
139
|
+
* proves absence within the covered files.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const { results, coverage } = searcher.searchWithCoverage('i18n.key', {
|
|
144
|
+
* mode: 'text',
|
|
145
|
+
* rootDir: '/project',
|
|
146
|
+
* });
|
|
147
|
+
* // coverage.programFileCount, coverage.extraFileCount
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
searchWithCoverage(query: string, options: SearchOptions): SearchWithCoverageResult;
|
|
151
|
+
private toSearchable;
|
|
152
|
+
/**
|
|
153
|
+
* Walks `rootDir` via the project's file system host (works for real and
|
|
154
|
+
* in-memory file systems) and returns files outside the program.
|
|
155
|
+
*/
|
|
156
|
+
private collectNonProgramFiles;
|
|
89
157
|
/**
|
|
90
158
|
* Text or pattern search: splits each file into lines and tests each line.
|
|
91
159
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codebase-searcher.d.ts","sourceRoot":"","sources":["../../src/investigation/codebase-searcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codebase-searcher.d.ts","sourceRoot":"","sources":["../../src/investigation/codebase-searcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,UAAU,CAAC;AAEpD,qEAAqE;AACrE,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,UAAU,GACV,WAAW,GACX,MAAM,GACN,WAAW,GACX,UAAU,CAAC;AAEf,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IAEb,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IAEb,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IAEZ,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACpC;AAED,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,CAAC;IAEzB,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,gBAAgB,EAAE,OAAO,CAAC;IAE1B,4DAA4D;IAC5D,sBAAsB,EAAE,OAAO,CAAC;IAEhC,8CAA8C;IAC9C,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,yDAAyD;AACzD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAEpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,yEAAyE;AACzE,eAAO,MAAM,2BAA2B,sEAM9B,CAAC;AA+CX;;;GAGG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAE7C;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,EAAE;IAI7D;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,wBAAwB;IAgD3B,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAsClB;;;OAGG;IACH,OAAO,CAAC,aAAa;CAwGtB"}
|
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
* `search`. For `symbol` mode only top-level named declarations are indexed;
|
|
13
13
|
* local variables and anonymous expressions are not returned.
|
|
14
14
|
*
|
|
15
|
+
* When `rootDir` is given, `text` and `pattern` modes additionally scan files
|
|
16
|
+
* under that directory which are NOT part of the ts-morph program: Angular
|
|
17
|
+
* templates (`.html`) and `.ts` files outside the tsconfig (for example
|
|
18
|
+
* `src/i18n/*.ts`). `node_modules`, `dist`, `.angular`, `coverage`, `out-tsc`
|
|
19
|
+
* and hidden directories are skipped. Use `searchWithCoverage` to learn how
|
|
20
|
+
* many files were actually searched.
|
|
21
|
+
*
|
|
15
22
|
* @example
|
|
16
23
|
* ```typescript
|
|
17
24
|
* const searcher = new CodebaseSearcher(project);
|
|
@@ -26,6 +33,33 @@
|
|
|
26
33
|
* const classes = searcher.search('UserService', { mode: 'symbol' });
|
|
27
34
|
* ```
|
|
28
35
|
*/
|
|
36
|
+
/** Directory names never descended into by the non-program file scan. */
|
|
37
|
+
export const EXCLUDED_SEARCH_DIRECTORIES = [
|
|
38
|
+
'node_modules',
|
|
39
|
+
'dist',
|
|
40
|
+
'.angular',
|
|
41
|
+
'coverage',
|
|
42
|
+
'out-tsc',
|
|
43
|
+
];
|
|
44
|
+
function normalizePath(path) {
|
|
45
|
+
return path.replaceAll('\\', '/');
|
|
46
|
+
}
|
|
47
|
+
function joinPath(dir, name) {
|
|
48
|
+
const normalizedName = normalizePath(name);
|
|
49
|
+
if (normalizedName.startsWith('/') || /^[A-Za-z]:\//.test(normalizedName)) {
|
|
50
|
+
return normalizedName;
|
|
51
|
+
}
|
|
52
|
+
const base = normalizePath(dir).replace(/\/+$/, '');
|
|
53
|
+
return `${base}/${normalizedName}`;
|
|
54
|
+
}
|
|
55
|
+
function baseName(path) {
|
|
56
|
+
const parts = normalizePath(path).split('/');
|
|
57
|
+
return parts[parts.length - 1] ?? path;
|
|
58
|
+
}
|
|
59
|
+
function isExcludedDirectory(name) {
|
|
60
|
+
return (name.startsWith('.') ||
|
|
61
|
+
EXCLUDED_SEARCH_DIRECTORIES.includes(name));
|
|
62
|
+
}
|
|
29
63
|
/**
|
|
30
64
|
* Converts a glob pattern (`**\/*.service.ts`) to a RegExp and tests `filePath`.
|
|
31
65
|
* Supports `**` (any path segments) and `*` (single segment wildcard).
|
|
@@ -61,27 +95,136 @@ export class CodebaseSearcher {
|
|
|
61
95
|
* ```
|
|
62
96
|
*/
|
|
63
97
|
search(query, options) {
|
|
64
|
-
|
|
98
|
+
return this.searchWithCoverage(query, options).results;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Like `search`, but also reports which files were covered. Callers should
|
|
102
|
+
* surface `coverage` whenever a search returns 0 hits: an empty result only
|
|
103
|
+
* proves absence within the covered files.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const { results, coverage } = searcher.searchWithCoverage('i18n.key', {
|
|
108
|
+
* mode: 'text',
|
|
109
|
+
* rootDir: '/project',
|
|
110
|
+
* });
|
|
111
|
+
* // coverage.programFileCount, coverage.extraFileCount
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
searchWithCoverage(query, options) {
|
|
115
|
+
const programFiles = this.project
|
|
65
116
|
.getSourceFiles()
|
|
66
117
|
.filter((sf) => options.include === undefined ||
|
|
67
118
|
matchesGlob(sf.getFilePath(), options.include));
|
|
119
|
+
const scanExtras = options.mode !== 'symbol' && options.rootDir !== undefined;
|
|
120
|
+
const templatesScanned = scanExtras && options.includeTemplates !== false;
|
|
121
|
+
const nonProgramFilesScanned = scanExtras && options.includeNonProgramFiles !== false;
|
|
122
|
+
const extraFiles = options.rootDir === undefined
|
|
123
|
+
? []
|
|
124
|
+
: this.collectNonProgramFiles(options.rootDir, {
|
|
125
|
+
html: templatesScanned,
|
|
126
|
+
ts: nonProgramFilesScanned,
|
|
127
|
+
include: options.include,
|
|
128
|
+
});
|
|
68
129
|
const results = options.mode === 'symbol'
|
|
69
|
-
? this.searchSymbols(query,
|
|
70
|
-
: this.searchText(query, options.mode,
|
|
71
|
-
|
|
72
|
-
|
|
130
|
+
? this.searchSymbols(query, programFiles)
|
|
131
|
+
: this.searchText(query, options.mode, [
|
|
132
|
+
...programFiles.map((sf) => this.toSearchable(sf)),
|
|
133
|
+
...extraFiles,
|
|
134
|
+
]);
|
|
135
|
+
const limited = options.maxResults === undefined
|
|
136
|
+
? results
|
|
137
|
+
: results.slice(0, options.maxResults);
|
|
138
|
+
return {
|
|
139
|
+
results: limited,
|
|
140
|
+
coverage: {
|
|
141
|
+
programFileCount: programFiles.length,
|
|
142
|
+
extraFileCount: extraFiles.length,
|
|
143
|
+
templatesScanned,
|
|
144
|
+
nonProgramFilesScanned,
|
|
145
|
+
excludedDirectories: [...EXCLUDED_SEARCH_DIRECTORIES, '.*'],
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
toSearchable(sf) {
|
|
150
|
+
return {
|
|
151
|
+
path: sf.getFilePath(),
|
|
152
|
+
text: () => sf.getFullText(),
|
|
153
|
+
source: 'program',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Walks `rootDir` via the project's file system host (works for real and
|
|
158
|
+
* in-memory file systems) and returns files outside the program.
|
|
159
|
+
*/
|
|
160
|
+
collectNonProgramFiles(rootDir, filter) {
|
|
161
|
+
if (!filter.html && !filter.ts) {
|
|
162
|
+
return [];
|
|
73
163
|
}
|
|
74
|
-
|
|
164
|
+
const fs = this.project.getFileSystem();
|
|
165
|
+
const programPaths = new Set(this.project.getSourceFiles().map((sf) => normalizePath(sf.getFilePath())));
|
|
166
|
+
const files = [];
|
|
167
|
+
const pending = [normalizePath(rootDir)];
|
|
168
|
+
const visited = new Set();
|
|
169
|
+
const wanted = (path) => {
|
|
170
|
+
if (filter.html && path.endsWith('.html')) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
return filter.ts && path.endsWith('.ts') && !programPaths.has(path);
|
|
174
|
+
};
|
|
175
|
+
while (pending.length > 0) {
|
|
176
|
+
const dir = pending.pop();
|
|
177
|
+
if (dir === undefined || visited.has(dir)) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
visited.add(dir);
|
|
181
|
+
let entries;
|
|
182
|
+
try {
|
|
183
|
+
entries = fs.readDirSync(dir);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
for (const entry of entries) {
|
|
189
|
+
const fullPath = joinPath(dir, entry.name);
|
|
190
|
+
if (entry.isDirectory) {
|
|
191
|
+
if (!entry.isSymlink && !isExcludedDirectory(baseName(fullPath))) {
|
|
192
|
+
pending.push(fullPath);
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (!entry.isFile || !wanted(fullPath)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (filter.include !== undefined &&
|
|
200
|
+
!matchesGlob(fullPath, filter.include)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
files.push({
|
|
204
|
+
path: fullPath,
|
|
205
|
+
text: () => {
|
|
206
|
+
try {
|
|
207
|
+
return fs.readFileSync(fullPath);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
source: 'non-program',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
75
218
|
}
|
|
76
219
|
/**
|
|
77
220
|
* Text or pattern search: splits each file into lines and tests each line.
|
|
78
221
|
*/
|
|
79
|
-
searchText(query, mode,
|
|
222
|
+
searchText(query, mode, files) {
|
|
80
223
|
const results = [];
|
|
81
224
|
const regex = mode === 'pattern' ? new RegExp(query) : null;
|
|
82
|
-
for (const
|
|
83
|
-
const filePath =
|
|
84
|
-
const lines =
|
|
225
|
+
for (const file of files) {
|
|
226
|
+
const filePath = file.path;
|
|
227
|
+
const lines = file.text().split('\n');
|
|
85
228
|
lines.forEach((lineText, index) => {
|
|
86
229
|
const matched = regex === null ? lineText.includes(query) : regex.test(lineText);
|
|
87
230
|
if (!matched) {
|
|
@@ -95,6 +238,7 @@ export class CodebaseSearcher {
|
|
|
95
238
|
line: index + 1,
|
|
96
239
|
col,
|
|
97
240
|
snippet: lineText.trim(),
|
|
241
|
+
source: file.source,
|
|
98
242
|
});
|
|
99
243
|
});
|
|
100
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codebase-searcher.js","sourceRoot":"","sources":["../../src/investigation/codebase-searcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"codebase-searcher.js","sourceRoot":"","sources":["../../src/investigation/codebase-searcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @angular-modernizer/api - Template Usage Finder
|
|
3
|
+
*
|
|
4
|
+
* Project-level companion to `scanTemplate`: resolves what a symbol means
|
|
5
|
+
* in Angular templates (component/directive selector, pipe name, class
|
|
6
|
+
* member, input/output binding) and scans every component template
|
|
7
|
+
* (external `templateUrl` files and inline `template:` literals).
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* Member hits are `verified` when they read the member from the component
|
|
11
|
+
* context (`foo`, `this.foo`) inside the template of the declaring class or
|
|
12
|
+
* one of its subclasses. Same-name reads elsewhere (other components, or
|
|
13
|
+
* `x.foo`) are reported as `template-unverified`: they may or may not refer
|
|
14
|
+
* to the searched member.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const finder = new TemplateUsageFinder(project);
|
|
19
|
+
* const usages = finder.findTemplateUsages('UserCardComponent', declarations);
|
|
20
|
+
* // [{ file: '/src/app/list.component.html', usageType: 'template', templateKind: 'element', ... }]
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { Node, type Project } from 'ts-morph';
|
|
24
|
+
import { type TemplateUsageKind } from './template-usage-scanner.js';
|
|
25
|
+
/** Whether a template hit is known to refer to the searched symbol. */
|
|
26
|
+
export type TemplateMatch = 'verified' | 'template-unverified';
|
|
27
|
+
/** A template usage mapped back to a file position. */
|
|
28
|
+
export interface TemplateSymbolUsage {
|
|
29
|
+
/** Absolute path of the `.html` file, or of the `.ts` file for inline templates. */
|
|
30
|
+
file: string;
|
|
31
|
+
/** 1-based line. */
|
|
32
|
+
line: number;
|
|
33
|
+
/** 1-based column. */
|
|
34
|
+
col: number;
|
|
35
|
+
/** Trimmed source line. */
|
|
36
|
+
snippet: string;
|
|
37
|
+
/** Kind of template usage. */
|
|
38
|
+
templateKind: TemplateUsageKind;
|
|
39
|
+
/** Verification level (see class remarks). */
|
|
40
|
+
templateMatch: TemplateMatch;
|
|
41
|
+
/** Class name of the component that owns the template. */
|
|
42
|
+
component: string;
|
|
43
|
+
/** Explanation for unverified hits. */
|
|
44
|
+
note?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Finds usages of a symbol inside Angular component templates.
|
|
48
|
+
*/
|
|
49
|
+
export declare class TemplateUsageFinder {
|
|
50
|
+
private readonly project;
|
|
51
|
+
constructor(project: Project);
|
|
52
|
+
/**
|
|
53
|
+
* @param symbol - Searched name (class, member, or pipe class name).
|
|
54
|
+
* @param declarations - Declaration nodes named `symbol` (as found by `UsageFinder`).
|
|
55
|
+
* @returns Template usages, unsorted.
|
|
56
|
+
*/
|
|
57
|
+
findTemplateUsages(symbol: string, declarations: Node[]): TemplateSymbolUsage[];
|
|
58
|
+
private buildQueries;
|
|
59
|
+
private toUsage;
|
|
60
|
+
/** All component templates in the project (inline and external). */
|
|
61
|
+
private collectTemplates;
|
|
62
|
+
private loadTemplate;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=template-usage-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-usage-finder.d.ts","sourceRoot":"","sources":["../../src/investigation/template-usage-finder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,IAAI,EAGJ,KAAK,OAAO,EAEb,MAAM,UAAU,CAAC;AAElB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAErC,uEAAuE;AACvE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,qBAAqB,CAAC;AAE/D,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IAEZ,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAEhB,8BAA8B;IAC9B,YAAY,EAAE,iBAAiB,CAAC;IAEhC,8CAA8C;IAC9C,aAAa,EAAE,aAAa,CAAC;IAE7B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAElB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoHD;;GAEG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAE7C;;;;OAIG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE;IA8D/E,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,OAAO;IA+Bf,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,YAAY;CAgDrB"}
|