uilint 0.2.42 → 0.2.44

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,587 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ loadSelectedRules
4
+ } from "./chunk-Y7ZNZFVZ.js";
5
+ import {
6
+ getInstalledRuleVersions,
7
+ updateManifestRule
8
+ } from "./chunk-ZDSDZNIB.js";
9
+ import {
10
+ confirm,
11
+ intro,
12
+ logError,
13
+ logInfo,
14
+ logSuccess,
15
+ logWarning,
16
+ note,
17
+ outro
18
+ } from "./chunk-CZNPG4UI.js";
19
+ import {
20
+ detectPackageManager,
21
+ getInstalledUilintPackages,
22
+ updatePackages
23
+ } from "./chunk-JPE27ROY.js";
24
+
25
+ // src/commands/update/analyze.ts
26
+ import { basename } from "path";
27
+ import { getRuleMetadata as getRuleMetadata2 } from "uilint-eslint";
28
+ import { findWorkspaceRoot } from "uilint-core/node";
29
+
30
+ // src/utils/migration-engine.ts
31
+ import { getRuleMetadata } from "uilint-eslint";
32
+ function findMigrationPath(from, to, migrations) {
33
+ if (from === to) {
34
+ return [];
35
+ }
36
+ if (migrations.length === 0) {
37
+ return [];
38
+ }
39
+ const migrationMap = /* @__PURE__ */ new Map();
40
+ for (const migration of migrations) {
41
+ const existing = migrationMap.get(migration.from) ?? [];
42
+ existing.push(migration);
43
+ migrationMap.set(migration.from, existing);
44
+ }
45
+ const visited = /* @__PURE__ */ new Set();
46
+ const queue = [
47
+ { version: from, path: [] }
48
+ ];
49
+ while (queue.length > 0) {
50
+ const current = queue.shift();
51
+ if (visited.has(current.version)) {
52
+ continue;
53
+ }
54
+ visited.add(current.version);
55
+ const outgoing = migrationMap.get(current.version) ?? [];
56
+ for (const migration of outgoing) {
57
+ const newPath = [...current.path, migration];
58
+ if (migration.to === to) {
59
+ return newPath;
60
+ }
61
+ if (!visited.has(migration.to)) {
62
+ queue.push({ version: migration.to, path: newPath });
63
+ }
64
+ }
65
+ }
66
+ return [];
67
+ }
68
+ function getMigrationsForRule(ruleId) {
69
+ const ruleMeta = getRuleMetadata(ruleId);
70
+ if (!ruleMeta) {
71
+ return [];
72
+ }
73
+ return ruleMeta.migrations ?? [];
74
+ }
75
+ function hasBreakingMigrations(migrations) {
76
+ return migrations.some((m) => m.breaking === true);
77
+ }
78
+
79
+ // src/commands/update/analyze.ts
80
+ function isNewerVersion(installed, available) {
81
+ const installedParts = installed.split(".").map(Number);
82
+ const availableParts = available.split(".").map(Number);
83
+ for (let i = 0; i < 3; i++) {
84
+ const a = availableParts[i] ?? 0;
85
+ const b = installedParts[i] ?? 0;
86
+ if (a > b) return true;
87
+ if (a < b) return false;
88
+ }
89
+ return false;
90
+ }
91
+ function analyzeRule(ruleId, installedVersion) {
92
+ const ruleMeta = getRuleMetadata2(ruleId);
93
+ if (!ruleMeta) {
94
+ return null;
95
+ }
96
+ const availableVersion = ruleMeta.version ?? "1.0.0";
97
+ const hasUpdate = isNewerVersion(installedVersion, availableVersion);
98
+ const migrations = hasUpdate ? findMigrationPath(
99
+ installedVersion,
100
+ availableVersion,
101
+ getMigrationsForRule(ruleId)
102
+ ) : [];
103
+ return {
104
+ ruleId,
105
+ installedVersion,
106
+ availableVersion,
107
+ hasUpdate,
108
+ migrations,
109
+ hasBreakingChanges: hasBreakingMigrations(migrations)
110
+ };
111
+ }
112
+ function analyzePackage(packagePath) {
113
+ const installedVersions = getInstalledRuleVersions(packagePath);
114
+ const rules = [];
115
+ for (const [ruleId, version] of Object.entries(installedVersions)) {
116
+ const ruleInfo = analyzeRule(ruleId, version);
117
+ if (ruleInfo) {
118
+ rules.push(ruleInfo);
119
+ }
120
+ }
121
+ const updatableRules = rules.filter((r) => r.hasUpdate);
122
+ const installedPackagesMap = getInstalledUilintPackages(packagePath);
123
+ const installedPackages = [];
124
+ for (const [name, version] of installedPackagesMap) {
125
+ installedPackages.push({ name, installedVersion: version });
126
+ }
127
+ return {
128
+ packagePath,
129
+ displayName: basename(packagePath) || packagePath,
130
+ eslintConfigPath: null,
131
+ // TODO: detect ESLint config
132
+ packageManager: detectPackageManager(packagePath),
133
+ installedPackages,
134
+ rules,
135
+ updatableCount: updatableRules.length,
136
+ hasBreakingChanges: updatableRules.some((r) => r.hasBreakingChanges)
137
+ };
138
+ }
139
+ function analyzeForUpdates(projectPath) {
140
+ const workspaceRoot = findWorkspaceRoot(projectPath);
141
+ const packageManager = detectPackageManager(projectPath);
142
+ const packageInfo = analyzePackage(projectPath);
143
+ const packages = [packageInfo];
144
+ const totalUpdates = packages.reduce((sum, p) => sum + p.updatableCount, 0);
145
+ const hasBreakingChanges = packages.some((p) => p.hasBreakingChanges);
146
+ return {
147
+ workspaceRoot,
148
+ packageManager,
149
+ packages,
150
+ totalUpdates,
151
+ hasBreakingChanges
152
+ };
153
+ }
154
+ function formatUpdateSummary(analysis) {
155
+ const hasRuleUpdates = analysis.totalUpdates > 0;
156
+ const hasPackages = analysis.packages.some(
157
+ (p) => p.installedPackages.length > 0
158
+ );
159
+ if (!hasRuleUpdates && !hasPackages) {
160
+ return "No uilint packages or rules found.";
161
+ }
162
+ const lines = [];
163
+ for (const pkg of analysis.packages) {
164
+ const hasUpdates = pkg.updatableCount > 0 || pkg.installedPackages.length > 0;
165
+ if (!hasUpdates) continue;
166
+ lines.push(`${pkg.displayName}:`);
167
+ if (pkg.installedPackages.length > 0) {
168
+ lines.push(" npm packages:");
169
+ for (const npmPkg of pkg.installedPackages) {
170
+ lines.push(` ${npmPkg.name}: ${npmPkg.installedVersion} \u2192 latest`);
171
+ }
172
+ }
173
+ if (pkg.updatableCount > 0) {
174
+ lines.push(" rules:");
175
+ for (const rule of pkg.rules) {
176
+ if (!rule.hasUpdate) continue;
177
+ const breaking = rule.hasBreakingChanges ? " (BREAKING)" : "";
178
+ lines.push(
179
+ ` ${rule.ruleId}: ${rule.installedVersion} \u2192 ${rule.availableVersion}${breaking}`
180
+ );
181
+ }
182
+ }
183
+ lines.push("");
184
+ }
185
+ if (analysis.hasBreakingChanges) {
186
+ lines.push("\u26A0\uFE0F Some rule updates contain breaking changes.");
187
+ }
188
+ return lines.join("\n");
189
+ }
190
+
191
+ // src/commands/update/plan.ts
192
+ function createUpdatePlan(analysis, choices) {
193
+ const actions = [];
194
+ const rules = [];
195
+ for (const pkg of analysis.packages) {
196
+ if (!choices.packagePaths.includes(pkg.packagePath)) {
197
+ continue;
198
+ }
199
+ if (pkg.installedPackages.length > 0) {
200
+ actions.push({
201
+ type: "update_npm_packages",
202
+ packagePath: pkg.packagePath,
203
+ packageManager: pkg.packageManager,
204
+ packages: pkg.installedPackages.map((p) => p.name)
205
+ });
206
+ }
207
+ for (const rule of pkg.rules) {
208
+ if (!rule.hasUpdate) {
209
+ continue;
210
+ }
211
+ if (choices.ruleIds.length > 0 && !choices.ruleIds.includes(rule.ruleId)) {
212
+ continue;
213
+ }
214
+ rules.push(rule);
215
+ actions.push({
216
+ type: "copy_rule_files",
217
+ packagePath: pkg.packagePath,
218
+ ruleId: rule.ruleId,
219
+ version: rule.availableVersion
220
+ });
221
+ if (rule.migrations.length > 0 && pkg.eslintConfigPath) {
222
+ actions.push({
223
+ type: "migrate_rule_options",
224
+ configPath: pkg.eslintConfigPath,
225
+ ruleId: rule.ruleId,
226
+ migrations: rule.migrations
227
+ });
228
+ }
229
+ actions.push({
230
+ type: "update_manifest_version",
231
+ packagePath: pkg.packagePath,
232
+ ruleId: rule.ruleId,
233
+ version: rule.availableVersion
234
+ });
235
+ }
236
+ }
237
+ return { actions, rules };
238
+ }
239
+ function formatPlanSummary(plan) {
240
+ if (plan.actions.length === 0) {
241
+ return "No updates to apply.";
242
+ }
243
+ const lines = [];
244
+ lines.push(`Update plan (${plan.rules.length} rule(s)):
245
+ `);
246
+ for (const rule of plan.rules) {
247
+ const breaking = rule.hasBreakingChanges ? " \u26A0\uFE0F BREAKING" : "";
248
+ lines.push(
249
+ ` ${rule.ruleId}: ${rule.installedVersion} \u2192 ${rule.availableVersion}${breaking}`
250
+ );
251
+ if (rule.migrations.length > 0) {
252
+ for (const migration of rule.migrations) {
253
+ lines.push(` - ${migration.description}`);
254
+ }
255
+ }
256
+ }
257
+ return lines.join("\n");
258
+ }
259
+ function planHasBreakingChanges(plan) {
260
+ return plan.rules.some((r) => r.hasBreakingChanges);
261
+ }
262
+
263
+ // src/commands/update/execute.ts
264
+ import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs";
265
+ import { dirname, join } from "path";
266
+ import { fileURLToPath } from "url";
267
+ async function executeUpdatePlan(plan, options = {}) {
268
+ const { dryRun = false } = options;
269
+ const results = [];
270
+ const filesModified = [];
271
+ for (const action of plan.actions) {
272
+ const result = await executeAction(action, { dryRun });
273
+ results.push(result);
274
+ if (result.success && !dryRun) {
275
+ if (action.type === "copy_rule_files") {
276
+ filesModified.push(
277
+ join(action.packagePath, ".uilint", "rules", action.ruleId)
278
+ );
279
+ } else if (action.type === "migrate_rule_options") {
280
+ filesModified.push(action.configPath);
281
+ } else if (action.type === "update_manifest_version") {
282
+ filesModified.push(
283
+ join(action.packagePath, ".uilint", "rules", "manifest.json")
284
+ );
285
+ }
286
+ }
287
+ }
288
+ const success = results.every((r) => r.success);
289
+ const rulesUpdated = new Set(plan.rules.map((r) => r.ruleId)).size;
290
+ const packagesUpdated = new Set(
291
+ plan.actions.filter((a) => "packagePath" in a).map((a) => a.packagePath)
292
+ ).size;
293
+ const summary = {
294
+ rulesUpdated,
295
+ packagesUpdated,
296
+ filesModified: [...new Set(filesModified)],
297
+ breakingChanges: plan.rules.filter((r) => r.hasBreakingChanges).map((r) => r.ruleId)
298
+ };
299
+ return {
300
+ success,
301
+ actionsPerformed: results,
302
+ summary
303
+ };
304
+ }
305
+ async function executeAction(action, options) {
306
+ const { dryRun = false } = options;
307
+ switch (action.type) {
308
+ case "update_npm_packages":
309
+ return await executeUpdateNpmPackages(action, dryRun);
310
+ case "copy_rule_files":
311
+ return executeCopyRuleFiles(action, dryRun);
312
+ case "migrate_rule_options":
313
+ return executeMigrateRuleOptions(action, dryRun);
314
+ case "update_manifest_version":
315
+ return executeUpdateManifestVersion(action, dryRun);
316
+ default: {
317
+ const _exhaustive = action;
318
+ return {
319
+ action: _exhaustive,
320
+ success: false,
321
+ error: `Unknown action type`
322
+ };
323
+ }
324
+ }
325
+ }
326
+ async function executeUpdateNpmPackages(action, dryRun) {
327
+ if (dryRun) {
328
+ return {
329
+ action,
330
+ success: true,
331
+ wouldDo: `Update npm packages: ${action.packages.join(", ")} to latest`
332
+ };
333
+ }
334
+ try {
335
+ await updatePackages(
336
+ action.packageManager,
337
+ action.packagePath,
338
+ action.packages,
339
+ { dev: true }
340
+ );
341
+ return { action, success: true };
342
+ } catch (error) {
343
+ return {
344
+ action,
345
+ success: false,
346
+ error: error instanceof Error ? error.message : String(error)
347
+ };
348
+ }
349
+ }
350
+ function executeCopyRuleFiles(action, dryRun) {
351
+ if (dryRun) {
352
+ return {
353
+ action,
354
+ success: true,
355
+ wouldDo: `Copy rule files for ${action.ruleId} v${action.version} to ${action.packagePath}`
356
+ };
357
+ }
358
+ try {
359
+ const rulesDir = join(action.packagePath, ".uilint", "rules");
360
+ if (!existsSync(rulesDir)) {
361
+ mkdirSync(rulesDir, { recursive: true });
362
+ }
363
+ const [ruleFile] = loadSelectedRules([action.ruleId], {
364
+ typescript: true
365
+ });
366
+ if (!ruleFile) {
367
+ return {
368
+ action,
369
+ success: false,
370
+ error: `Rule ${action.ruleId} not found in registry`
371
+ };
372
+ }
373
+ const implPath = join(rulesDir, ruleFile.implementation.relativePath);
374
+ mkdirSync(dirname(implPath), { recursive: true });
375
+ writeFileSync(implPath, ruleFile.implementation.content, "utf-8");
376
+ if (ruleFile.additionalFiles) {
377
+ for (const file of ruleFile.additionalFiles) {
378
+ const filePath = join(rulesDir, file.relativePath);
379
+ mkdirSync(dirname(filePath), { recursive: true });
380
+ writeFileSync(filePath, file.content, "utf-8");
381
+ }
382
+ }
383
+ return { action, success: true };
384
+ } catch (error) {
385
+ return {
386
+ action,
387
+ success: false,
388
+ error: error instanceof Error ? error.message : String(error)
389
+ };
390
+ }
391
+ }
392
+ function executeMigrateRuleOptions(action, dryRun) {
393
+ if (dryRun) {
394
+ return {
395
+ action,
396
+ success: true,
397
+ wouldDo: `Migrate options for ${action.ruleId} in ${action.configPath}`
398
+ };
399
+ }
400
+ try {
401
+ if (action.migrations.length === 0) {
402
+ return { action, success: true };
403
+ }
404
+ console.warn(
405
+ `Note: Rule ${action.ruleId} has migrations. Manual config update may be needed.`
406
+ );
407
+ return { action, success: true };
408
+ } catch (error) {
409
+ return {
410
+ action,
411
+ success: false,
412
+ error: error instanceof Error ? error.message : String(error)
413
+ };
414
+ }
415
+ }
416
+ function executeUpdateManifestVersion(action, dryRun) {
417
+ if (dryRun) {
418
+ return {
419
+ action,
420
+ success: true,
421
+ wouldDo: `Update manifest for ${action.ruleId} to v${action.version}`
422
+ };
423
+ }
424
+ try {
425
+ const cliVersion = getCliVersion();
426
+ updateManifestRule(
427
+ action.packagePath,
428
+ action.ruleId,
429
+ action.version,
430
+ cliVersion
431
+ );
432
+ return { action, success: true };
433
+ } catch (error) {
434
+ return {
435
+ action,
436
+ success: false,
437
+ error: error instanceof Error ? error.message : String(error)
438
+ };
439
+ }
440
+ }
441
+ function getCliVersion() {
442
+ try {
443
+ const __dirname = dirname(fileURLToPath(import.meta.url));
444
+ const pkgPath = join(__dirname, "..", "..", "..", "package.json");
445
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
446
+ return pkg.version || "0.0.0";
447
+ } catch {
448
+ return "0.0.0";
449
+ }
450
+ }
451
+
452
+ // src/commands/upgrade.ts
453
+ async function upgrade(options) {
454
+ intro("UILint Upgrade");
455
+ try {
456
+ const projectPath = process.cwd();
457
+ logInfo("Analyzing installed rules...");
458
+ const analysis = analyzeForUpdates(projectPath);
459
+ const hasPackageUpdates = analysis.packages.some(
460
+ (p) => p.installedPackages.length > 0
461
+ );
462
+ if (analysis.totalUpdates === 0 && !hasPackageUpdates) {
463
+ logSuccess("All packages and rules are up to date!");
464
+ outro("No upgrades needed");
465
+ return;
466
+ }
467
+ note(formatUpdateSummary(analysis), "Available Updates");
468
+ if (options.check) {
469
+ outro("Run 'uilint upgrade' to apply updates");
470
+ return;
471
+ }
472
+ let ruleIds = [];
473
+ if (options.rule) {
474
+ const ruleExists = analysis.packages.some(
475
+ (pkg) => pkg.rules.some((r) => r.ruleId === options.rule && r.hasUpdate)
476
+ );
477
+ if (!ruleExists) {
478
+ logError(`Rule '${options.rule}' not found or already up to date`);
479
+ outro("Upgrade cancelled");
480
+ process.exit(1);
481
+ }
482
+ ruleIds = [options.rule];
483
+ logInfo(`Upgrading only: ${options.rule}`);
484
+ }
485
+ const choices = {
486
+ packagePaths: analysis.packages.map((p) => p.packagePath),
487
+ ruleIds,
488
+ confirmBreaking: false
489
+ };
490
+ const plan = createUpdatePlan(analysis, choices);
491
+ if (plan.actions.length === 0) {
492
+ logSuccess("No updates to apply");
493
+ outro("Done");
494
+ return;
495
+ }
496
+ note(formatPlanSummary(plan), "Upgrade Plan");
497
+ if (planHasBreakingChanges(plan) && !options.yes) {
498
+ logWarning("This upgrade includes breaking changes!");
499
+ const confirmed = await confirm({
500
+ message: "Continue with breaking changes?",
501
+ initialValue: false
502
+ });
503
+ if (!confirmed) {
504
+ outro("Upgrade cancelled");
505
+ return;
506
+ }
507
+ }
508
+ if (!options.yes && !options.dryRun) {
509
+ const npmPkgCount = plan.actions.filter(
510
+ (a) => a.type === "update_npm_packages"
511
+ ).length;
512
+ const rulePkgCount = plan.rules.length;
513
+ const parts = [];
514
+ if (npmPkgCount > 0) {
515
+ parts.push(`${npmPkgCount} package(s)`);
516
+ }
517
+ if (rulePkgCount > 0) {
518
+ parts.push(`${rulePkgCount} rule(s)`);
519
+ }
520
+ const confirmed = await confirm({
521
+ message: `Apply ${parts.join(" and ")} upgrade?`,
522
+ initialValue: true
523
+ });
524
+ if (!confirmed) {
525
+ outro("Upgrade cancelled");
526
+ return;
527
+ }
528
+ }
529
+ if (options.dryRun) {
530
+ logInfo("Dry run mode - no changes will be made");
531
+ }
532
+ const result = await executeUpdatePlan(plan, {
533
+ dryRun: options.dryRun
534
+ });
535
+ if (options.dryRun) {
536
+ logInfo("Dry run complete. Would perform:");
537
+ for (const action of result.actionsPerformed) {
538
+ if (action.wouldDo) {
539
+ console.log(` \u2022 ${action.wouldDo}`);
540
+ }
541
+ }
542
+ } else if (result.success) {
543
+ const npmUpdates = plan.actions.filter(
544
+ (a) => a.type === "update_npm_packages"
545
+ ).length;
546
+ const parts = [];
547
+ if (npmUpdates > 0) {
548
+ parts.push(`${npmUpdates} package(s)`);
549
+ }
550
+ if (result.summary.rulesUpdated > 0) {
551
+ parts.push(`${result.summary.rulesUpdated} rule(s)`);
552
+ }
553
+ logSuccess(`Upgraded ${parts.join(" and ")}`);
554
+ if (result.summary.filesModified.length > 0) {
555
+ note(
556
+ result.summary.filesModified.map((f) => ` ${f}`).join("\n"),
557
+ "Modified files"
558
+ );
559
+ }
560
+ if (result.summary.breakingChanges.length > 0) {
561
+ logWarning("Breaking changes applied to:");
562
+ for (const rule of result.summary.breakingChanges) {
563
+ console.log(` \u2022 ${rule}`);
564
+ }
565
+ console.log(
566
+ "\nPlease review your ESLint config for any manual adjustments."
567
+ );
568
+ }
569
+ } else {
570
+ logError("Some upgrades failed");
571
+ for (const action of result.actionsPerformed) {
572
+ if (!action.success && action.error) {
573
+ console.log(` \u2022 ${action.error}`);
574
+ }
575
+ }
576
+ process.exit(1);
577
+ }
578
+ outro("Upgrade complete");
579
+ } catch (error) {
580
+ logError(error instanceof Error ? error.message : "Upgrade failed");
581
+ process.exit(1);
582
+ }
583
+ }
584
+ export {
585
+ upgrade
586
+ };
587
+ //# sourceMappingURL=upgrade-TGYLZ4QX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/update/analyze.ts","../src/utils/migration-engine.ts","../src/commands/update/plan.ts","../src/commands/update/execute.ts","../src/commands/upgrade.ts"],"sourcesContent":["/**\n * Analyze phase for the update command\n *\n * Compares installed rule versions against available versions\n * and identifies what can be updated.\n */\n\nimport { basename, relative } from \"path\";\nimport { getRuleMetadata, ruleRegistry } from \"uilint-eslint\";\nimport {\n detectPackageManager,\n getInstalledUilintPackages,\n} from \"../../utils/package-manager.js\";\nimport { findWorkspaceRoot } from \"uilint-core/node\";\nimport { readManifest, getInstalledRuleVersions } from \"../../utils/manifest.js\";\nimport {\n findMigrationPath,\n getMigrationsForRule,\n hasBreakingMigrations,\n} from \"../../utils/migration-engine.js\";\nimport type {\n UpdateAnalysis,\n PackageUpdateInfo,\n RuleUpdateInfo,\n InstalledPackageInfo,\n} from \"./types.js\";\n\n/**\n * Compare two semver versions\n * Returns true if available > installed\n */\nfunction isNewerVersion(installed: string, available: string): boolean {\n const installedParts = installed.split(\".\").map(Number);\n const availableParts = available.split(\".\").map(Number);\n\n for (let i = 0; i < 3; i++) {\n const a = availableParts[i] ?? 0;\n const b = installedParts[i] ?? 0;\n if (a > b) return true;\n if (a < b) return false;\n }\n\n return false;\n}\n\n/**\n * Analyze a single rule for updates\n */\nfunction analyzeRule(\n ruleId: string,\n installedVersion: string\n): RuleUpdateInfo | null {\n const ruleMeta = getRuleMetadata(ruleId);\n if (!ruleMeta) {\n // Rule no longer exists in registry\n return null;\n }\n\n const availableVersion = ruleMeta.version ?? \"1.0.0\";\n const hasUpdate = isNewerVersion(installedVersion, availableVersion);\n\n // Find migration path if update is available\n const migrations = hasUpdate\n ? findMigrationPath(\n installedVersion,\n availableVersion,\n getMigrationsForRule(ruleId)\n )\n : [];\n\n return {\n ruleId,\n installedVersion,\n availableVersion,\n hasUpdate,\n migrations,\n hasBreakingChanges: hasBreakingMigrations(migrations),\n };\n}\n\n/**\n * Analyze a package for rule updates\n */\nfunction analyzePackage(packagePath: string): PackageUpdateInfo {\n const installedVersions = getInstalledRuleVersions(packagePath);\n const rules: RuleUpdateInfo[] = [];\n\n // Check each installed rule\n for (const [ruleId, version] of Object.entries(installedVersions)) {\n const ruleInfo = analyzeRule(ruleId, version);\n if (ruleInfo) {\n rules.push(ruleInfo);\n }\n }\n\n const updatableRules = rules.filter((r) => r.hasUpdate);\n\n // Get installed uilint npm packages\n const installedPackagesMap = getInstalledUilintPackages(packagePath);\n const installedPackages: InstalledPackageInfo[] = [];\n for (const [name, version] of installedPackagesMap) {\n installedPackages.push({ name, installedVersion: version });\n }\n\n return {\n packagePath,\n displayName: basename(packagePath) || packagePath,\n eslintConfigPath: null, // TODO: detect ESLint config\n packageManager: detectPackageManager(packagePath),\n installedPackages,\n rules,\n updatableCount: updatableRules.length,\n hasBreakingChanges: updatableRules.some((r) => r.hasBreakingChanges),\n };\n}\n\n/**\n * Analyze a project for available rule updates\n *\n * @param projectPath - Path to the project (or package in a monorepo)\n * @returns Analysis of available updates\n */\nexport function analyzeForUpdates(projectPath: string): UpdateAnalysis {\n const workspaceRoot = findWorkspaceRoot(projectPath);\n const packageManager = detectPackageManager(projectPath);\n\n // For now, just analyze the single project path\n // TODO: In monorepo, scan all packages with manifests\n const packageInfo = analyzePackage(projectPath);\n const packages = [packageInfo];\n\n const totalUpdates = packages.reduce((sum, p) => sum + p.updatableCount, 0);\n const hasBreakingChanges = packages.some((p) => p.hasBreakingChanges);\n\n return {\n workspaceRoot,\n packageManager,\n packages,\n totalUpdates,\n hasBreakingChanges,\n };\n}\n\n/**\n * Get a summary of available updates for display\n */\nexport function formatUpdateSummary(analysis: UpdateAnalysis): string {\n const hasRuleUpdates = analysis.totalUpdates > 0;\n const hasPackages = analysis.packages.some(\n (p) => p.installedPackages.length > 0\n );\n\n if (!hasRuleUpdates && !hasPackages) {\n return \"No uilint packages or rules found.\";\n }\n\n const lines: string[] = [];\n\n for (const pkg of analysis.packages) {\n const hasUpdates =\n pkg.updatableCount > 0 || pkg.installedPackages.length > 0;\n if (!hasUpdates) continue;\n\n lines.push(`${pkg.displayName}:`);\n\n // Show installed npm packages\n if (pkg.installedPackages.length > 0) {\n lines.push(\" npm packages:\");\n for (const npmPkg of pkg.installedPackages) {\n lines.push(` ${npmPkg.name}: ${npmPkg.installedVersion} → latest`);\n }\n }\n\n // Show rule updates\n if (pkg.updatableCount > 0) {\n lines.push(\" rules:\");\n for (const rule of pkg.rules) {\n if (!rule.hasUpdate) continue;\n\n const breaking = rule.hasBreakingChanges ? \" (BREAKING)\" : \"\";\n lines.push(\n ` ${rule.ruleId}: ${rule.installedVersion} → ${rule.availableVersion}${breaking}`\n );\n }\n }\n\n lines.push(\"\");\n }\n\n if (analysis.hasBreakingChanges) {\n lines.push(\"⚠️ Some rule updates contain breaking changes.\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Migration Engine\n *\n * Handles migrating rule options between versions using migration definitions.\n */\n\nimport { getRuleMetadata, type RuleMigration } from \"uilint-eslint\";\n\n/**\n * Find a path of migrations to get from one version to another.\n *\n * Uses BFS to find the shortest path through the migration graph.\n *\n * @param from - Starting version (installed version)\n * @param to - Target version (available version)\n * @param migrations - Available migrations for the rule\n * @returns Array of migrations to apply in order, or empty array if no path exists\n */\nexport function findMigrationPath(\n from: string,\n to: string,\n migrations: RuleMigration[]\n): RuleMigration[] {\n // No migration needed if versions are the same\n if (from === to) {\n return [];\n }\n\n // No migrations available\n if (migrations.length === 0) {\n return [];\n }\n\n // Build a map of version -> outgoing migrations\n const migrationMap = new Map<string, RuleMigration[]>();\n for (const migration of migrations) {\n const existing = migrationMap.get(migration.from) ?? [];\n existing.push(migration);\n migrationMap.set(migration.from, existing);\n }\n\n // BFS to find path\n const visited = new Set<string>();\n const queue: { version: string; path: RuleMigration[] }[] = [\n { version: from, path: [] },\n ];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n if (visited.has(current.version)) {\n continue;\n }\n visited.add(current.version);\n\n const outgoing = migrationMap.get(current.version) ?? [];\n for (const migration of outgoing) {\n const newPath = [...current.path, migration];\n\n // Found the target\n if (migration.to === to) {\n return newPath;\n }\n\n // Add to queue for further exploration\n if (!visited.has(migration.to)) {\n queue.push({ version: migration.to, path: newPath });\n }\n }\n }\n\n // No path found\n return [];\n}\n\n/**\n * Apply a sequence of migrations to transform options.\n *\n * @param options - The current rule options array\n * @param migrations - Migrations to apply in order\n * @returns Transformed options array\n */\nexport function applyMigrations(\n options: unknown[],\n migrations: RuleMigration[]\n): unknown[] {\n let current = options;\n\n for (const migration of migrations) {\n current = migration.migrate(current);\n }\n\n return current;\n}\n\n/**\n * Get migrations defined for a specific rule.\n *\n * @param ruleId - The rule ID to look up\n * @returns Array of migrations, or empty array if none defined\n */\nexport function getMigrationsForRule(ruleId: string): RuleMigration[] {\n const ruleMeta = getRuleMetadata(ruleId);\n if (!ruleMeta) {\n return [];\n }\n\n return ruleMeta.migrations ?? [];\n}\n\n/**\n * Check if there are any breaking migrations in a migration path.\n *\n * @param migrations - The migration path to check\n * @returns True if any migration is marked as breaking\n */\nexport function hasBreakingMigrations(migrations: RuleMigration[]): boolean {\n return migrations.some((m) => m.breaking === true);\n}\n\n/**\n * Get descriptions of all migrations in a path.\n *\n * @param migrations - The migration path\n * @returns Array of migration descriptions\n */\nexport function getMigrationDescriptions(migrations: RuleMigration[]): string[] {\n return migrations.map(\n (m) => `${m.from} → ${m.to}: ${m.description}${m.breaking ? \" (BREAKING)\" : \"\"}`\n );\n}\n","/**\n * Plan phase for the update command\n *\n * Creates a plan of actions to update rules based on analysis and user choices.\n */\n\nimport type {\n UpdateAnalysis,\n UpdatePlan,\n UpdateAction,\n UpdateChoices,\n RuleUpdateInfo,\n} from \"./types.js\";\n\n/**\n * Create an update plan based on analysis and user choices\n *\n * @param analysis - Result from the analyze phase\n * @param choices - User selections for what to update\n * @returns Plan of actions to execute\n */\nexport function createUpdatePlan(\n analysis: UpdateAnalysis,\n choices: UpdateChoices\n): UpdatePlan {\n const actions: UpdateAction[] = [];\n const rules: RuleUpdateInfo[] = [];\n\n for (const pkg of analysis.packages) {\n // Skip packages not selected\n if (!choices.packagePaths.includes(pkg.packagePath)) {\n continue;\n }\n\n // Action: Update npm packages (do this first)\n if (pkg.installedPackages.length > 0) {\n actions.push({\n type: \"update_npm_packages\",\n packagePath: pkg.packagePath,\n packageManager: pkg.packageManager,\n packages: pkg.installedPackages.map((p) => p.name),\n });\n }\n\n for (const rule of pkg.rules) {\n // Skip rules that don't have updates\n if (!rule.hasUpdate) {\n continue;\n }\n\n // Skip rules not in the specific rule filter (if set)\n if (choices.ruleIds.length > 0 && !choices.ruleIds.includes(rule.ruleId)) {\n continue;\n }\n\n // Track this rule for the plan\n rules.push(rule);\n\n // Action 1: Copy updated rule files\n actions.push({\n type: \"copy_rule_files\",\n packagePath: pkg.packagePath,\n ruleId: rule.ruleId,\n version: rule.availableVersion,\n });\n\n // Action 2: Migrate options in ESLint config (if migrations exist)\n if (rule.migrations.length > 0 && pkg.eslintConfigPath) {\n actions.push({\n type: \"migrate_rule_options\",\n configPath: pkg.eslintConfigPath,\n ruleId: rule.ruleId,\n migrations: rule.migrations,\n });\n }\n\n // Action 3: Update manifest with new version\n actions.push({\n type: \"update_manifest_version\",\n packagePath: pkg.packagePath,\n ruleId: rule.ruleId,\n version: rule.availableVersion,\n });\n }\n }\n\n return { actions, rules };\n}\n\n/**\n * Get a summary of what the plan will do\n */\nexport function formatPlanSummary(plan: UpdatePlan): string {\n if (plan.actions.length === 0) {\n return \"No updates to apply.\";\n }\n\n const lines: string[] = [];\n lines.push(`Update plan (${plan.rules.length} rule(s)):\\n`);\n\n for (const rule of plan.rules) {\n const breaking = rule.hasBreakingChanges ? \" ⚠️ BREAKING\" : \"\";\n lines.push(\n ` ${rule.ruleId}: ${rule.installedVersion} → ${rule.availableVersion}${breaking}`\n );\n\n // Show migration descriptions\n if (rule.migrations.length > 0) {\n for (const migration of rule.migrations) {\n lines.push(` - ${migration.description}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Check if the plan has any breaking changes that require confirmation\n */\nexport function planHasBreakingChanges(plan: UpdatePlan): boolean {\n return plan.rules.some((r) => r.hasBreakingChanges);\n}\n\n/**\n * Filter plan to only include specific rules\n */\nexport function filterPlanByRules(\n plan: UpdatePlan,\n ruleIds: string[]\n): UpdatePlan {\n if (ruleIds.length === 0) {\n return plan;\n }\n\n const ruleIdSet = new Set(ruleIds);\n const filteredRules = plan.rules.filter((r) => ruleIdSet.has(r.ruleId));\n const filteredActions = plan.actions.filter((a) => {\n if (\"ruleId\" in a) {\n return ruleIdSet.has(a.ruleId);\n }\n return true;\n });\n\n return {\n actions: filteredActions,\n rules: filteredRules,\n };\n}\n","/**\n * Execute phase for the update command\n *\n * Performs the actual file operations to update rules.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { loadSelectedRules } from \"../../utils/rule-loader.js\";\nimport { updateManifestRule } from \"../../utils/manifest.js\";\nimport { applyMigrations } from \"../../utils/migration-engine.js\";\nimport { updatePackages } from \"../../utils/package-manager.js\";\nimport type {\n UpdatePlan,\n UpdateAction,\n UpdateResult,\n UpdateActionResult,\n UpdateSummary,\n CopyRuleFilesAction,\n MigrateRuleOptionsAction,\n UpdateManifestVersionAction,\n UpdateNpmPackagesAction,\n} from \"./types.js\";\n\nexport interface ExecuteUpdateOptions {\n dryRun?: boolean;\n}\n\n/**\n * Execute an update plan\n *\n * @param plan - The plan to execute\n * @param options - Execution options\n * @returns Result of the execution\n */\nexport async function executeUpdatePlan(\n plan: UpdatePlan,\n options: ExecuteUpdateOptions = {}\n): Promise<UpdateResult> {\n const { dryRun = false } = options;\n const results: UpdateActionResult[] = [];\n const filesModified: string[] = [];\n\n for (const action of plan.actions) {\n const result = await executeAction(action, { dryRun });\n results.push(result);\n\n if (result.success && !dryRun) {\n // Track modified files\n if (action.type === \"copy_rule_files\") {\n filesModified.push(\n join(action.packagePath, \".uilint\", \"rules\", action.ruleId)\n );\n } else if (action.type === \"migrate_rule_options\") {\n filesModified.push(action.configPath);\n } else if (action.type === \"update_manifest_version\") {\n filesModified.push(\n join(action.packagePath, \".uilint\", \"rules\", \"manifest.json\")\n );\n }\n }\n }\n\n const success = results.every((r) => r.success);\n const rulesUpdated = new Set(plan.rules.map((r) => r.ruleId)).size;\n const packagesUpdated = new Set(\n plan.actions\n .filter((a) => \"packagePath\" in a)\n .map((a) => (a as { packagePath: string }).packagePath)\n ).size;\n\n const summary: UpdateSummary = {\n rulesUpdated,\n packagesUpdated,\n filesModified: [...new Set(filesModified)],\n breakingChanges: plan.rules\n .filter((r) => r.hasBreakingChanges)\n .map((r) => r.ruleId),\n };\n\n return {\n success,\n actionsPerformed: results,\n summary,\n };\n}\n\n/**\n * Execute a single update action\n */\nasync function executeAction(\n action: UpdateAction,\n options: ExecuteUpdateOptions\n): Promise<UpdateActionResult> {\n const { dryRun = false } = options;\n\n switch (action.type) {\n case \"update_npm_packages\":\n return await executeUpdateNpmPackages(action, dryRun);\n\n case \"copy_rule_files\":\n return executeCopyRuleFiles(action, dryRun);\n\n case \"migrate_rule_options\":\n return executeMigrateRuleOptions(action, dryRun);\n\n case \"update_manifest_version\":\n return executeUpdateManifestVersion(action, dryRun);\n\n default: {\n const _exhaustive: never = action;\n return {\n action: _exhaustive,\n success: false,\n error: `Unknown action type`,\n };\n }\n }\n}\n\n/**\n * Update npm packages to latest versions\n */\nasync function executeUpdateNpmPackages(\n action: UpdateNpmPackagesAction,\n dryRun: boolean\n): Promise<UpdateActionResult> {\n if (dryRun) {\n return {\n action,\n success: true,\n wouldDo: `Update npm packages: ${action.packages.join(\", \")} to latest`,\n };\n }\n\n try {\n await updatePackages(\n action.packageManager,\n action.packagePath,\n action.packages,\n { dev: true }\n );\n\n return { action, success: true };\n } catch (error) {\n return {\n action,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Copy updated rule files\n */\nfunction executeCopyRuleFiles(\n action: CopyRuleFilesAction,\n dryRun: boolean\n): UpdateActionResult {\n if (dryRun) {\n return {\n action,\n success: true,\n wouldDo: `Copy rule files for ${action.ruleId} v${action.version} to ${action.packagePath}`,\n };\n }\n\n try {\n const rulesDir = join(action.packagePath, \".uilint\", \"rules\");\n\n // Ensure directory exists\n if (!existsSync(rulesDir)) {\n mkdirSync(rulesDir, { recursive: true });\n }\n\n // Load rule files (TypeScript version - can adjust based on project config)\n const [ruleFile] = loadSelectedRules([action.ruleId], {\n typescript: true,\n });\n\n if (!ruleFile) {\n return {\n action,\n success: false,\n error: `Rule ${action.ruleId} not found in registry`,\n };\n }\n\n // Write implementation file\n const implPath = join(rulesDir, ruleFile.implementation.relativePath);\n mkdirSync(dirname(implPath), { recursive: true });\n writeFileSync(implPath, ruleFile.implementation.content, \"utf-8\");\n\n // Write additional files for directory-based rules\n if (ruleFile.additionalFiles) {\n for (const file of ruleFile.additionalFiles) {\n const filePath = join(rulesDir, file.relativePath);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, file.content, \"utf-8\");\n }\n }\n\n return { action, success: true };\n } catch (error) {\n return {\n action,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Migrate rule options in ESLint config\n */\nfunction executeMigrateRuleOptions(\n action: MigrateRuleOptionsAction,\n dryRun: boolean\n): UpdateActionResult {\n if (dryRun) {\n return {\n action,\n success: true,\n wouldDo: `Migrate options for ${action.ruleId} in ${action.configPath}`,\n };\n }\n\n try {\n // TODO: Implement actual ESLint config modification\n // For now, this is a placeholder that succeeds without modifying the config\n // The actual implementation requires AST parsing and modification\n\n // Note: The migration engine is already implemented in migration-engine.ts\n // What's needed here is:\n // 1. Read the ESLint config\n // 2. Find the rule options for action.ruleId\n // 3. Apply migrations using applyMigrations()\n // 4. Write the modified config back\n\n // For now, we'll skip this and just succeed\n // Users can manually update their config if migrations are needed\n if (action.migrations.length === 0) {\n return { action, success: true };\n }\n\n // Log that manual migration may be needed\n console.warn(\n `Note: Rule ${action.ruleId} has migrations. Manual config update may be needed.`\n );\n\n return { action, success: true };\n } catch (error) {\n return {\n action,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Update manifest with new version\n */\nfunction executeUpdateManifestVersion(\n action: UpdateManifestVersionAction,\n dryRun: boolean\n): UpdateActionResult {\n if (dryRun) {\n return {\n action,\n success: true,\n wouldDo: `Update manifest for ${action.ruleId} to v${action.version}`,\n };\n }\n\n try {\n const cliVersion = getCliVersion();\n updateManifestRule(\n action.packagePath,\n action.ruleId,\n action.version,\n cliVersion\n );\n\n return { action, success: true };\n } catch (error) {\n return {\n action,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Get CLI version from package.json\n */\nfunction getCliVersion(): string {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(__dirname, \"..\", \"..\", \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n version?: string;\n };\n return pkg.version || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n","/**\n * Upgrade command - update installed rules to latest versions\n *\n * Usage:\n * uilint upgrade # Interactive upgrade\n * uilint upgrade --check # Show available updates only\n * uilint upgrade --yes # Auto-confirm all updates\n * uilint upgrade --dry-run # Show what would change\n * uilint upgrade --rule <id> # Upgrade specific rule\n */\n\nimport {\n analyzeForUpdates,\n formatUpdateSummary,\n} from \"./update/analyze.js\";\nimport {\n createUpdatePlan,\n formatPlanSummary,\n planHasBreakingChanges,\n} from \"./update/plan.js\";\nimport { executeUpdatePlan } from \"./update/execute.js\";\nimport type { UpdateOptions, UpdateChoices } from \"./update/types.js\";\nimport {\n intro,\n outro,\n logInfo,\n logSuccess,\n logError,\n logWarning,\n note,\n pc,\n confirm,\n} from \"../utils/prompts.js\";\n\nexport interface UpgradeCommandOptions {\n check?: boolean;\n yes?: boolean;\n dryRun?: boolean;\n rule?: string;\n}\n\n/**\n * Run the upgrade command\n */\nexport async function upgrade(options: UpgradeCommandOptions): Promise<void> {\n intro(\"UILint Upgrade\");\n\n try {\n const projectPath = process.cwd();\n\n // Phase 1: Analyze\n logInfo(\"Analyzing installed rules...\");\n const analysis = analyzeForUpdates(projectPath);\n\n const hasPackageUpdates = analysis.packages.some(\n (p) => p.installedPackages.length > 0\n );\n\n if (analysis.totalUpdates === 0 && !hasPackageUpdates) {\n logSuccess(\"All packages and rules are up to date!\");\n outro(\"No upgrades needed\");\n return;\n }\n\n // Display available updates\n note(formatUpdateSummary(analysis), \"Available Updates\");\n\n // --check mode: just show what's available\n if (options.check) {\n outro(\"Run 'uilint upgrade' to apply updates\");\n return;\n }\n\n // Filter by specific rule if requested\n let ruleIds: string[] = [];\n if (options.rule) {\n const ruleExists = analysis.packages.some((pkg) =>\n pkg.rules.some((r) => r.ruleId === options.rule && r.hasUpdate)\n );\n\n if (!ruleExists) {\n logError(`Rule '${options.rule}' not found or already up to date`);\n outro(\"Upgrade cancelled\");\n process.exit(1);\n }\n\n ruleIds = [options.rule];\n logInfo(`Upgrading only: ${options.rule}`);\n }\n\n // Phase 2: Plan\n const choices: UpdateChoices = {\n packagePaths: analysis.packages.map((p) => p.packagePath),\n ruleIds,\n confirmBreaking: false,\n };\n\n const plan = createUpdatePlan(analysis, choices);\n\n if (plan.actions.length === 0) {\n logSuccess(\"No updates to apply\");\n outro(\"Done\");\n return;\n }\n\n // Display plan\n note(formatPlanSummary(plan), \"Upgrade Plan\");\n\n // Handle breaking changes\n if (planHasBreakingChanges(plan) && !options.yes) {\n logWarning(\"This upgrade includes breaking changes!\");\n const confirmed = await confirm({\n message: \"Continue with breaking changes?\",\n initialValue: false,\n });\n\n if (!confirmed) {\n outro(\"Upgrade cancelled\");\n return;\n }\n }\n\n // Confirm upgrade (unless --yes)\n if (!options.yes && !options.dryRun) {\n const npmPkgCount = plan.actions.filter(\n (a) => a.type === \"update_npm_packages\"\n ).length;\n const rulePkgCount = plan.rules.length;\n\n const parts: string[] = [];\n if (npmPkgCount > 0) {\n parts.push(`${npmPkgCount} package(s)`);\n }\n if (rulePkgCount > 0) {\n parts.push(`${rulePkgCount} rule(s)`);\n }\n\n const confirmed = await confirm({\n message: `Apply ${parts.join(\" and \")} upgrade?`,\n initialValue: true,\n });\n\n if (!confirmed) {\n outro(\"Upgrade cancelled\");\n return;\n }\n }\n\n // Phase 3: Execute\n if (options.dryRun) {\n logInfo(\"Dry run mode - no changes will be made\");\n }\n\n const result = await executeUpdatePlan(plan, {\n dryRun: options.dryRun,\n });\n\n // Report results\n if (options.dryRun) {\n logInfo(\"Dry run complete. Would perform:\");\n for (const action of result.actionsPerformed) {\n if (action.wouldDo) {\n console.log(` • ${action.wouldDo}`);\n }\n }\n } else if (result.success) {\n // Count npm package updates\n const npmUpdates = plan.actions.filter(\n (a) => a.type === \"update_npm_packages\"\n ).length;\n\n const parts: string[] = [];\n if (npmUpdates > 0) {\n parts.push(`${npmUpdates} package(s)`);\n }\n if (result.summary.rulesUpdated > 0) {\n parts.push(`${result.summary.rulesUpdated} rule(s)`);\n }\n\n logSuccess(`Upgraded ${parts.join(\" and \")}`);\n\n if (result.summary.filesModified.length > 0) {\n note(\n result.summary.filesModified.map((f) => ` ${f}`).join(\"\\n\"),\n \"Modified files\"\n );\n }\n\n if (result.summary.breakingChanges.length > 0) {\n logWarning(\"Breaking changes applied to:\");\n for (const rule of result.summary.breakingChanges) {\n console.log(` • ${rule}`);\n }\n console.log(\n \"\\nPlease review your ESLint config for any manual adjustments.\"\n );\n }\n } else {\n logError(\"Some upgrades failed\");\n for (const action of result.actionsPerformed) {\n if (!action.success && action.error) {\n console.log(` • ${action.error}`);\n }\n }\n process.exit(1);\n }\n\n outro(\"Upgrade complete\");\n } catch (error) {\n logError(error instanceof Error ? error.message : \"Upgrade failed\");\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["getRuleMetadata","getRuleMetadata"]}