Skip to content

Commit 168de2d

Browse files
authored
refactor: ExportData.imports to ExportData.hasImports (#8355)
1 parent a9ccedd commit 168de2d

File tree

4 files changed

+50
-138
lines changed

4 files changed

+50
-138
lines changed

packages/vite/src/node/index.ts

-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ export type {
3737
DepOptimizationProcessing,
3838
OptimizedDepInfo,
3939
DepsOptimizer,
40-
EsModuleLexerImportSpecifier,
41-
EsModuleLexerParseReturnType,
4240
ExportsData
4341
} from './optimizer'
4442
export type { Plugin } from './plugin'

packages/vite/src/node/optimizer/esbuildDepPlugin.ts

+3-8
Original file line numberDiff line numberDiff line change
@@ -171,20 +171,15 @@ export function esbuildDepPlugin(
171171
}
172172

173173
let contents = ''
174-
const data = exportsData[id]
175-
const [imports, exports] = data
176-
if (!imports.length && !exports.length) {
174+
const { hasImports, exports, hasReExports } = exportsData[id]
175+
if (!hasImports && !exports.length) {
177176
// cjs
178177
contents += `export default require("${relativePath}");`
179178
} else {
180179
if (exports.includes('default')) {
181180
contents += `import d from "${relativePath}";export default d;`
182181
}
183-
if (
184-
data.hasReExports ||
185-
exports.length > 1 ||
186-
exports[0] !== 'default'
187-
) {
182+
if (hasReExports || exports.length > 1 || exports[0] !== 'default') {
188183
contents += `\nexport * from "${relativePath}"`
189184
}
190185
}

packages/vite/src/node/optimizer/index.ts

+47-38
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import colors from 'picocolors'
66
import type { BuildOptions as EsbuildBuildOptions } from 'esbuild'
77
import { build } from 'esbuild'
88
import { init, parse } from 'es-module-lexer'
9-
import type { ImportSpecifier as EsModuleLexerImportSpecifier } from 'types/es-module-lexer'
109
import type { ResolvedConfig } from '../config'
1110
import {
1211
createDebugger,
@@ -32,18 +31,15 @@ const isDebugEnabled = _debug('vite:deps').enabled
3231
const jsExtensionRE = /\.js$/i
3332
const jsMapExtensionRE = /\.js\.map$/i
3433

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[]
3937
facade: boolean
40-
]
41-
export type ExportsData = EsModuleLexerParseReturnType & {
4238
// es-module-lexer has a facade detection but isn't always accurate for our
4339
// use case when the module has default export
44-
hasReExports?: true
40+
hasReExports?: boolean
4541
// hint if the dep requires loading as jsx
46-
jsxLoader?: true
42+
jsxLoader?: boolean
4743
}
4844

4945
export interface DepsOptimizer {
@@ -754,7 +750,6 @@ export async function extractExportsData(
754750
config: ResolvedConfig
755751
): Promise<ExportsData> {
756752
await init
757-
let exportsData: ExportsData
758753

759754
const esbuildOptions = config.optimizeDeps?.esbuildOptions ?? {}
760755
if (config.optimizeDeps.extensions?.some((ext) => filePath.endsWith(ext))) {
@@ -767,34 +762,48 @@ export async function extractExportsData(
767762
write: false,
768763
format: 'esm'
769764
})
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
791770
}
792-
for (const { ss, se } of exportsData[0]) {
793-
const exp = entryContent.slice(ss, se)
794-
if (/export\s+\*\s+from/.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
797792
}
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 /export\s+\*\s+from/.test(exp)
805+
}),
806+
jsxLoader: usedJsxLoader
798807
}
799808
return exportsData
800809
}
@@ -816,9 +825,9 @@ function needsInterop(
816825
) {
817826
return true
818827
}
819-
const [imports, exports] = exportsData
828+
const { hasImports, exports } = exportsData
820829
// entry has no ESM syntax - likely CJS or UMD
821-
if (!exports.length && !imports.length) {
830+
if (!exports.length && !hasImports) {
822831
return true
823832
}
824833

packages/vite/types/es-module-lexer.d.ts

-90
This file was deleted.

0 commit comments

Comments
 (0)