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,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=
@@ -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
+ }