11/* eslint-disable @typescript-eslint/no-var-requires */
2- import { useEffect , useState , useCallback , useRef } from 'react' ;
2+ import { useEffect , useState , useCallback } from 'react' ;
33import CodeIcon from '@rsuite/icons/Code' ;
44import classNames from 'classnames' ;
5+ import { transform as transformCode , Options } from 'sucrase' ;
56import CodeEditor from './CodeEditor' ;
67import Preview from './Preview' ;
78import canUseDOM from './utils/canUseDOM' ;
9+ import evalCode from './utils/evalCode' ;
810
911const React = require ( 'react' ) ;
1012const ReactDOM = require ( 'react-dom' ) ;
@@ -37,38 +39,24 @@ export interface RendererProps extends Omit<React.HTMLAttributes<HTMLElement>, '
3739 } ;
3840
3941 /**
40- * swc configuration
41- * https://swc.rs/docs/configuration/compilation
42+ * https://github.com/alangpierce/sucrase#transforms
4243 */
43- transformOptions ?: object ;
44+ transformOptions ?: Options ;
4445
4546 /** Customize the rendering toolbar */
4647 renderToolbar ?: ( buttons : React . ReactNode ) => React . ReactNode ;
4748
4849 /** Callback triggered after code change */
4950 onChange ?: ( code ?: string ) => void ;
5051
51- /**
52- * A compiler that transforms the code. Use swc.transformSync by default
53- * See https://swc.rs/docs/usage/wasm
54- */
55- compiler ?: ( code : string ) => string ;
56-
5752 /** Executed before compiling the code */
5853 beforeCompile ?: ( code : string ) => string ;
5954
6055 /** Executed after compiling the code */
6156 afterCompile ?: ( code : string ) => string ;
6257}
6358
64- const defaultTransformOptions = {
65- jsc : {
66- parser : {
67- syntax : 'ecmascript' ,
68- jsx : true
69- }
70- }
71- } ;
59+ const defaultTransformOptions : Options = { transforms : [ 'jsx' ] } ;
7260
7361const Renderer = React . forwardRef ( ( props : RendererProps , ref : React . Ref < HTMLDivElement > ) => {
7462 const {
@@ -81,7 +69,6 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
8169 renderToolbar,
8270 onChange,
8371 beforeCompile,
84- compiler,
8572 afterCompile,
8673 ...rest
8774 } = props ;
@@ -94,21 +81,6 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
9481 ...editorProps
9582 } = editor ;
9683
97- const [ initialized , setInitialized ] = useState ( false ) ;
98- const transfrom = useRef < any > ( null ) ;
99-
100- useEffect ( ( ) => {
101- if ( ! canUseDOM ) {
102- return ;
103- }
104-
105- import ( '@swc/wasm-web' ) . then ( async module => {
106- await module . default ( ) ;
107- transfrom . current = module . transformSync ;
108- setInitialized ( true ) ;
109- } ) ;
110- } , [ ] ) ;
111-
11284 const [ editable , setEditable ] = useState ( isEditable ) ;
11385 const [ hasError , setHasError ] = useState ( false ) ;
11486 const [ errorMessage , setErrorMessage ] = useState ( null ) ;
@@ -139,18 +111,16 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
139111 } ;
140112
141113 try {
142- const statement = dependencies
143- ? Object . keys ( dependencies ) . map ( key => `var ${ key } = dependencies.${ key } ;` )
144- : [ ] ;
145-
146114 const beforeCompileCode = beforeCompile ?.( pendCode ) || pendCode ;
147115
148116 if ( beforeCompileCode ) {
149- const { code : compiledCode } = compiler
150- ? compiler ( beforeCompileCode )
151- : transfrom . current ?.( beforeCompileCode , transformOptions ) ;
117+ const { code : compiledCode } = transformCode ( beforeCompileCode , transformOptions ) ;
152118
153- eval ( `${ statement . join ( '\n' ) } ${ afterCompile ?.( compiledCode ) || compiledCode } ` ) ;
119+ evalCode ( afterCompile ?.( compiledCode ) || compiledCode , {
120+ React,
121+ ReactDOM,
122+ ...dependencies
123+ } ) ;
154124 }
155125 } catch ( err ) {
156126 console . error ( err ) ;
@@ -159,26 +129,22 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
159129 ReactDOM . render = originalRender ;
160130 }
161131 } ,
162- [ code , dependencies , beforeCompile , compiler , transformOptions , afterCompile ]
132+ [ code , dependencies , beforeCompile , transformOptions , afterCompile ]
163133 ) ;
164134
165135 useEffect ( ( ) => {
166- if ( initialized ) {
167- executeCode ( code ) ;
168- }
169- } , [ initialized , code , executeCode ] ) ;
136+ executeCode ( code ) ;
137+ } , [ code , executeCode ] ) ;
170138
171139 const handleCodeChange = useCallback (
172140 ( code ?: string ) => {
173141 setHasError ( false ) ;
174142 setErrorMessage ( null ) ;
175143 onChange ?.( code ) ;
176144
177- if ( initialized ) {
178- executeCode ( code ) ;
179- }
145+ executeCode ( code ) ;
180146 } ,
181- [ executeCode , initialized , onChange ]
147+ [ executeCode , onChange ]
182148 ) ;
183149
184150 const codeButton = (
@@ -197,7 +163,7 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
197163 </ button >
198164 ) ;
199165
200- const showCodeEditor = editable && code && initialized ;
166+ const showCodeEditor = editable && code ;
201167
202168 return (
203169 < div className = "rcv-container" { ...rest } ref = { ref } >
0 commit comments