@roots/bud-minify
Version:
CSS and JS minification for bud.js
57 lines (48 loc) • 1.51 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 {
type BudMinimizeCSSOptions,
BudMinimizeCSSPublicApi,
type BudMinimizeCSSPublicInterface,
} from './extension.config.js'
/**
* Css minimizer
*/
(`@roots/bud-minify/minify-css`)
class BudMinimizeCSS extends BudMinimizeCSSPublicApi {
/**
* {@link Extension.buildBefore}
*/
public override async buildBefore({extensions, hooks, module}: Bud) {
const {
default: Minimizer,
esbuildMinify,
lightningCssMinify,
swcMinify,
} = await module.import(
`css-minimizer-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(() => lightningCssMinify)
hooks.on(`build.optimization.minimizer`, (minimizers = []) => [
...minimizers.filter(minimizer => !(minimizer instanceof Minimizer)),
new Minimizer({...this.options}),
])
}
}
export default BudMinimizeCSS
export type {
BudMinimizeCSS,
BudMinimizeCSSOptions,
BudMinimizeCSSPublicInterface,
}