11import React , { Suspense , lazy } from "react" ;
22import useThemeContext from "@theme/hooks/useThemeContext" ;
3+ import { libs } from "./monaco-types" ;
34
45const MonacoEditor = lazy ( ( ) => import ( "react-monaco-editor" ) ) ;
56
67function Monaco ( props ) {
8+ let monacoRef ;
79 const { isDarkTheme } = useThemeContext ( ) ;
810
911 function onEditorWillMount ( monaco ) {
12+ monacoRef = monaco ;
1013 const vsDarkTheme = {
1114 base : "vs-dark" ,
1215 inherit : true ,
@@ -18,16 +21,41 @@ function Monaco(props) {
1821
1922 monaco . editor . defineTheme ( "vs-dark" , vsDarkTheme ) ;
2023
24+ monaco . languages . typescript . typescriptDefaults . setCompilerOptions ( {
25+ target : monaco . languages . typescript . ScriptTarget . ES2017 ,
26+ allowNonTsExtensions : true ,
27+ moduleResolution : monaco . languages . typescript . ModuleResolutionKind . NodeJs ,
28+ module : monaco . languages . typescript . ModuleKind . ESNext ,
29+ typeRoots : [ "node_modules/@types" ] ,
30+ } ) ;
31+
32+ libs . forEach ( ( lib ) => {
33+ const MONACO_LIB_PREFIX = "file:///node_modules/" ;
34+ const path = `${ MONACO_LIB_PREFIX } ${ lib . name } ` ;
35+ monaco . languages . typescript . typescriptDefaults . addExtraLib ( lib . dts , path ) ;
36+ } ) ;
37+
2138 if ( props . editorWillMount ) {
2239 props . editorWillMount ( monaco ) ;
2340 }
2441 }
2542
43+ function onEditorDidMount ( editor ) {
44+ editor . setModel (
45+ monacoRef . editor . createModel (
46+ props . value ,
47+ "typescript" ,
48+ monacoRef . Uri . parse ( `file:///main-${ Math . random ( ) } .ts` )
49+ )
50+ ) ;
51+ }
52+
2653 return (
2754 < Suspense fallback = { < div > Loading</ div > } >
2855 < MonacoEditor
2956 { ...props }
3057 editorWillMount = { onEditorWillMount }
58+ editorDidMount = { onEditorDidMount }
3159 theme = { isDarkTheme ? "vs-dark" : "vs-light" }
3260 />
3361 </ Suspense >
0 commit comments