diff --git a/packages/vite/src/node/__tests__/fixtures/scan-jsx-runtime/entry-glob-custom-oxc.tsx b/packages/vite/src/node/__tests__/fixtures/scan-jsx-runtime/entry-glob-custom-oxc.tsx new file mode 100644 index 00000000000000..178cb0b9e87bff --- /dev/null +++ b/packages/vite/src/node/__tests__/fixtures/scan-jsx-runtime/entry-glob-custom-oxc.tsx @@ -0,0 +1,3 @@ +export const pages = import.meta.glob('./pages/*.tsx') + +export default
diff --git a/packages/vite/src/node/__tests__/fixtures/scan-jsx-runtime/pages/index.tsx b/packages/vite/src/node/__tests__/fixtures/scan-jsx-runtime/pages/index.tsx new file mode 100644 index 00000000000000..1bdcfef72ff16e --- /dev/null +++ b/packages/vite/src/node/__tests__/fixtures/scan-jsx-runtime/pages/index.tsx @@ -0,0 +1 @@ +export default diff --git a/packages/vite/src/node/__tests__/scan.spec.ts b/packages/vite/src/node/__tests__/scan.spec.ts index b79930393913d3..6658425dd5dd96 100644 --- a/packages/vite/src/node/__tests__/scan.spec.ts +++ b/packages/vite/src/node/__tests__/scan.spec.ts @@ -175,6 +175,49 @@ test('scan jsx-runtime', async (ctx) => { expect(mod1).toBe(mod2) }) +test('scan import.meta.glob respects rolldown transform jsx options', async (ctx) => { + const server = await createServer({ + configFile: false, + logLevel: 'error', + root: path.join(import.meta.dirname, 'fixtures', 'scan-jsx-runtime'), + oxc: { + jsx: { + runtime: 'automatic', + importSource: 'react', + }, + }, + optimizeDeps: { + force: true, + noDiscovery: false, + entries: ['./entry-glob-custom-oxc.tsx'], + rolldownOptions: { + transform: { + jsx: { + runtime: 'automatic', + importSource: 'vue', + }, + }, + }, + }, + }) + ctx.onTestFinished(() => server.close()) + + const { cancel, result } = scanImports( + devToScanEnvironment(server.environments.client), + ) + ctx.onTestFinished(cancel) + + const scanResult = await result + + expect(scanResult).toMatchObject({ + deps: { + 'vue/jsx-dev-runtime': expect.any(String), + }, + missing: {}, + }) + expect(scanResult.deps).not.toHaveProperty('react/jsx-runtime') +}) + test('scan import.meta.glob package imports patterns', async (ctx) => { const server = await createServer({ configFile: false, diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index be05905a77c54c..06af7aaaecbf48 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -3,6 +3,7 @@ import fsp from 'node:fs/promises' import path from 'node:path' import { performance } from 'node:perf_hooks' import { scan } from 'rolldown/experimental' +import type { TransformOptions as OxcTransformOptions } from 'rolldown/utils' import { transformSync } from 'rolldown/utils' import type { PartialResolvedId, Plugin } from 'rolldown' import colors from 'picocolors' @@ -252,9 +253,6 @@ async function prepareRolldownScanner( const { plugins: pluginsFromConfig = [], ...rolldownOptions } = environment.config.optimizeDeps.rolldownOptions ?? {} - const plugins = await asyncFlatten(arraify(pluginsFromConfig)) - plugins.push(...rolldownScanPlugin(environment, deps, missing, entries)) - const transformOptions = deepClone(rolldownOptions.transform) ?? {} if (transformOptions.jsx === undefined) { transformOptions.jsx = {} @@ -267,6 +265,19 @@ async function prepareRolldownScanner( if (typeof transformOptions.jsx === 'object') { transformOptions.jsx.development ??= !environment.config.isProduction } + const transformSyncJsxOptions: OxcTransformOptions['jsx'] = + transformOptions.jsx === false ? undefined : transformOptions.jsx + + const plugins = await asyncFlatten(arraify(pluginsFromConfig)) + plugins.push( + ...rolldownScanPlugin( + environment, + deps, + missing, + entries, + transformSyncJsxOptions, + ), + ) async function build() { await scan({ @@ -343,6 +354,7 @@ function rolldownScanPlugin( depImports: Record