@@ -79,6 +79,7 @@ export type TransformJsxSourceResult = {
7979 diagnostics : TransformDiagnostic [ ]
8080 declarations ?: TransformTopLevelDeclaration [ ]
8181 hasTopLevelJsxExpression ?: boolean
82+ topLevelJsxExpressionRange ?: SourceRange | null
8283}
8384
8485const createParserOptions = ( sourceType : TransformSourceType ) => ( {
@@ -422,31 +423,51 @@ const unwrapExpressionNode = (value: unknown): unknown => {
422423 return current
423424}
424425
425- const isJsxExpressionNode = ( value : unknown ) : boolean => {
426+ const toJsxExpressionNode = ( value : unknown ) : Record < string , unknown > | null => {
426427 const unwrapped = unwrapExpressionNode ( value )
427428 if ( ! isObjectRecord ( unwrapped ) || typeof unwrapped . type !== 'string' ) {
428- return false
429+ return null
430+ }
431+
432+ if ( unwrapped . type === 'JSXElement' || unwrapped . type === 'JSXFragment' ) {
433+ return unwrapped
429434 }
430435
431- return unwrapped . type === 'JSXElement' || unwrapped . type === 'JSXFragment'
436+ return null
437+ }
438+
439+ type TopLevelJsxExpressionMetadata = {
440+ hasTopLevelJsxExpression : boolean
441+ topLevelJsxExpressionRange : SourceRange | null
432442}
433443
434- const collectTopLevelJsxExpressionMetadata = ( body : unknown ) : boolean => {
444+ const createEmptyTopLevelJsxExpressionMetadata = ( ) : TopLevelJsxExpressionMetadata => ( {
445+ hasTopLevelJsxExpression : false ,
446+ topLevelJsxExpressionRange : null ,
447+ } )
448+
449+ const collectTopLevelJsxExpressionMetadata = (
450+ body : unknown ,
451+ ) : TopLevelJsxExpressionMetadata => {
435452 if ( ! Array . isArray ( body ) ) {
436- return false
453+ return createEmptyTopLevelJsxExpressionMetadata ( )
437454 }
438455
439456 for ( const statement of body ) {
440457 if ( ! isObjectRecord ( statement ) || statement . type !== 'ExpressionStatement' ) {
441458 continue
442459 }
443460
444- if ( isJsxExpressionNode ( statement . expression ) ) {
445- return true
461+ const jsxNode = toJsxExpressionNode ( statement . expression )
462+ if ( jsxNode ) {
463+ return {
464+ hasTopLevelJsxExpression : true ,
465+ topLevelJsxExpressionRange : toSourceRange ( jsxNode ) ,
466+ }
446467 }
447468 }
448469
449- return false
470+ return createEmptyTopLevelJsxExpressionMetadata ( )
450471}
451472
452473const ensureSupportedOptions = ( options : InternalTransformJsxSourceOptions ) => {
@@ -522,9 +543,12 @@ export function transformJsxSource(
522543 const declarations = internalOptions . collectTopLevelDeclarations
523544 ? collectTopLevelDeclarationMetadata ( parsed . program . body )
524545 : undefined
525- const hasTopLevelJsxExpression = internalOptions . collectTopLevelJsxExpression
546+ const topLevelJsxExpressionMetadata = internalOptions . collectTopLevelJsxExpression
526547 ? collectTopLevelJsxExpressionMetadata ( parsed . program . body )
527548 : undefined
549+ const hasTopLevelJsxExpression = topLevelJsxExpressionMetadata ?. hasTopLevelJsxExpression
550+ const topLevelJsxExpressionRange =
551+ topLevelJsxExpressionMetadata ?. topLevelJsxExpressionRange
528552
529553 if ( parserDiagnostics . length ) {
530554 return {
@@ -534,6 +558,7 @@ export function transformJsxSource(
534558 diagnostics : parserDiagnostics ,
535559 declarations,
536560 hasTopLevelJsxExpression,
561+ topLevelJsxExpressionRange,
537562 }
538563 }
539564
@@ -553,6 +578,7 @@ export function transformJsxSource(
553578 diagnostics : parserDiagnostics ,
554579 declarations,
555580 hasTopLevelJsxExpression,
581+ topLevelJsxExpressionRange,
556582 }
557583 }
558584
@@ -569,6 +595,7 @@ export function transformJsxSource(
569595 diagnostics : parserDiagnostics ,
570596 declarations,
571597 hasTopLevelJsxExpression,
598+ topLevelJsxExpressionRange,
572599 }
573600 }
574601
@@ -593,6 +620,7 @@ export function transformJsxSource(
593620 diagnostics,
594621 declarations,
595622 hasTopLevelJsxExpression,
623+ topLevelJsxExpressionRange,
596624 }
597625 }
598626
@@ -605,5 +633,6 @@ export function transformJsxSource(
605633 diagnostics,
606634 declarations,
607635 hasTopLevelJsxExpression,
636+ topLevelJsxExpressionRange,
608637 }
609638}
0 commit comments