123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.clearContainerCache = clearContainerCache;
- exports.injectCSS = injectCSS;
- exports.removeCSS = removeCSS;
- exports.updateCSS = updateCSS;
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
- var _canUseDom = _interopRequireDefault(require("./canUseDom"));
- var _contains = _interopRequireDefault(require("./contains"));
- var APPEND_ORDER = 'data-rc-order';
- var APPEND_PRIORITY = 'data-rc-priority';
- var MARK_KEY = "rc-util-key";
- var containerCache = new Map();
- function getMark() {
- var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
- mark = _ref.mark;
- if (mark) {
- return mark.startsWith('data-') ? mark : "data-".concat(mark);
- }
- return MARK_KEY;
- }
- function getContainer(option) {
- if (option.attachTo) {
- return option.attachTo;
- }
- var head = document.querySelector('head');
- return head || document.body;
- }
- function getOrder(prepend) {
- if (prepend === 'queue') {
- return 'prependQueue';
- }
- return prepend ? 'prepend' : 'append';
- }
- /**
- * Find style which inject by rc-util
- */
- function findStyles(container) {
- return Array.from((containerCache.get(container) || container).children).filter(function (node) {
- return node.tagName === 'STYLE';
- });
- }
- function injectCSS(css) {
- var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- if (!(0, _canUseDom.default)()) {
- return null;
- }
- var csp = option.csp,
- prepend = option.prepend,
- _option$priority = option.priority,
- priority = _option$priority === void 0 ? 0 : _option$priority;
- var mergedOrder = getOrder(prepend);
- var isPrependQueue = mergedOrder === 'prependQueue';
- var styleNode = document.createElement('style');
- styleNode.setAttribute(APPEND_ORDER, mergedOrder);
- if (isPrependQueue && priority) {
- styleNode.setAttribute(APPEND_PRIORITY, "".concat(priority));
- }
- if (csp !== null && csp !== void 0 && csp.nonce) {
- styleNode.nonce = csp === null || csp === void 0 ? void 0 : csp.nonce;
- }
- styleNode.innerHTML = css;
- var container = getContainer(option);
- var firstChild = container.firstChild;
- if (prepend) {
- // If is queue `prepend`, it will prepend first style and then append rest style
- if (isPrependQueue) {
- var existStyle = (option.styles || findStyles(container)).filter(function (node) {
- // Ignore style which not injected by rc-util with prepend
- if (!['prepend', 'prependQueue'].includes(node.getAttribute(APPEND_ORDER))) {
- return false;
- }
- // Ignore style which priority less then new style
- var nodePriority = Number(node.getAttribute(APPEND_PRIORITY) || 0);
- return priority >= nodePriority;
- });
- if (existStyle.length) {
- container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);
- return styleNode;
- }
- }
- // Use `insertBefore` as `prepend`
- container.insertBefore(styleNode, firstChild);
- } else {
- container.appendChild(styleNode);
- }
- return styleNode;
- }
- function findExistNode(key) {
- var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var container = getContainer(option);
- return (option.styles || findStyles(container)).find(function (node) {
- return node.getAttribute(getMark(option)) === key;
- });
- }
- function removeCSS(key) {
- var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var existNode = findExistNode(key, option);
- if (existNode) {
- var container = getContainer(option);
- container.removeChild(existNode);
- }
- }
- /**
- * qiankun will inject `appendChild` to insert into other
- */
- function syncRealContainer(container, option) {
- var cachedRealContainer = containerCache.get(container);
- // Find real container when not cached or cached container removed
- if (!cachedRealContainer || !(0, _contains.default)(document, cachedRealContainer)) {
- var placeholderStyle = injectCSS('', option);
- var parentNode = placeholderStyle.parentNode;
- containerCache.set(container, parentNode);
- container.removeChild(placeholderStyle);
- }
- }
- /**
- * manually clear container cache to avoid global cache in unit testes
- */
- function clearContainerCache() {
- containerCache.clear();
- }
- function updateCSS(css, key) {
- var originOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- var container = getContainer(originOption);
- var styles = findStyles(container);
- var option = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originOption), {}, {
- styles: styles
- });
- // Sync real parent
- syncRealContainer(container, option);
- var existNode = findExistNode(key, option);
- if (existNode) {
- var _option$csp, _option$csp2;
- if ((_option$csp = option.csp) !== null && _option$csp !== void 0 && _option$csp.nonce && existNode.nonce !== ((_option$csp2 = option.csp) === null || _option$csp2 === void 0 ? void 0 : _option$csp2.nonce)) {
- var _option$csp3;
- existNode.nonce = (_option$csp3 = option.csp) === null || _option$csp3 === void 0 ? void 0 : _option$csp3.nonce;
- }
- if (existNode.innerHTML !== css) {
- existNode.innerHTML = css;
- }
- return existNode;
- }
- var newNode = injectCSS(css, option);
- newNode.setAttribute(getMark(option), key);
- return newNode;
- }
|