11import path from 'node:path'
22import colors from 'picocolors'
33import type {
4- Loader ,
5- Message ,
6- TransformOptions ,
7- TransformResult ,
8- } from 'esbuild'
9- import { transform } from 'esbuild'
4+ EsbuildLoader ,
5+ EsbuildMessage ,
6+ EsbuildTransformOptions ,
7+ EsbuildTransformResult as RawEsbuildTransformResult ,
8+ } from 'types/internal/esbuildOptions'
109import type { RawSourceMap } from '@ampproject/remapping'
1110import type { InternalModuleFormat , SourceMap } from 'rolldown'
1211import type { TSConfckParseResult } from 'tsconfck'
@@ -43,7 +42,7 @@ export const defaultEsbuildSupported = {
4342 'import-meta' : true ,
4443}
4544
46- export interface ESBuildOptions extends TransformOptions {
45+ export interface ESBuildOptions extends EsbuildTransformOptions {
4746 include ?: string | RegExp | ReadonlyArray < string | RegExp >
4847 exclude ?: string | RegExp | ReadonlyArray < string | RegExp >
4948 jsxInject ?: string
@@ -53,7 +52,7 @@ export interface ESBuildOptions extends TransformOptions {
5352 minify ?: never
5453}
5554
56- export type ESBuildTransformResult = Omit < TransformResult , 'map' > & {
55+ export type ESBuildTransformResult = Omit < RawEsbuildTransformResult , 'map' > & {
5756 map : SourceMap
5857}
5958
@@ -76,10 +75,16 @@ type TSConfigJSON = {
7675}
7776type TSCompilerOptions = NonNullable < TSConfigJSON [ 'compilerOptions' ] >
7877
78+ let esbuild : Promise < typeof import ( 'esbuild' ) > | undefined
79+ const importEsbuild = ( ) => {
80+ esbuild ||= import ( 'esbuild' )
81+ return esbuild
82+ }
83+
7984export async function transformWithEsbuild (
8085 code : string ,
8186 filename : string ,
82- options ?: TransformOptions ,
87+ options ?: EsbuildTransformOptions ,
8388 inMap ?: object ,
8489 config ?: ResolvedConfig ,
8590 watcher ?: FSWatcher ,
@@ -98,7 +103,7 @@ export async function transformWithEsbuild(
98103 } else if ( ext === 'cts' || ext === 'mts' ) {
99104 loader = 'ts'
100105 } else {
101- loader = ext as Loader
106+ loader = ext as EsbuildLoader
102107 }
103108 }
104109
@@ -179,7 +184,7 @@ export async function transformWithEsbuild(
179184 }
180185 }
181186
182- const resolvedOptions : TransformOptions = {
187+ const resolvedOptions : EsbuildTransformOptions = {
183188 sourcemap : true ,
184189 // ensure source file name contains full query
185190 sourcefile : filename ,
@@ -198,6 +203,7 @@ export async function transformWithEsbuild(
198203 delete resolvedOptions . jsxInject
199204
200205 try {
206+ const { transform } = await importEsbuild ( )
201207 const result = await transform ( code , resolvedOptions )
202208 let map : SourceMap
203209 if ( inMap && resolvedOptions . sourcemap ) {
@@ -222,7 +228,7 @@ export async function transformWithEsbuild(
222228 // patch error information
223229 if ( e . errors ) {
224230 e . frame = ''
225- e . errors . forEach ( ( m : Message ) => {
231+ e . errors . forEach ( ( m : EsbuildMessage ) => {
226232 if (
227233 m . text === 'Experimental decorators are not currently enabled' ||
228234 m . text ===
@@ -247,7 +253,7 @@ export function esbuildPlugin(config: ResolvedConfig): Plugin {
247253
248254 // Remove optimization options for dev as we only need to transpile them,
249255 // and for build as the final optimization is in `buildEsbuildPlugin`
250- const transformOptions : TransformOptions = {
256+ const transformOptions : EsbuildTransformOptions = {
251257 target : 'esnext' ,
252258 charset : 'utf8' ,
253259 ...esbuildTransformOptions ,
@@ -303,7 +309,7 @@ export function esbuildPlugin(config: ResolvedConfig): Plugin {
303309
304310const rollupToEsbuildFormatMap : Record <
305311 string ,
306- TransformOptions [ 'format' ] | undefined
312+ EsbuildTransformOptions [ 'format' ] | undefined
307313> = {
308314 es : 'esm' ,
309315 cjs : 'cjs' ,
@@ -381,7 +387,7 @@ export const buildEsbuildPlugin = (): Plugin => {
381387export function resolveEsbuildTranspileOptions (
382388 config : ResolvedConfig ,
383389 format : InternalModuleFormat ,
384- ) : TransformOptions | null {
390+ ) : EsbuildTransformOptions | null {
385391 const target = config . build . target
386392 const minify = config . build . minify === 'esbuild'
387393
@@ -395,7 +401,7 @@ export function resolveEsbuildTranspileOptions(
395401 const isEsLibBuild = config . build . lib && format === 'es'
396402 const esbuildOptions = config . esbuild || { }
397403
398- const options : TransformOptions = {
404+ const options : EsbuildTransformOptions = {
399405 charset : 'utf8' ,
400406 ...esbuildOptions ,
401407 loader : 'js' ,
@@ -467,7 +473,7 @@ export function resolveEsbuildTranspileOptions(
467473 }
468474}
469475
470- function prettifyMessage ( m : Message , code : string ) : string {
476+ function prettifyMessage ( m : EsbuildMessage , code : string ) : string {
471477 let res = colors . yellow ( m . text )
472478 if ( m . location ) {
473479 res += `\n` + generateCodeFrame ( code , m . location )
0 commit comments