UNPKG

9.26 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../client/head-manager.ts"],"names":["DOMAttributeNames","acceptCharset","className","htmlFor","httpEquiv","noModule","reactElementToDOM","type","props","el","document","createElement","p","hasOwnProperty","undefined","attr","toLowerCase","setAttribute","children","dangerouslySetInnerHTML","innerHTML","__html","textContent","Array","isArray","join","updateElements","components","headEl","getElementsByTagName","headCountEl","querySelector","process","env","NODE_ENV","console","error","headCount","Number","content","oldTags","i","j","previousElementSibling","tagName","push","newTags","map","filter","newTag","k","len","length","oldTag","isEqualNode","splice","forEach","t","parentNode","removeChild","insertBefore","toString","initHeadManager","updatePromise","mountedInstances","Set","updateHead","head","promise","Promise","resolve","then","tags","h","href","titleComponent","title"],"mappings":"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","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://nextjs.org/docs/messages/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 if (\n // If the font tag is loaded only on client navigation\n // it won't be inlined. In this case revert to the original behavior\n h.type === 'link' &&\n h.props['data-optimized-fonts'] &&\n !document.querySelector(\n `style[data-href=\"${h.props['data-href']}\"]`\n )\n ) {\n h.props.href = h.props['data-href']\n h.props['data-href'] = undefined\n }\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"]}
\No newline at end of file