@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.
- package/README.md +282 -0
- package/dist/commands/apply.d.ts +27 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +504 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/plan.d.ts +20 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +100 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/revert.d.ts +13 -0
- package/dist/commands/revert.d.ts.map +1 -0
- package/dist/commands/revert.js +195 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/commands/scan.d.ts +16 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +71 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +744 -0
- package/dist/main.js.map +1 -0
- package/dist/utils/html-report.d.ts +22 -0
- package/dist/utils/html-report.d.ts.map +1 -0
- package/dist/utils/html-report.js +628 -0
- package/dist/utils/html-report.js.map +1 -0
- package/package.json +68 -0
|
@@ -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
|