@@ -12,19 +12,32 @@ const COMMENTS = {
1212 FOCUS_END : '// codeblock-focus-end' ,
1313} ;
1414
15+ type Props = {
16+ children : React . ReactElement < { className ?: string ; children : string } > ;
17+ 'data-name' ?: string ;
18+ 'data-snack' ?: string | 'embed' ;
19+ 'data-dependencies' ?: string ;
20+ 'data-lang' ?: string ;
21+ } ;
22+
1523export default function Pre ( {
1624 children,
1725 'data-name' : name ,
1826 'data-snack' : snack ,
1927 'data-dependencies' : deps ,
2028 'data-lang' : lang ,
2129 ...rest
22- } ) {
30+ } : Props ) {
2331 const [ isExpanded , setIsExpanded ] = React . useState ( false ) ;
2432
2533 const { colorMode } = useColorMode ( ) ;
26- const activeVersion = useActiveVersion ( ) ;
27- const { versions } = usePluginData ( 'react-navigation-versions' ) ;
34+ const activeVersion = useActiveVersion ( undefined ) ;
35+ const { versions } = usePluginData ( 'react-navigation-versions' ) as {
36+ versions : Record <
37+ string ,
38+ Record < string , string | [ string , Record < string , string > ] >
39+ > ;
40+ } ;
2841
2942 const child = React . Children . only ( children ) ;
3043
@@ -57,15 +70,17 @@ export default function Pre({
5770 } )
5871 . join ( '\n' ) ;
5972
60- children = React . cloneElement ( child , {
61- className : `language-${ lang } ` ,
62- children : content ,
63- } ) ;
64-
65- return < MDXPre { ...rest } > { children } </ MDXPre > ;
73+ return (
74+ < MDXPre { ...rest } >
75+ { React . cloneElement ( child , {
76+ className : `language-${ lang } ` ,
77+ children : content ,
78+ } ) }
79+ </ MDXPre >
80+ ) ;
6681 }
6782
68- const buttons = [ ] ;
83+ const buttons : React . ReactNode [ ] = [ ] ;
6984
7085 if ( child . props . children . includes ?.( COMMENTS . FOCUS_START ) ) {
7186 buttons . push (
@@ -106,7 +121,7 @@ export default function Pre({
106121 const version = activeVersion ?. name ;
107122
108123 // Handle snack demos
109- if ( snack && versions [ version ] != null ) {
124+ if ( snack && version && versions [ version ] != null ) {
110125 const code = child . props . children ;
111126
112127 if ( typeof code !== 'string' ) {
@@ -115,7 +130,7 @@ export default function Pre({
115130 ) ;
116131 }
117132
118- const dependencies = deps
133+ const dependencies : Record < string , string > = deps
119134 ? Object . fromEntries (
120135 deps . split ( ',' ) . map ( ( entry ) => {
121136 let prefix = '' ;
@@ -135,34 +150,37 @@ export default function Pre({
135150
136151 Object . assign (
137152 dependencies ,
138- Object . entries ( versions [ version ] ) . reduce ( ( acc , [ key , value ] ) => {
139- if ( code . includes ( `from '${ key } '` ) ) {
140- if ( Array . isArray ( value ) ) {
141- const [ v , peers ] = value ;
142-
143- Object . assign ( acc , {
144- [ key ] : v ,
145- ...Object . fromEntries (
146- Object . entries ( peers ) . map ( ( [ key , value ] ) => {
147- const meta = versions [ version ] [ key ] ;
148-
149- if ( value === '*' && meta ) {
150- const v = Array . isArray ( meta ) ? meta [ 0 ] : meta ;
151-
152- return [ key , v ] ;
153- }
154-
155- return [ key , value ] ;
156- } )
157- ) ,
158- } ) ;
159- } else {
160- acc [ key ] = value ;
153+ Object . entries ( versions [ version ] ) . reduce (
154+ ( acc , [ key , value ] ) => {
155+ if ( code . includes ( `from '${ key } '` ) ) {
156+ if ( Array . isArray ( value ) ) {
157+ const [ v , peers ] = value ;
158+
159+ Object . assign ( acc , {
160+ [ key ] : v ,
161+ ...Object . fromEntries (
162+ Object . entries ( peers ) . map ( ( [ key , value ] ) => {
163+ const meta = versions [ version ] [ key ] ;
164+
165+ if ( value === '*' && meta ) {
166+ const v = Array . isArray ( meta ) ? meta [ 0 ] : meta ;
167+
168+ return [ key , v ] ;
169+ }
170+
171+ return [ key , value ] ;
172+ } )
173+ ) ,
174+ } ) ;
175+ } else {
176+ acc [ key ] = value ;
177+ }
161178 }
162- }
163179
164- return acc ;
165- } , { } )
180+ return acc ;
181+ } ,
182+ { } as Record < string , string >
183+ )
166184 ) ;
167185
168186 const url = new URL ( 'https://snack.expo.dev' ) ;
@@ -209,7 +227,6 @@ export default function Pre({
209227 style = { {
210228 width : '100%' ,
211229 height : 660 ,
212- border : 'none' ,
213230 border : '1px solid var(--ifm-table-border-color)' ,
214231 borderRadius : 'var(--ifm-global-radius)' ,
215232 overflow : 'hidden' ,
@@ -263,7 +280,14 @@ export default function Pre({
263280 ) ;
264281}
265282
266- function FocusedCodeBlock ( { children, expanded, ...rest } ) {
283+ function FocusedCodeBlock ( {
284+ children,
285+ expanded,
286+ ...rest
287+ } : {
288+ children : React . ReactElement < { children : string } > ;
289+ expanded : boolean ;
290+ } ) {
267291 const child = React . Children . only ( children ) ;
268292 const code = child . props . children ;
269293
@@ -274,7 +298,7 @@ function FocusedCodeBlock({ children, expanded, ...rest }) {
274298 if ( expanded ) {
275299 content = code
276300 . split ( '\n' )
277- . filter ( ( line ) =>
301+ . filter ( ( line : string ) =>
278302 [ COMMENTS . FOCUS_START , COMMENTS . FOCUS_END ] . every (
279303 ( comment ) => line . trim ( ) !== comment
280304 )
@@ -284,7 +308,7 @@ function FocusedCodeBlock({ children, expanded, ...rest }) {
284308 const lines = code . split ( '\n' ) ;
285309
286310 let focus = false ;
287- let indent ;
311+ let indent : string | undefined ;
288312
289313 for ( const line of lines ) {
290314 if ( line . trim ( ) === COMMENTS . FOCUS_START ) {
@@ -293,10 +317,10 @@ function FocusedCodeBlock({ children, expanded, ...rest }) {
293317 focus = false ;
294318 } else if ( focus ) {
295319 if ( indent === undefined ) {
296- indent = line . match ( / ^ \s * / ) [ 0 ] ;
320+ indent = line . match ( / ^ \s * / ) ?. [ 0 ] ;
297321 }
298322
299- if ( line . startsWith ( indent ) ) {
323+ if ( indent && line . startsWith ( indent ) ) {
300324 content += line . slice ( indent . length ) + '\n' ;
301325 } else {
302326 content += line + '\n' ;
@@ -305,8 +329,12 @@ function FocusedCodeBlock({ children, expanded, ...rest }) {
305329 }
306330 }
307331
308- children = React . Children . map ( children , ( c ) =>
309- React . cloneElement ( c , { children : content } )
332+ return (
333+ < MDXPre { ...rest } >
334+ { React . Children . map ( children , ( c ) =>
335+ React . cloneElement ( c , { children : content } )
336+ ) }
337+ </ MDXPre >
310338 ) ;
311339 }
312340
0 commit comments