@hugeicons/migrate-core 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/dist/constants.d.ts +40 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +117 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/hugeicons-map.json +41786 -0
- package/dist/data/mappings.d.ts +69 -0
- package/dist/data/mappings.d.ts.map +1 -0
- package/dist/data/mappings.js +402 -0
- package/dist/data/mappings.js.map +1 -0
- package/dist/engine/analyzer.d.ts +21 -0
- package/dist/engine/analyzer.d.ts.map +1 -0
- package/dist/engine/analyzer.js +374 -0
- package/dist/engine/analyzer.js.map +1 -0
- package/dist/engine/detector.d.ts +20 -0
- package/dist/engine/detector.d.ts.map +1 -0
- package/dist/engine/detector.js +124 -0
- package/dist/engine/detector.js.map +1 -0
- package/dist/engine/mapper.d.ts +31 -0
- package/dist/engine/mapper.d.ts.map +1 -0
- package/dist/engine/mapper.js +234 -0
- package/dist/engine/mapper.js.map +1 -0
- package/dist/engine/reporter.d.ts +11 -0
- package/dist/engine/reporter.d.ts.map +1 -0
- package/dist/engine/reporter.js +339 -0
- package/dist/engine/reporter.js.map +1 -0
- package/dist/engine/transformer.d.ts +26 -0
- package/dist/engine/transformer.d.ts.map +1 -0
- package/dist/engine/transformer.js +874 -0
- package/dist/engine/transformer.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +292 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Analyzer
|
|
3
|
+
* AST-based analysis of icon imports and usages
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import fg from 'fast-glob';
|
|
7
|
+
import { Project, SyntaxKind, Node, } from 'ts-morph';
|
|
8
|
+
import { SUPPORTED_LIBRARIES, MAX_TOP_ICONS } from '../constants.js';
|
|
9
|
+
import { detectLibraries } from './detector.js';
|
|
10
|
+
/**
|
|
11
|
+
* Scan project for icon usages
|
|
12
|
+
*/
|
|
13
|
+
export async function scanProject(options) {
|
|
14
|
+
const { root, include, exclude } = options;
|
|
15
|
+
// Detect libraries first
|
|
16
|
+
const detectedLibraries = await detectLibraries(options);
|
|
17
|
+
// Get list of files to analyze
|
|
18
|
+
const files = await fg(include, {
|
|
19
|
+
cwd: root,
|
|
20
|
+
ignore: exclude,
|
|
21
|
+
absolute: false,
|
|
22
|
+
});
|
|
23
|
+
// Create ts-morph project
|
|
24
|
+
const project = new Project({
|
|
25
|
+
skipAddingFilesFromTsConfig: true,
|
|
26
|
+
skipFileDependencyResolution: true,
|
|
27
|
+
});
|
|
28
|
+
const fileAnalyses = [];
|
|
29
|
+
const globalWarnings = [];
|
|
30
|
+
for (const relativeFile of files) {
|
|
31
|
+
const absolutePath = path.join(root, relativeFile);
|
|
32
|
+
try {
|
|
33
|
+
const sourceFile = project.addSourceFileAtPath(absolutePath);
|
|
34
|
+
const analysis = analyzeFile(sourceFile, relativeFile, detectedLibraries);
|
|
35
|
+
fileAnalyses.push(analysis);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
fileAnalyses.push({
|
|
39
|
+
filePath: relativeFile,
|
|
40
|
+
imports: [],
|
|
41
|
+
usages: [],
|
|
42
|
+
warnings: [],
|
|
43
|
+
parseError: error instanceof Error ? error.message : String(error),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Collect all warnings
|
|
48
|
+
for (const file of fileAnalyses) {
|
|
49
|
+
globalWarnings.push(...file.warnings);
|
|
50
|
+
}
|
|
51
|
+
// Calculate statistics
|
|
52
|
+
const stats = calculateStats(fileAnalyses);
|
|
53
|
+
return {
|
|
54
|
+
detectedLibraries,
|
|
55
|
+
files: fileAnalyses,
|
|
56
|
+
warnings: globalWarnings,
|
|
57
|
+
stats,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Analyze a single source file for icon imports and usages
|
|
62
|
+
*/
|
|
63
|
+
function analyzeFile(sourceFile, relativeFilePath, detectedLibraries) {
|
|
64
|
+
const imports = [];
|
|
65
|
+
const usages = [];
|
|
66
|
+
const warnings = [];
|
|
67
|
+
// Map of local name -> import info for quick lookup
|
|
68
|
+
const importMap = new Map();
|
|
69
|
+
// Track detected library names
|
|
70
|
+
const detectedLibNames = new Set(detectedLibraries.map((d) => d.name));
|
|
71
|
+
// Find all import declarations
|
|
72
|
+
const importDeclarations = sourceFile.getImportDeclarations();
|
|
73
|
+
for (const importDecl of importDeclarations) {
|
|
74
|
+
const moduleSpecifier = importDecl.getModuleSpecifierValue();
|
|
75
|
+
// Check if this import is from a detected icon library
|
|
76
|
+
const libraryDef = SUPPORTED_LIBRARIES.find((lib) => detectedLibNames.has(lib.name) &&
|
|
77
|
+
(moduleSpecifier === lib.name ||
|
|
78
|
+
lib.aliases.some((alias) => moduleSpecifier === alias || moduleSpecifier.startsWith(alias))));
|
|
79
|
+
if (!libraryDef)
|
|
80
|
+
continue;
|
|
81
|
+
const namedImports = importDecl.getNamedImports();
|
|
82
|
+
for (const namedImport of namedImports) {
|
|
83
|
+
const importedName = namedImport.getName();
|
|
84
|
+
const localName = namedImport.getAliasNode()?.getText() || importedName;
|
|
85
|
+
imports.push({
|
|
86
|
+
library: libraryDef.name,
|
|
87
|
+
importedName,
|
|
88
|
+
localName: localName !== importedName ? localName : undefined,
|
|
89
|
+
importStatement: importDecl.getText(),
|
|
90
|
+
line: importDecl.getStartLineNumber(),
|
|
91
|
+
});
|
|
92
|
+
importMap.set(localName, {
|
|
93
|
+
library: libraryDef.name,
|
|
94
|
+
importedName,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Check for default import (less common for icons)
|
|
98
|
+
const defaultImport = importDecl.getDefaultImport();
|
|
99
|
+
if (defaultImport) {
|
|
100
|
+
const name = defaultImport.getText();
|
|
101
|
+
imports.push({
|
|
102
|
+
library: libraryDef.name,
|
|
103
|
+
importedName: name,
|
|
104
|
+
importStatement: importDecl.getText(),
|
|
105
|
+
line: importDecl.getStartLineNumber(),
|
|
106
|
+
});
|
|
107
|
+
importMap.set(name, {
|
|
108
|
+
library: libraryDef.name,
|
|
109
|
+
importedName: name,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Find JSX usages
|
|
114
|
+
const jsxUsages = findJsxUsages(sourceFile, importMap, relativeFilePath, warnings);
|
|
115
|
+
usages.push(...jsxUsages);
|
|
116
|
+
// Find FontAwesome-style usages (icon prop pattern)
|
|
117
|
+
const faUsages = findFontAwesomeUsages(sourceFile, importMap, relativeFilePath, warnings);
|
|
118
|
+
usages.push(...faUsages);
|
|
119
|
+
// Check for dynamic patterns
|
|
120
|
+
checkDynamicPatterns(sourceFile, relativeFilePath, importMap, warnings);
|
|
121
|
+
return {
|
|
122
|
+
filePath: relativeFilePath,
|
|
123
|
+
imports,
|
|
124
|
+
usages,
|
|
125
|
+
warnings,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Find direct JSX usages (e.g., <AlarmClock />)
|
|
130
|
+
*/
|
|
131
|
+
function findJsxUsages(sourceFile, importMap, filePath, _warnings) {
|
|
132
|
+
const usageMap = new Map();
|
|
133
|
+
const processJsxElement = (element) => {
|
|
134
|
+
const tagName = element.getTagNameNode().getText();
|
|
135
|
+
const importInfo = importMap.get(tagName);
|
|
136
|
+
if (!importInfo)
|
|
137
|
+
return;
|
|
138
|
+
// Skip FontAwesome wrapper component
|
|
139
|
+
if (tagName === 'FontAwesomeIcon')
|
|
140
|
+
return;
|
|
141
|
+
const props = extractJsxProps(element);
|
|
142
|
+
const location = {
|
|
143
|
+
line: element.getStartLineNumber(),
|
|
144
|
+
column: element.getStart() - element.getStartLinePos(),
|
|
145
|
+
};
|
|
146
|
+
const key = `${importInfo.library}:${importInfo.importedName}`;
|
|
147
|
+
const existing = usageMap.get(key);
|
|
148
|
+
if (existing) {
|
|
149
|
+
existing.count++;
|
|
150
|
+
existing.locations.push(location);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
usageMap.set(key, {
|
|
154
|
+
filePath,
|
|
155
|
+
library: importInfo.library,
|
|
156
|
+
importedName: importInfo.importedName,
|
|
157
|
+
localName: tagName !== importInfo.importedName ? tagName : undefined,
|
|
158
|
+
jsxTagName: tagName,
|
|
159
|
+
count: 1,
|
|
160
|
+
locations: [location],
|
|
161
|
+
props,
|
|
162
|
+
dynamic: false,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
// Find all JSX elements
|
|
167
|
+
sourceFile.forEachDescendant((node) => {
|
|
168
|
+
if (Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node)) {
|
|
169
|
+
processJsxElement(node);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
return Array.from(usageMap.values());
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Find FontAwesome-style usages (<FontAwesomeIcon icon={faCoffee} />)
|
|
176
|
+
*/
|
|
177
|
+
function findFontAwesomeUsages(sourceFile, importMap, filePath, warnings) {
|
|
178
|
+
const usageMap = new Map();
|
|
179
|
+
const processElement = (element) => {
|
|
180
|
+
const tagName = element.getTagNameNode().getText();
|
|
181
|
+
if (tagName !== 'FontAwesomeIcon')
|
|
182
|
+
return;
|
|
183
|
+
const iconAttr = element.getAttribute('icon');
|
|
184
|
+
if (!iconAttr || !Node.isJsxAttribute(iconAttr))
|
|
185
|
+
return;
|
|
186
|
+
const initializer = iconAttr.getInitializer();
|
|
187
|
+
if (!initializer)
|
|
188
|
+
return;
|
|
189
|
+
let iconName;
|
|
190
|
+
// Handle {faCoffee} or {faIcon}
|
|
191
|
+
if (Node.isJsxExpression(initializer)) {
|
|
192
|
+
const expression = initializer.getExpression();
|
|
193
|
+
if (expression && Node.isIdentifier(expression)) {
|
|
194
|
+
iconName = expression.getText();
|
|
195
|
+
}
|
|
196
|
+
else if (expression) {
|
|
197
|
+
// Dynamic or complex expression
|
|
198
|
+
warnings.push({
|
|
199
|
+
type: 'computed-name',
|
|
200
|
+
message: `Dynamic icon reference in FontAwesomeIcon: ${expression.getText()}`,
|
|
201
|
+
filePath,
|
|
202
|
+
line: element.getStartLineNumber(),
|
|
203
|
+
});
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (!iconName)
|
|
208
|
+
return;
|
|
209
|
+
const importInfo = importMap.get(iconName);
|
|
210
|
+
if (!importInfo)
|
|
211
|
+
return;
|
|
212
|
+
const props = extractJsxProps(element);
|
|
213
|
+
delete props['icon']; // Remove the icon prop from props
|
|
214
|
+
const location = {
|
|
215
|
+
line: element.getStartLineNumber(),
|
|
216
|
+
column: element.getStart() - element.getStartLinePos(),
|
|
217
|
+
};
|
|
218
|
+
const key = `${importInfo.library}:${importInfo.importedName}`;
|
|
219
|
+
const existing = usageMap.get(key);
|
|
220
|
+
if (existing) {
|
|
221
|
+
existing.count++;
|
|
222
|
+
existing.locations.push(location);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
usageMap.set(key, {
|
|
226
|
+
filePath,
|
|
227
|
+
library: importInfo.library,
|
|
228
|
+
importedName: importInfo.importedName,
|
|
229
|
+
jsxTagName: 'FontAwesomeIcon',
|
|
230
|
+
count: 1,
|
|
231
|
+
locations: [location],
|
|
232
|
+
props,
|
|
233
|
+
dynamic: false,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
sourceFile.forEachDescendant((node) => {
|
|
238
|
+
if (Node.isJsxOpeningElement(node) || Node.isJsxSelfClosingElement(node)) {
|
|
239
|
+
processElement(node);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
return Array.from(usageMap.values());
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Extract props from a JSX element
|
|
246
|
+
*/
|
|
247
|
+
function extractJsxProps(element) {
|
|
248
|
+
const props = {};
|
|
249
|
+
const attributes = element.getAttributes();
|
|
250
|
+
for (const attr of attributes) {
|
|
251
|
+
if (Node.isJsxAttribute(attr)) {
|
|
252
|
+
const name = attr.getNameNode().getText();
|
|
253
|
+
const initializer = attr.getInitializer();
|
|
254
|
+
if (!initializer) {
|
|
255
|
+
// Boolean shorthand (e.g., <Icon spin />)
|
|
256
|
+
props[name] = true;
|
|
257
|
+
}
|
|
258
|
+
else if (Node.isStringLiteral(initializer)) {
|
|
259
|
+
props[name] = initializer.getLiteralValue();
|
|
260
|
+
}
|
|
261
|
+
else if (Node.isJsxExpression(initializer)) {
|
|
262
|
+
const expr = initializer.getExpression();
|
|
263
|
+
if (expr) {
|
|
264
|
+
if (Node.isNumericLiteral(expr)) {
|
|
265
|
+
props[name] = expr.getLiteralValue();
|
|
266
|
+
}
|
|
267
|
+
else if (Node.isStringLiteral(expr)) {
|
|
268
|
+
props[name] = expr.getLiteralValue();
|
|
269
|
+
}
|
|
270
|
+
else if (expr.getKind() === SyntaxKind.TrueKeyword) {
|
|
271
|
+
props[name] = true;
|
|
272
|
+
}
|
|
273
|
+
else if (expr.getKind() === SyntaxKind.FalseKeyword) {
|
|
274
|
+
props[name] = false;
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
// Complex expression - store as string representation
|
|
278
|
+
props[name] = `{${expr.getText()}}`;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return props;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Check for dynamic/unsupported patterns
|
|
288
|
+
*/
|
|
289
|
+
function checkDynamicPatterns(sourceFile, filePath, importMap, warnings) {
|
|
290
|
+
// Check for object access patterns like icons[name]
|
|
291
|
+
sourceFile.forEachDescendant((node) => {
|
|
292
|
+
// Check for ElementAccessExpression (icons[name])
|
|
293
|
+
if (Node.isElementAccessExpression(node)) {
|
|
294
|
+
const expression = node.getExpression();
|
|
295
|
+
if (Node.isIdentifier(expression)) {
|
|
296
|
+
const text = expression.getText();
|
|
297
|
+
// Check if it looks like an icon map
|
|
298
|
+
if (text.toLowerCase().includes('icon')) {
|
|
299
|
+
warnings.push({
|
|
300
|
+
type: 'computed-name',
|
|
301
|
+
message: `Dynamic icon selection detected: ${node.getText()}`,
|
|
302
|
+
filePath,
|
|
303
|
+
line: node.getStartLineNumber(),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Check for variable assignments that collect icons
|
|
309
|
+
if (Node.isVariableDeclaration(node)) {
|
|
310
|
+
const initializer = node.getInitializer();
|
|
311
|
+
if (initializer && Node.isObjectLiteralExpression(initializer)) {
|
|
312
|
+
// Check if object contains imported icons
|
|
313
|
+
const properties = initializer.getProperties();
|
|
314
|
+
let hasIcons = false;
|
|
315
|
+
for (const prop of properties) {
|
|
316
|
+
if (Node.isPropertyAssignment(prop) || Node.isShorthandPropertyAssignment(prop)) {
|
|
317
|
+
const name = prop.getName?.() || '';
|
|
318
|
+
if (importMap.has(name)) {
|
|
319
|
+
hasIcons = true;
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (hasIcons && properties.length > 3) {
|
|
325
|
+
warnings.push({
|
|
326
|
+
type: 're-export',
|
|
327
|
+
message: `Icon map object detected: ${node.getName()}`,
|
|
328
|
+
filePath,
|
|
329
|
+
line: node.getStartLineNumber(),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Calculate scan statistics
|
|
338
|
+
*/
|
|
339
|
+
function calculateStats(files) {
|
|
340
|
+
const iconCounts = new Map();
|
|
341
|
+
let totalUsages = 0;
|
|
342
|
+
let filesWithIcons = 0;
|
|
343
|
+
const folderCounts = new Map();
|
|
344
|
+
for (const file of files) {
|
|
345
|
+
if (file.usages.length > 0) {
|
|
346
|
+
filesWithIcons++;
|
|
347
|
+
}
|
|
348
|
+
for (const usage of file.usages) {
|
|
349
|
+
totalUsages += usage.count;
|
|
350
|
+
// Count by icon name
|
|
351
|
+
const current = iconCounts.get(usage.importedName) || 0;
|
|
352
|
+
iconCounts.set(usage.importedName, current + usage.count);
|
|
353
|
+
// Count by folder
|
|
354
|
+
const folder = path.dirname(file.filePath).split(path.sep)[0] || '.';
|
|
355
|
+
const folderCount = folderCounts.get(folder) || 0;
|
|
356
|
+
folderCounts.set(folder, folderCount + usage.count);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// Get top icons
|
|
360
|
+
const topIcons = Array.from(iconCounts.entries())
|
|
361
|
+
.sort((a, b) => b[1] - a[1])
|
|
362
|
+
.slice(0, MAX_TOP_ICONS)
|
|
363
|
+
.map(([name, count]) => ({ name, count }));
|
|
364
|
+
return {
|
|
365
|
+
filesScanned: files.length,
|
|
366
|
+
filesWithIcons,
|
|
367
|
+
totalUsages,
|
|
368
|
+
uniqueIcons: iconCounts.size,
|
|
369
|
+
topIcons,
|
|
370
|
+
usageByFolder: Object.fromEntries(folderCounts),
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
export { analyzeFile };
|
|
374
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/engine/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library Detection Engine
|
|
3
|
+
* Detects which icon libraries are used in a project
|
|
4
|
+
*/
|
|
5
|
+
import type { DetectedLibrary } from '../types/index.js';
|
|
6
|
+
interface DetectorOptions {
|
|
7
|
+
root: string;
|
|
8
|
+
include: string[];
|
|
9
|
+
exclude: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Detect icon libraries in a project
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectLibraries(options: DetectorOptions): Promise<DetectedLibrary[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Get supported library definition by name
|
|
17
|
+
*/
|
|
18
|
+
export declare function getSupportedLibrary(name: string): import("../types/index.js").SupportedLibrary | undefined;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/engine/detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,mBAAmB,CAAC;AAG3B,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAOD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkG1F;AAqBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,4DAI/C"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library Detection Engine
|
|
3
|
+
* Detects which icon libraries are used in a project
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import fg from 'fast-glob';
|
|
8
|
+
import { SUPPORTED_LIBRARIES } from '../constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Detect icon libraries in a project
|
|
11
|
+
*/
|
|
12
|
+
export async function detectLibraries(options) {
|
|
13
|
+
const { root, include, exclude } = options;
|
|
14
|
+
const detectedMap = new Map();
|
|
15
|
+
// Initialize map for supported libraries
|
|
16
|
+
for (const lib of SUPPORTED_LIBRARIES) {
|
|
17
|
+
detectedMap.set(lib.name, { evidence: [], files: new Set() });
|
|
18
|
+
for (const alias of lib.aliases) {
|
|
19
|
+
detectedMap.set(alias, { evidence: [], files: new Set() });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Check package.json
|
|
23
|
+
const packageJsonPath = path.join(root, 'package.json');
|
|
24
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
25
|
+
try {
|
|
26
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
27
|
+
const allDeps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
28
|
+
for (const lib of SUPPORTED_LIBRARIES) {
|
|
29
|
+
const allNames = [lib.name, ...lib.aliases];
|
|
30
|
+
for (const name of allNames) {
|
|
31
|
+
if (allDeps[name]) {
|
|
32
|
+
const entry = detectedMap.get(lib.name);
|
|
33
|
+
entry.evidence.push({
|
|
34
|
+
type: 'package-json',
|
|
35
|
+
filePath: packageJsonPath,
|
|
36
|
+
detail: `Found "${name}" in dependencies (${allDeps[name]})`,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Ignore parse errors
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Scan source files for imports
|
|
47
|
+
const files = await fg(include, {
|
|
48
|
+
cwd: root,
|
|
49
|
+
ignore: exclude,
|
|
50
|
+
absolute: false,
|
|
51
|
+
});
|
|
52
|
+
for (const relativeFile of files) {
|
|
53
|
+
const filePath = path.join(root, relativeFile);
|
|
54
|
+
try {
|
|
55
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
56
|
+
for (const lib of SUPPORTED_LIBRARIES) {
|
|
57
|
+
for (const pattern of lib.importPatterns) {
|
|
58
|
+
if (pattern.test(content)) {
|
|
59
|
+
const entry = detectedMap.get(lib.name);
|
|
60
|
+
entry.files.add(relativeFile);
|
|
61
|
+
// Add evidence only if we haven't added too many for this library
|
|
62
|
+
if (entry.evidence.filter((e) => e.type === 'import').length < 3) {
|
|
63
|
+
entry.evidence.push({
|
|
64
|
+
type: 'import',
|
|
65
|
+
filePath: relativeFile,
|
|
66
|
+
detail: `Import pattern matched: ${pattern.source}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Skip files that can't be read
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Build final result
|
|
78
|
+
const results = [];
|
|
79
|
+
for (const lib of SUPPORTED_LIBRARIES) {
|
|
80
|
+
const entry = detectedMap.get(lib.name);
|
|
81
|
+
// Skip if no evidence
|
|
82
|
+
if (entry.evidence.length === 0 && entry.files.size === 0) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const confidence = calculateConfidence(entry.evidence, entry.files.size);
|
|
86
|
+
results.push({
|
|
87
|
+
name: lib.name,
|
|
88
|
+
confidence,
|
|
89
|
+
evidence: entry.evidence,
|
|
90
|
+
fileCount: entry.files.size,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Sort by confidence and file count
|
|
94
|
+
return results.sort((a, b) => {
|
|
95
|
+
const confidenceOrder = { HIGH: 3, MEDIUM: 2, LOW: 1 };
|
|
96
|
+
const aScore = confidenceOrder[a.confidence] * 1000 + a.fileCount;
|
|
97
|
+
const bScore = confidenceOrder[b.confidence] * 1000 + b.fileCount;
|
|
98
|
+
return bScore - aScore;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Calculate confidence level based on evidence
|
|
103
|
+
*/
|
|
104
|
+
function calculateConfidence(evidence, fileCount) {
|
|
105
|
+
const hasPackageJson = evidence.some((e) => e.type === 'package-json');
|
|
106
|
+
const hasImports = evidence.some((e) => e.type === 'import');
|
|
107
|
+
if (hasPackageJson && hasImports && fileCount >= 3) {
|
|
108
|
+
return 'HIGH';
|
|
109
|
+
}
|
|
110
|
+
if ((hasPackageJson && hasImports) || fileCount >= 5) {
|
|
111
|
+
return 'HIGH';
|
|
112
|
+
}
|
|
113
|
+
if (hasPackageJson || fileCount >= 2) {
|
|
114
|
+
return 'MEDIUM';
|
|
115
|
+
}
|
|
116
|
+
return 'LOW';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get supported library definition by name
|
|
120
|
+
*/
|
|
121
|
+
export function getSupportedLibrary(name) {
|
|
122
|
+
return SUPPORTED_LIBRARIES.find((lib) => lib.name === name || lib.aliases.includes(name));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/engine/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon Mapping Engine
|
|
3
|
+
* Resolves source icons to HugeIcons equivalents
|
|
4
|
+
*/
|
|
5
|
+
import type { MappingResult, IconStyle, ScanResult, MigrationPlan, MigrateConfig, IconUsage } from '../types/index.js';
|
|
6
|
+
interface MapperOptions {
|
|
7
|
+
style: IconStyle;
|
|
8
|
+
overrides: Record<string, string>;
|
|
9
|
+
confidenceThreshold: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Generate migration plan from scan result
|
|
13
|
+
*/
|
|
14
|
+
export declare function generatePlan(scanResult: ScanResult, config: MigrateConfig): MigrationPlan;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a single icon mapping
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveMapping(library: string, iconName: string, options: MapperOptions): MappingResult;
|
|
19
|
+
/**
|
|
20
|
+
* Get mapping result for a specific usage
|
|
21
|
+
*/
|
|
22
|
+
export declare function getMappingForUsage(usage: IconUsage, plan: MigrationPlan): MappingResult | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Check if plan is ready to apply (no unmapped/ambiguous)
|
|
25
|
+
*/
|
|
26
|
+
export declare function isPlanReady(plan: MigrationPlan, strict: boolean): {
|
|
27
|
+
ready: boolean;
|
|
28
|
+
issues: string[];
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/engine/mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,aAAa,EAGb,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,SAAS,EACV,MAAM,mBAAmB,CAAC;AAW3B,UAAU,aAAa;IACrB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,aAAa,GACpB,aAAa,CAoDf;AAuCD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,aAAa,CA6Df;AAgFD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,aAAa,GAClB,aAAa,GAAG,SAAS,CAI3B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CActG"}
|