68 lines
2.6 KiB
JavaScript
68 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
var injectDevTools = require('../devtools/injectDevTools.cjs.js');
|
|
var isDevToolsEnabled = require('../devtools/isDevToolsEnabled.cjs.js');
|
|
var store = require('../devtools/store.cjs.js');
|
|
var normalizeCSSBucketEntry = require('../runtime/utils/normalizeCSSBucketEntry.cjs.js');
|
|
var getStyleSheetForBucket = require('./getStyleSheetForBucket.cjs.js');
|
|
var safeInsertRule = require('./safeInsertRule.cjs.js');
|
|
|
|
let lastIndex = 0;
|
|
/** @internal */
|
|
const defaultCompareMediaQueries = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
/**
|
|
* Creates a new instances of a renderer.
|
|
*
|
|
* @public
|
|
*/
|
|
function createDOMRenderer(targetDocument = typeof document === 'undefined' ? undefined : document, options = {}) {
|
|
const {
|
|
classNameHashSalt,
|
|
unstable_filterCSSRule,
|
|
insertionPoint,
|
|
styleElementAttributes,
|
|
compareMediaQueries = defaultCompareMediaQueries
|
|
} = options;
|
|
const renderer = {
|
|
classNameHashSalt,
|
|
insertionCache: {},
|
|
stylesheets: {},
|
|
styleElementAttributes: Object.freeze(styleElementAttributes),
|
|
compareMediaQueries,
|
|
id: `d${lastIndex++}`,
|
|
insertCSSRules(cssRules) {
|
|
// eslint-disable-next-line guard-for-in
|
|
for (const styleBucketName in cssRules) {
|
|
const cssRulesForBucket = cssRules[styleBucketName];
|
|
// This is a hot path in rendering styles: ".length" is cached in "l" var to avoid accesses the property
|
|
for (let i = 0, l = cssRulesForBucket.length; i < l; i++) {
|
|
const [ruleCSS, metadata] = normalizeCSSBucketEntry.normalizeCSSBucketEntry(cssRulesForBucket[i]);
|
|
const sheet = getStyleSheetForBucket.getStyleSheetForBucket(styleBucketName, targetDocument, insertionPoint || null, renderer, metadata);
|
|
if (renderer.insertionCache[ruleCSS]) {
|
|
continue;
|
|
}
|
|
renderer.insertionCache[ruleCSS] = styleBucketName;
|
|
if (process.env.NODE_ENV !== 'production' && isDevToolsEnabled.isDevToolsEnabled) {
|
|
store.debugData.addCSSRule(ruleCSS);
|
|
}
|
|
if (unstable_filterCSSRule) {
|
|
if (unstable_filterCSSRule(ruleCSS)) {
|
|
safeInsertRule.safeInsertRule(sheet, ruleCSS);
|
|
}
|
|
} else {
|
|
safeInsertRule.safeInsertRule(sheet, ruleCSS);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
if (targetDocument && process.env.NODE_ENV !== 'production' && isDevToolsEnabled.isDevToolsEnabled) {
|
|
injectDevTools.injectDevTools(targetDocument);
|
|
}
|
|
return renderer;
|
|
}
|
|
|
|
exports.createDOMRenderer = createDOMRenderer;
|
|
exports.defaultCompareMediaQueries = defaultCompareMediaQueries;
|
|
//# sourceMappingURL=createDOMRenderer.cjs.js.map
|