@@ -25,10 +25,14 @@ export function loadMonaco(): Promise<Monaco> {
2525 return (
2626 monacoPromise ||
2727 ( monacoPromise = ( async ( ) => {
28- const rawMonaco : Monaco | { m : Monaco } = await loadModuleFromMonaco (
29- "vs/editor/editor.main" ,
30- ) ;
31- let monaco : Monaco ;
28+ let rawMonaco : Monaco | { m : Monaco } , monaco : Monaco ;
29+ try {
30+ rawMonaco = await loadMonacoFromEsmCdn ( ) ;
31+ } catch {
32+ rawMonaco = await loadModuleFromMonaco < Monaco | { m : Monaco } > (
33+ "vs/editor/editor.main" ,
34+ ) ;
35+ }
3236 if ( "m" in rawMonaco ) {
3337 monaco = rawMonaco . m || rawMonaco ;
3438 } else {
@@ -102,6 +106,29 @@ function setAllValidations(
102106 } ) ;
103107}
104108
109+ /** Load the Monaco editor. */
110+ async function loadMonacoFromEsmCdn ( ) : Promise < Monaco > {
111+ let error = new Error ( ) ;
112+ const urlList = [ "https://cdn.jsdelivr.net/npm/monaco-editor/+esm" ] ;
113+
114+ if ( typeof monacoVersion !== "undefined" ) {
115+ urlList . unshift (
116+ `https://cdn.jsdelivr.net/npm/monaco-editor@${ monacoVersion } /+esm` ,
117+ ) ;
118+ }
119+ for ( const url of urlList ) {
120+ try {
121+ const result = await importFromCDN ( url ) ;
122+ return result as Monaco ;
123+ } catch ( e : unknown ) {
124+ // eslint-disable-next-line no-console -- OK
125+ console . warn ( `Failed to retrieve resource from ${ url } ` ) ;
126+ error = e as Error ;
127+ }
128+ }
129+ throw error ;
130+ }
131+
105132async function loadModuleFromMonaco < T > ( moduleName : string ) : Promise < T > {
106133 await setupMonaco ( ) ;
107134
0 commit comments