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,259 @@
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.transformFiles = transformFiles;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const tailwindMapper_1 = require("./tailwindMapper");
10
+ const jsxParser_1 = require("./jsxParser");
11
+ const cssParser_1 = require("./cssParser");
12
+ const fileWriter_1 = require("./fileWriter");
13
+ const logger_1 = require("./utils/logger");
14
+ async function transformFiles(files, options) {
15
+ const results = {
16
+ filesScanned: files.length,
17
+ filesModified: 0,
18
+ stylesConverted: 0,
19
+ classesReplaced: 0,
20
+ warnings: 0
21
+ };
22
+ const mapper = new tailwindMapper_1.TailwindMapper(options.tailwindConfig || {});
23
+ const jsxParser = new jsxParser_1.JSXParser(mapper);
24
+ const cssParser = new cssParser_1.CSSParser(mapper);
25
+ const fileWriter = new fileWriter_1.FileWriter({ dryRun: options.dryRun });
26
+ // PASS 1: Analyze all files WITHOUT modifying anything
27
+ // Collect CSS mappings and gather info about what can be safely converted
28
+ const cssClassMap = {};
29
+ const cssFileResults = new Map();
30
+ logger_1.logger.info('\n🔍 Phase 1: Analyzing files...');
31
+ // Analyze CSS files
32
+ if (!options.skipExternal) {
33
+ for (const file of files.filter(f => f.type === 'css')) {
34
+ try {
35
+ const content = fs_1.default.readFileSync(file.path, 'utf-8');
36
+ const result = await cssParser.parse(content, file.path);
37
+ // Check if ALL rules in this file are FULLY converted (all declarations)
38
+ const totalRules = result.rules.length;
39
+ const fullyConvertedRules = result.rules.filter(r => r.fullyConverted).length;
40
+ const partiallyConvertedRules = result.rules.filter(r => r.partialConversion).length;
41
+ // A file is only "fully convertible" if ALL rules are fully converted (no partial conversions)
42
+ const fullyConvertible = totalRules > 0 && totalRules === fullyConvertedRules && partiallyConvertedRules === 0;
43
+ // Build class map (only for fully converted classes - partial conversions keep the CSS)
44
+ result.rules.forEach(rule => {
45
+ if (rule.fullyConverted) {
46
+ cssClassMap[rule.className] = {
47
+ tailwindClasses: rule.convertedClasses,
48
+ sourceFile: file.path,
49
+ fullyConvertible: true
50
+ };
51
+ results.stylesConverted += rule.declarations.length;
52
+ }
53
+ else if (rule.partialConversion) {
54
+ // For partial conversions, we converted some declarations but keep the CSS rule
55
+ // Count the converted declarations
56
+ results.stylesConverted += rule.convertedClasses.length;
57
+ logger_1.logger.verbose(` Rule .${rule.className}: partial conversion (${rule.convertedClasses.length}/${rule.declarations.length} declarations)`);
58
+ }
59
+ });
60
+ cssFileResults.set(file.path, {
61
+ content,
62
+ newContent: result.css,
63
+ rules: result.rules,
64
+ canDelete: result.canDelete,
65
+ hasChanges: result.hasChanges,
66
+ fullyConvertible
67
+ });
68
+ results.warnings += result.warnings.length;
69
+ // Log analysis
70
+ logger_1.logger.verbose(`Analyzed ${file.path}:`);
71
+ logger_1.logger.verbose(` - Total rules: ${totalRules}`);
72
+ logger_1.logger.verbose(` - Fully converted rules: ${fullyConvertedRules}`);
73
+ logger_1.logger.verbose(` - Partially converted rules: ${partiallyConvertedRules}`);
74
+ logger_1.logger.verbose(` - Fully convertible: ${fullyConvertible}`);
75
+ // Log warnings
76
+ result.warnings.forEach(warning => {
77
+ logger_1.logger.verbose(`⚠️ ${file.path}: ${warning}`);
78
+ });
79
+ }
80
+ catch (error) {
81
+ logger_1.logger.error(`Failed to analyze ${file.path}:`, error);
82
+ results.warnings++;
83
+ }
84
+ }
85
+ }
86
+ // PASS 2: Transform JSX/TSX files
87
+ logger_1.logger.info('\n⚛️ Phase 2: Transforming React components...');
88
+ const jsxFileResults = new Map();
89
+ for (const file of files.filter(f => f.type === 'jsx')) {
90
+ try {
91
+ let content = fs_1.default.readFileSync(file.path, 'utf-8');
92
+ const originalContent = content;
93
+ let hasChanges = false;
94
+ let fileWarnings = [];
95
+ // Process inline styles
96
+ if (!options.skipInline) {
97
+ try {
98
+ const jsxResult = jsxParser.parse(content, file.path);
99
+ if (jsxResult.hasChanges) {
100
+ content = jsxResult.code;
101
+ hasChanges = true;
102
+ results.stylesConverted += jsxResult.transformations.reduce((sum, t) => sum + t.classes.length, 0);
103
+ fileWarnings.push(...jsxResult.warnings);
104
+ }
105
+ }
106
+ catch (error) {
107
+ logger_1.logger.warn(`Failed to parse JSX inline styles in ${file.path}: ${error}`);
108
+ fileWarnings.push(`JSX parse error: ${error}`);
109
+ }
110
+ }
111
+ // Process internal CSS
112
+ if (!options.skipInternal) {
113
+ try {
114
+ const internalResult = await cssParser.parseInternalCSS(content, file.path);
115
+ if (internalResult.hasChanges) {
116
+ content = internalResult.html;
117
+ hasChanges = true;
118
+ // Build class map from internal styles
119
+ internalResult.rules.forEach(rule => {
120
+ if (rule.convertedClasses.length > 0) {
121
+ cssClassMap[rule.className] = {
122
+ tailwindClasses: rule.convertedClasses,
123
+ sourceFile: file.path,
124
+ fullyConvertible: true
125
+ };
126
+ results.stylesConverted += rule.declarations.length;
127
+ }
128
+ });
129
+ fileWarnings.push(...internalResult.warnings);
130
+ }
131
+ }
132
+ catch (error) {
133
+ logger_1.logger.warn(`Failed to parse internal CSS in ${file.path}: ${error}`);
134
+ fileWarnings.push(`Internal CSS parse error: ${error}`);
135
+ }
136
+ }
137
+ jsxFileResults.set(file.path, {
138
+ content: originalContent,
139
+ newContent: content,
140
+ hasChanges
141
+ });
142
+ results.warnings += fileWarnings.length;
143
+ // Log warnings
144
+ fileWarnings.forEach(warning => {
145
+ logger_1.logger.verbose(`⚠️ ${file.path}: ${warning}`);
146
+ });
147
+ }
148
+ catch (error) {
149
+ logger_1.logger.error(`Failed to process ${file.path}:`, error);
150
+ results.warnings++;
151
+ }
152
+ }
153
+ // PASS 3: Replace className references from external CSS
154
+ // This must happen after all JSX files are parsed
155
+ if (Object.keys(cssClassMap).length > 0) {
156
+ logger_1.logger.info('\n🔄 Phase 3: Replacing className references...');
157
+ for (const [filePath, fileResult] of jsxFileResults) {
158
+ let content = fileResult.newContent;
159
+ let hasChanges = fileResult.hasChanges;
160
+ // Replace className references
161
+ const replacementResult = replaceClassNameReferences(content, cssClassMap);
162
+ if (replacementResult.hasChanges) {
163
+ content = replacementResult.code;
164
+ hasChanges = true;
165
+ results.classesReplaced += replacementResult.replacements;
166
+ logger_1.logger.verbose(`Replaced ${replacementResult.replacements} class references in ${path_1.default.basename(filePath)}`);
167
+ }
168
+ // Update the result
169
+ jsxFileResults.set(filePath, {
170
+ ...fileResult,
171
+ newContent: content,
172
+ hasChanges
173
+ });
174
+ }
175
+ }
176
+ // PASS 4: Write all changes
177
+ logger_1.logger.info('\n💾 Phase 4: Writing changes...');
178
+ // Write JSX files
179
+ for (const [filePath, fileResult] of jsxFileResults) {
180
+ if (fileResult.hasChanges) {
181
+ const success = await fileWriter.writeFile(filePath, fileResult.newContent, fileResult.content);
182
+ if (success) {
183
+ results.filesModified++;
184
+ }
185
+ }
186
+ }
187
+ // Write CSS files (SAFETY: Only modify if fully convertible or explicitly allowed)
188
+ if (!options.skipExternal) {
189
+ for (const [filePath, fileResult] of cssFileResults) {
190
+ if (!fileResult.hasChanges)
191
+ continue;
192
+ // SAFETY RULE 1: Never modify CSS files that aren't fully convertible
193
+ // unless they only have unconvertible rules (no changes needed)
194
+ if (!fileResult.fullyConvertible) {
195
+ logger_1.logger.warn(`⏭️ Skipping ${path_1.default.basename(filePath)} - not fully convertible (would break styles)`);
196
+ logger_1.logger.warn(` Convertible: ${fileResult.rules.filter(r => r.convertedClasses.length > 0).length}/${fileResult.rules.length} rules`);
197
+ continue;
198
+ }
199
+ // SAFETY RULE 2: Only delete if ALL rules converted AND --delete-css flag used
200
+ if (fileResult.canDelete && options.deleteCss) {
201
+ const success = await fileWriter.deleteFile(filePath);
202
+ if (success) {
203
+ results.filesModified++;
204
+ logger_1.logger.info(`🗑️ Deleted ${path_1.default.basename(filePath)} (all rules converted)`);
205
+ }
206
+ }
207
+ else if (fileResult.canDelete && !options.deleteCss) {
208
+ // File is empty but don't delete without permission
209
+ logger_1.logger.info(`ℹ️ ${path_1.default.basename(filePath)} is now empty (use --delete-css to remove)`);
210
+ }
211
+ else {
212
+ // Write modified CSS (only if fully convertible)
213
+ const success = await fileWriter.writeFile(filePath, fileResult.newContent, fileResult.content);
214
+ if (success) {
215
+ results.filesModified++;
216
+ }
217
+ }
218
+ }
219
+ }
220
+ return results;
221
+ }
222
+ function replaceClassNameReferences(code, classMap) {
223
+ let hasChanges = false;
224
+ let replacements = 0;
225
+ let modifiedCode = code;
226
+ Object.entries(classMap).forEach(([oldClass, info]) => {
227
+ // Skip if not fully convertible
228
+ if (!info.fullyConvertible) {
229
+ return;
230
+ }
231
+ const tailwindClassString = info.tailwindClasses.join(' ');
232
+ // Pattern 1: className="oldClass" (simple string)
233
+ const pattern1 = new RegExp(`className="${oldClass}"`, 'g');
234
+ if (pattern1.test(modifiedCode)) {
235
+ modifiedCode = modifiedCode.replace(pattern1, `className="${tailwindClassString}"`);
236
+ hasChanges = true;
237
+ replacements++;
238
+ logger_1.logger.verbose(`Replaced className="${oldClass}" with "${tailwindClassString}"`);
239
+ }
240
+ // Pattern 2: className={"oldClass"} (expression with string)
241
+ const pattern2 = new RegExp(`className=\\{"${oldClass}"\\}`, 'g');
242
+ if (pattern2.test(modifiedCode)) {
243
+ modifiedCode = modifiedCode.replace(pattern2, `className="${tailwindClassString}"`);
244
+ hasChanges = true;
245
+ replacements++;
246
+ logger_1.logger.verbose(`Replaced className={"${oldClass}"} with "${tailwindClassString}"`);
247
+ }
248
+ // Pattern 3: className={`oldClass`} (simple template literal)
249
+ const pattern3 = new RegExp(`className=\\{\`\\s*${oldClass}\\s*\`\\}`, 'g');
250
+ if (pattern3.test(modifiedCode)) {
251
+ modifiedCode = modifiedCode.replace(pattern3, `className="${tailwindClassString}"`);
252
+ hasChanges = true;
253
+ replacements++;
254
+ logger_1.logger.verbose(`Replaced className={\`${oldClass}\`} with "${tailwindClassString}"`);
255
+ }
256
+ });
257
+ return { code: modifiedCode, hasChanges, replacements };
258
+ }
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvQ0Esd0NBMFBDO0FBOVJELDRDQUFvQjtBQUNwQixnREFBd0I7QUFFeEIscURBQWtEO0FBQ2xELDJDQUF3QztBQUN4QywyQ0FBaUQ7QUFDakQsNkNBQTBDO0FBRTFDLDJDQUF3QztBQTRCakMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBb0IsRUFDcEIsT0FBeUI7SUFFekIsTUFBTSxPQUFPLEdBQXFCO1FBQ2hDLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTTtRQUMxQixhQUFhLEVBQUUsQ0FBQztRQUNoQixlQUFlLEVBQUUsQ0FBQztRQUNsQixlQUFlLEVBQUUsQ0FBQztRQUNsQixRQUFRLEVBQUUsQ0FBQztLQUNaLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUU5RCx1REFBdUQ7SUFDdkQsMEVBQTBFO0lBQzFFLE1BQU0sV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDcEMsTUFBTSxjQUFjLEdBT2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVmLGVBQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUVoRCxvQkFBb0I7SUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FB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QUFFLENBQUM7WUFDZixlQUFNLENBQUMsT0FBTyxDQUFDLHlCQUF5QixRQUFRLGFBQWEsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU2Nhbm5lZEZpbGUgfSBmcm9tICcuL3NjYW5uZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRNYXBwZXIgfSBmcm9tICcuL3RhaWx3aW5kTWFwcGVyJztcbmltcG9ydCB7IEpTWFBhcnNlciB9IGZyb20gJy4vanN4UGFyc2VyJztcbmltcG9ydCB7IENTU1BhcnNlciwgQ1NTUnVsZSB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmltcG9ydCB7IEZpbGVXcml0ZXIgfSBmcm9tICcuL2ZpbGVXcml0ZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtT3B0aW9ucyB7XG4gIGRyeVJ1bjogYm9vbGVhbjtcbiAgZGVsZXRlQ3NzOiBib29sZWFuO1xuICBza2lwRXh0ZXJuYWw6IGJvb2xlYW47XG4gIHNraXBJbmxpbmU6IGJvb2xlYW47XG4gIHNraXBJbnRlcm5hbDogYm9vbGVhbjtcbiAgdGFpbHdpbmRDb25maWc6IFRhaWx3aW5kQ29uZmlnIHwgbnVsbDtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRzIHtcbiAgZmlsZXNTY2FubmVkOiBudW1iZXI7XG4gIGZpbGVzTW9kaWZpZWQ6IG51bWJlcjtcbiAgc3R5bGVzQ29udmVydGVkOiBudW1iZXI7XG4gIGNsYXNzZXNSZXBsYWNlZDogbnVtYmVyO1xuICB3YXJuaW5nczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ1NTQ2xhc3NNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiB7XG4gICAgdGFpbHdpbmRDbGFzc2VzOiBzdHJpbmdbXTtcbiAgICBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gICAgZnVsbHlDb252ZXJ0aWJsZTogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZpbGVzKFxuICBmaWxlczogU2Nhbm5lZEZpbGVbXSxcbiAgb3B0aW9uczogVHJhbnNmb3JtT3B0aW9uc1xuKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHRzPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRyYW5zZm9ybVJlc3VsdHMgPSB7XG4gICAgZmlsZXNTY2FubmVkOiBmaWxlcy5sZW5ndGgsXG4gICAgZmlsZXNNb2RpZmllZDogMCxcbiAgICBzdHlsZXNDb252ZXJ0ZWQ6IDAsXG4gICAgY2xhc3Nlc1JlcGxhY2VkOiAwLFxuICAgIHdhcm5pbmdzOiAwXG4gIH07XG5cbiAgY29uc3QgbWFwcGVyID0gbmV3IFRhaWx3aW5kTWFwcGVyKG9wdGlvbnMudGFpbHdpbmRDb25maWcgfHwge30pO1xuICBjb25zdCBqc3hQYXJzZXIgPSBuZXcgSlNYUGFyc2VyKG1hcHBlcik7XG4gIGNvbnN0IGNzc1BhcnNlciA9IG5ldyBDU1NQYXJzZXIobWFwcGVyKTtcbiAgY29uc3QgZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHsgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1biB9KTtcblxuICAvLyBQQVNTIDE6IEFuYWx5emUgYWxsIGZpbGVzIFdJVEhPVVQgbW9kaWZ5aW5nIGFueXRoaW5nXG4gIC8vIENvbGxlY3QgQ1NTIG1hcHBpbmdzIGFuZCBnYXRoZXIgaW5mbyBhYm91dCB3aGF0IGNhbiBiZSBzYWZlbHkgY29udmVydGVkXG4gIGNvbnN0IGNzc0NsYXNzTWFwOiBDU1NDbGFzc01hcCA9IHt9O1xuICBjb25zdCBjc3NGaWxlUmVzdWx0czogTWFwPHN0cmluZywge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBuZXdDb250ZW50OiBzdHJpbmc7XG4gICAgcnVsZXM6IENTU1J1bGVbXTtcbiAgICBjYW5EZWxldGU6IGJvb2xlYW47XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgICBmdWxseUNvbnZlcnRpYmxlOiBib29sZWFuO1xuICB9PiA9IG5ldyBNYXAoKTtcblxuICBsb2dnZXIuaW5mbygnXFxu8J+UjSBQaGFzZSAxOiBBbmFseXppbmcgZmlsZXMuLi4nKTtcblxuICAvLyBBbmFseXplIENTUyBmaWxlc1xuICBpZiAoIW9wdGlvbnMuc2tpcEV4dGVybmFsKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzLmZpbHRlcihmID0+IGYudHlwZSA9PT0gJ2NzcycpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNzc1BhcnNlci5wYXJzZShjb250ZW50LCBmaWxlLnBhdGgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIEFMTCBydWxlcyBpbiB0aGlzIGZpbGUgYXJlIEZVTExZIGNvbnZlcnRlZCAoYWxsIGRlY2xhcmF0aW9ucylcbiAgICAgICAgY29uc3QgdG90YWxSdWxlcyA9IHJlc3VsdC5ydWxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZ1bGx5Q29udmVydGVkUnVsZXMgPSByZXN1bHQucnVsZXMuZmlsdGVyKHIgPT4gci5mdWxseUNvbnZlcnRlZCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXJ0aWFsbHlDb252ZXJ0ZWRSdWxlcyA9IHJlc3VsdC5ydWxlcy5maWx0ZXIociA9PiByLnBhcnRpYWxDb252ZXJzaW9uKS5sZW5ndGg7XG4gICAgICAgIC8vIEEgZmlsZSBpcyBvbmx5IFwiZnVsbHkgY29udmVydGlibGVcIiBpZiBBTEwgcnVsZXMgYXJlIGZ1bGx5IGNvbnZlcnRlZCAobm8gcGFydGlhbCBjb252ZXJzaW9ucylcbiAgICAgICAgY29uc3QgZnVsbHlDb252ZXJ0aWJsZSA9IHRvdGFsUnVsZXMgPiAwICYmIHRvdGFsUnVsZXMgPT09IGZ1bGx5Q29udmVydGVkUnVsZXMgJiYgcGFydGlhbGx5Q29udmVydGVkUnVsZXMgPT09IDA7XG5cbiAgICAgICAgLy8gQnVpbGQgY2xhc3MgbWFwIChvbmx5IGZvciBmdWxseSBjb252ZXJ0ZWQgY2xhc3NlcyAtIHBhcnRpYWwgY29udmVyc2lvbnMga2VlcCB0aGUgQ1NTKVxuICAgICAgICByZXN1bHQucnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICBpZiAocnVsZS5mdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgY3NzQ2xhc3NNYXBbcnVsZS5jbGFzc05hbWVdID0ge1xuICAgICAgICAgICAgICB0YWlsd2luZENsYXNzZXM6IHJ1bGUuY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgICAgICAgc291cmNlRmlsZTogZmlsZS5wYXRoLFxuICAgICAgICAgICAgICBmdWxseUNvbnZlcnRpYmxlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0cy5zdHlsZXNDb252ZXJ0ZWQgKz0gcnVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgIH0gZWxzZSBpZiAocnVsZS5wYXJ0aWFsQ29udmVyc2lvbikge1xuICAgICAgICAgICAgLy8gRm9yIHBhcnRpYWwgY29udmVyc2lvbnMsIHdlIGNvbnZlcnRlZCBzb21lIGRlY2xhcmF0aW9ucyBidXQga2VlcCB0aGUgQ1NTIHJ1bGVcbiAgICAgICAgICAgIC8vIENvdW50IHRoZSBjb252ZXJ0ZWQgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgUnVsZSAuJHtydWxlLmNsYXNzTmFtZX06IHBhcnRpYWwgY29udmVyc2lvbiAoJHtydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RofS8ke3J1bGUuZGVjbGFyYXRpb25zLmxlbmd0aH0gZGVjbGFyYXRpb25zKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3NzRmlsZVJlc3VsdHMuc2V0KGZpbGUucGF0aCwge1xuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgbmV3Q29udGVudDogcmVzdWx0LmNzcyxcbiAgICAgICAgICBydWxlczogcmVzdWx0LnJ1bGVzLFxuICAgICAgICAgIGNhbkRlbGV0ZTogcmVzdWx0LmNhbkRlbGV0ZSxcbiAgICAgICAgICBoYXNDaGFuZ2VzOiByZXN1bHQuaGFzQ2hhbmdlcyxcbiAgICAgICAgICBmdWxseUNvbnZlcnRpYmxlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MgKz0gcmVzdWx0Lndhcm5pbmdzLmxlbmd0aDtcblxuICAgICAgICAvLyBMb2cgYW5hbHlzaXNcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYEFuYWx5emVkICR7ZmlsZS5wYXRofTpgKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBUb3RhbCBydWxlczogJHt0b3RhbFJ1bGVzfWApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIEZ1bGx5IGNvbnZlcnRlZCBydWxlczogJHtmdWxseUNvbnZlcnRlZFJ1bGVzfWApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIFBhcnRpYWxseSBjb252ZXJ0ZWQgcnVsZXM6ICR7cGFydGlhbGx5Q29udmVydGVkUnVsZXN9YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIC0gRnVsbHkgY29udmVydGlibGU6ICR7ZnVsbHlDb252ZXJ0aWJsZX1gKTtcblxuICAgICAgICAvLyBMb2cgd2FybmluZ3NcbiAgICAgICAgcmVzdWx0Lndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYOKaoO+4jyAgJHtmaWxlLnBhdGh9OiAke3dhcm5pbmd9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhbmFseXplICR7ZmlsZS5wYXRofTpgLCBlcnJvcik7XG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQQVNTIDI6IFRyYW5zZm9ybSBKU1gvVFNYIGZpbGVzXG4gIGxvZ2dlci5pbmZvKCdcXG7impvvuI8gIFBoYXNlIDI6IFRyYW5zZm9ybWluZyBSZWFjdCBjb21wb25lbnRzLi4uJyk7XG5cbiAgY29uc3QganN4RmlsZVJlc3VsdHM6IE1hcDxzdHJpbmcsIHtcbiAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgbmV3Q29udGVudDogc3RyaW5nO1xuICAgIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcy5maWx0ZXIoZiA9PiBmLnR5cGUgPT09ICdqc3gnKSkge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLnBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gY29udGVudDtcbiAgICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gICAgICBsZXQgZmlsZVdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAvLyBQcm9jZXNzIGlubGluZSBzdHlsZXNcbiAgICAgIGlmICghb3B0aW9ucy5za2lwSW5saW5lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganN4UmVzdWx0ID0ganN4UGFyc2VyLnBhcnNlKGNvbnRlbnQsIGZpbGUucGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGpzeFJlc3VsdC5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICBjb250ZW50ID0ganN4UmVzdWx0LmNvZGU7XG4gICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3VsdHMuc3R5bGVzQ29udmVydGVkICs9IGpzeFJlc3VsdC50cmFuc2Zvcm1hdGlvbnMucmVkdWNlKFxuICAgICAgICAgICAgICAoc3VtLCB0KSA9PiBzdW0gKyB0LmNsYXNzZXMubGVuZ3RoLCAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmlsZVdhcm5pbmdzLnB1c2goLi4uanN4UmVzdWx0Lndhcm5pbmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBKU1ggaW5saW5lIHN0eWxlcyBpbiAke2ZpbGUucGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgZmlsZVdhcm5pbmdzLnB1c2goYEpTWCBwYXJzZSBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIGludGVybmFsIENTU1xuICAgICAgaWYgKCFvcHRpb25zLnNraXBJbnRlcm5hbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGludGVybmFsUmVzdWx0ID0gYXdhaXQgY3NzUGFyc2VyLnBhcnNlSW50ZXJuYWxDU1MoY29udGVudCwgZmlsZS5wYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaW50ZXJuYWxSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICAgICAgY29udGVudCA9IGludGVybmFsUmVzdWx0Lmh0bWw7XG4gICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQnVpbGQgY2xhc3MgbWFwIGZyb20gaW50ZXJuYWwgc3R5bGVzXG4gICAgICAgICAgICBpbnRlcm5hbFJlc3VsdC5ydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICBpZiAocnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICB0YWlsd2luZENsYXNzZXM6IHJ1bGUuY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGU6IGZpbGUucGF0aCxcbiAgICAgICAgICAgICAgICAgIGZ1bGx5Q29udmVydGlibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlc3VsdHMuc3R5bGVzQ29udmVydGVkICs9IHJ1bGUuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZpbGVXYXJuaW5ncy5wdXNoKC4uLmludGVybmFsUmVzdWx0Lndhcm5pbmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBDU1MgaW4gJHtmaWxlLnBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgICAgIGZpbGVXYXJuaW5ncy5wdXNoKGBJbnRlcm5hbCBDU1MgcGFyc2UgZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGUucGF0aCwge1xuICAgICAgICBjb250ZW50OiBvcmlnaW5hbENvbnRlbnQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHRzLndhcm5pbmdzICs9IGZpbGVXYXJuaW5ncy5sZW5ndGg7XG5cbiAgICAgIC8vIExvZyB3YXJuaW5nc1xuICAgICAgZmlsZVdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGDimqDvuI8gICR7ZmlsZS5wYXRofTogJHt3YXJuaW5nfWApO1xuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyAke2ZpbGUucGF0aH06YCwgZXJyb3IpO1xuICAgICAgcmVzdWx0cy53YXJuaW5ncysrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBBU1MgMzogUmVwbGFjZSBjbGFzc05hbWUgcmVmZXJlbmNlcyBmcm9tIGV4dGVybmFsIENTU1xuICAvLyBUaGlzIG11c3QgaGFwcGVuIGFmdGVyIGFsbCBKU1ggZmlsZXMgYXJlIHBhcnNlZFxuICBpZiAoT2JqZWN0LmtleXMoY3NzQ2xhc3NNYXApLmxlbmd0aCA+IDApIHtcbiAgICBsb2dnZXIuaW5mbygnXFxu8J+UhCBQaGFzZSAzOiBSZXBsYWNpbmcgY2xhc3NOYW1lIHJlZmVyZW5jZXMuLi4nKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBqc3hGaWxlUmVzdWx0cykge1xuICAgICAgbGV0IGNvbnRlbnQgPSBmaWxlUmVzdWx0Lm5ld0NvbnRlbnQ7XG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZpbGVSZXN1bHQuaGFzQ2hhbmdlcztcblxuICAgICAgLy8gUmVwbGFjZSBjbGFzc05hbWUgcmVmZXJlbmNlc1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnRSZXN1bHQgPSByZXBsYWNlQ2xhc3NOYW1lUmVmZXJlbmNlcyhjb250ZW50LCBjc3NDbGFzc01hcCk7XG4gICAgICBpZiAocmVwbGFjZW1lbnRSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICBjb250ZW50ID0gcmVwbGFjZW1lbnRSZXN1bHQuY29kZTtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHJlc3VsdHMuY2xhc3Nlc1JlcGxhY2VkICs9IHJlcGxhY2VtZW50UmVzdWx0LnJlcGxhY2VtZW50cztcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCAke3JlcGxhY2VtZW50UmVzdWx0LnJlcGxhY2VtZW50c30gY2xhc3MgcmVmZXJlbmNlcyBpbiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHJlc3VsdFxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGVQYXRoLCB7XG4gICAgICAgIC4uLmZpbGVSZXN1bHQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBBU1MgNDogV3JpdGUgYWxsIGNoYW5nZXNcbiAgbG9nZ2VyLmluZm8oJ1xcbvCfkr4gUGhhc2UgNDogV3JpdGluZyBjaGFuZ2VzLi4uJyk7XG5cbiAgLy8gV3JpdGUgSlNYIGZpbGVzXG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBqc3hGaWxlUmVzdWx0cykge1xuICAgIGlmIChmaWxlUmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaWxlV3JpdGVyLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZVJlc3VsdC5uZXdDb250ZW50LCBmaWxlUmVzdWx0LmNvbnRlbnQpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gV3JpdGUgQ1NTIGZpbGVzIChTQUZFVFk6IE9ubHkgbW9kaWZ5IGlmIGZ1bGx5IGNvbnZlcnRpYmxlIG9yIGV4cGxpY2l0bHkgYWxsb3dlZClcbiAgaWYgKCFvcHRpb25zLnNraXBFeHRlcm5hbCkge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBjc3NGaWxlUmVzdWx0cykge1xuICAgICAgaWYgKCFmaWxlUmVzdWx0Lmhhc0NoYW5nZXMpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBTQUZFVFkgUlVMRSAxOiBOZXZlciBtb2RpZnkgQ1NTIGZpbGVzIHRoYXQgYXJlbid0IGZ1bGx5IGNvbnZlcnRpYmxlXG4gICAgICAvLyB1bmxlc3MgdGhleSBvbmx5IGhhdmUgdW5jb252ZXJ0aWJsZSBydWxlcyAobm8gY2hhbmdlcyBuZWVkZWQpXG4gICAgICBpZiAoIWZpbGVSZXN1bHQuZnVsbHlDb252ZXJ0aWJsZSkge1xuICAgICAgICBsb2dnZXIud2Fybihg4o+t77iPICBTa2lwcGluZyAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfSAtIG5vdCBmdWxseSBjb252ZXJ0aWJsZSAod291bGQgYnJlYWsgc3R5bGVzKWApO1xuICAgICAgICBsb2dnZXIud2FybihgICAgQ29udmVydGlibGU6ICR7ZmlsZVJlc3VsdC5ydWxlcy5maWx0ZXIociA9PiByLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkubGVuZ3RofS8ke2ZpbGVSZXN1bHQucnVsZXMubGVuZ3RofSBydWxlc2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU0FGRVRZIFJVTEUgMjogT25seSBkZWxldGUgaWYgQUxMIHJ1bGVzIGNvbnZlcnRlZCBBTkQgLS1kZWxldGUtY3NzIGZsYWcgdXNlZFxuICAgICAgaWYgKGZpbGVSZXN1bHQuY2FuRGVsZXRlICYmIG9wdGlvbnMuZGVsZXRlQ3NzKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaWxlV3JpdGVyLmRlbGV0ZUZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3VsdHMuZmlsZXNNb2RpZmllZCsrO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGDwn5eR77iPICBEZWxldGVkICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9IChhbGwgcnVsZXMgY29udmVydGVkKWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpbGVSZXN1bHQuY2FuRGVsZXRlICYmICFvcHRpb25zLmRlbGV0ZUNzcykge1xuICAgICAgICAvLyBGaWxlIGlzIGVtcHR5IGJ1dCBkb24ndCBkZWxldGUgd2l0aG91dCBwZXJtaXNzaW9uXG4gICAgICAgIGxvZ2dlci5pbmZvKGDihLnvuI8gICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9IGlzIG5vdyBlbXB0eSAodXNlIC0tZGVsZXRlLWNzcyB0byByZW1vdmUpYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXcml0ZSBtb2RpZmllZCBDU1MgKG9ubHkgaWYgZnVsbHkgY29udmVydGlibGUpXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaWxlV3JpdGVyLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZVJlc3VsdC5uZXdDb250ZW50LCBmaWxlUmVzdWx0LmNvbnRlbnQpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3VsdHMuZmlsZXNNb2RpZmllZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDbGFzc05hbWVSZWZlcmVuY2VzKFxuICBjb2RlOiBzdHJpbmcsIFxuICBjbGFzc01hcDogQ1NTQ2xhc3NNYXBcbik6IHsgXG4gIGNvZGU6IHN0cmluZzsgXG4gIGhhc0NoYW5nZXM6IGJvb2xlYW47IFxuICByZXBsYWNlbWVudHM6IG51bWJlciBcbn0ge1xuICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICBsZXQgcmVwbGFjZW1lbnRzID0gMDtcbiAgbGV0IG1vZGlmaWVkQ29kZSA9IGNvZGU7XG5cbiAgT2JqZWN0LmVudHJpZXMoY2xhc3NNYXApLmZvckVhY2goKFtvbGRDbGFzcywgaW5mb10pID0+IHtcbiAgICAvLyBTa2lwIGlmIG5vdCBmdWxseSBjb252ZXJ0aWJsZVxuICAgIGlmICghaW5mby5mdWxseUNvbnZlcnRpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFpbHdpbmRDbGFzc1N0cmluZyA9IGluZm8udGFpbHdpbmRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICBcbiAgICAvLyBQYXR0ZXJuIDE6IGNsYXNzTmFtZT1cIm9sZENsYXNzXCIgKHNpbXBsZSBzdHJpbmcpXG4gICAgY29uc3QgcGF0dGVybjEgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiYCwgJ2cnKTtcbiAgICBpZiAocGF0dGVybjEudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMSwgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiIHdpdGggXCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICB9XG5cbiAgICAvLyBQYXR0ZXJuIDI6IGNsYXNzTmFtZT17XCJvbGRDbGFzc1wifSAoZXhwcmVzc2lvbiB3aXRoIHN0cmluZylcbiAgICBjb25zdCBwYXR0ZXJuMiA9IG5ldyBSZWdFeHAoYGNsYXNzTmFtZT1cXFxce1wiJHtvbGRDbGFzc31cIlxcXFx9YCwgJ2cnKTtcbiAgICBpZiAocGF0dGVybjIudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMiwgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9e1wiJHtvbGRDbGFzc31cIn0gd2l0aCBcIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgIH1cblxuICAgIC8vIFBhdHRlcm4gMzogY2xhc3NOYW1lPXtgb2xkQ2xhc3NgfSAoc2ltcGxlIHRlbXBsYXRlIGxpdGVyYWwpXG4gICAgY29uc3QgcGF0dGVybjMgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XFxcXHtcXGBcXFxccyoke29sZENsYXNzfVxcXFxzKlxcYFxcXFx9YCwgJ2cnKTtcbiAgICBpZiAocGF0dGVybjMudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMywgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9e1xcYCR7b2xkQ2xhc3N9XFxgfSB3aXRoIFwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4geyBjb2RlOiBtb2RpZmllZENvZGUsIGhhc0NoYW5nZXMsIHJlcGxhY2VtZW50cyB9O1xufVxuIl19
@@ -0,0 +1,14 @@
1
+ export interface TailwindConfig {
2
+ theme?: {
3
+ extend?: Record<string, any>;
4
+ spacing?: Record<string, string>;
5
+ colors?: Record<string, any>;
6
+ fontSize?: Record<string, any>;
7
+ fontWeight?: Record<string, string>;
8
+ borderRadius?: Record<string, string>;
9
+ [key: string]: any;
10
+ };
11
+ content?: string[];
12
+ [key: string]: any;
13
+ }
14
+ export declare function loadTailwindConfig(projectRoot: string): Promise<TailwindConfig | null>;
@@ -0,0 +1,139 @@
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.loadTailwindConfig = loadTailwindConfig;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const resolve_1 = __importDefault(require("resolve"));
10
+ async function loadTailwindConfig(projectRoot) {
11
+ const configPaths = [
12
+ 'tailwind.config.js',
13
+ 'tailwind.config.ts',
14
+ 'tailwind.config.mjs',
15
+ 'tailwind.config.cjs'
16
+ ];
17
+ for (const configPath of configPaths) {
18
+ const fullPath = path_1.default.join(projectRoot, configPath);
19
+ if (fs_1.default.existsSync(fullPath)) {
20
+ try {
21
+ // Clear require cache for hot reloading
22
+ delete require.cache[require.resolve(fullPath)];
23
+ // Load the config
24
+ let config;
25
+ if (configPath.endsWith('.ts')) {
26
+ // For TypeScript configs, we need to use a dynamic import
27
+ // But for CLI usage, we'll use a simpler approach
28
+ // Try to resolve tailwindcss and use its config resolution
29
+ const tailwindcssPath = resolve_1.default.sync('tailwindcss', { basedir: projectRoot });
30
+ const tailwindcss = require(tailwindcssPath);
31
+ if (tailwindcss.resolveConfig) {
32
+ const userConfig = require(fullPath);
33
+ config = tailwindcss.resolveConfig(userConfig.default || userConfig);
34
+ }
35
+ else {
36
+ config = require(fullPath);
37
+ }
38
+ }
39
+ else {
40
+ const userConfig = require(fullPath);
41
+ config = userConfig.default || userConfig;
42
+ }
43
+ return config;
44
+ }
45
+ catch (error) {
46
+ console.warn(`Failed to load Tailwind config at ${fullPath}:`, error);
47
+ continue;
48
+ }
49
+ }
50
+ }
51
+ // Return default Tailwind-like config
52
+ return {
53
+ theme: {
54
+ spacing: {
55
+ '0': '0px',
56
+ '1': '0.25rem',
57
+ '2': '0.5rem',
58
+ '3': '0.75rem',
59
+ '4': '1rem',
60
+ '5': '1.25rem',
61
+ '6': '1.5rem',
62
+ '8': '2rem',
63
+ '10': '2.5rem',
64
+ '12': '3rem',
65
+ '16': '4rem',
66
+ '20': '5rem',
67
+ '24': '6rem',
68
+ '32': '8rem',
69
+ '40': '10rem',
70
+ '48': '12rem',
71
+ '56': '14rem',
72
+ '64': '16rem'
73
+ },
74
+ colors: {
75
+ transparent: 'transparent',
76
+ current: 'currentColor',
77
+ black: '#000000',
78
+ white: '#ffffff',
79
+ gray: {
80
+ 50: '#f9fafb',
81
+ 100: '#f3f4f6',
82
+ 200: '#e5e7eb',
83
+ 300: '#d1d5db',
84
+ 400: '#9ca3af',
85
+ 500: '#6b7280',
86
+ 600: '#4b5563',
87
+ 700: '#374151',
88
+ 800: '#1f2937',
89
+ 900: '#111827'
90
+ },
91
+ red: {
92
+ 500: '#ef4444',
93
+ 600: '#dc2626'
94
+ },
95
+ blue: {
96
+ 500: '#3b82f6',
97
+ 600: '#2563eb'
98
+ },
99
+ green: {
100
+ 500: '#22c55e',
101
+ 600: '#16a34a'
102
+ }
103
+ },
104
+ fontSize: {
105
+ 'xs': ['0.75rem', { lineHeight: '1rem' }],
106
+ 'sm': ['0.875rem', { lineHeight: '1.25rem' }],
107
+ 'base': ['1rem', { lineHeight: '1.5rem' }],
108
+ 'lg': ['1.125rem', { lineHeight: '1.75rem' }],
109
+ 'xl': ['1.25rem', { lineHeight: '1.75rem' }],
110
+ '2xl': ['1.5rem', { lineHeight: '2rem' }],
111
+ '3xl': ['1.875rem', { lineHeight: '2.25rem' }],
112
+ '4xl': ['2.25rem', { lineHeight: '2.5rem' }]
113
+ },
114
+ fontWeight: {
115
+ thin: '100',
116
+ extralight: '200',
117
+ light: '300',
118
+ normal: '400',
119
+ medium: '500',
120
+ semibold: '600',
121
+ bold: '700',
122
+ extrabold: '800',
123
+ black: '900'
124
+ },
125
+ borderRadius: {
126
+ 'none': '0px',
127
+ 'sm': '0.125rem',
128
+ 'DEFAULT': '0.25rem',
129
+ 'md': '0.375rem',
130
+ 'lg': '0.5rem',
131
+ 'xl': '0.75rem',
132
+ '2xl': '1rem',
133
+ '3xl': '1.5rem',
134
+ 'full': '9999px'
135
+ }
136
+ }
137
+ };
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWtCQSxnREFvSUM7QUF0SkQsZ0RBQXdCO0FBQ3hCLDRDQUFvQjtBQUNwQixzREFBOEI7QUFnQnZCLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxXQUFtQjtJQUMxRCxNQUFNLFdBQVcsR0FBRztRQUNsQixvQkFBb0I7UUFDcEIsb0JBQW9CO1FBQ3BCLHFCQUFxQjtRQUNyQixxQkFBcUI7S0FDdEIsQ0FBQztJQUVGLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFcEQsSUFBSSxZQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDO2dCQUNILHdDQUF3QztnQkFDeEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFFaEQsa0JBQWtCO2dCQUNsQixJQUFJLE1BQXNCLENBQUM7Z0JBRTNCLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQiwwREFBMEQ7b0JBQzFELGtEQUFrRDtvQkFDbEQsMkRBQTJEO29CQUMzRCxNQUFNLGVBQWUsR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDOUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUU3QyxJQUFJLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDOUIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNy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QUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzthQUM3QztZQUNELFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsS0FBSztnQkFDWCxVQUFVLEVBQUUsS0FBSztnQkFDakIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLEtBQUssRUFBRSxLQUFLO2FBQ2I7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAncmVzb2x2ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFpbHdpbmRDb25maWcge1xuICB0aGVtZT86IHtcbiAgICBleHRlbmQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHNwYWNpbmc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGNvbG9ycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgZm9udFNpemU/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGZvbnRXZWlnaHQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGJvcmRlclJhZGl1cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xuICBjb250ZW50Pzogc3RyaW5nW107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRUYWlsd2luZENvbmZpZyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxUYWlsd2luZENvbmZpZyB8IG51bGw+IHtcbiAgY29uc3QgY29uZmlnUGF0aHMgPSBbXG4gICAgJ3RhaWx3aW5kLmNvbmZpZy5qcycsXG4gICAgJ3RhaWx3aW5kLmNvbmZpZy50cycsXG4gICAgJ3RhaWx3aW5kLmNvbmZpZy5tanMnLFxuICAgICd0YWlsd2luZC5jb25maWcuY2pzJ1xuICBdO1xuXG4gIGZvciAoY29uc3QgY29uZmlnUGF0aCBvZiBjb25maWdQYXRocykge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHByb2plY3RSb290LCBjb25maWdQYXRoKTtcbiAgICBcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENsZWFyIHJlcXVpcmUgY2FjaGUgZm9yIGhvdCByZWxvYWRpbmdcbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKGZ1bGxQYXRoKV07XG4gICAgICAgIFxuICAgICAgICAvLyBMb2FkIHRoZSBjb25maWdcbiAgICAgICAgbGV0IGNvbmZpZzogVGFpbHdpbmRDb25maWc7XG4gICAgICAgIFxuICAgICAgICBpZiAoY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgICAgICAvLyBGb3IgVHlwZVNjcmlwdCBjb25maWdzLCB3ZSBuZWVkIHRvIHVzZSBhIGR5bmFtaWMgaW1wb3J0XG4gICAgICAgICAgLy8gQnV0IGZvciBDTEkgdXNhZ2UsIHdlJ2xsIHVzZSBhIHNpbXBsZXIgYXBwcm9hY2hcbiAgICAgICAgICAvLyBUcnkgdG8gcmVzb2x2ZSB0YWlsd2luZGNzcyBhbmQgdXNlIGl0cyBjb25maWcgcmVzb2x1dGlvblxuICAgICAgICAgIGNvbnN0IHRhaWx3aW5kY3NzUGF0aCA9IHJlc29sdmUuc3luYygndGFpbHdpbmRjc3MnLCB7IGJhc2VkaXI6IHByb2plY3RSb290IH0pO1xuICAgICAgICAgIGNvbnN0IHRhaWx3aW5kY3NzID0gcmVxdWlyZSh0YWlsd2luZGNzc1BhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0YWlsd2luZGNzcy5yZXNvbHZlQ29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyQ29uZmlnID0gcmVxdWlyZShmdWxsUGF0aCk7XG4gICAgICAgICAgICBjb25maWcgPSB0YWlsd2luZGNzcy5yZXNvbHZlQ29uZmlnKHVzZXJDb25maWcuZGVmYXVsdCB8fCB1c2VyQ29uZmlnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnID0gcmVxdWlyZShmdWxsUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHVzZXJDb25maWcgPSByZXF1aXJlKGZ1bGxQYXRoKTtcbiAgICAgICAgICBjb25maWcgPSB1c2VyQ29uZmlnLmRlZmF1bHQgfHwgdXNlckNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBsb2FkIFRhaWx3aW5kIGNvbmZpZyBhdCAke2Z1bGxQYXRofTpgLCBlcnJvcik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybiBkZWZhdWx0IFRhaWx3aW5kLWxpa2UgY29uZmlnXG4gIHJldHVybiB7XG4gICAgdGhlbWU6IHtcbiAgICAgIHNwYWNpbmc6IHtcbiAgICAgICAgJzAnOiAnMHB4JyxcbiAgICAgICAgJzEnOiAnMC4yNXJlbScsXG4gICAgICAgICcyJzogJzAuNXJlbScsXG4gICAgICAgICczJzogJzAuNzVyZW0nLFxuICAgICAgICAnNCc6ICcxcmVtJyxcbiAgICAgICAgJzUnOiAnMS4yNXJlbScsXG4gICAgICAgICc2JzogJzEuNXJlbScsXG4gICAgICAgICc4JzogJzJyZW0nLFxuICAgICAgICAnMTAnOiAnMi41cmVtJyxcbiAgICAgICAgJzEyJzogJzNyZW0nLFxuICAgICAgICAnMTYnOiAnNHJlbScsXG4gICAgICAgICcyMCc6ICc1cmVtJyxcbiAgICAgICAgJzI0JzogJzZyZW0nLFxuICAgICAgICAnMzInOiAnOHJlbScsXG4gICAgICAgICc0MCc6ICcxMHJlbScsXG4gICAgICAgICc0OCc6ICcxMnJlbScsXG4gICAgICAgICc1Nic6ICcxNHJlbScsXG4gICAgICAgICc2NCc6ICcxNnJlbSdcbiAgICAgIH0sXG4gICAgICBjb2xvcnM6IHtcbiAgICAgICAgdHJhbnNwYXJlbnQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGN1cnJlbnQ6ICdjdXJyZW50Q29sb3InLFxuICAgICAgICBibGFjazogJyMwMDAwMDAnLFxuICAgICAgICB3aGl0ZTogJyNmZmZmZmYnLFxuICAgICAgICBncmF5OiB7XG4gICAgICAgICAgNTA6ICcjZjlmYWZiJyxcbiAgICAgICAgICAxMDA6ICcjZjNmNGY2JyxcbiAgICAgICAgICAyMDA6ICcjZTVlN2ViJyxcbiAgICAgICAgICAzMDA6ICcjZDFkNWRiJyxcbiAgICAgICAgICA0MDA6ICcjOWNhM2FmJyxcbiAgICAgICAgICA1MDA6ICcjNmI3MjgwJyxcbiAgICAgICAgICA2MDA6ICcjNGI1NTYzJyxcbiAgICAgICAgICA3MDA6ICcjMzc0MTUxJyxcbiAgICAgICAgICA4MDA6ICcjMWYyOTM3JyxcbiAgICAgICAgICA5MDA6ICcjMTExODI3J1xuICAgICAgICB9LFxuICAgICAgICByZWQ6IHtcbiAgICAgICAgICA1MDA6ICcjZWY0NDQ0JyxcbiAgICAgICAgICA2MDA6ICcjZGMyNjI2J1xuICAgICAgICB9LFxuICAgICAgICBibHVlOiB7XG4gICAgICAgICAgNTAwOiAnIzNiODJmNicsXG4gICAgICAgICAgNjAwOiAnIzI1NjNlYidcbiAgICAgICAgfSxcbiAgICAgICAgZ3JlZW46IHtcbiAgICAgICAgICA1MDA6ICcjMjJjNTVlJyxcbiAgICAgICAgICA2MDA6ICcjMTZhMzRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZm9udFNpemU6IHtcbiAgICAgICAgJ3hzJzogWycwLjc1cmVtJywgeyBsaW5lSGVpZ2h0OiAnMXJlbScgfV0sXG4gICAgICAgICdzbSc6IFsnMC44NzVyZW0nLCB7IGxpbmVIZWlnaHQ6ICcxLjI1cmVtJyB9XSxcbiAgICAgICAgJ2Jhc2UnOiBbJzFyZW0nLCB7IGxpbmVIZWlnaHQ6ICcxLjVyZW0nIH1dLFxuICAgICAgICAnbGcnOiBbJzEuMTI1cmVtJywgeyBsaW5lSGVpZ2h0OiAnMS43NXJlbScgfV0sXG4gICAgICAgICd4bCc6IFsnMS4yNXJlbScsIHsgbGluZUhlaWdodDogJzEuNzVyZW0nIH1dLFxuICAgICAgICAnMnhsJzogWycxLjVyZW0nLCB7IGxpbmVIZWlnaHQ6ICcycmVtJyB9XSxcbiAgICAgICAgJzN4bCc6IFsnMS44NzVyZW0nLCB7IGxpbmVIZWlnaHQ6ICcyLjI1cmVtJyB9XSxcbiAgICAgICAgJzR4bCc6IFsnMi4yNXJlbScsIHsgbGluZUhlaWdodDogJzIuNXJlbScgfV1cbiAgICAgIH0sXG4gICAgICBmb250V2VpZ2h0OiB7XG4gICAgICAgIHRoaW46ICcxMDAnLFxuICAgICAgICBleHRyYWxpZ2h0OiAnMjAwJyxcbiAgICAgICAgbGlnaHQ6ICczMDAnLFxuICAgICAgICBub3JtYWw6ICc0MDAnLFxuICAgICAgICBtZWRpdW06ICc1MDAnLFxuICAgICAgICBzZW1pYm9sZDogJzYwMCcsXG4gICAgICAgIGJvbGQ6ICc3MDAnLFxuICAgICAgICBleHRyYWJvbGQ6ICc4MDAnLFxuICAgICAgICBibGFjazogJzkwMCdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6IHtcbiAgICAgICAgJ25vbmUnOiAnMHB4JyxcbiAgICAgICAgJ3NtJzogJzAuMTI1cmVtJyxcbiAgICAgICAgJ0RFRkFVTFQnOiAnMC4yNXJlbScsXG4gICAgICAgICdtZCc6ICcwLjM3NXJlbScsXG4gICAgICAgICdsZyc6ICcwLjVyZW0nLFxuICAgICAgICAneGwnOiAnMC43NXJlbScsXG4gICAgICAgICcyeGwnOiAnMXJlbScsXG4gICAgICAgICczeGwnOiAnMS41cmVtJyxcbiAgICAgICAgJ2Z1bGwnOiAnOTk5OXB4J1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ declare class Logger {
2
+ private isVerbose;
3
+ setVerbose(verbose: boolean): void;
4
+ info(message: string, ...args: any[]): void;
5
+ success(message: string, ...args: any[]): void;
6
+ warn(message: string, ...args: any[]): void;
7
+ error(message: string, error?: any): void;
8
+ verbose(message: string, ...args: any[]): void;
9
+ debug(message: string, ...args: any[]): void;
10
+ file(message: string, filePath: string): void;
11
+ diff(original: string, converted: string): void;
12
+ }
13
+ export declare const logger: Logger;
14
+ export {};
@@ -0,0 +1,56 @@
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.logger = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ class Logger {
9
+ constructor() {
10
+ this.isVerbose = false;
11
+ }
12
+ setVerbose(verbose) {
13
+ this.isVerbose = verbose;
14
+ }
15
+ info(message, ...args) {
16
+ console.log(chalk_1.default.blue(message), ...args);
17
+ }
18
+ success(message, ...args) {
19
+ console.log(chalk_1.default.green(message), ...args);
20
+ }
21
+ warn(message, ...args) {
22
+ console.log(chalk_1.default.yellow(`⚠️ ${message}`), ...args);
23
+ }
24
+ error(message, error) {
25
+ console.error(chalk_1.default.red(`❌ ${message}`));
26
+ if (error && this.isVerbose) {
27
+ if (error instanceof Error) {
28
+ console.error(chalk_1.default.red(error.stack || error.message));
29
+ }
30
+ else {
31
+ console.error(chalk_1.default.red(error));
32
+ }
33
+ }
34
+ }
35
+ verbose(message, ...args) {
36
+ if (this.isVerbose) {
37
+ console.log(chalk_1.default.gray(`[verbose] ${message}`), ...args);
38
+ }
39
+ }
40
+ debug(message, ...args) {
41
+ if (this.isVerbose) {
42
+ console.log(chalk_1.default.cyan(`[debug] ${message}`), ...args);
43
+ }
44
+ }
45
+ file(message, filePath) {
46
+ console.log(chalk_1.default.magenta(`${message}:`), chalk_1.default.white(filePath));
47
+ }
48
+ diff(original, converted) {
49
+ if (this.isVerbose) {
50
+ console.log(chalk_1.default.red(' -'), original);
51
+ console.log(chalk_1.default.green(' +'), converted);
52
+ }
53
+ }
54
+ }
55
+ exports.logger = new Logger();
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxrREFBMEI7QUFFMUIsTUFBTSxNQUFNO0lBQVo7UUFDVSxjQUFTLEdBQVksS0FBSyxDQUFDO0lBbURyQyxDQUFDO0lBakRDLFVBQVUsQ0FBQyxPQUFnQjtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQVc7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFXO1FBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBVztRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsS0FBVztRQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO2dCQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQVc7UUFDckMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQVc7UUFDbkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxRQUFnQjtRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLGVBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQWdCLEVBQUUsU0FBaUI7UUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRVksUUFBQSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIHByaXZhdGUgaXNWZXJib3NlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2V0VmVyYm9zZSh2ZXJib3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZlcmJvc2UgPSB2ZXJib3NlO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShtZXNzYWdlKSwgLi4uYXJncyk7XG4gIH1cblxuICBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihtZXNzYWdlKSwgLi4uYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoO+4jyAgJHttZXNzYWdlfWApLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg4p2MICR7bWVzc2FnZX1gKSk7XG4gICAgaWYgKGVycm9yICYmIHRoaXMuaXNWZXJib3NlKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvci5zdGFjayB8fCBlcnJvci5tZXNzYWdlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChlcnJvcikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZlcmJvc2UobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgW3ZlcmJvc2VdICR7bWVzc2FnZX1gKSwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW2RlYnVnXSAke21lc3NhZ2V9YCksIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGZpbGUobWVzc2FnZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHttZXNzYWdlfTpgKSwgY2hhbGsud2hpdGUoZmlsZVBhdGgpKTtcbiAgfVxuXG4gIGRpZmYob3JpZ2luYWw6IHN0cmluZywgY29udmVydGVkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnICAtJyksIG9yaWdpbmFsKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCcgICsnKSwgY29udmVydGVkKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "css-to-tailwind-react",
3
+ "version": "0.1.0",
4
+ "description": "Convert traditional CSS (inline, internal, and external) into Tailwind CSS utility classes for React-based frameworks",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "bin": {
16
+ "css-to-tailwind-react": "./bin/index.js"
17
+ },
18
+ "files": [
19
+ "dist/**/*",
20
+ "bin/**/*",
21
+ "README.md"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc && tsc-alias",
25
+ "build:watch": "tsc --watch",
26
+ "clean": "rm -rf dist",
27
+ "prepublishOnly": "npm run clean && npm run build",
28
+ "test": "echo \"No tests yet\" && exit 0",
29
+ "lint": "tsc --noEmit"
30
+ },
31
+ "keywords": [
32
+ "tailwindcss",
33
+ "css",
34
+ "react",
35
+ "jsx",
36
+ "tsx",
37
+ "converter",
38
+ "utility-classes",
39
+ "ast",
40
+ "babel",
41
+ "postcss"
42
+ ],
43
+ "author": "Rudra Patel",
44
+ "license": "MIT",
45
+ "engines": {
46
+ "node": ">=16.0.0"
47
+ },
48
+ "dependencies": {
49
+ "@babel/generator": "^7.23.6",
50
+ "@babel/parser": "^7.23.6",
51
+ "@babel/traverse": "^7.23.7",
52
+ "@babel/types": "^7.23.6",
53
+ "chalk": "^4.1.2",
54
+ "commander": "^11.1.0",
55
+ "fast-glob": "^3.3.2",
56
+ "postcss": "^8.4.32",
57
+ "postcss-safe-parser": "^6.0.0",
58
+ "resolve": "^1.22.8",
59
+ "tailwindcss": ">=3.0.0"
60
+ },
61
+ "devDependencies": {
62
+ "@types/babel__generator": "^7.6.8",
63
+ "@types/babel__traverse": "^7.20.5",
64
+ "@types/node": "^20.10.6",
65
+ "@types/postcss-safe-parser": "^5.0.4",
66
+ "@types/resolve": "^1.20.6",
67
+ "tsc-alias": "^1.8.8",
68
+ "typescript": "^5.3.3"
69
+ },
70
+ "peerDependencies": {
71
+ "tailwindcss": ">=3.0.0"
72
+ }
73
+ }