{"version":3,"file":"dynamicCSS.cjs","sources":["../../../../../packages/utils/dom/dynamicCSS.ts"],"sourcesContent":["import { canUseDom } from './canUseDom';\nimport { contains } from './contains';\n\nconst APPEND_ORDER = 'data-vc-order';\nconst MARK_KEY = `vc-util-key`;\n\nconst containerCache = new Map<ContainerType, Node & ParentNode>();\n\nexport type ContainerType = Element | ShadowRoot;\nexport type Prepend = boolean | 'queue';\nexport type AppendType = 'prependQueue' | 'append' | 'prepend';\n\ninterface Options {\n  attachTo?: ContainerType;\n  csp?: { nonce?: string };\n  prepend?: Prepend;\n  mark?: string;\n  priority?: number;\n}\n\nfunction getMark({ mark }: Options = {}) {\n  if (mark)\n    return mark.startsWith('data-') ? mark : `data-${mark}`;\n\n  return MARK_KEY;\n}\n\nfunction getContainer(option: Options) {\n  if (option.attachTo)\n    return option.attachTo;\n\n  const head = document.querySelector('head');\n  return head || document.body;\n}\n\nfunction getOrder(prepend?: Prepend): AppendType {\n  if (prepend === 'queue')\n    return 'prependQueue';\n\n  return prepend ? 'prepend' : 'append';\n}\n\n/**\n * Find style which inject by rc-util\n */\nfunction findStyles(container: ContainerType) {\n  return Array.from((containerCache.get(container) || container).children).filter(\n    node => node.tagName === 'STYLE',\n  ) as HTMLStyleElement[];\n}\n\nexport function injectCSS(css: string, option: Options = {}) {\n  if (!canUseDom())\n    return null;\n\n  const { csp, prepend } = option;\n\n  const styleNode = document.createElement('style');\n  styleNode.setAttribute(APPEND_ORDER, getOrder(prepend));\n\n  if (csp?.nonce)\n    styleNode.nonce = csp?.nonce;\n\n  styleNode.innerHTML = css;\n\n  const container = getContainer(option);\n  const { firstChild } = container;\n\n  if (prepend) {\n    // If is queue `prepend`, it will prepend first style and then append rest style\n    if (prepend === 'queue') {\n      const existStyle = findStyles(container).filter(node =>\n        ['prepend', 'prependQueue'].includes(node.getAttribute(APPEND_ORDER)),\n      );\n      if (existStyle.length) {\n        container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);\n\n        return styleNode;\n      }\n    }\n\n    // Use `insertBefore` as `prepend`\n    container.insertBefore(styleNode, firstChild);\n  } else {\n    container.appendChild(styleNode);\n  }\n\n  return styleNode;\n}\n\nfunction findExistNode(key: string, option: Options = {}) {\n  const container = getContainer(option);\n\n  return findStyles(container).find(node => node.getAttribute(getMark(option)) === key);\n}\n\nexport function removeCSS(key: string, option: Options = {}) {\n  const existNode = findExistNode(key, option);\n  if (existNode) {\n    const container = getContainer(option);\n    container.removeChild(existNode);\n  }\n}\n\n/**\n * qiankun will inject `appendChild` to insert into other\n */\nfunction syncRealContainer(container: ContainerType, option: Options) {\n  const cachedRealContainer = containerCache.get(container);\n\n  // Find real container when not cached or cached container removed\n  if (!cachedRealContainer || !contains(document, cachedRealContainer)) {\n    const placeholderStyle = injectCSS('', option);\n    const { parentNode } = placeholderStyle;\n    containerCache.set(container, parentNode);\n    container.removeChild(placeholderStyle);\n  }\n}\n\n/**\n * manually clear container cache to avoid global cache in unit testes\n */\nexport function clearContainerCache() {\n  containerCache.clear();\n}\n\nexport function updateCSS(css: string, key: string, option: Options = {}) {\n  const container = getContainer(option);\n\n  // Sync real parent\n  syncRealContainer(container, option);\n\n  const existNode = findExistNode(key, option);\n\n  if (existNode) {\n    if (option.csp?.nonce && existNode.nonce !== option.csp?.nonce)\n      existNode.nonce = option.csp?.nonce;\n\n    if (existNode.innerHTML !== css)\n      existNode.innerHTML = css;\n\n    return existNode;\n  }\n\n  const newNode = injectCSS(css, option);\n  newNode.setAttribute(getMark(option), key);\n  return newNode;\n}\n"],"names":["canUseDom","contains"],"mappings":"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"}