@@ -39,27 +39,39 @@ function loadScript(src) {
39
39
function loadModules ( SymbolSrcPairs ) {
40
40
let firstScript = document . getElementsByTagName ( 'script' ) [ 0 ] ;
41
41
42
- let imports = '' ;
43
- SymbolSrcPairs . map ( ( [ symbol , src ] ) => {
44
- imports += `import ${ symbol } from "${ src } ";\n` ;
45
- imports += `window.${ symbol } = ${ symbol } ;\n` ;
46
- } ) ;
47
-
48
42
return new Promise ( ( resolve , reject ) => {
49
43
const timeout = setTimeout (
50
44
( ) => reject ( new Error ( 'Timed out loading react modules over esm' ) ) ,
51
45
5000
52
46
) ;
53
- window . __loaded = ( ) => {
54
- clearTimeout ( timeout ) ;
55
- resolve ( ) ;
56
- } ;
57
-
58
- const moduleScript = document . createElement ( 'script' ) ;
59
- moduleScript . type = 'module' ;
60
- moduleScript . textContent = imports + 'window.__loaded();' ;
61
47
62
- firstScript . parentNode . insertBefore ( moduleScript , firstScript ) ;
48
+ let loadedCount = 0 ;
49
+ const totalModules = SymbolSrcPairs . length ;
50
+
51
+ SymbolSrcPairs . forEach ( ( [ symbol , src ] ) => {
52
+ if ( typeof symbol !== 'string' || typeof src !== 'string' || ! / ^ h t t p s ? : \/ \/ / . test ( src ) ) {
53
+ reject ( new Error ( `Invalid module specification: ${ symbol } , ${ src } ` ) ) ;
54
+ return ;
55
+ }
56
+
57
+ const scriptNode = document . createElement ( 'script' ) ;
58
+ scriptNode . type = 'module' ;
59
+ scriptNode . src = src ;
60
+ scriptNode . onload = ( ) => {
61
+ window [ symbol ] = window [ symbol ] || { } ; // Ensure the symbol is available globally
62
+ loadedCount ++ ;
63
+ if ( loadedCount === totalModules ) {
64
+ clearTimeout ( timeout ) ;
65
+ resolve ( ) ;
66
+ }
67
+ } ;
68
+ scriptNode . onerror = ( ) => {
69
+ clearTimeout ( timeout ) ;
70
+ reject ( new Error ( `Failed to load module: ${ src } ` ) ) ;
71
+ } ;
72
+
73
+ firstScript . parentNode . insertBefore ( scriptNode , firstScript ) ;
74
+ } ) ;
63
75
} ) ;
64
76
}
65
77
0 commit comments