css-to-tailwind-react 0.1.0 → 0.1.2

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.
@@ -1,9 +1,14 @@
1
1
  import { TailwindMapper, CSSProperty } from './tailwindMapper';
2
+ export interface UtilityWithVariant {
3
+ value: string;
4
+ variants: string[];
5
+ }
2
6
  export interface CSSRule {
3
7
  selector: string;
4
8
  className: string;
5
9
  declarations: CSSProperty[];
6
10
  convertedClasses: string[];
11
+ utilities: UtilityWithVariant[];
7
12
  skipped: boolean;
8
13
  fullyConverted: boolean;
9
14
  partialConversion: boolean;
@@ -21,7 +26,10 @@ export interface CSSUsageMap {
21
26
  }
22
27
  export declare class CSSParser {
23
28
  private mapper;
24
- constructor(mapper: TailwindMapper);
29
+ private breakpoints;
30
+ constructor(mapper: TailwindMapper, screens?: Record<string, string | [string, string]>);
31
+ private convertDeclarations;
32
+ private processRuleWithVariants;
25
33
  parse(css: string, filePath: string): Promise<CSSParseResult>;
26
34
  parseInternalStyle(html: string): {
27
35
  styles: Array<{
package/dist/cssParser.js CHANGED
@@ -7,9 +7,93 @@ exports.CSSParser = void 0;
7
7
  const postcss_1 = __importDefault(require("postcss"));
8
8
  const postcss_safe_parser_1 = __importDefault(require("postcss-safe-parser"));
9
9
  const logger_1 = require("./utils/logger");
10
+ const breakpointResolver_1 = require("./utils/breakpointResolver");
11
+ const pseudoSelectorResolver_1 = require("./utils/pseudoSelectorResolver");
12
+ const variantAssembler_1 = require("./utils/variantAssembler");
10
13
  class CSSParser {
11
- constructor(mapper) {
14
+ constructor(mapper, screens) {
12
15
  this.mapper = mapper;
16
+ this.breakpoints = screens
17
+ ? (0, breakpointResolver_1.resolveBreakpointsFromConfig)(screens)
18
+ : (0, breakpointResolver_1.getBreakpoints)();
19
+ }
20
+ convertDeclarations(declarations) {
21
+ const conversionResults = [];
22
+ const conversionWarnings = [];
23
+ declarations.forEach(decl => {
24
+ const result = this.mapper.convertProperty(decl.property, decl.value);
25
+ conversionResults.push({
26
+ declaration: decl,
27
+ converted: !result.skipped && result.className !== null,
28
+ className: result.className
29
+ });
30
+ if (result.skipped && result.reason) {
31
+ conversionWarnings.push(result.reason);
32
+ }
33
+ });
34
+ const utilities = conversionResults
35
+ .filter(r => r.converted && r.className)
36
+ .map(r => ({
37
+ value: r.className,
38
+ variants: []
39
+ }));
40
+ return { utilities, conversionResults, conversionWarnings };
41
+ }
42
+ processRuleWithVariants(rule, additionalVariants = []) {
43
+ const selector = rule.selector;
44
+ const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(selector);
45
+ const validSelectors = parsedSelectors.filter(s => !s.isComplex && s.baseClass);
46
+ if (validSelectors.length === 0) {
47
+ return null;
48
+ }
49
+ const declarations = [];
50
+ rule.walkDecls((decl) => {
51
+ if (decl.prop.startsWith('--')) {
52
+ return;
53
+ }
54
+ if (decl.value.includes('calc(')) {
55
+ return;
56
+ }
57
+ declarations.push({
58
+ property: decl.prop,
59
+ value: decl.value
60
+ });
61
+ });
62
+ if (declarations.length === 0) {
63
+ return null;
64
+ }
65
+ const { utilities, conversionResults, conversionWarnings } = this.convertDeclarations(declarations);
66
+ const utilitiesWithVariants = utilities.map(u => ({
67
+ value: u.value,
68
+ variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants, ...additionalVariants])
69
+ }));
70
+ const cssRules = [];
71
+ const allConversionResults = [];
72
+ for (const parsed of validSelectors) {
73
+ const pseudoVariants = parsed.pseudos || [];
74
+ const allVariants = (0, variantAssembler_1.normalizeVariantOrder)([...pseudoVariants, ...additionalVariants]);
75
+ const utilitiesForSelector = utilities.map(u => ({
76
+ value: u.value,
77
+ variants: allVariants
78
+ }));
79
+ const convertedClasses = (0, variantAssembler_1.assembleUtilities)(utilitiesForSelector);
80
+ const allDeclarationsConverted = conversionResults.every(r => r.converted);
81
+ const someDeclarationsConverted = convertedClasses.length > 0;
82
+ const cssRule = {
83
+ selector: selector,
84
+ className: parsed.baseClass,
85
+ declarations,
86
+ convertedClasses,
87
+ utilities: utilitiesForSelector,
88
+ skipped: !someDeclarationsConverted,
89
+ fullyConverted: allDeclarationsConverted,
90
+ partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
91
+ reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined
92
+ };
93
+ cssRules.push(cssRule);
94
+ allConversionResults.push(conversionResults);
95
+ }
96
+ return { cssRules, conversionResults: allConversionResults, conversionWarnings };
13
97
  }
14
98
  async parse(css, filePath) {
15
99
  const rules = [];
@@ -20,105 +104,97 @@ class CSSParser {
20
104
  parser: postcss_safe_parser_1.default,
21
105
  from: filePath
22
106
  }).then(result => result.root);
23
- // Process each rule
24
- root.walkRules((rule) => {
25
- // Skip rules inside @media, @supports, etc.
26
- if (rule.parent && rule.parent.type === 'atrule') {
27
- warnings.push(`Skipped rule with at-rule parent: ${rule.selector}`);
28
- logger_1.logger.verbose(`Skipping at-rule: ${rule.selector}`);
29
- return;
30
- }
31
- // Skip pseudo-selectors
32
- if (rule.selector.includes(':')) {
33
- warnings.push(`Skipped pseudo-selector: ${rule.selector}`);
34
- logger_1.logger.verbose(`Skipping pseudo-selector: ${rule.selector}`);
107
+ root.walkAtRules((atRule) => {
108
+ if (atRule.name !== 'media') {
35
109
  return;
36
110
  }
37
- // Only process simple class selectors
38
- const classNameMatch = rule.selector.match(/^\.([a-zA-Z_-][a-zA-Z0-9_-]*)$/);
39
- if (!classNameMatch) {
40
- warnings.push(`Skipped complex selector: ${rule.selector}`);
41
- logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
111
+ const mediaResult = (0, breakpointResolver_1.processMediaQuery)(atRule.params, this.breakpoints);
112
+ if (mediaResult.skipped) {
113
+ warnings.push(mediaResult.reason || `Skipped media query: ${atRule.params}`);
42
114
  return;
43
115
  }
44
- const className = classNameMatch[1];
45
- const declarations = [];
46
- rule.walkDecls((decl) => {
47
- // Skip CSS variables
48
- if (decl.prop.startsWith('--')) {
49
- warnings.push(`Skipped CSS variable: ${decl.prop}`);
50
- return;
116
+ const responsiveVariant = mediaResult.breakpoint;
117
+ const nestedRules = [];
118
+ atRule.walkRules((rule) => {
119
+ nestedRules.push(rule);
120
+ });
121
+ for (const rule of nestedRules) {
122
+ const result = this.processRuleWithVariants(rule, [responsiveVariant]);
123
+ if (result) {
124
+ rules.push(...result.cssRules);
125
+ warnings.push(...result.conversionWarnings);
126
+ const anyConverted = result.cssRules.some(r => r.convertedClasses.length > 0);
127
+ if (anyConverted) {
128
+ hasChanges = true;
129
+ const allFullyConverted = result.cssRules.every(r => r.fullyConverted);
130
+ if (allFullyConverted) {
131
+ rule.remove();
132
+ const classNames = result.cssRules.map(r => r.className).join(', .');
133
+ logger_1.logger.verbose(`Removed rule .${classNames} in @media (min-width) → ${responsiveVariant}`);
134
+ }
135
+ else {
136
+ for (const cr of result.conversionResults.flat()) {
137
+ if (cr.converted) {
138
+ rule.walkDecls((decl) => {
139
+ if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
140
+ decl.remove();
141
+ }
142
+ });
143
+ }
144
+ }
145
+ logger_1.logger.verbose(`Partial conversion in @media → ${responsiveVariant}`);
146
+ }
147
+ }
51
148
  }
52
- // Skip calc()
53
- if (decl.value.includes('calc(')) {
54
- warnings.push(`Skipped calc() value: ${decl.value}`);
55
- return;
149
+ else {
150
+ warnings.push(`Skipped rule in @media: ${rule.selector}`);
56
151
  }
57
- declarations.push({
58
- property: decl.prop,
59
- value: decl.value
60
- });
61
- });
62
- if (declarations.length === 0) {
152
+ }
153
+ if (atRule.nodes && atRule.nodes.length === 0) {
154
+ atRule.remove();
155
+ logger_1.logger.verbose(`Removed empty @media rule`);
156
+ }
157
+ });
158
+ root.walkRules((rule) => {
159
+ if (rule.parent && rule.parent.type === 'atrule') {
63
160
  return;
64
161
  }
65
- // Convert to Tailwind classes - track which specific declarations were converted
66
- const conversionResults = [];
67
- const conversionWarnings = [];
68
- declarations.forEach(decl => {
69
- const result = this.mapper.convertProperty(decl.property, decl.value);
70
- conversionResults.push({
71
- declaration: decl,
72
- converted: !result.skipped && result.className !== null,
73
- className: result.className
74
- });
75
- if (result.skipped && result.reason) {
76
- conversionWarnings.push(result.reason);
162
+ const result = this.processRuleWithVariants(rule);
163
+ if (!result) {
164
+ const parsedSelectors = (0, pseudoSelectorResolver_1.parseMultipleSelectors)(rule.selector);
165
+ const allComplex = parsedSelectors.every(s => s.isComplex);
166
+ if (allComplex) {
167
+ const reasons = parsedSelectors.map(s => s.reason).filter(Boolean);
168
+ warnings.push(...reasons);
169
+ logger_1.logger.verbose(`Skipping complex selector: ${rule.selector}`);
77
170
  }
78
- });
79
- const convertedClasses = conversionResults
80
- .filter(r => r.converted && r.className)
81
- .map(r => r.className);
82
- const allDeclarationsConverted = conversionResults.every(r => r.converted);
83
- const someDeclarationsConverted = convertedClasses.length > 0;
84
- const cssRule = {
85
- selector: rule.selector,
86
- className,
87
- declarations,
88
- convertedClasses,
89
- skipped: !someDeclarationsConverted,
90
- fullyConverted: allDeclarationsConverted,
91
- partialConversion: someDeclarationsConverted && !allDeclarationsConverted,
92
- reason: !someDeclarationsConverted ? 'No convertible declarations' : undefined
93
- };
94
- rules.push(cssRule);
95
- warnings.push(...conversionWarnings);
96
- // CRITICAL FIX: Only remove declarations that were successfully converted
97
- // Never remove the entire rule unless ALL declarations are converted
98
- if (someDeclarationsConverted) {
171
+ return;
172
+ }
173
+ rules.push(...result.cssRules);
174
+ warnings.push(...result.conversionWarnings);
175
+ const anyConverted = result.cssRules.some(r => r.convertedClasses.length > 0);
176
+ if (anyConverted) {
99
177
  hasChanges = true;
100
- if (allDeclarationsConverted) {
101
- // All declarations converted - safe to remove entire rule
178
+ const allFullyConverted = result.cssRules.every(r => r.fullyConverted);
179
+ if (allFullyConverted) {
102
180
  rule.remove();
103
- logger_1.logger.verbose(`Removed rule .${className} (all ${declarations.length} declarations converted)`);
181
+ const classNames = result.cssRules.map(r => r.className).join(', .');
182
+ logger_1.logger.verbose(`Removed rule .${classNames} (all declarations converted)`);
104
183
  }
105
184
  else {
106
- // Partial conversion - only remove the converted declarations
107
- let removedCount = 0;
108
- rule.walkDecls((decl) => {
109
- const wasConverted = conversionResults.some(r => r.converted &&
110
- r.declaration.property === decl.prop &&
111
- r.declaration.value === decl.value);
112
- if (wasConverted) {
113
- decl.remove();
114
- removedCount++;
185
+ for (const cr of result.conversionResults.flat()) {
186
+ if (cr.converted) {
187
+ rule.walkDecls((decl) => {
188
+ if (decl.prop === cr.declaration.property && decl.value === cr.declaration.value) {
189
+ decl.remove();
190
+ }
191
+ });
115
192
  }
116
- });
117
- logger_1.logger.verbose(`Partial conversion of .${className}: removed ${removedCount}/${declarations.length} declarations`);
193
+ }
194
+ logger_1.logger.verbose(`Partial conversion of rule`);
118
195
  }
119
196
  }
120
197
  });
121
- // Clean up empty at-rules
122
198
  root.walkAtRules((atRule) => {
123
199
  if (atRule.nodes && atRule.nodes.length === 0) {
124
200
  atRule.remove();
@@ -142,7 +218,6 @@ class CSSParser {
142
218
  parseInternalStyle(html) {
143
219
  const styles = [];
144
220
  const warnings = [];
145
- // Simple regex to find style tags (this is safe for finding tags, not for parsing content)
146
221
  const styleRegex = /<style[^>]*>([\s\S]*?)<\/style>/gi;
147
222
  let match;
148
223
  while ((match = styleRegex.exec(html)) !== null) {
@@ -160,7 +235,6 @@ class CSSParser {
160
235
  let modifiedHtml = html;
161
236
  let hasChanges = false;
162
237
  const { styles } = this.parseInternalStyle(html);
163
- // Process styles in reverse order to preserve indices
164
238
  for (let i = styles.length - 1; i >= 0; i--) {
165
239
  const style = styles[i];
166
240
  try {
@@ -170,11 +244,9 @@ class CSSParser {
170
244
  if (result.hasChanges) {
171
245
  hasChanges = true;
172
246
  if (result.canDelete || result.css.trim() === '') {
173
- // Remove entire style tag
174
247
  modifiedHtml = modifiedHtml.slice(0, style.start) + modifiedHtml.slice(style.end);
175
248
  }
176
249
  else {
177
- // Replace style content
178
250
  const before = modifiedHtml.slice(0, style.start);
179
251
  const after = modifiedHtml.slice(style.end);
180
252
  const tagStart = html.slice(style.start).match(/<style[^>]*>/)?.[0] || '<style>';
@@ -197,13 +269,11 @@ class CSSParser {
197
269
  }
198
270
  extractImportPaths(code) {
199
271
  const imports = [];
200
- // Match CSS imports
201
272
  const importRegex = /import\s+['"]([^'"]+\.css)['"];?/g;
202
273
  let match;
203
274
  while ((match = importRegex.exec(code)) !== null) {
204
275
  imports.push(match[1]);
205
276
  }
206
- // Match require statements
207
277
  const requireRegex = /require\s*\(\s*['"]([^'"]+\.css)['"]\s*\)/g;
208
278
  while ((match = requireRegex.exec(code)) !== null) {
209
279
  imports.push(match[1]);
@@ -212,4 +282,4 @@ class CSSParser {
212
282
  }
213
283
  }
214
284
  exports.CSSParser = CSSParser;
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQXlCeEMsTUFBYSxTQUFTO0lBR3BCLFlBQVksTUFBc0I7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBVyxFQUFFLFFBQWdCO1FBQ3ZDLE1BQU0sS0FBSyxHQUFjLEVBQUUsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDOUIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXZCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxpQkFBTyxHQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDeEMsTUFBTSxFQUFFLDZCQUFVO2dCQUNsQixJQUFJLEVBQUUsUUFBUTthQUNmLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0Isb0JBQW9CO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdEIsNENBQTRDO2dCQUM1QyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2pELFFBQVEsQ0FBQyxJQUFJLENBQUMscUNBQXFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUNwRSxlQUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDckQsT0FBTztnQkFDVCxDQUFDO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxJQUFJLENBQUMs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biwgQXRSdWxlIH0gZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgc2FmZVBhcnNlciBmcm9tICdwb3N0Y3NzLXNhZmUtcGFyc2VyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyLCBDU1NQcm9wZXJ0eSB9IGZyb20gJy4vdGFpbHdpbmRNYXBwZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIENTU1J1bGUge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdO1xuICBjb252ZXJ0ZWRDbGFzc2VzOiBzdHJpbmdbXTtcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgZnVsbHlDb252ZXJ0ZWQ6IGJvb2xlYW47IC8vIE5FVzogdHJ1ZSBpZiBBTEwgZGVjbGFyYXRpb25zIGluIHRoaXMgcnVsZSB3ZXJlIGNvbnZlcnRlZFxuICBwYXJ0aWFsQ29udmVyc2lvbjogYm9vbGVhbjsgLy8gTkVXOiB0cnVlIGlmIFNPTUUgYnV0IG5vdCBhbGwgZGVjbGFyYXRpb25zIHdlcmUgY29udmVydGVkXG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU1NQYXJzZVJlc3VsdCB7XG4gIGNzczogc3RyaW5nO1xuICBydWxlczogQ1NTUnVsZVtdO1xuICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICBjYW5EZWxldGU6IGJvb2xlYW47XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDU1NVc2FnZU1hcCB7XG4gIFtjbGFzc05hbWU6IHN0cmluZ106IHN0cmluZ1tdOyAvLyBjbGFzc05hbWUgLT4gZmlsZSBwYXRoc1xufVxuXG5leHBvcnQgY2xhc3MgQ1NTUGFyc2VyIHtcbiAgcHJpdmF0ZSBtYXBwZXI6IFRhaWx3aW5kTWFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIpIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlKGNzczogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxDU1NQYXJzZVJlc3VsdD4ge1xuICAgIGNvbnN0IHJ1bGVzOiBDU1NSdWxlW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvb3QgPSBhd2FpdCBwb3N0Y3NzKCkucHJvY2Vzcyhjc3MsIHtcbiAgICAgICAgcGFyc2VyOiBzYWZlUGFyc2VyLFxuICAgICAgICBmcm9tOiBmaWxlUGF0aFxuICAgICAgfSkudGhlbihyZXN1bHQgPT4gcmVzdWx0LnJvb3QpO1xuXG4gICAgICAvLyBQcm9jZXNzIGVhY2ggcnVsZVxuICAgICAgcm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgICAgLy8gU2tpcCBydWxlcyBpbnNpZGUgQG1lZGlhLCBAc3VwcG9ydHMsIGV0Yy5cbiAgICAgICAgaWYgKHJ1bGUucGFyZW50ICYmIHJ1bGUucGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBydWxlIHdpdGggYXQtcnVsZSBwYXJlbnQ6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgU2tpcHBpbmcgYXQtcnVsZTogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgcHNldWRvLXNlbGVjdG9yc1xuICAgICAgICBpZiAocnVsZS5zZWxlY3Rvci5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBwc2V1ZG8tc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgU2tpcHBpbmcgcHNldWRvLXNlbGVjdG9yOiAke3J1bGUuc2VsZWN0b3J9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIHNpbXBsZSBjbGFzcyBzZWxlY3RvcnNcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lTWF0Y2ggPSBydWxlLnNlbGVjdG9yLm1hdGNoKC9eXFwuKFthLXpBLVpfLV1bYS16QS1aMC05Xy1dKikkLyk7XG4gICAgICAgIGlmICghY2xhc3NOYW1lTWF0Y2gpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKGBTa2lwcGVkIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgU2tpcHBpbmcgY29tcGxleCBzZWxlY3RvcjogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTmFtZU1hdGNoWzFdO1xuICAgICAgICBjb25zdCBkZWNsYXJhdGlvbnM6IENTU1Byb3BlcnR5W10gPSBbXTtcblxuICAgICAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgICAgIC8vIFNraXAgQ1NTIHZhcmlhYmxlc1xuICAgICAgICAgIGlmIChkZWNsLnByb3Auc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBDU1MgdmFyaWFibGU6ICR7ZGVjbC5wcm9wfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNraXAgY2FsYygpXG4gICAgICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYFNraXBwZWQgY2FsYygpIHZhbHVlOiAke2RlY2wudmFsdWV9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydHk6IGRlY2wucHJvcCxcbiAgICAgICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCB0byBUYWlsd2luZCBjbGFzc2VzIC0gdHJhY2sgd2hpY2ggc3BlY2lmaWMgZGVjbGFyYXRpb25zIHdlcmUgY29udmVydGVkXG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7XG4gICAgICAgICAgZGVjbGFyYXRpb246IENTU1Byb3BlcnR5O1xuICAgICAgICAgIGNvbnZlcnRlZDogYm9vbGVhbjtcbiAgICAgICAgICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIH0+ID0gW107XG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hcHBlci5jb252ZXJ0UHJvcGVydHkoZGVjbC5wcm9wZXJ0eSwgZGVjbC52YWx1ZSk7XG4gICAgICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbjogZGVjbCxcbiAgICAgICAgICAgIGNvbnZlcnRlZDogIXJlc3VsdC5za2lwcGVkICYmIHJlc3VsdC5jbGFzc05hbWUgIT09IG51bGwsXG4gICAgICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5jbGFzc05hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0LnNraXBwZWQgJiYgcmVzdWx0LnJlYXNvbikge1xuICAgICAgICAgICAgY29udmVyc2lvbldhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb252ZXJ0ZWRDbGFzc2VzID0gY29udmVyc2lvblJlc3VsdHNcbiAgICAgICAgICAuZmlsdGVyKHIgPT4gci5jb252ZXJ0ZWQgJiYgci5jbGFzc05hbWUpXG4gICAgICAgICAgLm1hcChyID0+IHIuY2xhc3NOYW1lISk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPSBjb252ZXJzaW9uUmVzdWx0cy5ldmVyeShyID0+IHIuY29udmVydGVkKTtcbiAgICAgICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgICAgICBjb25zdCBjc3NSdWxlOiBDU1NSdWxlID0ge1xuICAgICAgICAgIHNlbGVjdG9yOiBydWxlLnNlbGVjdG9yLFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBkZWNsYXJhdGlvbnMsXG4gICAgICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgICBza2lwcGVkOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCxcbiAgICAgICAgICBmdWxseUNvbnZlcnRlZDogYWxsRGVjbGFyYXRpb25zQ29udmVydGVkLFxuICAgICAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgICAgcmVhc29uOiAhc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA/ICdObyBjb252ZXJ0aWJsZSBkZWNsYXJhdGlvbnMnIDogdW5kZWZpbmVkXG4gICAgICAgIH07XG5cbiAgICAgICAgcnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIC8vIENSSVRJQ0FMIEZJWDogT25seSByZW1vdmUgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgY29udmVydGVkXG4gICAgICAgIC8vIE5ldmVyIHJlbW92ZSB0aGUgZW50aXJlIHJ1bGUgdW5sZXNzIEFMTCBkZWNsYXJhdGlvbnMgYXJlIGNvbnZlcnRlZFxuICAgICAgICBpZiAoc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCkge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQpIHtcbiAgICAgICAgICAgIC8vIEFsbCBkZWNsYXJhdGlvbnMgY29udmVydGVkIC0gc2FmZSB0byByZW1vdmUgZW50aXJlIHJ1bGVcbiAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBydWxlIC4ke2NsYXNzTmFtZX0gKGFsbCAke2RlY2xhcmF0aW9ucy5sZW5ndGh9IGRlY2xhcmF0aW9ucyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFBhcnRpYWwgY29udmVyc2lvbiAtIG9ubHkgcmVtb3ZlIHRoZSBjb252ZXJ0ZWQgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcbiAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdhc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLnNvbWUociA9PiBcbiAgICAgICAgICAgICAgICByLmNvbnZlcnRlZCAmJiBcbiAgICAgICAgICAgICAgICByLmRlY2xhcmF0aW9uLnByb3BlcnR5ID09PSBkZWNsLnByb3AgJiYgXG4gICAgICAgICAgICAgICAgci5kZWNsYXJhdGlvbi52YWx1ZSA9PT0gZGVjbC52YWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYgKHdhc0NvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUGFydGlhbCBjb252ZXJzaW9uIG9mIC4ke2NsYXNzTmFtZX06IHJlbW92ZWQgJHtyZW1vdmVkQ291bnR9LyR7ZGVjbGFyYXRpb25zLmxlbmd0aH0gZGVjbGFyYXRpb25zYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ2xlYW4gdXAgZW1wdHkgYXQtcnVsZXNcbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW5EZWxldGUgPSByb290Lm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIGNvbnN0IG5ld0NzcyA9IHJvb3QudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBuZXdDc3MsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICBjYW5EZWxldGUsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIENTUyAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENTUyBwYXJzaW5nIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUludGVybmFsU3R5bGUoaHRtbDogc3RyaW5nKTogeyBcbiAgICBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHN0eWxlczogQXJyYXk8eyBjb250ZW50OiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBTaW1wbGUgcmVnZXggdG8gZmluZCBzdHlsZSB0YWdzICh0aGlzIGlzIHNhZmUgZm9yIGZpbmRpbmcgdGFncywgbm90IGZvciBwYXJzaW5nIGNvbnRlbnQpXG4gICAgY29uc3Qgc3R5bGVSZWdleCA9IC88c3R5bGVbXj5dKj4oW1xcc1xcU10qPyk8XFwvc3R5bGU+L2dpO1xuICAgIGxldCBtYXRjaDtcblxuICAgIHdoaWxlICgobWF0Y2ggPSBzdHlsZVJlZ2V4LmV4ZWMoaHRtbCkpICE9PSBudWxsKSB7XG4gICAgICBzdHlsZXMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IG1hdGNoWzFdLnRyaW0oKSxcbiAgICAgICAgc3RhcnQ6IG1hdGNoLmluZGV4LFxuICAgICAgICBlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdHlsZXMsIHdhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBwYXJzZUludGVybmFsQ1NTKGh0bWw6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGh0bWw6IHN0cmluZztcbiAgICBydWxlczogQ1NTUnVsZVtdO1xuICAgIGhhc0NoYW5nZXM6IGJvb2xlYW47XG4gICAgd2FybmluZ3M6IHN0cmluZ1tdO1xuICB9PiB7XG4gICAgY29uc3QgYWxsUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtb2RpZmllZEh0bWwgPSBodG1sO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBjb25zdCB7IHN0eWxlcyB9ID0gdGhpcy5wYXJzZUludGVybmFsU3R5bGUoaHRtbCk7XG5cbiAgICAvLyBQcm9jZXNzIHN0eWxlcyBpbiByZXZlcnNlIG9yZGVyIHRvIHByZXNlcnZlIGluZGljZXNcbiAgICBmb3IgKGxldCBpID0gc3R5bGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHN0eWxlc1tpXTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYXJzZShzdHlsZS5jb250ZW50LCBmaWxlUGF0aCk7XG4gICAgICAgIFxuICAgICAgICBhbGxSdWxlcy5wdXNoKC4uLnJlc3VsdC5ydWxlcyk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goLi4ucmVzdWx0Lndhcm5pbmdzKTtcblxuICAgICAgICBpZiAocmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuY2FuRGVsZXRlIHx8IHJlc3VsdC5jc3MudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGVudGlyZSBzdHlsZSB0YWdcbiAgICAgICAgICAgIG1vZGlmaWVkSHRtbCA9IG1vZGlmaWVkSHRtbC5zbGljZSgwLCBzdHlsZS5zdGFydCkgKyBtb2RpZmllZEh0bWwuc2xpY2Uoc3R5bGUuZW5kKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSBzdHlsZSBjb250ZW50XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSBtb2RpZmllZEh0bWwuc2xpY2Uoc3R5bGUuZW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ1N0YXJ0ID0gaHRtbC5zbGljZShzdHlsZS5zdGFydCkubWF0Y2goLzxzdHlsZVtePl0qPi8pPy5bMF0gfHwgJzxzdHlsZT4nO1xuICAgICAgICAgICAgY29uc3QgdGFnRW5kID0gJzwvc3R5bGU+JztcbiAgICAgICAgICAgIG1vZGlmaWVkSHRtbCA9IGJlZm9yZSArIHRhZ1N0YXJ0ICsgJ1xcbicgKyByZXN1bHQuY3NzICsgJ1xcbicgKyB0YWdFbmQgKyBhZnRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgc3R5bGUgYmxvY2s6ICR7ZXJyb3J9YCk7XG4gICAgICAgIGFsbFdhcm5pbmdzLnB1c2goYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZTogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaHRtbDogbW9kaWZpZWRIdG1sLFxuICAgICAgcnVsZXM6IGFsbFJ1bGVzLFxuICAgICAgaGFzQ2hhbmdlcyxcbiAgICAgIHdhcm5pbmdzOiBhbGxXYXJuaW5nc1xuICAgIH07XG4gIH1cblxuICBleHRyYWN0SW1wb3J0UGF0aHMoY29kZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgLy8gTWF0Y2ggQ1NTIGltcG9ydHNcbiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRcXHMrWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXTs/L2c7XG4gICAgbGV0IG1hdGNoO1xuICAgIFxuICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICAvLyBNYXRjaCByZXF1aXJlIHN0YXRlbWVudHNcbiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXVxccypcXCkvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRzO1xuICB9XG59XG4iXX0=
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NzUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nzc1BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzREFBbUU7QUFDbkUsOEVBQTZDO0FBRTdDLDJDQUF3QztBQUN4QyxtRUFLb0M7QUFDcEMsMkVBSXdDO0FBQ3hDLCtEQU1rQztBQStCbEMsTUFBYSxTQUFTO0lBSXBCLFlBQVksTUFBc0IsRUFBRSxPQUFtRDtRQUNyRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU87WUFDeEIsQ0FBQyxDQUFDLElBQUEsaURBQTRCLEVBQUMsT0FBTyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxJQUFBLG1DQUFjLEdBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sbUJBQW1CLENBQUMsWUFBMkI7UUFLckQsTUFBTSxpQkFBaUIsR0FJbEIsRUFBRSxDQUFDO1FBQ1IsTUFBTSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7UUFFeEMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSTtnQkFDdkQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2FBQzVCLENBQUMsQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekMs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LENBQUMsbUNBQW1DLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0QsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLFlBQVk7WUFDbEIsS0FBSyxFQUFFLFFBQVE7WUFDZixVQUFVO1lBQ1YsUUFBUSxFQUFFLFdBQVc7U0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFZO1FBQzdCLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztRQUU3QixNQUFNLFdBQVcsR0FBRyxtQ0FBbUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQztRQUVWLE9BQU8sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLDRDQUE0QyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQTNWRCw4QkEyVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcG9zdGNzcywgeyBSb290LCBSdWxlLCBEZWNsYXJhdGlvbiwgQXRSdWxlIH0gZnJvbSAncG9zdGNzcyc7XG5pbXBvcnQgc2FmZVBhcnNlciBmcm9tICdwb3N0Y3NzLXNhZmUtcGFyc2VyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyLCBDU1NQcm9wZXJ0eSB9IGZyb20gJy4vdGFpbHdpbmRNYXBwZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgXG4gIEJyZWFrcG9pbnQsIFxuICBnZXRCcmVha3BvaW50cywgXG4gIHJlc29sdmVCcmVha3BvaW50c0Zyb21Db25maWcsXG4gIHByb2Nlc3NNZWRpYVF1ZXJ5IFxufSBmcm9tICcuL3V0aWxzL2JyZWFrcG9pbnRSZXNvbHZlcic7XG5pbXBvcnQge1xuICBwcm9jZXNzUHNldWRvU2VsZWN0b3IsXG4gIHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMsXG4gIFBhcnNlZFNlbGVjdG9yXG59IGZyb20gJy4vdXRpbHMvcHNldWRvU2VsZWN0b3JSZXNvbHZlcic7XG5pbXBvcnQge1xuICBhc3NlbWJsZVV0aWxpdHksXG4gIGFzc2VtYmxlVXRpbGl0aWVzLFxuICBNZXJnZWRVdGlsaXR5LFxuICBtZXJnZVV0aWxpdGllcyxcbiAgbm9ybWFsaXplVmFyaWFudE9yZGVyXG59IGZyb20gJy4vdXRpbHMvdmFyaWFudEFzc2VtYmxlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXRpbGl0eVdpdGhWYXJpYW50IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgdmFyaWFudHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENTU1J1bGUge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdO1xuICBjb252ZXJ0ZWRDbGFzc2VzOiBzdHJpbmdbXTtcbiAgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aFZhcmlhbnRbXTtcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgZnVsbHlDb252ZXJ0ZWQ6IGJvb2xlYW47XG4gIHBhcnRpYWxDb252ZXJzaW9uOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUGFyc2VSZXN1bHQge1xuICBjc3M6IHN0cmluZztcbiAgcnVsZXM6IENTU1J1bGVbXTtcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FuRGVsZXRlOiBib29sZWFuO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTVXNhZ2VNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENTU1BhcnNlciB7XG4gIHByaXZhdGUgbWFwcGVyOiBUYWlsd2luZE1hcHBlcjtcbiAgcHJpdmF0ZSBicmVha3BvaW50czogQnJlYWtwb2ludFtdO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIsIHNjcmVlbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddPikge1xuICAgIHRoaXMubWFwcGVyID0gbWFwcGVyO1xuICAgIHRoaXMuYnJlYWtwb2ludHMgPSBzY3JlZW5zIFxuICAgICAgPyByZXNvbHZlQnJlYWtwb2ludHNGcm9tQ29uZmlnKHNjcmVlbnMpIFxuICAgICAgOiBnZXRCcmVha3BvaW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9uczogQ1NTUHJvcGVydHlbXSk6IHtcbiAgICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdO1xuICAgIGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgY29udmVyc2lvblJlc3VsdHM6IEFycmF5PHtcbiAgICAgIGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTtcbiAgICAgIGNvbnZlcnRlZDogYm9vbGVhbjtcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICB9PiA9IFtdO1xuICAgIGNvbnN0IGNvbnZlcnNpb25XYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2wgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tYXBwZXIuY29udmVydFByb3BlcnR5KGRlY2wucHJvcGVydHksIGRlY2wudmFsdWUpO1xuICAgICAgY29udmVyc2lvblJlc3VsdHMucHVzaCh7XG4gICAgICAgIGRlY2xhcmF0aW9uOiBkZWNsLFxuICAgICAgICBjb252ZXJ0ZWQ6ICFyZXN1bHQuc2tpcHBlZCAmJiByZXN1bHQuY2xhc3NOYW1lICE9PSBudWxsLFxuICAgICAgICBjbGFzc05hbWU6IHJlc3VsdC5jbGFzc05hbWVcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5za2lwcGVkICYmIHJlc3VsdC5yZWFzb24pIHtcbiAgICAgICAgY29udmVyc2lvbldhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoVmFyaWFudFtdID0gY29udmVyc2lvblJlc3VsdHNcbiAgICAgIC5maWx0ZXIociA9PiByLmNvbnZlcnRlZCAmJiByLmNsYXNzTmFtZSlcbiAgICAgIC5tYXAociA9PiAoe1xuICAgICAgICB2YWx1ZTogci5jbGFzc05hbWUhLFxuICAgICAgICB2YXJpYW50czogW11cbiAgICAgIH0pKTtcblxuICAgIHJldHVybiB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzUnVsZVdpdGhWYXJpYW50cyhcbiAgICBydWxlOiBSdWxlLFxuICAgIGFkZGl0aW9uYWxWYXJpYW50czogc3RyaW5nW10gPSBbXVxuICApOiB7IGNzc1J1bGVzOiBDU1NSdWxlW107IGNvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXTsgY29udmVyc2lvbldhcm5pbmdzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgIGNvbnN0IHBhcnNlZFNlbGVjdG9ycyA9IHBhcnNlTXVsdGlwbGVTZWxlY3RvcnMoc2VsZWN0b3IpO1xuICAgIFxuICAgIGNvbnN0IHZhbGlkU2VsZWN0b3JzID0gcGFyc2VkU2VsZWN0b3JzLmZpbHRlcihzID0+ICFzLmlzQ29tcGxleCAmJiBzLmJhc2VDbGFzcyk7XG4gICAgXG4gICAgaWYgKHZhbGlkU2VsZWN0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyYXRpb25zOiBDU1NQcm9wZXJ0eVtdID0gW107XG5cbiAgICBydWxlLndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgaWYgKGRlY2wucHJvcC5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlY2wudmFsdWUuaW5jbHVkZXMoJ2NhbGMoJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICAgIHByb3BlcnR5OiBkZWNsLnByb3AsXG4gICAgICAgIHZhbHVlOiBkZWNsLnZhbHVlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHV0aWxpdGllcywgY29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9ID0gdGhpcy5jb252ZXJ0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucyk7XG4gICAgXG4gICAgY29uc3QgdXRpbGl0aWVzV2l0aFZhcmlhbnRzID0gdXRpbGl0aWVzLm1hcCh1ID0+ICh7XG4gICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnUudmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY3NzUnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IGFsbENvbnZlcnNpb25SZXN1bHRzOiBBcnJheTx7IGRlY2xhcmF0aW9uOiBDU1NQcm9wZXJ0eTsgY29udmVydGVkOiBib29sZWFuOyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgfT5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwYXJzZWQgb2YgdmFsaWRTZWxlY3RvcnMpIHtcbiAgICAgIGNvbnN0IHBzZXVkb1ZhcmlhbnRzID0gcGFyc2VkLnBzZXVkb3MgfHwgW107XG4gICAgICBjb25zdCBhbGxWYXJpYW50cyA9IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4ucHNldWRvVmFyaWFudHMsIC4uLmFkZGl0aW9uYWxWYXJpYW50c10pO1xuICAgICAgXG4gICAgICBjb25zdCB1dGlsaXRpZXNGb3JTZWxlY3RvciA9IHV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgICAgdmFyaWFudHM6IGFsbFZhcmlhbnRzXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGNvbnZlcnRlZENsYXNzZXMgPSBhc3NlbWJsZVV0aWxpdGllcyh1dGlsaXRpZXNGb3JTZWxlY3Rvcik7XG5cbiAgICAgIGNvbnN0IGFsbERlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnNpb25SZXN1bHRzLmV2ZXJ5KHIgPT4gci5jb252ZXJ0ZWQpO1xuICAgICAgY29uc3Qgc29tZURlY2xhcmF0aW9uc0NvbnZlcnRlZCA9IGNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMDtcblxuICAgICAgY29uc3QgY3NzUnVsZTogQ1NTUnVsZSA9IHtcbiAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICBjbGFzc05hbWU6IHBhcnNlZC5iYXNlQ2xhc3MsXG4gICAgICAgIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgY29udmVydGVkQ2xhc3NlcyxcbiAgICAgICAgdXRpbGl0aWVzOiB1dGlsaXRpZXNGb3JTZWxlY3RvcixcbiAgICAgICAgc2tpcHBlZDogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIGZ1bGx5Q29udmVydGVkOiBhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHBhcnRpYWxDb252ZXJzaW9uOiBzb21lRGVjbGFyYXRpb25zQ29udmVydGVkICYmICFhbGxEZWNsYXJhdGlvbnNDb252ZXJ0ZWQsXG4gICAgICAgIHJlYXNvbjogIXNvbWVEZWNsYXJhdGlvbnNDb252ZXJ0ZWQgPyAnTm8gY29udmVydGlibGUgZGVjbGFyYXRpb25zJyA6IHVuZGVmaW5lZFxuICAgICAgfTtcblxuICAgICAgY3NzUnVsZXMucHVzaChjc3NSdWxlKTtcbiAgICAgIGFsbENvbnZlcnNpb25SZXN1bHRzLnB1c2goY29udmVyc2lvblJlc3VsdHMpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNzc1J1bGVzLCBjb252ZXJzaW9uUmVzdWx0czogYWxsQ29udmVyc2lvblJlc3VsdHMsIGNvbnZlcnNpb25XYXJuaW5ncyB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2UoY3NzOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENTU1BhcnNlUmVzdWx0PiB7XG4gICAgY29uc3QgcnVsZXM6IENTU1J1bGVbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9vdCA9IGF3YWl0IHBvc3Rjc3MoKS5wcm9jZXNzKGNzcywge1xuICAgICAgICBwYXJzZXI6IHNhZmVQYXJzZXIsXG4gICAgICAgIGZyb206IGZpbGVQYXRoXG4gICAgICB9KS50aGVuKHJlc3VsdCA9PiByZXN1bHQucm9vdCk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5hbWUgIT09ICdtZWRpYScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZWRpYVJlc3VsdCA9IHByb2Nlc3NNZWRpYVF1ZXJ5KGF0UnVsZS5wYXJhbXMsIHRoaXMuYnJlYWtwb2ludHMpO1xuXG4gICAgICAgIGlmIChtZWRpYVJlc3VsdC5za2lwcGVkKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaChtZWRpYVJlc3VsdC5yZWFzb24gfHwgYFNraXBwZWQgbWVkaWEgcXVlcnk6ICR7YXRSdWxlLnBhcmFtc31gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zaXZlVmFyaWFudCA9IG1lZGlhUmVzdWx0LmJyZWFrcG9pbnQhO1xuXG4gICAgICAgIGNvbnN0IG5lc3RlZFJ1bGVzOiBSdWxlW10gPSBbXTtcbiAgICAgICAgYXRSdWxlLndhbGtSdWxlcygocnVsZSkgPT4ge1xuICAgICAgICAgIG5lc3RlZFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBuZXN0ZWRSdWxlcykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvY2Vzc1J1bGVXaXRoVmFyaWFudHMocnVsZSwgW3Jlc3BvbnNpdmVWYXJpYW50XSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCguLi5yZXN1bHQuY3NzUnVsZXMpO1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaCguLi5yZXN1bHQuY29udmVyc2lvbldhcm5pbmdzKTtcblxuICAgICAgICAgICAgY29uc3QgYW55Q29udmVydGVkID0gcmVzdWx0LmNzc1J1bGVzLnNvbWUociA9PiByLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICBpZiAoYW55Q29udmVydGVkKSB7XG4gICAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGFsbEZ1bGx5Q29udmVydGVkID0gcmVzdWx0LmNzc1J1bGVzLmV2ZXJ5KHIgPT4gci5mdWxseUNvbnZlcnRlZCk7XG4gICAgICAgICAgICAgIGlmIChhbGxGdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgICAgIHJ1bGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IHJlc3VsdC5jc3NSdWxlcy5tYXAociA9PiByLmNsYXNzTmFtZSkuam9pbignLCAuJyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgcnVsZSAuJHtjbGFzc05hbWVzfSBpbiBAbWVkaWEgKG1pbi13aWR0aCkg4oaSICR7cmVzcG9uc2l2ZVZhcmlhbnR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjciBvZiByZXN1bHQuY29udmVyc2lvblJlc3VsdHMuZmxhdCgpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUud2Fsa0RlY2xzKChkZWNsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2wucHJvcCA9PT0gY3IuZGVjbGFyYXRpb24ucHJvcGVydHkgJiYgZGVjbC52YWx1ZSA9PT0gY3IuZGVjbGFyYXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFBhcnRpYWwgY29udmVyc2lvbiBpbiBAbWVkaWEg4oaSICR7cmVzcG9uc2l2ZVZhcmlhbnR9YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2FybmluZ3MucHVzaChgU2tpcHBlZCBydWxlIGluIEBtZWRpYTogJHtydWxlLnNlbGVjdG9yfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhdFJ1bGUubm9kZXMgJiYgYXRSdWxlLm5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF0UnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVtb3ZlZCBlbXB0eSBAbWVkaWEgcnVsZWApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICAgICAgaWYgKHJ1bGUucGFyZW50ICYmIHJ1bGUucGFyZW50LnR5cGUgPT09ICdhdHJ1bGUnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9jZXNzUnVsZVdpdGhWYXJpYW50cyhydWxlKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkU2VsZWN0b3JzID0gcGFyc2VNdWx0aXBsZVNlbGVjdG9ycyhydWxlLnNlbGVjdG9yKTtcbiAgICAgICAgICBjb25zdCBhbGxDb21wbGV4ID0gcGFyc2VkU2VsZWN0b3JzLmV2ZXJ5KHMgPT4gcy5pc0NvbXBsZXgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhbGxDb21wbGV4KSB7XG4gICAgICAgICAgICBjb25zdCByZWFzb25zID0gcGFyc2VkU2VsZWN0b3JzLm1hcChzID0+IHMucmVhc29uKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnJlYXNvbnMgYXMgc3RyaW5nW10pO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFNraXBwaW5nIGNvbXBsZXggc2VsZWN0b3I6ICR7cnVsZS5zZWxlY3Rvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVsZXMucHVzaCguLi5yZXN1bHQuY3NzUnVsZXMpO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnJlc3VsdC5jb252ZXJzaW9uV2FybmluZ3MpO1xuXG4gICAgICAgIGNvbnN0IGFueUNvbnZlcnRlZCA9IHJlc3VsdC5jc3NSdWxlcy5zb21lKHIgPT4gci5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoYW55Q29udmVydGVkKSB7XG4gICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG5cbiAgICAgICAgICBjb25zdCBhbGxGdWxseUNvbnZlcnRlZCA9IHJlc3VsdC5jc3NSdWxlcy5ldmVyeShyID0+IHIuZnVsbHlDb252ZXJ0ZWQpO1xuICAgICAgICAgIGlmIChhbGxGdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSByZXN1bHQuY3NzUnVsZXMubWFwKHIgPT4gci5jbGFzc05hbWUpLmpvaW4oJywgLicpO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlbW92ZWQgcnVsZSAuJHtjbGFzc05hbWVzfSAoYWxsIGRlY2xhcmF0aW9ucyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Igb2YgcmVzdWx0LmNvbnZlcnNpb25SZXN1bHRzLmZsYXQoKSkge1xuICAgICAgICAgICAgICBpZiAoY3IuY29udmVydGVkKSB7XG4gICAgICAgICAgICAgICAgcnVsZS53YWxrRGVjbHMoKGRlY2wpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChkZWNsLnByb3AgPT09IGNyLmRlY2xhcmF0aW9uLnByb3BlcnR5ICYmIGRlY2wudmFsdWUgPT09IGNyLmRlY2xhcmF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBQYXJ0aWFsIGNvbnZlcnNpb24gb2YgcnVsZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJvb3Qud2Fsa0F0UnVsZXMoKGF0UnVsZSkgPT4ge1xuICAgICAgICBpZiAoYXRSdWxlLm5vZGVzICYmIGF0UnVsZS5ub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjYW5EZWxldGUgPSByb290Lm5vZGVzLmxlbmd0aCA9PT0gMDtcbiAgICAgIGNvbnN0IG5ld0NzcyA9IHJvb3QudG9TdHJpbmcoKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBuZXdDc3MsXG4gICAgICAgIHJ1bGVzLFxuICAgICAgICBoYXNDaGFuZ2VzLFxuICAgICAgICBjYW5EZWxldGUsXG4gICAgICAgIHdhcm5pbmdzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIENTUyAke2ZpbGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENTUyBwYXJzaW5nIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwYXJzZUludGVybmFsU3R5bGUoaHRtbDogc3RyaW5nKTogeyBcbiAgICBzdHlsZXM6IEFycmF5PHsgY29udGVudDogc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0ge1xuICAgIGNvbnN0IHN0eWxlczogQXJyYXk8eyBjb250ZW50OiBzdHJpbmc7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBzdHlsZVJlZ2V4ID0gLzxzdHlsZVtePl0qPihbXFxzXFxTXSo/KTxcXC9zdHlsZT4vZ2k7XG4gICAgbGV0IG1hdGNoO1xuXG4gICAgd2hpbGUgKChtYXRjaCA9IHN0eWxlUmVnZXguZXhlYyhodG1sKSkgIT09IG51bGwpIHtcbiAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgY29udGVudDogbWF0Y2hbMV0udHJpbSgpLFxuICAgICAgICBzdGFydDogbWF0Y2guaW5kZXgsXG4gICAgICAgIGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0eWxlcywgd2FybmluZ3MgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlSW50ZXJuYWxDU1MoaHRtbDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaHRtbDogc3RyaW5nO1xuICAgIHJ1bGVzOiBDU1NSdWxlW107XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBhbGxSdWxlczogQ1NTUnVsZVtdID0gW107XG4gICAgY29uc3QgYWxsV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG1vZGlmaWVkSHRtbCA9IGh0bWw7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHsgc3R5bGVzIH0gPSB0aGlzLnBhcnNlSW50ZXJuYWxTdHlsZShodG1sKTtcblxuICAgIGZvciAobGV0IGkgPSBzdHlsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhcnNlKHN0eWxlLmNvbnRlbnQsIGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIGFsbFJ1bGVzLnB1c2goLi4ucmVzdWx0LnJ1bGVzKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaCguLi5yZXN1bHQud2FybmluZ3MpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC5jYW5EZWxldGUgfHwgcmVzdWx0LmNzcy50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICBtb2RpZmllZEh0bWwgPSBtb2RpZmllZEh0bWwuc2xpY2UoMCwgc3R5bGUuc3RhcnQpICsgbW9kaWZpZWRIdG1sLnNsaWNlKHN0eWxlLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IG1vZGlmaWVkSHRtbC5zbGljZSgwLCBzdHlsZS5zdGFydCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IG1vZGlmaWVkSHRtbC5zbGljZShzdHlsZS5lbmQpO1xuICAgICAgICAgICAgY29uc3QgdGFnU3RhcnQgPSBodG1sLnNsaWNlKHN0eWxlLnN0YXJ0KS5tYXRjaCgvPHN0eWxlW14+XSo+Lyk/LlswXSB8fCAnPHN0eWxlPic7XG4gICAgICAgICAgICBjb25zdCB0YWdFbmQgPSAnPC9zdHlsZT4nO1xuICAgICAgICAgICAgbW9kaWZpZWRIdG1sID0gYmVmb3JlICsgdGFnU3RhcnQgKyAnXFxuJyArIHJlc3VsdC5jc3MgKyAnXFxuJyArIHRhZ0VuZCArIGFmdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBzdHlsZSBibG9jazogJHtlcnJvcn1gKTtcbiAgICAgICAgYWxsV2FybmluZ3MucHVzaChgRmFpbGVkIHRvIHBhcnNlIGludGVybmFsIHN0eWxlOiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBodG1sOiBtb2RpZmllZEh0bWwsXG4gICAgICBydWxlczogYWxsUnVsZXMsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgd2FybmluZ3M6IGFsbFdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIGV4dHJhY3RJbXBvcnRQYXRocyhjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBjb25zdCBpbXBvcnRSZWdleCA9IC9pbXBvcnRcXHMrWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXTs/L2c7XG4gICAgbGV0IG1hdGNoO1xuICAgIFxuICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1aXJlUmVnZXggPSAvcmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdK1xcLmNzcylbJ1wiXVxccypcXCkvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVxdWlyZVJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgICBpbXBvcnRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbXBvcnRzO1xuICB9XG59Il19
@@ -0,0 +1,15 @@
1
+ import { TailwindMapper } from './tailwindMapper';
2
+ export interface HTMLParseResult {
3
+ html: string;
4
+ hasChanges: boolean;
5
+ conversions: number;
6
+ warnings: string[];
7
+ }
8
+ export declare class HTMLParser {
9
+ private mapper;
10
+ constructor(mapper: TailwindMapper);
11
+ parse(html: string, filePath: string): HTMLParseResult;
12
+ private parseInlineStyle;
13
+ private mergeClasses;
14
+ extractStylesheets(html: string): string[];
15
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HTMLParser = void 0;
4
+ class HTMLParser {
5
+ constructor(mapper) {
6
+ this.mapper = mapper;
7
+ }
8
+ parse(html, filePath) {
9
+ const warnings = [];
10
+ let hasChanges = false;
11
+ let conversions = 0;
12
+ // Parse inline styles: style="display: flex; padding: 16px;"
13
+ // Convert to: class="flex p-4"
14
+ const styleRegex = /style="([^"]*)"/g;
15
+ let modifiedHtml = html;
16
+ let match;
17
+ while ((match = styleRegex.exec(html)) !== null) {
18
+ const fullMatch = match[0];
19
+ const styleValue = match[1];
20
+ // Parse CSS declarations from inline style
21
+ const declarations = this.parseInlineStyle(styleValue);
22
+ if (declarations.length === 0) {
23
+ continue;
24
+ }
25
+ // Convert to Tailwind classes
26
+ const { classes, warnings: convWarnings } = this.mapper.convertMultiple(declarations);
27
+ if (classes.length === 0) {
28
+ warnings.push(...convWarnings);
29
+ continue;
30
+ }
31
+ // Find existing class attribute
32
+ const beforeStyle = html.substring(0, match.index);
33
+ const tagMatch = beforeStyle.match(/<([a-z][a-z0-9]*)[^>]*$/i);
34
+ if (!tagMatch) {
35
+ warnings.push(`Could not find tag for inline style`);
36
+ continue;
37
+ }
38
+ // Check if there's an existing class attribute
39
+ const tagEnd = html.indexOf('>', match.index);
40
+ const tagContent = html.substring(match.index, tagEnd);
41
+ const existingClassMatch = tagContent.match(/class="([^"]*)"/);
42
+ let replacement;
43
+ if (existingClassMatch && existingClassMatch.index !== undefined) {
44
+ // Merge with existing class
45
+ const existingClasses = existingClassMatch[1];
46
+ const mergedClasses = this.mergeClasses(existingClasses, classes);
47
+ // Replace class attribute and remove style
48
+ const beforeClass = modifiedHtml.substring(0, match.index + existingClassMatch.index);
49
+ const afterStyle = modifiedHtml.substring(match.index + fullMatch.length);
50
+ // This is complex - need to handle both class and style replacement
51
+ // For now, simplified version:
52
+ replacement = `class="${mergedClasses}"`;
53
+ modifiedHtml = modifiedHtml.replace(fullMatch, replacement);
54
+ }
55
+ else {
56
+ // Add class attribute, remove style
57
+ replacement = `class="${classes.join(' ')}"`;
58
+ modifiedHtml = modifiedHtml.replace(fullMatch, replacement);
59
+ }
60
+ conversions += classes.length;
61
+ hasChanges = true;
62
+ warnings.push(...convWarnings);
63
+ }
64
+ return {
65
+ html: modifiedHtml,
66
+ hasChanges,
67
+ conversions,
68
+ warnings
69
+ };
70
+ }
71
+ parseInlineStyle(styleValue) {
72
+ const declarations = [];
73
+ // Split by semicolon
74
+ const props = styleValue.split(';').filter(s => s.trim());
75
+ props.forEach(prop => {
76
+ const colonIndex = prop.indexOf(':');
77
+ if (colonIndex === -1)
78
+ return;
79
+ const property = prop.substring(0, colonIndex).trim();
80
+ const value = prop.substring(colonIndex + 1).trim();
81
+ if (property && value) {
82
+ declarations.push({ property, value });
83
+ }
84
+ });
85
+ return declarations;
86
+ }
87
+ mergeClasses(existing, newClasses) {
88
+ const existingSet = new Set(existing.split(/\s+/).filter(Boolean));
89
+ newClasses.forEach(cls => existingSet.add(cls));
90
+ return Array.from(existingSet).join(' ');
91
+ }
92
+ extractStylesheets(html) {
93
+ const stylesheets = [];
94
+ const linkRegex = /<link[^>]*rel="stylesheet"[^>]*href="([^"]*)"[^>]*>/gi;
95
+ let match;
96
+ while ((match = linkRegex.exec(html)) !== null) {
97
+ stylesheets.push(match[1]);
98
+ }
99
+ return stylesheets;
100
+ }
101
+ }
102
+ exports.HTMLParser = HTMLParser;
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odG1sUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLE1BQWEsVUFBVTtJQUdyQixZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBWSxFQUFFLFFBQWdCO1FBQ2xDLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLDZEQUE2RDtRQUM3RCwrQkFBK0I7UUFDL0IsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksS0FBSyxDQUFDO1FBRVYsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1QiwyQ0FBMkM7WUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXZELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsU0FBUztZQUNYLENBQUM7WUFFRCw4QkFBOEI7WUFDOUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFdEYsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixR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IjpbImltcG9ydCB7IFRhaWx3aW5kTWFwcGVyIH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSFRNTFBhcnNlUmVzdWx0IHtcbiAgaHRtbDogc3RyaW5nO1xuICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICBjb252ZXJzaW9uczogbnVtYmVyO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBIVE1MUGFyc2VyIHtcbiAgcHJpdmF0ZSBtYXBwZXI6IFRhaWx3aW5kTWFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKG1hcHBlcjogVGFpbHdpbmRNYXBwZXIpIHtcbiAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjtcbiAgfVxuXG4gIHBhcnNlKGh0bWw6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IEhUTUxQYXJzZVJlc3VsdCB7XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgICBsZXQgY29udmVyc2lvbnMgPSAwO1xuXG4gICAgLy8gUGFyc2UgaW5saW5lIHN0eWxlczogc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBwYWRkaW5nOiAxNnB4O1wiXG4gICAgLy8gQ29udmVydCB0bzogY2xhc3M9XCJmbGV4IHAtNFwiXG4gICAgY29uc3Qgc3R5bGVSZWdleCA9IC9zdHlsZT1cIihbXlwiXSopXCIvZztcbiAgICBsZXQgbW9kaWZpZWRIdG1sID0gaHRtbDtcbiAgICBsZXQgbWF0Y2g7XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gc3R5bGVSZWdleC5leGVjKGh0bWwpKSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF07XG4gICAgICBjb25zdCBzdHlsZVZhbHVlID0gbWF0Y2hbMV07XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIENTUyBkZWNsYXJhdGlvbnMgZnJvbSBpbmxpbmUgc3R5bGVcbiAgICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VJbmxpbmVTdHlsZShzdHlsZVZhbHVlKTtcbiAgICAgIFxuICAgICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gVGFpbHdpbmQgY2xhc3Nlc1xuICAgICAgY29uc3QgeyBjbGFzc2VzLCB3YXJuaW5nczogY29udldhcm5pbmdzIH0gPSB0aGlzLm1hcHBlci5jb252ZXJ0TXVsdGlwbGUoZGVjbGFyYXRpb25zKTtcblxuICAgICAgaWYgKGNsYXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4uY29udldhcm5pbmdzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgZXhpc3RpbmcgY2xhc3MgYXR0cmlidXRlXG4gICAgICBjb25zdCBiZWZvcmVTdHlsZSA9IGh0bWwuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgIGNvbnN0IHRhZ01hdGNoID0gYmVmb3JlU3R5bGUubWF0Y2goLzwoW2Etel1bYS16MC05XSopW14+XSokL2kpO1xuICAgICAgXG4gICAgICBpZiAoIXRhZ01hdGNoKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYENvdWxkIG5vdCBmaW5kIHRhZyBmb3IgaW5saW5lIHN0eWxlYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgdGFnRW5kID0gaHRtbC5pbmRleE9mKCc+JywgbWF0Y2guaW5kZXgpO1xuICAgICAgY29uc3QgdGFnQ29udGVudCA9IGh0bWwuc3Vic3RyaW5nKG1hdGNoLmluZGV4LCB0YWdFbmQpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDbGFzc01hdGNoID0gdGFnQ29udGVudC5tYXRjaCgvY2xhc3M9XCIoW15cIl0qKVwiLyk7XG5cbiAgICAgIGxldCByZXBsYWNlbWVudDogc3RyaW5nO1xuICAgICAgXG4gICAgICAgIGlmIChleGlzdGluZ0NsYXNzTWF0Y2ggJiYgZXhpc3RpbmdDbGFzc01hdGNoLmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTWVyZ2Ugd2l0aCBleGlzdGluZyBjbGFzc1xuICAgICAgICBjb25zdCBleGlzdGluZ0NsYXNzZXMgPSBleGlzdGluZ0NsYXNzTWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IG1lcmdlZENsYXNzZXMgPSB0aGlzLm1lcmdlQ2xhc3NlcyhleGlzdGluZ0NsYXNzZXMsIGNsYXNzZXMpO1xuICAgICAgICBcbiAgICAgICAgLy8gUmVwbGFjZSBjbGFzcyBhdHRyaWJ1dGUgYW5kIHJlbW92ZSBzdHlsZVxuICAgICAgICBjb25zdCBiZWZvcmVDbGFzcyA9IG1vZGlmaWVkSHRtbC5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggKyBleGlzdGluZ0NsYXNzTWF0Y2guaW5kZXgpO1xuICAgICAgICBjb25zdCBhZnRlclN0eWxlID0gbW9kaWZpZWRIdG1sLnN1YnN0cmluZyhtYXRjaC5pbmRleCArIGZ1bGxNYXRjaC5sZW5ndGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gVGhpcyBpcyBjb21wbGV4IC0gbmVlZCB0byBoYW5kbGUgYm90aCBjbGFzcyBhbmQgc3R5bGUgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gRm9yIG5vdywgc2ltcGxpZmllZCB2ZXJzaW9uOlxuICAgICAgICByZXBsYWNlbWVudCA9IGBjbGFzcz1cIiR7bWVyZ2VkQ2xhc3Nlc31cImA7XG4gICAgICAgIG1vZGlmaWVkSHRtbCA9IG1vZGlmaWVkSHRtbC5yZXBsYWNlKGZ1bGxNYXRjaCwgcmVwbGFjZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkIGNsYXNzIGF0dHJpYnV0ZSwgcmVtb3ZlIHN0eWxlXG4gICAgICAgIHJlcGxhY2VtZW50ID0gYGNsYXNzPVwiJHtjbGFzc2VzLmpvaW4oJyAnKX1cImA7XG4gICAgICAgIG1vZGlmaWVkSHRtbCA9IG1vZGlmaWVkSHRtbC5yZXBsYWNlKGZ1bGxNYXRjaCwgcmVwbGFjZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBjb252ZXJzaW9ucyArPSBjbGFzc2VzLmxlbmd0aDtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgd2FybmluZ3MucHVzaCguLi5jb252V2FybmluZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBodG1sOiBtb2RpZmllZEh0bWwsXG4gICAgICBoYXNDaGFuZ2VzLFxuICAgICAgY29udmVyc2lvbnMsXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW5saW5lU3R5bGUoc3R5bGVWYWx1ZTogc3RyaW5nKTogQXJyYXk8e3Byb3BlcnR5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmd9PiB7XG4gICAgY29uc3QgZGVjbGFyYXRpb25zOiBBcnJheTx7cHJvcGVydHk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ30+ID0gW107XG4gICAgXG4gICAgLy8gU3BsaXQgYnkgc2VtaWNvbG9uXG4gICAgY29uc3QgcHJvcHMgPSBzdHlsZVZhbHVlLnNwbGl0KCc7JykuZmlsdGVyKHMgPT4gcy50cmltKCkpO1xuICAgIFxuICAgIHByb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICBjb25zdCBjb2xvbkluZGV4ID0gcHJvcC5pbmRleE9mKCc6Jyk7XG4gICAgICBpZiAoY29sb25JbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICAgIFxuICAgICAgY29uc3QgcHJvcGVydHkgPSBwcm9wLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KS50cmltKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb3Auc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxKS50cmltKCk7XG4gICAgICBcbiAgICAgIGlmIChwcm9wZXJ0eSAmJiB2YWx1ZSkge1xuICAgICAgICBkZWNsYXJhdGlvbnMucHVzaCh7IHByb3BlcnR5LCB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gZGVjbGFyYXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNsYXNzZXMoZXhpc3Rpbmc6IHN0cmluZywgbmV3Q2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGV4aXN0aW5nU2V0ID0gbmV3IFNldChleGlzdGluZy5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKSk7XG4gICAgbmV3Q2xhc3Nlcy5mb3JFYWNoKGNscyA9PiBleGlzdGluZ1NldC5hZGQoY2xzKSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oZXhpc3RpbmdTZXQpLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGV4dHJhY3RTdHlsZXNoZWV0cyhodG1sOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3R5bGVzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbGlua1JlZ2V4ID0gLzxsaW5rW14+XSpyZWw9XCJzdHlsZXNoZWV0XCJbXj5dKmhyZWY9XCIoW15cIl0qKVwiW14+XSo+L2dpO1xuICAgIGxldCBtYXRjaDtcblxuICAgIHdoaWxlICgobWF0Y2ggPSBsaW5rUmVnZXguZXhlYyhodG1sKSkgIT09IG51bGwpIHtcbiAgICAgIHN0eWxlc2hlZXRzLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZXNoZWV0cztcbiAgfVxufVxuIl19
package/dist/index.d.ts CHANGED
@@ -2,7 +2,10 @@ export { scanProject, ScannedFile } from './scanner';
2
2
  export { transformFiles, TransformOptions, TransformResults } from './transformer';
3
3
  export { TailwindMapper, CSSProperty, ConversionResult } from './tailwindMapper';
4
4
  export { JSXParser, JSXTransformation, JSXParseResult } from './jsxParser';
5
- export { CSSParser, CSSRule, CSSParseResult } from './cssParser';
5
+ export { CSSParser, CSSRule, CSSParseResult, UtilityWithVariant } from './cssParser';
6
6
  export { FileWriter, FileWriteOptions } from './fileWriter';
7
7
  export { loadTailwindConfig, TailwindConfig } from './utils/config';
8
8
  export { logger } from './utils/logger';
9
+ export { Breakpoint, MediaQueryInfo, getDefaultBreakpoints, resolveBreakpointsFromConfig, parseMediaQuery, findBreakpointForMinWidth, processMediaQuery, prefixWithBreakpoint } from './utils/breakpointResolver';
10
+ export { ParsedSelector, PSEUDO_TO_VARIANT, SUPPORTED_PSEUDOS, parseSelector, mapPseudoToVariant, processPseudoSelector, parseMultipleSelectors } from './utils/pseudoSelectorResolver';
11
+ export { VARIANT_ORDER, isResponsiveVariant, isPseudoVariant, sortVariants, deduplicateVariants, normalizeVariantOrder, assembleUtility, assembleUtilities, mergeUtilities, MergedUtility } from './utils/variantAssembler';