diff --git a/packages/schema/src/config/build.ts b/packages/schema/src/config/build.ts index 8ddf9a3c2cf..1d63a89ec93 100644 --- a/packages/schema/src/config/build.ts +++ b/packages/schema/src/config/build.ts @@ -53,7 +53,7 @@ export default defineUntypedSchema({ * ```js transpile: [({ isLegacy }) => isLegacy && 'ky'] * ``` - * @type {Array} + * @type {Array string | RegExp | false)>} */ transpile: { $resolve: val => [].concat(val).filter(Boolean) diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index 17f8cca341d..3ebb494c413 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -9,6 +9,7 @@ import { cacheDirPlugin } from './plugins/cache-dir' import { initViteNodeServer } from './vite-node' import { ssrStylesPlugin } from './plugins/ssr-styles' import { writeManifest } from './manifest' +import { transpile } from './utils/transpile' export async function buildServer (ctx: ViteBuildContext) { const _resolve = (id: string) => resolveModule(id, { paths: ctx.nuxt.options.modulesDir }) @@ -65,7 +66,7 @@ export async function buildServer (ctx: ViteBuildContext) { ? ['#internal/nitro', '#internal/nitro/utils', 'vue', 'vue-router'] : ['#internal/nitro', '#internal/nitro/utils'], noExternal: [ - ...ctx.nuxt.options.build.transpile, + ...transpile({ isServer: true, isDev: ctx.nuxt.options.dev }), // TODO: Use externality for production (rollup) build /\/esm\/.*\.js$/, /\.(es|esm|esm-browser|esm-bundler).js$/, diff --git a/packages/vite/src/utils/transpile.ts b/packages/vite/src/utils/transpile.ts new file mode 100644 index 00000000000..2484cc7034a --- /dev/null +++ b/packages/vite/src/utils/transpile.ts @@ -0,0 +1,28 @@ +import { useNuxt } from '@nuxt/kit' +import escapeRegExp from 'escape-string-regexp' +import { normalize } from 'pathe' + +interface Envs { + isDev: boolean + isClient?: boolean + isServer?: boolean +} + +export function transpile (envs: Envs): Array { + const nuxt = useNuxt() + const transpile = [] + + for (let pattern of nuxt.options.build.transpile) { + if (typeof pattern === 'function') { + const result = pattern(envs) + if (result) { pattern = result } + } + if (typeof pattern === 'string') { + transpile.push(new RegExp(escapeRegExp(normalize(pattern)))) + } else if (pattern instanceof RegExp) { + transpile.push(pattern) + } + } + + return transpile +} diff --git a/packages/vite/src/vite-node.ts b/packages/vite/src/vite-node.ts index 28dc74eae6e..ad9c6f8f2f2 100644 --- a/packages/vite/src/vite-node.ts +++ b/packages/vite/src/vite-node.ts @@ -11,6 +11,7 @@ import { distDir } from './dirs' import type { ViteBuildContext } from './vite' import { isCSS } from './utils' import { createIsExternal } from './utils/external' +import { transpile } from './utils/transpile' // TODO: Remove this in favor of registerViteNodeMiddleware // after Nitropack or h3 fixed for adding middlewares after setup @@ -99,7 +100,7 @@ function createViteNodeApp (ctx: ViteBuildContext, invalidates: Set = ne inline: [ /\/(nuxt|nuxt3)\//, /^#/, - ...ctx.nuxt.options.build.transpile as string[] + ...transpile({ isServer: true, isDev: ctx.nuxt.options.dev }) ] }, transformMode: { diff --git a/packages/webpack/src/presets/base.ts b/packages/webpack/src/presets/base.ts index 8ad4338f5eb..acb551a5076 100644 --- a/packages/webpack/src/presets/base.ts +++ b/packages/webpack/src/presets/base.ts @@ -161,7 +161,8 @@ export function baseTranspile (ctx: WebpackConfigContext) { for (let pattern of options.build.transpile) { if (typeof pattern === 'function') { - pattern = pattern(ctx) + const result = pattern(ctx) + if (result) { pattern = result } } if (typeof pattern === 'string') { transpile.push(new RegExp(escapeRegExp(normalize(pattern)))) diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts index 7a89abf5607..426d32db417 100644 --- a/test/fixtures/basic/nuxt.config.ts +++ b/test/fixtures/basic/nuxt.config.ts @@ -22,6 +22,14 @@ export default defineNuxtConfig({ }, buildDir: process.env.NITRO_BUILD_DIR, builder: process.env.TEST_WITH_WEBPACK ? 'webpack' : 'vite', + build: { + transpile: [ + (ctx) => { + if (typeof ctx.isDev !== 'boolean') { throw new TypeError('context not passed') } + return false + } + ] + }, theme: './extends/bar', css: ['~/assets/global.css'], extends: [