css-to-tailwind-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.JSXParser = void 0;
40
+ const parser_1 = require("@babel/parser");
41
+ const traverse_1 = __importDefault(require("@babel/traverse"));
42
+ const generator_1 = __importDefault(require("@babel/generator"));
43
+ const t = __importStar(require("@babel/types"));
44
+ const logger_1 = require("./utils/logger");
45
+ class JSXParser {
46
+ constructor(mapper) {
47
+ this.mapper = mapper;
48
+ }
49
+ parse(code, filePath) {
50
+ const transformations = [];
51
+ const warnings = [];
52
+ let hasChanges = false;
53
+ try {
54
+ const ast = (0, parser_1.parse)(code, {
55
+ sourceType: 'module',
56
+ allowImportExportEverywhere: true,
57
+ allowReturnOutsideFunction: true,
58
+ plugins: [
59
+ 'jsx',
60
+ 'typescript',
61
+ 'decorators-legacy',
62
+ 'classProperties',
63
+ 'optionalChaining',
64
+ 'nullishCoalescingOperator',
65
+ 'dynamicImport'
66
+ ]
67
+ });
68
+ (0, traverse_1.default)(ast, {
69
+ JSXOpeningElement: (path) => {
70
+ const elementName = this.getElementName(path.node);
71
+ // Find style attribute
72
+ const styleAttrIndex = path.node.attributes.findIndex(attr => t.isJSXAttribute(attr) &&
73
+ t.isJSXIdentifier(attr.name) &&
74
+ attr.name.name === 'style');
75
+ if (styleAttrIndex === -1) {
76
+ return;
77
+ }
78
+ const styleAttr = path.node.attributes[styleAttrIndex];
79
+ // Check if style value is dynamic
80
+ if (!this.isStaticStyle(styleAttr)) {
81
+ warnings.push(`Skipped dynamic style in ${elementName} (line ${path.node.loc?.start.line})`);
82
+ logger_1.logger.warn(`Dynamic style detected in ${filePath} - skipping`);
83
+ return;
84
+ }
85
+ // Extract CSS properties from style
86
+ const cssProperties = this.extractCSSProperties(styleAttr);
87
+ if (cssProperties.length === 0) {
88
+ return;
89
+ }
90
+ // Convert to Tailwind classes
91
+ const { classes, warnings: conversionWarnings } = this.mapper.convertMultiple(cssProperties);
92
+ if (classes.length === 0) {
93
+ warnings.push(...conversionWarnings);
94
+ return;
95
+ }
96
+ // Find existing className
97
+ const classNameAttrIndex = path.node.attributes.findIndex(attr => t.isJSXAttribute(attr) &&
98
+ t.isJSXIdentifier(attr.name) &&
99
+ attr.name.name === 'className');
100
+ const originalStyle = (0, generator_1.default)(styleAttr).code;
101
+ if (classNameAttrIndex !== -1) {
102
+ // Merge with existing className
103
+ const classNameAttr = path.node.attributes[classNameAttrIndex];
104
+ if (!this.isStaticClassName(classNameAttr)) {
105
+ warnings.push(`Skipped dynamic className in ${elementName} (line ${path.node.loc?.start.line})`);
106
+ return;
107
+ }
108
+ const existingClasses = this.extractClassNameValue(classNameAttr);
109
+ const mergedClasses = this.mergeClasses(existingClasses, classes);
110
+ // Update className attribute
111
+ classNameAttr.value = t.stringLiteral(mergedClasses);
112
+ }
113
+ else {
114
+ // Create new className attribute
115
+ const newClassNameAttr = t.jsxAttribute(t.jsxIdentifier('className'), t.stringLiteral(classes.join(' ')));
116
+ path.node.attributes.push(newClassNameAttr);
117
+ }
118
+ // Remove style attribute
119
+ path.node.attributes.splice(styleAttrIndex, 1);
120
+ // Record transformation
121
+ const newCode = (0, generator_1.default)(path.node).code;
122
+ transformations.push({
123
+ original: originalStyle,
124
+ converted: newCode,
125
+ classes,
126
+ warnings: conversionWarnings
127
+ });
128
+ hasChanges = true;
129
+ warnings.push(...conversionWarnings);
130
+ }
131
+ });
132
+ // Generate new code
133
+ const output = (0, generator_1.default)(ast, {
134
+ retainLines: true,
135
+ retainFunctionParens: true,
136
+ comments: true
137
+ });
138
+ return {
139
+ code: output.code,
140
+ hasChanges,
141
+ transformations,
142
+ warnings
143
+ };
144
+ }
145
+ catch (error) {
146
+ logger_1.logger.error(`Failed to parse ${filePath}:`, error);
147
+ throw new Error(`Parsing failed: ${error}`);
148
+ }
149
+ }
150
+ getElementName(node) {
151
+ if (t.isJSXIdentifier(node.name)) {
152
+ return node.name.name;
153
+ }
154
+ if (t.isJSXMemberExpression(node.name)) {
155
+ return this.getMemberExpressionName(node.name);
156
+ }
157
+ return 'unknown';
158
+ }
159
+ getMemberExpressionName(node) {
160
+ if (t.isJSXIdentifier(node.object) && t.isJSXIdentifier(node.property)) {
161
+ return `${node.object.name}.${node.property.name}`;
162
+ }
163
+ return 'unknown';
164
+ }
165
+ isStaticStyle(attr) {
166
+ if (!attr.value) {
167
+ return false;
168
+ }
169
+ // Handle style={{ ... }} (object expression)
170
+ if (t.isJSXExpressionContainer(attr.value)) {
171
+ const expression = attr.value.expression;
172
+ // Direct object: style={{ color: 'red' }}
173
+ if (t.isObjectExpression(expression)) {
174
+ return true;
175
+ }
176
+ // Check if it's a simple object without variables
177
+ if (t.isIdentifier(expression) || t.isMemberExpression(expression)) {
178
+ return false; // Variable reference - dynamic
179
+ }
180
+ }
181
+ return false;
182
+ }
183
+ isStaticClassName(attr) {
184
+ if (!attr.value) {
185
+ return true;
186
+ }
187
+ if (t.isStringLiteral(attr.value)) {
188
+ return true;
189
+ }
190
+ if (t.isJSXExpressionContainer(attr.value)) {
191
+ const expression = attr.value.expression;
192
+ // String literal in expression: className={"container"}
193
+ if (t.isStringLiteral(expression)) {
194
+ return true;
195
+ }
196
+ // Template literal without expressions: className={`container`}
197
+ if (t.isTemplateLiteral(expression) && expression.expressions.length === 0) {
198
+ return true;
199
+ }
200
+ // Anything else is dynamic
201
+ return false;
202
+ }
203
+ return false;
204
+ }
205
+ extractCSSProperties(attr) {
206
+ const properties = [];
207
+ if (!attr.value || !t.isJSXExpressionContainer(attr.value)) {
208
+ return properties;
209
+ }
210
+ const expression = attr.value.expression;
211
+ if (!t.isObjectExpression(expression)) {
212
+ return properties;
213
+ }
214
+ expression.properties.forEach(prop => {
215
+ if (!t.isObjectProperty(prop)) {
216
+ return;
217
+ }
218
+ let propertyName = null;
219
+ let propertyValue = null;
220
+ // Get property name
221
+ if (t.isIdentifier(prop.key)) {
222
+ propertyName = prop.key.name;
223
+ }
224
+ else if (t.isStringLiteral(prop.key)) {
225
+ propertyName = prop.key.value;
226
+ }
227
+ // Get property value
228
+ if (t.isStringLiteral(prop.value)) {
229
+ propertyValue = prop.value.value;
230
+ }
231
+ else if (t.isNumericLiteral(prop.value)) {
232
+ propertyValue = `${prop.value.value}px`;
233
+ }
234
+ // Handle camelCase to kebab-case conversion for CSS properties
235
+ if (propertyName && propertyValue) {
236
+ const cssProperty = this.camelToKebab(propertyName);
237
+ properties.push({
238
+ property: cssProperty,
239
+ value: propertyValue
240
+ });
241
+ }
242
+ });
243
+ return properties;
244
+ }
245
+ extractClassNameValue(attr) {
246
+ if (!attr.value) {
247
+ return '';
248
+ }
249
+ if (t.isStringLiteral(attr.value)) {
250
+ return attr.value.value;
251
+ }
252
+ if (t.isJSXExpressionContainer(attr.value)) {
253
+ const expression = attr.value.expression;
254
+ if (t.isStringLiteral(expression)) {
255
+ return expression.value;
256
+ }
257
+ if (t.isTemplateLiteral(expression) && expression.quasis.length > 0) {
258
+ return expression.quasis[0].value.raw;
259
+ }
260
+ }
261
+ return '';
262
+ }
263
+ mergeClasses(existing, newClasses) {
264
+ const existingSet = new Set(existing.split(/\s+/).filter(Boolean));
265
+ newClasses.forEach(cls => existingSet.add(cls));
266
+ return Array.from(existingSet).join(' ');
267
+ }
268
+ camelToKebab(str) {
269
+ return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
270
+ }
271
+ }
272
+ exports.JSXParser = JSXParser;
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianN4UGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2pzeFBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBc0M7QUFDdEMsK0RBQXVDO0FBQ3ZDLGlFQUF3QztBQUN4QyxnREFBa0M7QUFFbEMsMkNBQXdDO0FBZ0J4QyxNQUFhLFNBQVM7SUFHcEIsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVksRUFBRSxRQUFnQjtRQUNsQyxNQUFNLGVBQWUsR0FBd0IsRUFBRSxDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBQSxjQUFLLEVBQUMsSUFBSSxFQUFFO2dCQUN0QixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsMkJBQTJCLEVBQUUsSUFBSTtnQkFDakMsMEJBQTBCLEVBQUUsSUFBSTtnQkFDaEMsT0FBTyxFQUFFO29CQUNQLEtBQUs7b0JBQ0wsWUFBWTtvQkFDWixtQkFBbUI7b0JBQ25CLGlCQUFpQjtvQkFDakIsa0JBQWtCO29CQUNsQiwyQkFBMkI7b0JBQzNCLGVBQWU7aUJBQ2hCO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBQSxrQkFBUSxFQUFDLEdBQUcsRUFBRTtnQkFDWixpQkFBaUIsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUMxQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFbkQsdUJBQXVCO29CQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQ25ELElBQUksQ0FBQyxF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O0lBQ1osQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUFnQixFQUFFLFVBQW9CO1FBQ3pELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxZQUFZLENBQUMsR0FBVztRQUM5QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEUsQ0FBQztDQUNGO0FBOVJELDhCQThSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhcnNlIH0gZnJvbSAnQGJhYmVsL3BhcnNlcic7XG5pbXBvcnQgdHJhdmVyc2UgZnJvbSAnQGJhYmVsL3RyYXZlcnNlJztcbmltcG9ydCBnZW5lcmF0ZSBmcm9tICdAYmFiZWwvZ2VuZXJhdG9yJztcbmltcG9ydCAqIGFzIHQgZnJvbSAnQGJhYmVsL3R5cGVzJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyLCBDU1NQcm9wZXJ0eSB9IGZyb20gJy4vdGFpbHdpbmRNYXBwZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEpTWFRyYW5zZm9ybWF0aW9uIHtcbiAgb3JpZ2luYWw6IHN0cmluZztcbiAgY29udmVydGVkOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSlNYUGFyc2VSZXN1bHQge1xuICBjb2RlOiBzdHJpbmc7XG4gIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gIHRyYW5zZm9ybWF0aW9uczogSlNYVHJhbnNmb3JtYXRpb25bXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgSlNYUGFyc2VyIHtcbiAgcHJpdmF0ZSBtYXBwZXI6IFRhaWx3aW5kTWFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIpIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgfVxuXG4gIHBhcnNlKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IEpTWFBhcnNlUmVzdWx0IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1hdGlvbnM6IEpTWFRyYW5zZm9ybWF0aW9uW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzdCA9IHBhcnNlKGNvZGUsIHtcbiAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgIGFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZTogdHJ1ZSxcbiAgICAgICAgYWxsb3dSZXR1cm5PdXRzaWRlRnVuY3Rpb246IHRydWUsXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAnanN4JyxcbiAgICAgICAgICAndHlwZXNjcmlwdCcsXG4gICAgICAgICAgJ2RlY29yYXRvcnMtbGVnYWN5JyxcbiAgICAgICAgICAnY2xhc3NQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAnb3B0aW9uYWxDaGFpbmluZycsXG4gICAgICAgICAgJ251bGxpc2hDb2FsZXNjaW5nT3BlcmF0b3InLFxuICAgICAgICAgICdkeW5hbWljSW1wb3J0J1xuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgdHJhdmVyc2UoYXN0LCB7XG4gICAgICAgIEpTWE9wZW5pbmdFbGVtZW50OiAocGF0aCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gdGhpcy5nZXRFbGVtZW50TmFtZShwYXRoLm5vZGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEZpbmQgc3R5bGUgYXR0cmlidXRlXG4gICAgICAgICAgY29uc3Qgc3R5bGVBdHRySW5kZXggPSBwYXRoLm5vZGUuYXR0cmlidXRlcy5maW5kSW5kZXgoXG4gICAgICAgICAgICBhdHRyID0+IHQuaXNKU1hBdHRyaWJ1dGUoYXR0cikgJiYgXG4gICAgICAgICAgICAgICAgICAgIHQuaXNKU1hJZGVudGlmaWVyKGF0dHIubmFtZSkgJiYgXG4gICAgICAgICAgICAgICAgICAgIGF0dHIubmFtZS5uYW1lID09PSAnc3R5bGUnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChzdHlsZUF0dHJJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdHlsZUF0dHIgPSBwYXRoLm5vZGUuYXR0cmlidXRlc1tzdHlsZUF0dHJJbmRleF0gYXMgdC5KU1hBdHRyaWJ1dGU7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgc3R5bGUgdmFsdWUgaXMgZHluYW1pY1xuICAgICAgICAgIGlmICghdGhpcy5pc1N0YXRpY1N0eWxlKHN0eWxlQXR0cikpIHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYFNraXBwZWQgZHluYW1pYyBzdHlsZSBpbiAke2VsZW1lbnROYW1lfSAobGluZSAke3BhdGgubm9kZS5sb2M/LnN0YXJ0LmxpbmV9KWApO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYER5bmFtaWMgc3R5bGUgZGV0ZWN0ZWQgaW4gJHtmaWxlUGF0aH0gLSBza2lwcGluZ2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEV4dHJhY3QgQ1NTIHByb3BlcnRpZXMgZnJvbSBzdHlsZVxuICAgICAgICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSB0aGlzLmV4dHJhY3RDU1NQcm9wZXJ0aWVzKHN0eWxlQXR0cik7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGNzc1Byb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29udmVydCB0byBUYWlsd2luZCBjbGFzc2VzXG4gICAgICAgICAgY29uc3QgeyBjbGFzc2VzLCB3YXJuaW5nczogY29udmVyc2lvbldhcm5pbmdzIH0gPSB0aGlzLm1hcHBlci5jb252ZXJ0TXVsdGlwbGUoY3NzUHJvcGVydGllcyk7XG5cbiAgICAgICAgICBpZiAoY2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uY29udmVyc2lvbldhcm5pbmdzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaW5kIGV4aXN0aW5nIGNsYXNzTmFtZVxuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZUF0dHJJbmRleCA9IHBhdGgubm9kZS5hdHRyaWJ1dGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIGF0dHIgPT4gdC5pc0pTWEF0dHJpYnV0ZShhdHRyKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgdC5pc0pTWElkZW50aWZpZXIoYXR0ci5uYW1lKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgYXR0ci5uYW1lLm5hbWUgPT09ICdjbGFzc05hbWUnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU3R5bGUgPSBnZW5lcmF0ZShzdHlsZUF0dHIpLmNvZGU7XG5cbiAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gTWVyZ2Ugd2l0aCBleGlzdGluZyBjbGFzc05hbWVcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZUF0dHIgPSBwYXRoLm5vZGUuYXR0cmlidXRlc1tjbGFzc05hbWVBdHRySW5kZXhdIGFzIHQuSlNYQXR0cmlidXRlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdGF0aWNDbGFzc05hbWUoY2xhc3NOYW1lQXR0cikpIHtcbiAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBkeW5hbWljIGNsYXNzTmFtZSBpbiAke2VsZW1lbnROYW1lfSAobGluZSAke3BhdGgubm9kZS5sb2M/LnN0YXJ0LmxpbmV9KWApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhc3NlcyA9IHRoaXMuZXh0cmFjdENsYXNzTmFtZVZhbHVlKGNsYXNzTmFtZUF0dHIpO1xuICAgICAgICAgICAgY29uc3QgbWVyZ2VkQ2xhc3NlcyA9IHRoaXMubWVyZ2VDbGFzc2VzKGV4aXN0aW5nQ2xhc3NlcywgY2xhc3Nlcyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBjbGFzc05hbWUgYXR0cmlidXRlXG4gICAgICAgICAgICBjbGFzc05hbWVBdHRyLnZhbHVlID0gdC5zdHJpbmdMaXRlcmFsKG1lcmdlZENsYXNzZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGNsYXNzTmFtZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGNvbnN0IG5ld0NsYXNzTmFtZUF0dHIgPSB0LmpzeEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgdC5qc3hJZGVudGlmaWVyKCdjbGFzc05hbWUnKSxcbiAgICAgICAgICAgICAgdC5zdHJpbmdMaXRlcmFsKGNsYXNzZXMuam9pbignICcpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBhdGgubm9kZS5hdHRyaWJ1dGVzLnB1c2gobmV3Q2xhc3NOYW1lQXR0cik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN0eWxlIGF0dHJpYnV0ZVxuICAgICAgICAgIHBhdGgubm9kZS5hdHRyaWJ1dGVzLnNwbGljZShzdHlsZUF0dHJJbmRleCwgMSk7XG5cbiAgICAgICAgICAvLyBSZWNvcmQgdHJhbnNmb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBuZXdDb2RlID0gZ2VuZXJhdGUocGF0aC5ub2RlKS5jb2RlO1xuICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbFN0eWxlLFxuICAgICAgICAgICAgY29udmVydGVkOiBuZXdDb2RlLFxuICAgICAgICAgICAgY2xhc3NlcyxcbiAgICAgICAgICAgIHdhcm5pbmdzOiBjb252ZXJzaW9uV2FybmluZ3NcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgIHdhcm5pbmdzLnB1c2goLi4uY29udmVyc2lvbldhcm5pbmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIG5ldyBjb2RlXG4gICAgICBjb25zdCBvdXRwdXQgPSBnZW5lcmF0ZShhc3QsIHtcbiAgICAgICAgcmV0YWluTGluZXM6IHRydWUsXG4gICAgICAgIHJldGFpbkZ1bmN0aW9uUGFyZW5zOiB0cnVlLFxuICAgICAgICBjb21tZW50czogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IG91dHB1dC5jb2RlLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICB0cmFuc2Zvcm1hdGlvbnMsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlICR7ZmlsZVBhdGh9OmAsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyc2luZyBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50TmFtZShub2RlOiB0LkpTWE9wZW5pbmdFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAodC5pc0pTWElkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIG5vZGUubmFtZS5uYW1lO1xuICAgIH1cbiAgICBpZiAodC5pc0pTWE1lbWJlckV4cHJlc3Npb24obm9kZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVtYmVyRXhwcmVzc2lvbk5hbWUobm9kZS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWVtYmVyRXhwcmVzc2lvbk5hbWUobm9kZTogdC5KU1hNZW1iZXJFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICBpZiAodC5pc0pTWElkZW50aWZpZXIobm9kZS5vYmplY3QpICYmIHQuaXNKU1hJZGVudGlmaWVyKG5vZGUucHJvcGVydHkpKSB7XG4gICAgICByZXR1cm4gYCR7bm9kZS5vYmplY3QubmFtZX0uJHtub2RlLnByb3BlcnR5Lm5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIHByaXZhdGUgaXNTdGF0aWNTdHlsZShhdHRyOiB0LkpTWEF0dHJpYnV0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghYXR0ci52YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzdHlsZT17eyAuLi4gfX0gKG9iamVjdCBleHByZXNzaW9uKVxuICAgIGlmICh0LmlzSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihhdHRyLnZhbHVlKSkge1xuICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGF0dHIudmFsdWUuZXhwcmVzc2lvbjtcbiAgICAgIFxuICAgICAgLy8gRGlyZWN0IG9iamVjdDogc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19XG4gICAgICBpZiAodC5pc09iamVjdEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzaW1wbGUgb2JqZWN0IHdpdGhvdXQgdmFyaWFibGVzXG4gICAgICBpZiAodC5pc0lkZW50aWZpZXIoZXhwcmVzc2lvbikgfHwgdC5pc01lbWJlckV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBWYXJpYWJsZSByZWZlcmVuY2UgLSBkeW5hbWljXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YXRpY0NsYXNzTmFtZShhdHRyOiB0LkpTWEF0dHJpYnV0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghYXR0ci52YWx1ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHQuaXNTdHJpbmdMaXRlcmFsKGF0dHIudmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodC5pc0pTWEV4cHJlc3Npb25Db250YWluZXIoYXR0ci52YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBhdHRyLnZhbHVlLmV4cHJlc3Npb247XG4gICAgICBcbiAgICAgIC8vIFN0cmluZyBsaXRlcmFsIGluIGV4cHJlc3Npb246IGNsYXNzTmFtZT17XCJjb250YWluZXJcIn1cbiAgICAgIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChleHByZXNzaW9uKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGVtcGxhdGUgbGl0ZXJhbCB3aXRob3V0IGV4cHJlc3Npb25zOiBjbGFzc05hbWU9e2Bjb250YWluZXJgfVxuICAgICAgaWYgKHQuaXNUZW1wbGF0ZUxpdGVyYWwoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi5leHByZXNzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFueXRoaW5nIGVsc2UgaXMgZHluYW1pY1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdENTU1Byb3BlcnRpZXMoYXR0cjogdC5KU1hBdHRyaWJ1dGUpOiBDU1NQcm9wZXJ0eVtdIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBDU1NQcm9wZXJ0eVtdID0gW107XG5cbiAgICBpZiAoIWF0dHIudmFsdWUgfHwgIXQuaXNKU1hFeHByZXNzaW9uQ29udGFpbmVyKGF0dHIudmFsdWUpKSB7XG4gICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gYXR0ci52YWx1ZS5leHByZXNzaW9uO1xuXG4gICAgaWYgKCF0LmlzT2JqZWN0RXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgZXhwcmVzc2lvbi5wcm9wZXJ0aWVzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICBpZiAoIXQuaXNPYmplY3RQcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByb3BlcnR5VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAvLyBHZXQgcHJvcGVydHkgbmFtZVxuICAgICAgaWYgKHQuaXNJZGVudGlmaWVyKHByb3Aua2V5KSkge1xuICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wLmtleS5uYW1lO1xuICAgICAgfSBlbHNlIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChwcm9wLmtleSkpIHtcbiAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcC5rZXkudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgaWYgKHQuaXNTdHJpbmdMaXRlcmFsKHByb3AudmFsdWUpKSB7XG4gICAgICAgIHByb3BlcnR5VmFsdWUgPSBwcm9wLnZhbHVlLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0LmlzTnVtZXJpY0xpdGVyYWwocHJvcC52YWx1ZSkpIHtcbiAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGAke3Byb3AudmFsdWUudmFsdWV9cHhgO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgY2FtZWxDYXNlIHRvIGtlYmFiLWNhc2UgY29udmVyc2lvbiBmb3IgQ1NTIHByb3BlcnRpZXNcbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgJiYgcHJvcGVydHlWYWx1ZSkge1xuICAgICAgICBjb25zdCBjc3NQcm9wZXJ0eSA9IHRoaXMuY2FtZWxUb0tlYmFiKHByb3BlcnR5TmFtZSk7XG4gICAgICAgIHByb3BlcnRpZXMucHVzaCh7XG4gICAgICAgICAgcHJvcGVydHk6IGNzc1Byb3BlcnR5LFxuICAgICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RDbGFzc05hbWVWYWx1ZShhdHRyOiB0LkpTWEF0dHJpYnV0ZSk6IHN0cmluZyB7XG4gICAgaWYgKCFhdHRyLnZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHQuaXNTdHJpbmdMaXRlcmFsKGF0dHIudmFsdWUpKSB7XG4gICAgICByZXR1cm4gYXR0ci52YWx1ZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodC5pc0pTWEV4cHJlc3Npb25Db250YWluZXIoYXR0ci52YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBhdHRyLnZhbHVlLmV4cHJlc3Npb247XG4gICAgICBcbiAgICAgIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChleHByZXNzaW9uKSkge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHQuaXNUZW1wbGF0ZUxpdGVyYWwoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi5xdWFzaXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5xdWFzaXNbMF0udmFsdWUucmF3O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDbGFzc2VzKGV4aXN0aW5nOiBzdHJpbmcsIG5ld0NsYXNzZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBleGlzdGluZ1NldCA9IG5ldyBTZXQoZXhpc3Rpbmcuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgIG5ld0NsYXNzZXMuZm9yRWFjaChjbHMgPT4gZXhpc3RpbmdTZXQuYWRkKGNscykpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKGV4aXN0aW5nU2V0KS5qb2luKCcgJyk7XG4gIH1cblxuICBwcml2YXRlIGNhbWVsVG9LZWJhYihzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export interface ScannedFile {
2
+ path: string;
3
+ type: 'jsx' | 'css';
4
+ }
5
+ export declare function scanProject(directory: string): Promise<ScannedFile[]>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scanProject = scanProject;
7
+ const fast_glob_1 = __importDefault(require("fast-glob"));
8
+ const path_1 = __importDefault(require("path"));
9
+ async function scanProject(directory) {
10
+ const absoluteDir = path_1.default.resolve(directory);
11
+ // Patterns for React components
12
+ const jsxPatterns = [
13
+ '**/*.{js,jsx,ts,tsx}',
14
+ ];
15
+ // Patterns for CSS files
16
+ const cssPatterns = [
17
+ '**/*.css',
18
+ ];
19
+ // Ignore patterns
20
+ const ignorePatterns = [
21
+ '**/node_modules/**',
22
+ '**/.next/**',
23
+ '**/dist/**',
24
+ '**/build/**',
25
+ '**/.git/**',
26
+ '**/coverage/**',
27
+ '**/*.d.ts',
28
+ '**/.*' // hidden files
29
+ ];
30
+ try {
31
+ // Scan for JSX/TSX files
32
+ const jsxFiles = await (0, fast_glob_1.default)(jsxPatterns, {
33
+ cwd: absoluteDir,
34
+ ignore: ignorePatterns,
35
+ absolute: true,
36
+ onlyFiles: true
37
+ });
38
+ // Scan for CSS files
39
+ const cssFiles = await (0, fast_glob_1.default)(cssPatterns, {
40
+ cwd: absoluteDir,
41
+ ignore: ignorePatterns,
42
+ absolute: true,
43
+ onlyFiles: true
44
+ });
45
+ const files = [
46
+ ...jsxFiles.map(file => ({ path: file, type: 'jsx' })),
47
+ ...cssFiles.map(file => ({ path: file, type: 'css' }))
48
+ ];
49
+ return files.sort((a, b) => a.path.localeCompare(b.path));
50
+ }
51
+ catch (error) {
52
+ throw new Error(`Failed to scan directory: ${error}`);
53
+ }
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zY2FubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBUUEsa0NBbURDO0FBM0RELDBEQUE2QjtBQUM3QixnREFBd0I7QUFPakIsS0FBSyxVQUFVLFdBQVcsQ0FBQyxTQUFpQjtJQUNqRCxNQUFNLFdBQVcsR0FBRyxjQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTVDLGdDQUFnQztJQUNoQyxNQUFNLFdBQVcsR0FBRztRQUNsQixzQkFBc0I7S0FDdkIsQ0FBQztJQUVGLHlCQUF5QjtJQUN6QixNQUFNLFdBQVcsR0FBRztRQUNsQixVQUFVO0tBQ1gsQ0FBQztJQUVGLGtCQUFrQjtJQUNsQixNQUFNLGNBQWMsR0FBRztRQUNyQixvQkFBb0I7UUFDcEIsYUFBYTtRQUNiLFlBQVk7UUFDWixhQUFhO1FBQ2IsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixXQUFXO1FBQ1gsT0FBTyxDQUFDLGVBQWU7S0FDeEIsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILHlCQUF5QjtRQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsbUJBQUksRUFBQyxXQUFXLEVBQUU7WUFDdkMsR0FBRyxFQUFFLFdBQVc7WUFDaEIsTUFBTSxFQUFFLGNBQWM7WUFDdEIsUUFBUSxFQUFFLElBQUk7WUFDZCxTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLG1CQUFJLEVBQUMsV0FBVyxFQUFFO1lBQ3ZDLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQWtCO1lBQzNCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFLENBQUM7UUFFRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lZEZpbGUge1xuICBwYXRoOiBzdHJpbmc7XG4gIHR5cGU6ICdqc3gnIHwgJ2Nzcyc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FuUHJvamVjdChkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8U2Nhbm5lZEZpbGVbXT4ge1xuICBjb25zdCBhYnNvbHV0ZURpciA9IHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpO1xuICBcbiAgLy8gUGF0dGVybnMgZm9yIFJlYWN0IGNvbXBvbmVudHNcbiAgY29uc3QganN4UGF0dGVybnMgPSBbXG4gICAgJyoqLyoue2pzLGpzeCx0cyx0c3h9JyxcbiAgXTtcbiAgXG4gIC8vIFBhdHRlcm5zIGZvciBDU1MgZmlsZXNcbiAgY29uc3QgY3NzUGF0dGVybnMgPSBbXG4gICAgJyoqLyouY3NzJyxcbiAgXTtcbiAgXG4gIC8vIElnbm9yZSBwYXR0ZXJuc1xuICBjb25zdCBpZ25vcmVQYXR0ZXJucyA9IFtcbiAgICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgICAnKiovLm5leHQvKionLFxuICAgICcqKi9kaXN0LyoqJyxcbiAgICAnKiovYnVpbGQvKionLFxuICAgICcqKi8uZ2l0LyoqJyxcbiAgICAnKiovY292ZXJhZ2UvKionLFxuICAgICcqKi8qLmQudHMnLFxuICAgICcqKi8uKicgLy8gaGlkZGVuIGZpbGVzXG4gIF07XG5cbiAgdHJ5IHtcbiAgICAvLyBTY2FuIGZvciBKU1gvVFNYIGZpbGVzXG4gICAgY29uc3QganN4RmlsZXMgPSBhd2FpdCBnbG9iKGpzeFBhdHRlcm5zLCB7XG4gICAgICBjd2Q6IGFic29sdXRlRGlyLFxuICAgICAgaWdub3JlOiBpZ25vcmVQYXR0ZXJucyxcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgb25seUZpbGVzOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBTY2FuIGZvciBDU1MgZmlsZXNcbiAgICBjb25zdCBjc3NGaWxlcyA9IGF3YWl0IGdsb2IoY3NzUGF0dGVybnMsIHtcbiAgICAgIGN3ZDogYWJzb2x1dGVEaXIsXG4gICAgICBpZ25vcmU6IGlnbm9yZVBhdHRlcm5zLFxuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICBvbmx5RmlsZXM6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbGVzOiBTY2FubmVkRmlsZVtdID0gW1xuICAgICAgLi4uanN4RmlsZXMubWFwKGZpbGUgPT4gKHsgcGF0aDogZmlsZSwgdHlwZTogJ2pzeCcgYXMgY29uc3QgfSkpLFxuICAgICAgLi4uY3NzRmlsZXMubWFwKGZpbGUgPT4gKHsgcGF0aDogZmlsZSwgdHlwZTogJ2NzcycgYXMgY29uc3QgfSkpXG4gICAgXTtcblxuICAgIHJldHVybiBmaWxlcy5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzY2FuIGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,35 @@
1
+ import { TailwindConfig } from './utils/config';
2
+ export interface CSSProperty {
3
+ property: string;
4
+ value: string;
5
+ }
6
+ export interface ConversionResult {
7
+ className: string | null;
8
+ skipped: boolean;
9
+ reason?: string;
10
+ }
11
+ export declare class TailwindMapper {
12
+ private config;
13
+ private spacingScale;
14
+ constructor(config: TailwindConfig);
15
+ private buildSpacingScale;
16
+ private pxToSpacing;
17
+ private extractPx;
18
+ convertProperty(property: string, value: string): ConversionResult;
19
+ private convertDisplay;
20
+ private convertMargin;
21
+ private convertPadding;
22
+ private convertFontWeight;
23
+ private convertFontSize;
24
+ private convertFlexbox;
25
+ private convertGap;
26
+ private convertWidth;
27
+ private convertHeight;
28
+ private convertBackgroundColor;
29
+ private convertTextColor;
30
+ private convertBorderRadius;
31
+ convertMultiple(properties: CSSProperty[]): {
32
+ classes: string[];
33
+ warnings: string[];
34
+ };
35
+ }