@typestyles/migrate
Advanced tools
| #!/usr/bin/env node | ||
| import { parse } from '@babel/parser'; | ||
| import generate from '@babel/generator'; | ||
| import traverse from '@babel/traverse'; | ||
| import * as t2 from '@babel/types'; | ||
| import postcss from 'postcss'; | ||
| import { readFile, writeFile, mkdir, stat } from 'fs/promises'; | ||
| import { relative, dirname, resolve, extname } from 'path'; | ||
| import { createPatch } from 'diff'; | ||
| import fg from 'fast-glob'; | ||
| import picomatch from 'picomatch'; | ||
| function camelCaseProperty(property) { | ||
| return property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); | ||
| } | ||
| function toValueNode(value) { | ||
| const trimmed = value.trim(); | ||
| if (/^-?\d+(\.\d+)?$/.test(trimmed)) { | ||
| return t2.numericLiteral(Number(trimmed)); | ||
| } | ||
| return t2.stringLiteral(trimmed); | ||
| } | ||
| function toKeyNode(key) { | ||
| if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) { | ||
| return t2.identifier(key); | ||
| } | ||
| return t2.stringLiteral(key); | ||
| } | ||
| function nodesToObject(nodes, warnings) { | ||
| const properties = []; | ||
| for (const node of nodes ?? []) { | ||
| if (node.type === "decl") { | ||
| const normalized = node.prop.startsWith("--") ? node.prop : camelCaseProperty(node.prop); | ||
| properties.push(t2.objectProperty(toKeyNode(normalized), toValueNode(node.value))); | ||
| continue; | ||
| } | ||
| if (node.type === "rule") { | ||
| const nested = nodesToObject(node.nodes, warnings); | ||
| properties.push(t2.objectProperty(t2.stringLiteral(node.selector.trim()), nested)); | ||
| continue; | ||
| } | ||
| warnings.push({ | ||
| message: `Unsupported CSS node "${node.type}" skipped.` | ||
| }); | ||
| } | ||
| return t2.objectExpression(properties); | ||
| } | ||
| function cssToObjectExpression(cssText, warnings) { | ||
| try { | ||
| const root = postcss.parse(cssText); | ||
| return nodesToObject(root.nodes, warnings); | ||
| } catch (error) { | ||
| warnings.push({ | ||
| message: `Could not parse CSS template literal: ${error.message}` | ||
| }); | ||
| return null; | ||
| } | ||
| } | ||
| // src/transform.ts | ||
| function toKebabCase(input) { | ||
| return input.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase(); | ||
| } | ||
| function memberExpressionToJsxName(expression) { | ||
| if (t2.isIdentifier(expression)) { | ||
| return t2.jsxIdentifier(expression.name); | ||
| } | ||
| if (t2.isMemberExpression(expression) && !expression.computed) { | ||
| const left = memberExpressionToJsxName(expression.object); | ||
| const right = t2.isIdentifier(expression.property) ? t2.jsxIdentifier(expression.property.name) : null; | ||
| if (!left || !right) return null; | ||
| return t2.jsxMemberExpression(left, right); | ||
| } | ||
| return null; | ||
| } | ||
| function parseStyledTarget(tag, styledNames) { | ||
| if (t2.isMemberExpression(tag) && t2.isIdentifier(tag.object) && styledNames.has(tag.object.name) && t2.isIdentifier(tag.property)) { | ||
| return { kind: "intrinsic", jsxName: t2.jsxIdentifier(tag.property.name) }; | ||
| } | ||
| if (t2.isCallExpression(tag) && t2.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) { | ||
| const firstArg = tag.arguments[0]; | ||
| if (!firstArg || !t2.isExpression(firstArg)) return null; | ||
| const jsxName = memberExpressionToJsxName(firstArg); | ||
| if (!jsxName) return null; | ||
| return { kind: "component", jsxName }; | ||
| } | ||
| return null; | ||
| } | ||
| function addWarning(warnings, message, nodeName) { | ||
| warnings.push({ message, nodeName }); | ||
| } | ||
| function createMergedClassExpression(existing, classNameIdentifier) { | ||
| return t2.callExpression( | ||
| t2.memberExpression( | ||
| t2.callExpression( | ||
| t2.memberExpression( | ||
| t2.arrayExpression([existing, classNameIdentifier]), | ||
| t2.identifier("filter") | ||
| ), | ||
| [t2.identifier("Boolean")] | ||
| ), | ||
| t2.identifier("join") | ||
| ), | ||
| [t2.stringLiteral(" ")] | ||
| ); | ||
| } | ||
| function updateClassNameAttribute(openingElement, classNameIdentifier) { | ||
| const existingAttr = openingElement.attributes.find( | ||
| (attribute) => t2.isJSXAttribute(attribute) && t2.isJSXIdentifier(attribute.name, { name: "className" }) | ||
| ); | ||
| if (!existingAttr) { | ||
| openingElement.attributes.push( | ||
| t2.jsxAttribute(t2.jsxIdentifier("className"), t2.jsxExpressionContainer(classNameIdentifier)) | ||
| ); | ||
| return; | ||
| } | ||
| if (!existingAttr.value) { | ||
| existingAttr.value = t2.jsxExpressionContainer(classNameIdentifier); | ||
| return; | ||
| } | ||
| if (t2.isStringLiteral(existingAttr.value)) { | ||
| existingAttr.value = t2.jsxExpressionContainer( | ||
| createMergedClassExpression(t2.stringLiteral(existingAttr.value.value), classNameIdentifier) | ||
| ); | ||
| return; | ||
| } | ||
| if (t2.isJSXExpressionContainer(existingAttr.value)) { | ||
| existingAttr.value = t2.jsxExpressionContainer( | ||
| createMergedClassExpression( | ||
| existingAttr.value.expression, | ||
| classNameIdentifier | ||
| ) | ||
| ); | ||
| } | ||
| } | ||
| function ensureStylesImport(ast) { | ||
| let typestylesImport = null; | ||
| for (const statement of ast.program.body) { | ||
| if (t2.isImportDeclaration(statement) && statement.source.value === "typestyles") { | ||
| typestylesImport = statement; | ||
| break; | ||
| } | ||
| } | ||
| if (!typestylesImport) { | ||
| ast.program.body.unshift( | ||
| t2.importDeclaration( | ||
| [t2.importSpecifier(t2.identifier("styles"), t2.identifier("styles"))], | ||
| t2.stringLiteral("typestyles") | ||
| ) | ||
| ); | ||
| return; | ||
| } | ||
| const hasStylesSpecifier = typestylesImport.specifiers.some( | ||
| (specifier) => t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "styles" }) && t2.isIdentifier(specifier.local, { name: "styles" }) | ||
| ); | ||
| if (!hasStylesSpecifier) { | ||
| typestylesImport.specifiers.push( | ||
| t2.importSpecifier(t2.identifier("styles"), t2.identifier("styles")) | ||
| ); | ||
| } | ||
| } | ||
| function cleanupUnusedImports(ast) { | ||
| traverse(ast, { | ||
| Program(path) { | ||
| path.scope.crawl(); | ||
| }, | ||
| ImportDeclaration(path) { | ||
| const unusedLocals = path.node.specifiers.filter((specifier) => { | ||
| if (path.node.source.value === "typestyles" && t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.local, { name: "styles" })) { | ||
| return false; | ||
| } | ||
| const local = specifier.local.name; | ||
| const binding = path.scope.getBinding(local); | ||
| return !binding || binding.referencePaths.length === 0; | ||
| }); | ||
| if (unusedLocals.length === 0) return; | ||
| path.node.specifiers = path.node.specifiers.filter( | ||
| (specifier) => !unusedLocals.includes(specifier) | ||
| ); | ||
| if (path.node.specifiers.length === 0) { | ||
| path.remove(); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| function isOnlyJsxReferences(binding) { | ||
| return binding.referencePaths.every((referencePath) => { | ||
| const parent = referencePath.parentPath; | ||
| if (!parent) return false; | ||
| return parent.isJSXOpeningElement() && parent.get("name") === referencePath || parent.isJSXClosingElement() && parent.get("name") === referencePath; | ||
| }); | ||
| } | ||
| function migrateSource(filePath, source) { | ||
| const warnings = []; | ||
| let changed = false; | ||
| const ast = parse(source, { | ||
| sourceType: "module", | ||
| plugins: ["typescript", "jsx"] | ||
| }); | ||
| const styledNames = /* @__PURE__ */ new Set(); | ||
| const cssTagNames = /* @__PURE__ */ new Set(); | ||
| const styledTransforms = /* @__PURE__ */ new Map(); | ||
| traverse(ast, { | ||
| ImportDeclaration(path) { | ||
| if (path.node.source.value === "styled-components" || path.node.source.value === "@emotion/styled") { | ||
| for (const specifier of path.node.specifiers) { | ||
| if (t2.isImportDefaultSpecifier(specifier)) { | ||
| styledNames.add(specifier.local.name); | ||
| } | ||
| if (t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "css" })) { | ||
| cssTagNames.add(specifier.local.name); | ||
| } | ||
| } | ||
| } | ||
| if (path.node.source.value === "@emotion/react" || path.node.source.value === "@emotion/css") { | ||
| for (const specifier of path.node.specifiers) { | ||
| if (t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "css" })) { | ||
| cssTagNames.add(specifier.local.name); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| }); | ||
| traverse(ast, { | ||
| VariableDeclarator(path) { | ||
| if (!t2.isIdentifier(path.node.id)) return; | ||
| if (!t2.isTaggedTemplateExpression(path.node.init)) return; | ||
| const variableName = path.node.id.name; | ||
| const binding = path.scope.getBinding(variableName); | ||
| if (!binding) return; | ||
| const template = path.node.init.quasi; | ||
| if (template.expressions.length > 0) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped template literal with interpolations. Only static templates are migrated.", | ||
| variableName | ||
| ); | ||
| return; | ||
| } | ||
| const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? "").join(""); | ||
| const objectExpression2 = cssToObjectExpression(cssText, warnings); | ||
| if (!objectExpression2) { | ||
| addWarning(warnings, "Skipped because CSS could not be parsed.", variableName); | ||
| return; | ||
| } | ||
| const styledTarget = parseStyledTarget(path.node.init.tag, styledNames); | ||
| if (styledTarget) { | ||
| const declaration = path.parentPath; | ||
| if (declaration.parentPath?.isExportNamedDeclaration() || declaration.parentPath?.isExportDefaultDeclaration()) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped exported styled component to avoid changing external API shape.", | ||
| variableName | ||
| ); | ||
| return; | ||
| } | ||
| if (!isOnlyJsxReferences(binding)) { | ||
| addWarning(warnings, "Skipped styled component with non-JSX references.", variableName); | ||
| return; | ||
| } | ||
| const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name; | ||
| path.node.id = t2.identifier(classConstName); | ||
| path.node.init = t2.callExpression( | ||
| t2.memberExpression(t2.identifier("styles"), t2.identifier("class")), | ||
| [t2.stringLiteral(toKebabCase(variableName)), objectExpression2] | ||
| ); | ||
| styledTransforms.set(variableName, { | ||
| originalName: variableName, | ||
| classConstName, | ||
| target: styledTarget | ||
| }); | ||
| changed = true; | ||
| return; | ||
| } | ||
| if (t2.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) { | ||
| path.node.init = t2.callExpression( | ||
| t2.memberExpression(t2.identifier("styles"), t2.identifier("class")), | ||
| [t2.stringLiteral(toKebabCase(variableName)), objectExpression2] | ||
| ); | ||
| changed = true; | ||
| } | ||
| } | ||
| }); | ||
| if (styledTransforms.size > 0) { | ||
| traverse(ast, { | ||
| JSXElement(path) { | ||
| const openingName = path.node.openingElement.name; | ||
| if (!t2.isJSXIdentifier(openingName)) return; | ||
| const transform = styledTransforms.get(openingName.name); | ||
| if (!transform) return; | ||
| path.node.openingElement.name = transform.target.jsxName; | ||
| if (path.node.closingElement) { | ||
| path.node.closingElement.name = transform.target.jsxName; | ||
| } | ||
| updateClassNameAttribute(path.node.openingElement, t2.identifier(transform.classConstName)); | ||
| } | ||
| }); | ||
| } | ||
| if (changed) { | ||
| ensureStylesImport(ast); | ||
| cleanupUnusedImports(ast); | ||
| } | ||
| const output = generate( | ||
| ast, | ||
| { | ||
| retainLines: false, | ||
| comments: true, | ||
| concise: false | ||
| }, | ||
| source | ||
| ); | ||
| return { | ||
| filePath, | ||
| changed: changed && output.code !== source, | ||
| code: output.code, | ||
| warnings | ||
| }; | ||
| } | ||
| var DEFAULT_EXCLUDES = ["**/node_modules/**", "**/dist/**", "**/.next/**", "**/.turbo/**"]; | ||
| function normalizeExtension(extension) { | ||
| return extension.startsWith(".") ? extension : `.${extension}`; | ||
| } | ||
| async function collectTargetFiles(cwd, targets, extensions, include, exclude) { | ||
| const normalizedTargets = targets.length > 0 ? targets : ["."]; | ||
| const literalFiles = []; | ||
| const dynamicPatterns = []; | ||
| for (const target of normalizedTargets) { | ||
| const absolute = resolve(cwd, target); | ||
| try { | ||
| const targetStat = await stat(absolute); | ||
| if (targetStat.isFile()) { | ||
| literalFiles.push(absolute); | ||
| } else if (targetStat.isDirectory()) { | ||
| dynamicPatterns.push(`${absolute.split("\\").join("/")}/**/*`); | ||
| } | ||
| } catch { | ||
| dynamicPatterns.push(target); | ||
| } | ||
| } | ||
| const globbed = await fg(dynamicPatterns, { | ||
| cwd, | ||
| absolute: true, | ||
| onlyFiles: true, | ||
| ignore: [...DEFAULT_EXCLUDES, ...exclude] | ||
| }); | ||
| const extensionSet = new Set(extensions.map(normalizeExtension)); | ||
| const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null; | ||
| const unique = /* @__PURE__ */ new Set([...literalFiles, ...globbed]); | ||
| return Array.from(unique).filter((filePath) => extensionSet.has(extname(filePath))).filter((filePath) => { | ||
| if (!includeMatchers) return true; | ||
| const rel = relative(cwd, filePath).split("\\").join("/"); | ||
| return includeMatchers.some((matcher) => matcher(rel)); | ||
| }).sort(); | ||
| } | ||
| // src/migrate.ts | ||
| function renderPatch(filePath, before, after) { | ||
| return createPatch(filePath, before, after, "before", "after").split("\n").slice(2).join("\n"); | ||
| } | ||
| async function runMigration(cwd, options) { | ||
| const files = await collectTargetFiles( | ||
| cwd, | ||
| options.targets, | ||
| options.extensions, | ||
| options.include, | ||
| options.exclude | ||
| ); | ||
| const reportEntries = []; | ||
| let changedCount = 0; | ||
| let warningCount = 0; | ||
| for (const filePath of files) { | ||
| const before = await readFile(filePath, "utf8"); | ||
| const result = migrateSource(filePath, before); | ||
| const relativePath = relative(cwd, filePath); | ||
| warningCount += result.warnings.length; | ||
| if (result.changed) { | ||
| changedCount += 1; | ||
| if (options.write) { | ||
| await writeFile(filePath, result.code, "utf8"); | ||
| process.stdout.write(`updated ${relativePath} | ||
| `); | ||
| } else { | ||
| process.stdout.write(` | ||
| --- ${relativePath} (dry-run) --- | ||
| `); | ||
| process.stdout.write(`${renderPatch(relativePath, before, result.code)} | ||
| `); | ||
| } | ||
| } | ||
| for (const warning of result.warnings) { | ||
| const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : ""; | ||
| process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message} | ||
| `); | ||
| } | ||
| reportEntries.push({ | ||
| filePath: relativePath, | ||
| changed: result.changed, | ||
| warnings: result.warnings | ||
| }); | ||
| } | ||
| const summary = { | ||
| filesScanned: files.length, | ||
| filesChanged: changedCount, | ||
| warnings: warningCount | ||
| }; | ||
| process.stdout.write( | ||
| ` | ||
| Scanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}. | ||
| ` | ||
| ); | ||
| const report = { | ||
| summary, | ||
| files: reportEntries | ||
| }; | ||
| if (options.reportPath) { | ||
| await mkdir(dirname(options.reportPath), { recursive: true }); | ||
| await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)} | ||
| `, "utf8"); | ||
| process.stdout.write(`Report written to ${options.reportPath} | ||
| `); | ||
| } | ||
| return report; | ||
| } | ||
| export { migrateSource, runMigration }; | ||
| //# sourceMappingURL=chunk-PZHSD3QV.js.map | ||
| //# sourceMappingURL=chunk-PZHSD3QV.js.map |
| {"version":3,"sources":["../src/css.ts","../src/transform.ts","../src/files.ts","../src/migrate.ts"],"names":["t","objectExpression","relative"],"mappings":"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","file":"chunk-PZHSD3QV.js","sourcesContent":["import postcss, { type ChildNode, type Container } from 'postcss';\nimport * as t from '@babel/types';\nimport type { MigrationWarning } from './types';\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction toValueNode(value: string): t.Expression {\n const trimmed = value.trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return t.numericLiteral(Number(trimmed));\n }\n return t.stringLiteral(trimmed);\n}\n\nfunction toKeyNode(key: string): t.Expression {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return t.identifier(key);\n }\n return t.stringLiteral(key);\n}\n\nfunction nodesToObject(\n nodes: ChildNode[] | undefined,\n warnings: MigrationWarning[],\n): t.ObjectExpression {\n const properties: t.ObjectProperty[] = [];\n\n for (const node of nodes ?? []) {\n if (node.type === 'decl') {\n const normalized = node.prop.startsWith('--') ? node.prop : camelCaseProperty(node.prop);\n properties.push(t.objectProperty(toKeyNode(normalized), toValueNode(node.value)));\n continue;\n }\n\n if (node.type === 'rule') {\n const nested = nodesToObject(node.nodes, warnings);\n properties.push(t.objectProperty(t.stringLiteral(node.selector.trim()), nested));\n continue;\n }\n\n warnings.push({\n message: `Unsupported CSS node \"${node.type}\" skipped.`,\n });\n }\n\n return t.objectExpression(properties);\n}\n\nexport function cssToObjectExpression(\n cssText: string,\n warnings: MigrationWarning[],\n): t.ObjectExpression | null {\n try {\n const root = postcss.parse(cssText);\n return nodesToObject((root as unknown as Container).nodes, warnings);\n } catch (error) {\n warnings.push({\n message: `Could not parse CSS template literal: ${(error as Error).message}`,\n });\n return null;\n }\n}\n","import { parse } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { cssToObjectExpression } from './css';\nimport type { FileMigrationResult, MigrationWarning } from './types';\n\ntype StyledTarget =\n | { kind: 'intrinsic'; jsxName: t.JSXIdentifier }\n | { kind: 'component'; jsxName: t.JSXIdentifier | t.JSXMemberExpression };\n\ntype StyledTransform = {\n originalName: string;\n classConstName: string;\n target: StyledTarget;\n};\n\nfunction toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction memberExpressionToJsxName(\n expression: t.Expression,\n): t.JSXIdentifier | t.JSXMemberExpression | null {\n if (t.isIdentifier(expression)) {\n return t.jsxIdentifier(expression.name);\n }\n\n if (t.isMemberExpression(expression) && !expression.computed) {\n const left = memberExpressionToJsxName(expression.object as t.Expression);\n const right = t.isIdentifier(expression.property)\n ? t.jsxIdentifier(expression.property.name)\n : null;\n if (!left || !right) return null;\n return t.jsxMemberExpression(left, right);\n }\n\n return null;\n}\n\nfunction parseStyledTarget(\n tag: t.TaggedTemplateExpression['tag'],\n styledNames: Set<string>,\n): StyledTarget | null {\n if (\n t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object) &&\n styledNames.has(tag.object.name) &&\n t.isIdentifier(tag.property)\n ) {\n return { kind: 'intrinsic', jsxName: t.jsxIdentifier(tag.property.name) };\n }\n\n if (t.isCallExpression(tag) && t.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {\n const firstArg = tag.arguments[0];\n if (!firstArg || !t.isExpression(firstArg)) return null;\n const jsxName = memberExpressionToJsxName(firstArg);\n if (!jsxName) return null;\n return { kind: 'component', jsxName };\n }\n\n return null;\n}\n\nfunction addWarning(warnings: MigrationWarning[], message: string, nodeName?: string): void {\n warnings.push({ message, nodeName });\n}\n\nfunction createMergedClassExpression(\n existing: t.Expression,\n classNameIdentifier: t.Identifier,\n): t.Expression {\n return t.callExpression(\n t.memberExpression(\n t.callExpression(\n t.memberExpression(\n t.arrayExpression([existing, classNameIdentifier]),\n t.identifier('filter'),\n ),\n [t.identifier('Boolean')],\n ),\n t.identifier('join'),\n ),\n [t.stringLiteral(' ')],\n );\n}\n\nfunction updateClassNameAttribute(\n openingElement: t.JSXOpeningElement,\n classNameIdentifier: t.Identifier,\n): void {\n const existingAttr = openingElement.attributes.find(\n (attribute): attribute is t.JSXAttribute =>\n t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name: 'className' }),\n );\n\n if (!existingAttr) {\n openingElement.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(classNameIdentifier)),\n );\n return;\n }\n\n if (!existingAttr.value) {\n existingAttr.value = t.jsxExpressionContainer(classNameIdentifier);\n return;\n }\n\n if (t.isStringLiteral(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(t.stringLiteral(existingAttr.value.value), classNameIdentifier),\n );\n return;\n }\n\n if (t.isJSXExpressionContainer(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(\n existingAttr.value.expression as t.Expression,\n classNameIdentifier,\n ),\n );\n }\n}\n\nfunction ensureStylesImport(ast: t.File): void {\n let typestylesImport: t.ImportDeclaration | null = null;\n\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement) && statement.source.value === 'typestyles') {\n typestylesImport = statement;\n break;\n }\n }\n\n if (!typestylesImport) {\n ast.program.body.unshift(\n t.importDeclaration(\n [t.importSpecifier(t.identifier('styles'), t.identifier('styles'))],\n t.stringLiteral('typestyles'),\n ),\n );\n return;\n }\n\n const hasStylesSpecifier = typestylesImport.specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'styles' }) &&\n t.isIdentifier(specifier.local, { name: 'styles' }),\n );\n\n if (!hasStylesSpecifier) {\n typestylesImport.specifiers.push(\n t.importSpecifier(t.identifier('styles'), t.identifier('styles')),\n );\n }\n}\n\nfunction cleanupUnusedImports(ast: t.File): void {\n traverse(ast, {\n Program(path) {\n path.scope.crawl();\n },\n ImportDeclaration(path) {\n const unusedLocals = path.node.specifiers.filter((specifier) => {\n if (\n path.node.source.value === 'typestyles' &&\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.local, { name: 'styles' })\n ) {\n return false;\n }\n const local = specifier.local.name;\n const binding = path.scope.getBinding(local);\n return !binding || binding.referencePaths.length === 0;\n });\n\n if (unusedLocals.length === 0) return;\n\n path.node.specifiers = path.node.specifiers.filter(\n (specifier) => !unusedLocals.includes(specifier),\n );\n if (path.node.specifiers.length === 0) {\n path.remove();\n }\n },\n });\n}\n\nfunction isOnlyJsxReferences(\n binding: NodePath<t.VariableDeclarator>['scope']['bindings'][string],\n): boolean {\n return binding.referencePaths.every((referencePath) => {\n const parent = referencePath.parentPath;\n if (!parent) return false;\n return (\n (parent.isJSXOpeningElement() && parent.get('name') === referencePath) ||\n (parent.isJSXClosingElement() && parent.get('name') === referencePath)\n );\n });\n}\n\nexport function migrateSource(filePath: string, source: string): FileMigrationResult {\n const warnings: MigrationWarning[] = [];\n let changed = false;\n\n const ast = parse(source, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n });\n\n const styledNames = new Set<string>();\n const cssTagNames = new Set<string>();\n const styledTransforms = new Map<string, StyledTransform>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n if (\n path.node.source.value === 'styled-components' ||\n path.node.source.value === '@emotion/styled'\n ) {\n for (const specifier of path.node.specifiers) {\n if (t.isImportDefaultSpecifier(specifier)) {\n styledNames.add(specifier.local.name);\n }\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n\n if (\n path.node.source.value === '@emotion/react' ||\n path.node.source.value === '@emotion/css'\n ) {\n for (const specifier of path.node.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n },\n });\n\n traverse(ast, {\n VariableDeclarator(path) {\n if (!t.isIdentifier(path.node.id)) return;\n if (!t.isTaggedTemplateExpression(path.node.init)) return;\n\n const variableName = path.node.id.name;\n const binding = path.scope.getBinding(variableName);\n if (!binding) return;\n\n const template = path.node.init.quasi;\n if (template.expressions.length > 0) {\n addWarning(\n warnings,\n 'Skipped template literal with interpolations. Only static templates are migrated.',\n variableName,\n );\n return;\n }\n\n const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n const objectExpression = cssToObjectExpression(cssText, warnings);\n if (!objectExpression) {\n addWarning(warnings, 'Skipped because CSS could not be parsed.', variableName);\n return;\n }\n\n const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);\n if (styledTarget) {\n const declaration = path.parentPath;\n if (\n declaration.parentPath?.isExportNamedDeclaration() ||\n declaration.parentPath?.isExportDefaultDeclaration()\n ) {\n addWarning(\n warnings,\n 'Skipped exported styled component to avoid changing external API shape.',\n variableName,\n );\n return;\n }\n\n if (!isOnlyJsxReferences(binding)) {\n addWarning(warnings, 'Skipped styled component with non-JSX references.', variableName);\n return;\n }\n\n const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;\n path.node.id = t.identifier(classConstName);\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n\n styledTransforms.set(variableName, {\n originalName: variableName,\n classConstName,\n target: styledTarget,\n });\n changed = true;\n return;\n }\n\n if (t.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n changed = true;\n }\n },\n });\n\n if (styledTransforms.size > 0) {\n traverse(ast, {\n JSXElement(path) {\n const openingName = path.node.openingElement.name;\n if (!t.isJSXIdentifier(openingName)) return;\n const transform = styledTransforms.get(openingName.name);\n if (!transform) return;\n\n path.node.openingElement.name = transform.target.jsxName;\n if (path.node.closingElement) {\n path.node.closingElement.name = transform.target.jsxName;\n }\n\n updateClassNameAttribute(path.node.openingElement, t.identifier(transform.classConstName));\n },\n });\n }\n\n if (changed) {\n ensureStylesImport(ast);\n cleanupUnusedImports(ast);\n }\n\n const output = generate(\n ast,\n {\n retainLines: false,\n comments: true,\n concise: false,\n },\n source,\n );\n\n return {\n filePath,\n changed: changed && output.code !== source,\n code: output.code,\n warnings,\n };\n}\n","import { stat } from 'node:fs/promises';\nimport { extname, relative, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport picomatch from 'picomatch';\n\nconst DEFAULT_EXCLUDES = ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/.turbo/**'];\n\nfunction normalizeExtension(extension: string): string {\n return extension.startsWith('.') ? extension : `.${extension}`;\n}\n\nexport async function collectTargetFiles(\n cwd: string,\n targets: string[],\n extensions: string[],\n include: string[],\n exclude: string[],\n): Promise<string[]> {\n const normalizedTargets = targets.length > 0 ? targets : ['.'];\n const literalFiles: string[] = [];\n const dynamicPatterns: string[] = [];\n\n for (const target of normalizedTargets) {\n const absolute = resolve(cwd, target);\n try {\n const targetStat = await stat(absolute);\n if (targetStat.isFile()) {\n literalFiles.push(absolute);\n } else if (targetStat.isDirectory()) {\n dynamicPatterns.push(`${absolute.split('\\\\').join('/')}/**/*`);\n }\n } catch {\n dynamicPatterns.push(target);\n }\n }\n\n const globbed = await fg(dynamicPatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [...DEFAULT_EXCLUDES, ...exclude],\n });\n\n const extensionSet = new Set(extensions.map(normalizeExtension));\n const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;\n const unique = new Set([...literalFiles, ...globbed]);\n\n return Array.from(unique)\n .filter((filePath) => extensionSet.has(extname(filePath)))\n .filter((filePath) => {\n if (!includeMatchers) return true;\n const rel = relative(cwd, filePath).split('\\\\').join('/');\n return includeMatchers.some((matcher) => matcher(rel));\n })\n .sort();\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { createPatch } from 'diff';\nimport type { CliOptions, MigrationReport, MigrationSummary } from './types';\nimport { collectTargetFiles } from './files';\nimport { migrateSource } from './transform';\n\nfunction renderPatch(filePath: string, before: string, after: string): string {\n return createPatch(filePath, before, after, 'before', 'after').split('\\n').slice(2).join('\\n');\n}\n\nexport async function runMigration(cwd: string, options: CliOptions): Promise<MigrationReport> {\n const files = await collectTargetFiles(\n cwd,\n options.targets,\n options.extensions,\n options.include,\n options.exclude,\n );\n\n const reportEntries: MigrationReport['files'] = [];\n let changedCount = 0;\n let warningCount = 0;\n\n for (const filePath of files) {\n const before = await readFile(filePath, 'utf8');\n const result = migrateSource(filePath, before);\n const relativePath = relative(cwd, filePath);\n\n warningCount += result.warnings.length;\n if (result.changed) {\n changedCount += 1;\n if (options.write) {\n await writeFile(filePath, result.code, 'utf8');\n process.stdout.write(`updated ${relativePath}\\n`);\n } else {\n process.stdout.write(`\\n--- ${relativePath} (dry-run) ---\\n`);\n process.stdout.write(`${renderPatch(relativePath, before, result.code)}\\n`);\n }\n }\n\n for (const warning of result.warnings) {\n const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : '';\n process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}\\n`);\n }\n\n reportEntries.push({\n filePath: relativePath,\n changed: result.changed,\n warnings: result.warnings,\n });\n }\n\n const summary: MigrationSummary = {\n filesScanned: files.length,\n filesChanged: changedCount,\n warnings: warningCount,\n };\n\n process.stdout.write(\n `\\nScanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.\\n`,\n );\n\n const report: MigrationReport = {\n summary,\n files: reportEntries,\n };\n\n if (options.reportPath) {\n await mkdir(dirname(options.reportPath), { recursive: true });\n await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n process.stdout.write(`Report written to ${options.reportPath}\\n`);\n }\n\n return report;\n}\n"]} |
+15
-10
@@ -160,5 +160,9 @@ #!/usr/bin/env node | ||
| t2__namespace.memberExpression( | ||
| t2__namespace.callExpression(t2__namespace.memberExpression(t2__namespace.arrayExpression([existing, classNameIdentifier]), t2__namespace.identifier("filter")), [ | ||
| t2__namespace.identifier("Boolean") | ||
| ]), | ||
| t2__namespace.callExpression( | ||
| t2__namespace.memberExpression( | ||
| t2__namespace.arrayExpression([existing, classNameIdentifier]), | ||
| t2__namespace.identifier("filter") | ||
| ), | ||
| [t2__namespace.identifier("Boolean")] | ||
| ), | ||
| t2__namespace.identifier("join") | ||
@@ -191,3 +195,6 @@ ), | ||
| existingAttr.value = t2__namespace.jsxExpressionContainer( | ||
| createMergedClassExpression(existingAttr.value.expression, classNameIdentifier) | ||
| createMergedClassExpression( | ||
| existingAttr.value.expression, | ||
| classNameIdentifier | ||
| ) | ||
| ); | ||
@@ -237,3 +244,5 @@ } | ||
| if (unusedLocals.length === 0) return; | ||
| path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier)); | ||
| path.node.specifiers = path.node.specifiers.filter( | ||
| (specifier) => !unusedLocals.includes(specifier) | ||
| ); | ||
| if (path.node.specifiers.length === 0) { | ||
@@ -317,7 +326,3 @@ path.remove(); | ||
| if (!isOnlyJsxReferences(binding)) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped styled component with non-JSX references.", | ||
| variableName | ||
| ); | ||
| addWarning(warnings, "Skipped styled component with non-JSX references.", variableName); | ||
| return; | ||
@@ -324,0 +329,0 @@ } |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/files.ts","../src/css.ts","../src/transform.ts","../src/migrate.ts","../src/cli.ts"],"names":["resolve","stat","fg","picomatch","extname","relative","t","postcss","t2","traverse","parse","objectExpression","generate","createPatch","readFile","writeFile","mkdir","dirname"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { stat } from 'node:fs/promises';\nimport { extname, relative, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport picomatch from 'picomatch';\n\nconst DEFAULT_EXCLUDES = ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/.turbo/**'];\n\nfunction normalizeExtension(extension: string): string {\n return extension.startsWith('.') ? extension : `.${extension}`;\n}\n\nexport async function collectTargetFiles(\n cwd: string,\n targets: string[],\n extensions: string[],\n include: string[],\n exclude: string[],\n): Promise<string[]> {\n const normalizedTargets = targets.length > 0 ? targets : ['.'];\n const literalFiles: string[] = [];\n const dynamicPatterns: string[] = [];\n\n for (const target of normalizedTargets) {\n const absolute = resolve(cwd, target);\n try {\n const targetStat = await stat(absolute);\n if (targetStat.isFile()) {\n literalFiles.push(absolute);\n } else if (targetStat.isDirectory()) {\n dynamicPatterns.push(`${absolute.split('\\\\').join('/')}/**/*`);\n }\n } catch {\n dynamicPatterns.push(target);\n }\n }\n\n const globbed = await fg(dynamicPatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [...DEFAULT_EXCLUDES, ...exclude],\n });\n\n const extensionSet = new Set(extensions.map(normalizeExtension));\n const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;\n const unique = new Set([...literalFiles, ...globbed]);\n\n return Array.from(unique)\n .filter((filePath) => extensionSet.has(extname(filePath)))\n .filter((filePath) => {\n if (!includeMatchers) return true;\n const rel = relative(cwd, filePath).split('\\\\').join('/');\n return includeMatchers.some((matcher) => matcher(rel));\n })\n .sort();\n}\n","import postcss, { type ChildNode, type Container } from 'postcss';\nimport * as t from '@babel/types';\nimport type { MigrationWarning } from './types.js';\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction toValueNode(value: string): t.Expression {\n const trimmed = value.trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return t.numericLiteral(Number(trimmed));\n }\n return t.stringLiteral(trimmed);\n}\n\nfunction toKeyNode(key: string): t.Expression {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return t.identifier(key);\n }\n return t.stringLiteral(key);\n}\n\nfunction nodesToObject(\n nodes: ChildNode[] | undefined,\n warnings: MigrationWarning[],\n): t.ObjectExpression {\n const properties: t.ObjectProperty[] = [];\n\n for (const node of nodes ?? []) {\n if (node.type === 'decl') {\n const normalized = node.prop.startsWith('--') ? node.prop : camelCaseProperty(node.prop);\n properties.push(t.objectProperty(toKeyNode(normalized), toValueNode(node.value)));\n continue;\n }\n\n if (node.type === 'rule') {\n const nested = nodesToObject(node.nodes, warnings);\n properties.push(t.objectProperty(t.stringLiteral(node.selector.trim()), nested));\n continue;\n }\n\n warnings.push({\n message: `Unsupported CSS node \"${node.type}\" skipped.`,\n });\n }\n\n return t.objectExpression(properties);\n}\n\nexport function cssToObjectExpression(\n cssText: string,\n warnings: MigrationWarning[],\n): t.ObjectExpression | null {\n try {\n const root = postcss.parse(cssText);\n return nodesToObject((root as unknown as Container).nodes, warnings);\n } catch (error) {\n warnings.push({\n message: `Could not parse CSS template literal: ${(error as Error).message}`,\n });\n return null;\n }\n}\n","import { parse } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { cssToObjectExpression } from './css.js';\nimport type { FileMigrationResult, MigrationWarning } from './types.js';\n\ntype StyledTarget =\n | { kind: 'intrinsic'; jsxName: t.JSXIdentifier }\n | { kind: 'component'; jsxName: t.JSXIdentifier | t.JSXMemberExpression };\n\ntype StyledTransform = {\n originalName: string;\n classConstName: string;\n target: StyledTarget;\n};\n\nfunction toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction memberExpressionToJsxName(\n expression: t.Expression,\n): t.JSXIdentifier | t.JSXMemberExpression | null {\n if (t.isIdentifier(expression)) {\n return t.jsxIdentifier(expression.name);\n }\n\n if (t.isMemberExpression(expression) && !expression.computed) {\n const left = memberExpressionToJsxName(expression.object as t.Expression);\n const right = t.isIdentifier(expression.property) ? t.jsxIdentifier(expression.property.name) : null;\n if (!left || !right) return null;\n return t.jsxMemberExpression(left, right);\n }\n\n return null;\n}\n\nfunction parseStyledTarget(\n tag: t.TaggedTemplateExpression['tag'],\n styledNames: Set<string>,\n): StyledTarget | null {\n if (\n t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object) &&\n styledNames.has(tag.object.name) &&\n t.isIdentifier(tag.property)\n ) {\n return { kind: 'intrinsic', jsxName: t.jsxIdentifier(tag.property.name) };\n }\n\n if (t.isCallExpression(tag) && t.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {\n const firstArg = tag.arguments[0];\n if (!firstArg || !t.isExpression(firstArg)) return null;\n const jsxName = memberExpressionToJsxName(firstArg);\n if (!jsxName) return null;\n return { kind: 'component', jsxName };\n }\n\n return null;\n}\n\nfunction addWarning(warnings: MigrationWarning[], message: string, nodeName?: string): void {\n warnings.push({ message, nodeName });\n}\n\nfunction createMergedClassExpression(existing: t.Expression, classNameIdentifier: t.Identifier): t.Expression {\n return t.callExpression(\n t.memberExpression(\n t.callExpression(t.memberExpression(t.arrayExpression([existing, classNameIdentifier]), t.identifier('filter')), [\n t.identifier('Boolean'),\n ]),\n t.identifier('join'),\n ),\n [t.stringLiteral(' ')],\n );\n}\n\nfunction updateClassNameAttribute(\n openingElement: t.JSXOpeningElement,\n classNameIdentifier: t.Identifier,\n): void {\n const existingAttr = openingElement.attributes.find(\n (attribute): attribute is t.JSXAttribute =>\n t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name: 'className' }),\n );\n\n if (!existingAttr) {\n openingElement.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(classNameIdentifier)),\n );\n return;\n }\n\n if (!existingAttr.value) {\n existingAttr.value = t.jsxExpressionContainer(classNameIdentifier);\n return;\n }\n\n if (t.isStringLiteral(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(t.stringLiteral(existingAttr.value.value), classNameIdentifier),\n );\n return;\n }\n\n if (t.isJSXExpressionContainer(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(existingAttr.value.expression as t.Expression, classNameIdentifier),\n );\n }\n}\n\nfunction ensureStylesImport(ast: t.File): void {\n let typestylesImport: t.ImportDeclaration | null = null;\n\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement) && statement.source.value === 'typestyles') {\n typestylesImport = statement;\n break;\n }\n }\n\n if (!typestylesImport) {\n ast.program.body.unshift(\n t.importDeclaration(\n [t.importSpecifier(t.identifier('styles'), t.identifier('styles'))],\n t.stringLiteral('typestyles'),\n ),\n );\n return;\n }\n\n const hasStylesSpecifier = typestylesImport.specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'styles' }) &&\n t.isIdentifier(specifier.local, { name: 'styles' }),\n );\n\n if (!hasStylesSpecifier) {\n typestylesImport.specifiers.push(\n t.importSpecifier(t.identifier('styles'), t.identifier('styles')),\n );\n }\n}\n\nfunction cleanupUnusedImports(ast: t.File): void {\n traverse(ast, {\n Program(path) {\n path.scope.crawl();\n },\n ImportDeclaration(path) {\n const unusedLocals = path.node.specifiers.filter((specifier) => {\n if (\n path.node.source.value === 'typestyles' &&\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.local, { name: 'styles' })\n ) {\n return false;\n }\n const local = specifier.local.name;\n const binding = path.scope.getBinding(local);\n return !binding || binding.referencePaths.length === 0;\n });\n\n if (unusedLocals.length === 0) return;\n\n path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier));\n if (path.node.specifiers.length === 0) {\n path.remove();\n }\n },\n });\n}\n\nfunction isOnlyJsxReferences(binding: NodePath<t.VariableDeclarator>['scope']['bindings'][string]): boolean {\n return binding.referencePaths.every((referencePath) => {\n const parent = referencePath.parentPath;\n if (!parent) return false;\n return (\n (parent.isJSXOpeningElement() && parent.get('name') === referencePath) ||\n (parent.isJSXClosingElement() && parent.get('name') === referencePath)\n );\n });\n}\n\nexport function migrateSource(filePath: string, source: string): FileMigrationResult {\n const warnings: MigrationWarning[] = [];\n let changed = false;\n\n const ast = parse(source, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n });\n\n const styledNames = new Set<string>();\n const cssTagNames = new Set<string>();\n const styledTransforms = new Map<string, StyledTransform>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n if (path.node.source.value === 'styled-components' || path.node.source.value === '@emotion/styled') {\n for (const specifier of path.node.specifiers) {\n if (t.isImportDefaultSpecifier(specifier)) {\n styledNames.add(specifier.local.name);\n }\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n\n if (path.node.source.value === '@emotion/react' || path.node.source.value === '@emotion/css') {\n for (const specifier of path.node.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n },\n });\n\n traverse(ast, {\n VariableDeclarator(path) {\n if (!t.isIdentifier(path.node.id)) return;\n if (!t.isTaggedTemplateExpression(path.node.init)) return;\n\n const variableName = path.node.id.name;\n const binding = path.scope.getBinding(variableName);\n if (!binding) return;\n\n const template = path.node.init.quasi;\n if (template.expressions.length > 0) {\n addWarning(\n warnings,\n 'Skipped template literal with interpolations. Only static templates are migrated.',\n variableName,\n );\n return;\n }\n\n const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n const objectExpression = cssToObjectExpression(cssText, warnings);\n if (!objectExpression) {\n addWarning(warnings, 'Skipped because CSS could not be parsed.', variableName);\n return;\n }\n\n const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);\n if (styledTarget) {\n const declaration = path.parentPath;\n if (\n declaration.parentPath?.isExportNamedDeclaration() ||\n declaration.parentPath?.isExportDefaultDeclaration()\n ) {\n addWarning(\n warnings,\n 'Skipped exported styled component to avoid changing external API shape.',\n variableName,\n );\n return;\n }\n\n if (!isOnlyJsxReferences(binding)) {\n addWarning(\n warnings,\n 'Skipped styled component with non-JSX references.',\n variableName,\n );\n return;\n }\n\n const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;\n path.node.id = t.identifier(classConstName);\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n\n styledTransforms.set(variableName, {\n originalName: variableName,\n classConstName,\n target: styledTarget,\n });\n changed = true;\n return;\n }\n\n if (t.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n changed = true;\n }\n },\n });\n\n if (styledTransforms.size > 0) {\n traverse(ast, {\n JSXElement(path) {\n const openingName = path.node.openingElement.name;\n if (!t.isJSXIdentifier(openingName)) return;\n const transform = styledTransforms.get(openingName.name);\n if (!transform) return;\n\n path.node.openingElement.name = transform.target.jsxName;\n if (path.node.closingElement) {\n path.node.closingElement.name = transform.target.jsxName;\n }\n\n updateClassNameAttribute(path.node.openingElement, t.identifier(transform.classConstName));\n },\n });\n }\n\n if (changed) {\n ensureStylesImport(ast);\n cleanupUnusedImports(ast);\n }\n\n const output = generate(\n ast,\n {\n retainLines: false,\n comments: true,\n concise: false,\n },\n source,\n );\n\n return {\n filePath,\n changed: changed && output.code !== source,\n code: output.code,\n warnings,\n };\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { createPatch } from 'diff';\nimport type { CliOptions, MigrationReport, MigrationSummary } from './types.js';\nimport { collectTargetFiles } from './files.js';\nimport { migrateSource } from './transform.js';\n\nfunction renderPatch(filePath: string, before: string, after: string): string {\n return createPatch(filePath, before, after, 'before', 'after')\n .split('\\n')\n .slice(2)\n .join('\\n');\n}\n\nexport async function runMigration(cwd: string, options: CliOptions): Promise<MigrationReport> {\n const files = await collectTargetFiles(\n cwd,\n options.targets,\n options.extensions,\n options.include,\n options.exclude,\n );\n\n const reportEntries: MigrationReport['files'] = [];\n let changedCount = 0;\n let warningCount = 0;\n\n for (const filePath of files) {\n const before = await readFile(filePath, 'utf8');\n const result = migrateSource(filePath, before);\n const relativePath = relative(cwd, filePath);\n\n warningCount += result.warnings.length;\n if (result.changed) {\n changedCount += 1;\n if (options.write) {\n await writeFile(filePath, result.code, 'utf8');\n process.stdout.write(`updated ${relativePath}\\n`);\n } else {\n process.stdout.write(`\\n--- ${relativePath} (dry-run) ---\\n`);\n process.stdout.write(`${renderPatch(relativePath, before, result.code)}\\n`);\n }\n }\n\n for (const warning of result.warnings) {\n const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : '';\n process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}\\n`);\n }\n\n reportEntries.push({\n filePath: relativePath,\n changed: result.changed,\n warnings: result.warnings,\n });\n }\n\n const summary: MigrationSummary = {\n filesScanned: files.length,\n filesChanged: changedCount,\n warnings: warningCount,\n };\n\n process.stdout.write(\n `\\nScanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.\\n`,\n );\n\n const report: MigrationReport = {\n summary,\n files: reportEntries,\n };\n\n if (options.reportPath) {\n await mkdir(dirname(options.reportPath), { recursive: true });\n await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n process.stdout.write(`Report written to ${options.reportPath}\\n`);\n }\n\n return report;\n}\n","import { resolve } from 'node:path';\nimport type { CliOptions } from './types.js';\nimport { runMigration } from './migrate.js';\n\nconst HELP_TEXT = `typestyles-migrate <paths...> [options]\n\nOptions:\n --write Apply changes in-place (default is dry-run)\n --include <glob> Include glob (repeatable)\n --exclude <glob> Exclude glob (repeatable)\n --extensions <list> Comma-separated extensions (default: .ts,.tsx)\n --report <path> Write JSON report to the provided path\n --help Show this help\n`;\n\nfunction parseCliArgs(argv: string[]): CliOptions {\n if (argv.includes('--help')) {\n process.stdout.write(HELP_TEXT);\n process.exit(0);\n }\n\n const targets: string[] = [];\n const include: string[] = [];\n const exclude: string[] = [];\n let extensions: string[] = ['.ts', '.tsx'];\n let reportPath: string | undefined;\n let write = false;\n\n for (let i = 0; i < argv.length; i += 1) {\n const token = argv[i];\n if (token === '--write') {\n write = true;\n continue;\n }\n\n if (token === '--include' && argv[i + 1]) {\n include.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--exclude' && argv[i + 1]) {\n exclude.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--extensions' && argv[i + 1]) {\n extensions = argv[i + 1]\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n i += 1;\n continue;\n }\n\n if (token === '--report' && argv[i + 1]) {\n reportPath = resolve(process.cwd(), argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (!token.startsWith('--')) {\n targets.push(token);\n }\n }\n\n return {\n targets: targets.length > 0 ? targets : ['.'],\n write,\n include,\n exclude,\n extensions,\n reportPath,\n };\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options = parseCliArgs(args);\n await runMigration(process.cwd(), options);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${(error as Error).message}\\n`);\n process.exit(1);\n});\n"]} | ||
| {"version":3,"sources":["../src/files.ts","../src/css.ts","../src/transform.ts","../src/migrate.ts","../src/cli.ts"],"names":["resolve","stat","fg","picomatch","extname","relative","t","postcss","t2","traverse","parse","objectExpression","generate","createPatch","readFile","writeFile","mkdir","dirname"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { stat } from 'node:fs/promises';\nimport { extname, relative, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport picomatch from 'picomatch';\n\nconst DEFAULT_EXCLUDES = ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/.turbo/**'];\n\nfunction normalizeExtension(extension: string): string {\n return extension.startsWith('.') ? extension : `.${extension}`;\n}\n\nexport async function collectTargetFiles(\n cwd: string,\n targets: string[],\n extensions: string[],\n include: string[],\n exclude: string[],\n): Promise<string[]> {\n const normalizedTargets = targets.length > 0 ? targets : ['.'];\n const literalFiles: string[] = [];\n const dynamicPatterns: string[] = [];\n\n for (const target of normalizedTargets) {\n const absolute = resolve(cwd, target);\n try {\n const targetStat = await stat(absolute);\n if (targetStat.isFile()) {\n literalFiles.push(absolute);\n } else if (targetStat.isDirectory()) {\n dynamicPatterns.push(`${absolute.split('\\\\').join('/')}/**/*`);\n }\n } catch {\n dynamicPatterns.push(target);\n }\n }\n\n const globbed = await fg(dynamicPatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [...DEFAULT_EXCLUDES, ...exclude],\n });\n\n const extensionSet = new Set(extensions.map(normalizeExtension));\n const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;\n const unique = new Set([...literalFiles, ...globbed]);\n\n return Array.from(unique)\n .filter((filePath) => extensionSet.has(extname(filePath)))\n .filter((filePath) => {\n if (!includeMatchers) return true;\n const rel = relative(cwd, filePath).split('\\\\').join('/');\n return includeMatchers.some((matcher) => matcher(rel));\n })\n .sort();\n}\n","import postcss, { type ChildNode, type Container } from 'postcss';\nimport * as t from '@babel/types';\nimport type { MigrationWarning } from './types';\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction toValueNode(value: string): t.Expression {\n const trimmed = value.trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return t.numericLiteral(Number(trimmed));\n }\n return t.stringLiteral(trimmed);\n}\n\nfunction toKeyNode(key: string): t.Expression {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return t.identifier(key);\n }\n return t.stringLiteral(key);\n}\n\nfunction nodesToObject(\n nodes: ChildNode[] | undefined,\n warnings: MigrationWarning[],\n): t.ObjectExpression {\n const properties: t.ObjectProperty[] = [];\n\n for (const node of nodes ?? []) {\n if (node.type === 'decl') {\n const normalized = node.prop.startsWith('--') ? node.prop : camelCaseProperty(node.prop);\n properties.push(t.objectProperty(toKeyNode(normalized), toValueNode(node.value)));\n continue;\n }\n\n if (node.type === 'rule') {\n const nested = nodesToObject(node.nodes, warnings);\n properties.push(t.objectProperty(t.stringLiteral(node.selector.trim()), nested));\n continue;\n }\n\n warnings.push({\n message: `Unsupported CSS node \"${node.type}\" skipped.`,\n });\n }\n\n return t.objectExpression(properties);\n}\n\nexport function cssToObjectExpression(\n cssText: string,\n warnings: MigrationWarning[],\n): t.ObjectExpression | null {\n try {\n const root = postcss.parse(cssText);\n return nodesToObject((root as unknown as Container).nodes, warnings);\n } catch (error) {\n warnings.push({\n message: `Could not parse CSS template literal: ${(error as Error).message}`,\n });\n return null;\n }\n}\n","import { parse } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { cssToObjectExpression } from './css';\nimport type { FileMigrationResult, MigrationWarning } from './types';\n\ntype StyledTarget =\n | { kind: 'intrinsic'; jsxName: t.JSXIdentifier }\n | { kind: 'component'; jsxName: t.JSXIdentifier | t.JSXMemberExpression };\n\ntype StyledTransform = {\n originalName: string;\n classConstName: string;\n target: StyledTarget;\n};\n\nfunction toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction memberExpressionToJsxName(\n expression: t.Expression,\n): t.JSXIdentifier | t.JSXMemberExpression | null {\n if (t.isIdentifier(expression)) {\n return t.jsxIdentifier(expression.name);\n }\n\n if (t.isMemberExpression(expression) && !expression.computed) {\n const left = memberExpressionToJsxName(expression.object as t.Expression);\n const right = t.isIdentifier(expression.property)\n ? t.jsxIdentifier(expression.property.name)\n : null;\n if (!left || !right) return null;\n return t.jsxMemberExpression(left, right);\n }\n\n return null;\n}\n\nfunction parseStyledTarget(\n tag: t.TaggedTemplateExpression['tag'],\n styledNames: Set<string>,\n): StyledTarget | null {\n if (\n t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object) &&\n styledNames.has(tag.object.name) &&\n t.isIdentifier(tag.property)\n ) {\n return { kind: 'intrinsic', jsxName: t.jsxIdentifier(tag.property.name) };\n }\n\n if (t.isCallExpression(tag) && t.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {\n const firstArg = tag.arguments[0];\n if (!firstArg || !t.isExpression(firstArg)) return null;\n const jsxName = memberExpressionToJsxName(firstArg);\n if (!jsxName) return null;\n return { kind: 'component', jsxName };\n }\n\n return null;\n}\n\nfunction addWarning(warnings: MigrationWarning[], message: string, nodeName?: string): void {\n warnings.push({ message, nodeName });\n}\n\nfunction createMergedClassExpression(\n existing: t.Expression,\n classNameIdentifier: t.Identifier,\n): t.Expression {\n return t.callExpression(\n t.memberExpression(\n t.callExpression(\n t.memberExpression(\n t.arrayExpression([existing, classNameIdentifier]),\n t.identifier('filter'),\n ),\n [t.identifier('Boolean')],\n ),\n t.identifier('join'),\n ),\n [t.stringLiteral(' ')],\n );\n}\n\nfunction updateClassNameAttribute(\n openingElement: t.JSXOpeningElement,\n classNameIdentifier: t.Identifier,\n): void {\n const existingAttr = openingElement.attributes.find(\n (attribute): attribute is t.JSXAttribute =>\n t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name: 'className' }),\n );\n\n if (!existingAttr) {\n openingElement.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(classNameIdentifier)),\n );\n return;\n }\n\n if (!existingAttr.value) {\n existingAttr.value = t.jsxExpressionContainer(classNameIdentifier);\n return;\n }\n\n if (t.isStringLiteral(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(t.stringLiteral(existingAttr.value.value), classNameIdentifier),\n );\n return;\n }\n\n if (t.isJSXExpressionContainer(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(\n existingAttr.value.expression as t.Expression,\n classNameIdentifier,\n ),\n );\n }\n}\n\nfunction ensureStylesImport(ast: t.File): void {\n let typestylesImport: t.ImportDeclaration | null = null;\n\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement) && statement.source.value === 'typestyles') {\n typestylesImport = statement;\n break;\n }\n }\n\n if (!typestylesImport) {\n ast.program.body.unshift(\n t.importDeclaration(\n [t.importSpecifier(t.identifier('styles'), t.identifier('styles'))],\n t.stringLiteral('typestyles'),\n ),\n );\n return;\n }\n\n const hasStylesSpecifier = typestylesImport.specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'styles' }) &&\n t.isIdentifier(specifier.local, { name: 'styles' }),\n );\n\n if (!hasStylesSpecifier) {\n typestylesImport.specifiers.push(\n t.importSpecifier(t.identifier('styles'), t.identifier('styles')),\n );\n }\n}\n\nfunction cleanupUnusedImports(ast: t.File): void {\n traverse(ast, {\n Program(path) {\n path.scope.crawl();\n },\n ImportDeclaration(path) {\n const unusedLocals = path.node.specifiers.filter((specifier) => {\n if (\n path.node.source.value === 'typestyles' &&\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.local, { name: 'styles' })\n ) {\n return false;\n }\n const local = specifier.local.name;\n const binding = path.scope.getBinding(local);\n return !binding || binding.referencePaths.length === 0;\n });\n\n if (unusedLocals.length === 0) return;\n\n path.node.specifiers = path.node.specifiers.filter(\n (specifier) => !unusedLocals.includes(specifier),\n );\n if (path.node.specifiers.length === 0) {\n path.remove();\n }\n },\n });\n}\n\nfunction isOnlyJsxReferences(\n binding: NodePath<t.VariableDeclarator>['scope']['bindings'][string],\n): boolean {\n return binding.referencePaths.every((referencePath) => {\n const parent = referencePath.parentPath;\n if (!parent) return false;\n return (\n (parent.isJSXOpeningElement() && parent.get('name') === referencePath) ||\n (parent.isJSXClosingElement() && parent.get('name') === referencePath)\n );\n });\n}\n\nexport function migrateSource(filePath: string, source: string): FileMigrationResult {\n const warnings: MigrationWarning[] = [];\n let changed = false;\n\n const ast = parse(source, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n });\n\n const styledNames = new Set<string>();\n const cssTagNames = new Set<string>();\n const styledTransforms = new Map<string, StyledTransform>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n if (\n path.node.source.value === 'styled-components' ||\n path.node.source.value === '@emotion/styled'\n ) {\n for (const specifier of path.node.specifiers) {\n if (t.isImportDefaultSpecifier(specifier)) {\n styledNames.add(specifier.local.name);\n }\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n\n if (\n path.node.source.value === '@emotion/react' ||\n path.node.source.value === '@emotion/css'\n ) {\n for (const specifier of path.node.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n },\n });\n\n traverse(ast, {\n VariableDeclarator(path) {\n if (!t.isIdentifier(path.node.id)) return;\n if (!t.isTaggedTemplateExpression(path.node.init)) return;\n\n const variableName = path.node.id.name;\n const binding = path.scope.getBinding(variableName);\n if (!binding) return;\n\n const template = path.node.init.quasi;\n if (template.expressions.length > 0) {\n addWarning(\n warnings,\n 'Skipped template literal with interpolations. Only static templates are migrated.',\n variableName,\n );\n return;\n }\n\n const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n const objectExpression = cssToObjectExpression(cssText, warnings);\n if (!objectExpression) {\n addWarning(warnings, 'Skipped because CSS could not be parsed.', variableName);\n return;\n }\n\n const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);\n if (styledTarget) {\n const declaration = path.parentPath;\n if (\n declaration.parentPath?.isExportNamedDeclaration() ||\n declaration.parentPath?.isExportDefaultDeclaration()\n ) {\n addWarning(\n warnings,\n 'Skipped exported styled component to avoid changing external API shape.',\n variableName,\n );\n return;\n }\n\n if (!isOnlyJsxReferences(binding)) {\n addWarning(warnings, 'Skipped styled component with non-JSX references.', variableName);\n return;\n }\n\n const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;\n path.node.id = t.identifier(classConstName);\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n\n styledTransforms.set(variableName, {\n originalName: variableName,\n classConstName,\n target: styledTarget,\n });\n changed = true;\n return;\n }\n\n if (t.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n changed = true;\n }\n },\n });\n\n if (styledTransforms.size > 0) {\n traverse(ast, {\n JSXElement(path) {\n const openingName = path.node.openingElement.name;\n if (!t.isJSXIdentifier(openingName)) return;\n const transform = styledTransforms.get(openingName.name);\n if (!transform) return;\n\n path.node.openingElement.name = transform.target.jsxName;\n if (path.node.closingElement) {\n path.node.closingElement.name = transform.target.jsxName;\n }\n\n updateClassNameAttribute(path.node.openingElement, t.identifier(transform.classConstName));\n },\n });\n }\n\n if (changed) {\n ensureStylesImport(ast);\n cleanupUnusedImports(ast);\n }\n\n const output = generate(\n ast,\n {\n retainLines: false,\n comments: true,\n concise: false,\n },\n source,\n );\n\n return {\n filePath,\n changed: changed && output.code !== source,\n code: output.code,\n warnings,\n };\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { createPatch } from 'diff';\nimport type { CliOptions, MigrationReport, MigrationSummary } from './types';\nimport { collectTargetFiles } from './files';\nimport { migrateSource } from './transform';\n\nfunction renderPatch(filePath: string, before: string, after: string): string {\n return createPatch(filePath, before, after, 'before', 'after').split('\\n').slice(2).join('\\n');\n}\n\nexport async function runMigration(cwd: string, options: CliOptions): Promise<MigrationReport> {\n const files = await collectTargetFiles(\n cwd,\n options.targets,\n options.extensions,\n options.include,\n options.exclude,\n );\n\n const reportEntries: MigrationReport['files'] = [];\n let changedCount = 0;\n let warningCount = 0;\n\n for (const filePath of files) {\n const before = await readFile(filePath, 'utf8');\n const result = migrateSource(filePath, before);\n const relativePath = relative(cwd, filePath);\n\n warningCount += result.warnings.length;\n if (result.changed) {\n changedCount += 1;\n if (options.write) {\n await writeFile(filePath, result.code, 'utf8');\n process.stdout.write(`updated ${relativePath}\\n`);\n } else {\n process.stdout.write(`\\n--- ${relativePath} (dry-run) ---\\n`);\n process.stdout.write(`${renderPatch(relativePath, before, result.code)}\\n`);\n }\n }\n\n for (const warning of result.warnings) {\n const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : '';\n process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}\\n`);\n }\n\n reportEntries.push({\n filePath: relativePath,\n changed: result.changed,\n warnings: result.warnings,\n });\n }\n\n const summary: MigrationSummary = {\n filesScanned: files.length,\n filesChanged: changedCount,\n warnings: warningCount,\n };\n\n process.stdout.write(\n `\\nScanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.\\n`,\n );\n\n const report: MigrationReport = {\n summary,\n files: reportEntries,\n };\n\n if (options.reportPath) {\n await mkdir(dirname(options.reportPath), { recursive: true });\n await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n process.stdout.write(`Report written to ${options.reportPath}\\n`);\n }\n\n return report;\n}\n","import { resolve } from 'node:path';\nimport type { CliOptions } from './types';\nimport { runMigration } from './migrate';\n\nconst HELP_TEXT = `typestyles-migrate <paths...> [options]\n\nOptions:\n --write Apply changes in-place (default is dry-run)\n --include <glob> Include glob (repeatable)\n --exclude <glob> Exclude glob (repeatable)\n --extensions <list> Comma-separated extensions (default: .ts,.tsx)\n --report <path> Write JSON report to the provided path\n --help Show this help\n`;\n\nfunction parseCliArgs(argv: string[]): CliOptions {\n if (argv.includes('--help')) {\n process.stdout.write(HELP_TEXT);\n process.exit(0);\n }\n\n const targets: string[] = [];\n const include: string[] = [];\n const exclude: string[] = [];\n let extensions: string[] = ['.ts', '.tsx'];\n let reportPath: string | undefined;\n let write = false;\n\n for (let i = 0; i < argv.length; i += 1) {\n const token = argv[i];\n if (token === '--write') {\n write = true;\n continue;\n }\n\n if (token === '--include' && argv[i + 1]) {\n include.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--exclude' && argv[i + 1]) {\n exclude.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--extensions' && argv[i + 1]) {\n extensions = argv[i + 1]\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n i += 1;\n continue;\n }\n\n if (token === '--report' && argv[i + 1]) {\n reportPath = resolve(process.cwd(), argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (!token.startsWith('--')) {\n targets.push(token);\n }\n }\n\n return {\n targets: targets.length > 0 ? targets : ['.'],\n write,\n include,\n exclude,\n extensions,\n reportPath,\n };\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options = parseCliArgs(args);\n await runMigration(process.cwd(), options);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${(error as Error).message}\\n`);\n process.exit(1);\n});\n"]} |
+1
-1
| #!/usr/bin/env node | ||
| import { runMigration } from './chunk-AINAKUVX.js'; | ||
| import { runMigration } from './chunk-PZHSD3QV.js'; | ||
| import { resolve } from 'path'; | ||
@@ -4,0 +4,0 @@ |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["import { resolve } from 'node:path';\nimport type { CliOptions } from './types.js';\nimport { runMigration } from './migrate.js';\n\nconst HELP_TEXT = `typestyles-migrate <paths...> [options]\n\nOptions:\n --write Apply changes in-place (default is dry-run)\n --include <glob> Include glob (repeatable)\n --exclude <glob> Exclude glob (repeatable)\n --extensions <list> Comma-separated extensions (default: .ts,.tsx)\n --report <path> Write JSON report to the provided path\n --help Show this help\n`;\n\nfunction parseCliArgs(argv: string[]): CliOptions {\n if (argv.includes('--help')) {\n process.stdout.write(HELP_TEXT);\n process.exit(0);\n }\n\n const targets: string[] = [];\n const include: string[] = [];\n const exclude: string[] = [];\n let extensions: string[] = ['.ts', '.tsx'];\n let reportPath: string | undefined;\n let write = false;\n\n for (let i = 0; i < argv.length; i += 1) {\n const token = argv[i];\n if (token === '--write') {\n write = true;\n continue;\n }\n\n if (token === '--include' && argv[i + 1]) {\n include.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--exclude' && argv[i + 1]) {\n exclude.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--extensions' && argv[i + 1]) {\n extensions = argv[i + 1]\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n i += 1;\n continue;\n }\n\n if (token === '--report' && argv[i + 1]) {\n reportPath = resolve(process.cwd(), argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (!token.startsWith('--')) {\n targets.push(token);\n }\n }\n\n return {\n targets: targets.length > 0 ? targets : ['.'],\n write,\n include,\n exclude,\n extensions,\n reportPath,\n };\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options = parseCliArgs(args);\n await runMigration(process.cwd(), options);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${(error as Error).message}\\n`);\n process.exit(1);\n});\n"]} | ||
| {"version":3,"sources":["../src/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["import { resolve } from 'node:path';\nimport type { CliOptions } from './types';\nimport { runMigration } from './migrate';\n\nconst HELP_TEXT = `typestyles-migrate <paths...> [options]\n\nOptions:\n --write Apply changes in-place (default is dry-run)\n --include <glob> Include glob (repeatable)\n --exclude <glob> Exclude glob (repeatable)\n --extensions <list> Comma-separated extensions (default: .ts,.tsx)\n --report <path> Write JSON report to the provided path\n --help Show this help\n`;\n\nfunction parseCliArgs(argv: string[]): CliOptions {\n if (argv.includes('--help')) {\n process.stdout.write(HELP_TEXT);\n process.exit(0);\n }\n\n const targets: string[] = [];\n const include: string[] = [];\n const exclude: string[] = [];\n let extensions: string[] = ['.ts', '.tsx'];\n let reportPath: string | undefined;\n let write = false;\n\n for (let i = 0; i < argv.length; i += 1) {\n const token = argv[i];\n if (token === '--write') {\n write = true;\n continue;\n }\n\n if (token === '--include' && argv[i + 1]) {\n include.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--exclude' && argv[i + 1]) {\n exclude.push(argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (token === '--extensions' && argv[i + 1]) {\n extensions = argv[i + 1]\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n i += 1;\n continue;\n }\n\n if (token === '--report' && argv[i + 1]) {\n reportPath = resolve(process.cwd(), argv[i + 1]);\n i += 1;\n continue;\n }\n\n if (!token.startsWith('--')) {\n targets.push(token);\n }\n }\n\n return {\n targets: targets.length > 0 ? targets : ['.'],\n write,\n include,\n exclude,\n extensions,\n reportPath,\n };\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const options = parseCliArgs(args);\n await runMigration(process.cwd(), options);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${(error as Error).message}\\n`);\n process.exit(1);\n});\n"]} |
+15
-10
@@ -124,5 +124,9 @@ #!/usr/bin/env node | ||
| t2__namespace.memberExpression( | ||
| t2__namespace.callExpression(t2__namespace.memberExpression(t2__namespace.arrayExpression([existing, classNameIdentifier]), t2__namespace.identifier("filter")), [ | ||
| t2__namespace.identifier("Boolean") | ||
| ]), | ||
| t2__namespace.callExpression( | ||
| t2__namespace.memberExpression( | ||
| t2__namespace.arrayExpression([existing, classNameIdentifier]), | ||
| t2__namespace.identifier("filter") | ||
| ), | ||
| [t2__namespace.identifier("Boolean")] | ||
| ), | ||
| t2__namespace.identifier("join") | ||
@@ -155,3 +159,6 @@ ), | ||
| existingAttr.value = t2__namespace.jsxExpressionContainer( | ||
| createMergedClassExpression(existingAttr.value.expression, classNameIdentifier) | ||
| createMergedClassExpression( | ||
| existingAttr.value.expression, | ||
| classNameIdentifier | ||
| ) | ||
| ); | ||
@@ -201,3 +208,5 @@ } | ||
| if (unusedLocals.length === 0) return; | ||
| path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier)); | ||
| path.node.specifiers = path.node.specifiers.filter( | ||
| (specifier) => !unusedLocals.includes(specifier) | ||
| ); | ||
| if (path.node.specifiers.length === 0) { | ||
@@ -281,7 +290,3 @@ path.remove(); | ||
| if (!isOnlyJsxReferences(binding)) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped styled component with non-JSX references.", | ||
| variableName | ||
| ); | ||
| addWarning(warnings, "Skipped styled component with non-JSX references.", variableName); | ||
| return; | ||
@@ -288,0 +293,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/css.ts","../src/transform.ts","../src/files.ts","../src/migrate.ts"],"names":["t","postcss","t2","traverse","parse","objectExpression","generate","resolve","stat","fg","picomatch","extname","relative","createPatch","readFile","writeFile","mkdir","dirname"],"mappings":"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","file":"index.cjs","sourcesContent":["import postcss, { type ChildNode, type Container } from 'postcss';\nimport * as t from '@babel/types';\nimport type { MigrationWarning } from './types.js';\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction toValueNode(value: string): t.Expression {\n const trimmed = value.trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return t.numericLiteral(Number(trimmed));\n }\n return t.stringLiteral(trimmed);\n}\n\nfunction toKeyNode(key: string): t.Expression {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return t.identifier(key);\n }\n return t.stringLiteral(key);\n}\n\nfunction nodesToObject(\n nodes: ChildNode[] | undefined,\n warnings: MigrationWarning[],\n): t.ObjectExpression {\n const properties: t.ObjectProperty[] = [];\n\n for (const node of nodes ?? []) {\n if (node.type === 'decl') {\n const normalized = node.prop.startsWith('--') ? node.prop : camelCaseProperty(node.prop);\n properties.push(t.objectProperty(toKeyNode(normalized), toValueNode(node.value)));\n continue;\n }\n\n if (node.type === 'rule') {\n const nested = nodesToObject(node.nodes, warnings);\n properties.push(t.objectProperty(t.stringLiteral(node.selector.trim()), nested));\n continue;\n }\n\n warnings.push({\n message: `Unsupported CSS node \"${node.type}\" skipped.`,\n });\n }\n\n return t.objectExpression(properties);\n}\n\nexport function cssToObjectExpression(\n cssText: string,\n warnings: MigrationWarning[],\n): t.ObjectExpression | null {\n try {\n const root = postcss.parse(cssText);\n return nodesToObject((root as unknown as Container).nodes, warnings);\n } catch (error) {\n warnings.push({\n message: `Could not parse CSS template literal: ${(error as Error).message}`,\n });\n return null;\n }\n}\n","import { parse } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { cssToObjectExpression } from './css.js';\nimport type { FileMigrationResult, MigrationWarning } from './types.js';\n\ntype StyledTarget =\n | { kind: 'intrinsic'; jsxName: t.JSXIdentifier }\n | { kind: 'component'; jsxName: t.JSXIdentifier | t.JSXMemberExpression };\n\ntype StyledTransform = {\n originalName: string;\n classConstName: string;\n target: StyledTarget;\n};\n\nfunction toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction memberExpressionToJsxName(\n expression: t.Expression,\n): t.JSXIdentifier | t.JSXMemberExpression | null {\n if (t.isIdentifier(expression)) {\n return t.jsxIdentifier(expression.name);\n }\n\n if (t.isMemberExpression(expression) && !expression.computed) {\n const left = memberExpressionToJsxName(expression.object as t.Expression);\n const right = t.isIdentifier(expression.property) ? t.jsxIdentifier(expression.property.name) : null;\n if (!left || !right) return null;\n return t.jsxMemberExpression(left, right);\n }\n\n return null;\n}\n\nfunction parseStyledTarget(\n tag: t.TaggedTemplateExpression['tag'],\n styledNames: Set<string>,\n): StyledTarget | null {\n if (\n t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object) &&\n styledNames.has(tag.object.name) &&\n t.isIdentifier(tag.property)\n ) {\n return { kind: 'intrinsic', jsxName: t.jsxIdentifier(tag.property.name) };\n }\n\n if (t.isCallExpression(tag) && t.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {\n const firstArg = tag.arguments[0];\n if (!firstArg || !t.isExpression(firstArg)) return null;\n const jsxName = memberExpressionToJsxName(firstArg);\n if (!jsxName) return null;\n return { kind: 'component', jsxName };\n }\n\n return null;\n}\n\nfunction addWarning(warnings: MigrationWarning[], message: string, nodeName?: string): void {\n warnings.push({ message, nodeName });\n}\n\nfunction createMergedClassExpression(existing: t.Expression, classNameIdentifier: t.Identifier): t.Expression {\n return t.callExpression(\n t.memberExpression(\n t.callExpression(t.memberExpression(t.arrayExpression([existing, classNameIdentifier]), t.identifier('filter')), [\n t.identifier('Boolean'),\n ]),\n t.identifier('join'),\n ),\n [t.stringLiteral(' ')],\n );\n}\n\nfunction updateClassNameAttribute(\n openingElement: t.JSXOpeningElement,\n classNameIdentifier: t.Identifier,\n): void {\n const existingAttr = openingElement.attributes.find(\n (attribute): attribute is t.JSXAttribute =>\n t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name: 'className' }),\n );\n\n if (!existingAttr) {\n openingElement.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(classNameIdentifier)),\n );\n return;\n }\n\n if (!existingAttr.value) {\n existingAttr.value = t.jsxExpressionContainer(classNameIdentifier);\n return;\n }\n\n if (t.isStringLiteral(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(t.stringLiteral(existingAttr.value.value), classNameIdentifier),\n );\n return;\n }\n\n if (t.isJSXExpressionContainer(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(existingAttr.value.expression as t.Expression, classNameIdentifier),\n );\n }\n}\n\nfunction ensureStylesImport(ast: t.File): void {\n let typestylesImport: t.ImportDeclaration | null = null;\n\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement) && statement.source.value === 'typestyles') {\n typestylesImport = statement;\n break;\n }\n }\n\n if (!typestylesImport) {\n ast.program.body.unshift(\n t.importDeclaration(\n [t.importSpecifier(t.identifier('styles'), t.identifier('styles'))],\n t.stringLiteral('typestyles'),\n ),\n );\n return;\n }\n\n const hasStylesSpecifier = typestylesImport.specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'styles' }) &&\n t.isIdentifier(specifier.local, { name: 'styles' }),\n );\n\n if (!hasStylesSpecifier) {\n typestylesImport.specifiers.push(\n t.importSpecifier(t.identifier('styles'), t.identifier('styles')),\n );\n }\n}\n\nfunction cleanupUnusedImports(ast: t.File): void {\n traverse(ast, {\n Program(path) {\n path.scope.crawl();\n },\n ImportDeclaration(path) {\n const unusedLocals = path.node.specifiers.filter((specifier) => {\n if (\n path.node.source.value === 'typestyles' &&\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.local, { name: 'styles' })\n ) {\n return false;\n }\n const local = specifier.local.name;\n const binding = path.scope.getBinding(local);\n return !binding || binding.referencePaths.length === 0;\n });\n\n if (unusedLocals.length === 0) return;\n\n path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier));\n if (path.node.specifiers.length === 0) {\n path.remove();\n }\n },\n });\n}\n\nfunction isOnlyJsxReferences(binding: NodePath<t.VariableDeclarator>['scope']['bindings'][string]): boolean {\n return binding.referencePaths.every((referencePath) => {\n const parent = referencePath.parentPath;\n if (!parent) return false;\n return (\n (parent.isJSXOpeningElement() && parent.get('name') === referencePath) ||\n (parent.isJSXClosingElement() && parent.get('name') === referencePath)\n );\n });\n}\n\nexport function migrateSource(filePath: string, source: string): FileMigrationResult {\n const warnings: MigrationWarning[] = [];\n let changed = false;\n\n const ast = parse(source, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n });\n\n const styledNames = new Set<string>();\n const cssTagNames = new Set<string>();\n const styledTransforms = new Map<string, StyledTransform>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n if (path.node.source.value === 'styled-components' || path.node.source.value === '@emotion/styled') {\n for (const specifier of path.node.specifiers) {\n if (t.isImportDefaultSpecifier(specifier)) {\n styledNames.add(specifier.local.name);\n }\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n\n if (path.node.source.value === '@emotion/react' || path.node.source.value === '@emotion/css') {\n for (const specifier of path.node.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n },\n });\n\n traverse(ast, {\n VariableDeclarator(path) {\n if (!t.isIdentifier(path.node.id)) return;\n if (!t.isTaggedTemplateExpression(path.node.init)) return;\n\n const variableName = path.node.id.name;\n const binding = path.scope.getBinding(variableName);\n if (!binding) return;\n\n const template = path.node.init.quasi;\n if (template.expressions.length > 0) {\n addWarning(\n warnings,\n 'Skipped template literal with interpolations. Only static templates are migrated.',\n variableName,\n );\n return;\n }\n\n const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n const objectExpression = cssToObjectExpression(cssText, warnings);\n if (!objectExpression) {\n addWarning(warnings, 'Skipped because CSS could not be parsed.', variableName);\n return;\n }\n\n const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);\n if (styledTarget) {\n const declaration = path.parentPath;\n if (\n declaration.parentPath?.isExportNamedDeclaration() ||\n declaration.parentPath?.isExportDefaultDeclaration()\n ) {\n addWarning(\n warnings,\n 'Skipped exported styled component to avoid changing external API shape.',\n variableName,\n );\n return;\n }\n\n if (!isOnlyJsxReferences(binding)) {\n addWarning(\n warnings,\n 'Skipped styled component with non-JSX references.',\n variableName,\n );\n return;\n }\n\n const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;\n path.node.id = t.identifier(classConstName);\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n\n styledTransforms.set(variableName, {\n originalName: variableName,\n classConstName,\n target: styledTarget,\n });\n changed = true;\n return;\n }\n\n if (t.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n changed = true;\n }\n },\n });\n\n if (styledTransforms.size > 0) {\n traverse(ast, {\n JSXElement(path) {\n const openingName = path.node.openingElement.name;\n if (!t.isJSXIdentifier(openingName)) return;\n const transform = styledTransforms.get(openingName.name);\n if (!transform) return;\n\n path.node.openingElement.name = transform.target.jsxName;\n if (path.node.closingElement) {\n path.node.closingElement.name = transform.target.jsxName;\n }\n\n updateClassNameAttribute(path.node.openingElement, t.identifier(transform.classConstName));\n },\n });\n }\n\n if (changed) {\n ensureStylesImport(ast);\n cleanupUnusedImports(ast);\n }\n\n const output = generate(\n ast,\n {\n retainLines: false,\n comments: true,\n concise: false,\n },\n source,\n );\n\n return {\n filePath,\n changed: changed && output.code !== source,\n code: output.code,\n warnings,\n };\n}\n","import { stat } from 'node:fs/promises';\nimport { extname, relative, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport picomatch from 'picomatch';\n\nconst DEFAULT_EXCLUDES = ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/.turbo/**'];\n\nfunction normalizeExtension(extension: string): string {\n return extension.startsWith('.') ? extension : `.${extension}`;\n}\n\nexport async function collectTargetFiles(\n cwd: string,\n targets: string[],\n extensions: string[],\n include: string[],\n exclude: string[],\n): Promise<string[]> {\n const normalizedTargets = targets.length > 0 ? targets : ['.'];\n const literalFiles: string[] = [];\n const dynamicPatterns: string[] = [];\n\n for (const target of normalizedTargets) {\n const absolute = resolve(cwd, target);\n try {\n const targetStat = await stat(absolute);\n if (targetStat.isFile()) {\n literalFiles.push(absolute);\n } else if (targetStat.isDirectory()) {\n dynamicPatterns.push(`${absolute.split('\\\\').join('/')}/**/*`);\n }\n } catch {\n dynamicPatterns.push(target);\n }\n }\n\n const globbed = await fg(dynamicPatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [...DEFAULT_EXCLUDES, ...exclude],\n });\n\n const extensionSet = new Set(extensions.map(normalizeExtension));\n const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;\n const unique = new Set([...literalFiles, ...globbed]);\n\n return Array.from(unique)\n .filter((filePath) => extensionSet.has(extname(filePath)))\n .filter((filePath) => {\n if (!includeMatchers) return true;\n const rel = relative(cwd, filePath).split('\\\\').join('/');\n return includeMatchers.some((matcher) => matcher(rel));\n })\n .sort();\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { createPatch } from 'diff';\nimport type { CliOptions, MigrationReport, MigrationSummary } from './types.js';\nimport { collectTargetFiles } from './files.js';\nimport { migrateSource } from './transform.js';\n\nfunction renderPatch(filePath: string, before: string, after: string): string {\n return createPatch(filePath, before, after, 'before', 'after')\n .split('\\n')\n .slice(2)\n .join('\\n');\n}\n\nexport async function runMigration(cwd: string, options: CliOptions): Promise<MigrationReport> {\n const files = await collectTargetFiles(\n cwd,\n options.targets,\n options.extensions,\n options.include,\n options.exclude,\n );\n\n const reportEntries: MigrationReport['files'] = [];\n let changedCount = 0;\n let warningCount = 0;\n\n for (const filePath of files) {\n const before = await readFile(filePath, 'utf8');\n const result = migrateSource(filePath, before);\n const relativePath = relative(cwd, filePath);\n\n warningCount += result.warnings.length;\n if (result.changed) {\n changedCount += 1;\n if (options.write) {\n await writeFile(filePath, result.code, 'utf8');\n process.stdout.write(`updated ${relativePath}\\n`);\n } else {\n process.stdout.write(`\\n--- ${relativePath} (dry-run) ---\\n`);\n process.stdout.write(`${renderPatch(relativePath, before, result.code)}\\n`);\n }\n }\n\n for (const warning of result.warnings) {\n const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : '';\n process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}\\n`);\n }\n\n reportEntries.push({\n filePath: relativePath,\n changed: result.changed,\n warnings: result.warnings,\n });\n }\n\n const summary: MigrationSummary = {\n filesScanned: files.length,\n filesChanged: changedCount,\n warnings: warningCount,\n };\n\n process.stdout.write(\n `\\nScanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.\\n`,\n );\n\n const report: MigrationReport = {\n summary,\n files: reportEntries,\n };\n\n if (options.reportPath) {\n await mkdir(dirname(options.reportPath), { recursive: true });\n await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n process.stdout.write(`Report written to ${options.reportPath}\\n`);\n }\n\n return report;\n}\n"]} | ||
| {"version":3,"sources":["../src/css.ts","../src/transform.ts","../src/files.ts","../src/migrate.ts"],"names":["t","postcss","t2","traverse","parse","objectExpression","generate","resolve","stat","fg","picomatch","extname","relative","createPatch","readFile","writeFile","mkdir","dirname"],"mappings":"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","file":"index.cjs","sourcesContent":["import postcss, { type ChildNode, type Container } from 'postcss';\nimport * as t from '@babel/types';\nimport type { MigrationWarning } from './types';\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction toValueNode(value: string): t.Expression {\n const trimmed = value.trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return t.numericLiteral(Number(trimmed));\n }\n return t.stringLiteral(trimmed);\n}\n\nfunction toKeyNode(key: string): t.Expression {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return t.identifier(key);\n }\n return t.stringLiteral(key);\n}\n\nfunction nodesToObject(\n nodes: ChildNode[] | undefined,\n warnings: MigrationWarning[],\n): t.ObjectExpression {\n const properties: t.ObjectProperty[] = [];\n\n for (const node of nodes ?? []) {\n if (node.type === 'decl') {\n const normalized = node.prop.startsWith('--') ? node.prop : camelCaseProperty(node.prop);\n properties.push(t.objectProperty(toKeyNode(normalized), toValueNode(node.value)));\n continue;\n }\n\n if (node.type === 'rule') {\n const nested = nodesToObject(node.nodes, warnings);\n properties.push(t.objectProperty(t.stringLiteral(node.selector.trim()), nested));\n continue;\n }\n\n warnings.push({\n message: `Unsupported CSS node \"${node.type}\" skipped.`,\n });\n }\n\n return t.objectExpression(properties);\n}\n\nexport function cssToObjectExpression(\n cssText: string,\n warnings: MigrationWarning[],\n): t.ObjectExpression | null {\n try {\n const root = postcss.parse(cssText);\n return nodesToObject((root as unknown as Container).nodes, warnings);\n } catch (error) {\n warnings.push({\n message: `Could not parse CSS template literal: ${(error as Error).message}`,\n });\n return null;\n }\n}\n","import { parse } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { cssToObjectExpression } from './css';\nimport type { FileMigrationResult, MigrationWarning } from './types';\n\ntype StyledTarget =\n | { kind: 'intrinsic'; jsxName: t.JSXIdentifier }\n | { kind: 'component'; jsxName: t.JSXIdentifier | t.JSXMemberExpression };\n\ntype StyledTransform = {\n originalName: string;\n classConstName: string;\n target: StyledTarget;\n};\n\nfunction toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction memberExpressionToJsxName(\n expression: t.Expression,\n): t.JSXIdentifier | t.JSXMemberExpression | null {\n if (t.isIdentifier(expression)) {\n return t.jsxIdentifier(expression.name);\n }\n\n if (t.isMemberExpression(expression) && !expression.computed) {\n const left = memberExpressionToJsxName(expression.object as t.Expression);\n const right = t.isIdentifier(expression.property)\n ? t.jsxIdentifier(expression.property.name)\n : null;\n if (!left || !right) return null;\n return t.jsxMemberExpression(left, right);\n }\n\n return null;\n}\n\nfunction parseStyledTarget(\n tag: t.TaggedTemplateExpression['tag'],\n styledNames: Set<string>,\n): StyledTarget | null {\n if (\n t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object) &&\n styledNames.has(tag.object.name) &&\n t.isIdentifier(tag.property)\n ) {\n return { kind: 'intrinsic', jsxName: t.jsxIdentifier(tag.property.name) };\n }\n\n if (t.isCallExpression(tag) && t.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {\n const firstArg = tag.arguments[0];\n if (!firstArg || !t.isExpression(firstArg)) return null;\n const jsxName = memberExpressionToJsxName(firstArg);\n if (!jsxName) return null;\n return { kind: 'component', jsxName };\n }\n\n return null;\n}\n\nfunction addWarning(warnings: MigrationWarning[], message: string, nodeName?: string): void {\n warnings.push({ message, nodeName });\n}\n\nfunction createMergedClassExpression(\n existing: t.Expression,\n classNameIdentifier: t.Identifier,\n): t.Expression {\n return t.callExpression(\n t.memberExpression(\n t.callExpression(\n t.memberExpression(\n t.arrayExpression([existing, classNameIdentifier]),\n t.identifier('filter'),\n ),\n [t.identifier('Boolean')],\n ),\n t.identifier('join'),\n ),\n [t.stringLiteral(' ')],\n );\n}\n\nfunction updateClassNameAttribute(\n openingElement: t.JSXOpeningElement,\n classNameIdentifier: t.Identifier,\n): void {\n const existingAttr = openingElement.attributes.find(\n (attribute): attribute is t.JSXAttribute =>\n t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name: 'className' }),\n );\n\n if (!existingAttr) {\n openingElement.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(classNameIdentifier)),\n );\n return;\n }\n\n if (!existingAttr.value) {\n existingAttr.value = t.jsxExpressionContainer(classNameIdentifier);\n return;\n }\n\n if (t.isStringLiteral(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(t.stringLiteral(existingAttr.value.value), classNameIdentifier),\n );\n return;\n }\n\n if (t.isJSXExpressionContainer(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(\n existingAttr.value.expression as t.Expression,\n classNameIdentifier,\n ),\n );\n }\n}\n\nfunction ensureStylesImport(ast: t.File): void {\n let typestylesImport: t.ImportDeclaration | null = null;\n\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement) && statement.source.value === 'typestyles') {\n typestylesImport = statement;\n break;\n }\n }\n\n if (!typestylesImport) {\n ast.program.body.unshift(\n t.importDeclaration(\n [t.importSpecifier(t.identifier('styles'), t.identifier('styles'))],\n t.stringLiteral('typestyles'),\n ),\n );\n return;\n }\n\n const hasStylesSpecifier = typestylesImport.specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'styles' }) &&\n t.isIdentifier(specifier.local, { name: 'styles' }),\n );\n\n if (!hasStylesSpecifier) {\n typestylesImport.specifiers.push(\n t.importSpecifier(t.identifier('styles'), t.identifier('styles')),\n );\n }\n}\n\nfunction cleanupUnusedImports(ast: t.File): void {\n traverse(ast, {\n Program(path) {\n path.scope.crawl();\n },\n ImportDeclaration(path) {\n const unusedLocals = path.node.specifiers.filter((specifier) => {\n if (\n path.node.source.value === 'typestyles' &&\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.local, { name: 'styles' })\n ) {\n return false;\n }\n const local = specifier.local.name;\n const binding = path.scope.getBinding(local);\n return !binding || binding.referencePaths.length === 0;\n });\n\n if (unusedLocals.length === 0) return;\n\n path.node.specifiers = path.node.specifiers.filter(\n (specifier) => !unusedLocals.includes(specifier),\n );\n if (path.node.specifiers.length === 0) {\n path.remove();\n }\n },\n });\n}\n\nfunction isOnlyJsxReferences(\n binding: NodePath<t.VariableDeclarator>['scope']['bindings'][string],\n): boolean {\n return binding.referencePaths.every((referencePath) => {\n const parent = referencePath.parentPath;\n if (!parent) return false;\n return (\n (parent.isJSXOpeningElement() && parent.get('name') === referencePath) ||\n (parent.isJSXClosingElement() && parent.get('name') === referencePath)\n );\n });\n}\n\nexport function migrateSource(filePath: string, source: string): FileMigrationResult {\n const warnings: MigrationWarning[] = [];\n let changed = false;\n\n const ast = parse(source, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n });\n\n const styledNames = new Set<string>();\n const cssTagNames = new Set<string>();\n const styledTransforms = new Map<string, StyledTransform>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n if (\n path.node.source.value === 'styled-components' ||\n path.node.source.value === '@emotion/styled'\n ) {\n for (const specifier of path.node.specifiers) {\n if (t.isImportDefaultSpecifier(specifier)) {\n styledNames.add(specifier.local.name);\n }\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n\n if (\n path.node.source.value === '@emotion/react' ||\n path.node.source.value === '@emotion/css'\n ) {\n for (const specifier of path.node.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n },\n });\n\n traverse(ast, {\n VariableDeclarator(path) {\n if (!t.isIdentifier(path.node.id)) return;\n if (!t.isTaggedTemplateExpression(path.node.init)) return;\n\n const variableName = path.node.id.name;\n const binding = path.scope.getBinding(variableName);\n if (!binding) return;\n\n const template = path.node.init.quasi;\n if (template.expressions.length > 0) {\n addWarning(\n warnings,\n 'Skipped template literal with interpolations. Only static templates are migrated.',\n variableName,\n );\n return;\n }\n\n const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n const objectExpression = cssToObjectExpression(cssText, warnings);\n if (!objectExpression) {\n addWarning(warnings, 'Skipped because CSS could not be parsed.', variableName);\n return;\n }\n\n const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);\n if (styledTarget) {\n const declaration = path.parentPath;\n if (\n declaration.parentPath?.isExportNamedDeclaration() ||\n declaration.parentPath?.isExportDefaultDeclaration()\n ) {\n addWarning(\n warnings,\n 'Skipped exported styled component to avoid changing external API shape.',\n variableName,\n );\n return;\n }\n\n if (!isOnlyJsxReferences(binding)) {\n addWarning(warnings, 'Skipped styled component with non-JSX references.', variableName);\n return;\n }\n\n const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;\n path.node.id = t.identifier(classConstName);\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n\n styledTransforms.set(variableName, {\n originalName: variableName,\n classConstName,\n target: styledTarget,\n });\n changed = true;\n return;\n }\n\n if (t.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n changed = true;\n }\n },\n });\n\n if (styledTransforms.size > 0) {\n traverse(ast, {\n JSXElement(path) {\n const openingName = path.node.openingElement.name;\n if (!t.isJSXIdentifier(openingName)) return;\n const transform = styledTransforms.get(openingName.name);\n if (!transform) return;\n\n path.node.openingElement.name = transform.target.jsxName;\n if (path.node.closingElement) {\n path.node.closingElement.name = transform.target.jsxName;\n }\n\n updateClassNameAttribute(path.node.openingElement, t.identifier(transform.classConstName));\n },\n });\n }\n\n if (changed) {\n ensureStylesImport(ast);\n cleanupUnusedImports(ast);\n }\n\n const output = generate(\n ast,\n {\n retainLines: false,\n comments: true,\n concise: false,\n },\n source,\n );\n\n return {\n filePath,\n changed: changed && output.code !== source,\n code: output.code,\n warnings,\n };\n}\n","import { stat } from 'node:fs/promises';\nimport { extname, relative, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport picomatch from 'picomatch';\n\nconst DEFAULT_EXCLUDES = ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/.turbo/**'];\n\nfunction normalizeExtension(extension: string): string {\n return extension.startsWith('.') ? extension : `.${extension}`;\n}\n\nexport async function collectTargetFiles(\n cwd: string,\n targets: string[],\n extensions: string[],\n include: string[],\n exclude: string[],\n): Promise<string[]> {\n const normalizedTargets = targets.length > 0 ? targets : ['.'];\n const literalFiles: string[] = [];\n const dynamicPatterns: string[] = [];\n\n for (const target of normalizedTargets) {\n const absolute = resolve(cwd, target);\n try {\n const targetStat = await stat(absolute);\n if (targetStat.isFile()) {\n literalFiles.push(absolute);\n } else if (targetStat.isDirectory()) {\n dynamicPatterns.push(`${absolute.split('\\\\').join('/')}/**/*`);\n }\n } catch {\n dynamicPatterns.push(target);\n }\n }\n\n const globbed = await fg(dynamicPatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [...DEFAULT_EXCLUDES, ...exclude],\n });\n\n const extensionSet = new Set(extensions.map(normalizeExtension));\n const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;\n const unique = new Set([...literalFiles, ...globbed]);\n\n return Array.from(unique)\n .filter((filePath) => extensionSet.has(extname(filePath)))\n .filter((filePath) => {\n if (!includeMatchers) return true;\n const rel = relative(cwd, filePath).split('\\\\').join('/');\n return includeMatchers.some((matcher) => matcher(rel));\n })\n .sort();\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { createPatch } from 'diff';\nimport type { CliOptions, MigrationReport, MigrationSummary } from './types';\nimport { collectTargetFiles } from './files';\nimport { migrateSource } from './transform';\n\nfunction renderPatch(filePath: string, before: string, after: string): string {\n return createPatch(filePath, before, after, 'before', 'after').split('\\n').slice(2).join('\\n');\n}\n\nexport async function runMigration(cwd: string, options: CliOptions): Promise<MigrationReport> {\n const files = await collectTargetFiles(\n cwd,\n options.targets,\n options.extensions,\n options.include,\n options.exclude,\n );\n\n const reportEntries: MigrationReport['files'] = [];\n let changedCount = 0;\n let warningCount = 0;\n\n for (const filePath of files) {\n const before = await readFile(filePath, 'utf8');\n const result = migrateSource(filePath, before);\n const relativePath = relative(cwd, filePath);\n\n warningCount += result.warnings.length;\n if (result.changed) {\n changedCount += 1;\n if (options.write) {\n await writeFile(filePath, result.code, 'utf8');\n process.stdout.write(`updated ${relativePath}\\n`);\n } else {\n process.stdout.write(`\\n--- ${relativePath} (dry-run) ---\\n`);\n process.stdout.write(`${renderPatch(relativePath, before, result.code)}\\n`);\n }\n }\n\n for (const warning of result.warnings) {\n const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : '';\n process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}\\n`);\n }\n\n reportEntries.push({\n filePath: relativePath,\n changed: result.changed,\n warnings: result.warnings,\n });\n }\n\n const summary: MigrationSummary = {\n filesScanned: files.length,\n filesChanged: changedCount,\n warnings: warningCount,\n };\n\n process.stdout.write(\n `\\nScanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.\\n`,\n );\n\n const report: MigrationReport = {\n summary,\n files: reportEntries,\n };\n\n if (options.reportPath) {\n await mkdir(dirname(options.reportPath), { recursive: true });\n await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n process.stdout.write(`Report written to ${options.reportPath}\\n`);\n }\n\n return report;\n}\n"]} |
+1
-1
| #!/usr/bin/env node | ||
| export { migrateSource, runMigration } from './chunk-AINAKUVX.js'; | ||
| export { migrateSource, runMigration } from './chunk-PZHSD3QV.js'; | ||
| //# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
+3
-1
| { | ||
| "name": "@typestyles/migrate", | ||
| "version": "0.2.0", | ||
| "version": "0.3.0", | ||
| "description": "CLI codemods for migrating codebases to typestyles", | ||
@@ -46,2 +46,3 @@ "type": "module", | ||
| "@types/picomatch": "^4.0.2", | ||
| "eslint": "^9.39.2", | ||
| "tsup": "^8.0.0", | ||
@@ -64,4 +65,5 @@ "typescript": "^5.4.0", | ||
| "test": "vitest run", | ||
| "lint": "eslint .", | ||
| "typecheck": "tsc --noEmit" | ||
| } | ||
| } |
| #!/usr/bin/env node | ||
| import { parse } from '@babel/parser'; | ||
| import generate from '@babel/generator'; | ||
| import traverse from '@babel/traverse'; | ||
| import * as t2 from '@babel/types'; | ||
| import postcss from 'postcss'; | ||
| import { readFile, writeFile, mkdir, stat } from 'fs/promises'; | ||
| import { relative, dirname, resolve, extname } from 'path'; | ||
| import { createPatch } from 'diff'; | ||
| import fg from 'fast-glob'; | ||
| import picomatch from 'picomatch'; | ||
| function camelCaseProperty(property) { | ||
| return property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); | ||
| } | ||
| function toValueNode(value) { | ||
| const trimmed = value.trim(); | ||
| if (/^-?\d+(\.\d+)?$/.test(trimmed)) { | ||
| return t2.numericLiteral(Number(trimmed)); | ||
| } | ||
| return t2.stringLiteral(trimmed); | ||
| } | ||
| function toKeyNode(key) { | ||
| if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) { | ||
| return t2.identifier(key); | ||
| } | ||
| return t2.stringLiteral(key); | ||
| } | ||
| function nodesToObject(nodes, warnings) { | ||
| const properties = []; | ||
| for (const node of nodes ?? []) { | ||
| if (node.type === "decl") { | ||
| const normalized = node.prop.startsWith("--") ? node.prop : camelCaseProperty(node.prop); | ||
| properties.push(t2.objectProperty(toKeyNode(normalized), toValueNode(node.value))); | ||
| continue; | ||
| } | ||
| if (node.type === "rule") { | ||
| const nested = nodesToObject(node.nodes, warnings); | ||
| properties.push(t2.objectProperty(t2.stringLiteral(node.selector.trim()), nested)); | ||
| continue; | ||
| } | ||
| warnings.push({ | ||
| message: `Unsupported CSS node "${node.type}" skipped.` | ||
| }); | ||
| } | ||
| return t2.objectExpression(properties); | ||
| } | ||
| function cssToObjectExpression(cssText, warnings) { | ||
| try { | ||
| const root = postcss.parse(cssText); | ||
| return nodesToObject(root.nodes, warnings); | ||
| } catch (error) { | ||
| warnings.push({ | ||
| message: `Could not parse CSS template literal: ${error.message}` | ||
| }); | ||
| return null; | ||
| } | ||
| } | ||
| // src/transform.ts | ||
| function toKebabCase(input) { | ||
| return input.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase(); | ||
| } | ||
| function memberExpressionToJsxName(expression) { | ||
| if (t2.isIdentifier(expression)) { | ||
| return t2.jsxIdentifier(expression.name); | ||
| } | ||
| if (t2.isMemberExpression(expression) && !expression.computed) { | ||
| const left = memberExpressionToJsxName(expression.object); | ||
| const right = t2.isIdentifier(expression.property) ? t2.jsxIdentifier(expression.property.name) : null; | ||
| if (!left || !right) return null; | ||
| return t2.jsxMemberExpression(left, right); | ||
| } | ||
| return null; | ||
| } | ||
| function parseStyledTarget(tag, styledNames) { | ||
| if (t2.isMemberExpression(tag) && t2.isIdentifier(tag.object) && styledNames.has(tag.object.name) && t2.isIdentifier(tag.property)) { | ||
| return { kind: "intrinsic", jsxName: t2.jsxIdentifier(tag.property.name) }; | ||
| } | ||
| if (t2.isCallExpression(tag) && t2.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) { | ||
| const firstArg = tag.arguments[0]; | ||
| if (!firstArg || !t2.isExpression(firstArg)) return null; | ||
| const jsxName = memberExpressionToJsxName(firstArg); | ||
| if (!jsxName) return null; | ||
| return { kind: "component", jsxName }; | ||
| } | ||
| return null; | ||
| } | ||
| function addWarning(warnings, message, nodeName) { | ||
| warnings.push({ message, nodeName }); | ||
| } | ||
| function createMergedClassExpression(existing, classNameIdentifier) { | ||
| return t2.callExpression( | ||
| t2.memberExpression( | ||
| t2.callExpression(t2.memberExpression(t2.arrayExpression([existing, classNameIdentifier]), t2.identifier("filter")), [ | ||
| t2.identifier("Boolean") | ||
| ]), | ||
| t2.identifier("join") | ||
| ), | ||
| [t2.stringLiteral(" ")] | ||
| ); | ||
| } | ||
| function updateClassNameAttribute(openingElement, classNameIdentifier) { | ||
| const existingAttr = openingElement.attributes.find( | ||
| (attribute) => t2.isJSXAttribute(attribute) && t2.isJSXIdentifier(attribute.name, { name: "className" }) | ||
| ); | ||
| if (!existingAttr) { | ||
| openingElement.attributes.push( | ||
| t2.jsxAttribute(t2.jsxIdentifier("className"), t2.jsxExpressionContainer(classNameIdentifier)) | ||
| ); | ||
| return; | ||
| } | ||
| if (!existingAttr.value) { | ||
| existingAttr.value = t2.jsxExpressionContainer(classNameIdentifier); | ||
| return; | ||
| } | ||
| if (t2.isStringLiteral(existingAttr.value)) { | ||
| existingAttr.value = t2.jsxExpressionContainer( | ||
| createMergedClassExpression(t2.stringLiteral(existingAttr.value.value), classNameIdentifier) | ||
| ); | ||
| return; | ||
| } | ||
| if (t2.isJSXExpressionContainer(existingAttr.value)) { | ||
| existingAttr.value = t2.jsxExpressionContainer( | ||
| createMergedClassExpression(existingAttr.value.expression, classNameIdentifier) | ||
| ); | ||
| } | ||
| } | ||
| function ensureStylesImport(ast) { | ||
| let typestylesImport = null; | ||
| for (const statement of ast.program.body) { | ||
| if (t2.isImportDeclaration(statement) && statement.source.value === "typestyles") { | ||
| typestylesImport = statement; | ||
| break; | ||
| } | ||
| } | ||
| if (!typestylesImport) { | ||
| ast.program.body.unshift( | ||
| t2.importDeclaration( | ||
| [t2.importSpecifier(t2.identifier("styles"), t2.identifier("styles"))], | ||
| t2.stringLiteral("typestyles") | ||
| ) | ||
| ); | ||
| return; | ||
| } | ||
| const hasStylesSpecifier = typestylesImport.specifiers.some( | ||
| (specifier) => t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "styles" }) && t2.isIdentifier(specifier.local, { name: "styles" }) | ||
| ); | ||
| if (!hasStylesSpecifier) { | ||
| typestylesImport.specifiers.push( | ||
| t2.importSpecifier(t2.identifier("styles"), t2.identifier("styles")) | ||
| ); | ||
| } | ||
| } | ||
| function cleanupUnusedImports(ast) { | ||
| traverse(ast, { | ||
| Program(path) { | ||
| path.scope.crawl(); | ||
| }, | ||
| ImportDeclaration(path) { | ||
| const unusedLocals = path.node.specifiers.filter((specifier) => { | ||
| if (path.node.source.value === "typestyles" && t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.local, { name: "styles" })) { | ||
| return false; | ||
| } | ||
| const local = specifier.local.name; | ||
| const binding = path.scope.getBinding(local); | ||
| return !binding || binding.referencePaths.length === 0; | ||
| }); | ||
| if (unusedLocals.length === 0) return; | ||
| path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier)); | ||
| if (path.node.specifiers.length === 0) { | ||
| path.remove(); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| function isOnlyJsxReferences(binding) { | ||
| return binding.referencePaths.every((referencePath) => { | ||
| const parent = referencePath.parentPath; | ||
| if (!parent) return false; | ||
| return parent.isJSXOpeningElement() && parent.get("name") === referencePath || parent.isJSXClosingElement() && parent.get("name") === referencePath; | ||
| }); | ||
| } | ||
| function migrateSource(filePath, source) { | ||
| const warnings = []; | ||
| let changed = false; | ||
| const ast = parse(source, { | ||
| sourceType: "module", | ||
| plugins: ["typescript", "jsx"] | ||
| }); | ||
| const styledNames = /* @__PURE__ */ new Set(); | ||
| const cssTagNames = /* @__PURE__ */ new Set(); | ||
| const styledTransforms = /* @__PURE__ */ new Map(); | ||
| traverse(ast, { | ||
| ImportDeclaration(path) { | ||
| if (path.node.source.value === "styled-components" || path.node.source.value === "@emotion/styled") { | ||
| for (const specifier of path.node.specifiers) { | ||
| if (t2.isImportDefaultSpecifier(specifier)) { | ||
| styledNames.add(specifier.local.name); | ||
| } | ||
| if (t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "css" })) { | ||
| cssTagNames.add(specifier.local.name); | ||
| } | ||
| } | ||
| } | ||
| if (path.node.source.value === "@emotion/react" || path.node.source.value === "@emotion/css") { | ||
| for (const specifier of path.node.specifiers) { | ||
| if (t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "css" })) { | ||
| cssTagNames.add(specifier.local.name); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| }); | ||
| traverse(ast, { | ||
| VariableDeclarator(path) { | ||
| if (!t2.isIdentifier(path.node.id)) return; | ||
| if (!t2.isTaggedTemplateExpression(path.node.init)) return; | ||
| const variableName = path.node.id.name; | ||
| const binding = path.scope.getBinding(variableName); | ||
| if (!binding) return; | ||
| const template = path.node.init.quasi; | ||
| if (template.expressions.length > 0) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped template literal with interpolations. Only static templates are migrated.", | ||
| variableName | ||
| ); | ||
| return; | ||
| } | ||
| const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? "").join(""); | ||
| const objectExpression2 = cssToObjectExpression(cssText, warnings); | ||
| if (!objectExpression2) { | ||
| addWarning(warnings, "Skipped because CSS could not be parsed.", variableName); | ||
| return; | ||
| } | ||
| const styledTarget = parseStyledTarget(path.node.init.tag, styledNames); | ||
| if (styledTarget) { | ||
| const declaration = path.parentPath; | ||
| if (declaration.parentPath?.isExportNamedDeclaration() || declaration.parentPath?.isExportDefaultDeclaration()) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped exported styled component to avoid changing external API shape.", | ||
| variableName | ||
| ); | ||
| return; | ||
| } | ||
| if (!isOnlyJsxReferences(binding)) { | ||
| addWarning( | ||
| warnings, | ||
| "Skipped styled component with non-JSX references.", | ||
| variableName | ||
| ); | ||
| return; | ||
| } | ||
| const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name; | ||
| path.node.id = t2.identifier(classConstName); | ||
| path.node.init = t2.callExpression( | ||
| t2.memberExpression(t2.identifier("styles"), t2.identifier("class")), | ||
| [t2.stringLiteral(toKebabCase(variableName)), objectExpression2] | ||
| ); | ||
| styledTransforms.set(variableName, { | ||
| originalName: variableName, | ||
| classConstName, | ||
| target: styledTarget | ||
| }); | ||
| changed = true; | ||
| return; | ||
| } | ||
| if (t2.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) { | ||
| path.node.init = t2.callExpression( | ||
| t2.memberExpression(t2.identifier("styles"), t2.identifier("class")), | ||
| [t2.stringLiteral(toKebabCase(variableName)), objectExpression2] | ||
| ); | ||
| changed = true; | ||
| } | ||
| } | ||
| }); | ||
| if (styledTransforms.size > 0) { | ||
| traverse(ast, { | ||
| JSXElement(path) { | ||
| const openingName = path.node.openingElement.name; | ||
| if (!t2.isJSXIdentifier(openingName)) return; | ||
| const transform = styledTransforms.get(openingName.name); | ||
| if (!transform) return; | ||
| path.node.openingElement.name = transform.target.jsxName; | ||
| if (path.node.closingElement) { | ||
| path.node.closingElement.name = transform.target.jsxName; | ||
| } | ||
| updateClassNameAttribute(path.node.openingElement, t2.identifier(transform.classConstName)); | ||
| } | ||
| }); | ||
| } | ||
| if (changed) { | ||
| ensureStylesImport(ast); | ||
| cleanupUnusedImports(ast); | ||
| } | ||
| const output = generate( | ||
| ast, | ||
| { | ||
| retainLines: false, | ||
| comments: true, | ||
| concise: false | ||
| }, | ||
| source | ||
| ); | ||
| return { | ||
| filePath, | ||
| changed: changed && output.code !== source, | ||
| code: output.code, | ||
| warnings | ||
| }; | ||
| } | ||
| var DEFAULT_EXCLUDES = ["**/node_modules/**", "**/dist/**", "**/.next/**", "**/.turbo/**"]; | ||
| function normalizeExtension(extension) { | ||
| return extension.startsWith(".") ? extension : `.${extension}`; | ||
| } | ||
| async function collectTargetFiles(cwd, targets, extensions, include, exclude) { | ||
| const normalizedTargets = targets.length > 0 ? targets : ["."]; | ||
| const literalFiles = []; | ||
| const dynamicPatterns = []; | ||
| for (const target of normalizedTargets) { | ||
| const absolute = resolve(cwd, target); | ||
| try { | ||
| const targetStat = await stat(absolute); | ||
| if (targetStat.isFile()) { | ||
| literalFiles.push(absolute); | ||
| } else if (targetStat.isDirectory()) { | ||
| dynamicPatterns.push(`${absolute.split("\\").join("/")}/**/*`); | ||
| } | ||
| } catch { | ||
| dynamicPatterns.push(target); | ||
| } | ||
| } | ||
| const globbed = await fg(dynamicPatterns, { | ||
| cwd, | ||
| absolute: true, | ||
| onlyFiles: true, | ||
| ignore: [...DEFAULT_EXCLUDES, ...exclude] | ||
| }); | ||
| const extensionSet = new Set(extensions.map(normalizeExtension)); | ||
| const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null; | ||
| const unique = /* @__PURE__ */ new Set([...literalFiles, ...globbed]); | ||
| return Array.from(unique).filter((filePath) => extensionSet.has(extname(filePath))).filter((filePath) => { | ||
| if (!includeMatchers) return true; | ||
| const rel = relative(cwd, filePath).split("\\").join("/"); | ||
| return includeMatchers.some((matcher) => matcher(rel)); | ||
| }).sort(); | ||
| } | ||
| // src/migrate.ts | ||
| function renderPatch(filePath, before, after) { | ||
| return createPatch(filePath, before, after, "before", "after").split("\n").slice(2).join("\n"); | ||
| } | ||
| async function runMigration(cwd, options) { | ||
| const files = await collectTargetFiles( | ||
| cwd, | ||
| options.targets, | ||
| options.extensions, | ||
| options.include, | ||
| options.exclude | ||
| ); | ||
| const reportEntries = []; | ||
| let changedCount = 0; | ||
| let warningCount = 0; | ||
| for (const filePath of files) { | ||
| const before = await readFile(filePath, "utf8"); | ||
| const result = migrateSource(filePath, before); | ||
| const relativePath = relative(cwd, filePath); | ||
| warningCount += result.warnings.length; | ||
| if (result.changed) { | ||
| changedCount += 1; | ||
| if (options.write) { | ||
| await writeFile(filePath, result.code, "utf8"); | ||
| process.stdout.write(`updated ${relativePath} | ||
| `); | ||
| } else { | ||
| process.stdout.write(` | ||
| --- ${relativePath} (dry-run) --- | ||
| `); | ||
| process.stdout.write(`${renderPatch(relativePath, before, result.code)} | ||
| `); | ||
| } | ||
| } | ||
| for (const warning of result.warnings) { | ||
| const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : ""; | ||
| process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message} | ||
| `); | ||
| } | ||
| reportEntries.push({ | ||
| filePath: relativePath, | ||
| changed: result.changed, | ||
| warnings: result.warnings | ||
| }); | ||
| } | ||
| const summary = { | ||
| filesScanned: files.length, | ||
| filesChanged: changedCount, | ||
| warnings: warningCount | ||
| }; | ||
| process.stdout.write( | ||
| ` | ||
| Scanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}. | ||
| ` | ||
| ); | ||
| const report = { | ||
| summary, | ||
| files: reportEntries | ||
| }; | ||
| if (options.reportPath) { | ||
| await mkdir(dirname(options.reportPath), { recursive: true }); | ||
| await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)} | ||
| `, "utf8"); | ||
| process.stdout.write(`Report written to ${options.reportPath} | ||
| `); | ||
| } | ||
| return report; | ||
| } | ||
| export { migrateSource, runMigration }; | ||
| //# sourceMappingURL=chunk-AINAKUVX.js.map | ||
| //# sourceMappingURL=chunk-AINAKUVX.js.map |
| {"version":3,"sources":["../src/css.ts","../src/transform.ts","../src/files.ts","../src/migrate.ts"],"names":["t","objectExpression","relative"],"mappings":"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","file":"chunk-AINAKUVX.js","sourcesContent":["import postcss, { type ChildNode, type Container } from 'postcss';\nimport * as t from '@babel/types';\nimport type { MigrationWarning } from './types.js';\n\nfunction camelCaseProperty(property: string): string {\n return property.replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction toValueNode(value: string): t.Expression {\n const trimmed = value.trim();\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return t.numericLiteral(Number(trimmed));\n }\n return t.stringLiteral(trimmed);\n}\n\nfunction toKeyNode(key: string): t.Expression {\n if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {\n return t.identifier(key);\n }\n return t.stringLiteral(key);\n}\n\nfunction nodesToObject(\n nodes: ChildNode[] | undefined,\n warnings: MigrationWarning[],\n): t.ObjectExpression {\n const properties: t.ObjectProperty[] = [];\n\n for (const node of nodes ?? []) {\n if (node.type === 'decl') {\n const normalized = node.prop.startsWith('--') ? node.prop : camelCaseProperty(node.prop);\n properties.push(t.objectProperty(toKeyNode(normalized), toValueNode(node.value)));\n continue;\n }\n\n if (node.type === 'rule') {\n const nested = nodesToObject(node.nodes, warnings);\n properties.push(t.objectProperty(t.stringLiteral(node.selector.trim()), nested));\n continue;\n }\n\n warnings.push({\n message: `Unsupported CSS node \"${node.type}\" skipped.`,\n });\n }\n\n return t.objectExpression(properties);\n}\n\nexport function cssToObjectExpression(\n cssText: string,\n warnings: MigrationWarning[],\n): t.ObjectExpression | null {\n try {\n const root = postcss.parse(cssText);\n return nodesToObject((root as unknown as Container).nodes, warnings);\n } catch (error) {\n warnings.push({\n message: `Could not parse CSS template literal: ${(error as Error).message}`,\n });\n return null;\n }\n}\n","import { parse } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { cssToObjectExpression } from './css.js';\nimport type { FileMigrationResult, MigrationWarning } from './types.js';\n\ntype StyledTarget =\n | { kind: 'intrinsic'; jsxName: t.JSXIdentifier }\n | { kind: 'component'; jsxName: t.JSXIdentifier | t.JSXMemberExpression };\n\ntype StyledTransform = {\n originalName: string;\n classConstName: string;\n target: StyledTarget;\n};\n\nfunction toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n}\n\nfunction memberExpressionToJsxName(\n expression: t.Expression,\n): t.JSXIdentifier | t.JSXMemberExpression | null {\n if (t.isIdentifier(expression)) {\n return t.jsxIdentifier(expression.name);\n }\n\n if (t.isMemberExpression(expression) && !expression.computed) {\n const left = memberExpressionToJsxName(expression.object as t.Expression);\n const right = t.isIdentifier(expression.property) ? t.jsxIdentifier(expression.property.name) : null;\n if (!left || !right) return null;\n return t.jsxMemberExpression(left, right);\n }\n\n return null;\n}\n\nfunction parseStyledTarget(\n tag: t.TaggedTemplateExpression['tag'],\n styledNames: Set<string>,\n): StyledTarget | null {\n if (\n t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object) &&\n styledNames.has(tag.object.name) &&\n t.isIdentifier(tag.property)\n ) {\n return { kind: 'intrinsic', jsxName: t.jsxIdentifier(tag.property.name) };\n }\n\n if (t.isCallExpression(tag) && t.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {\n const firstArg = tag.arguments[0];\n if (!firstArg || !t.isExpression(firstArg)) return null;\n const jsxName = memberExpressionToJsxName(firstArg);\n if (!jsxName) return null;\n return { kind: 'component', jsxName };\n }\n\n return null;\n}\n\nfunction addWarning(warnings: MigrationWarning[], message: string, nodeName?: string): void {\n warnings.push({ message, nodeName });\n}\n\nfunction createMergedClassExpression(existing: t.Expression, classNameIdentifier: t.Identifier): t.Expression {\n return t.callExpression(\n t.memberExpression(\n t.callExpression(t.memberExpression(t.arrayExpression([existing, classNameIdentifier]), t.identifier('filter')), [\n t.identifier('Boolean'),\n ]),\n t.identifier('join'),\n ),\n [t.stringLiteral(' ')],\n );\n}\n\nfunction updateClassNameAttribute(\n openingElement: t.JSXOpeningElement,\n classNameIdentifier: t.Identifier,\n): void {\n const existingAttr = openingElement.attributes.find(\n (attribute): attribute is t.JSXAttribute =>\n t.isJSXAttribute(attribute) && t.isJSXIdentifier(attribute.name, { name: 'className' }),\n );\n\n if (!existingAttr) {\n openingElement.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(classNameIdentifier)),\n );\n return;\n }\n\n if (!existingAttr.value) {\n existingAttr.value = t.jsxExpressionContainer(classNameIdentifier);\n return;\n }\n\n if (t.isStringLiteral(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(t.stringLiteral(existingAttr.value.value), classNameIdentifier),\n );\n return;\n }\n\n if (t.isJSXExpressionContainer(existingAttr.value)) {\n existingAttr.value = t.jsxExpressionContainer(\n createMergedClassExpression(existingAttr.value.expression as t.Expression, classNameIdentifier),\n );\n }\n}\n\nfunction ensureStylesImport(ast: t.File): void {\n let typestylesImport: t.ImportDeclaration | null = null;\n\n for (const statement of ast.program.body) {\n if (t.isImportDeclaration(statement) && statement.source.value === 'typestyles') {\n typestylesImport = statement;\n break;\n }\n }\n\n if (!typestylesImport) {\n ast.program.body.unshift(\n t.importDeclaration(\n [t.importSpecifier(t.identifier('styles'), t.identifier('styles'))],\n t.stringLiteral('typestyles'),\n ),\n );\n return;\n }\n\n const hasStylesSpecifier = typestylesImport.specifiers.some(\n (specifier) =>\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'styles' }) &&\n t.isIdentifier(specifier.local, { name: 'styles' }),\n );\n\n if (!hasStylesSpecifier) {\n typestylesImport.specifiers.push(\n t.importSpecifier(t.identifier('styles'), t.identifier('styles')),\n );\n }\n}\n\nfunction cleanupUnusedImports(ast: t.File): void {\n traverse(ast, {\n Program(path) {\n path.scope.crawl();\n },\n ImportDeclaration(path) {\n const unusedLocals = path.node.specifiers.filter((specifier) => {\n if (\n path.node.source.value === 'typestyles' &&\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.local, { name: 'styles' })\n ) {\n return false;\n }\n const local = specifier.local.name;\n const binding = path.scope.getBinding(local);\n return !binding || binding.referencePaths.length === 0;\n });\n\n if (unusedLocals.length === 0) return;\n\n path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier));\n if (path.node.specifiers.length === 0) {\n path.remove();\n }\n },\n });\n}\n\nfunction isOnlyJsxReferences(binding: NodePath<t.VariableDeclarator>['scope']['bindings'][string]): boolean {\n return binding.referencePaths.every((referencePath) => {\n const parent = referencePath.parentPath;\n if (!parent) return false;\n return (\n (parent.isJSXOpeningElement() && parent.get('name') === referencePath) ||\n (parent.isJSXClosingElement() && parent.get('name') === referencePath)\n );\n });\n}\n\nexport function migrateSource(filePath: string, source: string): FileMigrationResult {\n const warnings: MigrationWarning[] = [];\n let changed = false;\n\n const ast = parse(source, {\n sourceType: 'module',\n plugins: ['typescript', 'jsx'],\n });\n\n const styledNames = new Set<string>();\n const cssTagNames = new Set<string>();\n const styledTransforms = new Map<string, StyledTransform>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n if (path.node.source.value === 'styled-components' || path.node.source.value === '@emotion/styled') {\n for (const specifier of path.node.specifiers) {\n if (t.isImportDefaultSpecifier(specifier)) {\n styledNames.add(specifier.local.name);\n }\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n\n if (path.node.source.value === '@emotion/react' || path.node.source.value === '@emotion/css') {\n for (const specifier of path.node.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: 'css' })\n ) {\n cssTagNames.add(specifier.local.name);\n }\n }\n }\n },\n });\n\n traverse(ast, {\n VariableDeclarator(path) {\n if (!t.isIdentifier(path.node.id)) return;\n if (!t.isTaggedTemplateExpression(path.node.init)) return;\n\n const variableName = path.node.id.name;\n const binding = path.scope.getBinding(variableName);\n if (!binding) return;\n\n const template = path.node.init.quasi;\n if (template.expressions.length > 0) {\n addWarning(\n warnings,\n 'Skipped template literal with interpolations. Only static templates are migrated.',\n variableName,\n );\n return;\n }\n\n const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? '').join('');\n const objectExpression = cssToObjectExpression(cssText, warnings);\n if (!objectExpression) {\n addWarning(warnings, 'Skipped because CSS could not be parsed.', variableName);\n return;\n }\n\n const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);\n if (styledTarget) {\n const declaration = path.parentPath;\n if (\n declaration.parentPath?.isExportNamedDeclaration() ||\n declaration.parentPath?.isExportDefaultDeclaration()\n ) {\n addWarning(\n warnings,\n 'Skipped exported styled component to avoid changing external API shape.',\n variableName,\n );\n return;\n }\n\n if (!isOnlyJsxReferences(binding)) {\n addWarning(\n warnings,\n 'Skipped styled component with non-JSX references.',\n variableName,\n );\n return;\n }\n\n const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;\n path.node.id = t.identifier(classConstName);\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n\n styledTransforms.set(variableName, {\n originalName: variableName,\n classConstName,\n target: styledTarget,\n });\n changed = true;\n return;\n }\n\n if (t.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {\n path.node.init = t.callExpression(\n t.memberExpression(t.identifier('styles'), t.identifier('class')),\n [t.stringLiteral(toKebabCase(variableName)), objectExpression],\n );\n changed = true;\n }\n },\n });\n\n if (styledTransforms.size > 0) {\n traverse(ast, {\n JSXElement(path) {\n const openingName = path.node.openingElement.name;\n if (!t.isJSXIdentifier(openingName)) return;\n const transform = styledTransforms.get(openingName.name);\n if (!transform) return;\n\n path.node.openingElement.name = transform.target.jsxName;\n if (path.node.closingElement) {\n path.node.closingElement.name = transform.target.jsxName;\n }\n\n updateClassNameAttribute(path.node.openingElement, t.identifier(transform.classConstName));\n },\n });\n }\n\n if (changed) {\n ensureStylesImport(ast);\n cleanupUnusedImports(ast);\n }\n\n const output = generate(\n ast,\n {\n retainLines: false,\n comments: true,\n concise: false,\n },\n source,\n );\n\n return {\n filePath,\n changed: changed && output.code !== source,\n code: output.code,\n warnings,\n };\n}\n","import { stat } from 'node:fs/promises';\nimport { extname, relative, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport picomatch from 'picomatch';\n\nconst DEFAULT_EXCLUDES = ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/.turbo/**'];\n\nfunction normalizeExtension(extension: string): string {\n return extension.startsWith('.') ? extension : `.${extension}`;\n}\n\nexport async function collectTargetFiles(\n cwd: string,\n targets: string[],\n extensions: string[],\n include: string[],\n exclude: string[],\n): Promise<string[]> {\n const normalizedTargets = targets.length > 0 ? targets : ['.'];\n const literalFiles: string[] = [];\n const dynamicPatterns: string[] = [];\n\n for (const target of normalizedTargets) {\n const absolute = resolve(cwd, target);\n try {\n const targetStat = await stat(absolute);\n if (targetStat.isFile()) {\n literalFiles.push(absolute);\n } else if (targetStat.isDirectory()) {\n dynamicPatterns.push(`${absolute.split('\\\\').join('/')}/**/*`);\n }\n } catch {\n dynamicPatterns.push(target);\n }\n }\n\n const globbed = await fg(dynamicPatterns, {\n cwd,\n absolute: true,\n onlyFiles: true,\n ignore: [...DEFAULT_EXCLUDES, ...exclude],\n });\n\n const extensionSet = new Set(extensions.map(normalizeExtension));\n const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;\n const unique = new Set([...literalFiles, ...globbed]);\n\n return Array.from(unique)\n .filter((filePath) => extensionSet.has(extname(filePath)))\n .filter((filePath) => {\n if (!includeMatchers) return true;\n const rel = relative(cwd, filePath).split('\\\\').join('/');\n return includeMatchers.some((matcher) => matcher(rel));\n })\n .sort();\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\nimport { createPatch } from 'diff';\nimport type { CliOptions, MigrationReport, MigrationSummary } from './types.js';\nimport { collectTargetFiles } from './files.js';\nimport { migrateSource } from './transform.js';\n\nfunction renderPatch(filePath: string, before: string, after: string): string {\n return createPatch(filePath, before, after, 'before', 'after')\n .split('\\n')\n .slice(2)\n .join('\\n');\n}\n\nexport async function runMigration(cwd: string, options: CliOptions): Promise<MigrationReport> {\n const files = await collectTargetFiles(\n cwd,\n options.targets,\n options.extensions,\n options.include,\n options.exclude,\n );\n\n const reportEntries: MigrationReport['files'] = [];\n let changedCount = 0;\n let warningCount = 0;\n\n for (const filePath of files) {\n const before = await readFile(filePath, 'utf8');\n const result = migrateSource(filePath, before);\n const relativePath = relative(cwd, filePath);\n\n warningCount += result.warnings.length;\n if (result.changed) {\n changedCount += 1;\n if (options.write) {\n await writeFile(filePath, result.code, 'utf8');\n process.stdout.write(`updated ${relativePath}\\n`);\n } else {\n process.stdout.write(`\\n--- ${relativePath} (dry-run) ---\\n`);\n process.stdout.write(`${renderPatch(relativePath, before, result.code)}\\n`);\n }\n }\n\n for (const warning of result.warnings) {\n const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : '';\n process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}\\n`);\n }\n\n reportEntries.push({\n filePath: relativePath,\n changed: result.changed,\n warnings: result.warnings,\n });\n }\n\n const summary: MigrationSummary = {\n filesScanned: files.length,\n filesChanged: changedCount,\n warnings: warningCount,\n };\n\n process.stdout.write(\n `\\nScanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.\\n`,\n );\n\n const report: MigrationReport = {\n summary,\n files: reportEntries,\n };\n\n if (options.reportPath) {\n await mkdir(dirname(options.reportPath), { recursive: true });\n await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}\\n`, 'utf8');\n process.stdout.write(`Report written to ${options.reportPath}\\n`);\n }\n\n return report;\n}\n"]} |
163502
0.22%1497
1.01%8
14.29%