{"ast":null,"code":"\"use strict\";\n\nexports.__esModule = true;\nexports.default = initHeadManager;\nexports.DOMAttributeNames = void 0;\nconst DOMAttributeNames = {\n  acceptCharset: 'accept-charset',\n  className: 'class',\n  htmlFor: 'for',\n  httpEquiv: 'http-equiv',\n  noModule: 'noModule'\n};\nexports.DOMAttributeNames = DOMAttributeNames;\n\nfunction reactElementToDOM({\n  type,\n  props\n}) {\n  const el = document.createElement(type);\n\n  for (const 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    const attr = DOMAttributeNames[p] || p.toLowerCase();\n\n    if (type === 'script' && (attr === 'async' || attr === 'defer' || attr === 'noModule')) {\n      ;\n      el[attr] = !!props[p];\n    } else {\n      el.setAttribute(attr, props[p]);\n    }\n  }\n\n  const {\n    children,\n    dangerouslySetInnerHTML\n  } = props;\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(type, components) {\n  const headEl = document.getElementsByTagName('head')[0];\n  const headCountEl = headEl.querySelector('meta[name=next-head-count]');\n\n  if (true) {\n    if (!headCountEl) {\n      console.error('Warning: next-head-count is missing. https://err.sh/next.js/next-head-count-missing');\n      return;\n    }\n  }\n\n  const headCount = Number(headCountEl.content);\n  const oldTags = [];\n\n  for (let i = 0, j = headCountEl.previousElementSibling; i < headCount; i++, j = j.previousElementSibling) {\n    if (j.tagName.toLowerCase() === type) {\n      oldTags.push(j);\n    }\n  }\n\n  const newTags = components.map(reactElementToDOM).filter(newTag => {\n    for (let k = 0, len = oldTags.length; k < len; k++) {\n      const oldTag = oldTags[k];\n\n      if (oldTag.isEqualNode(newTag)) {\n        oldTags.splice(k, 1);\n        return false;\n      }\n    }\n\n    return true;\n  });\n  oldTags.forEach(t => t.parentNode.removeChild(t));\n  newTags.forEach(t => headEl.insertBefore(t, headCountEl));\n  headCountEl.content = (headCount - oldTags.length + newTags.length).toString();\n}\n\nfunction initHeadManager() {\n  let updatePromise = null;\n  return {\n    mountedInstances: new Set(),\n    updateHead: head => {\n      const promise = updatePromise = Promise.resolve().then(() => {\n        if (promise !== updatePromise) return;\n        updatePromise = null;\n        const tags = {};\n        head.forEach(h => {\n          const components = tags[h.type] || [];\n          components.push(h);\n          tags[h.type] = components;\n        });\n        const titleComponent = tags.title ? tags.title[0] : null;\n        let title = '';\n\n        if (titleComponent) {\n          const {\n            children\n          } = titleComponent.props;\n          title = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : '';\n        }\n\n        if (title !== document.title) document.title = title;\n        ['meta', 'base', 'link', 'style', 'script'].forEach(type => {\n          updateElements(type, tags[type] || []);\n        });\n      });\n    }\n  };\n}","map":{"version":3,"sources":["../../client/head-manager.ts"],"names":["DOMAttributeNames","acceptCharset","className","htmlFor","httpEquiv","noModule","el","document","props","p","attr","type","dangerouslySetInnerHTML","Array","children","headEl","headCountEl","console","headCount","Number","oldTags","i","j","newTags","components","newTag","k","len","oldTag","t","updatePromise","mountedInstances","updateHead","head","promise","Promise","tags","h","titleComponent","title","updateElements"],"mappings":";;;;;AAAO,MAAMA,iBAAyC,GAAG;AACvDC,EAAAA,aAAa,EAD0C,gBAAA;AAEvDC,EAAAA,SAAS,EAF8C,OAAA;AAGvDC,EAAAA,OAAO,EAHgD,KAAA;AAIvDC,EAAAA,SAAS,EAJ8C,YAAA;AAKvDC,EAAAA,QAAQ,EALH;AAAkD,CAAlD;;;AAQP,SAAA,iBAAA,CAA2B;AAAA,EAAA,IAAA;AAA3B,EAAA;AAA2B,CAA3B,EAAsE;AACpE,QAAMC,EAAe,GAAGC,QAAQ,CAARA,aAAAA,CAAxB,IAAwBA,CAAxB;;AACA,OAAK,MAAL,CAAA,IAAA,KAAA,EAAuB;AACrB,QAAI,CAACC,KAAK,CAALA,cAAAA,CAAL,CAAKA,CAAL,EAA8B;AAC9B,QAAIC,CAAC,KAADA,UAAAA,IAAoBA,CAAC,KAAzB,yBAAA,EAAyD,SAFpC,CAIrB;;AACA,QAAID,KAAK,CAALA,CAAK,CAALA,KAAJ,SAAA,EAA4B;AAE5B,UAAME,IAAI,GAAGV,iBAAiB,CAAjBA,CAAiB,CAAjBA,IAAwBS,CAAC,CAAtC,WAAqCA,EAArC;;AACA,QACEE,IAAI,KAAJA,QAAAA,KACCD,IAAI,KAAJA,OAAAA,IAAoBA,IAAI,KAAxBA,OAAAA,IAAwCA,IAAI,KAF/C,UACEC,CADF,EAGE;AACA;AAAEL,MAAAA,EAAD,CAAA,IAAA,CAACA,GAAiC,CAAC,CAACE,KAAK,CAAzC,CAAyC,CAAxCF;AAJJ,KAAA,MAKO;AACLA,MAAAA,EAAE,CAAFA,YAAAA,CAAAA,IAAAA,EAAsBE,KAAK,CAA3BF,CAA2B,CAA3BA;AAEH;AAED;;AAAA,QAAM;AAAA,IAAA,QAAA;AAAA,IAAA;AAAA,MAAN,KAAA;;AACA,MAAA,uBAAA,EAA6B;AAC3BA,IAAAA,EAAE,CAAFA,SAAAA,GAAeM,uBAAuB,CAAvBA,MAAAA,IAAfN,EAAAA;AADF,GAAA,MAEO,IAAA,QAAA,EAAc;AACnBA,IAAAA,EAAE,CAAFA,WAAAA,GACE,OAAA,QAAA,KAAA,QAAA,GAAA,QAAA,GAEIO,KAAK,CAALA,OAAAA,CAAAA,QAAAA,IACAC,QAAQ,CAARA,IAAAA,CADAD,EACAC,CADAD,GAHNP,EAAAA;AAOF;;AAAA,SAAA,EAAA;AAGF;;AAAA,SAAA,cAAA,CAAA,IAAA,EAAA,UAAA,EAAuE;AACrE,QAAMS,MAAM,GAAGR,QAAQ,CAARA,oBAAAA,CAAAA,MAAAA,EAAf,CAAeA,CAAf;AACA,QAAMS,WAA4B,GAAGD,MAAM,CAANA,aAAAA,CAArC,4BAAqCA,CAArC;;AAGA,YAA2C;AACzC,QAAI,CAAJ,WAAA,EAAkB;AAChBE,MAAAA,OAAO,CAAPA,KAAAA,CAAAA,qFAAAA;AAGA;AAEH;AAED;;AAAA,QAAMC,SAAS,GAAGC,MAAM,CAACH,WAAW,CAApC,OAAwB,CAAxB;AACA,QAAMI,OAAkB,GAAxB,EAAA;;AAEA,OACE,IAAIC,CAAC,GAAL,CAAA,EAAWC,CAAC,GAAGN,WAAW,CAD5B,sBAAA,EAEEK,CAAC,GAFH,SAAA,EAGEA,CAAC,IAAIC,CAAC,GAAGA,CAAC,CAHZ,sBAAA,EAIE;AACA,QAAIA,CAAC,CAADA,OAAAA,CAAAA,WAAAA,OAAJ,IAAA,EAAuC;AACrCF,MAAAA,OAAO,CAAPA,IAAAA,CAAAA,CAAAA;AAEH;AACD;;AAAA,QAAMG,OAAO,GAAIC,UAAU,CAAVA,GAAAA,CAAD,iBAACA,EAAD,MAACA,CACdC,MAAD,IAAY;AACV,SAAK,IAAIC,CAAC,GAAL,CAAA,EAAWC,GAAG,GAAGP,OAAO,CAA7B,MAAA,EAAsCM,CAAC,GAAvC,GAAA,EAA+CA,CAA/C,EAAA,EAAoD;AAClD,YAAME,MAAM,GAAGR,OAAO,CAAtB,CAAsB,CAAtB;;AACA,UAAIQ,MAAM,CAANA,WAAAA,CAAJ,MAAIA,CAAJ,EAAgC;AAC9BR,QAAAA,OAAO,CAAPA,MAAAA,CAAAA,CAAAA,EAAAA,CAAAA;AACA,eAAA,KAAA;AAEH;AACD;;AAAA,WAAA,IAAA;AATJ,GAAiBI,CAAjB;AAaAJ,EAAAA,OAAO,CAAPA,OAAAA,CAAiBS,CAAD,IAAOA,CAAC,CAADA,UAAAA,CAAAA,WAAAA,CAAvBT,CAAuBS,CAAvBT;AACAG,EAAAA,OAAO,CAAPA,OAAAA,CAAiBM,CAAD,IAAOd,MAAM,CAANA,YAAAA,CAAAA,CAAAA,EAAvBQ,WAAuBR,CAAvBQ;AACAP,EAAAA,WAAW,CAAXA,OAAAA,GAAsB,CAACE,SAAS,GAAGE,OAAO,CAAnBF,MAAAA,GAA6BK,OAAO,CAArC,MAAA,EAAtBP,QAAsB,EAAtBA;AAGa;;AAAA,SAAA,eAAA,GAGb;AACA,MAAIc,aAAmC,GAAvC,IAAA;AAEA,SAAO;AACLC,IAAAA,gBAAgB,EAAE,IADb,GACa,EADb;AAELC,IAAAA,UAAU,EAAGC,IAAD,IAAyB;AACnC,YAAMC,OAAO,GAAIJ,aAAa,GAAGK,OAAO,CAAPA,OAAAA,GAAAA,IAAAA,CAAuB,MAAM;AAC5D,YAAID,OAAO,KAAX,aAAA,EAA+B;AAE/BJ,QAAAA,aAAa,GAAbA,IAAAA;AACA,cAAMM,IAAmC,GAAzC,EAAA;AAEAH,QAAAA,IAAI,CAAJA,OAAAA,CAAcI,CAAD,IAAO;AAClB,gBAAMb,UAAU,GAAGY,IAAI,CAACC,CAAC,CAAND,IAAI,CAAJA,IAAnB,EAAA;AACAZ,UAAAA,UAAU,CAAVA,IAAAA,CAAAA,CAAAA;AACAY,UAAAA,IAAI,CAACC,CAAC,CAAND,IAAI,CAAJA,GAAAA,UAAAA;AAHFH,SAAAA;AAMA,cAAMK,cAAc,GAAGF,IAAI,CAAJA,KAAAA,GAAaA,IAAI,CAAJA,KAAAA,CAAbA,CAAaA,CAAbA,GAAvB,IAAA;AACA,YAAIG,KAAK,GAAT,EAAA;;AACA,YAAA,cAAA,EAAoB;AAClB,gBAAM;AAAA,YAAA;AAAA,cAAeD,cAAc,CAAnC,KAAA;AACAC,UAAAA,KAAK,GACH,OAAA,QAAA,KAAA,QAAA,GAAA,QAAA,GAEI1B,KAAK,CAALA,OAAAA,CAAAA,QAAAA,IACAC,QAAQ,CAARA,IAAAA,CADAD,EACAC,CADAD,GAHN0B,EAAAA;AAOF;;AAAA,YAAIA,KAAK,KAAKhC,QAAQ,CAAtB,KAAA,EAA8BA,QAAQ,CAARA,KAAAA,GAAAA,KAAAA;AAC7B,SAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,CAAqDI,IAAD,IAAU;AAC7D6B,UAAAA,cAAc,CAAA,IAAA,EAAOJ,IAAI,CAAJA,IAAI,CAAJA,IAArBI,EAAc,CAAdA;AADD,SAAA;AAxBH,OAAiCL,CAAjC;AAHJ;AAAO,GAAP;AAiCD","sourcesContent":["export const DOMAttributeNames: Record<string, string> = {\n  acceptCharset: 'accept-charset',\n  className: 'class',\n  htmlFor: 'for',\n  httpEquiv: 'http-equiv',\n  noModule: 'noModule',\n}\n\nfunction reactElementToDOM({ type, props }: JSX.Element): HTMLElement {\n  const el: HTMLElement = 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    if (\n      type === 'script' &&\n      (attr === 'async' || attr === 'defer' || attr === 'noModule')\n    ) {\n      ;(el as HTMLScriptElement)[attr] = !!props[p]\n    } else {\n      el.setAttribute(attr, props[p])\n    }\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(type: string, components: JSX.Element[]): void {\n  const headEl = document.getElementsByTagName('head')[0]\n  const headCountEl: HTMLMetaElement = headEl.querySelector(\n    'meta[name=next-head-count]'\n  ) as HTMLMetaElement\n  if (process.env.NODE_ENV !== 'production') {\n    if (!headCountEl) {\n      console.error(\n        'Warning: next-head-count is missing. https://err.sh/next.js/next-head-count-missing'\n      )\n      return\n    }\n  }\n\n  const headCount = Number(headCountEl.content)\n  const oldTags: Element[] = []\n\n  for (\n    let i = 0, j = headCountEl.previousElementSibling;\n    i < headCount;\n    i++, j = j!.previousElementSibling\n  ) {\n    if (j!.tagName.toLowerCase() === type) {\n      oldTags.push(j!)\n    }\n  }\n  const newTags = (components.map(reactElementToDOM) as HTMLElement[]).filter(\n    (newTag) => {\n      for (let k = 0, len = oldTags.length; k < len; k++) {\n        const oldTag = oldTags[k]\n        if (oldTag.isEqualNode(newTag)) {\n          oldTags.splice(k, 1)\n          return false\n        }\n      }\n      return true\n    }\n  )\n\n  oldTags.forEach((t) => t.parentNode!.removeChild(t))\n  newTags.forEach((t) => headEl.insertBefore(t, headCountEl))\n  headCountEl.content = (headCount - oldTags.length + newTags.length).toString()\n}\n\nexport default function initHeadManager(): {\n  mountedInstances: Set<unknown>\n  updateHead: (head: JSX.Element[]) => void\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        const tags: Record<string, JSX.Element[]> = {}\n\n        head.forEach((h) => {\n          const components = tags[h.type] || []\n          components.push(h)\n          tags[h.type] = components\n        })\n\n        const titleComponent = tags.title ? tags.title[0] : null\n        let title = ''\n        if (titleComponent) {\n          const { children } = titleComponent.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        ;['meta', 'base', 'link', 'style', 'script'].forEach((type) => {\n          updateElements(type, tags[type] || [])\n        })\n      }))\n    },\n  }\n}\n"]},"metadata":{},"sourceType":"script"}