{"ast":null,"code":"\"use strict\";\n\nvar _slicedToArray = require(\"@babel/runtime/helpers/slicedToArray\");\n\nexports.__esModule = true;\nexports[\"default\"] = initHeadManager;\n\nvar _react = require(\"react\");\n\nvar DOMAttributeNames = {\n  acceptCharset: 'accept-charset',\n  className: 'class',\n  htmlFor: 'for',\n  httpEquiv: 'http-equiv'\n};\n\nfunction reactElementToDOM(_ref) {\n  var type = _ref.type,\n      props = _ref.props;\n  var el = document.createElement(type);\n\n  for (var p in props) {\n    if (!props.hasOwnProperty(p)) continue;\n    if (p === 'children' || p === 'dangerouslySetInnerHTML') continue; // we don't render undefined props to the DOM\n\n    if (props[p] === undefined) continue;\n    var attr = DOMAttributeNames[p] || p.toLowerCase();\n    el.setAttribute(attr, props[p]);\n  }\n\n  var children = props.children,\n      dangerouslySetInnerHTML = props.dangerouslySetInnerHTML;\n\n  if (dangerouslySetInnerHTML) {\n    el.innerHTML = dangerouslySetInnerHTML.__html || '';\n  } else if (children) {\n    el.textContent = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : '';\n  }\n\n  return el;\n}\n\nfunction updateElements(elements, components, removeOldTags) {\n  var headEl = document.getElementsByTagName('head')[0];\n  var oldTags = new Set(elements);\n  components.forEach(function (tag) {\n    if (tag.type === 'title') {\n      var title = '';\n\n      if (tag) {\n        var children = tag.props.children;\n        title = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : '';\n      }\n\n      if (title !== document.title) document.title = title;\n      return;\n    }\n\n    var newTag = reactElementToDOM(tag);\n    var elementIter = elements.values();\n\n    while (true) {\n      // Note: We don't use for-of here to avoid needing to polyfill it.\n      var _elementIter$next = elementIter.next(),\n          done = _elementIter$next.done,\n          value = _elementIter$next.value;\n\n      if (value == null ? void 0 : value.isEqualNode(newTag)) {\n        oldTags[\"delete\"](value);\n        return;\n      }\n\n      if (done) {\n        break;\n      }\n    }\n\n    elements.add(newTag);\n    headEl.appendChild(newTag);\n  });\n  oldTags.forEach(function (oldTag) {\n    if (removeOldTags) {\n      oldTag.parentNode.removeChild(oldTag);\n    }\n\n    elements[\"delete\"](oldTag);\n  });\n}\n\nfunction initHeadManager(initialHeadEntries) {\n  var headEl = document.getElementsByTagName('head')[0];\n  var elements = new Set(headEl.children);\n  updateElements(elements, initialHeadEntries.map(function (_ref2) {\n    var _ref3 = _slicedToArray(_ref2, 2),\n        type = _ref3[0],\n        props = _ref3[1];\n\n    return /*#__PURE__*/(0, _react.createElement)(type, props);\n  }), false);\n  var updatePromise = null;\n  return {\n    mountedInstances: new Set(),\n    updateHead: function updateHead(head) {\n      var promise = updatePromise = Promise.resolve().then(function () {\n        if (promise !== updatePromise) return;\n        updatePromise = null;\n        updateElements(elements, head, true);\n      });\n    }\n  };\n}","map":{"version":3,"sources":["../../client/head-manager.ts"],"names":["DOMAttributeNames","acceptCharset","className","htmlFor","httpEquiv","el","document","props","p","attr","dangerouslySetInnerHTML","Array","children","headEl","oldTags","tag","title","newTag","reactElementToDOM","elementIter","elements","value","oldTag","updateElements","initialHeadEntries","updatePromise","mountedInstances","updateHead","head","promise","Promise"],"mappings":"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","sourcesContent":["import { createElement } from 'react'\nimport { HeadEntry } from '../next-server/lib/utils'\n\nconst DOMAttributeNames: Record<string, string> = {\n  acceptCharset: 'accept-charset',\n  className: 'class',\n  htmlFor: 'for',\n  httpEquiv: 'http-equiv',\n}\n\nfunction reactElementToDOM({ type, props }: JSX.Element): HTMLElement {\n  const el = document.createElement(type)\n  for (const p in props) {\n    if (!props.hasOwnProperty(p)) continue\n    if (p === 'children' || p === 'dangerouslySetInnerHTML') continue\n\n    // we don't render undefined props to the DOM\n    if (props[p] === undefined) continue\n\n    const attr = DOMAttributeNames[p] || p.toLowerCase()\n    el.setAttribute(attr, props[p])\n  }\n\n  const { children, dangerouslySetInnerHTML } = props\n  if (dangerouslySetInnerHTML) {\n    el.innerHTML = dangerouslySetInnerHTML.__html || ''\n  } else if (children) {\n    el.textContent =\n      typeof children === 'string'\n        ? children\n        : Array.isArray(children)\n        ? children.join('')\n        : ''\n  }\n  return el\n}\n\nfunction updateElements(\n  elements: Set<Element>,\n  components: JSX.Element[],\n  removeOldTags: boolean\n) {\n  const headEl = document.getElementsByTagName('head')[0]\n  const oldTags = new Set(elements)\n\n  components.forEach((tag) => {\n    if (tag.type === 'title') {\n      let title = ''\n      if (tag) {\n        const { children } = tag.props\n        title =\n          typeof children === 'string'\n            ? children\n            : Array.isArray(children)\n            ? children.join('')\n            : ''\n      }\n      if (title !== document.title) document.title = title\n      return\n    }\n\n    const newTag = reactElementToDOM(tag)\n    const elementIter = elements.values()\n\n    while (true) {\n      // Note: We don't use for-of here to avoid needing to polyfill it.\n      const { done, value } = elementIter.next()\n      if (value?.isEqualNode(newTag)) {\n        oldTags.delete(value)\n        return\n      }\n\n      if (done) {\n        break\n      }\n    }\n\n    elements.add(newTag)\n    headEl.appendChild(newTag)\n  })\n\n  oldTags.forEach((oldTag) => {\n    if (removeOldTags) {\n      oldTag.parentNode!.removeChild(oldTag)\n    }\n    elements.delete(oldTag)\n  })\n}\n\nexport default function initHeadManager(initialHeadEntries: HeadEntry[]) {\n  const headEl = document.getElementsByTagName('head')[0]\n  const elements = new Set<Element>(headEl.children)\n\n  updateElements(\n    elements,\n    initialHeadEntries.map(([type, props]) => createElement(type, props)),\n    false\n  )\n\n  let updatePromise: Promise<void> | null = null\n\n  return {\n    mountedInstances: new Set(),\n    updateHead: (head: JSX.Element[]) => {\n      const promise = (updatePromise = Promise.resolve().then(() => {\n        if (promise !== updatePromise) return\n\n        updatePromise = null\n        updateElements(elements, head, true)\n      }))\n    },\n  }\n}\n"]},"metadata":{},"sourceType":"script"}