@ant-design/cli 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 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/types.ts","../src/data/loader.ts","../src/data/version.ts","../src/output/formatter.ts","../src/commands/list.ts","../src/output/error.ts","../src/commands/info.ts","../src/commands/demo.ts","../src/commands/token.ts","../src/commands/semantic.ts","../src/commands/diff.ts","../src/commands/doctor.ts","../src/utils/scan.ts","../src/commands/usage.ts","../src/commands/lint.ts","../src/commands/migrate-v4-to-v5.ts","../src/commands/migrate-v5-to-v6.ts","../src/commands/migrate.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { registerListCommand } from './commands/list.js';\nimport { registerInfoCommand } from './commands/info.js';\nimport { registerDemoCommand } from './commands/demo.js';\nimport { registerTokenCommand } from './commands/token.js';\nimport { registerSemanticCommand } from './commands/semantic.js';\nimport { registerChangelogCommand } from './commands/diff.js';\nimport { registerDoctorCommand } from './commands/doctor.js';\nimport { registerUsageCommand } from './commands/usage.js';\nimport { registerLintCommand } from './commands/lint.js';\nimport { registerMigrateCommand } from './commands/migrate.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nconst program = new Command();\n\nprogram\n .name('antd')\n .description('CLI tool for querying antd knowledge and analyzing antd usage')\n .option('--format <format>', 'Output format: json, text, or markdown', 'text')\n .option('--version <version>', 'Target antd version (e.g. 5.20.0)')\n .option('--lang <lang>', 'Output language: en or zh', 'en')\n .option('--detail', 'Full information output', false);\n\n// -V for CLI version (--version is used for antd version targeting)\nprogram.addOption(new Option('-V, --cli-version', 'Output the CLI version number'));\n\n// Knowledge Query commands\nregisterListCommand(program);\nregisterInfoCommand(program);\nregisterDemoCommand(program);\nregisterTokenCommand(program);\nregisterSemanticCommand(program);\nregisterChangelogCommand(program);\n\n// Project Analysis commands\nregisterDoctorCommand(program);\nregisterUsageCommand(program);\nregisterLintCommand(program);\nregisterMigrateCommand(program);\n\n// Handle -V before subcommand dispatch\nconst idx = process.argv.indexOf('-V');\nconst idx2 = process.argv.indexOf('--cli-version');\nif (idx !== -1 || idx2 !== -1) {\n // eslint-disable-next-line no-console\n console.log(CLI_VERSION);\n process.exit(0);\n}\n\nprogram.parse();\n","export interface PropData {\n name: string;\n type: string;\n default: string;\n description?: string;\n descriptionZh?: string;\n since?: string;\n deprecated?: boolean | string;\n required?: boolean;\n}\n\nexport interface DemoData {\n name: string;\n title: string;\n titleZh?: string;\n description: string;\n descriptionZh?: string;\n code: string;\n}\n\nexport interface TokenData {\n name: string;\n type: string;\n default: string;\n description?: string;\n descriptionZh?: string;\n}\n\nexport interface SemanticKey {\n key: string;\n description: string;\n descriptionZh?: string;\n}\n\nexport interface ComponentData {\n name: string;\n category: string;\n categoryZh?: string;\n description: string;\n descriptionZh?: string;\n whenToUse?: string;\n whenToUseZh?: string;\n props: PropData[];\n methods?: { name: string; description: string; type: string }[];\n demos?: DemoData[];\n tokens?: TokenData[];\n semanticStructure?: SemanticKey[];\n related?: string[];\n faq?: { question: string; answer: string }[];\n subComponents?: string[];\n}\n\n/** Pick the right text based on language. Falls back to English. */\nexport function localize(en: string | undefined, zh: string | undefined, lang: string): string {\n if (lang === 'zh' && zh) return zh;\n return en || '';\n}\n\nexport interface ChangelogEntry {\n version: string;\n date: string;\n changes: {\n component: string;\n type: 'feature' | 'fix' | 'style' | 'deprecation' | 'breaking' | 'other';\n description: string;\n }[];\n}\n\nexport interface MetadataStore {\n version: string;\n majorVersion: string;\n components: ComponentData[];\n globalTokens?: TokenData[];\n changelog?: ChangelogEntry[];\n}\n\nexport type OutputFormat = 'json' | 'text' | 'markdown';\n\nexport interface GlobalOptions {\n format: OutputFormat;\n version?: string;\n lang: 'en' | 'zh';\n cache: boolean;\n detail: boolean;\n}\n\nexport interface CLIError {\n error: true;\n code: string;\n message: string;\n suggestion?: string;\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { MetadataStore, ComponentData } from '../types.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getDataPath(): string {\n // Check for a known file to confirm the correct directory\n // Works from both dist/ and src/data/\n const probe = 'v5.json';\n const candidates = [\n join(__dirname, '..', 'data'), // from dist/\n join(__dirname, '..', '..', 'data'), // from src/data/\n ];\n return candidates.find((p) => existsSync(join(p, probe))) ?? candidates[0];\n}\n\nexport function loadMetadata(majorVersion: string): MetadataStore {\n const dataPath = join(getDataPath(), `${majorVersion}.json`);\n try {\n return JSON.parse(readFileSync(dataPath, 'utf-8')) as MetadataStore;\n } catch (err) {\n if (err instanceof SyntaxError) {\n process.stderr.write(`[antd-cli] Warning: data file may be corrupted: ${dataPath}\\n`);\n }\n return {\n version: majorVersion,\n majorVersion,\n components: [],\n };\n }\n}\n\nexport function findComponent(\n store: MetadataStore,\n name: string,\n): ComponentData | undefined {\n return store.components.find(\n (c) => c.name.toLowerCase() === name.toLowerCase(),\n );\n}\n\nexport function getAllComponentNames(store: MetadataStore): string[] {\n return store.components.map((c) => c.name);\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface VersionInfo {\n version: string;\n majorVersion: string;\n source: 'flag' | 'node_modules' | 'package.json' | 'fallback';\n}\n\nconst FALLBACK_VERSION = '5.24.0';\nconst FALLBACK_MAJOR = 'v5';\n\nexport function detectVersion(flagVersion?: string): VersionInfo {\n // 1. --version flag\n if (flagVersion) {\n return {\n version: flagVersion,\n majorVersion: toMajor(flagVersion),\n source: 'flag',\n };\n }\n\n // 2. node_modules/antd/package.json\n const nmPath = join(process.cwd(), 'node_modules', 'antd', 'package.json');\n if (existsSync(nmPath)) {\n try {\n const pkg = JSON.parse(readFileSync(nmPath, 'utf-8'));\n if (pkg.version) {\n return {\n version: pkg.version,\n majorVersion: toMajor(pkg.version),\n source: 'node_modules',\n };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // 3. Project package.json dependencies\n const pkgPath = join(process.cwd(), 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const depVersion =\n pkg.dependencies?.antd || pkg.devDependencies?.antd || pkg.peerDependencies?.antd;\n if (depVersion) {\n const cleaned = depVersion.replace(/[\\^~>=<\\s]/g, '');\n return {\n version: cleaned,\n majorVersion: toMajor(cleaned),\n source: 'package.json',\n };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // 4. Fallback to latest\n return {\n version: FALLBACK_VERSION,\n majorVersion: FALLBACK_MAJOR,\n source: 'fallback',\n };\n}\n\nfunction toMajor(version: string): string {\n const major = version.split('.')[0];\n return `v${major}`;\n}\n\n/** Simple semver comparison. Returns -1, 0, or 1. */\nexport function compare(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] || 0;\n const nb = pb[i] || 0;\n if (na < nb) return -1;\n if (na > nb) return 1;\n }\n return 0;\n}\n\n/** Check if a string looks like a valid semver. */\nexport function valid(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+/.test(version);\n}\n","import type { OutputFormat } from '../types.js';\n\nexport function formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case 'json':\n return JSON.stringify(data, null, 2);\n case 'markdown':\n return formatAsMarkdown(data);\n case 'text':\n default:\n return formatAsText(data);\n }\n}\n\nfunction formatAsText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (Array.isArray(data)) return data.map((item) => formatAsText(item)).join('\\n');\n if (typeof data === 'object' && data !== null) {\n return Object.entries(data)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return `${key}:\\n${value.map((v) => ` ${formatAsText(v)}`).join('\\n')}`;\n }\n return `${key}: ${value}`;\n })\n .join('\\n');\n }\n return String(data);\n}\n\nfunction formatAsMarkdown(data: unknown): string {\n if (typeof data === 'string') return data;\n if (typeof data === 'object' && data !== null) {\n return '```json\\n' + JSON.stringify(data, null, 2) + '\\n```';\n }\n return String(data);\n}\n\nexport function formatTable(\n headers: string[],\n rows: string[][],\n format: OutputFormat,\n): string {\n if (format === 'json') {\n return JSON.stringify(\n rows.map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((h, i) => {\n obj[h] = row[i];\n });\n return obj;\n }),\n null,\n 2,\n );\n }\n\n if (format === 'markdown') {\n // Escape pipe characters in cell content to avoid breaking markdown tables\n const escPipe = (s: string) => s.replace(/\\|/g, '\\\\|');\n const headerLine = '| ' + headers.map(escPipe).join(' | ') + ' |';\n const separator = '| ' + headers.map(() => '---').join(' | ') + ' |';\n const bodyLines = rows.map((row) => '| ' + row.map(escPipe).join(' | ') + ' |');\n return [headerLine, separator, ...bodyLines].join('\\n');\n }\n\n // Text format: aligned columns\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] || '').length)),\n );\n const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');\n const separator = colWidths.map((w) => '-'.repeat(w)).join(' ');\n const bodyLines = rows.map((row) =>\n row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' '),\n );\n return [headerLine, separator, ...bodyLines].join('\\n');\n}\n\nexport function output(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { localize } from '../types.js';\nimport { loadMetadata } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all components with descriptions and categories')\n .action(() => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadata(versionInfo.majorVersion);\n const lang = opts.lang;\n\n if (store.components.length === 0) {\n console.log('No component data available.');\n return;\n }\n\n if (opts.format === 'json') {\n const data = store.components.map((c) => ({\n name: c.name,\n category: localize(c.category, c.categoryZh, lang),\n description: localize(c.description, c.descriptionZh, lang),\n }));\n output(data, 'json');\n return;\n }\n\n // Group by category\n const categories = new Map<string, typeof store.components>();\n for (const comp of store.components) {\n const cat = localize(comp.category, comp.categoryZh, lang) || 'Other';\n if (!categories.has(cat)) categories.set(cat, []);\n categories.get(cat)!.push(comp);\n }\n\n if (opts.format === 'markdown') {\n const lines: string[] = [`# antd Components (${versionInfo.version})`, ''];\n for (const [category, components] of categories) {\n lines.push(`## ${category}`, '');\n for (const comp of components) {\n const desc = localize(comp.description, comp.descriptionZh, lang);\n lines.push(`- **${comp.name}** — ${desc}`);\n }\n lines.push('');\n }\n console.log(lines.join('\\n'));\n return;\n }\n\n // Text format\n const headers = ['Component', 'Category', 'Description'];\n const rows = store.components.map((c) => [\n c.name,\n localize(c.category, c.categoryZh, lang),\n localize(c.description, c.descriptionZh, lang),\n ]);\n console.log(formatTable(headers, rows, 'text'));\n });\n}\n","import type { CLIError } from '../types.js';\n\nexport const ErrorCodes = {\n COMPONENT_NOT_FOUND: 'COMPONENT_NOT_FOUND',\n VERSION_NOT_FOUND: 'VERSION_NOT_FOUND',\n NO_PROJECT_DETECTED: 'NO_PROJECT_DETECTED',\n METADATA_FETCH_FAILED: 'METADATA_FETCH_FAILED',\n UNSUPPORTED_VERSION_FEATURE: 'UNSUPPORTED_VERSION_FEATURE',\n DEMO_NOT_FOUND: 'DEMO_NOT_FOUND',\n INVALID_ARGUMENT: 'INVALID_ARGUMENT',\n} as const;\n\nexport function createError(code: string, message: string, suggestion?: string): CLIError {\n return { error: true, code, message, suggestion };\n}\n\nexport function printError(err: CLIError, format: string): void {\n if (format === 'json') {\n console.error(JSON.stringify(err, null, 2));\n } else {\n console.error(`Error: ${err.message}`);\n if (err.suggestion) {\n console.error(`Suggestion: ${err.suggestion}`);\n }\n }\n}\n\nexport function fuzzyMatch(input: string, candidates: string[]): string | undefined {\n if (candidates.length === 0) return undefined;\n const lower = input.toLowerCase();\n\n // Exact match (case-insensitive)\n const exact = candidates.find((c) => c.toLowerCase() === lower);\n if (exact) return exact;\n\n // Prefix match\n const prefix = candidates.find((c) => c.toLowerCase().startsWith(lower));\n if (prefix) return prefix;\n\n // Contains match\n const contains = candidates.find((c) => c.toLowerCase().includes(lower));\n if (contains) return contains;\n\n // Levenshtein distance for close matches\n let best: string | undefined;\n let bestDist = Infinity;\n for (const candidate of candidates) {\n const dist = levenshtein(lower, candidate.toLowerCase());\n if (dist < bestDist && dist <= 3) {\n bestDist = dist;\n best = candidate;\n }\n }\n return best;\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { localize } from '../types.js';\nimport { loadMetadata, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info <component>')\n .description('Query component API: props, type definitions, default values')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const lang = opts.lang;\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadata(versionInfo.majorVersion);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const desc = localize(comp.description, comp.descriptionZh, lang);\n const whenToUse = localize(comp.whenToUse, comp.whenToUseZh, lang);\n\n if (opts.format === 'json') {\n if (opts.detail) {\n output(\n {\n name: comp.name,\n description: desc,\n whenToUse: whenToUse || '',\n props: comp.props.map((p) => ({\n ...p,\n description: localize(p.description, p.descriptionZh, lang),\n })),\n methods: comp.methods || [],\n related: comp.related || [],\n faq: comp.faq || [],\n },\n 'json',\n );\n } else {\n output(\n {\n name: comp.name,\n description: desc,\n props: comp.props.map((p) => ({\n name: p.name,\n type: p.type,\n default: p.default,\n })),\n },\n 'json',\n );\n }\n return;\n }\n\n // Text/markdown format\n console.log(`${comp.name} — ${desc}`);\n if (opts.detail && whenToUse) {\n console.log(`\\nWhen to use: ${whenToUse}`);\n }\n console.log('');\n\n const headers = opts.detail\n ? ['Property', 'Type', 'Default', 'Description']\n : ['Property', 'Type', 'Default'];\n\n const rows = comp.props.map((p) =>\n opts.detail\n ? [p.name, p.type, p.default, localize(p.description, p.descriptionZh, lang) || '-']\n : [p.name, p.type, p.default],\n );\n\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n\n if (opts.detail && comp.related && comp.related.length > 0) {\n console.log(`\\nRelated: ${comp.related.join(', ')}`);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadata, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport function registerDemoCommand(program: Command): void {\n program\n .command('demo <component> [name]')\n .description('Get demo source code for a component')\n .action((component: string, name?: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadata(versionInfo.majorVersion);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const demos = comp.demos || [];\n\n if (!name) {\n // List all demos\n if (opts.format === 'json') {\n output(\n {\n component: comp.name,\n demos: demos.map((d) => ({\n name: d.name,\n title: d.title,\n description: d.description,\n })),\n },\n 'json',\n );\n } else {\n console.log(`${comp.name} Demos:`);\n console.log('');\n for (const demo of demos) {\n console.log(` ${demo.name} — ${demo.title}`);\n console.log(` ${demo.description}`);\n }\n if (demos.length === 0) {\n console.log(' No demos available.');\n }\n }\n return;\n }\n\n // Find specific demo\n const demo = demos.find((d) => d.name.toLowerCase() === name.toLowerCase());\n if (!demo) {\n const demoNames = demos.map((d) => d.name);\n const suggestion = fuzzyMatch(name, demoNames);\n const err = createError(\n ErrorCodes.DEMO_NOT_FOUND,\n `Demo '${name}' not found for ${comp.name}`,\n suggestion\n ? `Did you mean '${suggestion}'?`\n : `Available demos: ${demoNames.join(', ') || 'none'}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (opts.format === 'json') {\n output(\n {\n component: comp.name,\n demo: demo.name,\n title: demo.title,\n description: demo.description,\n code: demo.code,\n },\n 'json',\n );\n } else {\n console.log(`${comp.name} / ${demo.title}`);\n console.log(`${demo.description}`);\n console.log('');\n console.log(demo.code);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadata, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport function registerTokenCommand(program: Command): void {\n program\n .command('token [component]')\n .description('Query Design Tokens (global or component-level)')\n .action((component?: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n\n if (versionInfo.majorVersion === 'v4') {\n const err = createError(\n ErrorCodes.UNSUPPORTED_VERSION_FEATURE,\n 'Design Token system is not available in antd v4',\n 'Upgrade to antd v5+ to use Design Tokens',\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const store = loadMetadata(versionInfo.majorVersion);\n\n if (!component) {\n const globalTokens = store.globalTokens || [];\n if (globalTokens.length === 0) {\n console.log('No global token data available.');\n return;\n }\n\n if (opts.format === 'json') {\n output({ tokens: globalTokens }, 'json');\n return;\n }\n\n console.log('Global Design Tokens:');\n console.log('');\n const headers = ['Token', 'Type', 'Default', 'Description'];\n const rows = globalTokens.map((t) => [t.name, t.type, t.default, t.description || '-']);\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n return;\n }\n\n const comp = findComponent(store, component);\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const tokens = comp.tokens || [];\n if (tokens.length === 0) {\n console.log(`No component tokens available for ${comp.name}.`);\n return;\n }\n\n if (opts.format === 'json') {\n output({ component: comp.name, tokens }, 'json');\n return;\n }\n\n console.log(`${comp.name} Component Tokens:`);\n console.log('');\n const headers = ['Token', 'Type', 'Default'];\n const rows = tokens.map((t) => [t.name, t.type, t.default]);\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadata, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport function registerSemanticCommand(program: Command): void {\n program\n .command('semantic <component>')\n .description('Query the semantic customization structure of a component')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadata(versionInfo.majorVersion);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const structure = comp.semanticStructure || [];\n if (structure.length === 0) {\n console.log(`No semantic structure data available for ${comp.name}.`);\n return;\n }\n\n if (opts.format === 'json') {\n output({ name: comp.name, semanticStructure: structure }, 'json');\n return;\n }\n\n console.log(`${comp.name} Semantic Structure:`);\n for (let i = 0; i < structure.length; i++) {\n const prefix = i === structure.length - 1 ? '└──' : '├──';\n console.log(`${prefix} ${structure[i].key} # ${structure[i].description}`);\n }\n console.log('');\n console.log('Usage:');\n console.log(` <${comp.name} classNames={{ ${structure[0]?.key}: 'my-${structure[0]?.key}' }} />`);\n console.log(` <${comp.name} styles={{ ${structure[0]?.key}: { background: '#fff' } }} />`);\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, ComponentData, PropData, ChangelogEntry } from '../types.js';\nimport { loadMetadata, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion, compare } from '../data/version.js';\nimport { output } from '../output/formatter.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\n\n// ── Changelog logic ──\n\nfunction parseVersionRange(version: string): { from: string; to: string } | { exact: string } {\n if (version.includes('..')) {\n const [from, to] = version.split('..');\n return { from, to };\n }\n return { exact: version };\n}\n\nfunction filterEntries(changelog: ChangelogEntry[], versionArg?: string): ChangelogEntry[] {\n if (!versionArg) return changelog.slice(0, 5);\n\n const parsed = parseVersionRange(versionArg);\n if ('exact' in parsed) {\n return changelog.filter((e) => e.version === parsed.exact);\n }\n return changelog.filter(\n (e) => compare(e.version, parsed.from) >= 0 && compare(e.version, parsed.to) <= 0,\n );\n}\n\nconst EMOJI_MAP: Record<string, string> = {\n feature: '🆕',\n fix: '🐞',\n style: '💄',\n deprecation: '🗑',\n breaking: '🔥',\n other: '🛠',\n};\n\nfunction printChangelog(entries: ChangelogEntry[], format: string, versionArg?: string): void {\n if (format === 'json') {\n output(versionArg ? entries : { latest: entries }, 'json');\n return;\n }\n for (const entry of entries) {\n console.log(`## ${entry.version} (${entry.date})`);\n console.log('');\n for (const change of entry.changes) {\n const emoji = EMOJI_MAP[change.type] || '•';\n console.log(` ${emoji} ${change.component} ${change.description}`);\n }\n console.log('');\n }\n}\n\n// ── API diff logic ──\n\ninterface PropDiff {\n name: string;\n type?: string;\n replacement?: string;\n change?: string;\n}\n\ninterface ComponentDiff {\n component: string;\n added: PropDiff[];\n removed: PropDiff[];\n changed: PropDiff[];\n}\n\nfunction toMajor(version: string): string {\n return `v${version.split('.')[0]}`;\n}\n\nfunction diffProps(\n oldProps: PropData[],\n newProps: PropData[],\n): { added: PropDiff[]; removed: PropDiff[]; changed: PropDiff[] } {\n const oldMap = new Map(oldProps.map((p) => [p.name, p]));\n const newMap = new Map(newProps.map((p) => [p.name, p]));\n\n const added: PropDiff[] = [];\n const removed: PropDiff[] = [];\n const changed: PropDiff[] = [];\n\n for (const [name, prop] of newMap) {\n if (!oldMap.has(name)) {\n added.push({ name, type: prop.type });\n } else {\n const oldProp = oldMap.get(name)!;\n if (oldProp.type !== prop.type) {\n changed.push({ name, change: `${oldProp.type} → ${prop.type}` });\n }\n }\n }\n\n for (const [name, prop] of oldMap) {\n if (!newMap.has(name)) {\n const possibleRename = [...newMap.values()].find(\n (p) => p.type === prop.type && !oldMap.has(p.name),\n );\n removed.push({ name, type: prop.type, replacement: possibleRename?.name });\n }\n }\n\n return { added, removed, changed };\n}\n\nfunction runApiDiff(\n v1: string,\n v2: string,\n component: string | undefined,\n opts: GlobalOptions,\n): void {\n const major1 = toMajor(v1);\n const major2 = toMajor(v2);\n const store1 = loadMetadata(major1);\n const store2 = loadMetadata(major2);\n\n if (store1.components.length === 0) {\n printError(createError(ErrorCodes.VERSION_NOT_FOUND, `No data available for version ${v1} (${major1})`), opts.format);\n process.exitCode = 1;\n return;\n }\n if (store2.components.length === 0) {\n printError(createError(ErrorCodes.VERSION_NOT_FOUND, `No data available for version ${v2} (${major2})`), opts.format);\n process.exitCode = 1;\n return;\n }\n\n const componentsToCompare: string[] = component\n ? [component]\n : [...new Set([...getAllComponentNames(store1), ...getAllComponentNames(store2)])];\n\n if (component) {\n const c1 = findComponent(store1, component);\n const c2 = findComponent(store2, component);\n if (!c1 && !c2) {\n const allNames = [...new Set([...getAllComponentNames(store1), ...getAllComponentNames(store2)])];\n const suggestion = fuzzyMatch(component, allNames);\n printError(\n createError(ErrorCodes.COMPONENT_NOT_FOUND, `Component '${component}' not found in either version`, suggestion ? `Did you mean '${suggestion}'?` : undefined),\n opts.format,\n );\n process.exitCode = 1;\n return;\n }\n }\n\n const diffs: ComponentDiff[] = [];\n for (const name of componentsToCompare) {\n const c1 = findComponent(store1, name);\n const c2 = findComponent(store2, name);\n\n if (!c1 && c2) {\n diffs.push({ component: name, added: c2.props.map((p) => ({ name: p.name, type: p.type })), removed: [], changed: [] });\n } else if (c1 && !c2) {\n diffs.push({ component: name, added: [], removed: c1.props.map((p) => ({ name: p.name, type: p.type })), changed: [] });\n } else if (c1 && c2) {\n const { added, removed, changed } = diffProps(c1.props, c2.props);\n if (added.length > 0 || removed.length > 0 || changed.length > 0) {\n diffs.push({ component: name, added, removed, changed });\n }\n }\n }\n\n if (opts.format === 'json') {\n const result = component && diffs.length > 0\n ? { from: v1, to: v2, ...diffs[0] }\n : { from: v1, to: v2, diffs };\n output(result, 'json');\n return;\n }\n\n if (diffs.length === 0) {\n console.log(`No API differences found between ${v1} and ${v2}.`);\n return;\n }\n\n console.log(`API Diff: ${v1} → ${v2}`);\n console.log('');\n for (const diff of diffs) {\n console.log(` ${diff.component}:`);\n for (const p of diff.added) console.log(` + ${p.name}: ${p.type}`);\n for (const p of diff.removed) {\n const note = p.replacement ? ` (replaced by ${p.replacement})` : '';\n console.log(` - ${p.name}: ${p.type}${note}`);\n }\n for (const p of diff.changed) console.log(` ~ ${p.name}: ${p.change}`);\n console.log('');\n }\n}\n\n// ── Command registration ──\n\nexport function registerChangelogCommand(program: Command): void {\n program\n .command('changelog [v1] [v2] [component]')\n .description('Query changelog or compare API differences between versions')\n .action((v1?: string, v2?: string, component?: string) => {\n const opts = program.opts<GlobalOptions>();\n\n // Determine mode:\n // antd diff → latest changelog\n // antd diff 5.21.0 → single version changelog\n // antd diff 5.20.0..5.22.0 → version range changelog\n // antd diff 5.20.0 5.22.0 → API diff between two versions\n // antd diff 5.20.0 5.22.0 Btn → API diff for specific component\n\n const isChangelogMode = !v2 || (v1 && v1.includes('..'));\n\n if (isChangelogMode) {\n // Changelog mode — infer major version from the version argument if not explicitly overridden\n // For ranges like \"6.1.0..6.3.0\", extract the left-hand version to determine major\n const v1ForDetect = v1?.includes('..') ? v1.split('..')[0] : v1;\n const versionForDetect = opts.version ?? (v1ForDetect && /^\\d+\\.\\d+\\.\\d+$/.test(v1ForDetect) ? v1ForDetect : undefined);\n const versionInfo = detectVersion(versionForDetect);\n const store = loadMetadata(versionInfo.majorVersion);\n const changelog = store.changelog || [];\n\n if (changelog.length === 0) {\n console.log('No changelog data available.');\n return;\n }\n\n const entries = filterEntries(changelog, v1);\n if (entries.length === 0) {\n const err = createError(\n ErrorCodes.VERSION_NOT_FOUND,\n `No changelog entries found for \"${v1}\"`,\n `Available versions: ${changelog.map((e) => e.version).join(', ')}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n printChangelog(entries, opts.format, v1);\n } else {\n // API diff mode — validate version order\n if (compare(v1!, v2!) > 0) {\n const err = createError(\n ErrorCodes.INVALID_ARGUMENT,\n `Version order is invalid: \"${v1}\" is newer than \"${v2}\"`,\n `Did you mean: antd changelog ${v2} ${v1}${component ? ' ' + component : ''}?`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n runApiDiff(v1!, v2!, component, opts);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { output } from '../output/formatter.js';\nimport { readJson } from '../utils/scan.js';\n\ninterface CheckResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n severity?: 'warning' | 'error';\n message: string;\n suggestion?: string;\n}\n\n/** Pre-read context shared across all checks to avoid repeated file I/O. */\ninterface DoctorContext {\n cwd: string;\n antdPkg: any | null;\n antdMajor: number;\n projectPkg: any | null;\n reactPkg: any | null;\n}\n\nfunction buildContext(cwd: string): DoctorContext {\n const antdPkg = readJson(join(cwd, 'node_modules', 'antd', 'package.json'));\n const antdMajor = antdPkg ? parseInt(antdPkg.version.split('.')[0], 10) : 0;\n const projectPkg = readJson(join(cwd, 'package.json'));\n const reactPkg = readJson(join(cwd, 'node_modules', 'react', 'package.json'));\n return { cwd, antdPkg, antdMajor, projectPkg, reactPkg };\n}\n\nfunction checkAntdInstalled(ctx: DoctorContext): CheckResult {\n if (!ctx.antdPkg) {\n return {\n name: 'antd-installed',\n status: 'fail',\n severity: 'error',\n message: 'antd is not installed in node_modules',\n suggestion: 'Run `npm install antd` or `yarn add antd`',\n };\n }\n return {\n name: 'antd-installed',\n status: 'pass',\n message: `antd ${ctx.antdPkg.version || 'unknown'} is installed`,\n };\n}\n\nfunction checkReactCompat(ctx: DoctorContext): CheckResult {\n if (!ctx.antdPkg || !ctx.reactPkg) {\n return {\n name: 'react-compat',\n status: 'warn',\n severity: 'warning',\n message: 'Cannot verify React compatibility — antd or react not found in node_modules',\n };\n }\n\n const reactMajor = parseInt(ctx.reactPkg.version.split('.')[0], 10);\n\n if (ctx.antdMajor >= 5 && reactMajor < 18) {\n return {\n name: 'react-compat',\n status: 'fail',\n severity: 'error',\n message: `React ${ctx.reactPkg.version} may not be compatible with antd ${ctx.antdPkg.version}`,\n suggestion: 'antd 5.x requires React 18+. Consider upgrading React.',\n };\n }\n\n return {\n name: 'react-compat',\n status: 'pass',\n message: `React ${ctx.reactPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\nfunction checkDuplicateInstall(ctx: DoctorContext): CheckResult {\n const versions: string[] = [];\n\n if (ctx.antdPkg?.version) versions.push(ctx.antdPkg.version);\n\n const nmDir = join(ctx.cwd, 'node_modules');\n try {\n const entries = readdirSync(nmDir);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === 'antd') continue;\n const nestedPkg = readJson(join(nmDir, entry, 'node_modules', 'antd', 'package.json'));\n if (nestedPkg?.version && !versions.includes(nestedPkg.version)) {\n versions.push(nestedPkg.version);\n }\n }\n } catch {\n // ignore read errors\n }\n\n if (versions.length > 1) {\n return {\n name: 'duplicate-install',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} antd installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your dependency tree',\n };\n }\n\n return {\n name: 'duplicate-install',\n status: 'pass',\n message: 'No duplicate antd installations detected',\n };\n}\n\nfunction checkThemeConfig(ctx: DoctorContext): CheckResult {\n if (ctx.antdMajor >= 5) {\n // Check for old Less variable customization (should not exist in v5+)\n const lessOverrides = readJson(join(ctx.cwd, 'theme', 'antd.less'));\n const modifyVars = ctx.projectPkg?.theme;\n if (lessOverrides !== null || modifyVars) {\n return {\n name: 'theme-config',\n status: 'warn',\n severity: 'warning',\n message: 'Found Less-based theme customization, but antd v5+ uses Design Tokens',\n suggestion: 'Migrate Less variables to ConfigProvider theme tokens. See https://ant.design/docs/react/migrate-less-variables',\n };\n }\n }\n\n return {\n name: 'theme-config',\n status: 'pass',\n message: 'No theme configuration issues detected',\n };\n}\n\nfunction checkBabelPlugins(ctx: DoctorContext): CheckResult {\n const babelConfigs = ['.babelrc', 'babel.config.js', 'babel.config.json'];\n\n let hasBabelPluginImport = false;\n\n for (const configName of babelConfigs) {\n try {\n const content = readFileSync(join(ctx.cwd, configName), 'utf-8');\n if (content.includes('babel-plugin-import') || content.includes('import, { libraryName')) {\n hasBabelPluginImport = true;\n break;\n }\n } catch { /* file doesn't exist or can't be read */ }\n }\n\n // Also check package.json babel config\n if (!hasBabelPluginImport && ctx.projectPkg?.babel) {\n const babelStr = JSON.stringify(ctx.projectPkg.babel);\n if (babelStr.includes('babel-plugin-import')) {\n hasBabelPluginImport = true;\n }\n }\n\n if (hasBabelPluginImport && ctx.antdMajor >= 5) {\n return {\n name: 'babel-plugin',\n status: 'warn',\n severity: 'warning',\n message: 'babel-plugin-import is configured but not needed for antd v5+',\n suggestion: 'antd v5+ supports tree-shaking natively. Remove babel-plugin-import for antd to reduce build complexity.',\n };\n }\n\n return {\n name: 'babel-plugin',\n status: 'pass',\n message: 'No problematic Babel/webpack antd plugins detected',\n };\n}\n\nfunction checkCssInJs(ctx: DoctorContext): CheckResult {\n const cssinjs = readJson(join(ctx.cwd, 'node_modules', '@ant-design', 'cssinjs', 'package.json'));\n if (!cssinjs) {\n return {\n name: 'cssinjs',\n status: 'warn',\n severity: 'warning',\n message: 'No @ant-design/cssinjs found, SSR style extraction will not work',\n suggestion: 'Install @ant-design/cssinjs if you need SSR support',\n };\n }\n return {\n name: 'cssinjs',\n status: 'pass',\n message: '@ant-design/cssinjs is installed',\n };\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose project-level antd configuration issues')\n .action(() => {\n const opts = program.opts<GlobalOptions>();\n const ctx = buildContext(process.cwd());\n\n const checks: CheckResult[] = [\n checkAntdInstalled(ctx),\n checkReactCompat(ctx),\n checkDuplicateInstall(ctx),\n checkThemeConfig(ctx),\n checkBabelPlugins(ctx),\n checkCssInJs(ctx),\n ];\n\n const summary = {\n pass: checks.filter((c) => c.status === 'pass').length,\n warn: checks.filter((c) => c.status === 'warn').length,\n fail: checks.filter((c) => c.status === 'fail').length,\n };\n\n if (opts.format === 'json') {\n output({ checks, summary }, 'json');\n return;\n }\n\n const ICONS = { pass: '✓', warn: '⚠', fail: '✗' };\n console.log('antd Doctor\\n');\n\n for (const check of checks) {\n const icon = ICONS[check.status];\n console.log(` ${icon} [${check.name}] ${check.message}`);\n if (check.suggestion) {\n console.log(` → ${check.suggestion}`);\n }\n }\n\n console.log('');\n console.log(`Summary: ${summary.pass} passed, ${summary.warn} warnings, ${summary.fail} failed`);\n });\n}\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname } from 'node:path';\n\nexport const SCAN_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);\nexport const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.umi']);\n\n/** Match: import { Button, Form } from 'antd' or 'antd/es/...' */\nexport const ANTD_IMPORT_RE = /import\\s+\\{([^}]+)\\}\\s+from\\s+['\"]antd(?:\\/[^'\"]*)?['\"]/g;\n\n/**\n * Recursively collect source files from a directory or return a single file.\n */\nexport function collectFiles(dir: string): string[] {\n const files: string[] = [];\n try {\n const stat = statSync(dir);\n if (stat.isFile()) return [dir];\n } catch {\n return [];\n }\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry.name)) continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath));\n } else if (SCAN_EXTENSIONS.has(extname(entry.name))) {\n files.push(fullPath);\n }\n }\n } catch {\n // ignore permission errors etc\n }\n return files;\n}\n\n/**\n * Extract antd component names from import statements in source code.\n */\nexport function parseAntdImports(content: string): string[] {\n const names: string[] = [];\n ANTD_IMPORT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = ANTD_IMPORT_RE.exec(content)) !== null) {\n const parsed = match[1].split(',').map((n) => n.trim()).filter(Boolean);\n names.push(...parsed);\n }\n return names;\n}\n\n/**\n * Read and parse a JSON file, returning null on failure.\n */\nexport function readJson(path: string): any | null {\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync } from 'node:fs';\nimport { output } from '../output/formatter.js';\nimport { collectFiles, parseAntdImports } from '../utils/scan.js';\n\ninterface ComponentUsage {\n name: string;\n imports: number;\n files: string[];\n subComponents?: Record<string, number>;\n}\n\n// Match: Form.Item, Table.Column etc\nconst SUB_COMPONENT_RE = /\\b(\\w+)\\.(\\w+)\\b/g;\n\nfunction scanFile(filePath: string): Map<string, { count: number; subComponents: Map<string, number> }> {\n const result = new Map<string, { count: number; subComponents: Map<string, number> }>();\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return result;\n }\n\n const importedNames = parseAntdImports(content);\n\n for (const name of importedNames) {\n if (!result.has(name)) {\n result.set(name, { count: 0, subComponents: new Map() });\n }\n result.get(name)!.count++;\n }\n\n // Find sub-component usage (e.g. Form.Item)\n SUB_COMPONENT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SUB_COMPONENT_RE.exec(content)) !== null) {\n const [, parent, child] = match;\n if (importedNames.includes(parent)) {\n const entry = result.get(parent)!;\n const subKey = `${parent}.${child}`;\n entry.subComponents.set(subKey, (entry.subComponents.get(subKey) || 0) + 1);\n }\n }\n\n return result;\n}\n\nexport function registerUsageCommand(program: Command): void {\n program\n .command('usage [dir]')\n .description('Scan project for antd component/API usage statistics')\n .action((dir?: string) => {\n const opts = program.opts<GlobalOptions>();\n const targetDir = dir || '.';\n\n const files = collectFiles(targetDir);\n const aggregated = new Map<string, { imports: number; files: Set<string>; subComponents: Map<string, number> }>();\n\n for (const file of files) {\n const fileUsage = scanFile(file);\n for (const [name, data] of fileUsage) {\n if (!aggregated.has(name)) {\n aggregated.set(name, { imports: 0, files: new Set(), subComponents: new Map() });\n }\n const agg = aggregated.get(name)!;\n agg.imports += data.count;\n agg.files.add(file);\n for (const [sub, count] of data.subComponents) {\n agg.subComponents.set(sub, (agg.subComponents.get(sub) || 0) + count);\n }\n }\n }\n\n const components: ComponentUsage[] = [...aggregated.entries()]\n .sort((a, b) => b[1].imports - a[1].imports)\n .map(([name, data]) => {\n const usage: ComponentUsage = {\n name,\n imports: data.imports,\n files: [...data.files],\n };\n if (data.subComponents.size > 0) {\n usage.subComponents = Object.fromEntries(data.subComponents);\n }\n return usage;\n });\n\n const totalImports = components.reduce((sum, c) => sum + c.imports, 0);\n\n if (opts.format === 'json') {\n output({\n scanned: files.length,\n components,\n summary: { totalComponents: components.length, totalImports },\n }, 'json');\n return;\n }\n\n console.log(`Scanned ${files.length} files in ${targetDir}\\n`);\n\n if (components.length === 0) {\n console.log('No antd imports found.');\n return;\n }\n\n for (const comp of components) {\n console.log(` ${comp.name} — ${comp.imports} imports across ${comp.files.length} files`);\n if (comp.subComponents) {\n for (const [sub, count] of Object.entries(comp.subComponents)) {\n console.log(` ${sub}: ${count} usages`);\n }\n }\n }\n\n console.log(`\\nTotal: ${components.length} components, ${totalImports} imports`);\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync } from 'node:fs';\nimport { loadMetadata } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { output } from '../output/formatter.js';\nimport { collectFiles, parseAntdImports } from '../utils/scan.js';\n\ninterface LintIssue {\n file: string;\n line: number;\n rule: string;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/** Escape special RegExp characters in a string. */\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n// Build a map of deprecated props from metadata\nfunction getDeprecatedProps(store: ReturnType<typeof loadMetadata>): Map<string, { prop: string; since: string; message: string }[]> {\n const result = new Map<string, { prop: string; since: string; message: string }[]>();\n for (const comp of store.components) {\n const deprecated = comp.props.filter((p) => p.deprecated);\n if (deprecated.length > 0) {\n result.set(comp.name, deprecated.map((p) => ({\n prop: p.name,\n since: typeof p.deprecated === 'string' ? p.deprecated : 'unknown',\n message: `\\`${p.name}\\` prop is deprecated${typeof p.deprecated === 'string' ? ` since ${p.deprecated}` : ''}`,\n })));\n }\n }\n return result;\n}\n\n/** Check if a pattern exists within `lookahead` lines starting from index `i`. */\nfunction hasNearbyMatch(lines: string[], i: number, lookahead: number, pattern: RegExp): boolean {\n const end = Math.min(i + lookahead, lines.length);\n for (let j = i; j < end; j++) {\n if (pattern.test(lines[j])) return true;\n }\n return false;\n}\n\nfunction lintFile(\n filePath: string,\n deprecatedMap: Map<string, { prop: string; since: string; message: string }[]>,\n only?: string,\n): LintIssue[] {\n const issues: LintIssue[] = [];\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n const lines = content.split('\\n');\n const importedComponents = parseAntdImports(content);\n\n if (importedComponents.length === 0) return [];\n\n // Build per-component deprecated prop regexes once\n const deprecatedChecks: { compName: string; dep: { prop: string; since: string; message: string }; regex: RegExp }[] = [];\n if (!only || only === 'deprecated') {\n for (const compName of importedComponents) {\n const deprecations = deprecatedMap.get(compName);\n if (!deprecations) continue;\n for (const dep of deprecations) {\n deprecatedChecks.push({ compName, dep, regex: new RegExp(`\\\\b${escapeRegExp(dep.prop)}\\\\b\\\\s*[=({]`) });\n }\n }\n }\n\n const hasImage = importedComponents.includes('Image');\n const hasTable = importedComponents.includes('Table');\n const hasSelect = importedComponents.includes('Select') || importedComponents.includes('TreeSelect');\n\n // Single pass over all lines\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Deprecated prop checks\n for (const { compName, dep, regex } of deprecatedChecks) {\n if (regex.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'deprecated',\n severity: 'warning',\n message: `${compName} ${dep.message}`,\n });\n }\n }\n\n // Best practice checks\n if (!only || only === 'best-practice') {\n if (/style\\s*=\\s*\\{\\{/.test(line) && importedComponents.some((c) => line.includes(`<${c}`))) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'best-practice',\n severity: 'warning',\n message: 'Consider using `classNames` / `styles` props or Design Tokens instead of inline styles',\n });\n }\n }\n\n // Accessibility checks\n if (!only || only === 'a11y') {\n if (hasImage && /<Image\\b/.test(line) && !hasNearbyMatch(lines, i, 5, /alt\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'a11y',\n severity: 'warning',\n message: 'Image component is missing `alt` prop for accessibility',\n });\n }\n\n if (/<\\w+Icon\\b/.test(line) && /onClick\\s*=/.test(line) && !hasNearbyMatch(lines, i, 3, /aria-label\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'a11y',\n severity: 'warning',\n message: 'Clickable icon should have `aria-label` for screen readers',\n });\n }\n\n if (/Form\\.Item\\b/.test(line) && !hasNearbyMatch(lines, i, 5, /(?:label|aria-label|noStyle)\\s*[=]/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'a11y',\n severity: 'warning',\n message: 'Form.Item should have a `label` prop for accessibility',\n });\n }\n }\n\n // Performance checks\n if (!only || only === 'performance') {\n if (hasTable && /<Table\\b/.test(line) && !hasNearbyMatch(lines, i, 10, /rowKey\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'performance',\n severity: 'warning',\n message: 'Table should have explicit `rowKey` prop for optimal rendering performance',\n });\n }\n\n if (hasSelect && /<(?:Select|TreeSelect)\\b/.test(line) && hasNearbyMatch(lines, i, 10, /virtual\\s*=\\s*\\{?\\s*false/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'performance',\n severity: 'warning',\n message: 'Disabling `virtual` scroll on Select may cause performance issues with large datasets',\n });\n }\n\n if (/import\\s+antd\\b/.test(line) || /import\\s+\\*\\s+as\\s+\\w+\\s+from\\s+['\"]antd['\"]/.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'performance',\n severity: 'error',\n message: 'Avoid wildcard import from antd. Use named imports: `import { Button } from \\'antd\\'`',\n });\n }\n }\n }\n\n return issues;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [target]')\n .description('Check antd usage against best practices')\n .option('--only <category>', 'Only check specific category (deprecated, a11y, performance, best-practice)')\n .action((target: string | undefined, cmdOpts: { only?: string }) => {\n const opts = program.opts<GlobalOptions>();\n const targetPath = target || '.';\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadata(versionInfo.majorVersion);\n const deprecatedMap = getDeprecatedProps(store);\n\n const files = collectFiles(targetPath);\n const allIssues: LintIssue[] = [];\n\n for (const file of files) {\n allIssues.push(...lintFile(file, deprecatedMap, cmdOpts.only));\n }\n\n const summary = {\n total: allIssues.length,\n deprecated: allIssues.filter((i) => i.rule === 'deprecated').length,\n a11y: allIssues.filter((i) => i.rule === 'a11y').length,\n performance: allIssues.filter((i) => i.rule === 'performance').length,\n 'best-practice': allIssues.filter((i) => i.rule === 'best-practice').length,\n };\n\n if (opts.format === 'json') {\n output({ issues: allIssues, summary }, 'json');\n return;\n }\n\n if (allIssues.length === 0) {\n console.log(`Scanned ${files.length} files. No issues found.`);\n return;\n }\n\n console.log(`Scanned ${files.length} files. Found ${allIssues.length} issues:\\n`);\n\n for (const issue of allIssues) {\n const icon = issue.severity === 'error' ? '✗' : '⚠';\n console.log(` ${icon} ${issue.file}:${issue.line} [${issue.rule}]`);\n console.log(` ${issue.message}`);\n }\n\n console.log(`\\nSummary: ${summary.deprecated} deprecated, ${summary.a11y} a11y, ${summary.performance} performance, ${summary['best-practice']} best-practice`);\n });\n}\n","import type { MigrationStep } from './migrate.js';\n\nexport const V4_TO_V5_STEPS: MigrationStep[] = [\n // Global changes\n {\n component: 'Global',\n breaking: true,\n description: 'Design token system replaces Less variables. All Less variable overrides must be migrated to CSS-in-JS tokens via ConfigProvider.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migrate-less-variables',\n migrationGuide: `1. Remove all Less variable overrides (modifyVars, less-loader theme config)\n2. Wrap your app with ConfigProvider and pass a theme object\n3. Map Less variables to Design Tokens (e.g. @primary-color → token.colorPrimary)\n4. Remove babel-plugin-import if present (v5 supports tree-shaking natively)`,\n before: `// webpack.config.js or .umirc.ts\ntheme: { '@primary-color': '#1890ff' }\n\n// or .less file\n@import '~antd/dist/antd.less';\n@primary-color: #1890ff;`,\n after: `import { ConfigProvider } from 'antd';\n<ConfigProvider theme={{ token: { colorPrimary: '#1890ff' } }}>\n <App />\n</ConfigProvider>`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'Component styles no longer include CSS reset. Wrap app with <App /> component to restore.',\n autoFixable: false,\n guide: 'https://ant.design/components/app',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Import App component from antd\n2. Wrap your root component with <App />\n3. Use App.useApp() hook to access message, notification, modal instances`,\n before: `import { Button } from 'antd';\n\nconst MyApp = () => <Button>Click</Button>;`,\n after: `import { App, Button } from 'antd';\n\nconst MyApp = () => (\n <App>\n <Button>Click</Button>\n </App>\n);`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'Moment.js replaced by Day.js. All date-related components (DatePicker, TimePicker, Calendar) now use Day.js.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s+moment\\\\s+from\\\\s+['\"]moment['\"]`,\n migrationGuide: `1. Replace moment imports with dayjs\n2. dayjs API is mostly compatible with moment\n3. If you need locale support, import dayjs locale separately\n4. If you need plugins (isBetween, etc.), import and extend dayjs`,\n before: `import moment from 'moment';\n<DatePicker value={moment('2024-01-01')} />`,\n after: `import dayjs from 'dayjs';\n<DatePicker value={dayjs('2024-01-01')} />`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'babel-plugin-import is no longer needed. antd v5 supports tree-shaking natively.',\n autoFixable: false,\n searchPattern: `babel-plugin-import`,\n migrationGuide: `1. Remove babel-plugin-import from babel config\n2. Remove related configuration in .babelrc, babel.config.js, or package.json\n3. Direct imports like \\`import { Button } from 'antd'\\` work without the plugin`,\n },\n {\n component: 'Global',\n breaking: true,\n description: '`antd/dist/antd.css` and `antd/dist/antd.less` removed. CSS-in-JS generates styles automatically.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s+['\"]antd/dist/antd\\\\.(css|less)['\"]`,\n migrationGuide: `Remove the global CSS/Less import. Styles are now injected via CSS-in-JS automatically.`,\n before: `import 'antd/dist/antd.css';\n// or\nimport 'antd/dist/antd.less';`,\n after: `// No global import needed — styles are auto-injected`,\n },\n\n // Prop renames (visible → open)\n {\n component: 'Modal',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Modal[^>]*\\\\bvisible\\\\b`,\n before: `<Modal visible={show} onCancel={onClose}>`,\n after: `<Modal open={show} onCancel={onClose}>`,\n migrationGuide: `Search for \\`<Modal\\` with \\`visible\\` prop and rename to \\`open\\`. Also applies to Modal.confirm, Modal.info, etc.`,\n },\n {\n component: 'Drawer',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Drawer[^>]*\\\\bvisible\\\\b`,\n before: `<Drawer visible={show} onClose={onClose}>`,\n after: `<Drawer open={show} onClose={onClose}>`,\n },\n {\n component: 'Tooltip',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Tooltip[^>]*\\\\bvisible\\\\b`,\n before: `<Tooltip visible={show}>`,\n after: `<Tooltip open={show}>`,\n },\n {\n component: 'Popover',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Popover[^>]*\\\\bvisible\\\\b`,\n before: `<Popover visible={show}>`,\n after: `<Popover open={show}>`,\n },\n {\n component: 'Popconfirm',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Popconfirm[^>]*\\\\bvisible\\\\b`,\n before: `<Popconfirm visible={show}>`,\n after: `<Popconfirm open={show}>`,\n },\n {\n component: 'Dropdown',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Dropdown[^>]*\\\\bvisible\\\\b`,\n before: `<Dropdown visible={show}>`,\n after: `<Dropdown open={show}>`,\n },\n {\n component: 'Tag',\n breaking: true,\n description: 'Prop `visible` removed. Use conditional rendering instead.',\n autoFixable: false,\n searchPattern: `<Tag[^>]*\\\\bvisible\\\\b`,\n before: `<Tag visible={show}>Tag</Tag>`,\n after: `{show && <Tag>Tag</Tag>}`,\n migrationGuide: `Replace \\`visible\\` prop with conditional rendering using \\`{condition && <Tag>...</Tag>}\\`.`,\n },\n\n // dropdownClassName → popupClassName\n {\n component: 'Select',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Select[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Select dropdownClassName=\"my-dropdown\" />`,\n after: `<Select popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'Select',\n breaking: true,\n description: 'Prop `dropdownMatchSelectWidth` renamed to `popupMatchSelectWidth`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Select[^>]*\\\\bdropdownMatchSelectWidth\\\\b`,\n before: `<Select dropdownMatchSelectWidth={false} />`,\n after: `<Select popupMatchSelectWidth={false} />`,\n },\n {\n component: 'TreeSelect',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<TreeSelect[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<TreeSelect dropdownClassName=\"my-dropdown\" />`,\n after: `<TreeSelect popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'Cascader',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Cascader[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Cascader dropdownClassName=\"my-dropdown\" />`,\n after: `<Cascader popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'AutoComplete',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<AutoComplete[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<AutoComplete dropdownClassName=\"my-dropdown\" />`,\n after: `<AutoComplete popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'DatePicker',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<DatePicker[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<DatePicker dropdownClassName=\"my-popup\" />`,\n after: `<DatePicker popupClassName=\"my-popup\" />`,\n },\n {\n component: 'TimePicker',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<TimePicker[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<TimePicker dropdownClassName=\"my-popup\" />`,\n after: `<TimePicker popupClassName=\"my-popup\" />`,\n },\n {\n component: 'Mentions',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Mentions[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Mentions dropdownClassName=\"my-dropdown\" />`,\n after: `<Mentions popupClassName=\"my-dropdown\" />`,\n },\n\n // Removed components\n {\n component: 'Comment',\n breaking: true,\n description: 'Removed from antd. Use @ant-design/compatible instead.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migration-v5',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bComment\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Install @ant-design/compatible: npm install @ant-design/compatible\n2. Change import from 'antd' to '@ant-design/compatible'`,\n before: `import { Comment } from 'antd';`,\n after: `import { Comment } from '@ant-design/compatible';`,\n },\n {\n component: 'PageHeader',\n breaking: true,\n description: 'Removed from antd. Use @ant-design/pro-components instead.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migration-v5',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bPageHeader\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Install @ant-design/pro-components: npm install @ant-design/pro-components\n2. Change import from 'antd' to '@ant-design/pro-components'`,\n before: `import { PageHeader } from 'antd';`,\n after: `import { PageHeader } from '@ant-design/pro-components';`,\n },\n {\n component: 'BackTop',\n breaking: true,\n description: 'Removed. Use FloatButton.BackTop instead.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bBackTop\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n before: `import { BackTop } from 'antd';\n<BackTop />`,\n after: `import { FloatButton } from 'antd';\n<FloatButton.BackTop />`,\n },\n\n // API changes\n {\n component: 'message',\n breaking: true,\n description: 'Static methods `message.xxx()` deprecated. Use `App.useApp()` hook instead for context support.',\n autoFixable: false,\n searchPattern: `\\\\bmessage\\\\.(success|error|warning|info|loading|open)\\\\(`,\n migrationGuide: `1. Wrap app with <App /> component\n2. Use const { message } = App.useApp(); in functional components\n3. Replace static message.xxx() calls with the hook-provided instance`,\n before: `import { message } from 'antd';\nmessage.success('Done!');`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { message } = App.useApp();\n message.success('Done!');\n};`,\n },\n {\n component: 'notification',\n breaking: true,\n description: 'Static methods `notification.xxx()` deprecated. Use `App.useApp()` hook instead.',\n autoFixable: false,\n searchPattern: `\\\\bnotification\\\\.(success|error|warning|info|open)\\\\(`,\n migrationGuide: `Same pattern as message — use App.useApp() to get notification instance.`,\n before: `import { notification } from 'antd';\nnotification.success({ message: 'Done!' });`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { notification } = App.useApp();\n notification.success({ message: 'Done!' });\n};`,\n },\n {\n component: 'Modal',\n breaking: true,\n description: 'Static methods `Modal.confirm()` etc. deprecated. Use `App.useApp()` hook instead.',\n autoFixable: false,\n searchPattern: `\\\\bModal\\\\.(confirm|info|success|error|warning)\\\\(`,\n migrationGuide: `Same pattern as message/notification — use App.useApp() to get modal instance.`,\n before: `import { Modal } from 'antd';\nModal.confirm({ title: 'Sure?' });`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { modal } = App.useApp();\n modal.confirm({ title: 'Sure?' });\n};`,\n },\n\n // Table\n {\n component: 'Table',\n breaking: true,\n description: 'Column `filterDropdown` render args changed. `confirm({ closeDropdown: false })` replaced by separate `close` function.',\n autoFixable: false,\n searchPattern: `filterDropdown.*closeDropdown`,\n migrationGuide: `Update filterDropdown render function signature to use the new \\`close\\` parameter instead of \\`confirm({ closeDropdown: false })\\`.`,\n before: `filterDropdown: ({ confirm }) => (\n <Button onClick={() => confirm({ closeDropdown: false })}>Filter</Button>\n)`,\n after: `filterDropdown: ({ confirm, close }) => (\n <Button onClick={() => close()}>Filter</Button>\n)`,\n },\n\n // Form\n {\n component: 'Form',\n breaking: false,\n description: 'Prop `labelCol` and `wrapperCol` can now be set globally via ConfigProvider.',\n autoFixable: false,\n migrationGuide: `Optional improvement: move repeated labelCol/wrapperCol config to ConfigProvider for consistency.`,\n },\n\n // Slider\n {\n component: 'Slider',\n breaking: true,\n description: 'Tooltip-related APIs converged into `tooltip` property. `tooltipVisible` → `tooltip.open`, `tipFormatter` → `tooltip.formatter`, etc.',\n autoFixable: false,\n searchPattern: `<Slider[^>]*\\\\b(tooltipVisible|tipFormatter|tooltipPlacement|getTooltipPopupContainer)\\\\b`,\n before: `<Slider tooltipVisible={show} tipFormatter={(v) => \\`\\${v}%\\`} />`,\n after: `<Slider tooltip={{ open: show, formatter: (v) => \\`\\${v}%\\` }} />`,\n migrationGuide: `Migrate Slider tooltip props:\n- tooltipVisible → tooltip.open\n- tipFormatter → tooltip.formatter\n- tooltipPlacement → tooltip.placement\n- getTooltipPopupContainer → tooltip.getPopupContainer`,\n },\n\n // Table filterDropdownVisible\n {\n component: 'Table',\n breaking: true,\n description: 'Column prop `filterDropdownVisible` renamed to `filterDropdownOpen`.',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `filterDropdownVisible`,\n before: `{ title: 'Name', dataIndex: 'name', filterDropdownVisible: visible }`,\n after: `{ title: 'Name', dataIndex: 'name', filterDropdownOpen: visible }`,\n migrationGuide: `Search for \\`filterDropdownVisible\\` in Table column definitions and rename to \\`filterDropdownOpen\\`.`,\n },\n\n // Drawer style/className migration\n {\n component: 'Drawer',\n breaking: true,\n description: 'Drawer `style` and `className` now apply to the panel node. Use `rootStyle` and `rootClassName` for the wrapper.',\n autoFixable: false,\n searchPattern: `<Drawer[^>]*\\\\b(style|className)\\\\s*=`,\n migrationGuide: `In v5, Drawer \\`style\\` and \\`className\\` are migrated to the Drawer panel node.\nIf you were using them to style the wrapper/mask, replace with \\`rootStyle\\` and \\`rootClassName\\`.`,\n before: `<Drawer className=\"my-drawer\" style={{ zIndex: 1000 }}>`,\n after: `<Drawer rootClassName=\"my-drawer\" rootStyle={{ zIndex: 1000 }}>`,\n },\n\n // Notification close → destroy\n {\n component: 'notification',\n breaking: true,\n description: 'Static method `notification.close()` renamed to `notification.destroy()`. Static config options restricted.',\n autoFixable: false,\n searchPattern: `\\\\bnotification\\\\.close\\\\(`,\n before: `notification.close(key);`,\n after: `notification.destroy(key);`,\n migrationGuide: `1. Rename notification.close() to notification.destroy()\n2. Static methods no longer allow dynamic prefixCls, maxCount, top, bottom, getContainer in open()\n3. Use useNotification hook if you need different configurations`,\n },\n\n // message.warn removed\n {\n component: 'message',\n breaking: true,\n description: '`message.warn()` completely removed. Use `message.warning()` instead.',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `\\\\bmessage\\\\.warn\\\\(`,\n before: `message.warn('Something went wrong');`,\n after: `message.warning('Something went wrong');`,\n migrationGuide: `Search for \\`message.warn(\\` and replace with \\`message.warning(\\`.`,\n },\n\n // IE not supported\n {\n component: 'Global',\n breaking: true,\n description: 'IE browser is no longer supported. v5 uses CSS-in-JS and modern CSS features.',\n autoFixable: false,\n migrationGuide: `If your project needs IE support, you cannot upgrade to v5. Consider using @ant-design/cssinjs StyleProvider for :where selector compatibility with older browsers.`,\n },\n];\n","import type { MigrationStep } from './migrate.js';\n\nexport const V5_TO_V6_STEPS: MigrationStep[] = [\n // ─── Global / Environment ───────────────────────────────────────────────────\n\n {\n component: 'Global',\n breaking: true,\n description: 'React >= 18 required. React 17 and earlier are no longer supported.',\n autoFixable: false,\n migrationGuide: `1. Upgrade React to 18 or above\n2. Remove @ant-design/v5-patch-for-react-19 if present (no longer needed)`,\n searchPattern: `@ant-design/v5-patch-for-react-19`,\n before: `import '@ant-design/v5-patch-for-react-19';`,\n after: `// Remove this import — no longer needed in v6`,\n },\n {\n component: 'Global',\n breaking: true,\n description: '@ant-design/icons must be upgraded to v6. Icons v6 is not compatible with antd v5.',\n autoFixable: false,\n migrationGuide: `1. Run: npm install @ant-design/icons@6\n2. @ant-design/icons@6 is NOT compatible with antd@5 — upgrade both together\n3. If build errors occur, verify icon package version matches antd version`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'CSS variables enabled by default. Only modern browsers supported, IE is not supported.',\n autoFixable: false,\n migrationGuide: `Verify your target browsers support CSS variables. IE and some older domestic browsers may have issues.`,\n },\n {\n component: 'Global',\n breaking: false,\n description: 'DOM structure of many components optimized. Custom styles targeting internal DOM nodes may need adjustment.',\n autoFixable: false,\n migrationGuide: `If your project has CSS that targets component internal DOM nodes (specific selectors or hierarchy), inspect and adjust after upgrading.`,\n },\n\n // ─── Button ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `type` split into `color` and `variant` for styling. `type=\"primary\"` → `color=\"primary\" variant=\"solid\"`.',\n autoFixable: true,\n codemod: 'v6-type-to-variant',\n searchPattern: `<Button[^>]*\\\\btype\\\\s*=\\\\s*['\"](?:primary|dashed|link|text)['\"]`,\n migrationGuide: `Button type prop is decomposed:\n- type=\"primary\" → color=\"primary\" variant=\"solid\" (or just keep type=\"primary\" as alias)\n- type=\"dashed\" → variant=\"dashed\"\n- type=\"link\" → variant=\"link\"\n- type=\"text\" → variant=\"text\"\n- type=\"default\" → no change needed`,\n before: `<Button type=\"primary\">Submit</Button>\n<Button type=\"dashed\">Dashed</Button>\n<Button type=\"link\">Link</Button>\n<Button type=\"text\">Text</Button>`,\n after: `<Button color=\"primary\" variant=\"solid\">Submit</Button>\n<Button variant=\"dashed\">Dashed</Button>\n<Button variant=\"link\">Link</Button>\n<Button variant=\"text\">Text</Button>`,\n },\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `danger` removed. Use `color=\"danger\"` instead.',\n autoFixable: true,\n codemod: 'v6-danger-migration',\n searchPattern: `<Button[^>]*\\\\bdanger\\\\b`,\n before: `<Button danger>Delete</Button>\n<Button type=\"primary\" danger>Delete</Button>`,\n after: `<Button color=\"danger\">Delete</Button>\n<Button color=\"danger\" variant=\"solid\">Delete</Button>`,\n migrationGuide: `Search for all Button components with \\`danger\\` prop. Replace with \\`color=\"danger\"\\`. If the button also had \\`type=\"primary\"\\`, add \\`variant=\"solid\"\\`.`,\n },\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `ghost` removed. Use `variant=\"outlined\"` instead.',\n autoFixable: true,\n codemod: 'v6-ghost-migration',\n searchPattern: `<Button[^>]*\\\\bghost\\\\b`,\n before: `<Button ghost>Ghost</Button>\n<Button type=\"primary\" ghost>Ghost Primary</Button>`,\n after: `<Button variant=\"outlined\">Ghost</Button>\n<Button color=\"primary\" variant=\"outlined\">Ghost Primary</Button>`,\n migrationGuide: `Search for all Button components with \\`ghost\\` prop. Replace with \\`variant=\"outlined\"\\`. Preserve the color from the original \\`type\\` prop.`,\n },\n {\n component: 'Button',\n breaking: false,\n description: '`iconPosition` deprecated, use `iconPlacement` instead.',\n autoFixable: true,\n codemod: 'v6-props-changed-migration',\n searchPattern: `<Button[^>]*\\\\biconPosition\\\\b`,\n before: `<Button iconPosition=\"end\">Click</Button>`,\n after: `<Button iconPlacement=\"end\">Click</Button>`,\n },\n {\n component: 'Button.Group',\n breaking: false,\n description: '`Button.Group` deprecated, use `Space.Compact` instead.',\n autoFixable: false,\n searchPattern: `Button\\\\.Group`,\n before: `<Button.Group><Button>A</Button><Button>B</Button></Button.Group>`,\n after: `<Space.Compact><Button>A</Button><Button>B</Button></Space.Compact>`,\n },\n\n // ─── Alert ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Alert',\n breaking: false,\n description: '`closeText` deprecated → `closable.closeIcon`; `message` deprecated → `title`.',\n autoFixable: false,\n searchPattern: `<Alert[^>]*\\\\b(closeText|message)\\\\s*=`,\n migrationGuide: `- closeText=\"Close\" → closable={{ closeIcon: \"Close\" }}\n- message=\"Title\" → title=\"Title\"`,\n },\n\n // ─── Anchor ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Anchor',\n breaking: false,\n description: '`Anchor` children usage deprecated, use `items` prop instead.',\n autoFixable: false,\n searchPattern: `<Anchor>\\\\s*<Anchor\\\\.Link`,\n migrationGuide: `Replace Anchor children with items prop array.`,\n },\n\n // ─── AutoComplete ───────────────────────────────────────────────────────────\n\n {\n component: 'AutoComplete',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownMatchSelectWidth` → `popupMatchSelectWidth`, `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `dataSource` → `options`.',\n autoFixable: false,\n searchPattern: `<AutoComplete[^>]*\\\\b(dropdownMatchSelectWidth|dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|dataSource)\\\\b`,\n migrationGuide: `- dropdownMatchSelectWidth → popupMatchSelectWidth\n- dropdownClassName / popupClassName → classNames.popup.root\n- dropdownStyle → styles.popup.root\n- dropdownRender → popupRender\n- onDropdownVisibleChange → onOpenChange\n- dataSource → options`,\n },\n\n // ─── Avatar.Group ───────────────────────────────────────────────────────────\n\n {\n component: 'Avatar.Group',\n breaking: false,\n description: '`maxCount`/`maxStyle`/`maxPopoverPlacement`/`maxPopoverTrigger` deprecated, use `max` prop object.',\n autoFixable: false,\n searchPattern: `<Avatar\\\\.Group[^>]*\\\\b(maxCount|maxStyle|maxPopoverPlacement|maxPopoverTrigger)\\\\b`,\n before: `<Avatar.Group maxCount={3} maxStyle={{ color: 'red' }}>`,\n after: `<Avatar.Group max={{ count: 3, style: { color: 'red' } }}>`,\n },\n\n // ─── Breadcrumb ─────────────────────────────────────────────────────────────\n\n {\n component: 'Breadcrumb',\n breaking: false,\n description: '`routes` deprecated → `items`; `Breadcrumb.Item` / `Breadcrumb.Separator` deprecated → `items`.',\n autoFixable: false,\n searchPattern: `(Breadcrumb\\\\.Item|Breadcrumb\\\\.Separator|<Breadcrumb[^>]*\\\\broutes\\\\b)`,\n migrationGuide: `Replace Breadcrumb children or routes prop with items array.`,\n },\n\n // ─── Calendar ───────────────────────────────────────────────────────────────\n\n {\n component: 'Calendar',\n breaking: false,\n description: '`dateFullCellRender`/`dateCellRender`/`monthFullCellRender`/`monthCellRender` deprecated → `fullCellRender`/`cellRender`.',\n autoFixable: false,\n searchPattern: `<Calendar[^>]*\\\\b(dateFullCellRender|dateCellRender|monthFullCellRender|monthCellRender)\\\\b`,\n },\n\n // ─── Card ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Card',\n breaking: false,\n description: '`headStyle` → `styles.header`; `bodyStyle` → `styles.body`; `bordered` → `variant`.',\n autoFixable: false,\n searchPattern: `<Card[^>]*\\\\b(headStyle|bodyStyle|bordered)\\\\b`,\n migrationGuide: `- headStyle → styles.header\n- bodyStyle → styles.body\n- bordered={false} → variant=\"borderless\"`,\n },\n\n // ─── Cascader ───────────────────────────────────────────────────────────────\n\n {\n component: 'Cascader',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `bordered` → `variant`, `onPopupVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<Cascader[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|dropdownMenuColumnStyle|onDropdownVisibleChange|onPopupVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Collapse ───────────────────────────────────────────────────────────────\n\n {\n component: 'Collapse',\n breaking: false,\n description: '`destroyInactivePanel` → `destroyOnHidden`; `expandIconPosition` → `expandIconPlacement`.',\n autoFixable: false,\n searchPattern: `<Collapse[^>]*\\\\b(destroyInactivePanel|expandIconPosition)\\\\b`,\n },\n\n // ─── DatePicker ─────────────────────────────────────────────────────────────\n\n {\n component: 'DatePicker',\n breaking: false,\n description: 'Multiple deprecated props: `popupClassName` → `classNames.popup.root`, `bordered` → `variant`, `onSelect` → `onCalendarChange`.',\n autoFixable: false,\n searchPattern: `<(DatePicker|RangePicker)[^>]*\\\\b(dropdownClassName|popupClassName|popupStyle|bordered|onSelect)\\\\b`,\n },\n\n // ─── Descriptions ──────────────────────────────────────────────────────────\n\n {\n component: 'Descriptions',\n breaking: false,\n description: '`labelStyle` → `styles.label`; `contentStyle` → `styles.content`.',\n autoFixable: false,\n searchPattern: `<Descriptions[^>]*\\\\b(labelStyle|contentStyle)\\\\b`,\n },\n\n // ─── Divider ────────────────────────────────────────────────────────────────\n\n {\n component: 'Divider',\n breaking: false,\n description: '`type` deprecated → `orientation`; `orientationMargin` → `styles.content.margin`.',\n autoFixable: false,\n searchPattern: `<Divider[^>]*\\\\b(type\\\\s*=|orientationMargin)\\\\b`,\n },\n\n // ─── Drawer ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Drawer',\n breaking: false,\n description: 'Style props deprecated: `headerStyle`/`bodyStyle`/`footerStyle`/`maskStyle`/`drawerStyle`/`contentWrapperStyle` → `styles.*`; `width`/`height` → `size`; `destroyInactivePanel` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Drawer[^>]*\\\\b(headerStyle|bodyStyle|footerStyle|contentWrapperStyle|maskStyle|drawerStyle|destroyInactivePanel)\\\\b`,\n migrationGuide: `- headerStyle → styles.header\n- bodyStyle → styles.body\n- footerStyle → styles.footer\n- contentWrapperStyle → styles.wrapper\n- maskStyle → styles.mask\n- drawerStyle → styles.section\n- width/height → size\n- destroyInactivePanel → destroyOnHidden`,\n },\n\n // ─── Dropdown ───────────────────────────────────────────────────────────────\n\n {\n component: 'Dropdown',\n breaking: false,\n description: '`overlayClassName` → `classNames.root`; `overlayStyle` → `styles.root`; `destroyPopupOnHide` → `destroyOnHidden`. `Dropdown.Button` deprecated → `Space.Compact + Dropdown + Button`.',\n autoFixable: false,\n searchPattern: `(Dropdown\\\\.Button|<Dropdown[^>]*\\\\b(overlayClassName|overlayStyle|destroyPopupOnHide|dropdownRender)\\\\b)`,\n },\n\n // ─── Form ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Form',\n breaking: true,\n description: '`onFinish` no longer includes all Form.List data. Unregistered Form.Item fields are excluded.',\n autoFixable: false,\n migrationGuide: `In v5, Form.List was treated as a single Field, causing onFinish to include all data.\nIn v6, only registered Form.Item fields are included.\nYou no longer need getFieldsValue({ strict: true }) to filter.`,\n before: `const onFinish = (values) => {\n const realValues = getFieldsValue({ strict: true });\n};`,\n after: `const onFinish = (values) => {\n const realValues = values; // Already filtered in v6\n};`,\n },\n\n // ─── Image ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Image',\n breaking: false,\n description: '`visible` → `open`; `onVisibleChange` → `onOpenChange`; `wrapperStyle` → `styles.root`; `maskClassName` → `classNames.cover`; `toolbarRender` → `actionsRender`.',\n autoFixable: false,\n searchPattern: `<Image[^>]*\\\\b(visible|onVisibleChange|wrapperStyle|maskClassName|rootClassName|toolbarRender)\\\\b`,\n },\n\n // ─── Input.Group ────────────────────────────────────────────────────────────\n\n {\n component: 'Input.Group',\n breaking: false,\n description: '`Input.Group` deprecated, use `Space.Compact` instead.',\n autoFixable: false,\n searchPattern: `Input\\\\.Group`,\n before: `<Input.Group compact><Input /><Input /></Input.Group>`,\n after: `<Space.Compact><Input /><Input /></Space.Compact>`,\n },\n\n // ─── Menu ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Menu',\n breaking: false,\n description: '`children` deprecated, use `items` prop instead.',\n autoFixable: false,\n searchPattern: `<Menu>\\\\s*<Menu\\\\.Item`,\n },\n\n // ─── Modal ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Modal',\n breaking: false,\n description: '`bodyStyle` → `styles.body`; `maskStyle` → `styles.mask`; `destroyOnClose` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Modal[^>]*\\\\b(bodyStyle|maskStyle|destroyOnClose)\\\\b`,\n },\n\n // ─── Notification ──────────────────────────────────────────────────────────\n\n {\n component: 'notification',\n breaking: false,\n description: '`btn` deprecated → `actions`; `message` deprecated → `title`.',\n autoFixable: false,\n searchPattern: `notification\\\\.(open|success|error|info|warning)\\\\(\\\\{[^}]*(\\\\bbtn\\\\b|\\\\bmessage\\\\b)`,\n },\n\n // ─── Progress ───────────────────────────────────────────────────────────────\n\n {\n component: 'Progress',\n breaking: false,\n description: '`strokeWidth`/`width` → `size`; `trailColor` → `railColor`; `gapPosition` → `gapPlacement`.',\n autoFixable: false,\n searchPattern: `<Progress[^>]*\\\\b(strokeWidth|trailColor|gapPosition)\\\\b`,\n },\n\n // ─── Select ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Select',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `bordered` → `variant`, `onDropdownVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<Select[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Slider ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Slider',\n breaking: false,\n description: 'Tooltip props deprecated: `tooltipPrefixCls` → `tooltip.prefixCls`, `tipFormatter` → `tooltip.formatter`, `tooltipVisible` → `tooltip.open`, `tooltipPlacement` → `tooltip.placement`.',\n autoFixable: false,\n searchPattern: `<Slider[^>]*\\\\b(tooltipPrefixCls|tipFormatter|tooltipVisible|tooltipPlacement|getTooltipPopupContainer)\\\\b`,\n },\n\n // ─── Space ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Space',\n breaking: false,\n description: '`direction` → `orientation`; `split` → `separator`.',\n autoFixable: false,\n searchPattern: `<Space[^>]*\\\\b(direction|split)\\\\s*=`,\n },\n\n // ─── Steps ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Steps',\n breaking: false,\n description: '`labelPlacement` → `titlePlacement`; `progressDot` → `type=\"dot\"`; `direction` → `orientation`; `items.description` → `items.content`.',\n autoFixable: false,\n searchPattern: `<Steps[^>]*\\\\b(labelPlacement|progressDot|direction)\\\\b`,\n },\n\n // ─── Table ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Table',\n breaking: false,\n description: '`pagination.position` → `pagination.placement`; `filterDropdownOpen` → `filterDropdownProps.open`; `onFilterDropdownOpenChange` → `filterDropdownProps.onOpenChange`.',\n autoFixable: false,\n searchPattern: `(filterDropdownOpen|onFilterDropdownOpenChange|filterCheckall)`,\n },\n\n // ─── Tabs ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Tabs',\n breaking: false,\n description: '`tabPosition` → `tabPlacement`; `destroyInactiveTabPane` → `destroyOnHidden`; `Tabs.TabPane` deprecated → `items`.',\n autoFixable: false,\n searchPattern: `(Tabs\\\\.TabPane|<Tabs[^>]*\\\\b(tabPosition|destroyInactiveTabPane)\\\\b)`,\n },\n\n // ─── Tag ────────────────────────────────────────────────────────────────────\n\n {\n component: 'Tag',\n breaking: true,\n description: 'Default trailing margin removed. `bordered={false}` → `variant=\"filled\"`; `color=\"xxx-inverse\"` → `variant=\"solid\"`.',\n autoFixable: false,\n searchPattern: `<Tag[^>]*\\\\b(bordered|color\\\\s*=\\\\s*['\"][^'\"]*-inverse)`,\n migrationGuide: `- Tag trailing margin removed. Add margin via ConfigProvider tag.styles if needed.\n- bordered={false} → variant=\"filled\"\n- color=\"xxx-inverse\" → variant=\"solid\"`,\n },\n\n // ─── Timeline ───────────────────────────────────────────────────────────────\n\n {\n component: 'Timeline',\n breaking: false,\n description: '`Timeline.Item` deprecated → `items`; `pending`/`pendingDot` deprecated → `items`; `mode=left|right` → `mode=start|end`.',\n autoFixable: false,\n searchPattern: `(Timeline\\\\.Item|<Timeline[^>]*\\\\b(pending|pendingDot|mode\\\\s*=\\\\s*['\"](?:left|right))\\\\b)`,\n },\n\n // ─── Tooltip ────────────────────────────────────────────────────────────────\n\n {\n component: 'Tooltip',\n breaking: false,\n description: '`overlayStyle` → `styles.root`; `overlayInnerStyle` → `styles.container`; `overlayClassName` → `classNames.root`; `destroyTooltipOnHide` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Tooltip[^>]*\\\\b(overlayStyle|overlayInnerStyle|overlayClassName|destroyTooltipOnHide)\\\\b`,\n },\n\n // ─── Transfer ───────────────────────────────────────────────────────────────\n\n {\n component: 'Transfer',\n breaking: false,\n description: '`listStyle` → `styles.section`; `operationStyle` → `styles.actions`; `operations` → `actions`.',\n autoFixable: false,\n searchPattern: `<Transfer[^>]*\\\\b(listStyle|operationStyle|operations)\\\\b`,\n },\n\n // ─── TreeSelect ─────────────────────────────────────────────────────────────\n\n {\n component: 'TreeSelect',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `bordered` → `variant`, `onDropdownVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<TreeSelect[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Overlay: Modal, Drawer mask blur ──────────────────────────────────────\n\n {\n component: 'Global',\n breaking: false,\n description: 'Modal/Drawer mask blur enabled by default. Disable via ConfigProvider if undesired.',\n autoFixable: false,\n migrationGuide: `If you don't want the mask blur effect:\n<ConfigProvider modal={{ mask: { blur: false } }} drawer={{ mask: { blur: false } }}>\n <App />\n</ConfigProvider>`,\n },\n];\n","import type { Command } from 'commander';\nimport type { GlobalOptions, OutputFormat } from '../types.js';\nimport { output } from '../output/formatter.js';\nimport { printError, createError, ErrorCodes } from '../output/error.js';\nimport { V4_TO_V5_STEPS } from './migrate-v4-to-v5.js';\nimport { V5_TO_V6_STEPS } from './migrate-v5-to-v6.js';\n\nexport interface MigrationStep {\n component: string;\n breaking: boolean;\n description: string;\n autoFixable: boolean;\n codemod?: string;\n guide?: string;\n /** Pattern to search for in source files (regex string) */\n searchPattern?: string;\n /** Before/after code examples for agents */\n before?: string;\n after?: string;\n /** Detailed migration instructions for agents */\n migrationGuide?: string;\n}\n\n// ─── Migration Guide Registry ────────────────────────────────────────────────\n\nconst MIGRATION_GUIDES: Record<string, MigrationStep[]> = {\n '4-5': V4_TO_V5_STEPS,\n '5-6': V5_TO_V6_STEPS,\n};\n\n// ─── Output Formatters ──────────────────────────────────────────────────────\n\nfunction formatText(from: string, to: string, steps: MigrationStep[]): void {\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n\n console.log(`Migration Guide: v${from} → v${to}\\n`);\n\n // Group by component\n const grouped = groupByComponent(steps);\n for (const [comp, compSteps] of grouped) {\n console.log(` ${comp}:`);\n for (const step of compSteps) {\n const icon = step.autoFixable ? '🔧' : '📝';\n const breaking = step.breaking ? ' [BREAKING]' : '';\n console.log(` ${icon}${breaking} ${step.description}`);\n if (step.guide) console.log(` Guide: ${step.guide}`);\n }\n console.log('');\n }\n\n console.log(`Total: ${steps.length} steps (${autoFixable} auto-fixable, ${manual} manual)`);\n}\n\nfunction formatMarkdown(from: string, to: string, steps: MigrationStep[]): void {\n const lines: string[] = [];\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n\n lines.push(`# Migration Guide: antd v${from} → v${to}`);\n lines.push('');\n lines.push(`> ${steps.length} total steps: ${autoFixable} auto-fixable, ${manual} manual`);\n lines.push('');\n\n const grouped = groupByComponent(steps);\n for (const [comp, compSteps] of grouped) {\n lines.push(`## ${comp}`);\n lines.push('');\n for (const step of compSteps) {\n const badge = step.breaking ? '**BREAKING**' : 'non-breaking';\n const fix = step.autoFixable ? '🔧 auto-fixable' : '📝 manual';\n lines.push(`### ${step.description}`);\n lines.push('');\n lines.push(`${badge} | ${fix}`);\n lines.push('');\n\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n\n if (step.searchPattern) {\n lines.push(`**Search pattern:** \\`${step.searchPattern}\\``);\n lines.push('');\n }\n\n if (step.guide) {\n lines.push(`**Reference:** ${step.guide}`);\n lines.push('');\n }\n }\n }\n\n console.log(lines.join('\\n'));\n}\n\nfunction formatJson(from: string, to: string, steps: MigrationStep[]): void {\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n output({\n from,\n to,\n steps,\n summary: { total: steps.length, autoFixable, manual },\n }, 'json');\n}\n\nfunction formatApplyPrompt(from: string, to: string, steps: MigrationStep[], dir: string, format: OutputFormat): void {\n const fixableSteps = steps.filter((s) => s.autoFixable && s.searchPattern);\n const manualSteps = steps.filter((s) => !s.autoFixable);\n\n if (format === 'json') {\n output({\n from,\n to,\n targetDir: dir,\n autoFixSteps: fixableSteps.map((s) => ({\n component: s.component,\n description: s.description,\n searchPattern: s.searchPattern,\n before: s.before,\n after: s.after,\n migrationGuide: s.migrationGuide,\n })),\n manualSteps: manualSteps.map((s) => ({\n component: s.component,\n description: s.description,\n guide: s.guide,\n migrationGuide: s.migrationGuide,\n before: s.before,\n after: s.after,\n })),\n summary: {\n totalAutoFix: fixableSteps.length,\n totalManual: manualSteps.length,\n },\n }, 'json');\n return;\n }\n\n const lines: string[] = [];\n lines.push(`# Auto-Migration Prompt: antd v${from} → v${to}`);\n lines.push(`# Target directory: ${dir}`);\n lines.push('');\n lines.push('## Instructions for Code Agent');\n lines.push('');\n lines.push(`Scan all .ts/.tsx/.js/.jsx files in \\`${dir}\\` and apply the following migrations.`);\n lines.push('For each file changed, verify the fix compiles correctly before moving on.');\n lines.push('');\n\n if (fixableSteps.length > 0) {\n lines.push('## Auto-fixable Changes');\n lines.push('');\n for (let i = 0; i < fixableSteps.length; i++) {\n const step = fixableSteps[i];\n lines.push(`### ${i + 1}. ${step.component}: ${step.description}`);\n lines.push('');\n if (step.searchPattern) {\n lines.push(`**Search regex:** \\`${step.searchPattern}\\``);\n lines.push('');\n }\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n }\n }\n\n if (manualSteps.length > 0) {\n lines.push('## Manual Changes (require human review)');\n lines.push('');\n for (let i = 0; i < manualSteps.length; i++) {\n const step = manualSteps[i];\n lines.push(`### ${i + 1}. ${step.component}: ${step.description}`);\n lines.push('');\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n if (step.guide) {\n lines.push(`**Reference:** ${step.guide}`);\n lines.push('');\n }\n }\n }\n\n console.log(lines.join('\\n'));\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction groupByComponent(steps: MigrationStep[]): Map<string, MigrationStep[]> {\n const map = new Map<string, MigrationStep[]>();\n for (const step of steps) {\n const arr = map.get(step.component) || [];\n arr.push(step);\n map.set(step.component, arr);\n }\n return map;\n}\n\n// ─── Command Registration ────────────────────────────────────────────────────\n\nexport function registerMigrateCommand(program: Command): void {\n program\n .command('migrate <from> <to>')\n .description('Version migration guide with optional auto-fix')\n .option('--component <name>', 'Component-specific migration guide')\n .option('--apply <dir>', 'Generate migration prompts for scanning a directory')\n .option('--confirm', 'Confirm auto-fix (required with --apply)')\n .action((from: string, to: string, cmdOpts: { component?: string; apply?: string; confirm?: boolean }) => {\n const opts = program.opts<GlobalOptions>();\n const key = `${from}-${to}`;\n let steps = MIGRATION_GUIDES[key];\n\n if (!steps) {\n const err = createError(\n ErrorCodes.INVALID_ARGUMENT,\n `No migration guide available for v${from} → v${to}`,\n `Available migrations: ${Object.keys(MIGRATION_GUIDES).map((k) => `v${k.replace('-', ' → v')}`).join(', ')}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (cmdOpts.component) {\n steps = steps.filter((s) => s.component.toLowerCase() === cmdOpts.component!.toLowerCase());\n if (steps.length === 0) {\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `No migration steps found for ${cmdOpts.component} from v${from} to v${to}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n }\n\n // --apply mode: generate agent-consumable migration prompt\n if (cmdOpts.apply) {\n formatApplyPrompt(from, to, steps, cmdOpts.apply, opts.format);\n return;\n }\n\n // Standard guide output\n switch (opts.format) {\n case 'json':\n formatJson(from, to, steps);\n break;\n case 'markdown':\n formatMarkdown(from, to, steps);\n break;\n case 'text':\n default:\n formatText(from, to, steps);\n break;\n }\n });\n}\n"],"mappings":"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","names":["readFileSync","existsSync","join","headerLine","separator","bodyLines","program","program","program","demo","program","headers","rows","program","toMajor","program","readFileSync","readdirSync","join","readFileSync","join","join","readdirSync","readFileSync","program","readFileSync","readFileSync","program","readFileSync","readFileSync","program","program"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@ant-design/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for querying antd knowledge and analyzing antd usage in projects",
5
+ "type": "module",
6
+ "bin": {
7
+ "antd": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": [
11
+ "dist",
12
+ "data"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsup",
16
+ "dev": "tsup --watch",
17
+ "start": "node dist/index.js",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "typecheck": "tsc --noEmit",
21
+ "extract": "tsx scripts/extract.ts",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "engines": {
25
+ "node": ">=18.0.0"
26
+ },
27
+ "keywords": [
28
+ "ant-design",
29
+ "antd",
30
+ "cli",
31
+ "component",
32
+ "react"
33
+ ],
34
+ "license": "MIT",
35
+ "homepage": "https://github.com/ant-design/ant-design-cli#readme",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/ant-design/ant-design-cli"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "dependencies": {
44
+ "commander": "~13.1.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^25.5.0",
48
+ "gray-matter": "^4.0.3",
49
+ "tsup": "^8.4.0",
50
+ "tsx": "^4.19.0",
51
+ "typescript": "^5.7.0",
52
+ "vitest": "^3.0.0"
53
+ }
54
+ }