@@ -6,7 +6,6 @@ import colors from 'picocolors'
6
6
import type { BuildOptions as EsbuildBuildOptions } from 'esbuild'
7
7
import { build } from 'esbuild'
8
8
import { init , parse } from 'es-module-lexer'
9
- import type { ImportSpecifier as EsModuleLexerImportSpecifier } from 'types/es-module-lexer'
10
9
import type { ResolvedConfig } from '../config'
11
10
import {
12
11
createDebugger ,
@@ -32,18 +31,15 @@ const isDebugEnabled = _debug('vite:deps').enabled
32
31
const jsExtensionRE = / \. j s $ / i
33
32
const jsMapExtensionRE = / \. j s \. m a p $ / i
34
33
35
- export type { EsModuleLexerImportSpecifier }
36
- export type EsModuleLexerParseReturnType = readonly [
37
- imports : ReadonlyArray < EsModuleLexerImportSpecifier > ,
38
- exports : ReadonlyArray < string > ,
34
+ export type ExportsData = {
35
+ hasImports : boolean
36
+ exports : readonly string [ ]
39
37
facade : boolean
40
- ]
41
- export type ExportsData = EsModuleLexerParseReturnType & {
42
38
// es-module-lexer has a facade detection but isn't always accurate for our
43
39
// use case when the module has default export
44
- hasReExports ?: true
40
+ hasReExports ?: boolean
45
41
// hint if the dep requires loading as jsx
46
- jsxLoader ?: true
42
+ jsxLoader ?: boolean
47
43
}
48
44
49
45
export interface DepsOptimizer {
@@ -754,7 +750,6 @@ export async function extractExportsData(
754
750
config : ResolvedConfig
755
751
) : Promise < ExportsData > {
756
752
await init
757
- let exportsData : ExportsData
758
753
759
754
const esbuildOptions = config . optimizeDeps ?. esbuildOptions ?? { }
760
755
if ( config . optimizeDeps . extensions ?. some ( ( ext ) => filePath . endsWith ( ext ) ) ) {
@@ -767,34 +762,48 @@ export async function extractExportsData(
767
762
write : false ,
768
763
format : 'esm'
769
764
} )
770
- exportsData = parse ( result . outputFiles [ 0 ] . text ) as ExportsData
771
- } else {
772
- const entryContent = fs . readFileSync ( filePath , 'utf-8' )
773
- try {
774
- exportsData = parse ( entryContent ) as ExportsData
775
- } catch {
776
- const loader = esbuildOptions . loader ?. [ path . extname ( filePath ) ] || 'jsx'
777
- debug (
778
- `Unable to parse: ${ filePath } .\n Trying again with a ${ loader } transform.`
779
- )
780
- const transformed = await transformWithEsbuild ( entryContent , filePath , {
781
- loader
782
- } )
783
- // Ensure that optimization won't fail by defaulting '.js' to the JSX parser.
784
- // This is useful for packages such as Gatsby.
785
- esbuildOptions . loader = {
786
- '.js' : 'jsx' ,
787
- ...esbuildOptions . loader
788
- }
789
- exportsData = parse ( transformed . code ) as ExportsData
790
- exportsData . jsxLoader = true
765
+ const [ imports , exports , facade ] = parse ( result . outputFiles [ 0 ] . text )
766
+ return {
767
+ hasImports : imports . length > 0 ,
768
+ exports,
769
+ facade
791
770
}
792
- for ( const { ss, se } of exportsData [ 0 ] ) {
793
- const exp = entryContent . slice ( ss , se )
794
- if ( / e x p o r t \s + \* \s + f r o m / . test ( exp ) ) {
795
- exportsData . hasReExports = true
796
- }
771
+ }
772
+
773
+ let parseResult : ReturnType < typeof parse >
774
+ let usedJsxLoader = false
775
+
776
+ const entryContent = fs . readFileSync ( filePath , 'utf-8' )
777
+ try {
778
+ parseResult = parse ( entryContent )
779
+ } catch {
780
+ const loader = esbuildOptions . loader ?. [ path . extname ( filePath ) ] || 'jsx'
781
+ debug (
782
+ `Unable to parse: ${ filePath } .\n Trying again with a ${ loader } transform.`
783
+ )
784
+ const transformed = await transformWithEsbuild ( entryContent , filePath , {
785
+ loader
786
+ } )
787
+ // Ensure that optimization won't fail by defaulting '.js' to the JSX parser.
788
+ // This is useful for packages such as Gatsby.
789
+ esbuildOptions . loader = {
790
+ '.js' : 'jsx' ,
791
+ ...esbuildOptions . loader
797
792
}
793
+ parseResult = parse ( transformed . code )
794
+ usedJsxLoader = true
795
+ }
796
+
797
+ const [ imports , exports , facade ] = parseResult
798
+ const exportsData : ExportsData = {
799
+ hasImports : imports . length > 0 ,
800
+ exports,
801
+ facade,
802
+ hasReExports : imports . some ( ( { ss, se } ) => {
803
+ const exp = entryContent . slice ( ss , se )
804
+ return / e x p o r t \s + \* \s + f r o m / . test ( exp )
805
+ } ) ,
806
+ jsxLoader : usedJsxLoader
798
807
}
799
808
return exportsData
800
809
}
@@ -816,9 +825,9 @@ function needsInterop(
816
825
) {
817
826
return true
818
827
}
819
- const [ imports , exports ] = exportsData
828
+ const { hasImports , exports } = exportsData
820
829
// entry has no ESM syntax - likely CJS or UMD
821
- if ( ! exports . length && ! imports . length ) {
830
+ if ( ! exports . length && ! hasImports ) {
822
831
return true
823
832
}
824
833
0 commit comments