@@ -17,23 +17,59 @@ async function setupMonaco() {
1717 }
1818}
1919
20- function appendMonacoEditorScript ( ) {
21- return new Promise ( ( resolve ) => {
22- const script = document . createElement ( 'script' ) ;
23- script . src = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.26.1/min/vs/loader.min.js' ;
20+ async function appendMonacoEditorScript ( ) {
21+ let error = new Error ( ) ;
22+ const urlList = [
23+ 'https://cdn.jsdelivr.net/npm/monaco-editor/dev/vs/loader.min.js' ,
24+ 'https://unpkg.com/monaco-editor@latest/min/vs/loader.js'
25+ ] ;
26+
27+ /* global MONACO_EDITOR_VERSION -- Define monaco-editor version */
28+ if ( typeof MONACO_EDITOR_VERSION !== 'undefined' ) {
29+ urlList . unshift (
30+ `https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/${ MONACO_EDITOR_VERSION } /min/vs/loader.min.js` ,
31+ `https://cdn.jsdelivr.net/npm/monaco-editor@${ MONACO_EDITOR_VERSION } /dev/vs/loader.min.js` ,
32+ `https://unpkg.com/monaco-editor/${ MONACO_EDITOR_VERSION } /min/vs/loader.min.js`
33+ ) ;
34+ }
35+ for ( const url of urlList ) {
36+ try {
37+ return await appendScript ( url ) ;
38+ } catch ( e ) {
39+ // eslint-disable-next-line no-console -- OK
40+ console . warn ( `Failed to retrieve resource from ${ url } ` ) ;
41+ error = e ;
42+ }
43+ }
44+ throw error ;
45+ }
46+
47+ /** Appends a script tag. */
48+ function appendScript ( src ) {
49+ const script = document . createElement ( 'script' ) ;
50+
51+ return new Promise ( ( resolve , reject ) => {
52+ script . src = src ;
2453 script . onload = ( ) => {
2554 script . onload = null ;
2655
2756 watch ( ) ;
2857
2958 function watch ( ) {
59+ // @ts -expect-error -- global Monaco's require
3060 if ( window . require ) {
3161 resolve ( script ) ;
62+
3263 return ;
3364 }
65+
3466 setTimeout ( watch , 200 ) ;
3567 }
3668 } ;
69+ script . onerror = ( e ) => {
70+ reject ( e ) ;
71+ document . head . removeChild ( script ) ;
72+ } ;
3773 document . head . append ( script ) ;
3874 } ) ;
3975}
0 commit comments