126ad19fcSEvan Bacon/** 226ad19fcSEvan Bacon * Copyright © 2022 650 Industries. 326ad19fcSEvan Bacon * 426ad19fcSEvan Bacon * This source code is licensed under the MIT license found in the 526ad19fcSEvan Bacon * LICENSE file in the root directory of this source tree. 626ad19fcSEvan Bacon */ 726ad19fcSEvan Bacon// Basically `__webpack_require__.l`. 826ad19fcSEvan Baconexport function fetchThenEvalAsync( 926ad19fcSEvan Bacon url: string, 1026ad19fcSEvan Bacon { 1126ad19fcSEvan Bacon scriptType, 1226ad19fcSEvan Bacon nonce, 1326ad19fcSEvan Bacon crossOrigin, 1426ad19fcSEvan Bacon }: { scriptType?: string; nonce?: string; crossOrigin?: string } = {} 1526ad19fcSEvan Bacon): Promise<void> { 1626ad19fcSEvan Bacon if (typeof document === 'undefined') { 17*4a8c0978SEvan Bacon return require('./fetchThenEvalJs').fetchThenEvalAsync(url); 1826ad19fcSEvan Bacon } 1926ad19fcSEvan Bacon return new Promise<void>((resolve, reject) => { 2026ad19fcSEvan Bacon const script = document.createElement('script'); 2126ad19fcSEvan Bacon if (scriptType) script.type = scriptType; 2226ad19fcSEvan Bacon if (nonce) script.setAttribute('nonce', nonce); 2326ad19fcSEvan Bacon // script.setAttribute('data-expo-metro', ...); 2426ad19fcSEvan Bacon script.src = url; 2526ad19fcSEvan Bacon 2626ad19fcSEvan Bacon if (crossOrigin && script.src.indexOf(window.location.origin + '/') !== 0) { 2726ad19fcSEvan Bacon script.crossOrigin = crossOrigin; 2826ad19fcSEvan Bacon } 2926ad19fcSEvan Bacon 3026ad19fcSEvan Bacon script.onload = () => { 3126ad19fcSEvan Bacon script.parentNode && script.parentNode.removeChild(script); 3226ad19fcSEvan Bacon resolve(); 3326ad19fcSEvan Bacon }; 3426ad19fcSEvan Bacon // Create a new error object to preserve the original stack trace. 3526ad19fcSEvan Bacon const error = new AsyncRequireError(); 3626ad19fcSEvan Bacon 3726ad19fcSEvan Bacon // Server error or network error. 3826ad19fcSEvan Bacon script.onerror = (ev) => { 3926ad19fcSEvan Bacon let event: Event; 4026ad19fcSEvan Bacon if (typeof ev === 'string') { 4126ad19fcSEvan Bacon event = { 4226ad19fcSEvan Bacon type: 'error', 4326ad19fcSEvan Bacon target: { 4426ad19fcSEvan Bacon // @ts-expect-error 4526ad19fcSEvan Bacon src: event, 4626ad19fcSEvan Bacon }, 4726ad19fcSEvan Bacon }; 4826ad19fcSEvan Bacon } else { 4926ad19fcSEvan Bacon event = ev; 5026ad19fcSEvan Bacon } 5126ad19fcSEvan Bacon 5226ad19fcSEvan Bacon const errorType = event && (event.type === 'load' ? 'missing' : event.type); 5326ad19fcSEvan Bacon // @ts-expect-error 5426ad19fcSEvan Bacon const realSrc = event?.target?.src; 5526ad19fcSEvan Bacon error.message = 'Loading module ' + url + ' failed.\n(' + errorType + ': ' + realSrc + ')'; 5626ad19fcSEvan Bacon error.type = errorType; 5726ad19fcSEvan Bacon error.request = realSrc; 5826ad19fcSEvan Bacon 5926ad19fcSEvan Bacon script.parentNode && script.parentNode.removeChild(script); 6026ad19fcSEvan Bacon reject(error); 6126ad19fcSEvan Bacon }; 6226ad19fcSEvan Bacon document.head.appendChild(script); 6326ad19fcSEvan Bacon }); 6426ad19fcSEvan Bacon} 6526ad19fcSEvan Bacon 6626ad19fcSEvan Baconclass AsyncRequireError extends Error { 6726ad19fcSEvan Bacon readonly name = 'AsyncRequireError'; 6826ad19fcSEvan Bacon type?: string; 6926ad19fcSEvan Bacon request?: string; 7026ad19fcSEvan Bacon} 71