11/* globals MONACO_EDITOR_VERSION */ 
2+ 
3+ function  importFromCDN ( path )  { 
4+     return  import ( /* @vite -ignore */  path ) 
5+ } 
6+ 
27async  function  setupMonaco ( )  { 
38    if  ( typeof  window  !==  "undefined" )  { 
49        const  monacoScript  = 
@@ -7,7 +12,9 @@ async function setupMonaco() {
712                    script . src  && 
813                    script . src . includes ( "monaco" )  && 
914                    script . src . includes ( "vs/loader" ) , 
10-             )  ||  ( await  appendMonacoEditorScript ( ) ) 
15+             )  || 
16+             // If the script tag that loads the Monaco editor is not found, insert the script tag. 
17+             ( await  appendMonacoEditorScript ( ) ) 
1118
1219        // @ts -expect-error -- global Monaco's require 
1320        window . require . config ( { 
@@ -18,6 +25,53 @@ async function setupMonaco() {
1825    } 
1926} 
2027
28+ /** Load the Monaco editor. */ 
29+ async  function  loadMonacoFromEsmCdn ( )  { 
30+     let  error  =  new  Error ( ) 
31+     const  urlList  =  [ 
32+         { 
33+             script : `https://cdn.jsdelivr.net/npm/monaco-editor@${ MONACO_EDITOR_VERSION }  , 
34+             style : `https://cdn.jsdelivr.net/npm/monaco-editor@${ MONACO_EDITOR_VERSION }  , 
35+         } , 
36+         { 
37+             script : "https://cdn.jsdelivr.net/npm/monaco-editor/+esm" , 
38+             style : "https://cdn.jsdelivr.net/npm/monaco-editor/min/vs/editor/editor.main.css" , 
39+         } , 
40+     ] 
41+     for  ( const  url  of  urlList )  { 
42+         try  { 
43+             const  result  =  await  importFromCDN ( url . script ) 
44+ 
45+             if  ( typeof  document  !==  "undefined" )  { 
46+                 const  link  =  document . createElement ( "link" ) 
47+                 link . rel  =  "stylesheet" 
48+                 link . href  =  url . style 
49+                 document . head . append ( link ) 
50+             } 
51+             return  result 
52+         }  catch  ( e )  { 
53+             // eslint-disable-next-line no-console -- OK 
54+             console . warn ( `Failed to retrieve resource from ${ url }  ) 
55+             error  =  e 
56+         } 
57+     } 
58+     throw  error 
59+ } 
60+ 
61+ async  function  loadModuleFromMonaco ( moduleName )  { 
62+     await  setupMonaco ( ) 
63+ 
64+     return  new  Promise ( ( resolve )  =>  { 
65+         if  ( typeof  window  !==  "undefined" )  { 
66+             // @ts -expect-error -- global Monaco's require 
67+             window . require ( [ moduleName ] ,  ( r )  =>  { 
68+                 resolve ( r ) 
69+             } ) 
70+         } 
71+     } ) 
72+ } 
73+ 
74+ /** Appends a script tag that loads the Monaco editor. */ 
2175async  function  appendMonacoEditorScript ( )  { 
2276    let  error  =  new  Error ( ) 
2377    const  urlList  =  [ 
@@ -41,8 +95,9 @@ async function appendMonacoEditorScript() {
4195
4296/** Appends a script tag. */ 
4397function  appendScript ( src )  { 
98+     const  script  =  document . createElement ( "script" ) 
99+ 
44100    return  new  Promise ( ( resolve ,  reject )  =>  { 
45-         const  script  =  document . createElement ( "script" ) 
46101        script . src  =  src 
47102        script . onload  =  ( )  =>  { 
48103            script . onload  =  null 
@@ -66,30 +121,27 @@ function appendScript(src) {
66121    } ) 
67122} 
68123
69- let  setupedMonaco  =  null 
70- let  editorLoaded  =  null 
124+ let  monacoPromise  =  null 
71125
72- export  function  loadMonacoEngine ( )  { 
73-     return  setupedMonaco  ||  ( setupedMonaco  =  setupMonaco ( ) ) 
74- } 
126+ /** Load the Monaco editor object. */ 
75127export  function  loadMonacoEditor ( )  { 
76-     if  ( editorLoaded )  { 
77-         return  editorLoaded 
78-     } 
79-     return  ( editorLoaded  =  ( async  ( )  =>  { 
80-         const  monaco  =  await  loadModuleFromMonaco ( "vs/editor/editor.main" ) 
81-         return  monaco 
82-     } ) ( ) ) 
83- } 
128+     return  ( 
129+         monacoPromise  || 
130+         ( monacoPromise  =  ( async  ( )  =>  { 
131+             let  rawMonaco  =  undefined 
132+             let  monaco  =  undefined 
133+             try  { 
134+                 rawMonaco  =  await  loadMonacoFromEsmCdn ( ) 
135+             }  catch  { 
136+                 rawMonaco  =  await  loadModuleFromMonaco ( "vs/editor/editor.main" ) 
137+             } 
138+             if  ( "m"  in  rawMonaco )  { 
139+                 monaco  =  rawMonaco . m  ||  rawMonaco 
140+             }  else  { 
141+                 monaco  =  rawMonaco 
142+             } 
84143
85- export  async  function  loadModuleFromMonaco ( moduleName )  { 
86-     await  loadMonacoEngine ( ) 
87-     return  new  Promise ( ( resolve )  =>  { 
88-         if  ( typeof  window  !==  "undefined" )  { 
89-             // @ts -expect-error -- global Monaco's require 
90-             window . require ( [ moduleName ] ,  ( r )  =>  { 
91-                 resolve ( r ) 
92-             } ) 
93-         } 
94-     } ) 
144+             return  monaco 
145+         } ) ( ) ) 
146+     ) 
95147} 
0 commit comments