UNPKG

7.83 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../client/script.tsx"],"names":["ScriptCache","Map","LoadCache","Set","ignoreProps","loadScript","props","src","id","onLoad","dangerouslySetInnerHTML","children","onError","cacheKey","has","add","get","then","el","document","createElement","loadPromise","Promise","resolve","reject","addEventListener","call","set","innerHTML","__html","textContent","Array","isArray","join","k","value","Object","entries","undefined","includes","attr","DOMAttributeNames","toLowerCase","setAttribute","body","appendChild","handleClientScriptLoad","strategy","window","loadLazyScript","readyState","initScriptLoader","scriptLoaderItems","forEach","Script","restProps","updateScripts","scripts","HeadManagerContext","beforeInteractive","concat"],"mappings":"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","sourcesContent":["import React, { useEffect, useContext } from 'react'\nimport { ScriptHTMLAttributes } from 'react'\nimport { HeadManagerContext } from '../next-server/lib/head-manager-context'\nimport { DOMAttributeNames } from './head-manager'\nimport { requestIdleCallback } from './request-idle-callback'\n\nconst ScriptCache = new Map()\nconst LoadCache = new Set()\n\nexport interface Props extends ScriptHTMLAttributes<HTMLScriptElement> {\n strategy?: 'afterInteractive' | 'lazyOnload' | 'beforeInteractive'\n id?: string\n onLoad?: () => void\n onError?: () => void\n children?: React.ReactNode\n}\n\nconst ignoreProps = [\n 'onLoad',\n 'dangerouslySetInnerHTML',\n 'children',\n 'onError',\n 'strategy',\n]\n\nconst loadScript = (props: Props): void => {\n const {\n src,\n id,\n onLoad = () => {},\n dangerouslySetInnerHTML,\n children = '',\n onError,\n } = props\n\n const cacheKey = id || src\n if (ScriptCache.has(src)) {\n if (!LoadCache.has(cacheKey)) {\n LoadCache.add(cacheKey)\n // Execute onLoad since the script loading has begun\n ScriptCache.get(src).then(onLoad, onError)\n }\n return\n }\n\n const el = document.createElement('script')\n\n const loadPromise = new Promise<void>((resolve, reject) => {\n el.addEventListener('load', function () {\n resolve()\n if (onLoad) {\n onLoad.call(this)\n }\n })\n el.addEventListener('error', function () {\n reject()\n if (onError) {\n onError()\n }\n })\n })\n\n if (src) {\n ScriptCache.set(src, loadPromise)\n LoadCache.add(cacheKey)\n }\n\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 } else if (src) {\n el.src = src\n }\n\n for (const [k, value] of Object.entries(props)) {\n if (value === undefined || ignoreProps.includes(k)) {\n continue\n }\n\n const attr = DOMAttributeNames[k] || k.toLowerCase()\n el.setAttribute(attr, value)\n }\n\n document.body.appendChild(el)\n}\n\nfunction handleClientScriptLoad(props: Props) {\n const { strategy = 'afterInteractive' } = props\n if (strategy === 'afterInteractive') {\n loadScript(props)\n } else if (strategy === 'lazyOnload') {\n window.addEventListener('load', () => {\n requestIdleCallback(() => loadScript(props))\n })\n }\n}\n\nfunction loadLazyScript(props: Props) {\n if (document.readyState === 'complete') {\n requestIdleCallback(() => loadScript(props))\n } else {\n window.addEventListener('load', () => {\n requestIdleCallback(() => loadScript(props))\n })\n }\n}\n\nexport function initScriptLoader(scriptLoaderItems: Props[]) {\n scriptLoaderItems.forEach(handleClientScriptLoad)\n}\n\nfunction Script(props: Props): JSX.Element | null {\n const {\n src = '',\n onLoad = () => {},\n dangerouslySetInnerHTML,\n strategy = 'afterInteractive',\n onError,\n ...restProps\n } = props\n\n // Context is available only during SSR\n const { updateScripts, scripts } = useContext(HeadManagerContext)\n\n useEffect(() => {\n if (strategy === 'afterInteractive') {\n loadScript(props)\n } else if (strategy === 'lazyOnload') {\n loadLazyScript(props)\n }\n }, [props, strategy])\n\n if (strategy === 'beforeInteractive') {\n if (updateScripts) {\n scripts.beforeInteractive = (scripts.beforeInteractive || []).concat([\n {\n src,\n onLoad,\n onError,\n ...restProps,\n },\n ])\n updateScripts(scripts)\n }\n }\n\n return null\n}\n\nexport default Script\n"]}
\No newline at end of file