diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index 70faac72a90134..4f36ec9fc2dccf 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -25,6 +25,8 @@ export interface OxcOptions extends OxcTransformOptions { include?: string | RegExp | string[] | RegExp[] exclude?: string | RegExp | string[] | RegExp[] jsxInject?: string + jsxInclude?: string | RegExp | string[] | RegExp[] + jsxExclude?: string | RegExp | string[] | RegExp[] } export async function transformWithOxc( @@ -159,9 +161,26 @@ export async function transformWithOxc( export function oxcPlugin(config: ResolvedConfig): Plugin { const options = config.oxc as OxcOptions - const { jsxInject, include, exclude, ...oxcTransformOptions } = options + const { + jsxInject, + include, + exclude, + jsxInclude, + jsxExclude, + ...oxcTransformOptions + } = options - const filter = createFilter(include || /\.(m?ts|[jt]sx)$/, exclude || /\.js$/) + const defaultInclude = Array.isArray(include) + ? include + : [include || /\.(m?ts|[jt]sx)$/] + const filter = createFilter( + defaultInclude.concat(jsxInclude || []), + exclude || /\.js$/, + ) + const jsxFilter = createFilter( + jsxInclude || /\.jsx$/, + jsxExclude || /\.(m?[jt]s|tsx)$/, + ) return { name: 'vite:oxc', @@ -178,6 +197,20 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { }, async transform(code, id) { if (filter(id) || filter(cleanUrl(id))) { + // disable refresh at ssr + if ( + this.environment.config.consumer === 'server' && + oxcTransformOptions.jsx?.refresh + ) { + oxcTransformOptions.jsx.refresh = false + } + if ( + (jsxFilter(id) || jsxFilter(cleanUrl(id))) && + !oxcTransformOptions.lang + ) { + oxcTransformOptions.lang = 'jsx' + } + const result = await transformWithOxc( this, code,