diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 61118b63ef..8c45a05e10 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -87,11 +87,7 @@ export async function initNitro (nuxt: Nuxt & { _nitro?: Nitro }) { esbuild: { options: { exclude: excludePattern, - tsconfigRaw: { - compilerOptions: { - experimentalDecorators: nuxt.options.experimental.decorators ?? false - } - } + ...nuxt.options.esbuild }, }, analyze: !nuxt.options.test && nuxt.options.build.analyze && (nuxt.options.build.analyze === true || nuxt.options.build.analyze.enabled) diff --git a/packages/schema/package.json b/packages/schema/package.json index 110e97dfaf..58abbf0365 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -46,6 +46,7 @@ "@vue/compiler-sfc": "3.4.29", "@vue/language-core": "2.0.21", "c12": "1.11.1", + "esbuild": "0.21.5", "esbuild-loader": "4.1.0", "h3": "1.11.1", "ignore": "5.3.1", diff --git a/packages/schema/src/config/esbuild.ts b/packages/schema/src/config/esbuild.ts new file mode 100644 index 0000000000..480d9169fb --- /dev/null +++ b/packages/schema/src/config/esbuild.ts @@ -0,0 +1,21 @@ +import { defu } from 'defu' +import { defineUntypedSchema } from 'untyped' +import type { TransformOptions } from 'esbuild' + +export default defineUntypedSchema({ + esbuild: { + options: { + jsxFactory: 'h', + jsxFragment: 'Fragment', + tsconfigRaw: { + $resolve: async (val: TransformOptions['tsconfigRaw'], get) => { + return defu(val, { + compilerOptions: { + experimentalDecorators: await get('experimental.decorators') as boolean + } + } satisfies TransformOptions['tsconfigRaw']) + } + } + } + }, +}) diff --git a/packages/schema/src/config/index.ts b/packages/schema/src/config/index.ts index 42666bc8c3..d7c93c3172 100644 --- a/packages/schema/src/config/index.ts +++ b/packages/schema/src/config/index.ts @@ -3,6 +3,7 @@ import app from './app' import build from './build' import common from './common' import dev from './dev' +import esbuild from './esbuild' import experimental from './experimental' import generate from './generate' import internal from './internal' @@ -26,6 +27,7 @@ export default { ...postcss, ...router, ...typescript, + ...esbuild, ...vite, ...webpack, } diff --git a/packages/schema/src/config/vite.ts b/packages/schema/src/config/vite.ts index 6fb793acc4..8bdf846bce 100644 --- a/packages/schema/src/config/vite.ts +++ b/packages/schema/src/config/vite.ts @@ -84,16 +84,8 @@ export default defineUntypedSchema({ }, }, esbuild: { - jsxFactory: 'h', - jsxFragment: 'Fragment', - tsconfigRaw: { - $resolve: async (val: Exclude['tsconfigRaw'], get) => { - return defu(val, { - compilerOptions: { - experimentalDecorators: await get('experimental.decorators') as boolean - } - } satisfies Exclude['tsconfigRaw']) - } + $resolve: async (val: Record, get) => { + return defu(val, await get('esbuild.options') as Record) } }, clearScreen: true, diff --git a/packages/schema/src/config/webpack.ts b/packages/schema/src/config/webpack.ts index 3764fe5737..e228df4f3d 100644 --- a/packages/schema/src/config/webpack.ts +++ b/packages/schema/src/config/webpack.ts @@ -159,16 +159,8 @@ export default defineUntypedSchema({ * @type {Omit} */ esbuild: { - jsxFactory: 'h', - jsxFragment: 'Fragment', - tsconfigRaw: { - $resolve: async (val: LoaderOptions['tsconfigRaw'], get) => { - return defu(val, { - compilerOptions: { - experimentalDecorators: await get('experimental.decorators') as boolean - } - } satisfies LoaderOptions['tsconfigRaw']) - } + $resolve: async (val: Record, get) => { + return defu(val, await get('esbuild.options') as Record) } }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9563319de1..7f98309b7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -533,9 +533,12 @@ importers: c12: specifier: 1.11.1 version: 1.11.1(magicast@0.3.4) + esbuild: + specifier: 0.21.5 + version: 0.21.5 esbuild-loader: specifier: 4.1.0 - version: 4.1.0(webpack@5.92.0) + version: 4.1.0(webpack@5.92.0(esbuild@0.21.5)) h3: specifier: 1.11.1 version: 1.11.1 @@ -568,16 +571,16 @@ importers: version: 2.1.0 vue-loader: specifier: 17.4.2 - version: 17.4.2(@vue/compiler-sfc@3.4.29)(vue@3.4.29(typescript@5.4.5))(webpack@5.92.0) + version: 17.4.2(@vue/compiler-sfc@3.4.29)(vue@3.4.29(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5)) vue-router: specifier: 4.3.3 version: 4.3.3(vue@3.4.29(typescript@5.4.5)) webpack: specifier: 5.92.0 - version: 5.92.0 + version: 5.92.0(esbuild@0.21.5) webpack-dev-middleware: specifier: 7.2.1 - version: 7.2.1(webpack@5.92.0) + version: 7.2.1(webpack@5.92.0(esbuild@0.21.5)) packages/ui-templates: devDependencies: @@ -11165,6 +11168,14 @@ snapshots: es-module-lexer@1.3.1: {} + esbuild-loader@4.1.0(webpack@5.92.0(esbuild@0.21.5)): + dependencies: + esbuild: 0.20.2 + get-tsconfig: 4.7.3 + loader-utils: 2.0.4 + webpack: 5.92.0(esbuild@0.21.5) + webpack-sources: 1.4.3 + esbuild-loader@4.1.0(webpack@5.92.0): dependencies: esbuild: 0.20.2 @@ -15224,6 +15235,16 @@ snapshots: transitivePeerDependencies: - supports-color + vue-loader@17.4.2(@vue/compiler-sfc@3.4.29)(vue@3.4.29(typescript@5.4.5))(webpack@5.92.0(esbuild@0.21.5)): + dependencies: + chalk: 4.1.2 + hash-sum: 2.0.0 + watchpack: 2.4.1 + webpack: 5.92.0(esbuild@0.21.5) + optionalDependencies: + '@vue/compiler-sfc': 3.4.29 + vue: 3.4.29(typescript@5.4.5) + vue-loader@17.4.2(@vue/compiler-sfc@3.4.29)(vue@3.4.29(typescript@5.4.5))(webpack@5.92.0): dependencies: chalk: 4.1.2 @@ -15305,6 +15326,17 @@ snapshots: - bufferutil - utf-8-validate + webpack-dev-middleware@7.2.1(webpack@5.92.0(esbuild@0.21.5)): + dependencies: + colorette: 2.0.20 + memfs: 4.9.2 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.2.0 + optionalDependencies: + webpack: 5.92.0(esbuild@0.21.5) + webpack-dev-middleware@7.2.1(webpack@5.92.0): dependencies: colorette: 2.0.20