css-to-tailwind-react 0.1.2 → 0.2.1

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,335 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.transformDescendantSelectors = transformDescendantSelectors;
40
+ exports.groupDescendantRulesByParent = groupDescendantRulesByParent;
41
+ const parser_1 = require("@babel/parser");
42
+ const traverse_1 = __importDefault(require("@babel/traverse"));
43
+ const generator_1 = __importDefault(require("@babel/generator"));
44
+ const t = __importStar(require("@babel/types"));
45
+ const conflictResolver_1 = require("./utils/conflictResolver");
46
+ const logger_1 = require("./utils/logger");
47
+ function isReactComponent(name) {
48
+ return name.length > 0 && name[0] === name[0].toUpperCase();
49
+ }
50
+ function getJSXElementName(node) {
51
+ if (t.isJSXIdentifier(node.name)) {
52
+ return node.name.name;
53
+ }
54
+ return null;
55
+ }
56
+ function parseClassNameValue(attr) {
57
+ const classes = [];
58
+ if (!attr.value) {
59
+ return classes;
60
+ }
61
+ if (t.isStringLiteral(attr.value)) {
62
+ return attr.value.value.split(/\s+/).filter(Boolean);
63
+ }
64
+ if (t.isJSXExpressionContainer(attr.value)) {
65
+ const expr = attr.value.expression;
66
+ if (t.isStringLiteral(expr)) {
67
+ return expr.value.split(/\s+/).filter(Boolean);
68
+ }
69
+ if (t.isTemplateLiteral(expr) && expr.quasis.length > 0 && expr.expressions.length === 0) {
70
+ return expr.quasis[0].value.raw.split(/\s+/).filter(Boolean);
71
+ }
72
+ }
73
+ return classes;
74
+ }
75
+ function elementMatchesSelector(node, selector) {
76
+ const elementName = getJSXElementName(node);
77
+ if (!elementName) {
78
+ return false;
79
+ }
80
+ if (isReactComponent(elementName)) {
81
+ return false;
82
+ }
83
+ if (selector.type === 'element') {
84
+ return elementName.toLowerCase() === selector.name.toLowerCase();
85
+ }
86
+ if (selector.type === 'class') {
87
+ const classNameAttr = node.attributes?.find(attr => t.isJSXAttribute(attr) &&
88
+ t.isJSXIdentifier(attr.name) &&
89
+ attr.name.name === 'className');
90
+ if (!classNameAttr || !t.isJSXAttribute(classNameAttr)) {
91
+ return false;
92
+ }
93
+ const classes = parseClassNameValue(classNameAttr);
94
+ return classes.includes(selector.name);
95
+ }
96
+ return false;
97
+ }
98
+ function mergeClassesIntoAttribute(node, newClasses) {
99
+ if (newClasses.length === 0) {
100
+ return false;
101
+ }
102
+ const classNameAttr = node.attributes?.find(attr => t.isJSXAttribute(attr) &&
103
+ t.isJSXIdentifier(attr.name) &&
104
+ attr.name.name === 'className');
105
+ if (!classNameAttr) {
106
+ const newAttr = t.jsxAttribute(t.jsxIdentifier('className'), t.stringLiteral(newClasses.join(' ')));
107
+ if (!node.attributes) {
108
+ node.attributes = [];
109
+ }
110
+ node.attributes.push(newAttr);
111
+ return true;
112
+ }
113
+ if (!t.isJSXAttribute(classNameAttr)) {
114
+ return false;
115
+ }
116
+ const existingClasses = parseClassNameValue(classNameAttr);
117
+ const allClasses = new Set([...existingClasses, ...newClasses]);
118
+ const mergedClasses = Array.from(allClasses);
119
+ if (t.isStringLiteral(classNameAttr.value)) {
120
+ classNameAttr.value.value = mergedClasses.join(' ');
121
+ return true;
122
+ }
123
+ if (t.isJSXExpressionContainer(classNameAttr.value)) {
124
+ const expr = classNameAttr.value.expression;
125
+ if (t.isStringLiteral(expr)) {
126
+ expr.value = mergedClasses.join(' ');
127
+ return true;
128
+ }
129
+ if (t.isTemplateLiteral(expr) && expr.quasis.length > 0 && expr.expressions.length === 0) {
130
+ expr.quasis[0].value.raw = mergedClasses.join(' ');
131
+ expr.quasis[0].value.cooked = mergedClasses.join(' ');
132
+ return true;
133
+ }
134
+ }
135
+ classNameAttr.value = t.stringLiteral(mergedClasses.join(' '));
136
+ return true;
137
+ }
138
+ function wrapInFragment(code) {
139
+ return `<>${code}</>`;
140
+ }
141
+ function unwrapFragment(code) {
142
+ return code.replace(/^<>\n?/, '').replace(/\n?<\/>$/, '');
143
+ }
144
+ function needsFragmentWrapping(code) {
145
+ const trimmed = code.trim();
146
+ if (trimmed.startsWith('<>') || trimmed.startsWith('<Fragment')) {
147
+ return false;
148
+ }
149
+ const firstChar = trimmed.search(/<[a-zA-Z]/);
150
+ if (firstChar === -1)
151
+ return false;
152
+ let depth = 0;
153
+ let inString = false;
154
+ let stringChar = '';
155
+ for (let i = firstChar; i < trimmed.length; i++) {
156
+ const char = trimmed[i];
157
+ if (inString) {
158
+ if (char === stringChar && trimmed[i - 1] !== '\\') {
159
+ inString = false;
160
+ }
161
+ continue;
162
+ }
163
+ if (char === '"' || char === "'" || char === '`') {
164
+ inString = true;
165
+ stringChar = char;
166
+ continue;
167
+ }
168
+ if (trimmed.slice(i, i + 2) === '</') {
169
+ depth--;
170
+ i++;
171
+ }
172
+ else if (char === '<' && trimmed[i + 1]?.match(/[a-zA-Z]/)) {
173
+ depth++;
174
+ }
175
+ if (depth === 0 && i > firstChar) {
176
+ const remaining = trimmed.slice(i + 1).trim();
177
+ if (remaining.startsWith('<') && !remaining.startsWith('</')) {
178
+ return true;
179
+ }
180
+ }
181
+ }
182
+ return false;
183
+ }
184
+ function transformDescendantSelectors(code, rules) {
185
+ const descendantRules = [];
186
+ for (const rule of rules) {
187
+ if (rule.isDescendant && rule.parentSelector && rule.targetSelector) {
188
+ if (rule.convertedClasses.length > 0) {
189
+ descendantRules.push({
190
+ parentSelector: rule.parentSelector,
191
+ targetSelector: rule.targetSelector,
192
+ utilities: rule.utilities,
193
+ selector: rule.selector
194
+ });
195
+ }
196
+ }
197
+ }
198
+ if (descendantRules.length === 0) {
199
+ return {
200
+ code,
201
+ hasChanges: false,
202
+ transformations: 0,
203
+ warnings: []
204
+ };
205
+ }
206
+ let hasChanges = false;
207
+ let transformations = 0;
208
+ const warnings = [];
209
+ const needsWrapping = needsFragmentWrapping(code);
210
+ const codeToParse = needsWrapping ? wrapInFragment(code) : code;
211
+ try {
212
+ const ast = (0, parser_1.parse)(codeToParse, {
213
+ sourceType: 'module',
214
+ allowImportExportEverywhere: true,
215
+ allowReturnOutsideFunction: true,
216
+ plugins: [
217
+ 'jsx',
218
+ 'typescript',
219
+ 'decorators-legacy',
220
+ 'classProperties',
221
+ 'optionalChaining',
222
+ 'nullishCoalescingOperator',
223
+ 'dynamicImport'
224
+ ]
225
+ });
226
+ (0, traverse_1.default)(ast, {
227
+ JSXOpeningElement(path) {
228
+ const node = path.node;
229
+ for (const rule of descendantRules) {
230
+ if (elementMatchesSelector(node, rule.parentSelector)) {
231
+ const parentPath = path.parentPath;
232
+ if (!parentPath)
233
+ continue;
234
+ const appliedClasses = applyToDescendants(parentPath, rule);
235
+ if (appliedClasses > 0) {
236
+ hasChanges = true;
237
+ transformations += appliedClasses;
238
+ }
239
+ }
240
+ }
241
+ }
242
+ });
243
+ const output = (0, generator_1.default)(ast, {
244
+ retainLines: true,
245
+ retainFunctionParens: true,
246
+ comments: true
247
+ });
248
+ let outputCode = output.code;
249
+ if (needsWrapping) {
250
+ outputCode = unwrapFragment(outputCode);
251
+ }
252
+ return {
253
+ code: outputCode,
254
+ hasChanges,
255
+ transformations,
256
+ warnings
257
+ };
258
+ }
259
+ catch (error) {
260
+ logger_1.logger.error('Failed to transform descendant selectors:', error);
261
+ warnings.push(`Descendant transformation failed: ${error}`);
262
+ return {
263
+ code,
264
+ hasChanges: false,
265
+ transformations: 0,
266
+ warnings
267
+ };
268
+ }
269
+ }
270
+ function applyToDescendants(parentPath, rule) {
271
+ let appliedCount = 0;
272
+ const utilitiesWithMeta = rule.utilities.map(u => ({
273
+ value: u.value,
274
+ variants: u.variants,
275
+ cssProperty: u.cssProperty,
276
+ specificity: u.specificity,
277
+ sourceOrder: u.sourceOrder,
278
+ originalSelector: rule.selector
279
+ }));
280
+ const { resolved } = (0, conflictResolver_1.resolveConflicts)(utilitiesWithMeta, false);
281
+ const newClasses = (0, conflictResolver_1.resolvedUtilitiesToStrings)(resolved);
282
+ const parentNode = parentPath.node;
283
+ if (!parentNode) {
284
+ return appliedCount;
285
+ }
286
+ if (t.isJSXElement(parentNode)) {
287
+ if (parentNode.children) {
288
+ for (const child of parentNode.children) {
289
+ if (t.isJSXElement(child)) {
290
+ appliedCount += applyToJSXElement(child, rule, newClasses);
291
+ }
292
+ }
293
+ }
294
+ }
295
+ return appliedCount;
296
+ }
297
+ function applyToJSXElement(element, rule, newClasses) {
298
+ let appliedCount = 0;
299
+ if (elementMatchesSelector(element.openingElement, rule.targetSelector)) {
300
+ if (mergeClassesIntoAttribute(element.openingElement, newClasses)) {
301
+ appliedCount++;
302
+ const elementName = getJSXElementName(element.openingElement);
303
+ logger_1.logger.verbose(`Applied descendant classes to <${elementName}>: ${newClasses.join(' ')}`);
304
+ }
305
+ }
306
+ if (element.children) {
307
+ for (const child of element.children) {
308
+ if (t.isJSXElement(child)) {
309
+ appliedCount += applyToJSXElement(child, rule, newClasses);
310
+ }
311
+ }
312
+ }
313
+ return appliedCount;
314
+ }
315
+ function groupDescendantRulesByParent(rules) {
316
+ const grouped = new Map();
317
+ for (const rule of rules) {
318
+ if (rule.isDescendant && rule.parentSelector && rule.targetSelector) {
319
+ const parentKey = rule.parentSelector.type === 'class'
320
+ ? `.${rule.parentSelector.name}`
321
+ : rule.parentSelector.name;
322
+ if (!grouped.has(parentKey)) {
323
+ grouped.set(parentKey, []);
324
+ }
325
+ grouped.get(parentKey).push({
326
+ parentSelector: rule.parentSelector,
327
+ targetSelector: rule.targetSelector,
328
+ utilities: rule.utilities,
329
+ selector: rule.selector
330
+ });
331
+ }
332
+ }
333
+ return grouped;
334
+ }
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianN4RGVzY2VuZGFudFRyYW5zZm9ybWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2pzeERlc2NlbmRhbnRUcmFuc2Zvcm1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdOQSxvRUFxR0M7QUFpRUQsb0VBdUJDO0FBclpELDBDQUFzQztBQUN0QywrREFBdUM7QUFDdkMsaUVBQXdDO0FBQ3hDLGdEQUFrQztBQUdsQywrREFLa0M7QUFDbEMsMkNBQXdDO0FBZ0J4QyxTQUFTLGdCQUFnQixDQUFDLElBQVk7SUFDcEMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzlELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQXlCO0lBQ2xELElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBQW9CO0lBQy9DLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJ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U0FBUyxDQUFFLENBQUMsSUFBSSxDQUFDO2dCQUMzQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdAYmFiZWwvcGFyc2VyJztcbmltcG9ydCB0cmF2ZXJzZSBmcm9tICdAYmFiZWwvdHJhdmVyc2UnO1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ0BiYWJlbC9nZW5lcmF0b3InO1xuaW1wb3J0ICogYXMgdCBmcm9tICdAYmFiZWwvdHlwZXMnO1xuaW1wb3J0IHsgQ1NTUnVsZSwgU2VsZWN0b3JUYXJnZXQsIFV0aWxpdHlXaXRoVmFyaWFudCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmltcG9ydCB7IGFzc2VtYmxlVXRpbGl0aWVzIH0gZnJvbSAnLi91dGlscy92YXJpYW50QXNzZW1ibGVyJztcbmltcG9ydCB7IFxuICBVdGlsaXR5V2l0aE1ldGEsIFxuICBSZXNvbHZlZFV0aWxpdHksIFxuICByZXNvbHZlQ29uZmxpY3RzLCBcbiAgcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3MgXG59IGZyb20gJy4vdXRpbHMvY29uZmxpY3RSZXNvbHZlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzY2VuZGFudFRyYW5zZm9ybVJlc3VsdCB7XG4gIGNvZGU6IHN0cmluZztcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgdHJhbnNmb3JtYXRpb25zOiBudW1iZXI7XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIERlc2NlbmRhbnRSdWxlIHtcbiAgcGFyZW50U2VsZWN0b3I6IFNlbGVjdG9yVGFyZ2V0O1xuICB0YXJnZXRTZWxlY3RvcjogU2VsZWN0b3JUYXJnZXQ7XG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhWYXJpYW50W107XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzUmVhY3RDb21wb25lbnQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBuYW1lLmxlbmd0aCA+IDAgJiYgbmFtZVswXSA9PT0gbmFtZVswXS50b1VwcGVyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBnZXRKU1hFbGVtZW50TmFtZShub2RlOiB0LkpTWE9wZW5pbmdFbGVtZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0LmlzSlNYSWRlbnRpZmllcihub2RlLm5hbWUpKSB7XG4gICAgcmV0dXJuIG5vZGUubmFtZS5uYW1lO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNsYXNzTmFtZVZhbHVlKGF0dHI6IHQuSlNYQXR0cmlidXRlKTogc3RyaW5nW10ge1xuICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBcbiAgaWYgKCFhdHRyLnZhbHVlKSB7XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgXG4gIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChhdHRyLnZhbHVlKSkge1xuICAgIHJldHVybiBhdHRyLnZhbHVlLnZhbHVlLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIFxuICBpZiAodC5pc0pTWEV4cHJlc3Npb25Db250YWluZXIoYXR0ci52YWx1ZSkpIHtcbiAgICBjb25zdCBleHByID0gYXR0ci52YWx1ZS5leHByZXNzaW9uO1xuICAgIFxuICAgIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChleHByKSkge1xuICAgICAgcmV0dXJuIGV4cHIudmFsdWUuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuICAgIFxuICAgIGlmICh0LmlzVGVtcGxhdGVMaXRlcmFsKGV4cHIpICYmIGV4cHIucXVhc2lzLmxlbmd0aCA+IDAgJiYgZXhwci5leHByZXNzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBleHByLnF1YXNpc1swXS52YWx1ZS5yYXcuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gY2xhc3Nlcztcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXNTZWxlY3RvcihcbiAgbm9kZTogdC5KU1hPcGVuaW5nRWxlbWVudCxcbiAgc2VsZWN0b3I6IFNlbGVjdG9yVGFyZ2V0XG4pOiBib29sZWFuIHtcbiAgY29uc3QgZWxlbWVudE5hbWUgPSBnZXRKU1hFbGVtZW50TmFtZShub2RlKTtcbiAgXG4gIGlmICghZWxlbWVudE5hbWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgXG4gIGlmIChpc1JlYWN0Q29tcG9uZW50KGVsZW1lbnROYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICdlbGVtZW50Jykge1xuICAgIHJldHVybiBlbGVtZW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBzZWxlY3Rvci5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgXG4gIGlmIChzZWxlY3Rvci50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lQXR0ciA9IG5vZGUuYXR0cmlidXRlcz8uZmluZChcbiAgICAgIGF0dHIgPT4gdC5pc0pTWEF0dHJpYnV0ZShhdHRyKSAmJiBcbiAgICAgICAgICAgICAgdC5pc0pTWElkZW50aWZpZXIoYXR0ci5uYW1lKSAmJiBcbiAgICAgICAgICAgICAgYXR0ci5uYW1lLm5hbWUgPT09ICdjbGFzc05hbWUnXG4gICAgKTtcbiAgICBcbiAgICBpZiAoIWNsYXNzTmFtZUF0dHIgfHwgIXQuaXNKU1hBdHRyaWJ1dGUoY2xhc3NOYW1lQXR0cikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY2xhc3NlcyA9IHBhcnNlQ2xhc3NOYW1lVmFsdWUoY2xhc3NOYW1lQXR0cik7XG4gICAgcmV0dXJuIGNsYXNzZXMuaW5jbHVkZXMoc2VsZWN0b3IubmFtZSk7XG4gIH1cbiAgXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VDbGFzc2VzSW50b0F0dHJpYnV0ZShcbiAgbm9kZTogdC5KU1hPcGVuaW5nRWxlbWVudCxcbiAgbmV3Q2xhc3Nlczogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuICBpZiAobmV3Q2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgXG4gIGNvbnN0IGNsYXNzTmFtZUF0dHIgPSBub2RlLmF0dHJpYnV0ZXM/LmZpbmQoXG4gICAgYXR0ciA9PiB0LmlzSlNYQXR0cmlidXRlKGF0dHIpICYmIFxuICAgICAgICAgICAgdC5pc0pTWElkZW50aWZpZXIoYXR0ci5uYW1lKSAmJiBcbiAgICAgICAgICAgIGF0dHIubmFtZS5uYW1lID09PSAnY2xhc3NOYW1lJ1xuICApO1xuICBcbiAgaWYgKCFjbGFzc05hbWVBdHRyKSB7XG4gICAgY29uc3QgbmV3QXR0ciA9IHQuanN4QXR0cmlidXRlKFxuICAgICAgdC5qc3hJZGVudGlmaWVyKCdjbGFzc05hbWUnKSxcbiAgICAgIHQuc3RyaW5nTGl0ZXJhbChuZXdDbGFzc2VzLmpvaW4oJyAnKSlcbiAgICApO1xuICAgIFxuICAgIGlmICghbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICBub2RlLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICB9XG4gICAgbm9kZS5hdHRyaWJ1dGVzLnB1c2gobmV3QXR0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIGlmICghdC5pc0pTWEF0dHJpYnV0ZShjbGFzc05hbWVBdHRyKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgY29uc3QgZXhpc3RpbmdDbGFzc2VzID0gcGFyc2VDbGFzc05hbWVWYWx1ZShjbGFzc05hbWVBdHRyKTtcbiAgY29uc3QgYWxsQ2xhc3NlcyA9IG5ldyBTZXQoWy4uLmV4aXN0aW5nQ2xhc3NlcywgLi4ubmV3Q2xhc3Nlc10pO1xuICBjb25zdCBtZXJnZWRDbGFzc2VzID0gQXJyYXkuZnJvbShhbGxDbGFzc2VzKTtcbiAgXG4gIGlmICh0LmlzU3RyaW5nTGl0ZXJhbChjbGFzc05hbWVBdHRyLnZhbHVlKSkge1xuICAgIGNsYXNzTmFtZUF0dHIudmFsdWUudmFsdWUgPSBtZXJnZWRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgaWYgKHQuaXNKU1hFeHByZXNzaW9uQ29udGFpbmVyKGNsYXNzTmFtZUF0dHIudmFsdWUpKSB7XG4gICAgY29uc3QgZXhwciA9IGNsYXNzTmFtZUF0dHIudmFsdWUuZXhwcmVzc2lvbjtcbiAgICBcbiAgICBpZiAodC5pc1N0cmluZ0xpdGVyYWwoZXhwcikpIHtcbiAgICAgIGV4cHIudmFsdWUgPSBtZXJnZWRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBpZiAodC5pc1RlbXBsYXRlTGl0ZXJhbChleHByKSAmJiBleHByLnF1YXNpcy5sZW5ndGggPiAwICYmIGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBleHByLnF1YXNpc1swXS52YWx1ZS5yYXcgPSBtZXJnZWRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIGV4cHIucXVhc2lzWzBdLnZhbHVlLmNvb2tlZCA9IG1lcmdlZENsYXNzZXMuam9pbignICcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIFxuICBjbGFzc05hbWVBdHRyLnZhbHVlID0gdC5zdHJpbmdMaXRlcmFsKG1lcmdlZENsYXNzZXMuam9pbignICcpKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdyYXBJbkZyYWdtZW50KGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD4ke2NvZGV9PC8+YDtcbn1cblxuZnVuY3Rpb24gdW53cmFwRnJhZ21lbnQoY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvZGUucmVwbGFjZSgvXjw+XFxuPy8sICcnKS5yZXBsYWNlKC9cXG4/PFxcLz4kLywgJycpO1xufVxuXG5mdW5jdGlvbiBuZWVkc0ZyYWdtZW50V3JhcHBpbmcoY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb2RlLnRyaW0oKTtcbiAgXG4gIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJzw+JykgfHwgdHJpbW1lZC5zdGFydHNXaXRoKCc8RnJhZ21lbnQnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBcbiAgY29uc3QgZmlyc3RDaGFyID0gdHJpbW1lZC5zZWFyY2goLzxbYS16QS1aXS8pO1xuICBpZiAoZmlyc3RDaGFyID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICBcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGluU3RyaW5nID0gZmFsc2U7XG4gIGxldCBzdHJpbmdDaGFyID0gJyc7XG4gIFxuICBmb3IgKGxldCBpID0gZmlyc3RDaGFyOyBpIDwgdHJpbW1lZC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSB0cmltbWVkW2ldO1xuICAgIFxuICAgIGlmIChpblN0cmluZykge1xuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0NoYXIgJiYgdHJpbW1lZFtpIC0gMV0gIT09ICdcXFxcJykge1xuICAgICAgICBpblN0cmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIFxuICAgIGlmIChjaGFyID09PSAnXCInIHx8IGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgaW5TdHJpbmcgPSB0cnVlO1xuICAgICAgc3RyaW5nQ2hhciA9IGNoYXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRyaW1tZWQuc2xpY2UoaSwgaSArIDIpID09PSAnPC8nKSB7XG4gICAgICBkZXB0aC0tO1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJzwnICYmIHRyaW1tZWRbaSArIDFdPy5tYXRjaCgvW2EtekEtWl0vKSkge1xuICAgICAgZGVwdGgrKztcbiAgICB9XG4gICAgXG4gICAgaWYgKGRlcHRoID09PSAwICYmIGkgPiBmaXJzdENoYXIpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRyaW1tZWQuc2xpY2UoaSArIDEpLnRyaW0oKTtcbiAgICAgIGlmIChyZW1haW5pbmcuc3RhcnRzV2l0aCgnPCcpICYmICFyZW1haW5pbmcuc3RhcnRzV2l0aCgnPC8nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybURlc2NlbmRhbnRTZWxlY3RvcnMoXG4gIGNvZGU6IHN0cmluZyxcbiAgcnVsZXM6IENTU1J1bGVbXVxuKTogRGVzY2VuZGFudFRyYW5zZm9ybVJlc3VsdCB7XG4gIGNvbnN0IGRlc2NlbmRhbnRSdWxlczogRGVzY2VuZGFudFJ1bGVbXSA9IFtdO1xuICBcbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgaWYgKHJ1bGUuaXNEZXNjZW5kYW50ICYmIHJ1bGUucGFyZW50U2VsZWN0b3IgJiYgcnVsZS50YXJnZXRTZWxlY3Rvcikge1xuICAgICAgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRlc2NlbmRhbnRSdWxlcy5wdXNoKHtcbiAgICAgICAgICBwYXJlbnRTZWxlY3RvcjogcnVsZS5wYXJlbnRTZWxlY3RvcixcbiAgICAgICAgICB0YXJnZXRTZWxlY3RvcjogcnVsZS50YXJnZXRTZWxlY3RvcixcbiAgICAgICAgICB1dGlsaXRpZXM6IHJ1bGUudXRpbGl0aWVzLFxuICAgICAgICAgIHNlbGVjdG9yOiBydWxlLnNlbGVjdG9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgaWYgKGRlc2NlbmRhbnRSdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGhhc0NoYW5nZXM6IGZhbHNlLFxuICAgICAgdHJhbnNmb3JtYXRpb25zOiAwLFxuICAgICAgd2FybmluZ3M6IFtdXG4gICAgfTtcbiAgfVxuICBcbiAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgbGV0IHRyYW5zZm9ybWF0aW9ucyA9IDA7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICBcbiAgY29uc3QgbmVlZHNXcmFwcGluZyA9IG5lZWRzRnJhZ21lbnRXcmFwcGluZyhjb2RlKTtcbiAgY29uc3QgY29kZVRvUGFyc2UgPSBuZWVkc1dyYXBwaW5nID8gd3JhcEluRnJhZ21lbnQoY29kZSkgOiBjb2RlO1xuICBcbiAgdHJ5IHtcbiAgICBjb25zdCBhc3QgPSBwYXJzZShjb2RlVG9QYXJzZSwge1xuICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICBhbGxvd0ltcG9ydEV4cG9ydEV2ZXJ5d2hlcmU6IHRydWUsXG4gICAgICBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogdHJ1ZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgJ2pzeCcsXG4gICAgICAgICd0eXBlc2NyaXB0JyxcbiAgICAgICAgJ2RlY29yYXRvcnMtbGVnYWN5JyxcbiAgICAgICAgJ2NsYXNzUHJvcGVydGllcycsXG4gICAgICAgICdvcHRpb25hbENoYWluaW5nJyxcbiAgICAgICAgJ251bGxpc2hDb2FsZXNjaW5nT3BlcmF0b3InLFxuICAgICAgICAnZHluYW1pY0ltcG9ydCdcbiAgICAgIF1cbiAgICB9KTtcbiAgICBcbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIEpTWE9wZW5pbmdFbGVtZW50KHBhdGgpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHBhdGgubm9kZTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBkZXNjZW5kYW50UnVsZXMpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudE1hdGNoZXNTZWxlY3Rvcihub2RlLCBydWxlLnBhcmVudFNlbGVjdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucGFyZW50UGF0aDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRQYXRoKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYXBwbGllZENsYXNzZXMgPSBhcHBseVRvRGVzY2VuZGFudHMocGFyZW50UGF0aCwgcnVsZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChhcHBsaWVkQ2xhc3NlcyA+IDApIHtcbiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9ucyArPSBhcHBsaWVkQ2xhc3NlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCBvdXRwdXQgPSBnZW5lcmF0ZShhc3QsIHtcbiAgICAgIHJldGFpbkxpbmVzOiB0cnVlLFxuICAgICAgcmV0YWluRnVuY3Rpb25QYXJlbnM6IHRydWUsXG4gICAgICBjb21tZW50czogdHJ1ZVxuICAgIH0pO1xuICAgIFxuICAgIGxldCBvdXRwdXRDb2RlID0gb3V0cHV0LmNvZGU7XG4gICAgaWYgKG5lZWRzV3JhcHBpbmcpIHtcbiAgICAgIG91dHB1dENvZGUgPSB1bndyYXBGcmFnbWVudChvdXRwdXRDb2RlKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IG91dHB1dENvZGUsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgdHJhbnNmb3JtYXRpb25zLFxuICAgICAgd2FybmluZ3NcbiAgICB9O1xuICAgIFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHRyYW5zZm9ybSBkZXNjZW5kYW50IHNlbGVjdG9yczonLCBlcnJvcik7XG4gICAgd2FybmluZ3MucHVzaChgRGVzY2VuZGFudCB0cmFuc2Zvcm1hdGlvbiBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGUsXG4gICAgICBoYXNDaGFuZ2VzOiBmYWxzZSxcbiAgICAgIHRyYW5zZm9ybWF0aW9uczogMCxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVRvRGVzY2VuZGFudHMoXG4gIHBhcmVudFBhdGg6IGFueSxcbiAgcnVsZTogRGVzY2VuZGFudFJ1bGVcbik6IG51bWJlciB7XG4gIGxldCBhcHBsaWVkQ291bnQgPSAwO1xuICBjb25zdCB1dGlsaXRpZXNXaXRoTWV0YTogVXRpbGl0eVdpdGhNZXRhW10gPSBydWxlLnV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgIHZhcmlhbnRzOiB1LnZhcmlhbnRzLFxuICAgIGNzc1Byb3BlcnR5OiB1LmNzc1Byb3BlcnR5LFxuICAgIHNwZWNpZmljaXR5OiB1LnNwZWNpZmljaXR5LFxuICAgIHNvdXJjZU9yZGVyOiB1LnNvdXJjZU9yZGVyLFxuICAgIG9yaWdpbmFsU2VsZWN0b3I6IHJ1bGUuc2VsZWN0b3JcbiAgfSkpO1xuICBcbiAgY29uc3QgeyByZXNvbHZlZCB9ID0gcmVzb2x2ZUNvbmZsaWN0cyh1dGlsaXRpZXNXaXRoTWV0YSwgZmFsc2UpO1xuICBjb25zdCBuZXdDbGFzc2VzID0gcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3MocmVzb2x2ZWQpO1xuICBcbiAgY29uc3QgcGFyZW50Tm9kZSA9IHBhcmVudFBhdGgubm9kZTtcbiAgXG4gIGlmICghcGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBhcHBsaWVkQ291bnQ7XG4gIH1cbiAgXG4gIGlmICh0LmlzSlNYRWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgIGlmIChwYXJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHBhcmVudE5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKHQuaXNKU1hFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIGFwcGxpZWRDb3VudCArPSBhcHBseVRvSlNYRWxlbWVudChjaGlsZCwgcnVsZSwgbmV3Q2xhc3Nlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBhcHBsaWVkQ291bnQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9KU1hFbGVtZW50KFxuICBlbGVtZW50OiB0LkpTWEVsZW1lbnQsXG4gIHJ1bGU6IERlc2NlbmRhbnRSdWxlLFxuICBuZXdDbGFzc2VzOiBzdHJpbmdbXVxuKTogbnVtYmVyIHtcbiAgbGV0IGFwcGxpZWRDb3VudCA9IDA7XG4gIFxuICBpZiAoZWxlbWVudE1hdGNoZXNTZWxlY3RvcihlbGVtZW50Lm9wZW5pbmdFbGVtZW50LCBydWxlLnRhcmdldFNlbGVjdG9yKSkge1xuICAgIGlmIChtZXJnZUNsYXNzZXNJbnRvQXR0cmlidXRlKGVsZW1lbnQub3BlbmluZ0VsZW1lbnQsIG5ld0NsYXNzZXMpKSB7XG4gICAgICBhcHBsaWVkQ291bnQrKztcbiAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBnZXRKU1hFbGVtZW50TmFtZShlbGVtZW50Lm9wZW5pbmdFbGVtZW50KTtcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBBcHBsaWVkIGRlc2NlbmRhbnQgY2xhc3NlcyB0byA8JHtlbGVtZW50TmFtZX0+OiAke25ld0NsYXNzZXMuam9pbignICcpfWApO1xuICAgIH1cbiAgfVxuICBcbiAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmICh0LmlzSlNYRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgYXBwbGllZENvdW50ICs9IGFwcGx5VG9KU1hFbGVtZW50KGNoaWxkLCBydWxlLCBuZXdDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBhcHBsaWVkQ291bnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cERlc2NlbmRhbnRSdWxlc0J5UGFyZW50KHJ1bGVzOiBDU1NSdWxlW10pOiBNYXA8c3RyaW5nLCBEZXNjZW5kYW50UnVsZVtdPiB7XG4gIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPHN0cmluZywgRGVzY2VuZGFudFJ1bGVbXT4oKTtcbiAgXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGlmIChydWxlLmlzRGVzY2VuZGFudCAmJiBydWxlLnBhcmVudFNlbGVjdG9yICYmIHJ1bGUudGFyZ2V0U2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHJ1bGUucGFyZW50U2VsZWN0b3IudHlwZSA9PT0gJ2NsYXNzJyBcbiAgICAgICAgPyBgLiR7cnVsZS5wYXJlbnRTZWxlY3Rvci5uYW1lfWAgXG4gICAgICAgIDogcnVsZS5wYXJlbnRTZWxlY3Rvci5uYW1lO1xuICAgICAgXG4gICAgICBpZiAoIWdyb3VwZWQuaGFzKHBhcmVudEtleSkpIHtcbiAgICAgICAgZ3JvdXBlZC5zZXQocGFyZW50S2V5LCBbXSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGdyb3VwZWQuZ2V0KHBhcmVudEtleSkhLnB1c2goe1xuICAgICAgICBwYXJlbnRTZWxlY3RvcjogcnVsZS5wYXJlbnRTZWxlY3RvcixcbiAgICAgICAgdGFyZ2V0U2VsZWN0b3I6IHJ1bGUudGFyZ2V0U2VsZWN0b3IsXG4gICAgICAgIHV0aWxpdGllczogcnVsZS51dGlsaXRpZXMsXG4gICAgICAgIHNlbGVjdG9yOiBydWxlLnNlbGVjdG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBncm91cGVkO1xufSJdfQ==