@roots/bud-minify
Version:
CSS and JS minification for bud.js
50 lines (41 loc) • 1.42 kB
text/typescript
import type {Bud} from '@roots/bud-framework'
import {Extension} from '@roots/bud-framework/extension'
import {label} from '@roots/bud-framework/extension/decorators/label'
import {production} from '@roots/bud-framework/extension/decorators/production'
import {bind} from '@roots/bud-support/decorators/bind'
import {
BudMinimizeJSPublicApi,
type BudMinimizeJSPublicInterface,
} from './extension.config.js'
/**
* JS minimizer configuration
*/
(`@roots/bud-minify/minify-js`)
class BudMinimizeJS extends BudMinimizeJSPublicApi {
/**
* {@link Extension.buildBefore}
*/
public override async buildBefore({extensions, hooks, module}: Bud) {
const {
default: Minimizer,
esbuildMinify,
swcMinify,
terserMinify,
} = await module.import(`terser-webpack-plugin`, import.meta.url, {
raw: true,
})
if (!this.minify && extensions.has(`@roots/bud-swc`))
this.setMinify(() => swcMinify)
if (!this.minify && extensions.has(`@roots/bud-esbuild`))
this.setMinify(() => esbuildMinify)
if (!this.minify) this.setMinify(() => terserMinify)
hooks.on(`build.optimization.minimizer`, (minimizers = []) => [
...minimizers.filter(minimizer => !(minimizer instanceof Minimizer)),
new Minimizer({...this.options}),
])
}
}
export default BudMinimizeJS
export type {BudMinimizeJS, BudMinimizeJSPublicInterface}