| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
- var _typeof3 = require("@babel/runtime/helpers/typeof");
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.STYLE_PREFIX = void 0;
- exports.default = useStyleRegister;
- exports.extract = void 0;
- exports.normalizeStyle = normalizeStyle;
- exports.parseStyle = void 0;
- exports.uniqueHash = uniqueHash;
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
- var _hash = _interopRequireDefault(require("@emotion/hash"));
- var _dynamicCSS = require("rc-util/lib/Dom/dynamicCSS");
- var React = _interopRequireWildcard(require("react"));
- var _unitless = _interopRequireDefault(require("@emotion/unitless"));
- var _stylis = require("stylis");
- var _linters = require("../linters");
- var _StyleContext = _interopRequireWildcard(require("../StyleContext"));
- var _util = require("../util");
- var _cacheMapUtil = require("../util/cacheMapUtil");
- var _useGlobalCache3 = _interopRequireDefault(require("./useGlobalCache"));
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
- // @ts-ignore
- var SKIP_CHECK = '_skip_check_';
- var MULTI_VALUE = '_multi_value_';
- // ============================================================================
- // == Parser ==
- // ============================================================================
- // Preprocessor style content to browser support one
- function normalizeStyle(styleStr) {
- var serialized = (0, _stylis.serialize)((0, _stylis.compile)(styleStr), _stylis.stringify);
- return serialized.replace(/\{%%%\:[^;];}/g, ';');
- }
- function isCompoundCSSProperty(value) {
- return (0, _typeof2.default)(value) === 'object' && value && (SKIP_CHECK in value || MULTI_VALUE in value);
- }
- // 注入 hash 值
- function injectSelectorHash(key, hashId, hashPriority) {
- if (!hashId) {
- return key;
- }
- var hashClassName = ".".concat(hashId);
- var hashSelector = hashPriority === 'low' ? ":where(".concat(hashClassName, ")") : hashClassName;
- // 注入 hashId
- var keys = key.split(',').map(function (k) {
- var _firstPath$match;
- var fullPath = k.trim().split(/\s+/);
- // 如果 Selector 第一个是 HTML Element,那我们就插到它的后面。反之,就插到最前面。
- var firstPath = fullPath[0] || '';
- var htmlElement = ((_firstPath$match = firstPath.match(/^\w+/)) === null || _firstPath$match === void 0 ? void 0 : _firstPath$match[0]) || '';
- firstPath = "".concat(htmlElement).concat(hashSelector).concat(firstPath.slice(htmlElement.length));
- return [firstPath].concat((0, _toConsumableArray2.default)(fullPath.slice(1))).join(' ');
- });
- return keys.join(',');
- }
- // Parse CSSObject to style content
- var parseStyle = exports.parseStyle = function parseStyle(interpolation) {
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
- root: true,
- parentSelectors: []
- },
- root = _ref.root,
- injectHash = _ref.injectHash,
- parentSelectors = _ref.parentSelectors;
- var hashId = config.hashId,
- layer = config.layer,
- path = config.path,
- hashPriority = config.hashPriority,
- _config$transformers = config.transformers,
- transformers = _config$transformers === void 0 ? [] : _config$transformers,
- _config$linters = config.linters,
- linters = _config$linters === void 0 ? [] : _config$linters;
- var styleStr = '';
- var effectStyle = {};
- function parseKeyframes(keyframes) {
- var animationName = keyframes.getName(hashId);
- if (!effectStyle[animationName]) {
- var _parseStyle = parseStyle(keyframes.style, config, {
- root: false,
- parentSelectors: parentSelectors
- }),
- _parseStyle2 = (0, _slicedToArray2.default)(_parseStyle, 1),
- _parsedStr = _parseStyle2[0];
- effectStyle[animationName] = "@keyframes ".concat(keyframes.getName(hashId)).concat(_parsedStr);
- }
- }
- function flattenList(list) {
- var fullList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
- list.forEach(function (item) {
- if (Array.isArray(item)) {
- flattenList(item, fullList);
- } else if (item) {
- fullList.push(item);
- }
- });
- return fullList;
- }
- var flattenStyleList = flattenList(Array.isArray(interpolation) ? interpolation : [interpolation]);
- flattenStyleList.forEach(function (originStyle) {
- // Only root level can use raw string
- var style = typeof originStyle === 'string' && !root ? {} : originStyle;
- if (typeof style === 'string') {
- styleStr += "".concat(style, "\n");
- } else if (style._keyframe) {
- // Keyframe
- parseKeyframes(style);
- } else {
- var mergedStyle = transformers.reduce(function (prev, trans) {
- var _trans$visit;
- return (trans === null || trans === void 0 || (_trans$visit = trans.visit) === null || _trans$visit === void 0 ? void 0 : _trans$visit.call(trans, prev)) || prev;
- }, style);
- // Normal CSSObject
- Object.keys(mergedStyle).forEach(function (key) {
- var value = mergedStyle[key];
- if ((0, _typeof2.default)(value) === 'object' && value && (key !== 'animationName' || !value._keyframe) && !isCompoundCSSProperty(value)) {
- var subInjectHash = false;
- // 当成嵌套对象来处理
- var mergedKey = key.trim();
- // Whether treat child as root. In most case it is false.
- var nextRoot = false;
- // 拆分多个选择器
- if ((root || injectHash) && hashId) {
- if (mergedKey.startsWith('@')) {
- // 略过媒体查询,交给子节点继续插入 hashId
- subInjectHash = true;
- } else if (mergedKey === '&') {
- // 抹掉 root selector 上的单个 &
- mergedKey = injectSelectorHash('', hashId, hashPriority);
- } else {
- // 注入 hashId
- mergedKey = injectSelectorHash(key, hashId, hashPriority);
- }
- } else if (root && !hashId && (mergedKey === '&' || mergedKey === '')) {
- // In case of `{ '&': { a: { color: 'red' } } }` or `{ '': { a: { color: 'red' } } }` without hashId,
- // we will get `&{a:{color:red;}}` or `{a:{color:red;}}` string for stylis to compile.
- // But it does not conform to stylis syntax,
- // and finally we will get `{color:red;}` as css, which is wrong.
- // So we need to remove key in root, and treat child `{ a: { color: 'red' } }` as root.
- mergedKey = '';
- nextRoot = true;
- }
- var _parseStyle3 = parseStyle(value, config, {
- root: nextRoot,
- injectHash: subInjectHash,
- parentSelectors: [].concat((0, _toConsumableArray2.default)(parentSelectors), [mergedKey])
- }),
- _parseStyle4 = (0, _slicedToArray2.default)(_parseStyle3, 2),
- _parsedStr2 = _parseStyle4[0],
- childEffectStyle = _parseStyle4[1];
- effectStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, effectStyle), childEffectStyle);
- styleStr += "".concat(mergedKey).concat(_parsedStr2);
- } else {
- var _value;
- function appendStyle(cssKey, cssValue) {
- if (process.env.NODE_ENV !== 'production' && ((0, _typeof2.default)(value) !== 'object' || !(value !== null && value !== void 0 && value[SKIP_CHECK]))) {
- [_linters.contentQuotesLinter, _linters.hashedAnimationLinter].concat((0, _toConsumableArray2.default)(linters)).forEach(function (linter) {
- return linter(cssKey, cssValue, {
- path: path,
- hashId: hashId,
- parentSelectors: parentSelectors
- });
- });
- }
- // 如果是样式则直接插入
- var styleName = cssKey.replace(/[A-Z]/g, function (match) {
- return "-".concat(match.toLowerCase());
- });
- // Auto suffix with px
- var formatValue = cssValue;
- if (!_unitless.default[cssKey] && typeof formatValue === 'number' && formatValue !== 0) {
- formatValue = "".concat(formatValue, "px");
- }
- // handle animationName & Keyframe value
- if (cssKey === 'animationName' && cssValue !== null && cssValue !== void 0 && cssValue._keyframe) {
- parseKeyframes(cssValue);
- formatValue = cssValue.getName(hashId);
- }
- styleStr += "".concat(styleName, ":").concat(formatValue, ";");
- }
- var actualValue = (_value = value === null || value === void 0 ? void 0 : value.value) !== null && _value !== void 0 ? _value : value;
- if ((0, _typeof2.default)(value) === 'object' && value !== null && value !== void 0 && value[MULTI_VALUE] && Array.isArray(actualValue)) {
- actualValue.forEach(function (item) {
- appendStyle(key, item);
- });
- } else {
- appendStyle(key, actualValue);
- }
- }
- });
- }
- });
- if (!root) {
- styleStr = "{".concat(styleStr, "}");
- } else if (layer) {
- // fixme: https://github.com/thysultan/stylis/pull/339
- if (styleStr) {
- styleStr = "@layer ".concat(layer.name, " {").concat(styleStr, "}");
- }
- if (layer.dependencies) {
- effectStyle["@layer ".concat(layer.name)] = layer.dependencies.map(function (deps) {
- return "@layer ".concat(deps, ", ").concat(layer.name, ";");
- }).join('\n');
- }
- }
- return [styleStr, effectStyle];
- };
- // ============================================================================
- // == Register ==
- // ============================================================================
- function uniqueHash(path, styleStr) {
- return (0, _hash.default)("".concat(path.join('%')).concat(styleStr));
- }
- function Empty() {
- return null;
- }
- var STYLE_PREFIX = exports.STYLE_PREFIX = 'style';
- /**
- * Register a style to the global style sheet.
- */
- function useStyleRegister(info, styleFn) {
- var token = info.token,
- path = info.path,
- hashId = info.hashId,
- layer = info.layer,
- nonce = info.nonce,
- clientOnly = info.clientOnly,
- _info$order = info.order,
- order = _info$order === void 0 ? 0 : _info$order;
- var _React$useContext = React.useContext(_StyleContext.default),
- autoClear = _React$useContext.autoClear,
- mock = _React$useContext.mock,
- defaultCache = _React$useContext.defaultCache,
- hashPriority = _React$useContext.hashPriority,
- container = _React$useContext.container,
- ssrInline = _React$useContext.ssrInline,
- transformers = _React$useContext.transformers,
- linters = _React$useContext.linters,
- cache = _React$useContext.cache,
- enableLayer = _React$useContext.layer;
- var tokenKey = token._tokenKey;
- var fullPath = [tokenKey];
- if (enableLayer) {
- fullPath.push('layer');
- }
- fullPath.push.apply(fullPath, (0, _toConsumableArray2.default)(path));
- // Check if need insert style
- var isMergedClientSide = _util.isClientSide;
- if (process.env.NODE_ENV !== 'production' && mock !== undefined) {
- isMergedClientSide = mock === 'client';
- }
- var _useGlobalCache = (0, _useGlobalCache3.default)(STYLE_PREFIX, fullPath,
- // Create cache if needed
- function () {
- var cachePath = fullPath.join('|');
- // Get style from SSR inline style directly
- if ((0, _cacheMapUtil.existPath)(cachePath)) {
- var _getStyleAndHash = (0, _cacheMapUtil.getStyleAndHash)(cachePath),
- _getStyleAndHash2 = (0, _slicedToArray2.default)(_getStyleAndHash, 2),
- inlineCacheStyleStr = _getStyleAndHash2[0],
- styleHash = _getStyleAndHash2[1];
- if (inlineCacheStyleStr) {
- return [inlineCacheStyleStr, tokenKey, styleHash, {}, clientOnly, order];
- }
- }
- // Generate style
- var styleObj = styleFn();
- var _parseStyle5 = parseStyle(styleObj, {
- hashId: hashId,
- hashPriority: hashPriority,
- layer: enableLayer ? layer : undefined,
- path: path.join('-'),
- transformers: transformers,
- linters: linters
- }),
- _parseStyle6 = (0, _slicedToArray2.default)(_parseStyle5, 2),
- parsedStyle = _parseStyle6[0],
- effectStyle = _parseStyle6[1];
- var styleStr = normalizeStyle(parsedStyle);
- var styleId = uniqueHash(fullPath, styleStr);
- return [styleStr, tokenKey, styleId, effectStyle, clientOnly, order];
- },
- // Remove cache if no need
- function (_ref2, fromHMR) {
- var _ref3 = (0, _slicedToArray2.default)(_ref2, 3),
- styleId = _ref3[2];
- if ((fromHMR || autoClear) && _util.isClientSide) {
- (0, _dynamicCSS.removeCSS)(styleId, {
- mark: _StyleContext.ATTR_MARK,
- attachTo: container
- });
- }
- },
- // Effect: Inject style here
- function (_ref4) {
- var _ref5 = (0, _slicedToArray2.default)(_ref4, 4),
- styleStr = _ref5[0],
- _ = _ref5[1],
- styleId = _ref5[2],
- effectStyle = _ref5[3];
- if (isMergedClientSide && styleStr !== _cacheMapUtil.CSS_FILE_STYLE) {
- var mergedCSSConfig = {
- mark: _StyleContext.ATTR_MARK,
- prepend: enableLayer ? false : 'queue',
- attachTo: container,
- priority: order
- };
- var nonceStr = typeof nonce === 'function' ? nonce() : nonce;
- if (nonceStr) {
- mergedCSSConfig.csp = {
- nonce: nonceStr
- };
- }
- // ================= Split Effect Style =================
- // We will split effectStyle here since @layer should be at the top level
- var effectLayerKeys = [];
- var effectRestKeys = [];
- Object.keys(effectStyle).forEach(function (key) {
- if (key.startsWith('@layer')) {
- effectLayerKeys.push(key);
- } else {
- effectRestKeys.push(key);
- }
- });
- // ================= Inject Layer Style =================
- // Inject layer style
- effectLayerKeys.forEach(function (effectKey) {
- (0, _dynamicCSS.updateCSS)(normalizeStyle(effectStyle[effectKey]), "_layer-".concat(effectKey), (0, _objectSpread2.default)((0, _objectSpread2.default)({}, mergedCSSConfig), {}, {
- prepend: true
- }));
- });
- // ==================== Inject Style ====================
- // Inject style
- var style = (0, _dynamicCSS.updateCSS)(styleStr, styleId, mergedCSSConfig);
- style[_StyleContext.CSS_IN_JS_INSTANCE] = cache.instanceId;
- // Used for `useCacheToken` to remove on batch when token removed
- style.setAttribute(_StyleContext.ATTR_TOKEN, tokenKey);
- // Debug usage. Dev only
- if (process.env.NODE_ENV !== 'production') {
- style.setAttribute(_StyleContext.ATTR_CACHE_PATH, fullPath.join('|'));
- }
- // ================ Inject Effect Style =================
- // Inject client side effect style
- effectRestKeys.forEach(function (effectKey) {
- (0, _dynamicCSS.updateCSS)(normalizeStyle(effectStyle[effectKey]), "_effect-".concat(effectKey), mergedCSSConfig);
- });
- }
- }),
- _useGlobalCache2 = (0, _slicedToArray2.default)(_useGlobalCache, 3),
- cachedStyleStr = _useGlobalCache2[0],
- cachedTokenKey = _useGlobalCache2[1],
- cachedStyleId = _useGlobalCache2[2];
- return function (node) {
- var styleNode;
- if (!ssrInline || isMergedClientSide || !defaultCache) {
- styleNode = /*#__PURE__*/React.createElement(Empty, null);
- } else {
- styleNode = /*#__PURE__*/React.createElement("style", (0, _extends2.default)({}, (0, _defineProperty2.default)((0, _defineProperty2.default)({}, _StyleContext.ATTR_TOKEN, cachedTokenKey), _StyleContext.ATTR_MARK, cachedStyleId), {
- dangerouslySetInnerHTML: {
- __html: cachedStyleStr
- }
- }));
- }
- return /*#__PURE__*/React.createElement(React.Fragment, null, styleNode, node);
- };
- }
- var extract = exports.extract = function extract(cache, effectStyles, options) {
- var _cache = (0, _slicedToArray2.default)(cache, 6),
- styleStr = _cache[0],
- tokenKey = _cache[1],
- styleId = _cache[2],
- effectStyle = _cache[3],
- clientOnly = _cache[4],
- order = _cache[5];
- var _ref7 = options || {},
- plain = _ref7.plain;
- // Skip client only style
- if (clientOnly) {
- return null;
- }
- var keyStyleText = styleStr;
- // ====================== Share ======================
- // Used for rc-util
- var sharedAttrs = {
- 'data-rc-order': 'prependQueue',
- 'data-rc-priority': "".concat(order)
- };
- // ====================== Style ======================
- keyStyleText = (0, _util.toStyleStr)(styleStr, tokenKey, styleId, sharedAttrs, plain);
- // =============== Create effect style ===============
- if (effectStyle) {
- Object.keys(effectStyle).forEach(function (effectKey) {
- // Effect style can be reused
- if (!effectStyles[effectKey]) {
- effectStyles[effectKey] = true;
- var effectStyleStr = normalizeStyle(effectStyle[effectKey]);
- var effectStyleHTML = (0, _util.toStyleStr)(effectStyleStr, tokenKey, "_effect-".concat(effectKey), sharedAttrs, plain);
- if (effectKey.startsWith('@layer')) {
- keyStyleText = effectStyleHTML + keyStyleText;
- } else {
- keyStyleText += effectStyleHTML;
- }
- }
- });
- }
- return [order, styleId, keyStyleText];
- };
|