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,215 @@
|
|
|
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.CSSParser = void 0;
|
|
7
|
+
const postcss_1 = __importDefault(require("postcss"));
|
|
8
|
+
const postcss_safe_parser_1 = __importDefault(require("postcss-safe-parser"));
|
|
9
|
+
const logger_1 = require("./utils/logger");
|
|
10
|
+
class CSSParser {
|
|
11
|
+
constructor(mapper) {
|
|
12
|
+
this.mapper = mapper;
|
|
13
|
+
}
|
|
14
|
+
async parse(css, filePath) {
|
|
15
|
+
const rules = [];
|
|
16
|
+
const warnings = [];
|
|
17
|
+
let hasChanges = false;
|
|
18
|
+
try {
|
|
19
|
+
const root = await (0, postcss_1.default)().process(css, {
|
|
20
|
+
parser: postcss_safe_parser_1.default,
|
|
21
|
+
from: filePath
|
|
22
|
+
}).then(result => result.root);
|
|
23
|
+
// Process each rule
|
|
24
|
+
root.walkRules((rule) => {
|
|
25
|
+
// Skip rules inside @media, @supports, etc.
|
|
26
|
+
if (rule.parent && rule.parent.type === 'atrule') {
|
|
27
|
+
warnings.push(`Skipped rule with at-rule parent: ${rule.selector}`);
|
|
28
|
+
logger_1.logger.verbose(`Skipping at-rule: ${rule.selector}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Skip pseudo-selectors
|
|
32
|
+
if (rule.selector.includes(':')) {
|
|
33
|
+
warnings.push(`Skipped pseudo-selector: ${rule.selector}`);
|
|
34
|
+
logger_1.logger.verbose(`Skipping pseudo-selector: ${rule.selector}`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Only process simple class selectors
|
|
38
|
+
const classNameMatch = rule.selector.match(/^\.([a-zA-Z_-][a-zA-Z0-9_-]*)$/);
|
|
39
|
+
if (!classNameMatch) {
|
|
40
|
+
warnings.push(`Skipped complex selector: ${rule.selector}`);
|
|
41
|
+
logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const className = classNameMatch[1];
|
|
45
|
+
const declarations = [];
|
|
46
|
+
rule.walkDecls((decl) => {
|
|
47
|
+
// Skip CSS variables
|
|
48
|
+
if (decl.prop.startsWith('--')) {
|
|
49
|
+
warnings.push(`Skipped CSS variable: ${decl.prop}`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Skip calc()
|
|
53
|
+
if (decl.value.includes('calc(')) {
|
|
54
|
+
warnings.push(`Skipped calc() value: ${decl.value}`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
declarations.push({
|
|
58
|
+
property: decl.prop,
|
|
59
|
+
value: decl.value
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
if (declarations.length === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Convert to Tailwind classes - track which specific declarations were converted
|
|
66
|
+
const conversionResults = [];
|
|
67
|
+
const conversionWarnings = [];
|
|
68
|
+
declarations.forEach(decl => {
|
|
69
|
+
const result = this.mapper.convertProperty(decl.property, decl.value);
|
|
70
|
+
conversionResults.push({
|
|
71
|
+
declaration: decl,
|
|
72
|
+
converted: !result.skipped && result.className !== null,
|
|
73
|
+
className: result.className
|
|
74
|
+
});
|
|
75
|
+
if (result.skipped && result.reason) {
|
|
76
|
+
conversionWarnings.push(result.reason);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
const convertedClasses = conversionResults
|
|
80
|
+
.filter(r => r.converted && r.className)
|
|
81
|
+
.map(r => r.className);
|
|
82
|
+
const allDeclarationsConverted = conversionResults.every(r => r.converted);
|
|
83
|
+
const someDeclarationsConverted = convertedClasses.length > 0;
|
|
84
|
+
const cssRule = {
|
|
85
|
+
selector: rule.selector,
|
|
86
|
+
className,
|
|
87
|
+
declarations,
|
|
88
|
+
convertedClasses,
|
|
89
|
+
skipped: !someDeclarationsConverted,
|
|
90
|
+
fullyConverted: allDeclarationsConverted,
|
|
91
|
+
partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
|
|
92
|
+
reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined
|
|
93
|
+
};
|
|
94
|
+
rules.push(cssRule);
|
|
95
|
+
warnings.push(...conversionWarnings);
|
|
96
|
+
// CRITICAL FIX: Only remove declarations that were successfully converted
|
|
97
|
+
// Never remove the entire rule unless ALL declarations are converted
|
|
98
|
+
if (someDeclarationsConverted) {
|
|
99
|
+
hasChanges = true;
|
|
100
|
+
if (allDeclarationsConverted) {
|
|
101
|
+
// All declarations converted - safe to remove entire rule
|
|
102
|
+
rule.remove();
|
|
103
|
+
logger_1.logger.verbose(`Removed rule .${className} (all ${declarations.length} declarations converted)`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Partial conversion - only remove the converted declarations
|
|
107
|
+
let removedCount = 0;
|
|
108
|
+
rule.walkDecls((decl) => {
|
|
109
|
+
const wasConverted = conversionResults.some(r => r.converted &&
|
|
110
|
+
r.declaration.property === decl.prop &&
|
|
111
|
+
r.declaration.value === decl.value);
|
|
112
|
+
if (wasConverted) {
|
|
113
|
+
decl.remove();
|
|
114
|
+
removedCount++;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
logger_1.logger.verbose(`Partial conversion of .${className}: removed ${removedCount}/${declarations.length} declarations`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
// Clean up empty at-rules
|
|
122
|
+
root.walkAtRules((atRule) => {
|
|
123
|
+
if (atRule.nodes && atRule.nodes.length === 0) {
|
|
124
|
+
atRule.remove();
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
const canDelete = root.nodes.length === 0;
|
|
128
|
+
const newCss = root.toString();
|
|
129
|
+
return {
|
|
130
|
+
css: newCss,
|
|
131
|
+
rules,
|
|
132
|
+
hasChanges,
|
|
133
|
+
canDelete,
|
|
134
|
+
warnings
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
logger_1.logger.error(`Failed to parse CSS ${filePath}:`, error);
|
|
139
|
+
throw new Error(`CSS parsing failed: ${error}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
parseInternalStyle(html) {
|
|
143
|
+
const styles = [];
|
|
144
|
+
const warnings = [];
|
|
145
|
+
// Simple regex to find style tags (this is safe for finding tags, not for parsing content)
|
|
146
|
+
const styleRegex = /<style[^>]*>([\s\S]*?)<\/style>/gi;
|
|
147
|
+
let match;
|
|
148
|
+
while ((match = styleRegex.exec(html)) !== null) {
|
|
149
|
+
styles.push({
|
|
150
|
+
content: match[1].trim(),
|
|
151
|
+
start: match.index,
|
|
152
|
+
end: match.index + match[0].length
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return { styles, warnings };
|
|
156
|
+
}
|
|
157
|
+
async parseInternalCSS(html, filePath) {
|
|
158
|
+
const allRules = [];
|
|
159
|
+
const allWarnings = [];
|
|
160
|
+
let modifiedHtml = html;
|
|
161
|
+
let hasChanges = false;
|
|
162
|
+
const { styles } = this.parseInternalStyle(html);
|
|
163
|
+
// Process styles in reverse order to preserve indices
|
|
164
|
+
for (let i = styles.length - 1; i >= 0; i--) {
|
|
165
|
+
const style = styles[i];
|
|
166
|
+
try {
|
|
167
|
+
const result = await this.parse(style.content, filePath);
|
|
168
|
+
allRules.push(...result.rules);
|
|
169
|
+
allWarnings.push(...result.warnings);
|
|
170
|
+
if (result.hasChanges) {
|
|
171
|
+
hasChanges = true;
|
|
172
|
+
if (result.canDelete || result.css.trim() === '') {
|
|
173
|
+
// Remove entire style tag
|
|
174
|
+
modifiedHtml = modifiedHtml.slice(0, style.start) + modifiedHtml.slice(style.end);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Replace style content
|
|
178
|
+
const before = modifiedHtml.slice(0, style.start);
|
|
179
|
+
const after = modifiedHtml.slice(style.end);
|
|
180
|
+
const tagStart = html.slice(style.start).match(/<style[^>]*>/)?.[0] || '<style>';
|
|
181
|
+
const tagEnd = '</style>';
|
|
182
|
+
modifiedHtml = before + tagStart + '\n' + result.css + '\n' + tagEnd + after;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
logger_1.logger.warn(`Failed to parse internal style block: ${error}`);
|
|
188
|
+
allWarnings.push(`Failed to parse internal style: ${error}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
html: modifiedHtml,
|
|
193
|
+
rules: allRules,
|
|
194
|
+
hasChanges,
|
|
195
|
+
warnings: allWarnings
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
extractImportPaths(code) {
|
|
199
|
+
const imports = [];
|
|
200
|
+
// Match CSS imports
|
|
201
|
+
const importRegex = /import\s+['"]([^'"]+\.css)['"];?/g;
|
|
202
|
+
let match;
|
|
203
|
+
while ((match = importRegex.exec(code)) !== null) {
|
|
204
|
+
imports.push(match[1]);
|
|
205
|
+
}
|
|
206
|
+
// Match require statements
|
|
207
|
+
const requireRegex = /require\s*\(\s*['"]([^'"]+\.css)['"]\s*\)/g;
|
|
208
|
+
while ((match = requireRegex.exec(code)) !== null) {
|
|
209
|
+
imports.push(match[1]);
|
|
210
|
+
}
|
|
211
|
+
return imports;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
exports.CSSParser = CSSParser;
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQXlCeEMsTUFBYSxTQUFTO0lBR3BCLFlBQVksTUFBc0I7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBVyxFQUFFLFFBQWdCO1FBQ3ZDLE1BQU0sS0FBSyxHQUFjLEVBQUUsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDOUIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXZCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxpQkFBTyxHQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDeEMsTUFBTSxFQUFFLDZCQUFVO2dCQUNsQixJQUFJLEVBQUUsUUFBUTthQUNmLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0Isb0JBQW9CO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdEIsNENBQTRDO2dCQUM1QyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxJQUFJLENBQUMscUNBQXFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUNwRSxlQUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDckQsT0FBTztnQkFDVCxDQUFDO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxJQUFJLENBQUMs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biwgQXRSdWxlIH0gZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgc2FmZVBhcnNlciBmcm9tICdwb3N0Y3NzLXNhZmUtcGFyc2VyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyLCBDU1NQcm9wZXJ0eSB9IGZyb20gJy4vdGFpbHdpbmRNYXBwZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENTU1J1bGUge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdO1xuICBjb252ZXJ0ZWRDbGFzc2VzOiBzdHJpbmdbXTtcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgZnVsbHlDb252ZXJ0ZWQ6IGJvb2xlYW47IC8vIE5FVzogdHJ1ZSBpZiBBTEwgZGVjbGFyYXRpb25zIGluIHRoaXMgcnVsZSB3ZXJlIGNvbnZlcnRlZFxuICBwYXJ0aWFsQ29udmVyc2lvbjogYm9vbGVhbjsgLy8gTkVXOiB0cnVlIGlmIFNPTUUgYnV0IG5vdCBhbGwgZGVjbGFyYXRpb25zIHdlcmUgY29udmVydGVkXG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU1NQYXJzZVJlc3VsdCB7XG4gIGNzczogc3RyaW5nO1xuICBydWxlczogQ1NTUnVsZVtdO1xuICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICBjYW5EZWxldGU6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU1NVc2FnZU1hcCB7XG4gIFtjbGFzc05hbWU6IHN0cmluZ106IHN0cmluZ1tdOyAvLyBjbGFzc05hbWUgLT4gZmlsZSBwYXRoc1xufVxuXG5leHBvcnQgY2xhc3MgQ1NTUGFyc2VyIHtcbiAgcHJpdmF0ZSBtYXBwZXI6IFRhaWx3aW5kTWFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIpIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlKGNzczogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDU1NQYXJzZVJlc3VsdD4ge1xuICAgIGNvbnN0IHJ1bGVzOiBDU1NSdWxlW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCBwb3N0Y3NzKCkucHJvY2Vzcyhjc3MsIHtcbiAgICAgICAgcGFyc2VyOiBzYWZlUGFyc2VyLFxuICAgICAgICBmcm9tOiBmaWxlUGF0aFxuICAgICAgfSkudGhlbihyZXN1bHQgPT4gcmVzdWx0LnJvb3QpO1xuXG4gICAgICAvLyBQcm9jZXNzIGVhY2ggcnVsZVxuICAgICAgcm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgICAgLy8gU2tpcCBydWxlcyBpbnNpZGUgQG1lZGlhLCBAc3VwcG9ydHMsIGV0Yy5cbiAgICAgICAgaWYgKHJ1bGUucGFyZW50ICYmIHJ1bGUucGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBydWxlIHdpdGggYXQtcnVsZSBwYXJlbnQ6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgU2tpcHBpbmcgYXQtcnVsZTogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgcHNldWRvLXNlbGVjdG9yc1xuICAgICAgICBpZiAocnVsZS5zZWxlY3Rvci5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBwc2V1ZG8tc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgU2tpcHBpbmcgcHNldWRvLXNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIHNpbXBsZSBjbGFzcyBzZWxlY3RvcnNcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lTWF0Y2ggPSBydWxlLnNlbGVjdG9yLm1hdGNoKC9eXFwuKFthLXpBLVpfLV1bYS16QS1aMC05Xy1dKikkLyk7XG4gICAgICAgIGlmICghY2xhc3NOYW1lTWF0Y2gpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKGBTa2lwcGVkIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgU2tpcHBpbmcgY29tcGxleCBzZWxlY3RvcjogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTmFtZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W10gPSBbXTtcblxuICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgQ1NTIHZhcmlhYmxlc1xuICAgICAgICAgIGlmIChkZWNsLnByb3Auc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBDU1MgdmFyaWFibGU6ICR7ZGVjbC5wcm9wfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNraXAgY2FsYygpXG4gICAgICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYFNraXBwZWQgY2FsYygpIHZhbHVlOiAke2RlY2wudmFsdWV9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydHk6IGRlY2wucHJvcCxcbiAgICAgICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCB0byBUYWlsd2luZCBjbGFzc2VzIC0gdHJhY2sgd2hpY2ggc3BlY2lmaWMgZGVjbGFyYXRpb25zIHdlcmUgY29udmVydGVkXG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7XG4gICAgICAgICAgZGVjbGFyYXRpb246IENTU1Byb3BlcnR5O1xuICAgICAgICAgIGNvbnZlcnRlZDogYm9vbGVhbjtcbiAgICAgICAgICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIH0+ID0gW107XG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hcHBlci5jb252ZXJ0UHJvcGVydHkoZGVjbC5wcm9wZXJ0eSwgZGVjbC52YWx1ZSk7XG4gICAgICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbjogZGVjbCxcbiAgICAgICAgICAgIGNvbnZlcnRlZDogIXJlc3VsdC5za2lwcGVkICYmIHJlc3VsdC5jbGFzc05hbWUgIT09IG51bGwsXG4gICAgICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5jbGFzc05hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LnNraXBwZWQgJiYgcmVzdWx0LnJlYXNvbikge1xuICAgICAgICAgICAgY29udmVyc2lvbldhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRDbGFzc2VzID0gY29udmVyc2lvblJlc3VsdHNcbiAgICAgICAgICAuZmlsdGVyKHIgPT4gci5jb252ZXJ0ZWQgJiYgci5jbGFzc05hbWUpXG4gICAgICAgICAgLm1hcChyID0+IHIuY2xhc3NOYW1lISk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJzaW9uUmVzdWx0cy5ldmVyeShyID0+IHIuY29udmVydGVkKTtcbiAgICAgICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgICAgICBjb25zdCBjc3NSdWxlOiBDU1NSdWxlID0ge1xuICAgICAgICAgIHNlbGVjdG9yOiBydWxlLnNlbGVjdG9yLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgICBza2lwcGVkOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgICAgICBmdWxseUNvbnZlcnRlZDogYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgICAgcmVhc29uOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA/ICdObyBjb252ZXJ0aWJsZSBkZWNsYXJhdGlvbnMnIDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgcnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIC8vIENSSVRJQ0FMIEZJWDogT25seSByZW1vdmUgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgY29udmVydGVkXG4gICAgICAgIC8vIE5ldmVyIHJlbW92ZSB0aGUgZW50aXJlIHJ1bGUgdW5sZXNzIEFMTCBkZWNsYXJhdGlvbnMgYXJlIGNvbnZlcnRlZFxuICAgICAgICBpZiAoc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIC8vIEFsbCBkZWNsYXJhdGlvbnMgY29udmVydGVkIC0gc2FmZSB0byByZW1vdmUgZW50aXJlIHJ1bGVcbiAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBydWxlIC4ke2NsYXNzTmFtZX0gKGFsbCAke2RlY2xhcmF0aW9ucy5sZW5ndGh9IGRlY2xhcmF0aW9ucyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFBhcnRpYWwgY29udmVyc2lvbiAtIG9ubHkgcmVtb3ZlIHRoZSBjb252ZXJ0ZWQgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcbiAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdhc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLnNvbWUociA9PiBcbiAgICAgICAgICAgICAgICByLmNvbnZlcnRlZCAmJiBcbiAgICAgICAgICAgICAgICByLmRlY2xhcmF0aW9uLnByb3BlcnR5ID09PSBkZWNsLnByb3AgJiYgXG4gICAgICAgICAgICAgICAgci5kZWNsYXJhdGlvbi52YWx1ZSA9PT0gZGVjbC52YWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYgKHdhc0NvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIC4ke2NsYXNzTmFtZX06IHJlbW92ZWQgJHtyZW1vdmVkQ291bnR9LyR7ZGVjbGFyYXRpb25zLmxlbmd0aH0gZGVjbGFyYXRpb25zYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXQtcnVsZXNcbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW5EZWxldGUgPSByb290Lm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIGNvbnN0IG5ld0NzcyA9IHJvb3QudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBuZXdDc3MsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICBjYW5EZWxldGUsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIENTUyAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENTUyBwYXJzaW5nIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUludGVybmFsU3R5bGUoaHRtbDogc3RyaW5nKTogeyBcbiAgICBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHN0eWxlczogQXJyYXk8eyBjb250ZW50OiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBTaW1wbGUgcmVnZXggdG8gZmluZCBzdHlsZSB0YWdzICh0aGlzIGlzIHNhZmUgZm9yIGZpbmRpbmcgdGFncywgbm90IGZvciBwYXJzaW5nIGNvbnRlbnQpXG4gICAgY29uc3Qgc3R5bGVSZWdleCA9IC88c3R5bGVbXj5dKj4oW1xcc1xcU10qPyk8XFwvc3R5bGU+L2dpO1xuICAgIGxldCBtYXRjaDtcblxuICAgIHdoaWxlICgobWF0Y2ggPSBzdHlsZVJlZ2V4LmV4ZWMoaHRtbCkpICE9PSBudWxsKSB7XG4gICAgICBzdHlsZXMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IG1hdGNoWzFdLnRyaW0oKSxcbiAgICAgICAgc3RhcnQ6IG1hdGNoLmluZGV4LFxuICAgICAgICBlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdHlsZXMsIHdhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBwYXJzZUludGVybmFsQ1NTKGh0bWw6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGh0bWw6IHN0cmluZztcbiAgICBydWxlczogQ1NTUnVsZVtdO1xuICAgIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9PiB7XG4gICAgY29uc3QgYWxsUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtb2RpZmllZEh0bWwgPSBodG1sO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBjb25zdCB7IHN0eWxlcyB9ID0gdGhpcy5wYXJzZUludGVybmFsU3R5bGUoaHRtbCk7XG5cbiAgICAvLyBQcm9jZXNzIHN0eWxlcyBpbiByZXZlcnNlIG9yZGVyIHRvIHByZXNlcnZlIGluZGljZXNcbiAgICBmb3IgKGxldCBpID0gc3R5bGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHN0eWxlc1tpXTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYXJzZShzdHlsZS5jb250ZW50LCBmaWxlUGF0aCk7XG4gICAgICAgIFxuICAgICAgICBhbGxSdWxlcy5wdXNoKC4uLnJlc3VsdC5ydWxlcyk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goLi4ucmVzdWx0Lndhcm5pbmdzKTtcblxuICAgICAgICBpZiAocmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuY2FuRGVsZXRlIHx8IHJlc3VsdC5jc3MudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGVudGlyZSBzdHlsZSB0YWdcbiAgICAgICAgICAgIG1vZGlmaWVkSHRtbCA9IG1vZGlmaWVkSHRtbC5zbGljZSgwLCBzdHlsZS5zdGFydCkgKyBtb2RpZmllZEh0bWwuc2xpY2Uoc3R5bGUuZW5kKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSBzdHlsZSBjb250ZW50XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBtb2RpZmllZEh0bWwuc2xpY2Uoc3R5bGUuZW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ1N0YXJ0ID0gaHRtbC5zbGljZShzdHlsZS5zdGFydCkubWF0Y2goLzxzdHlsZVtePl0qPi8pPy5bMF0gfHwgJzxzdHlsZT4nO1xuICAgICAgICAgICAgY29uc3QgdGFnRW5kID0gJzwvc3R5bGU+JztcbiAgICAgICAgICAgIG1vZGlmaWVkSHRtbCA9IGJlZm9yZSArIHRhZ1N0YXJ0ICsgJ1xcbicgKyByZXN1bHQuY3NzICsgJ1xcbicgKyB0YWdFbmQgKyBhZnRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgc3R5bGUgYmxvY2s6ICR7ZXJyb3J9YCk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZTogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaHRtbDogbW9kaWZpZWRIdG1sLFxuICAgICAgcnVsZXM6IGFsbFJ1bGVzLFxuICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgIHdhcm5pbmdzOiBhbGxXYXJuaW5nc1xuICAgIH07XG4gIH1cblxuICBleHRyYWN0SW1wb3J0UGF0aHMoY29kZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgLy8gTWF0Y2ggQ1NTIGltcG9ydHNcbiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRcXHMrWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXTs/L2c7XG4gICAgbGV0IG1hdGNoO1xuICAgIFxuICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICAvLyBNYXRjaCByZXF1aXJlIHN0YXRlbWVudHNcbiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXVxccypcXCkvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRzO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface FileWriteOptions {
|
|
2
|
+
dryRun: boolean;
|
|
3
|
+
backup?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare class FileWriter {
|
|
6
|
+
private dryRun;
|
|
7
|
+
private backupDir;
|
|
8
|
+
constructor(options: FileWriteOptions);
|
|
9
|
+
writeFile(filePath: string, content: string, originalContent: string): Promise<boolean>;
|
|
10
|
+
deleteFile(filePath: string): Promise<boolean>;
|
|
11
|
+
private createBackup;
|
|
12
|
+
private showDiff;
|
|
13
|
+
static restoreBackups(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
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.FileWriter = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const logger_1 = require("./utils/logger");
|
|
11
|
+
class FileWriter {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.dryRun = options.dryRun;
|
|
14
|
+
this.backupDir = path_1.default.join(process.cwd(), '.css-to-tailwind-backups');
|
|
15
|
+
}
|
|
16
|
+
async writeFile(filePath, content, originalContent) {
|
|
17
|
+
if (this.dryRun) {
|
|
18
|
+
this.showDiff(filePath, originalContent, content);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
// Create backup
|
|
23
|
+
await this.createBackup(filePath, originalContent);
|
|
24
|
+
// Write file
|
|
25
|
+
fs_1.default.writeFileSync(filePath, content, 'utf-8');
|
|
26
|
+
logger_1.logger.success(`✏️ Modified: ${path_1.default.relative(process.cwd(), filePath)}`);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger_1.logger.error(`Failed to write ${filePath}:`, error);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async deleteFile(filePath) {
|
|
35
|
+
if (this.dryRun) {
|
|
36
|
+
logger_1.logger.info(`🗑️ Would delete: ${path_1.default.relative(process.cwd(), filePath)}`);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
// Create backup before deletion
|
|
41
|
+
const content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
42
|
+
await this.createBackup(filePath, content);
|
|
43
|
+
fs_1.default.unlinkSync(filePath);
|
|
44
|
+
logger_1.logger.success(`🗑️ Deleted: ${path_1.default.relative(process.cwd(), filePath)}`);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
logger_1.logger.error(`Failed to delete ${filePath}:`, error);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async createBackup(filePath, content) {
|
|
53
|
+
try {
|
|
54
|
+
// Create backup directory if it doesn't exist
|
|
55
|
+
if (!fs_1.default.existsSync(this.backupDir)) {
|
|
56
|
+
fs_1.default.mkdirSync(this.backupDir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
const relativePath = path_1.default.relative(process.cwd(), filePath);
|
|
59
|
+
const backupPath = path_1.default.join(this.backupDir, relativePath);
|
|
60
|
+
const backupDir = path_1.default.dirname(backupPath);
|
|
61
|
+
// Create subdirectory structure
|
|
62
|
+
if (!fs_1.default.existsSync(backupDir)) {
|
|
63
|
+
fs_1.default.mkdirSync(backupDir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
// Write backup
|
|
66
|
+
fs_1.default.writeFileSync(backupPath, content, 'utf-8');
|
|
67
|
+
logger_1.logger.verbose(`Created backup: ${backupPath}`);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
logger_1.logger.warn(`Failed to create backup for ${filePath}:`, error);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
showDiff(filePath, original, modified) {
|
|
74
|
+
const relativePath = path_1.default.relative(process.cwd(), filePath);
|
|
75
|
+
logger_1.logger.info(`\n📄 ${relativePath} (dry-run)`);
|
|
76
|
+
const originalLines = original.split('\n');
|
|
77
|
+
const modifiedLines = modified.split('\n');
|
|
78
|
+
// Simple diff - show first few changed lines
|
|
79
|
+
const maxLines = Math.max(originalLines.length, modifiedLines.length);
|
|
80
|
+
let changes = 0;
|
|
81
|
+
for (let i = 0; i < maxLines && changes < 10; i++) {
|
|
82
|
+
const orig = originalLines[i] || '';
|
|
83
|
+
const mod = modifiedLines[i] || '';
|
|
84
|
+
if (orig !== mod) {
|
|
85
|
+
changes++;
|
|
86
|
+
console.log(chalk_1.default.red(` - ${orig}`));
|
|
87
|
+
console.log(chalk_1.default.green(` + ${mod}`));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (changes === 0) {
|
|
91
|
+
logger_1.logger.verbose(' (no visible changes)');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
static restoreBackups() {
|
|
95
|
+
const backupDir = path_1.default.join(process.cwd(), '.css-to-tailwind-backups');
|
|
96
|
+
if (!fs_1.default.existsSync(backupDir)) {
|
|
97
|
+
logger_1.logger.warn('No backups found to restore');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
logger_1.logger.info('🔄 Restoring files from backup...');
|
|
101
|
+
// Recursively restore files
|
|
102
|
+
const restoreRecursive = (dir) => {
|
|
103
|
+
const items = fs_1.default.readdirSync(dir);
|
|
104
|
+
for (const item of items) {
|
|
105
|
+
const fullPath = path_1.default.join(dir, item);
|
|
106
|
+
const stat = fs_1.default.statSync(fullPath);
|
|
107
|
+
if (stat.isDirectory()) {
|
|
108
|
+
restoreRecursive(fullPath);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const relativePath = path_1.default.relative(backupDir, fullPath);
|
|
112
|
+
const originalPath = path_1.default.join(process.cwd(), relativePath);
|
|
113
|
+
try {
|
|
114
|
+
fs_1.default.copyFileSync(fullPath, originalPath);
|
|
115
|
+
logger_1.logger.success(`Restored: ${relativePath}`);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
logger_1.logger.error(`Failed to restore ${relativePath}:`, error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
restoreRecursive(backupDir);
|
|
124
|
+
logger_1.logger.success('✅ Restore complete');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.FileWriter = FileWriter;
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVdyaXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlV3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsa0RBQTBCO0FBQzFCLDJDQUF3QztBQU94QyxNQUFhLFVBQVU7SUFJckIsWUFBWSxPQUF5QjtRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQWdCLEVBQUUsT0FBZSxFQUFFLGVBQXVCO1FBQ3hFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxnQkFBZ0I7WUFDaEIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUVuRCxhQUFhO1lBQ2IsWUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLGVBQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLGNBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsUUFBUSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7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b0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUF6SUQsZ0NBeUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlV3JpdGVPcHRpb25zIHtcbiAgZHJ5UnVuOiBib29sZWFuO1xuICBiYWNrdXA/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRmlsZVdyaXRlciB7XG4gIHByaXZhdGUgZHJ5UnVuOiBib29sZWFuO1xuICBwcml2YXRlIGJhY2t1cERpcjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEZpbGVXcml0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmRyeVJ1biA9IG9wdGlvbnMuZHJ5UnVuO1xuICAgIHRoaXMuYmFja3VwRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuY3NzLXRvLXRhaWx3aW5kLWJhY2t1cHMnKTtcbiAgfVxuXG4gIGFzeW5jIHdyaXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9yaWdpbmFsQ29udGVudDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZHJ5UnVuKSB7XG4gICAgICB0aGlzLnNob3dEaWZmKGZpbGVQYXRoLCBvcmlnaW5hbENvbnRlbnQsIGNvbnRlbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBiYWNrdXBcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwKGZpbGVQYXRoLCBvcmlnaW5hbENvbnRlbnQpO1xuXG4gICAgICAvLyBXcml0ZSBmaWxlXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGDinI/vuI8gIE1vZGlmaWVkOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHdyaXRlICR7ZmlsZVBhdGh9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5kcnlSdW4pIHtcbiAgICAgIGxvZ2dlci5pbmZvKGDwn5eR77iPICBXb3VsZCBkZWxldGU6ICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlUGF0aCl9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGJhY2t1cCBiZWZvcmUgZGVsZXRpb25cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXAoZmlsZVBhdGgsIGNvbnRlbnQpO1xuXG4gICAgICBmcy51bmxpbmtTeW5jKGZpbGVQYXRoKTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGDwn5eR77iPICBEZWxldGVkOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVCYWNrdXAoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBiYWNrdXAgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmJhY2t1cERpcikpIHtcbiAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuYmFja3VwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlUGF0aCk7XG4gICAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKHRoaXMuYmFja3VwRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgYmFja3VwRGlyID0gcGF0aC5kaXJuYW1lKGJhY2t1cFBhdGgpO1xuXG4gICAgICAvLyBDcmVhdGUgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJhY2t1cERpcikpIHtcbiAgICAgICAgZnMubWtkaXJTeW5jKGJhY2t1cERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIGJhY2t1cFxuICAgICAgZnMud3JpdGVGaWxlU3luYyhiYWNrdXBQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBDcmVhdGVkIGJhY2t1cDogJHtiYWNrdXBQYXRofWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGNyZWF0ZSBiYWNrdXAgZm9yICR7ZmlsZVBhdGh9OmAsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dEaWZmKGZpbGVQYXRoOiBzdHJpbmcsIG9yaWdpbmFsOiBzdHJpbmcsIG1vZGlmaWVkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGZpbGVQYXRoKTtcbiAgICBsb2dnZXIuaW5mbyhgXFxu8J+ThCAke3JlbGF0aXZlUGF0aH0gKGRyeS1ydW4pYCk7XG4gICAgXG4gICAgY29uc3Qgb3JpZ2luYWxMaW5lcyA9IG9yaWdpbmFsLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCBtb2RpZmllZExpbmVzID0gbW9kaWZpZWQuc3BsaXQoJ1xcbicpO1xuXG4gICAgLy8gU2ltcGxlIGRpZmYgLSBzaG93IGZpcnN0IGZldyBjaGFuZ2VkIGxpbmVzXG4gICAgY29uc3QgbWF4TGluZXMgPSBNYXRoLm1heChvcmlnaW5hbExpbmVzLmxlbmd0aCwgbW9kaWZpZWRMaW5lcy5sZW5ndGgpO1xuICAgIGxldCBjaGFuZ2VzID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TGluZXMgJiYgY2hhbmdlcyA8IDEwOyBpKyspIHtcbiAgICAgIGNvbnN0IG9yaWcgPSBvcmlnaW5hbExpbmVzW2ldIHx8ICcnO1xuICAgICAgY29uc3QgbW9kID0gbW9kaWZpZWRMaW5lc1tpXSB8fCAnJztcblxuICAgICAgaWYgKG9yaWcgIT09IG1vZCkge1xuICAgICAgICBjaGFuZ2VzKys7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgICAtICR7b3JpZ31gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAgICsgJHttb2R9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzID09PSAwKSB7XG4gICAgICBsb2dnZXIudmVyYm9zZSgnICAobm8gdmlzaWJsZSBjaGFuZ2VzKScpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXN0b3JlQmFja3VwcygpOiB2b2lkIHtcbiAgICBjb25zdCBiYWNrdXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5jc3MtdG8tdGFpbHdpbmQtYmFja3VwcycpO1xuICAgIFxuICAgIGlmICghZnMuZXhpc3RzU3luYyhiYWNrdXBEaXIpKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gYmFja3VwcyBmb3VuZCB0byByZXN0b3JlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oJ/CflIQgUmVzdG9yaW5nIGZpbGVzIGZyb20gYmFja3VwLi4uJyk7XG4gICAgXG4gICAgLy8gUmVjdXJzaXZlbHkgcmVzdG9yZSBmaWxlc1xuICAgIGNvbnN0IHJlc3RvcmVSZWN1cnNpdmUgPSAoZGlyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKTtcblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgaXRlbSk7XG4gICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aCk7XG5cbiAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIHJlc3RvcmVSZWN1cnNpdmUoZnVsbFBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoYmFja3VwRGlyLCBmdWxsUGF0aCk7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmdWxsUGF0aCwgb3JpZ2luYWxQYXRoKTtcbiAgICAgICAgICAgIGxvZ2dlci5zdWNjZXNzKGBSZXN0b3JlZDogJHtyZWxhdGl2ZVBhdGh9YCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlc3RvcmUgJHtyZWxhdGl2ZVBhdGh9OmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVzdG9yZVJlY3Vyc2l2ZShiYWNrdXBEaXIpO1xuICAgIGxvZ2dlci5zdWNjZXNzKCfinIUgUmVzdG9yZSBjb21wbGV0ZScpO1xuICB9XG59XG4iXX0=
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { scanProject, ScannedFile } from './scanner';
|
|
2
|
+
export { transformFiles, TransformOptions, TransformResults } from './transformer';
|
|
3
|
+
export { TailwindMapper, CSSProperty, ConversionResult } from './tailwindMapper';
|
|
4
|
+
export { JSXParser, JSXTransformation, JSXParseResult } from './jsxParser';
|
|
5
|
+
export { CSSParser, CSSRule, CSSParseResult } from './cssParser';
|
|
6
|
+
export { FileWriter, FileWriteOptions } from './fileWriter';
|
|
7
|
+
export { loadTailwindConfig, TailwindConfig } from './utils/config';
|
|
8
|
+
export { logger } from './utils/logger';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logger = exports.loadTailwindConfig = exports.FileWriter = exports.CSSParser = exports.JSXParser = exports.TailwindMapper = exports.transformFiles = exports.scanProject = void 0;
|
|
4
|
+
// Export public API
|
|
5
|
+
var scanner_1 = require("./scanner");
|
|
6
|
+
Object.defineProperty(exports, "scanProject", { enumerable: true, get: function () { return scanner_1.scanProject; } });
|
|
7
|
+
var transformer_1 = require("./transformer");
|
|
8
|
+
Object.defineProperty(exports, "transformFiles", { enumerable: true, get: function () { return transformer_1.transformFiles; } });
|
|
9
|
+
var tailwindMapper_1 = require("./tailwindMapper");
|
|
10
|
+
Object.defineProperty(exports, "TailwindMapper", { enumerable: true, get: function () { return tailwindMapper_1.TailwindMapper; } });
|
|
11
|
+
var jsxParser_1 = require("./jsxParser");
|
|
12
|
+
Object.defineProperty(exports, "JSXParser", { enumerable: true, get: function () { return jsxParser_1.JSXParser; } });
|
|
13
|
+
var cssParser_1 = require("./cssParser");
|
|
14
|
+
Object.defineProperty(exports, "CSSParser", { enumerable: true, get: function () { return cssParser_1.CSSParser; } });
|
|
15
|
+
var fileWriter_1 = require("./fileWriter");
|
|
16
|
+
Object.defineProperty(exports, "FileWriter", { enumerable: true, get: function () { return fileWriter_1.FileWriter; } });
|
|
17
|
+
var config_1 = require("./utils/config");
|
|
18
|
+
Object.defineProperty(exports, "loadTailwindConfig", { enumerable: true, get: function () { return config_1.loadTailwindConfig; } });
|
|
19
|
+
var logger_1 = require("./utils/logger");
|
|
20
|
+
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0JBQW9CO0FBQ3BCLHFDQUFxRDtBQUE1QyxzR0FBQSxXQUFXLE9BQUE7QUFDcEIsNkNBQW1GO0FBQTFFLDZHQUFBLGNBQWMsT0FBQTtBQUN2QixtREFBaUY7QUFBeEUsZ0hBQUEsY0FBYyxPQUFBO0FBQ3ZCLHlDQUEyRTtBQUFsRSxzR0FBQSxTQUFTLE9BQUE7QUFDbEIseUNBQWlFO0FBQXhELHNHQUFBLFNBQVMsT0FBQTtBQUNsQiwyQ0FBNEQ7QUFBbkQsd0dBQUEsVUFBVSxPQUFBO0FBQ25CLHlDQUFvRTtBQUEzRCw0R0FBQSxrQkFBa0IsT0FBQTtBQUMzQix5Q0FBd0M7QUFBL0IsZ0dBQUEsTUFBTSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gRXhwb3J0IHB1YmxpYyBBUElcbmV4cG9ydCB7IHNjYW5Qcm9qZWN0LCBTY2FubmVkRmlsZSB9IGZyb20gJy4vc2Nhbm5lcic7XG5leHBvcnQgeyB0cmFuc2Zvcm1GaWxlcywgVHJhbnNmb3JtT3B0aW9ucywgVHJhbnNmb3JtUmVzdWx0cyB9IGZyb20gJy4vdHJhbnNmb3JtZXInO1xuZXhwb3J0IHsgVGFpbHdpbmRNYXBwZXIsIENTU1Byb3BlcnR5LCBDb252ZXJzaW9uUmVzdWx0IH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5leHBvcnQgeyBKU1hQYXJzZXIsIEpTWFRyYW5zZm9ybWF0aW9uLCBKU1hQYXJzZVJlc3VsdCB9IGZyb20gJy4vanN4UGFyc2VyJztcbmV4cG9ydCB7IENTU1BhcnNlciwgQ1NTUnVsZSwgQ1NTUGFyc2VSZXN1bHQgfSBmcm9tICcuL2Nzc1BhcnNlcic7XG5leHBvcnQgeyBGaWxlV3JpdGVyLCBGaWxlV3JpdGVPcHRpb25zIH0gZnJvbSAnLi9maWxlV3JpdGVyJztcbmV4cG9ydCB7IGxvYWRUYWlsd2luZENvbmZpZywgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5leHBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TailwindMapper } from './tailwindMapper';
|
|
2
|
+
export interface JSXTransformation {
|
|
3
|
+
original: string;
|
|
4
|
+
converted: string;
|
|
5
|
+
classes: string[];
|
|
6
|
+
warnings: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface JSXParseResult {
|
|
9
|
+
code: string;
|
|
10
|
+
hasChanges: boolean;
|
|
11
|
+
transformations: JSXTransformation[];
|
|
12
|
+
warnings: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare class JSXParser {
|
|
15
|
+
private mapper;
|
|
16
|
+
constructor(mapper: TailwindMapper);
|
|
17
|
+
parse(code: string, filePath: string): JSXParseResult;
|
|
18
|
+
private getElementName;
|
|
19
|
+
private getMemberExpressionName;
|
|
20
|
+
private isStaticStyle;
|
|
21
|
+
private isStaticClassName;
|
|
22
|
+
private extractCSSProperties;
|
|
23
|
+
private extractClassNameValue;
|
|
24
|
+
private mergeClasses;
|
|
25
|
+
private camelToKebab;
|
|
26
|
+
}
|