@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.
@@ -0,0 +1,422 @@
1
+ #!/usr/bin/env node
2
+ import { parse } from '@babel/parser';
3
+ import generate from '@babel/generator';
4
+ import traverse from '@babel/traverse';
5
+ import * as t2 from '@babel/types';
6
+ import postcss from 'postcss';
7
+ import { readFile, writeFile, mkdir, stat } from 'fs/promises';
8
+ import { relative, dirname, resolve, extname } from 'path';
9
+ import { createPatch } from 'diff';
10
+ import fg from 'fast-glob';
11
+ import picomatch from 'picomatch';
12
+
13
+ function camelCaseProperty(property) {
14
+ return property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
15
+ }
16
+ function toValueNode(value) {
17
+ const trimmed = value.trim();
18
+ if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
19
+ return t2.numericLiteral(Number(trimmed));
20
+ }
21
+ return t2.stringLiteral(trimmed);
22
+ }
23
+ function toKeyNode(key) {
24
+ if (/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)) {
25
+ return t2.identifier(key);
26
+ }
27
+ return t2.stringLiteral(key);
28
+ }
29
+ function nodesToObject(nodes, warnings) {
30
+ const properties = [];
31
+ for (const node of nodes ?? []) {
32
+ if (node.type === "decl") {
33
+ const normalized = node.prop.startsWith("--") ? node.prop : camelCaseProperty(node.prop);
34
+ properties.push(t2.objectProperty(toKeyNode(normalized), toValueNode(node.value)));
35
+ continue;
36
+ }
37
+ if (node.type === "rule") {
38
+ const nested = nodesToObject(node.nodes, warnings);
39
+ properties.push(t2.objectProperty(t2.stringLiteral(node.selector.trim()), nested));
40
+ continue;
41
+ }
42
+ warnings.push({
43
+ message: `Unsupported CSS node "${node.type}" skipped.`
44
+ });
45
+ }
46
+ return t2.objectExpression(properties);
47
+ }
48
+ function cssToObjectExpression(cssText, warnings) {
49
+ try {
50
+ const root = postcss.parse(cssText);
51
+ return nodesToObject(root.nodes, warnings);
52
+ } catch (error) {
53
+ warnings.push({
54
+ message: `Could not parse CSS template literal: ${error.message}`
55
+ });
56
+ return null;
57
+ }
58
+ }
59
+
60
+ // src/transform.ts
61
+ function toKebabCase(input) {
62
+ return input.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase();
63
+ }
64
+ function memberExpressionToJsxName(expression) {
65
+ if (t2.isIdentifier(expression)) {
66
+ return t2.jsxIdentifier(expression.name);
67
+ }
68
+ if (t2.isMemberExpression(expression) && !expression.computed) {
69
+ const left = memberExpressionToJsxName(expression.object);
70
+ const right = t2.isIdentifier(expression.property) ? t2.jsxIdentifier(expression.property.name) : null;
71
+ if (!left || !right) return null;
72
+ return t2.jsxMemberExpression(left, right);
73
+ }
74
+ return null;
75
+ }
76
+ function parseStyledTarget(tag, styledNames) {
77
+ if (t2.isMemberExpression(tag) && t2.isIdentifier(tag.object) && styledNames.has(tag.object.name) && t2.isIdentifier(tag.property)) {
78
+ return { kind: "intrinsic", jsxName: t2.jsxIdentifier(tag.property.name) };
79
+ }
80
+ if (t2.isCallExpression(tag) && t2.isIdentifier(tag.callee) && styledNames.has(tag.callee.name)) {
81
+ const firstArg = tag.arguments[0];
82
+ if (!firstArg || !t2.isExpression(firstArg)) return null;
83
+ const jsxName = memberExpressionToJsxName(firstArg);
84
+ if (!jsxName) return null;
85
+ return { kind: "component", jsxName };
86
+ }
87
+ return null;
88
+ }
89
+ function addWarning(warnings, message, nodeName) {
90
+ warnings.push({ message, nodeName });
91
+ }
92
+ function createMergedClassExpression(existing, classNameIdentifier) {
93
+ return t2.callExpression(
94
+ t2.memberExpression(
95
+ t2.callExpression(t2.memberExpression(t2.arrayExpression([existing, classNameIdentifier]), t2.identifier("filter")), [
96
+ t2.identifier("Boolean")
97
+ ]),
98
+ t2.identifier("join")
99
+ ),
100
+ [t2.stringLiteral(" ")]
101
+ );
102
+ }
103
+ function updateClassNameAttribute(openingElement, classNameIdentifier) {
104
+ const existingAttr = openingElement.attributes.find(
105
+ (attribute) => t2.isJSXAttribute(attribute) && t2.isJSXIdentifier(attribute.name, { name: "className" })
106
+ );
107
+ if (!existingAttr) {
108
+ openingElement.attributes.push(
109
+ t2.jsxAttribute(t2.jsxIdentifier("className"), t2.jsxExpressionContainer(classNameIdentifier))
110
+ );
111
+ return;
112
+ }
113
+ if (!existingAttr.value) {
114
+ existingAttr.value = t2.jsxExpressionContainer(classNameIdentifier);
115
+ return;
116
+ }
117
+ if (t2.isStringLiteral(existingAttr.value)) {
118
+ existingAttr.value = t2.jsxExpressionContainer(
119
+ createMergedClassExpression(t2.stringLiteral(existingAttr.value.value), classNameIdentifier)
120
+ );
121
+ return;
122
+ }
123
+ if (t2.isJSXExpressionContainer(existingAttr.value)) {
124
+ existingAttr.value = t2.jsxExpressionContainer(
125
+ createMergedClassExpression(existingAttr.value.expression, classNameIdentifier)
126
+ );
127
+ }
128
+ }
129
+ function ensureStylesImport(ast) {
130
+ let typestylesImport = null;
131
+ for (const statement of ast.program.body) {
132
+ if (t2.isImportDeclaration(statement) && statement.source.value === "typestyles") {
133
+ typestylesImport = statement;
134
+ break;
135
+ }
136
+ }
137
+ if (!typestylesImport) {
138
+ ast.program.body.unshift(
139
+ t2.importDeclaration(
140
+ [t2.importSpecifier(t2.identifier("styles"), t2.identifier("styles"))],
141
+ t2.stringLiteral("typestyles")
142
+ )
143
+ );
144
+ return;
145
+ }
146
+ const hasStylesSpecifier = typestylesImport.specifiers.some(
147
+ (specifier) => t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "styles" }) && t2.isIdentifier(specifier.local, { name: "styles" })
148
+ );
149
+ if (!hasStylesSpecifier) {
150
+ typestylesImport.specifiers.push(
151
+ t2.importSpecifier(t2.identifier("styles"), t2.identifier("styles"))
152
+ );
153
+ }
154
+ }
155
+ function cleanupUnusedImports(ast) {
156
+ traverse(ast, {
157
+ Program(path) {
158
+ path.scope.crawl();
159
+ },
160
+ ImportDeclaration(path) {
161
+ const unusedLocals = path.node.specifiers.filter((specifier) => {
162
+ if (path.node.source.value === "typestyles" && t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.local, { name: "styles" })) {
163
+ return false;
164
+ }
165
+ const local = specifier.local.name;
166
+ const binding = path.scope.getBinding(local);
167
+ return !binding || binding.referencePaths.length === 0;
168
+ });
169
+ if (unusedLocals.length === 0) return;
170
+ path.node.specifiers = path.node.specifiers.filter((specifier) => !unusedLocals.includes(specifier));
171
+ if (path.node.specifiers.length === 0) {
172
+ path.remove();
173
+ }
174
+ }
175
+ });
176
+ }
177
+ function isOnlyJsxReferences(binding) {
178
+ return binding.referencePaths.every((referencePath) => {
179
+ const parent = referencePath.parentPath;
180
+ if (!parent) return false;
181
+ return parent.isJSXOpeningElement() && parent.get("name") === referencePath || parent.isJSXClosingElement() && parent.get("name") === referencePath;
182
+ });
183
+ }
184
+ function migrateSource(filePath, source) {
185
+ const warnings = [];
186
+ let changed = false;
187
+ const ast = parse(source, {
188
+ sourceType: "module",
189
+ plugins: ["typescript", "jsx"]
190
+ });
191
+ const styledNames = /* @__PURE__ */ new Set();
192
+ const cssTagNames = /* @__PURE__ */ new Set();
193
+ const styledTransforms = /* @__PURE__ */ new Map();
194
+ traverse(ast, {
195
+ ImportDeclaration(path) {
196
+ if (path.node.source.value === "styled-components" || path.node.source.value === "@emotion/styled") {
197
+ for (const specifier of path.node.specifiers) {
198
+ if (t2.isImportDefaultSpecifier(specifier)) {
199
+ styledNames.add(specifier.local.name);
200
+ }
201
+ if (t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "css" })) {
202
+ cssTagNames.add(specifier.local.name);
203
+ }
204
+ }
205
+ }
206
+ if (path.node.source.value === "@emotion/react" || path.node.source.value === "@emotion/css") {
207
+ for (const specifier of path.node.specifiers) {
208
+ if (t2.isImportSpecifier(specifier) && t2.isIdentifier(specifier.imported, { name: "css" })) {
209
+ cssTagNames.add(specifier.local.name);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ });
215
+ traverse(ast, {
216
+ VariableDeclarator(path) {
217
+ if (!t2.isIdentifier(path.node.id)) return;
218
+ if (!t2.isTaggedTemplateExpression(path.node.init)) return;
219
+ const variableName = path.node.id.name;
220
+ const binding = path.scope.getBinding(variableName);
221
+ if (!binding) return;
222
+ const template = path.node.init.quasi;
223
+ if (template.expressions.length > 0) {
224
+ addWarning(
225
+ warnings,
226
+ "Skipped template literal with interpolations. Only static templates are migrated.",
227
+ variableName
228
+ );
229
+ return;
230
+ }
231
+ const cssText = template.quasis.map((quasi) => quasi.value.cooked ?? "").join("");
232
+ const objectExpression2 = cssToObjectExpression(cssText, warnings);
233
+ if (!objectExpression2) {
234
+ addWarning(warnings, "Skipped because CSS could not be parsed.", variableName);
235
+ return;
236
+ }
237
+ const styledTarget = parseStyledTarget(path.node.init.tag, styledNames);
238
+ if (styledTarget) {
239
+ const declaration = path.parentPath;
240
+ if (declaration.parentPath?.isExportNamedDeclaration() || declaration.parentPath?.isExportDefaultDeclaration()) {
241
+ addWarning(
242
+ warnings,
243
+ "Skipped exported styled component to avoid changing external API shape.",
244
+ variableName
245
+ );
246
+ return;
247
+ }
248
+ if (!isOnlyJsxReferences(binding)) {
249
+ addWarning(
250
+ warnings,
251
+ "Skipped styled component with non-JSX references.",
252
+ variableName
253
+ );
254
+ return;
255
+ }
256
+ const classConstName = path.scope.generateUidIdentifier(`${variableName}Class`).name;
257
+ path.node.id = t2.identifier(classConstName);
258
+ path.node.init = t2.callExpression(
259
+ t2.memberExpression(t2.identifier("styles"), t2.identifier("class")),
260
+ [t2.stringLiteral(toKebabCase(variableName)), objectExpression2]
261
+ );
262
+ styledTransforms.set(variableName, {
263
+ originalName: variableName,
264
+ classConstName,
265
+ target: styledTarget
266
+ });
267
+ changed = true;
268
+ return;
269
+ }
270
+ if (t2.isIdentifier(path.node.init.tag) && cssTagNames.has(path.node.init.tag.name)) {
271
+ path.node.init = t2.callExpression(
272
+ t2.memberExpression(t2.identifier("styles"), t2.identifier("class")),
273
+ [t2.stringLiteral(toKebabCase(variableName)), objectExpression2]
274
+ );
275
+ changed = true;
276
+ }
277
+ }
278
+ });
279
+ if (styledTransforms.size > 0) {
280
+ traverse(ast, {
281
+ JSXElement(path) {
282
+ const openingName = path.node.openingElement.name;
283
+ if (!t2.isJSXIdentifier(openingName)) return;
284
+ const transform = styledTransforms.get(openingName.name);
285
+ if (!transform) return;
286
+ path.node.openingElement.name = transform.target.jsxName;
287
+ if (path.node.closingElement) {
288
+ path.node.closingElement.name = transform.target.jsxName;
289
+ }
290
+ updateClassNameAttribute(path.node.openingElement, t2.identifier(transform.classConstName));
291
+ }
292
+ });
293
+ }
294
+ if (changed) {
295
+ ensureStylesImport(ast);
296
+ cleanupUnusedImports(ast);
297
+ }
298
+ const output = generate(
299
+ ast,
300
+ {
301
+ retainLines: false,
302
+ comments: true,
303
+ concise: false
304
+ },
305
+ source
306
+ );
307
+ return {
308
+ filePath,
309
+ changed: changed && output.code !== source,
310
+ code: output.code,
311
+ warnings
312
+ };
313
+ }
314
+ var DEFAULT_EXCLUDES = ["**/node_modules/**", "**/dist/**", "**/.next/**", "**/.turbo/**"];
315
+ function normalizeExtension(extension) {
316
+ return extension.startsWith(".") ? extension : `.${extension}`;
317
+ }
318
+ async function collectTargetFiles(cwd, targets, extensions, include, exclude) {
319
+ const normalizedTargets = targets.length > 0 ? targets : ["."];
320
+ const literalFiles = [];
321
+ const dynamicPatterns = [];
322
+ for (const target of normalizedTargets) {
323
+ const absolute = resolve(cwd, target);
324
+ try {
325
+ const targetStat = await stat(absolute);
326
+ if (targetStat.isFile()) {
327
+ literalFiles.push(absolute);
328
+ } else if (targetStat.isDirectory()) {
329
+ dynamicPatterns.push(`${absolute.split("\\").join("/")}/**/*`);
330
+ }
331
+ } catch {
332
+ dynamicPatterns.push(target);
333
+ }
334
+ }
335
+ const globbed = await fg(dynamicPatterns, {
336
+ cwd,
337
+ absolute: true,
338
+ onlyFiles: true,
339
+ ignore: [...DEFAULT_EXCLUDES, ...exclude]
340
+ });
341
+ const extensionSet = new Set(extensions.map(normalizeExtension));
342
+ const includeMatchers = include.length > 0 ? include.map((pattern) => picomatch(pattern)) : null;
343
+ const unique = /* @__PURE__ */ new Set([...literalFiles, ...globbed]);
344
+ return Array.from(unique).filter((filePath) => extensionSet.has(extname(filePath))).filter((filePath) => {
345
+ if (!includeMatchers) return true;
346
+ const rel = relative(cwd, filePath).split("\\").join("/");
347
+ return includeMatchers.some((matcher) => matcher(rel));
348
+ }).sort();
349
+ }
350
+
351
+ // src/migrate.ts
352
+ function renderPatch(filePath, before, after) {
353
+ return createPatch(filePath, before, after, "before", "after").split("\n").slice(2).join("\n");
354
+ }
355
+ async function runMigration(cwd, options) {
356
+ const files = await collectTargetFiles(
357
+ cwd,
358
+ options.targets,
359
+ options.extensions,
360
+ options.include,
361
+ options.exclude
362
+ );
363
+ const reportEntries = [];
364
+ let changedCount = 0;
365
+ let warningCount = 0;
366
+ for (const filePath of files) {
367
+ const before = await readFile(filePath, "utf8");
368
+ const result = migrateSource(filePath, before);
369
+ const relativePath = relative(cwd, filePath);
370
+ warningCount += result.warnings.length;
371
+ if (result.changed) {
372
+ changedCount += 1;
373
+ if (options.write) {
374
+ await writeFile(filePath, result.code, "utf8");
375
+ process.stdout.write(`updated ${relativePath}
376
+ `);
377
+ } else {
378
+ process.stdout.write(`
379
+ --- ${relativePath} (dry-run) ---
380
+ `);
381
+ process.stdout.write(`${renderPatch(relativePath, before, result.code)}
382
+ `);
383
+ }
384
+ }
385
+ for (const warning of result.warnings) {
386
+ const nodeLabel = warning.nodeName ? ` (${warning.nodeName})` : "";
387
+ process.stdout.write(`warning ${relativePath}${nodeLabel}: ${warning.message}
388
+ `);
389
+ }
390
+ reportEntries.push({
391
+ filePath: relativePath,
392
+ changed: result.changed,
393
+ warnings: result.warnings
394
+ });
395
+ }
396
+ const summary = {
397
+ filesScanned: files.length,
398
+ filesChanged: changedCount,
399
+ warnings: warningCount
400
+ };
401
+ process.stdout.write(
402
+ `
403
+ Scanned ${summary.filesScanned} files, changed ${summary.filesChanged}, warnings ${summary.warnings}.
404
+ `
405
+ );
406
+ const report = {
407
+ summary,
408
+ files: reportEntries
409
+ };
410
+ if (options.reportPath) {
411
+ await mkdir(dirname(options.reportPath), { recursive: true });
412
+ await writeFile(options.reportPath, `${JSON.stringify(report, null, 2)}
413
+ `, "utf8");
414
+ process.stdout.write(`Report written to ${options.reportPath}
415
+ `);
416
+ }
417
+ return report;
418
+ }
419
+
420
+ export { migrateSource, runMigration };
421
+ //# sourceMappingURL=chunk-AINAKUVX.js.map
422
+ //# sourceMappingURL=chunk-AINAKUVX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/css.ts","../src/transform.ts","../src/files.ts","../src/migrate.ts"],"names":["t","objectExpression","relative"],"mappings":";;;;;;;;;;;;AAIA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,OAAO,QAAA,CAAS,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAmB,MAAA,CAAO,aAAa,CAAA;AAClF;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG;AACnC,IAAA,OAASA,EAAA,CAAA,cAAA,CAAe,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAASA,iBAAc,OAAO,CAAA;AAChC;AAEA,SAAS,UAAU,GAAA,EAA2B;AAC5C,EAAA,IAAI,4BAAA,CAA6B,IAAA,CAAK,GAAG,CAAA,EAAG;AAC1C,IAAA,OAASA,cAAW,GAAG,CAAA;AAAA,EACzB;AACA,EAAA,OAASA,iBAAc,GAAG,CAAA;AAC5B;AAEA,SAAS,aAAA,CACP,OACA,QAAA,EACoB;AACpB,EAAA,MAAM,aAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,IAAS,EAAC,EAAG;AAC9B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAI,IAAI,IAAA,CAAK,IAAA,GAAO,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACvF,MAAA,UAAA,CAAW,IAAA,CAAOA,kBAAe,SAAA,CAAU,UAAU,GAAG,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAChF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AACjD,MAAA,UAAA,CAAW,IAAA,CAAOA,kBAAiBA,EAAA,CAAA,aAAA,CAAc,IAAA,CAAK,SAAS,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAC/E,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,UAAA;AAAA,KAC5C,CAAA;AAAA,EACH;AAEA,EAAA,OAASA,oBAAiB,UAAU,CAAA;AACtC;AAEO,SAAS,qBAAA,CACd,SACA,QAAA,EAC2B;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AAClC,IAAA,OAAO,aAAA,CAAe,IAAA,CAA8B,KAAA,EAAO,QAAQ,CAAA;AAAA,EACrE,SAAS,KAAA,EAAO;AACd,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,OAAA,EAAS,CAAA,sCAAA,EAA0C,KAAA,CAAgB,OAAO,CAAA;AAAA,KAC3E,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9CA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,CACJ,QAAQ,oBAAA,EAAsB,OAAO,EACrC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AACjB;AAEA,SAAS,0BACP,UAAA,EACgD;AAChD,EAAA,IAAM,EAAA,CAAA,YAAA,CAAa,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAS,EAAA,CAAA,aAAA,CAAc,WAAW,IAAI,CAAA;AAAA,EACxC;AAEA,EAAA,IAAM,EAAA,CAAA,kBAAA,CAAmB,UAAU,CAAA,IAAK,CAAC,WAAW,QAAA,EAAU;AAC5D,IAAA,MAAM,IAAA,GAAO,yBAAA,CAA0B,UAAA,CAAW,MAAsB,CAAA;AACxE,IAAA,MAAM,KAAA,GAAU,gBAAa,UAAA,CAAW,QAAQ,IAAM,EAAA,CAAA,aAAA,CAAc,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAChG,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO,OAAO,IAAA;AAC5B,IAAA,OAAS,EAAA,CAAA,mBAAA,CAAoB,MAAM,KAAK,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CACP,KACA,WAAA,EACqB;AACrB,EAAA,IACI,sBAAmB,GAAG,CAAA,IACtB,EAAA,CAAA,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IACzB,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,OAAO,IAAI,CAAA,IAC7B,EAAA,CAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAC3B;AACA,IAAA,OAAO,EAAE,MAAM,WAAA,EAAa,OAAA,EAAW,iBAAc,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAE;AAAA,EAC1E;AAEA,EAAA,IAAM,EAAA,CAAA,gBAAA,CAAiB,GAAG,CAAA,IAAO,EAAA,CAAA,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC7F,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAG,EAAA,CAAA,YAAA,CAAa,QAAQ,GAAG,OAAO,IAAA;AACnD,IAAA,MAAM,OAAA,GAAU,0BAA0B,QAAQ,CAAA;AAClD,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAQ;AAAA,EACtC;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CAAW,QAAA,EAA8B,OAAA,EAAiB,QAAA,EAAyB;AAC1F,EAAA,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AACrC;AAEA,SAAS,2BAAA,CAA4B,UAAwB,mBAAA,EAAiD;AAC5G,EAAA,OAAS,EAAA,CAAA,cAAA;AAAA,IACL,EAAA,CAAA,gBAAA;AAAA,MACE,EAAA,CAAA,cAAA,CAAiB,EAAA,CAAA,gBAAA,CAAmB,EAAA,CAAA,eAAA,CAAgB,CAAC,QAAA,EAAU,mBAAmB,CAAC,CAAA,EAAK,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAC,CAAA,EAAG;AAAA,QAC7G,cAAW,SAAS;AAAA,OACvB,CAAA;AAAA,MACC,cAAW,MAAM;AAAA,KACrB;AAAA,IACA,CAAG,EAAA,CAAA,aAAA,CAAc,GAAG,CAAC;AAAA,GACvB;AACF;AAEA,SAAS,wBAAA,CACP,gBACA,mBAAA,EACM;AACN,EAAA,MAAM,YAAA,GAAe,eAAe,UAAA,CAAW,IAAA;AAAA,IAC7C,CAAC,SAAA,KACG,EAAA,CAAA,cAAA,CAAe,SAAS,CAAA,IAAO,EAAA,CAAA,eAAA,CAAgB,SAAA,CAAU,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa;AAAA,GAC1F;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,cAAA,CAAe,UAAA,CAAW,IAAA;AAAA,MACtB,gBAAe,EAAA,CAAA,aAAA,CAAc,WAAW,CAAA,EAAK,EAAA,CAAA,sBAAA,CAAuB,mBAAmB,CAAC;AAAA,KAC5F;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,IAAA,YAAA,CAAa,KAAA,GAAU,0BAAuB,mBAAmB,CAAA;AACjE,IAAA;AAAA,EACF;AAEA,EAAA,IAAM,EAAA,CAAA,eAAA,CAAgB,YAAA,CAAa,KAAK,CAAA,EAAG;AACzC,IAAA,YAAA,CAAa,KAAA,GAAU,EAAA,CAAA,sBAAA;AAAA,MACrB,4BAA8B,EAAA,CAAA,aAAA,CAAc,YAAA,CAAa,KAAA,CAAM,KAAK,GAAG,mBAAmB;AAAA,KAC5F;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAM,EAAA,CAAA,wBAAA,CAAyB,YAAA,CAAa,KAAK,CAAA,EAAG;AAClD,IAAA,YAAA,CAAa,KAAA,GAAU,EAAA,CAAA,sBAAA;AAAA,MACrB,2BAAA,CAA4B,YAAA,CAAa,KAAA,CAAM,UAAA,EAA4B,mBAAmB;AAAA,KAChG;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,GAAA,EAAmB;AAC7C,EAAA,IAAI,gBAAA,GAA+C,IAAA;AAEnD,EAAA,KAAA,MAAW,SAAA,IAAa,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM;AACxC,IAAA,IAAM,uBAAoB,SAAS,CAAA,IAAK,SAAA,CAAU,MAAA,CAAO,UAAU,YAAA,EAAc;AAC/E,MAAA,gBAAA,GAAmB,SAAA;AACnB,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,GAAA,CAAI,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,EAAA,CAAA,iBAAA;AAAA,QACA,CAAG,mBAAkB,EAAA,CAAA,UAAA,CAAW,QAAQ,GAAK,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAC,CAAC,CAAA;AAAA,QAChE,iBAAc,YAAY;AAAA;AAC9B,KACF;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,iBAAiB,UAAA,CAAW,IAAA;AAAA,IACrD,CAAC,SAAA,KACG,EAAA,CAAA,iBAAA,CAAkB,SAAS,CAAA,IAC3B,EAAA,CAAA,YAAA,CAAa,UAAU,QAAA,EAAU,EAAE,MAAM,QAAA,EAAU,KACnD,EAAA,CAAA,YAAA,CAAa,SAAA,CAAU,OAAO,EAAE,IAAA,EAAM,UAAU;AAAA,GACtD;AAEA,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,gBAAA,CAAiB,UAAA,CAAW,IAAA;AAAA,MACxB,mBAAkB,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAK,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAC;AAAA,KAClE;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,GAAA,EAAmB;AAC/C,EAAA,QAAA,CAAS,GAAA,EAAK;AAAA,IACZ,QAAQ,IAAA,EAAM;AACZ,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,IACnB,CAAA;AAAA,IACA,kBAAkB,IAAA,EAAM;AACtB,MAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,SAAA,KAAc;AAC9D,QAAA,IACE,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,gBACzB,EAAA,CAAA,iBAAA,CAAkB,SAAS,CAAA,IAC3B,EAAA,CAAA,YAAA,CAAa,UAAU,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,EAClD;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,IAAA;AAC9B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA;AAC3C,QAAA,OAAO,CAAC,OAAA,IAAW,OAAA,CAAQ,cAAA,CAAe,MAAA,KAAW,CAAA;AAAA,MACvD,CAAC,CAAA;AAED,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAE/B,MAAA,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,SAAA,KAAc,CAAC,YAAA,CAAa,QAAA,CAAS,SAAS,CAAC,CAAA;AACnG,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MACd;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEA,SAAS,oBAAoB,OAAA,EAA+E;AAC1G,EAAA,OAAO,OAAA,CAAQ,cAAA,CAAe,KAAA,CAAM,CAAC,aAAA,KAAkB;AACrD,IAAA,MAAM,SAAS,aAAA,CAAc,UAAA;AAC7B,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,OACG,MAAA,CAAO,mBAAA,EAAoB,IAAK,MAAA,CAAO,IAAI,MAAM,CAAA,KAAM,aAAA,IACvD,MAAA,CAAO,mBAAA,EAAoB,IAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,KAAM,aAAA;AAAA,EAE5D,CAAC,CAAA;AACH;AAEO,SAAS,aAAA,CAAc,UAAkB,MAAA,EAAqC;AACnF,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAQ;AAAA,IACxB,UAAA,EAAY,QAAA;AAAA,IACZ,OAAA,EAAS,CAAC,YAAA,EAAc,KAAK;AAAA,GAC9B,CAAA;AAED,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA6B;AAE1D,EAAA,QAAA,CAAS,GAAA,EAAK;AAAA,IACZ,kBAAkB,IAAA,EAAM;AACtB,MAAA,IAAI,IAAA,CAAK,KAAK,MAAA,CAAO,KAAA,KAAU,uBAAuB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,iBAAA,EAAmB;AAClG,QAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AAC5C,UAAA,IAAM,EAAA,CAAA,wBAAA,CAAyB,SAAS,CAAA,EAAG;AACzC,YAAA,WAAA,CAAY,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UACtC;AACA,UAAA,IACI,EAAA,CAAA,iBAAA,CAAkB,SAAS,CAAA,IAC3B,EAAA,CAAA,YAAA,CAAa,SAAA,CAAU,UAAU,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA,EAClD;AACA,YAAA,WAAA,CAAY,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,KAAK,MAAA,CAAO,KAAA,KAAU,oBAAoB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAA,KAAU,cAAA,EAAgB;AAC5F,QAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY;AAC5C,UAAA,IACI,EAAA,CAAA,iBAAA,CAAkB,SAAS,CAAA,IAC3B,EAAA,CAAA,YAAA,CAAa,SAAA,CAAU,UAAU,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA,EAClD;AACA,YAAA,WAAA,CAAY,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,QAAA,CAAS,GAAA,EAAK;AAAA,IACZ,mBAAmB,IAAA,EAAM;AACvB,MAAA,IAAI,CAAG,EAAA,CAAA,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AACnC,MAAA,IAAI,CAAG,EAAA,CAAA,0BAAA,CAA2B,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAEnD,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,IAAA;AAClC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA;AAClD,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA;AAChC,MAAA,IAAI,QAAA,CAAS,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACnC,QAAA,UAAA;AAAA,UACE,QAAA;AAAA,UACA,mFAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAChF,MAAA,MAAMC,iBAAAA,GAAmB,qBAAA,CAAsB,OAAA,EAAS,QAAQ,CAAA;AAChE,MAAA,IAAI,CAACA,iBAAAA,EAAkB;AACrB,QAAA,UAAA,CAAW,QAAA,EAAU,4CAA4C,YAAY,CAAA;AAC7E,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,eAAe,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAK,WAAW,CAAA;AACtE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,cAAc,IAAA,CAAK,UAAA;AACzB,QAAA,IACE,YAAY,UAAA,EAAY,wBAAA,MACxB,WAAA,CAAY,UAAA,EAAY,4BAA2B,EACnD;AACA,UAAA,UAAA;AAAA,YACE,QAAA;AAAA,YACA,yEAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,mBAAA,CAAoB,OAAO,CAAA,EAAG;AACjC,UAAA,UAAA;AAAA,YACE,QAAA;AAAA,YACA,mDAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA,EAAG,YAAY,OAAO,CAAA,CAAE,IAAA;AAChF,QAAA,IAAA,CAAK,IAAA,CAAK,EAAA,GAAO,EAAA,CAAA,UAAA,CAAW,cAAc,CAAA;AAC1C,QAAA,IAAA,CAAK,KAAK,IAAA,GAAS,EAAA,CAAA,cAAA;AAAA,UACf,oBAAmB,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAK,EAAA,CAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,UAChE,CAAG,EAAA,CAAA,aAAA,CAAc,WAAA,CAAY,YAAY,CAAC,GAAGA,iBAAgB;AAAA,SAC/D;AAEA,QAAA,gBAAA,CAAiB,IAAI,YAAA,EAAc;AAAA,UACjC,YAAA,EAAc,YAAA;AAAA,UACd,cAAA;AAAA,UACA,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACF;AAEA,MAAA,IAAM,EAAA,CAAA,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClF,QAAA,IAAA,CAAK,KAAK,IAAA,GAAS,EAAA,CAAA,cAAA;AAAA,UACf,oBAAmB,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAK,EAAA,CAAA,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,UAChE,CAAG,EAAA,CAAA,aAAA,CAAc,WAAA,CAAY,YAAY,CAAC,GAAGA,iBAAgB;AAAA,SAC/D;AACA,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC7B,IAAA,QAAA,CAAS,GAAA,EAAK;AAAA,MACZ,WAAW,IAAA,EAAM;AACf,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA;AAC7C,QAAA,IAAI,CAAG,EAAA,CAAA,eAAA,CAAgB,WAAW,CAAA,EAAG;AACrC,QAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA;AACvD,QAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,QAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA,GAAO,SAAA,CAAU,MAAA,CAAO,OAAA;AACjD,QAAA,IAAI,IAAA,CAAK,KAAK,cAAA,EAAgB;AAC5B,UAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA,GAAO,SAAA,CAAU,MAAA,CAAO,OAAA;AAAA,QACnD;AAEA,QAAA,wBAAA,CAAyB,KAAK,IAAA,CAAK,cAAA,EAAkB,EAAA,CAAA,UAAA,CAAW,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA,MAC3F;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,IAAA,oBAAA,CAAqB,GAAG,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA;AAAA,IACb,GAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,MAAA,CAAO,IAAA,KAAS,MAAA;AAAA,IACpC,MAAM,MAAA,CAAO,IAAA;AAAA,IACb;AAAA,GACF;AACF;ACtVA,IAAM,gBAAA,GAAmB,CAAC,oBAAA,EAAsB,YAAA,EAAc,eAAe,cAAc,CAAA;AAE3F,SAAS,mBAAmB,SAAA,EAA2B;AACrD,EAAA,OAAO,UAAU,UAAA,CAAW,GAAG,CAAA,GAAI,SAAA,GAAY,IAAI,SAAS,CAAA,CAAA;AAC9D;AAEA,eAAsB,kBAAA,CACpB,GAAA,EACA,OAAA,EACA,UAAA,EACA,SACA,OAAA,EACmB;AACnB,EAAA,MAAM,oBAAoB,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,CAAC,GAAG,CAAA;AAC7D,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAQ,CAAA;AACtC,MAAA,IAAI,UAAA,CAAW,QAAO,EAAG;AACvB,QAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,UAAA,CAAW,WAAA,EAAY,EAAG;AACnC,QAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,MAC/D;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,eAAA,CAAgB,KAAK,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,eAAA,EAAiB;AAAA,IACxC,GAAA;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,CAAC,GAAG,gBAAA,EAAkB,GAAG,OAAO;AAAA,GACzC,CAAA;AAED,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,kBAAkB,CAAC,CAAA;AAC/D,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,KAAY,SAAA,CAAU,OAAO,CAAC,CAAA,GAAI,IAAA;AAC5F,EAAA,MAAM,MAAA,uBAAa,GAAA,CAAI,CAAC,GAAG,YAAA,EAAc,GAAG,OAAO,CAAC,CAAA;AAEpD,EAAA,OAAO,MAAM,IAAA,CAAK,MAAM,CAAA,CACrB,MAAA,CAAO,CAAC,QAAA,KAAa,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA,CACxD,MAAA,CAAO,CAAC,QAAA,KAAa;AACpB,IAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,SAAS,GAAA,EAAK,QAAQ,EAAE,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACxD,IAAA,OAAO,gBAAgB,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EACvD,CAAC,EACA,IAAA,EAAK;AACV;;;AChDA,SAAS,WAAA,CAAY,QAAA,EAAkB,MAAA,EAAgB,KAAA,EAAuB;AAC5E,EAAA,OAAO,WAAA,CAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,UAAU,OAAO,CAAA,CAC1D,KAAA,CAAM,IAAI,CAAA,CACV,KAAA,CAAM,CAAC,CAAA,CACP,KAAK,IAAI,CAAA;AACd;AAEA,eAAsB,YAAA,CAAa,KAAa,OAAA,EAA+C;AAC7F,EAAA,MAAM,QAAQ,MAAM,kBAAA;AAAA,IAClB,GAAA;AAAA,IACA,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ,UAAA;AAAA,IACR,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ;AAAA,GACV;AAEA,EAAA,MAAM,gBAA0C,EAAC;AACjD,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,MAAM,CAAA;AAC7C,IAAA,MAAM,YAAA,GAAeC,QAAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAE3C,IAAA,YAAA,IAAgB,OAAO,QAAA,CAAS,MAAA;AAChC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,IAAgB,CAAA;AAChB,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAC7C,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,YAAY;AAAA,CAAI,CAAA;AAAA,MAClD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,IAAA,EAAS,YAAY,CAAA;AAAA,CAAkB,CAAA;AAC5D,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,WAAA,CAAY,cAAc,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAC;AAAA,CAAI,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,MAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,GAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAChE,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,QAAA,EAAW,YAAY,GAAG,SAAS,CAAA,EAAA,EAAK,QAAQ,OAAO;AAAA,CAAI,CAAA;AAAA,IAClF;AAEA,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,MACjB,QAAA,EAAU,YAAA;AAAA,MACV,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,OAAA,GAA4B;AAAA,IAChC,cAAc,KAAA,CAAM,MAAA;AAAA,IACpB,YAAA,EAAc,YAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb;AAAA,QAAA,EAAa,QAAQ,YAAY,CAAA,gBAAA,EAAmB,QAAQ,YAAY,CAAA,WAAA,EAAc,QAAQ,QAAQ,CAAA;AAAA;AAAA,GACxG;AAEA,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,KAAA,CAAM,QAAQ,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,IAAA,MAAM,SAAA,CAAU,QAAQ,UAAA,EAAY,CAAA,EAAG,KAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AAClF,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAqB,OAAA,CAAQ,UAAU;AAAA,CAAI,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,MAAA;AACT","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"]}