UNPKG

react-native-web-internals

Version:

React Native for Web

79 lines (78 loc) 3 kB
const slice = Array.prototype.slice; function createOrderedCSSStyleSheet(sheet) { const groups = {}, selectors = {}; if (sheet != null) { let group; slice.call(sheet.cssRules).forEach((cssRule, i) => { const cssText = cssRule.cssText; if (cssText.indexOf("stylesheet-group") > -1) group = decodeGroupRule(cssRule), groups[group] = { start: i, rules: [cssText] }; else { const selectorText = getSelectorText(cssText); selectorText != null && (selectors[selectorText] = !0, groups[group].rules.push(cssText)); } }); } function sheetInsert(sheet2, group, text) { const orderedGroups = getOrderedGroups(groups), nextGroupIndex = orderedGroups.indexOf(group) + 1, nextGroup = orderedGroups[nextGroupIndex], position = nextGroup != null && groups[nextGroup].start != null ? groups[nextGroup].start : sheet2.cssRules.length, isInserted = insertRuleAt(sheet2, text, position); if (isInserted) { groups[group].start == null && (groups[group].start = position); for (let i = nextGroupIndex; i < orderedGroups.length; i += 1) { const groupNumber = orderedGroups[i], previousStart = groups[groupNumber].start || 0; groups[groupNumber].start = previousStart + 1; } } return isInserted; } return { /** * The textContent of the style sheet. */ getTextContent() { return getOrderedGroups(groups).map((group) => { const rules = groups[group].rules, marker = rules.shift(); return rules.sort(), rules.unshift(marker), rules.join(` `); }).join(` `); }, /** * Insert a rule into the style sheet */ insert(cssText, groupValue) { const group = Number(groupValue); if (groups[group] == null) { const markerRule = encodeGroupRule(group); groups[group] = { start: null, rules: [markerRule] }, sheet != null && sheetInsert(sheet, group, markerRule); } const selectorText = getSelectorText(cssText); selectorText != null && selectors[selectorText] == null && (selectors[selectorText] = !0, groups[group].rules.push(cssText), sheet != null && (sheetInsert(sheet, group, cssText) || groups[group].rules.pop())); } }; } function encodeGroupRule(group) { return `[stylesheet-group="${group}"]{}`; } const groupPattern = /["']/g; function decodeGroupRule(cssRule) { return Number(cssRule.selectorText.split(groupPattern)[1]); } function getOrderedGroups(obj) { return Object.keys(obj).map(Number).sort((a, b) => a > b ? 1 : -1); } const selectorPattern = /\s*([,])\s*/g; function getSelectorText(cssText) { const selector = cssText.split("{")[0].trim(); return selector !== "" ? selector.replace(selectorPattern, "$1") : null; } function insertRuleAt(root, cssText, position) { try { return root.insertRule(cssText, position), !0; } catch { return !1; } } export { createOrderedCSSStyleSheet as default }; //# sourceMappingURL=createOrderedCSSStyleSheet.js.map