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