import { createNetworkError } from '../common'; import { BundleInfo } from './get-bundle-info'; export function loadScripts({ urls, WebComponent, module }: BundleInfo) { return Promise.all( urls.js.map(url => { const script = Array.from(document.scripts).find(({ src }) => src === url); if (!script) { return new Promise((resolve, reject) => { const script = document.createElement('script'); if (module) { script.type = 'module'; } else { script.async = true; } script.crossOrigin = 'anonymous'; script.onload = () => { script.dataset.webComponent = WebComponent; script.onload = null; script.onerror = null; resolve(); }; script.onerror = () => { /* * Remove the failed script so a later remount can retry * instead of waiting on it forever. */ script.remove(); reject(createNetworkError(`Failed to load script: "${url}".`)); }; script.src = url; document.body.append(script); }); } if (!script.dataset.webComponent) { return new Promise((resolve, reject) => { const originalOnload = script.onload; const originalOnerror = script.onerror; script.onload = (...args) => { originalOnload?.call(script, ...args); script.onload = null; script.onerror = null; resolve(); }; script.onerror = (...args) => { originalOnerror?.call(script, ...args); script.remove(); reject(createNetworkError(`Failed to load script: "${url}".`)); }; }); } return Promise.resolve(); }) ); }