Nuxt/packages/webpack/src/utils/config.ts
izzy goldman 373d015ae7
refactor(schema,vite,webpack): rework postcss module loading (#27946)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-07-02 19:28:48 +01:00

72 lines
2.0 KiB
TypeScript

import type { Configuration } from 'webpack'
import type { Nuxt, NuxtOptions } from '@nuxt/schema'
import { logger } from '@nuxt/kit'
import { cloneDeep } from 'lodash-es'
import { toArray } from './index'
export interface WebpackConfigContext {
nuxt: Nuxt
options: NuxtOptions
userConfig: Omit<NuxtOptions['webpack'], '$client' | '$server'>
config: Configuration
name: string
isDev: boolean
isServer: boolean
isClient: boolean
alias: { [index: string]: string | false | string[] }
transpile: RegExp[]
}
type WebpackConfigPreset = (ctx: WebpackConfigContext, options?: object) => void | Promise<void>
type WebpackConfigPresetItem = WebpackConfigPreset | [WebpackConfigPreset, any]
export function createWebpackConfigContext (nuxt: Nuxt): WebpackConfigContext {
return {
nuxt,
options: nuxt.options,
userConfig: nuxt.options.webpack,
config: {},
name: 'base',
isDev: nuxt.options.dev,
isServer: false,
isClient: false,
alias: {},
transpile: [],
}
}
export async function applyPresets (ctx: WebpackConfigContext, presets: WebpackConfigPresetItem | WebpackConfigPresetItem[]) {
for (const preset of toArray(presets)) {
if (Array.isArray(preset)) {
await preset[0](ctx, preset[1])
} else {
await preset(ctx)
}
}
}
export function fileName (ctx: WebpackConfigContext, key: string) {
let fileName = ctx.userConfig.filenames[key]
if (typeof fileName === 'function') {
fileName = fileName(ctx)
}
if (typeof fileName === 'string' && ctx.options.dev) {
const hash = /\[(chunkhash|contenthash|hash)(?::\d+)?\]/.exec(fileName)
if (hash) {
logger.warn(`Notice: Please do not use ${hash[1]} in dev mode to prevent memory leak`)
}
}
return fileName
}
export function getWebpackConfig (ctx: WebpackConfigContext): Configuration {
// Clone to avoid leaking config between Client and Server
// TODO: rewrite webpack implementation to avoid necessity for this
return cloneDeep(ctx.config)
}