1 | import { __spreadArrays } from "tslib";
|
2 | import { Stylesheet } from './Stylesheet';
|
3 | import { kebabRules } from './transforms/kebabRules';
|
4 | import { prefixRules } from './transforms/prefixRules';
|
5 | import { provideUnits } from './transforms/provideUnits';
|
6 | import { rtlifyRules } from './transforms/rtlifyRules';
|
7 | var DISPLAY_NAME = 'displayName';
|
8 | function getDisplayName(rules) {
|
9 | var rootStyle = rules && rules['&'];
|
10 | return rootStyle ? rootStyle.displayName : undefined;
|
11 | }
|
12 | var globalSelectorRegExp = /\:global\((.+?)\)/g;
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | function expandCommaSeparatedGlobals(selectorWithGlobals) {
|
21 |
|
22 | if (!globalSelectorRegExp.test(selectorWithGlobals)) {
|
23 | return selectorWithGlobals;
|
24 | }
|
25 | var replacementInfo = [];
|
26 | var findGlobal = /\:global\((.+?)\)/g;
|
27 | var match = null;
|
28 |
|
29 | while ((match = findGlobal.exec(selectorWithGlobals))) {
|
30 |
|
31 | if (match[1].indexOf(',') > -1) {
|
32 | replacementInfo.push([
|
33 | match.index,
|
34 | match.index + match[0].length,
|
35 |
|
36 | match[1]
|
37 | .split(',')
|
38 | .map(function (v) { return ":global(" + v.trim() + ")"; })
|
39 | .join(', '),
|
40 | ]);
|
41 | }
|
42 | }
|
43 |
|
44 | return replacementInfo
|
45 | .reverse()
|
46 | .reduce(function (selector, _a) {
|
47 | var matchIndex = _a[0], matchEndIndex = _a[1], replacement = _a[2];
|
48 | var prefix = selector.slice(0, matchIndex);
|
49 | var suffix = selector.slice(matchEndIndex);
|
50 | return prefix + replacement + suffix;
|
51 | }, selectorWithGlobals);
|
52 | }
|
53 | function expandSelector(newSelector, currentSelector) {
|
54 | if (newSelector.indexOf(':global(') >= 0) {
|
55 | return newSelector.replace(globalSelectorRegExp, '$1');
|
56 | }
|
57 | else if (newSelector.indexOf(':') === 0) {
|
58 | return currentSelector + newSelector;
|
59 | }
|
60 | else if (newSelector.indexOf('&') < 0) {
|
61 | return currentSelector + ' ' + newSelector;
|
62 | }
|
63 | return newSelector;
|
64 | }
|
65 | function extractSelector(currentSelector, rules, selector, value) {
|
66 | if (rules === void 0) { rules = { __order: [] }; }
|
67 | if (selector.indexOf('@') === 0) {
|
68 | selector = selector + '{' + currentSelector;
|
69 | extractRules([value], rules, selector);
|
70 | }
|
71 | else if (selector.indexOf(',') > -1) {
|
72 | expandCommaSeparatedGlobals(selector)
|
73 | .split(',')
|
74 | .map(function (s) { return s.trim(); })
|
75 | .forEach(function (separatedSelector) {
|
76 | return extractRules([value], rules, expandSelector(separatedSelector, currentSelector));
|
77 | });
|
78 | }
|
79 | else {
|
80 | extractRules([value], rules, expandSelector(selector, currentSelector));
|
81 | }
|
82 | }
|
83 | function extractRules(args, rules, currentSelector) {
|
84 | if (rules === void 0) { rules = { __order: [] }; }
|
85 | if (currentSelector === void 0) { currentSelector = '&'; }
|
86 | var stylesheet = Stylesheet.getInstance();
|
87 | var currentRules = rules[currentSelector];
|
88 | if (!currentRules) {
|
89 | currentRules = {};
|
90 | rules[currentSelector] = currentRules;
|
91 | rules.__order.push(currentSelector);
|
92 | }
|
93 | for (var _i = 0, args_1 = args; _i < args_1.length; _i++) {
|
94 | var arg = args_1[_i];
|
95 |
|
96 | if (typeof arg === 'string') {
|
97 | var expandedRules = stylesheet.argsFromClassName(arg);
|
98 | if (expandedRules) {
|
99 | extractRules(expandedRules, rules, currentSelector);
|
100 | }
|
101 |
|
102 | }
|
103 | else if (Array.isArray(arg)) {
|
104 | extractRules(arg, rules, currentSelector);
|
105 | }
|
106 | else {
|
107 | for (var prop in arg) {
|
108 | if (arg.hasOwnProperty(prop)) {
|
109 | var propValue = arg[prop];
|
110 | if (prop === 'selectors') {
|
111 |
|
112 | var selectors = arg.selectors;
|
113 | for (var newSelector in selectors) {
|
114 | if (selectors.hasOwnProperty(newSelector)) {
|
115 | extractSelector(currentSelector, rules, newSelector, selectors[newSelector]);
|
116 | }
|
117 | }
|
118 | }
|
119 | else if (typeof propValue === 'object') {
|
120 |
|
121 | if (propValue !== null) {
|
122 | extractSelector(currentSelector, rules, prop, propValue);
|
123 | }
|
124 | }
|
125 | else {
|
126 | if (propValue !== undefined) {
|
127 |
|
128 | if (prop === 'margin' || prop === 'padding') {
|
129 | expandQuads(currentRules, prop, propValue);
|
130 | }
|
131 | else {
|
132 | currentRules[prop] = propValue;
|
133 | }
|
134 | }
|
135 | }
|
136 | }
|
137 | }
|
138 | }
|
139 | }
|
140 | return rules;
|
141 | }
|
142 | function expandQuads(currentRules, name, value) {
|
143 | var parts = typeof value === 'string' ? value.split(' ') : [value];
|
144 | currentRules[name + 'Top'] = parts[0];
|
145 | currentRules[name + 'Right'] = parts[1] || parts[0];
|
146 | currentRules[name + 'Bottom'] = parts[2] || parts[0];
|
147 | currentRules[name + 'Left'] = parts[3] || parts[1] || parts[0];
|
148 | }
|
149 | function getKeyForRules(options, rules) {
|
150 | var serialized = [options.rtl ? 'rtl' : 'ltr'];
|
151 | var hasProps = false;
|
152 | for (var _i = 0, _a = rules.__order; _i < _a.length; _i++) {
|
153 | var selector = _a[_i];
|
154 | serialized.push(selector);
|
155 | var rulesForSelector = rules[selector];
|
156 | for (var propName in rulesForSelector) {
|
157 | if (rulesForSelector.hasOwnProperty(propName) && rulesForSelector[propName] !== undefined) {
|
158 | hasProps = true;
|
159 | serialized.push(propName, rulesForSelector[propName]);
|
160 | }
|
161 | }
|
162 | }
|
163 | return hasProps ? serialized.join('') : undefined;
|
164 | }
|
165 | function repeatString(target, count) {
|
166 | if (count <= 0) {
|
167 | return '';
|
168 | }
|
169 | if (count === 1) {
|
170 | return target;
|
171 | }
|
172 | return target + repeatString(target, count - 1);
|
173 | }
|
174 | export function serializeRuleEntries(options, ruleEntries) {
|
175 | if (!ruleEntries) {
|
176 | return '';
|
177 | }
|
178 | var allEntries = [];
|
179 | for (var entry in ruleEntries) {
|
180 | if (ruleEntries.hasOwnProperty(entry) && entry !== DISPLAY_NAME && ruleEntries[entry] !== undefined) {
|
181 | allEntries.push(entry, ruleEntries[entry]);
|
182 | }
|
183 | }
|
184 |
|
185 | for (var i = 0; i < allEntries.length; i += 2) {
|
186 | kebabRules(allEntries, i);
|
187 | provideUnits(allEntries, i);
|
188 | rtlifyRules(options, allEntries, i);
|
189 | prefixRules(allEntries, i);
|
190 | }
|
191 |
|
192 | for (var i = 1; i < allEntries.length; i += 4) {
|
193 | allEntries.splice(i, 1, ':', allEntries[i], ';');
|
194 | }
|
195 | return allEntries.join('');
|
196 | }
|
197 | export function styleToRegistration(options) {
|
198 | var args = [];
|
199 | for (var _i = 1; _i < arguments.length; _i++) {
|
200 | args[_i - 1] = arguments[_i];
|
201 | }
|
202 | var rules = extractRules(args);
|
203 | var key = getKeyForRules(options, rules);
|
204 | if (key) {
|
205 | var stylesheet = Stylesheet.getInstance();
|
206 | var registration = {
|
207 | className: stylesheet.classNameFromKey(key),
|
208 | key: key,
|
209 | args: args,
|
210 | };
|
211 | if (!registration.className) {
|
212 | registration.className = stylesheet.getClassName(getDisplayName(rules));
|
213 | var rulesToInsert = [];
|
214 | for (var _a = 0, _b = rules.__order; _a < _b.length; _a++) {
|
215 | var selector = _b[_a];
|
216 | rulesToInsert.push(selector, serializeRuleEntries(options, rules[selector]));
|
217 | }
|
218 | registration.rulesToInsert = rulesToInsert;
|
219 | }
|
220 | return registration;
|
221 | }
|
222 | return undefined;
|
223 | }
|
224 |
|
225 |
|
226 |
|
227 |
|
228 |
|
229 |
|
230 | export function applyRegistration(registration, specificityMultiplier) {
|
231 | if (specificityMultiplier === void 0) { specificityMultiplier = 1; }
|
232 | var stylesheet = Stylesheet.getInstance();
|
233 | var className = registration.className, key = registration.key, args = registration.args, rulesToInsert = registration.rulesToInsert;
|
234 | if (rulesToInsert) {
|
235 |
|
236 | for (var i = 0; i < rulesToInsert.length; i += 2) {
|
237 | var rules = rulesToInsert[i + 1];
|
238 | if (rules) {
|
239 | var selector = rulesToInsert[i];
|
240 | selector = selector.replace(/&/g, repeatString("." + registration.className, specificityMultiplier));
|
241 |
|
242 | var processedRule = selector + "{" + rules + "}" + (selector.indexOf('@') === 0 ? '}' : '');
|
243 | stylesheet.insertRule(processedRule);
|
244 | }
|
245 | }
|
246 | stylesheet.cacheClassName(className, key, args, rulesToInsert);
|
247 | }
|
248 | }
|
249 | export function styleToClassName(options) {
|
250 | var args = [];
|
251 | for (var _i = 1; _i < arguments.length; _i++) {
|
252 | args[_i - 1] = arguments[_i];
|
253 | }
|
254 | var registration = styleToRegistration.apply(void 0, __spreadArrays([options], args));
|
255 | if (registration) {
|
256 | applyRegistration(registration, options.specificityMultiplier);
|
257 | return registration.className;
|
258 | }
|
259 | return '';
|
260 | }
|
261 |
|
\ | No newline at end of file |