@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.
Files changed (38) hide show
  1. package/dist/constants.d.ts +40 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/dist/constants.js +117 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/data/hugeicons-map.json +41786 -0
  6. package/dist/data/mappings.d.ts +69 -0
  7. package/dist/data/mappings.d.ts.map +1 -0
  8. package/dist/data/mappings.js +402 -0
  9. package/dist/data/mappings.js.map +1 -0
  10. package/dist/engine/analyzer.d.ts +21 -0
  11. package/dist/engine/analyzer.d.ts.map +1 -0
  12. package/dist/engine/analyzer.js +374 -0
  13. package/dist/engine/analyzer.js.map +1 -0
  14. package/dist/engine/detector.d.ts +20 -0
  15. package/dist/engine/detector.d.ts.map +1 -0
  16. package/dist/engine/detector.js +124 -0
  17. package/dist/engine/detector.js.map +1 -0
  18. package/dist/engine/mapper.d.ts +31 -0
  19. package/dist/engine/mapper.d.ts.map +1 -0
  20. package/dist/engine/mapper.js +234 -0
  21. package/dist/engine/mapper.js.map +1 -0
  22. package/dist/engine/reporter.d.ts +11 -0
  23. package/dist/engine/reporter.d.ts.map +1 -0
  24. package/dist/engine/reporter.js +339 -0
  25. package/dist/engine/reporter.js.map +1 -0
  26. package/dist/engine/transformer.d.ts +26 -0
  27. package/dist/engine/transformer.d.ts.map +1 -0
  28. package/dist/engine/transformer.js +874 -0
  29. package/dist/engine/transformer.js.map +1 -0
  30. package/dist/index.d.ts +22 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +56 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/types/index.d.ts +292 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/dist/types/index.js +14 -0
  37. package/dist/types/index.js.map +1 -0
  38. 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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,WAAW,CAAC;AAM3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAatD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiE,CAAC;IAE7F,yCAAyC;IACzC,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,WAAW,GAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;YAEhF,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;wBACzC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAClB,IAAI,EAAE,cAAc;4BACpB,QAAQ,EAAE,eAAe;4BACzB,MAAM,EAAE,UAAU,IAAI,sBAAsB,OAAO,CAAC,IAAI,CAAC,GAAG;yBAC7D,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE;QAC9B,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEnD,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;gBACtC,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBACzC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;wBACzC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;wBAC9B,kEAAkE;wBAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACjE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gCAClB,IAAI,EAAE,QAAQ;gCACd,QAAQ,EAAE,YAAY;gCACtB,MAAM,EAAE,2BAA2B,OAAO,CAAC,MAAM,EAAE;6BACpD,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAEzC,sBAAsB;QACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzE,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU;YACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,oCAAoC;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC;QAClE,OAAO,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,QAA6B,EAAE,SAAiB;IAC3E,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAE7D,IAAI,cAAc,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,cAAc,IAAI,UAAU,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,cAAc,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,mBAAmB,CAAC,IAAI,CAC7B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CACzD,CAAC;AACJ,CAAC"}
@@ -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"}