From 39e9b7a17e74648c8e83aedd71052fceec644e5e Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 10:29:51 +0100 Subject: [PATCH 1/8] feat(vite, webpack): enable client-side sourcemaps in production --- packages/schema/src/config/build.ts | 4 +++- packages/vite/src/vite.ts | 1 + packages/webpack/src/configs/client.ts | 6 +++++- packages/webpack/src/configs/server.ts | 3 ++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/schema/src/config/build.ts b/packages/schema/src/config/build.ts index c3e8eaf9648..369c3f3d9f9 100644 --- a/packages/schema/src/config/build.ts +++ b/packages/schema/src/config/build.ts @@ -28,7 +28,9 @@ export default defineUntypedSchema({ * * @version 3 */ - sourcemap: true, + sourcemap: { + $resolve: (val, get) => val ?? get('dev'), + }, /** * Shared build configuration. * @version 2 diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index 3348d37dd7e..00291756f6f 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -51,6 +51,7 @@ export async function bundle (nuxt: Nuxt) { }, css: resolveCSSOptions(nuxt), build: { + sourcemap: nuxt.options.sourcemap, rollupOptions: { output: { sanitizeFileName: sanitizeFilePath } }, diff --git a/packages/webpack/src/configs/client.ts b/packages/webpack/src/configs/client.ts index 8daa02c1b75..25b4e6883fc 100644 --- a/packages/webpack/src/configs/client.ts +++ b/packages/webpack/src/configs/client.ts @@ -23,7 +23,11 @@ export function client (ctx: WebpackConfigContext) { function clientDevtool (ctx: WebpackConfigContext) { if (!ctx.isDev) { - ctx.config.devtool = false + ctx.config.devtool = ctx.nuxt.options.sourcemap ? 'source-map' : false + return + } + + if (!ctx.nuxt.options.sourcemap) { return } diff --git a/packages/webpack/src/configs/server.ts b/packages/webpack/src/configs/server.ts index a5fae9ceb1e..c7cc718569e 100644 --- a/packages/webpack/src/configs/server.ts +++ b/packages/webpack/src/configs/server.ts @@ -27,7 +27,8 @@ function serverPreset (ctx: WebpackConfigContext) { const { config } = ctx config.output!.filename = 'server.mjs' - config.devtool = 'cheap-module-source-map' + + config.devtool = ctx.nuxt.options.sourcemap ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false config.optimization = { splitChunks: false, From 3d6d32282db8a18f2e2ec3e8229ac6515adb81e0 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 10:30:34 +0100 Subject: [PATCH 2/8] =?UTF-8?q?fix(nitro):=20correct=20typo=20that=20preve?= =?UTF-8?q?nted=20disabling=20sourcemaps=20=F0=9F=99=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/nuxt/src/core/nitro.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 8455e60ee14..f90dc7410cc 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -58,7 +58,7 @@ export async function initNitro (nuxt: Nuxt) { .concat(nuxt.options._generate ? ['/', ...nuxt.options.generate.routes] : []) .concat(nuxt.options.ssr === false ? ['/', '/200.html', '/404.html'] : []) }, - sourcemap: nuxt.options.sourcemap, + sourceMap: nuxt.options.sourcemap, externals: { inline: [ ...(nuxt.options.dev From 055cefcf4d08df2c7268d11d30af7330db7469ac Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 10:44:21 +0100 Subject: [PATCH 3/8] refactor: default to server-only sourcemaps in production --- packages/nuxt/src/components/module.ts | 8 ++++---- packages/nuxt/src/core/nitro.ts | 2 +- packages/nuxt/src/core/nuxt.ts | 12 ++++++------ packages/nuxt/src/imports/module.ts | 4 ++-- packages/nuxt/src/pages/module.ts | 2 +- packages/schema/src/config/build.ts | 3 ++- packages/vite/src/client.ts | 1 + packages/vite/src/server.ts | 1 + packages/vite/src/vite.ts | 3 +-- packages/webpack/src/configs/client.ts | 7 ++++--- packages/webpack/src/configs/server.ts | 2 +- packages/webpack/src/webpack.ts | 4 ++-- 12 files changed, 26 insertions(+), 23 deletions(-) diff --git a/packages/nuxt/src/components/module.ts b/packages/nuxt/src/components/module.ts index 4f71dc19b2a..d577573e98b 100644 --- a/packages/nuxt/src/components/module.ts +++ b/packages/nuxt/src/components/module.ts @@ -168,13 +168,13 @@ export default defineNuxtModule({ nuxt.hook('vite:extendConfig', (config, { isClient }) => { config.plugins = config.plugins || [] config.plugins.push(loaderPlugin.vite({ - sourcemap: nuxt.options.sourcemap, + sourcemap: !!nuxt.options.sourcemap, getComponents, mode: isClient ? 'client' : 'server' })) if (nuxt.options.experimental.treeshakeClientOnly) { config.plugins.push(TreeShakeTemplatePlugin.vite({ - sourcemap: nuxt.options.sourcemap, + sourcemap: !!nuxt.options.sourcemap, getComponents })) } @@ -183,13 +183,13 @@ export default defineNuxtModule({ configs.forEach((config) => { config.plugins = config.plugins || [] config.plugins.push(loaderPlugin.webpack({ - sourcemap: nuxt.options.sourcemap, + sourcemap: !!nuxt.options.sourcemap, getComponents, mode: config.name === 'client' ? 'client' : 'server' })) if (nuxt.options.experimental.treeshakeClientOnly) { config.plugins.push(TreeShakeTemplatePlugin.webpack({ - sourcemap: nuxt.options.sourcemap, + sourcemap: !!nuxt.options.sourcemap, getComponents })) } diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index f90dc7410cc..3f9b86367e6 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -58,7 +58,7 @@ export async function initNitro (nuxt: Nuxt) { .concat(nuxt.options._generate ? ['/', ...nuxt.options.generate.routes] : []) .concat(nuxt.options.ssr === false ? ['/', '/200.html', '/404.html'] : []) }, - sourceMap: nuxt.options.sourcemap, + sourceMap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'client', externals: { inline: [ ...(nuxt.options.dev diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index 16b60315274..ad8b814e391 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -68,18 +68,18 @@ async function initNuxt (nuxt: Nuxt) { addWebpackPlugin(ImportProtectionPlugin.webpack(config)) // Add unctx transform - addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: nuxt.options.sourcemap })) - addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: nuxt.options.sourcemap })) + addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: !!nuxt.options.sourcemap })) + addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: !!nuxt.options.sourcemap })) if (!nuxt.options.dev) { const removeFromServer = ['onBeforeMount', 'onMounted', 'onBeforeUpdate', 'onRenderTracked', 'onRenderTriggered', 'onActivated', 'onDeactivated', 'onBeforeUnmount'] const removeFromClient = ['onServerPrefetch', 'onRenderTracked', 'onRenderTriggered'] // Add tree-shaking optimisations for SSR - build time only - addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap, treeShake: removeFromServer }), { client: false }) - addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap, treeShake: removeFromClient }), { server: false }) - addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap, treeShake: removeFromServer }), { client: false }) - addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap, treeShake: removeFromClient }), { server: false }) + addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'client', treeShake: removeFromServer }), { client: false }) + addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'server', treeShake: removeFromClient }), { server: false }) + addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'client', treeShake: removeFromServer }), { client: false }) + addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'server', treeShake: removeFromClient }), { server: false }) } // TODO: [Experimental] Avoid emitting assets when flag is enabled diff --git a/packages/nuxt/src/imports/module.ts b/packages/nuxt/src/imports/module.ts index e6bd204ebfd..5cad634af2f 100644 --- a/packages/nuxt/src/imports/module.ts +++ b/packages/nuxt/src/imports/module.ts @@ -91,8 +91,8 @@ export default defineNuxtModule>({ }) } else { // Transform to inject imports in production mode - addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap })) - addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap })) + addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: !!nuxt.options.sourcemap })) + addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: !!nuxt.options.sourcemap })) } const regenerateImports = async () => { diff --git a/packages/nuxt/src/pages/module.ts b/packages/nuxt/src/pages/module.ts index 6f080c1c312..a5488dd5838 100644 --- a/packages/nuxt/src/pages/module.ts +++ b/packages/nuxt/src/pages/module.ts @@ -88,7 +88,7 @@ export default defineNuxtModule({ // Extract macros from pages const macroOptions: TransformMacroPluginOptions = { dev: nuxt.options.dev, - sourcemap: nuxt.options.sourcemap, + sourcemap: !!nuxt.options.sourcemap, macros: { definePageMeta: 'meta' } diff --git a/packages/schema/src/config/build.ts b/packages/schema/src/config/build.ts index 369c3f3d9f9..334539da5cc 100644 --- a/packages/schema/src/config/build.ts +++ b/packages/schema/src/config/build.ts @@ -26,10 +26,11 @@ export default defineUntypedSchema({ /** * Whether to generate sourcemaps. * + * @type {boolean | 'server' | 'client'} * @version 3 */ sourcemap: { - $resolve: (val, get) => val ?? get('dev'), + $resolve: (val, get) => val ?? get('dev') ? true : 'server', }, /** * Shared build configuration. diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index 1964fbbd4e7..0c9fd61f2bd 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -52,6 +52,7 @@ export async function buildClient (ctx: ViteBuildContext) { dedupe: ['vue'] }, build: { + sourcemap: ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'client', manifest: true, outDir: resolve(ctx.nuxt.options.buildDir, 'dist/client'), rollupOptions: { diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index a6eedeb21ae..0cf67b66f4a 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -80,6 +80,7 @@ export async function buildServer (ctx: ViteBuildContext) { ] }, build: { + sourcemap: ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'client', outDir: resolve(ctx.nuxt.options.buildDir, 'dist/server'), ssr: ctx.nuxt.options.ssr ?? true, rollupOptions: { diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index 00291756f6f..9ee390143ba 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -51,7 +51,6 @@ export async function bundle (nuxt: Nuxt) { }, css: resolveCSSOptions(nuxt), build: { - sourcemap: nuxt.options.sourcemap, rollupOptions: { output: { sanitizeFileName: sanitizeFilePath } }, @@ -60,7 +59,7 @@ export async function bundle (nuxt: Nuxt) { } }, plugins: [ - composableKeysPlugin.vite({ sourcemap: nuxt.options.sourcemap, rootDir: nuxt.options.rootDir }), + composableKeysPlugin.vite({ sourcemap: !!nuxt.options.sourcemap, rootDir: nuxt.options.rootDir }), replace({ ...Object.fromEntries([';', '(', '{', '}', ' ', '\t', '\n'].map(d => [`${d}global.`, `${d}globalThis.`])), preventAssignment: true diff --git a/packages/webpack/src/configs/client.ts b/packages/webpack/src/configs/client.ts index 25b4e6883fc..19b6d6fbf43 100644 --- a/packages/webpack/src/configs/client.ts +++ b/packages/webpack/src/configs/client.ts @@ -22,12 +22,13 @@ export function client (ctx: WebpackConfigContext) { } function clientDevtool (ctx: WebpackConfigContext) { - if (!ctx.isDev) { - ctx.config.devtool = ctx.nuxt.options.sourcemap ? 'source-map' : false + if (!ctx.nuxt.options.sourcemap || ctx.nuxt.options.sourcemap === 'server') { + ctx.config.devtool = false return } - if (!ctx.nuxt.options.sourcemap) { + if (!ctx.isDev) { + ctx.config.devtool = 'source-map' return } diff --git a/packages/webpack/src/configs/server.ts b/packages/webpack/src/configs/server.ts index c7cc718569e..d585b1f7d86 100644 --- a/packages/webpack/src/configs/server.ts +++ b/packages/webpack/src/configs/server.ts @@ -28,7 +28,7 @@ function serverPreset (ctx: WebpackConfigContext) { config.output!.filename = 'server.mjs' - config.devtool = ctx.nuxt.options.sourcemap ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false + config.devtool = ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'client' ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false config.optimization = { splitChunks: false, diff --git a/packages/webpack/src/webpack.ts b/packages/webpack/src/webpack.ts index f23dffce199..3fe652c50e1 100644 --- a/packages/webpack/src/webpack.ts +++ b/packages/webpack/src/webpack.ts @@ -36,10 +36,10 @@ export async function bundle (nuxt: Nuxt) { // Configure compilers const compilers = webpackConfigs.map((config) => { config.plugins!.push(DynamicBasePlugin.webpack({ - sourcemap: nuxt.options.sourcemap + sourcemap: nuxt.options.sourcemap === true || nuxt.options.sourcemap !== config.name })) config.plugins!.push(composableKeysPlugin.webpack({ - sourcemap: nuxt.options.sourcemap, + sourcemap: nuxt.options.sourcemap === true || nuxt.options.sourcemap !== config.name, rootDir: nuxt.options.rootDir })) From 7d0b161aba7861f4552f75ee3b4565ef102dbe10 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 11:05:57 +0100 Subject: [PATCH 4/8] fix: update default value --- packages/schema/src/config/build.ts | 2 +- packages/vite/src/client.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/schema/src/config/build.ts b/packages/schema/src/config/build.ts index 334539da5cc..a397d3b999e 100644 --- a/packages/schema/src/config/build.ts +++ b/packages/schema/src/config/build.ts @@ -30,7 +30,7 @@ export default defineUntypedSchema({ * @version 3 */ sourcemap: { - $resolve: (val, get) => val ?? get('dev') ? true : 'server', + $resolve: (val, get) => val ?? (get('dev') ? true : 'server'), }, /** * Shared build configuration. diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index 0c9fd61f2bd..bdf3d9caf8b 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -52,7 +52,7 @@ export async function buildClient (ctx: ViteBuildContext) { dedupe: ['vue'] }, build: { - sourcemap: ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'client', + sourcemap: ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'server', manifest: true, outDir: resolve(ctx.nuxt.options.buildDir, 'dist/client'), rollupOptions: { From 580fe95ffb5e63dc84ca0e74c89d9c4fc4c0b61d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 11:57:45 +0100 Subject: [PATCH 5/8] refactor: use object syntax for `sourcemap` --- packages/nuxt/src/components/module.ts | 25 +++++++++++++++---------- packages/nuxt/src/core/nitro.ts | 2 +- packages/nuxt/src/core/nuxt.ts | 10 ++++++---- packages/schema/src/config/build.ts | 12 ++++++++++-- packages/vite/src/client.ts | 2 +- packages/vite/src/server.ts | 2 +- packages/webpack/src/configs/client.ts | 3 ++- packages/webpack/src/configs/server.ts | 3 ++- packages/webpack/src/webpack.ts | 5 +++-- 9 files changed, 41 insertions(+), 23 deletions(-) diff --git a/packages/nuxt/src/components/module.ts b/packages/nuxt/src/components/module.ts index d577573e98b..c51655c589d 100644 --- a/packages/nuxt/src/components/module.ts +++ b/packages/nuxt/src/components/module.ts @@ -9,7 +9,7 @@ import { TreeShakeTemplatePlugin } from './tree-shake' const isPureObjectOrString = (val: any) => (!Array.isArray(val) && typeof val === 'object') || typeof val === 'string' const isDirectory = (p: string) => { try { return statSync(p).isDirectory() } catch (_e) { return false } } -function compareDirByPathLength ({ path: pathA }: { path: string}, { path: pathB }: { path: string}) { +function compareDirByPathLength ({ path: pathA }: { path: string }, { path: pathB }: { path: string }) { return pathB.split(/[\\/]/).filter(Boolean).length - pathA.split(/[\\/]/).filter(Boolean).length } @@ -165,31 +165,36 @@ export default defineNuxtModule({ } }) - nuxt.hook('vite:extendConfig', (config, { isClient }) => { + nuxt.hook('vite:extendConfig', (config, { isClient, isServer }) => { + const mode = isClient ? 'client' : 'server' + const sourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap[mode] + config.plugins = config.plugins || [] config.plugins.push(loaderPlugin.vite({ - sourcemap: !!nuxt.options.sourcemap, + sourcemap, getComponents, - mode: isClient ? 'client' : 'server' + mode })) - if (nuxt.options.experimental.treeshakeClientOnly) { + if (nuxt.options.experimental.treeshakeClientOnly && isServer) { config.plugins.push(TreeShakeTemplatePlugin.vite({ - sourcemap: !!nuxt.options.sourcemap, + sourcemap, getComponents })) } }) nuxt.hook('webpack:config', (configs) => { configs.forEach((config) => { + const mode = config.name === 'client' ? 'client' : 'server' + const sourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap[mode] config.plugins = config.plugins || [] config.plugins.push(loaderPlugin.webpack({ - sourcemap: !!nuxt.options.sourcemap, + sourcemap, getComponents, - mode: config.name === 'client' ? 'client' : 'server' + mode })) - if (nuxt.options.experimental.treeshakeClientOnly) { + if (nuxt.options.experimental.treeshakeClientOnly && mode === 'server') { config.plugins.push(TreeShakeTemplatePlugin.webpack({ - sourcemap: !!nuxt.options.sourcemap, + sourcemap, getComponents })) } diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 3f9b86367e6..9210459df45 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -58,7 +58,7 @@ export async function initNitro (nuxt: Nuxt) { .concat(nuxt.options._generate ? ['/', ...nuxt.options.generate.routes] : []) .concat(nuxt.options.ssr === false ? ['/', '/200.html', '/404.html'] : []) }, - sourceMap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'client', + sourceMap: typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap.server, externals: { inline: [ ...(nuxt.options.dev diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index ad8b814e391..267b7f3b6b5 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -76,10 +76,12 @@ async function initNuxt (nuxt: Nuxt) { const removeFromClient = ['onServerPrefetch', 'onRenderTracked', 'onRenderTriggered'] // Add tree-shaking optimisations for SSR - build time only - addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'client', treeShake: removeFromServer }), { client: false }) - addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'server', treeShake: removeFromClient }), { server: false }) - addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'client', treeShake: removeFromServer }), { client: false }) - addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap && nuxt.options.sourcemap !== 'server', treeShake: removeFromClient }), { server: false }) + const serverSourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap.server + const clientSourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap.client + addVitePlugin(TreeShakePlugin.vite({ sourcemap: serverSourcemap, treeShake: removeFromServer }), { client: false }) + addVitePlugin(TreeShakePlugin.vite({ sourcemap: clientSourcemap, treeShake: removeFromClient }), { server: false }) + addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: serverSourcemap, treeShake: removeFromServer }), { client: false }) + addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: clientSourcemap, treeShake: removeFromClient }), { server: false }) } // TODO: [Experimental] Avoid emitting assets when flag is enabled diff --git a/packages/schema/src/config/build.ts b/packages/schema/src/config/build.ts index a397d3b999e..8bf843e382e 100644 --- a/packages/schema/src/config/build.ts +++ b/packages/schema/src/config/build.ts @@ -26,11 +26,19 @@ export default defineUntypedSchema({ /** * Whether to generate sourcemaps. * - * @type {boolean | 'server' | 'client'} + * @type {boolean | { server?: boolean, client?: boolean }} * @version 3 */ sourcemap: { - $resolve: (val, get) => val ?? (get('dev') ? true : 'server'), + $resolve: (val, get) => { + if (typeof val === 'boolean') { + return { server: val, client: val } + } + return defu(val, { + server: true, + client: get('dev') + }) + }, }, /** * Shared build configuration. diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index bdf3d9caf8b..aa9d78ed418 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -52,7 +52,7 @@ export async function buildClient (ctx: ViteBuildContext) { dedupe: ['vue'] }, build: { - sourcemap: ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'server', + sourcemap: typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.client, manifest: true, outDir: resolve(ctx.nuxt.options.buildDir, 'dist/client'), rollupOptions: { diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index 0cf67b66f4a..ef34728f2d1 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -80,7 +80,7 @@ export async function buildServer (ctx: ViteBuildContext) { ] }, build: { - sourcemap: ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'client', + sourcemap: typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.server, outDir: resolve(ctx.nuxt.options.buildDir, 'dist/server'), ssr: ctx.nuxt.options.ssr ?? true, rollupOptions: { diff --git a/packages/webpack/src/configs/client.ts b/packages/webpack/src/configs/client.ts index 19b6d6fbf43..6bb34137ff4 100644 --- a/packages/webpack/src/configs/client.ts +++ b/packages/webpack/src/configs/client.ts @@ -22,7 +22,8 @@ export function client (ctx: WebpackConfigContext) { } function clientDevtool (ctx: WebpackConfigContext) { - if (!ctx.nuxt.options.sourcemap || ctx.nuxt.options.sourcemap === 'server') { + const enableClientSourcemap = typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.client + if (!enableClientSourcemap) { ctx.config.devtool = false return } diff --git a/packages/webpack/src/configs/server.ts b/packages/webpack/src/configs/server.ts index d585b1f7d86..16e45c30bea 100644 --- a/packages/webpack/src/configs/server.ts +++ b/packages/webpack/src/configs/server.ts @@ -28,7 +28,8 @@ function serverPreset (ctx: WebpackConfigContext) { config.output!.filename = 'server.mjs' - config.devtool = ctx.nuxt.options.sourcemap && ctx.nuxt.options.sourcemap !== 'client' ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false + const enableServerSourcemap = typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.server + config.devtool = enableServerSourcemap ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false config.optimization = { splitChunks: false, diff --git a/packages/webpack/src/webpack.ts b/packages/webpack/src/webpack.ts index 3fe652c50e1..b585e4095fe 100644 --- a/packages/webpack/src/webpack.ts +++ b/packages/webpack/src/webpack.ts @@ -35,11 +35,12 @@ export async function bundle (nuxt: Nuxt) { // Configure compilers const compilers = webpackConfigs.map((config) => { + const sourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap[config.name as 'client' | 'server']! config.plugins!.push(DynamicBasePlugin.webpack({ - sourcemap: nuxt.options.sourcemap === true || nuxt.options.sourcemap !== config.name + sourcemap })) config.plugins!.push(composableKeysPlugin.webpack({ - sourcemap: nuxt.options.sourcemap === true || nuxt.options.sourcemap !== config.name, + sourcemap, rootDir: nuxt.options.rootDir })) From 8aac276953462ed5f8c40d7e56bc968504825fdc Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 12:06:28 +0100 Subject: [PATCH 6/8] refactor: exclude boolean type from NuxtOptions --- packages/nuxt/src/components/module.ts | 10 ++++------ packages/nuxt/src/core/nitro.ts | 2 +- packages/nuxt/src/core/nuxt.ts | 14 ++++++-------- packages/nuxt/src/imports/module.ts | 4 ++-- packages/nuxt/src/pages/module.ts | 2 +- packages/schema/src/types/config.ts | 7 ++++--- packages/vite/src/vite.ts | 2 +- packages/webpack/src/configs/client.ts | 3 +-- packages/webpack/src/configs/server.ts | 3 +-- packages/webpack/src/webpack.ts | 5 ++--- 10 files changed, 23 insertions(+), 29 deletions(-) diff --git a/packages/nuxt/src/components/module.ts b/packages/nuxt/src/components/module.ts index c51655c589d..891617d6543 100644 --- a/packages/nuxt/src/components/module.ts +++ b/packages/nuxt/src/components/module.ts @@ -167,17 +167,16 @@ export default defineNuxtModule({ nuxt.hook('vite:extendConfig', (config, { isClient, isServer }) => { const mode = isClient ? 'client' : 'server' - const sourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap[mode] config.plugins = config.plugins || [] config.plugins.push(loaderPlugin.vite({ - sourcemap, + sourcemap: nuxt.options.sourcemap[mode], getComponents, mode })) if (nuxt.options.experimental.treeshakeClientOnly && isServer) { config.plugins.push(TreeShakeTemplatePlugin.vite({ - sourcemap, + sourcemap: nuxt.options.sourcemap[mode], getComponents })) } @@ -185,16 +184,15 @@ export default defineNuxtModule({ nuxt.hook('webpack:config', (configs) => { configs.forEach((config) => { const mode = config.name === 'client' ? 'client' : 'server' - const sourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap[mode] config.plugins = config.plugins || [] config.plugins.push(loaderPlugin.webpack({ - sourcemap, + sourcemap: nuxt.options.sourcemap[mode], getComponents, mode })) if (nuxt.options.experimental.treeshakeClientOnly && mode === 'server') { config.plugins.push(TreeShakeTemplatePlugin.webpack({ - sourcemap, + sourcemap: nuxt.options.sourcemap[mode], getComponents })) } diff --git a/packages/nuxt/src/core/nitro.ts b/packages/nuxt/src/core/nitro.ts index 9210459df45..be20faa9253 100644 --- a/packages/nuxt/src/core/nitro.ts +++ b/packages/nuxt/src/core/nitro.ts @@ -58,7 +58,7 @@ export async function initNitro (nuxt: Nuxt) { .concat(nuxt.options._generate ? ['/', ...nuxt.options.generate.routes] : []) .concat(nuxt.options.ssr === false ? ['/', '/200.html', '/404.html'] : []) }, - sourceMap: typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap.server, + sourceMap: nuxt.options.sourcemap.server, externals: { inline: [ ...(nuxt.options.dev diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index 267b7f3b6b5..3271f471fcf 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -68,20 +68,18 @@ async function initNuxt (nuxt: Nuxt) { addWebpackPlugin(ImportProtectionPlugin.webpack(config)) // Add unctx transform - addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: !!nuxt.options.sourcemap })) - addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: !!nuxt.options.sourcemap })) + addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) + addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) if (!nuxt.options.dev) { const removeFromServer = ['onBeforeMount', 'onMounted', 'onBeforeUpdate', 'onRenderTracked', 'onRenderTriggered', 'onActivated', 'onDeactivated', 'onBeforeUnmount'] const removeFromClient = ['onServerPrefetch', 'onRenderTracked', 'onRenderTriggered'] // Add tree-shaking optimisations for SSR - build time only - const serverSourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap.server - const clientSourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap.client - addVitePlugin(TreeShakePlugin.vite({ sourcemap: serverSourcemap, treeShake: removeFromServer }), { client: false }) - addVitePlugin(TreeShakePlugin.vite({ sourcemap: clientSourcemap, treeShake: removeFromClient }), { server: false }) - addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: serverSourcemap, treeShake: removeFromServer }), { client: false }) - addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: clientSourcemap, treeShake: removeFromClient }), { server: false }) + addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap.server, treeShake: removeFromServer }), { client: false }) + addVitePlugin(TreeShakePlugin.vite({ sourcemap: nuxt.options.sourcemap.client, treeShake: removeFromClient }), { server: false }) + addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap.server, treeShake: removeFromServer }), { client: false }) + addWebpackPlugin(TreeShakePlugin.webpack({ sourcemap: nuxt.options.sourcemap.client, treeShake: removeFromClient }), { server: false }) } // TODO: [Experimental] Avoid emitting assets when flag is enabled diff --git a/packages/nuxt/src/imports/module.ts b/packages/nuxt/src/imports/module.ts index 5cad634af2f..7f545f1fd44 100644 --- a/packages/nuxt/src/imports/module.ts +++ b/packages/nuxt/src/imports/module.ts @@ -91,8 +91,8 @@ export default defineNuxtModule>({ }) } else { // Transform to inject imports in production mode - addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: !!nuxt.options.sourcemap })) - addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: !!nuxt.options.sourcemap })) + addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) + addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) } const regenerateImports = async () => { diff --git a/packages/nuxt/src/pages/module.ts b/packages/nuxt/src/pages/module.ts index a5488dd5838..7df911efc1d 100644 --- a/packages/nuxt/src/pages/module.ts +++ b/packages/nuxt/src/pages/module.ts @@ -88,7 +88,7 @@ export default defineNuxtModule({ // Extract macros from pages const macroOptions: TransformMacroPluginOptions = { dev: nuxt.options.dev, - sourcemap: !!nuxt.options.sourcemap, + sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean), macros: { definePageMeta: 'meta' } diff --git a/packages/schema/src/types/config.ts b/packages/schema/src/types/config.ts index 3fda92c80c4..af133c179ad 100644 --- a/packages/schema/src/types/config.ts +++ b/packages/schema/src/types/config.ts @@ -26,6 +26,7 @@ export type NuxtConfigLayer = ConfigLayer _layers: NuxtConfigLayer[] } @@ -53,11 +54,11 @@ export interface ViteConfig extends ViteUserConfig { type RuntimeConfigNamespace = Record -export interface PublicRuntimeConfig extends RuntimeConfigNamespace { } +export interface PublicRuntimeConfig extends RuntimeConfigNamespace {} // TODO: remove before release of 3.0.0 /** @deprecated use RuntimeConfig interface */ -export interface PrivateRuntimeConfig extends RuntimeConfigNamespace { } +export interface PrivateRuntimeConfig extends RuntimeConfigNamespace {} export interface RuntimeConfig extends PrivateRuntimeConfig, RuntimeConfigNamespace { public: PublicRuntimeConfig @@ -80,4 +81,4 @@ export interface NuxtAppConfig { keepalive: boolean | KeepAliveProps } -export interface AppConfig { } +export interface AppConfig {} diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index 9ee390143ba..a3d1085e94e 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -59,7 +59,7 @@ export async function bundle (nuxt: Nuxt) { } }, plugins: [ - composableKeysPlugin.vite({ sourcemap: !!nuxt.options.sourcemap, rootDir: nuxt.options.rootDir }), + composableKeysPlugin.vite({ sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean), rootDir: nuxt.options.rootDir }), replace({ ...Object.fromEntries([';', '(', '{', '}', ' ', '\t', '\n'].map(d => [`${d}global.`, `${d}globalThis.`])), preventAssignment: true diff --git a/packages/webpack/src/configs/client.ts b/packages/webpack/src/configs/client.ts index 6bb34137ff4..e01d82fa2ce 100644 --- a/packages/webpack/src/configs/client.ts +++ b/packages/webpack/src/configs/client.ts @@ -22,8 +22,7 @@ export function client (ctx: WebpackConfigContext) { } function clientDevtool (ctx: WebpackConfigContext) { - const enableClientSourcemap = typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.client - if (!enableClientSourcemap) { + if (!ctx.nuxt.options.sourcemap.client) { ctx.config.devtool = false return } diff --git a/packages/webpack/src/configs/server.ts b/packages/webpack/src/configs/server.ts index 16e45c30bea..46c7b490bb0 100644 --- a/packages/webpack/src/configs/server.ts +++ b/packages/webpack/src/configs/server.ts @@ -28,8 +28,7 @@ function serverPreset (ctx: WebpackConfigContext) { config.output!.filename = 'server.mjs' - const enableServerSourcemap = typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.server - config.devtool = enableServerSourcemap ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false + config.devtool = ctx.nuxt.options.sourcemap.server ? ctx.isDev ? 'cheap-module-source-map' : 'source-map' : false config.optimization = { splitChunks: false, diff --git a/packages/webpack/src/webpack.ts b/packages/webpack/src/webpack.ts index b585e4095fe..78be641e9b3 100644 --- a/packages/webpack/src/webpack.ts +++ b/packages/webpack/src/webpack.ts @@ -35,12 +35,11 @@ export async function bundle (nuxt: Nuxt) { // Configure compilers const compilers = webpackConfigs.map((config) => { - const sourcemap = typeof nuxt.options.sourcemap === 'boolean' ? nuxt.options.sourcemap : nuxt.options.sourcemap[config.name as 'client' | 'server']! config.plugins!.push(DynamicBasePlugin.webpack({ - sourcemap + sourcemap: nuxt.options.sourcemap[config.name as 'client' | 'server'] })) config.plugins!.push(composableKeysPlugin.webpack({ - sourcemap, + sourcemap: nuxt.options.sourcemap[config.name as 'client' | 'server']!, rootDir: nuxt.options.rootDir })) From 1ef9fd086fc6afbda47089549a95e2a930339291 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 12:25:49 +0100 Subject: [PATCH 7/8] fix: remove extra typeof test --- packages/vite/src/client.ts | 2 +- packages/vite/src/server.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index bab74d493eb..4cd0a48b8ac 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -51,7 +51,7 @@ export async function buildClient (ctx: ViteBuildContext) { dedupe: ['vue'] }, build: { - sourcemap: typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.client, + sourcemap: ctx.nuxt.options.sourcemap.client, manifest: true, outDir: resolve(ctx.nuxt.options.buildDir, 'dist/client'), rollupOptions: { diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index 392d1378176..5a2c2a403ac 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -81,7 +81,7 @@ export async function buildServer (ctx: ViteBuildContext) { ] }, build: { - sourcemap: typeof ctx.nuxt.options.sourcemap === 'boolean' ? ctx.nuxt.options.sourcemap : ctx.nuxt.options.sourcemap.server, + sourcemap: ctx.nuxt.options.sourcemap.server, outDir: resolve(ctx.nuxt.options.buildDir, 'dist/server'), ssr: ctx.nuxt.options.ssr ?? true, rollupOptions: { From dce773943dc5dea4b17c2b5fae72eac3961c8576 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 7 Sep 2022 12:28:00 +0100 Subject: [PATCH 8/8] refactor: use || for more readable test --- packages/nuxt/src/core/nuxt.ts | 4 ++-- packages/nuxt/src/imports/module.ts | 4 ++-- packages/nuxt/src/pages/module.ts | 2 +- packages/schema/src/types/config.ts | 2 +- packages/vite/src/vite.ts | 2 +- packages/webpack/src/webpack.ts | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index 3271f471fcf..111e12fff82 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -68,8 +68,8 @@ async function initNuxt (nuxt: Nuxt) { addWebpackPlugin(ImportProtectionPlugin.webpack(config)) // Add unctx transform - addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) - addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) + addVitePlugin(UnctxTransformPlugin(nuxt).vite({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) + addWebpackPlugin(UnctxTransformPlugin(nuxt).webpack({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) if (!nuxt.options.dev) { const removeFromServer = ['onBeforeMount', 'onMounted', 'onBeforeUpdate', 'onRenderTracked', 'onRenderTriggered', 'onActivated', 'onDeactivated', 'onBeforeUnmount'] diff --git a/packages/nuxt/src/imports/module.ts b/packages/nuxt/src/imports/module.ts index 7f545f1fd44..7f4a1dd49be 100644 --- a/packages/nuxt/src/imports/module.ts +++ b/packages/nuxt/src/imports/module.ts @@ -91,8 +91,8 @@ export default defineNuxtModule>({ }) } else { // Transform to inject imports in production mode - addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) - addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean) })) + addVitePlugin(TransformPlugin.vite({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) + addWebpackPlugin(TransformPlugin.webpack({ ctx, options, sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client })) } const regenerateImports = async () => { diff --git a/packages/nuxt/src/pages/module.ts b/packages/nuxt/src/pages/module.ts index 7df911efc1d..0388c3a032d 100644 --- a/packages/nuxt/src/pages/module.ts +++ b/packages/nuxt/src/pages/module.ts @@ -88,7 +88,7 @@ export default defineNuxtModule({ // Extract macros from pages const macroOptions: TransformMacroPluginOptions = { dev: nuxt.options.dev, - sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean), + sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client, macros: { definePageMeta: 'meta' } diff --git a/packages/schema/src/types/config.ts b/packages/schema/src/types/config.ts index af133c179ad..f451cf831ef 100644 --- a/packages/schema/src/types/config.ts +++ b/packages/schema/src/types/config.ts @@ -26,7 +26,7 @@ export type NuxtConfigLayer = ConfigLayer + sourcemap: Required> _layers: NuxtConfigLayer[] } diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index a3d1085e94e..664dafbf261 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -59,7 +59,7 @@ export async function bundle (nuxt: Nuxt) { } }, plugins: [ - composableKeysPlugin.vite({ sourcemap: Object.values(nuxt.options.sourcemap).some(Boolean), rootDir: nuxt.options.rootDir }), + composableKeysPlugin.vite({ sourcemap: nuxt.options.sourcemap.server || nuxt.options.sourcemap.client, rootDir: nuxt.options.rootDir }), replace({ ...Object.fromEntries([';', '(', '{', '}', ' ', '\t', '\n'].map(d => [`${d}global.`, `${d}globalThis.`])), preventAssignment: true diff --git a/packages/webpack/src/webpack.ts b/packages/webpack/src/webpack.ts index 78be641e9b3..c3a52296064 100644 --- a/packages/webpack/src/webpack.ts +++ b/packages/webpack/src/webpack.ts @@ -39,7 +39,7 @@ export async function bundle (nuxt: Nuxt) { sourcemap: nuxt.options.sourcemap[config.name as 'client' | 'server'] })) config.plugins!.push(composableKeysPlugin.webpack({ - sourcemap: nuxt.options.sourcemap[config.name as 'client' | 'server']!, + sourcemap: nuxt.options.sourcemap[config.name as 'client' | 'server'], rootDir: nuxt.options.rootDir }))