@hugeicons/migrate 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.
@@ -0,0 +1,504 @@
1
+ /**
2
+ * Apply Command
3
+ * Apply migration transformations to source files
4
+ */
5
+ import * as fs from 'node:fs';
6
+ import * as path from 'node:path';
7
+ import { execSync } from 'node:child_process';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import { select, input } from '@inquirer/prompts';
11
+ import { scanProject, generatePlan, applyPlan, loadConfig, formatApplyReport, isPlanReady, checkGitStatus, TOOL_NAME, VERSION, getIconPackage, HUGEICONS_REACT_PACKAGE, } from '@hugeicons/migrate-core';
12
+ import { generateHtmlReport, saveAndOpenReport } from '../utils/html-report.js';
13
+ /**
14
+ * Detect all package managers used in the project
15
+ */
16
+ function detectAllPackageManagers(projectRoot) {
17
+ const detected = [];
18
+ if (fs.existsSync(path.join(projectRoot, 'bun.lockb')) || fs.existsSync(path.join(projectRoot, 'bun.lock'))) {
19
+ detected.push({ name: 'bun', lockFile: 'bun.lockb' });
20
+ }
21
+ if (fs.existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) {
22
+ detected.push({ name: 'pnpm', lockFile: 'pnpm-lock.yaml' });
23
+ }
24
+ if (fs.existsSync(path.join(projectRoot, 'yarn.lock'))) {
25
+ detected.push({ name: 'yarn', lockFile: 'yarn.lock' });
26
+ }
27
+ if (fs.existsSync(path.join(projectRoot, 'package-lock.json'))) {
28
+ detected.push({ name: 'npm', lockFile: 'package-lock.json' });
29
+ }
30
+ // If no lock file found, default to npm
31
+ if (detected.length === 0) {
32
+ detected.push({ name: 'npm', lockFile: 'none' });
33
+ }
34
+ return detected;
35
+ }
36
+ /**
37
+ * Let user choose package manager if multiple detected
38
+ */
39
+ async function choosePackageManager(projectRoot, skipPrompts) {
40
+ const detected = detectAllPackageManagers(projectRoot);
41
+ if (detected.length === 1) {
42
+ return detected[0].name;
43
+ }
44
+ if (skipPrompts) {
45
+ // Priority: pnpm > yarn > bun > npm
46
+ const priority = ['pnpm', 'yarn', 'bun', 'npm'];
47
+ for (const pm of priority) {
48
+ if (detected.some(d => d.name === pm)) {
49
+ return pm;
50
+ }
51
+ }
52
+ return detected[0].name;
53
+ }
54
+ const choice = await select({
55
+ message: 'Multiple package managers detected. Which one would you like to use?',
56
+ choices: detected.map(d => ({
57
+ name: `${d.name} (${d.lockFile})`,
58
+ value: d.name,
59
+ })),
60
+ });
61
+ return choice;
62
+ }
63
+ /**
64
+ * Check if a package is already installed
65
+ */
66
+ function isPackageInstalled(projectRoot, packageName) {
67
+ const packageJsonPath = path.join(projectRoot, 'package.json');
68
+ if (!fs.existsSync(packageJsonPath))
69
+ return false;
70
+ try {
71
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
72
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
73
+ return packageName in deps;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ /**
80
+ * Check if it's a React project
81
+ */
82
+ function isReactProject(projectRoot) {
83
+ const packageJsonPath = path.join(projectRoot, 'package.json');
84
+ if (!fs.existsSync(packageJsonPath))
85
+ return false;
86
+ try {
87
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
88
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
89
+ return 'react' in deps;
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ }
95
+ /**
96
+ * Check if Hugeicons Pro license is configured
97
+ */
98
+ function hasProLicenseConfigured(projectRoot) {
99
+ // Check .npmrc
100
+ const npmrcPath = path.join(projectRoot, '.npmrc');
101
+ if (fs.existsSync(npmrcPath)) {
102
+ const content = fs.readFileSync(npmrcPath, 'utf-8');
103
+ if (content.includes('@hugeicons-pro:registry') || content.includes('//npm.hugeicons.com')) {
104
+ return true;
105
+ }
106
+ }
107
+ // Check .yarnrc.yml
108
+ const yarnrcPath = path.join(projectRoot, '.yarnrc.yml');
109
+ if (fs.existsSync(yarnrcPath)) {
110
+ const content = fs.readFileSync(yarnrcPath, 'utf-8');
111
+ if (content.includes('hugeicons-pro') && content.includes('npm.hugeicons.com')) {
112
+ return true;
113
+ }
114
+ }
115
+ return false;
116
+ }
117
+ /**
118
+ * Save Pro license to appropriate config file
119
+ */
120
+ function saveProLicense(projectRoot, license, packageManager) {
121
+ // Check if yarn berry
122
+ const isYarnBerry = fs.existsSync(path.join(projectRoot, '.yarnrc.yml')) ||
123
+ (packageManager === 'yarn' && fs.existsSync(path.join(projectRoot, '.yarn')));
124
+ if (isYarnBerry) {
125
+ return saveYarnLicense(projectRoot, license);
126
+ }
127
+ return saveNpmrcLicense(projectRoot, license, packageManager);
128
+ }
129
+ function saveNpmrcLicense(projectRoot, license, packageManager) {
130
+ const npmrcPath = path.join(projectRoot, '.npmrc');
131
+ let content = '';
132
+ if (fs.existsSync(npmrcPath)) {
133
+ content = fs.readFileSync(npmrcPath, 'utf-8');
134
+ content = content
135
+ .split('\n')
136
+ .filter(line => !line.includes('@hugeicons-pro:registry') && !line.includes('//npm.hugeicons.com'))
137
+ .join('\n')
138
+ .trim();
139
+ if (content)
140
+ content += '\n\n';
141
+ }
142
+ content += `# Hugeicons Pro License\n`;
143
+ content += `@hugeicons-pro:registry=https://npm.hugeicons.com/\n`;
144
+ content += `//npm.hugeicons.com/:_authToken=${license}\n`;
145
+ fs.writeFileSync(npmrcPath, content, 'utf-8');
146
+ return `.npmrc (${packageManager})`;
147
+ }
148
+ function saveYarnLicense(projectRoot, license) {
149
+ const yarnrcPath = path.join(projectRoot, '.yarnrc.yml');
150
+ let content = '';
151
+ if (fs.existsSync(yarnrcPath)) {
152
+ content = fs.readFileSync(yarnrcPath, 'utf-8');
153
+ const lines = content.split('\n');
154
+ const filteredLines = [];
155
+ let skipSection = false;
156
+ for (const line of lines) {
157
+ if (line.match(/^\s*hugeicons-pro:/)) {
158
+ skipSection = true;
159
+ continue;
160
+ }
161
+ if (skipSection && (line.match(/^[a-zA-Z]/) || line.match(/^\s{2}[a-zA-Z]/))) {
162
+ skipSection = false;
163
+ }
164
+ if (!skipSection) {
165
+ filteredLines.push(line);
166
+ }
167
+ }
168
+ content = filteredLines.join('\n').trim();
169
+ if (content)
170
+ content += '\n\n';
171
+ }
172
+ if (!content.includes('npmScopes:')) {
173
+ content += `npmScopes:\n`;
174
+ }
175
+ content += ` hugeicons-pro:\n`;
176
+ content += ` npmAlwaysAuth: true\n`;
177
+ content += ` npmAuthToken: ${license}\n`;
178
+ content += ` npmRegistryServer: "https://npm.hugeicons.com/"\n`;
179
+ fs.writeFileSync(yarnrcPath, content, 'utf-8');
180
+ return '.yarnrc.yml (yarn)';
181
+ }
182
+ /**
183
+ * Get install command for a package manager
184
+ */
185
+ function getInstallCommand(packageManager, packages) {
186
+ const packagesStr = packages.join(' ');
187
+ switch (packageManager) {
188
+ case 'pnpm':
189
+ return `pnpm add ${packagesStr}`;
190
+ case 'yarn':
191
+ return `yarn add ${packagesStr}`;
192
+ case 'bun':
193
+ return `bun add ${packagesStr}`;
194
+ default:
195
+ return `npm install ${packagesStr}`;
196
+ }
197
+ }
198
+ /**
199
+ * Install packages using the detected package manager
200
+ */
201
+ async function installPackages(projectRoot, packages, packageManager, isProStyle, skipPrompts) {
202
+ if (packages.length === 0)
203
+ return { status: 'installed' };
204
+ const installCmd = getInstallCommand(packageManager, packages);
205
+ // Check if Pro license is needed
206
+ if (isProStyle && !hasProLicenseConfigured(projectRoot)) {
207
+ console.log('');
208
+ console.log(chalk.yellow(' Pro packages require a Hugeicons license.'));
209
+ console.log(chalk.gray(' Get your license at: https://hugeicons.com/pricing'));
210
+ console.log('');
211
+ if (skipPrompts) {
212
+ console.log(chalk.red(' Cannot install Pro packages without license configuration.'));
213
+ console.log(chalk.gray(' Please add your license to .npmrc manually.'));
214
+ console.log('');
215
+ console.log(chalk.yellow(' Please install manually:'));
216
+ console.log(chalk.cyan(` ${installCmd}`));
217
+ return { status: 'skipped', installCommand: installCmd };
218
+ }
219
+ const hasLicense = await select({
220
+ message: 'Do you have a Hugeicons Pro license?',
221
+ choices: [
222
+ { name: 'Yes, I have a license', value: 'yes' },
223
+ { name: 'No, skip package installation', value: 'no' },
224
+ ],
225
+ });
226
+ if (hasLicense === 'no') {
227
+ console.log('');
228
+ console.log(chalk.gray(' Skipping package installation. You can install manually later.'));
229
+ console.log(chalk.gray(' Visit https://hugeicons.com/pricing to get a license.'));
230
+ console.log('');
231
+ console.log(chalk.yellow(' Please install manually:'));
232
+ console.log(chalk.cyan(` ${installCmd}`));
233
+ return { status: 'skipped', installCommand: installCmd };
234
+ }
235
+ const license = await input({
236
+ message: 'Enter your license key:',
237
+ validate: (value) => {
238
+ if (!value.trim())
239
+ return 'Please enter a license key';
240
+ if (value.trim().length < 10)
241
+ return 'Invalid license key format';
242
+ return true;
243
+ },
244
+ });
245
+ const configFile = saveProLicense(projectRoot, license.trim(), packageManager);
246
+ console.log('');
247
+ console.log(chalk.green(' ✓') + chalk.white(` License saved to ${configFile}`));
248
+ }
249
+ console.log('');
250
+ console.log(chalk.bold('Installing Hugeicons packages...'));
251
+ console.log(chalk.gray(` $ ${installCmd}`));
252
+ console.log('');
253
+ const spinner = ora('Installing packages...').start();
254
+ try {
255
+ execSync(installCmd, {
256
+ cwd: projectRoot,
257
+ stdio: 'pipe',
258
+ timeout: 120000, // 2 minute timeout
259
+ env: { ...process.env, FORCE_COLOR: '0' },
260
+ });
261
+ spinner.succeed('Packages installed successfully');
262
+ return { status: 'installed' };
263
+ }
264
+ catch (error) {
265
+ spinner.fail('Failed to install packages automatically');
266
+ console.log('');
267
+ // Show actual error message
268
+ if (error && typeof error === 'object') {
269
+ const err = error;
270
+ const stderr = err.stderr?.toString?.()?.trim();
271
+ const stdout = err.stdout?.toString?.()?.trim();
272
+ if (stderr) {
273
+ console.log(chalk.gray(` ${stderr.split('\n').slice(0, 3).join('\n ')}`));
274
+ console.log('');
275
+ }
276
+ else if (stdout) {
277
+ console.log(chalk.gray(` ${stdout.split('\n').slice(0, 3).join('\n ')}`));
278
+ console.log('');
279
+ }
280
+ }
281
+ console.log(chalk.yellow(' Please install manually:'));
282
+ console.log(chalk.cyan(` ${installCmd}`));
283
+ return { status: 'failed', installCommand: installCmd };
284
+ }
285
+ }
286
+ export async function applyCommand(options) {
287
+ const { root, report, output, strict } = options;
288
+ const dryRun = !options.write || options.dryRun;
289
+ // Resolve root path
290
+ const projectRoot = path.resolve(root);
291
+ // Show header for text output
292
+ if (report === 'text') {
293
+ console.log(chalk.bold.cyan(`${TOOL_NAME} v${VERSION}`));
294
+ console.log('');
295
+ console.log(chalk.bold(`Apply (${dryRun ? 'dry-run' : 'write mode'})`));
296
+ console.log('');
297
+ }
298
+ // Load config
299
+ const config = loadConfig(options.config, projectRoot);
300
+ // Override config with CLI options
301
+ config.style = options.style || config.style;
302
+ // Merge CLI options with config
303
+ const include = options.include.length > 0 ? options.include : config.include;
304
+ const exclude = options.exclude.length > 0 ? options.exclude : config.exclude;
305
+ // Preflight checks
306
+ if (report === 'text') {
307
+ console.log(chalk.bold('Preflight'));
308
+ }
309
+ // Check git status if not disabled
310
+ if (options.gitCheck !== false) {
311
+ const gitStatus = checkGitStatus(projectRoot);
312
+ if (gitStatus.isRepo) {
313
+ if (report === 'text') {
314
+ console.log(chalk.green('✓') + ' Git repo detected');
315
+ }
316
+ if (gitStatus.isDirty) {
317
+ const msg = `Working tree not clean (${gitStatus.modifiedFiles.length} modified files)`;
318
+ if (strict) {
319
+ console.log(chalk.red('✗') + ` ${msg}`);
320
+ console.log(chalk.red(' Commit or stash changes before migration, or use --no-git-check'));
321
+ return;
322
+ }
323
+ else {
324
+ console.log(chalk.yellow('⚠') + ` ${msg}`);
325
+ }
326
+ }
327
+ }
328
+ else {
329
+ if (report === 'text') {
330
+ console.log(chalk.yellow('⚠') + ' Not a git repository');
331
+ }
332
+ }
333
+ }
334
+ const spinner = report === 'text' ? ora('Analyzing project...').start() : null;
335
+ try {
336
+ // Scan the project
337
+ const scanResult = await scanProject({
338
+ root: projectRoot,
339
+ include,
340
+ exclude,
341
+ });
342
+ if (spinner) {
343
+ spinner.text = 'Generating migration plan...';
344
+ }
345
+ // Generate plan
346
+ const plan = generatePlan(scanResult, config);
347
+ // Check readiness
348
+ const { ready, issues } = isPlanReady(plan, strict);
349
+ if (!ready) {
350
+ if (spinner) {
351
+ spinner.fail('Migration blocked');
352
+ }
353
+ console.log('');
354
+ console.log(chalk.yellow('Cannot apply migration:'));
355
+ for (const issue of issues) {
356
+ console.log(chalk.yellow(` - ${issue}`));
357
+ }
358
+ console.log('');
359
+ console.log(chalk.dim('Add custom mappings in hugeicons.migrate.json to resolve unmapped icons.'));
360
+ return;
361
+ }
362
+ // For write mode, install packages BEFORE making changes
363
+ let packageManager = null;
364
+ let pendingInstallCommand;
365
+ if (!dryRun) {
366
+ if (spinner) {
367
+ spinner.stop();
368
+ }
369
+ // Detect and choose package manager
370
+ packageManager = await choosePackageManager(projectRoot, options.yes);
371
+ const style = options.style || 'stroke';
372
+ const iconPackage = getIconPackage(style);
373
+ const isProStyle = iconPackage.startsWith('@hugeicons-pro/');
374
+ // Determine which packages need to be installed
375
+ const packagesToInstall = [];
376
+ // Always need @hugeicons/react for React projects
377
+ if (isReactProject(projectRoot) && !isPackageInstalled(projectRoot, HUGEICONS_REACT_PACKAGE)) {
378
+ packagesToInstall.push(HUGEICONS_REACT_PACKAGE);
379
+ }
380
+ // Add the icon package
381
+ if (!isPackageInstalled(projectRoot, iconPackage)) {
382
+ packagesToInstall.push(iconPackage);
383
+ }
384
+ if (packagesToInstall.length > 0) {
385
+ const installResult = await installPackages(projectRoot, packagesToInstall, packageManager, isProStyle, options.yes);
386
+ if (installResult.status === 'skipped' && isProStyle) {
387
+ // Can't proceed without Pro license for Pro styles
388
+ console.log('');
389
+ console.log(chalk.yellow('Migration cancelled. Please configure your Pro license and try again.'));
390
+ return;
391
+ }
392
+ // Track if installation failed so we can show it in HTML report
393
+ if (installResult.status === 'failed' || installResult.status === 'skipped') {
394
+ pendingInstallCommand = installResult.installCommand;
395
+ }
396
+ }
397
+ else {
398
+ console.log('');
399
+ console.log(chalk.green(' ✓') + chalk.white(' Hugeicons packages already installed'));
400
+ }
401
+ console.log('');
402
+ if (spinner) {
403
+ spinner.start('Applying transformations...');
404
+ }
405
+ }
406
+ if (spinner) {
407
+ spinner.text = dryRun ? 'Calculating changes...' : 'Applying transformations...';
408
+ }
409
+ // Apply transformations
410
+ const result = await applyPlan(scanResult, plan, {
411
+ root: projectRoot,
412
+ dryRun,
413
+ backup: options.backup,
414
+ patch: options.patch,
415
+ });
416
+ if (spinner) {
417
+ if (result.summary.errors > 0) {
418
+ spinner.warn(`Completed with ${result.summary.errors} error(s)`);
419
+ }
420
+ else {
421
+ spinner.succeed(dryRun ? 'Dry run complete' : 'Migration applied');
422
+ }
423
+ }
424
+ // Format report
425
+ const reportContent = formatApplyReport(result, projectRoot, report);
426
+ // Output report
427
+ if (output) {
428
+ fs.writeFileSync(output, reportContent, 'utf-8');
429
+ if (report === 'text') {
430
+ console.log(chalk.dim(`Report saved to: ${output}`));
431
+ }
432
+ }
433
+ else {
434
+ console.log('');
435
+ console.log(reportContent);
436
+ }
437
+ // Save patch if requested
438
+ if (options.patch && result.patch) {
439
+ const patchPath = path.join(projectRoot, 'hugeicons-migrate.patch');
440
+ fs.writeFileSync(patchPath, result.patch, 'utf-8');
441
+ if (report === 'text') {
442
+ console.log('');
443
+ console.log(chalk.dim(`Patch saved to: ${patchPath}`));
444
+ }
445
+ }
446
+ // Show next steps for dry run
447
+ if (dryRun && report === 'text') {
448
+ console.log('');
449
+ console.log(chalk.bold('Next steps:'));
450
+ console.log(' Run with ' + chalk.cyan('--write') + ' to apply changes');
451
+ if (!options.backup) {
452
+ console.log(' Add ' + chalk.cyan('--backup') + ' to create a backup before writing');
453
+ }
454
+ }
455
+ // Show message if no files were modified
456
+ if (!dryRun && result.summary.filesModified === 0) {
457
+ console.log('');
458
+ console.log(chalk.yellow(' No files were modified.'));
459
+ console.log(chalk.gray(' Your project may already be using Hugeicons, or no icon imports were found.'));
460
+ }
461
+ // Generate HTML report if requested
462
+ if (options.htmlReport && result.summary.filesModified > 0) {
463
+ // Get the source library name(s) from scan result
464
+ const sourceLibrary = scanResult.detectedLibraries
465
+ .map(lib => lib.name)
466
+ .join(', ') || undefined;
467
+ const html = generateHtmlReport(result, {
468
+ projectRoot,
469
+ style: options.style,
470
+ dryRun,
471
+ sourceLibrary,
472
+ pendingInstallCommand,
473
+ });
474
+ const reportPath = await saveAndOpenReport(html, projectRoot, true);
475
+ console.log('');
476
+ console.log(chalk.green(' ✓') + chalk.white(` HTML report saved: ${chalk.cyan(reportPath)}`));
477
+ // Wait a moment for the browser to open before exiting
478
+ await new Promise(resolve => setTimeout(resolve, 500));
479
+ }
480
+ // Show thanks message and exit for write mode (not dry-run)
481
+ if (!dryRun) {
482
+ if (result.summary.filesModified > 0) {
483
+ console.log('');
484
+ console.log(chalk.green('━'.repeat(50)));
485
+ console.log('');
486
+ console.log(chalk.bold(' Thank you for using Hugeicons! 🎉'));
487
+ console.log('');
488
+ console.log(chalk.gray(' Your migration is complete. If you have any questions'));
489
+ console.log(chalk.gray(' or feedback, visit ') + chalk.cyan('https://hugeicons.com'));
490
+ console.log('');
491
+ console.log(chalk.green('━'.repeat(50)));
492
+ console.log('');
493
+ }
494
+ process.exit(0);
495
+ }
496
+ }
497
+ catch (error) {
498
+ if (spinner) {
499
+ spinner.fail('Apply failed');
500
+ }
501
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
502
+ }
503
+ }
504
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/commands/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Plan Command
3
+ * Generate migration plan with icon mappings
4
+ */
5
+ interface PlanOptions {
6
+ root: string;
7
+ include: string[];
8
+ exclude: string[];
9
+ config?: string;
10
+ report: 'text' | 'json' | 'md';
11
+ output?: string;
12
+ verbose: boolean;
13
+ strict: boolean;
14
+ style: string;
15
+ confidence: string;
16
+ interactive: boolean;
17
+ }
18
+ export declare function planCommand(options: PlanOptions): Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2GrE"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Plan Command
3
+ * Generate migration plan with icon mappings
4
+ */
5
+ import * as fs from 'node:fs';
6
+ import * as path from 'node:path';
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import { scanProject, generatePlan, loadConfig, formatPlanReport, isPlanReady, TOOL_NAME, VERSION, } from '@hugeicons/migrate-core';
10
+ export async function planCommand(options) {
11
+ const { root, report, output, verbose, strict } = options;
12
+ // Resolve root path
13
+ const projectRoot = path.resolve(root);
14
+ // Show header for text output
15
+ if (report === 'text') {
16
+ console.log(chalk.bold.cyan(`${TOOL_NAME} v${VERSION}`));
17
+ console.log('');
18
+ }
19
+ // Load config
20
+ const config = loadConfig(options.config, projectRoot);
21
+ // Override config with CLI options
22
+ config.style = options.style || config.style;
23
+ // Merge CLI options with config
24
+ const include = options.include.length > 0 ? options.include : config.include;
25
+ const exclude = options.exclude.length > 0 ? options.exclude : config.exclude;
26
+ // Create spinner for text output
27
+ const spinner = report === 'text' ? ora('Analyzing project...').start() : null;
28
+ try {
29
+ // First, scan the project
30
+ const scanResult = await scanProject({
31
+ root: projectRoot,
32
+ include,
33
+ exclude,
34
+ });
35
+ if (spinner) {
36
+ spinner.text = 'Generating migration plan...';
37
+ }
38
+ // Generate plan
39
+ const plan = generatePlan(scanResult, config);
40
+ // Stop spinner
41
+ if (spinner) {
42
+ spinner.succeed('Migration plan generated');
43
+ }
44
+ // Format report
45
+ const reportContent = formatPlanReport(plan, projectRoot, report);
46
+ // Output report
47
+ if (output) {
48
+ fs.writeFileSync(output, reportContent, 'utf-8');
49
+ if (report === 'text') {
50
+ console.log(chalk.dim(`Plan saved to: ${output}`));
51
+ }
52
+ }
53
+ else {
54
+ console.log(reportContent);
55
+ }
56
+ // Verbose output: show unmapped icons details
57
+ if (verbose && report === 'text') {
58
+ const unmapped = plan.mappings.filter((mapping) => mapping.status === 'unmapped');
59
+ if (unmapped.length > 0) {
60
+ console.log('');
61
+ console.log(chalk.bold('Unmapped icon details:'));
62
+ for (const m of unmapped) {
63
+ console.log(chalk.dim(` - ${m.source.icon} (${m.source.library})`));
64
+ if (m.notes) {
65
+ for (const note of m.notes) {
66
+ console.log(chalk.dim(` ${note}`));
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ // Check readiness
73
+ const { ready, issues } = isPlanReady(plan, strict);
74
+ if (!ready && strict) {
75
+ console.log('');
76
+ console.log(chalk.yellow('Plan is not ready:'));
77
+ for (const issue of issues) {
78
+ console.log(chalk.yellow(` - ${issue}`));
79
+ }
80
+ return;
81
+ }
82
+ if (issues.length > 0 && report === 'text') {
83
+ console.log('');
84
+ console.log(chalk.yellow('Recommendations:'));
85
+ if (plan.summary.unmapped > 0) {
86
+ console.log(chalk.yellow(` - Add mappings for ${plan.summary.unmapped} unmapped icon(s) in hugeicons.migrate.json`));
87
+ }
88
+ if (plan.summary.ambiguous > 0) {
89
+ console.log(chalk.yellow(` - Resolve ${plan.summary.ambiguous} ambiguous mapping(s)`));
90
+ }
91
+ }
92
+ }
93
+ catch (error) {
94
+ if (spinner) {
95
+ spinner.fail('Plan generation failed');
96
+ }
97
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
98
+ }
99
+ }
100
+ //# sourceMappingURL=plan.js.map