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.
- package/README.md +303 -0
- package/bin/index.js +11 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +80 -0
- package/dist/cssParser.d.ts +41 -0
- package/dist/cssParser.js +215 -0
- package/dist/fileWriter.d.ts +14 -0
- package/dist/fileWriter.js +128 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +21 -0
- package/dist/jsxParser.d.ts +26 -0
- package/dist/jsxParser.js +273 -0
- package/dist/scanner.d.ts +5 -0
- package/dist/scanner.js +55 -0
- package/dist/tailwindMapper.d.ts +35 -0
- package/dist/tailwindMapper.js +428 -0
- package/dist/transformer.d.ts +19 -0
- package/dist/transformer.js +259 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.js +139 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.js +56 -0
- package/package.json +73 -0
|
@@ -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=
|
package/dist/scanner.js
ADDED
|
@@ -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
|
+
}
|