@typestyles/migrate 0.0.0-unstable.247bf362710f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs ADDED
@@ -0,0 +1,521 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var path = require('path');
5
+ var promises = require('fs/promises');
6
+ var diff = require('diff');
7
+ var fg = require('fast-glob');
8
+ var picomatch = require('picomatch');
9
+ var parser = require('@babel/parser');
10
+ var generate = require('@babel/generator');
11
+ var traverse = require('@babel/traverse');
12
+ var t2 = require('@babel/types');
13
+ var postcss = require('postcss');
14
+
15
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
+
17
+ function _interopNamespace(e) {
18
+ if (e && e.__esModule) return e;
19
+ var n = Object.create(null);
20
+ if (e) {
21
+ Object.keys(e).forEach(function (k) {
22
+ if (k !== 'default') {
23
+ var d = Object.getOwnPropertyDescriptor(e, k);
24
+ Object.defineProperty(n, k, d.get ? d : {
25
+ enumerable: true,
26
+ get: function () { return e[k]; }
27
+ });
28
+ }
29
+ });
30
+ }
31
+ n.default = e;
32
+ return Object.freeze(n);
33
+ }
34
+
35
+ var fg__default = /*#__PURE__*/_interopDefault(fg);
36
+ var picomatch__default = /*#__PURE__*/_interopDefault(picomatch);
37
+ var generate__default = /*#__PURE__*/_interopDefault(generate);
38
+ var traverse__default = /*#__PURE__*/_interopDefault(traverse);
39
+ var t2__namespace = /*#__PURE__*/_interopNamespace(t2);
40
+ var postcss__default = /*#__PURE__*/_interopDefault(postcss);
41
+
42
+ var DEFAULT_EXCLUDES = ["**/node_modules/**", "**/dist/**", "**/.next/**", "**/.turbo/**"];
43
+ function normalizeExtension(extension) {
44
+ return extension.startsWith(".") ? extension : `.${extension}`;
45
+ }
46
+ async function collectTargetFiles(cwd, targets, extensions, include, exclude) {
47
+ const normalizedTargets = targets.length > 0 ? targets : ["."];
48
+ const literalFiles = [];
49
+ const dynamicPatterns = [];
50
+ for (const target of normalizedTargets) {
51
+ const absolute = path.resolve(cwd, target);
52
+ try {
53
+ const targetStat = await promises.stat(absolute);
54
+ if (targetStat.isFile()) {
55
+ literalFiles.push(absolute);
56
+ } else if (targetStat.isDirectory()) {
57
+ dynamicPatterns.push(`${absolute.split("\\").join("/")}/**/*`);
58
+ }
59
+ } catch {
60
+ dynamicPatterns.push(target);
61
+ }
62
+ }
63
+ const globbed = await fg__default.default(dynamicPatterns, {
64
+ cwd,
65
+ absolute: true,
66
+ onlyFiles: true,
67
+ ignore: [...DEFAULT_EXCLUDES, ...exclude]
68
+ });
69
+ const extensionSet = new Set(extensions.map(normalizeExtension));
70
+ const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch__default.default(pattern)) : null;
71
+ const unique = /* @__PURE__ */ new Set([...literalFiles, ...globbed]);
72
+ return Array.from(unique).filter((filePath) => extensionSet.has(path.extname(filePath))).filter((filePath) => {
73
+ if (!includeMatchers) return true;
74
+ const rel = path.relative(cwd, filePath).split("\\").join("/");
75
+ return includeMatchers.some((matcher) => matcher(rel));
76
+ }).sort();
77
+ }
78
+ function camelCaseProperty(property) {
79
+ return property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
80
+ }
81
+ function toValueNode(value) {
82
+ const trimmed = value.trim();
83
+ if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
84
+ return t2__namespace.numericLiteral(Number(trimmed));
85
+ }
86
+ return t2__namespace.stringLiteral(trimmed);
87
+ }
88
+ function toKeyNode(key) {
89
+ if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {
90
+ return t2__namespace.identifier(key);
91
+ }
92
+ return t2__namespace.stringLiteral(key);
93
+ }
94
+ function nodesToObject(nodes, warnings) {
95
+ const properties = [];
96
+ for (const node of nodes ?? []) {
97
+ if (node.type === "decl") {
98
+ const normalized = node.prop.startsWith("--") ? node.prop : camelCaseProperty(node.prop);
99
+ properties.push(t2__namespace.objectProperty(toKeyNode(normalized), toValueNode(node.value)));
100
+ continue;
101
+ }
102
+ if (node.type === "rule") {
103
+ const nested = nodesToObject(node.nodes, warnings);
104
+ properties.push(t2__namespace.objectProperty(t2__namespace.stringLiteral(node.selector.trim()), nested));
105
+ continue;
106
+ }
107
+ warnings.push({
108
+ message: `Unsupported CSS node "${node.type}" skipped.`
109
+ });
110
+ }
111
+ return t2__namespace.objectExpression(properties);
112
+ }
113
+ function cssToObjectExpression(cssText, warnings) {
114
+ try {
115
+ const root = postcss__default.default.parse(cssText);
116
+ return nodesToObject(root.nodes, warnings);
117
+ } catch (error) {
118
+ warnings.push({
119
+ message: `Could not parse CSS template literal: ${error.message}`
120
+ });
121
+ return null;
122
+ }
123
+ }
124
+
125
+ // src/transform.ts
126
+ function toKebabCase(input) {
127
+ return input.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase();
128
+ }
129
+ function memberExpressionToJsxName(expression) {
130
+ if (t2__namespace.isIdentifier(expression)) {
131
+ return t2__namespace.jsxIdentifier(expression.name);
132
+ }
133
+ if (t2__namespace.isMemberExpression(expression) && !expression.computed) {
134
+ const left = memberExpressionToJsxName(expression.object);
135
+ const right = t2__namespace.isIdentifier(expression.property) ? t2__namespace.jsxIdentifier(expression.property.name) : null;
136
+ if (!left || !right) return null;
137
+ return t2__namespace.jsxMemberExpression(left, right);
138
+ }
139
+ return null;
140
+ }
141
+ function parseStyledTarget(tag, styledNames) {
142
+ if (t2__namespace.isMemberExpression(tag) && t2__namespace.isIdentifier(tag.object) && styledNames.has(tag.object.name) && t2__namespace.isIdentifier(tag.property)) {
143
+ return { kind: "intrinsic", jsxName: t2__namespace.jsxIdentifier(tag.property.name) };
144
+ }
145
+ if (t2__namespace.isCallExpression(tag) && t2__namespace.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {
146
+ const firstArg = tag.arguments[0];
147
+ if (!firstArg || !t2__namespace.isExpression(firstArg)) return null;
148
+ const jsxName = memberExpressionToJsxName(firstArg);
149
+ if (!jsxName) return null;
150
+ return { kind: "component", jsxName };
151
+ }
152
+ return null;
153
+ }
154
+ function addWarning(warnings, message, nodeName) {
155
+ warnings.push({ message, nodeName });
156
+ }
157
+ function createMergedClassExpression(existing, classNameIdentifier) {
158
+ return t2__namespace.callExpression(
159
+ t2__namespace.memberExpression(
160
+ t2__namespace.callExpression(t2__namespace.memberExpression(t2__namespace.arrayExpression([existing, classNameIdentifier]), t2__namespace.identifier("filter")), [
161
+ t2__namespace.identifier("Boolean")
162
+ ]),
163
+ t2__namespace.identifier("join")
164
+ ),
165
+ [t2__namespace.stringLiteral(" ")]
166
+ );
167
+ }
168
+ function updateClassNameAttribute(openingElement, classNameIdentifier) {
169
+ const existingAttr = openingElement.attributes.find(
170
+ (attribute) => t2__namespace.isJSXAttribute(attribute) && t2__namespace.isJSXIdentifier(attribute.name, { name: "className" })
171
+ );
172
+ if (!existingAttr) {
173
+ openingElement.attributes.push(
174
+ t2__namespace.jsxAttribute(t2__namespace.jsxIdentifier("className"), t2__namespace.jsxExpressionContainer(classNameIdentifier))
175
+ );
176
+ return;
177
+ }
178
+ if (!existingAttr.value) {
179
+ existingAttr.value = t2__namespace.jsxExpressionContainer(classNameIdentifier);
180
+ return;
181
+ }
182
+ if (t2__namespace.isStringLiteral(existingAttr.value)) {
183
+ existingAttr.value = t2__namespace.jsxExpressionContainer(
184
+ createMergedClassExpression(t2__namespace.stringLiteral(existingAttr.value.value), classNameIdentifier)
185
+ );
186
+ return;
187
+ }
188
+ if (t2__namespace.isJSXExpressionContainer(existingAttr.value)) {
189
+ existingAttr.value = t2__namespace.jsxExpressionContainer(
190
+ createMergedClassExpression(existingAttr.value.expression, classNameIdentifier)
191
+ );
192
+ }
193
+ }
194
+ function ensureStylesImport(ast) {
195
+ let typestylesImport = null;
196
+ for (const statement of ast.program.body) {
197
+ if (t2__namespace.isImportDeclaration(statement) && statement.source.value === "typestyles") {
198
+ typestylesImport = statement;
199
+ break;
200
+ }
201
+ }
202
+ if (!typestylesImport) {
203
+ ast.program.body.unshift(
204
+ t2__namespace.importDeclaration(
205
+ [t2__namespace.importSpecifier(t2__namespace.identifier("styles"), t2__namespace.identifier("styles"))],
206
+ t2__namespace.stringLiteral("typestyles")
207
+ )
208
+ );
209
+ return;
210
+ }
211
+ const hasStylesSpecifier = typestylesImport.specifiers.some(
212
+ (specifier) => t2__namespace.isImportSpecifier(specifier) && t2__namespace.isIdentifier(specifier.imported, { name: "styles" }) && t2__namespace.isIdentifier(specifier.local, { name: "styles" })
213
+ );
214
+ if (!hasStylesSpecifier) {
215
+ typestylesImport.specifiers.push(
216
+ t2__namespace.importSpecifier(t2__namespace.identifier("styles"), t2__namespace.identifier("styles"))
217
+ );
218
+ }
219
+ }
220
+ function cleanupUnusedImports(ast) {
221
+ traverse__default.default(ast, {
222
+ Program(path) {
223
+ path.scope.crawl();
224
+ },
225
+ ImportDeclaration(path) {
226
+ const unusedLocals = path.node.specifiers.filter((specifier) => {
227
+ if (path.node.source.value === "typestyles" && t2__namespace.isImportSpecifier(specifier) && t2__namespace.isIdentifier(specifier.local, { name: "styles" })) {
228
+ return false;
229
+ }
230
+ const local = specifier.local.name;
231
+ const binding = path.scope.getBinding(local);
232
+ return !binding || binding.referencePaths.length === 0;
233
+ });
234
+ if (unusedLocals.length === 0) return;
235
+ path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier));
236
+ if (path.node.specifiers.length === 0) {
237
+ path.remove();
238
+ }
239
+ }
240
+ });
241
+ }
242
+ function isOnlyJsxReferences(binding) {
243
+ return binding.referencePaths.every((referencePath) => {
244
+ const parent = referencePath.parentPath;
245
+ if (!parent) return false;
246
+ return parent.isJSXOpeningElement() && parent.get("name") === referencePath || parent.isJSXClosingElement() && parent.get("name") === referencePath;
247
+ });
248
+ }
249
+ function migrateSource(filePath, source) {
250
+ const warnings = [];
251
+ let changed = false;
252
+ const ast = parser.parse(source, {
253
+ sourceType: "module",
254
+ plugins: ["typescript", "jsx"]
255
+ });
256
+ const styledNames = /* @__PURE__ */ new Set();
257
+ const cssTagNames = /* @__PURE__ */ new Set();
258
+ const styledTransforms = /* @__PURE__ */ new Map();
259
+ traverse__default.default(ast, {
260
+ ImportDeclaration(path) {
261
+ if (path.node.source.value === "styled-components" || path.node.source.value === "@emotion/styled") {
262
+ for (const specifier of path.node.specifiers) {
263
+ if (t2__namespace.isImportDefaultSpecifier(specifier)) {
264
+ styledNames.add(specifier.local.name);
265
+ }
266
+ if (t2__namespace.isImportSpecifier(specifier) && t2__namespace.isIdentifier(specifier.imported, { name: "css" })) {
267
+ cssTagNames.add(specifier.local.name);
268
+ }
269
+ }
270
+ }
271
+ if (path.node.source.value === "@emotion/react" || path.node.source.value === "@emotion/css") {
272
+ for (const specifier of path.node.specifiers) {
273
+ if (t2__namespace.isImportSpecifier(specifier) && t2__namespace.isIdentifier(specifier.imported, { name: "css" })) {
274
+ cssTagNames.add(specifier.local.name);
275
+ }
276
+ }
277
+ }
278
+ }
279
+ });
280
+ traverse__default.default(ast, {
281
+ VariableDeclarator(path) {
282
+ if (!t2__namespace.isIdentifier(path.node.id)) return;
283
+ if (!t2__namespace.isTaggedTemplateExpression(path.node.init)) return;
284
+ const variableName = path.node.id.name;
285
+ const binding = path.scope.getBinding(variableName);
286
+ if (!binding) return;
287
+ const template = path.node.init.quasi;
288
+ if (template.expressions.length > 0) {
289
+ addWarning(
290
+ warnings,
291
+ "Skipped template literal with interpolations. Only static templates are migrated.",
292
+ variableName
293
+ );
294
+ return;
295
+ }
296
+ const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? "").join("");
297
+ const objectExpression2 = cssToObjectExpression(cssText, warnings);
298
+ if (!objectExpression2) {
299
+ addWarning(warnings, "Skipped because CSS could not be parsed.", variableName);
300
+ return;
301
+ }
302
+ const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);
303
+ if (styledTarget) {
304
+ const declaration = path.parentPath;
305
+ if (declaration.parentPath?.isExportNamedDeclaration() || declaration.parentPath?.isExportDefaultDeclaration()) {
306
+ addWarning(
307
+ warnings,
308
+ "Skipped exported styled component to avoid changing external API shape.",
309
+ variableName
310
+ );
311
+ return;
312
+ }
313
+ if (!isOnlyJsxReferences(binding)) {
314
+ addWarning(
315
+ warnings,
316
+ "Skipped styled component with non-JSX references.",
317
+ variableName
318
+ );
319
+ return;
320
+ }
321
+ const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;
322
+ path.node.id = t2__namespace.identifier(classConstName);
323
+ path.node.init = t2__namespace.callExpression(
324
+ t2__namespace.memberExpression(t2__namespace.identifier("styles"), t2__namespace.identifier("class")),
325
+ [t2__namespace.stringLiteral(toKebabCase(variableName)), objectExpression2]
326
+ );
327
+ styledTransforms.set(variableName, {
328
+ originalName: variableName,
329
+ classConstName,
330
+ target: styledTarget
331
+ });
332
+ changed = true;
333
+ return;
334
+ }
335
+ if (t2__namespace.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {
336
+ path.node.init = t2__namespace.callExpression(
337
+ t2__namespace.memberExpression(t2__namespace.identifier("styles"), t2__namespace.identifier("class")),
338
+ [t2__namespace.stringLiteral(toKebabCase(variableName)), objectExpression2]
339
+ );
340
+ changed = true;
341
+ }
342
+ }
343
+ });
344
+ if (styledTransforms.size > 0) {
345
+ traverse__default.default(ast, {
346
+ JSXElement(path) {
347
+ const openingName = path.node.openingElement.name;
348
+ if (!t2__namespace.isJSXIdentifier(openingName)) return;
349
+ const transform = styledTransforms.get(openingName.name);
350
+ if (!transform) return;
351
+ path.node.openingElement.name = transform.target.jsxName;
352
+ if (path.node.closingElement) {
353
+ path.node.closingElement.name = transform.target.jsxName;
354
+ }
355
+ updateClassNameAttribute(path.node.openingElement, t2__namespace.identifier(transform.classConstName));
356
+ }
357
+ });
358
+ }
359
+ if (changed) {
360
+ ensureStylesImport(ast);
361
+ cleanupUnusedImports(ast);
362
+ }
363
+ const output = generate__default.default(
364
+ ast,
365
+ {
366
+ retainLines: false,
367
+ comments: true,
368
+ concise: false
369
+ },
370
+ source
371
+ );
372
+ return {
373
+ filePath,
374
+ changed: changed && output.code !== source,
375
+ code: output.code,
376
+ warnings
377
+ };
378
+ }
379
+
380
+ // src/migrate.ts
381
+ function renderPatch(filePath, before, after) {
382
+ return diff.createPatch(filePath, before, after, "before", "after").split("\n").slice(2).join("\n");
383
+ }
384
+ async function runMigration(cwd, options) {
385
+ const files = await collectTargetFiles(
386
+ cwd,
387
+ options.targets,
388
+ options.extensions,
389
+ options.include,
390
+ options.exclude
391
+ );
392
+ const reportEntries = [];
393
+ let changedCount = 0;
394
+ let warningCount = 0;
395
+ for (const filePath of files) {
396
+ const before = await promises.readFile(filePath, "utf8");
397
+ const result = migrateSource(filePath, before);
398
+ const relativePath = path.relative(cwd, filePath);
399
+ warningCount += result.warnings.length;
400
+ if (result.changed) {
401
+ changedCount += 1;
402
+ if (options.write) {
403
+ await promises.writeFile(filePath, result.code, "utf8");
404
+ process.stdout.write(`updated ${relativePath}
405
+ `);
406
+ } else {
407
+ process.stdout.write(`
408
+ --- ${relativePath} (dry-run) ---
409
+ `);
410
+ process.stdout.write(`${renderPatch(relativePath, before, result.code)}
411
+ `);
412
+ }
413
+ }
414
+ for (const warning of result.warnings) {
415
+ const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : "";
416
+ process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}
417
+ `);
418
+ }
419
+ reportEntries.push({
420
+ filePath: relativePath,
421
+ changed: result.changed,
422
+ warnings: result.warnings
423
+ });
424
+ }
425
+ const summary = {
426
+ filesScanned: files.length,
427
+ filesChanged: changedCount,
428
+ warnings: warningCount
429
+ };
430
+ process.stdout.write(
431
+ `
432
+ Scanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.
433
+ `
434
+ );
435
+ const report = {
436
+ summary,
437
+ files: reportEntries
438
+ };
439
+ if (options.reportPath) {
440
+ await promises.mkdir(path.dirname(options.reportPath), { recursive: true });
441
+ await promises.writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}
442
+ `, "utf8");
443
+ process.stdout.write(`Report written to ${options.reportPath}
444
+ `);
445
+ }
446
+ return report;
447
+ }
448
+
449
+ // src/cli.ts
450
+ var HELP_TEXT = `typestyles-migrate <paths...> [options]
451
+
452
+ Options:
453
+ --write Apply changes in-place (default is dry-run)
454
+ --include <glob> Include glob (repeatable)
455
+ --exclude <glob> Exclude glob (repeatable)
456
+ --extensions <list> Comma-separated extensions (default: .ts,.tsx)
457
+ --report <path> Write JSON report to the provided path
458
+ --help Show this help
459
+ `;
460
+ function parseCliArgs(argv) {
461
+ if (argv.includes("--help")) {
462
+ process.stdout.write(HELP_TEXT);
463
+ process.exit(0);
464
+ }
465
+ const targets = [];
466
+ const include = [];
467
+ const exclude = [];
468
+ let extensions = [".ts", ".tsx"];
469
+ let reportPath;
470
+ let write = false;
471
+ for (let i = 0; i < argv.length; i += 1) {
472
+ const token = argv[i];
473
+ if (token === "--write") {
474
+ write = true;
475
+ continue;
476
+ }
477
+ if (token === "--include" && argv[i + 1]) {
478
+ include.push(argv[i + 1]);
479
+ i += 1;
480
+ continue;
481
+ }
482
+ if (token === "--exclude" && argv[i + 1]) {
483
+ exclude.push(argv[i + 1]);
484
+ i += 1;
485
+ continue;
486
+ }
487
+ if (token === "--extensions" && argv[i + 1]) {
488
+ extensions = argv[i + 1].split(",").map((item) => item.trim()).filter(Boolean);
489
+ i += 1;
490
+ continue;
491
+ }
492
+ if (token === "--report" && argv[i + 1]) {
493
+ reportPath = path.resolve(process.cwd(), argv[i + 1]);
494
+ i += 1;
495
+ continue;
496
+ }
497
+ if (!token.startsWith("--")) {
498
+ targets.push(token);
499
+ }
500
+ }
501
+ return {
502
+ targets: targets.length > 0 ? targets : ["."],
503
+ write,
504
+ include,
505
+ exclude,
506
+ extensions,
507
+ reportPath
508
+ };
509
+ }
510
+ async function main() {
511
+ const args = process.argv.slice(2);
512
+ const options = parseCliArgs(args);
513
+ await runMigration(process.cwd(), options);
514
+ }
515
+ main().catch((error) => {
516
+ process.stderr.write(`${error.message}
517
+ `);
518
+ process.exit(1);
519
+ });
520
+ //# sourceMappingURL=cli.cjs.map
521
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
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"]}
package/dist/cli.d.cts ADDED
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+
2
+ export { }