ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
104 lines (79 loc) • 3.01 kB
JavaScript
import canUseDom from '../../_util/canUseDom';
var MARK_KEY = "vc-util-key";
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;
}
export function injectCSS(css) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _a, _b;
if (!canUseDom()) {
return null;
}
var styleNode = document.createElement('style');
if ((_a = option.csp) === null || _a === void 0 ? void 0 : _a.nonce) {
styleNode.nonce = (_b = option.csp) === null || _b === void 0 ? void 0 : _b.nonce;
}
styleNode.innerHTML = css;
var container = getContainer(option);
var firstChild = container.firstChild;
if (option.prepend && container.prepend) {
// Use `prepend` first
container.prepend(styleNode);
} else if (option.prepend && firstChild) {
// Fallback to `insertBefore` like IE not support `prepend`
container.insertBefore(styleNode, firstChild);
} else {
container.appendChild(styleNode);
}
return styleNode;
}
var containerCache = new Map();
function findExistNode(key) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var container = getContainer(option);
return Array.from(containerCache.get(container).children).find(function (node) {
return node.tagName === 'STYLE' && node.getAttribute(getMark(option)) === key;
});
}
export function removeCSS(key) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _a;
var existNode = findExistNode(key, option);
(_a = existNode === null || existNode === void 0 ? void 0 : existNode.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(existNode);
}
export function updateCSS(css, key) {
var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _a, _b, _c;
var container = getContainer(option); // Get real parent
if (!containerCache.has(container)) {
var placeholderStyle = injectCSS('', option);
var parentNode = placeholderStyle.parentNode;
containerCache.set(container, parentNode);
parentNode.removeChild(placeholderStyle);
}
var existNode = findExistNode(key, option);
if (existNode) {
if (((_a = option.csp) === null || _a === void 0 ? void 0 : _a.nonce) && existNode.nonce !== ((_b = option.csp) === null || _b === void 0 ? void 0 : _b.nonce)) {
existNode.nonce = (_c = option.csp) === null || _c === void 0 ? void 0 : _c.nonce;
}
if (existNode.innerHTML !== css) {
existNode.innerHTML = css;
}
return existNode;
}
var newNode = injectCSS(css, option);
newNode.setAttribute(getMark(option), key);
return newNode;
}