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