1
1
import type {
2
- ChainIdentifier ,
3
- RsbuildPlugin ,
4
- Rspack ,
5
- RspackChain ,
2
+ ChainIdentifier ,
3
+ RsbuildPlugin ,
4
+ Rspack ,
5
+ RspackChain ,
6
6
} from '@rsbuild/core' ;
7
7
import CssMinimizerWebpackPlugin from 'css-minimizer-webpack-plugin' ;
8
8
import type CssMinimizerPlugin from 'css-minimizer-webpack-plugin' ;
@@ -13,84 +13,84 @@ import { type ConfigChain, reduceConfigs } from 'reduce-configs';
13
13
* @see https://cssnano.co/docs/optimisations
14
14
*/
15
15
export type CssNanoOptions = {
16
- /** Path to a cssnano configuration file. */
17
- configFile ?: string | undefined ;
18
- /** Preset name and optional configuration object for cssnano. */
19
- preset ?: [ string , object ] | string | undefined ;
16
+ /** Path to a cssnano configuration file. */
17
+ configFile ?: string | undefined ;
18
+ /** Preset name and optional configuration object for cssnano. */
19
+ preset ?: [ string , object ] | string | undefined ;
20
20
} ;
21
21
22
22
/**
23
23
* Options for Lightning CSS minifier.
24
24
* @see https://lightningcss.dev/options.html
25
25
*/
26
26
export type LightningCssOptions = {
27
- /** Browser targets for minification, using browserslist syntax or specific versions. */
28
- targets ?: string | string [ ] | { [ key : string ] : number } ;
29
- /** Enable CSS nesting (draft specification). */
30
- drafts ?: { nesting ?: boolean } ;
31
- /** Additional Lightning CSS-specific options. */
32
- [ key : string ] : any ;
27
+ /** Browser targets for minification, using browserslist syntax or specific versions. */
28
+ targets ?: string | string [ ] | { [ key : string ] : number } ;
29
+ /** Enable CSS nesting (draft specification). */
30
+ drafts ?: { nesting ?: boolean } ;
31
+ /** Additional Lightning CSS-specific options. */
32
+ [ key : string ] : unknown ;
33
33
} ;
34
34
35
35
/**
36
36
* Options for the CSS minimizer plugin.
37
37
*/
38
38
export type PluginCssMinimizerOptions = {
39
- /**
40
- * Specifies the CSS minifier to use.
41
- * - 'cssnano': Uses cssnano (JavaScript-based) for minification with extensive optimizations.
42
- * - 'lightningcss': Uses Lightning CSS (Rust-based) for faster minification.
43
- * @default 'cssnano'
44
- */
45
- minifier ?: 'cssnano' | 'lightningcss' ;
46
- /**
47
- * Configuration options for cssnano minifier.
48
- * Only applied if minifier is set to 'cssnano'.
49
- * @example
50
- * {
51
- * preset: ['default', { mergeLonghand: false }]
52
- * }
53
- */
54
- cssnanoOptions ?: ConfigChain <
55
- CssMinimizerPlugin . BasePluginOptions &
56
- CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < CssNanoOptions >
57
- > ;
58
- /**
59
- * Configuration options for Lightning CSS minifier.
60
- * Only applied if minifier is set to 'lightningcss'.
61
- * @example
62
- * {
63
- * targets: ['> 0.25%', 'not dead'],
64
- * drafts: { nesting: true }
65
- * }
66
- */
67
- lightningCssOptions ?: ConfigChain <
68
- CssMinimizerPlugin . BasePluginOptions &
69
- CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < LightningCssOptions >
70
- > ;
39
+ /**
40
+ * Specifies the CSS minifier to use.
41
+ * - 'cssnano': Uses cssnano (JavaScript-based) for minification with extensive optimizations.
42
+ * - 'lightningcss': Uses Lightning CSS (Rust-based) for faster minification.
43
+ * @default 'cssnano'
44
+ */
45
+ minifier ?: 'cssnano' | 'lightningcss' ;
46
+ /**
47
+ * Configuration options for cssnano minifier.
48
+ * Only applied if minifier is set to 'cssnano'.
49
+ * @example
50
+ * {
51
+ * preset: ['default', { mergeLonghand: false }]
52
+ * }
53
+ */
54
+ cssnanoOptions ?: ConfigChain <
55
+ CssMinimizerPlugin . BasePluginOptions &
56
+ CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < CssNanoOptions >
57
+ > ;
58
+ /**
59
+ * Configuration options for Lightning CSS minifier.
60
+ * Only applied if minifier is set to 'lightningcss'.
61
+ * @example
62
+ * {
63
+ * targets: ['> 0.25%', 'not dead'],
64
+ * drafts: { nesting: true }
65
+ * }
66
+ */
67
+ lightningCssOptions ?: ConfigChain <
68
+ CssMinimizerPlugin . BasePluginOptions &
69
+ CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < LightningCssOptions >
70
+ > ;
71
71
} ;
72
72
73
73
/**
74
74
* Default options for cssnano minifier.
75
75
* @returns Default cssnano configuration.
76
76
*/
77
77
const getCssnanoDefaultOptions = ( ) : CssNanoOptions => ( {
78
- preset : [
79
- 'default' ,
80
- {
81
- // Disable mergeLonghand to avoid breaking safe-area-inset-top
82
- // https://github.com/cssnano/cssnano/issues/803
83
- mergeLonghand : false ,
84
- } ,
85
- ] ,
78
+ preset : [
79
+ 'default' ,
80
+ {
81
+ // Disable mergeLonghand to avoid breaking safe-area-inset-top
82
+ // https://github.com/cssnano/cssnano/issues/803
83
+ mergeLonghand : false ,
84
+ } ,
85
+ ] ,
86
86
} ) ;
87
87
88
88
/**
89
89
* Default options for Lightning CSS minifier.
90
90
* @returns Default Lightning CSS configuration.
91
91
*/
92
92
const getLightningCssDefaultOptions = ( ) : LightningCssOptions => ( {
93
- targets : 'defaults' , // Default browserslist query for modern browsers
93
+ targets : 'defaults' , // Default browserslist query for modern browsers
94
94
} ) ;
95
95
96
96
/**
@@ -100,45 +100,47 @@ const getLightningCssDefaultOptions = (): LightningCssOptions => ({
100
100
* @param options - Plugin options including minifier type and specific configurations.
101
101
*/
102
102
export function applyCSSMinimizer (
103
- chain : RspackChain ,
104
- CHAIN_ID : ChainIdentifier ,
105
- options : PluginCssMinimizerOptions = { } ,
103
+ chain : RspackChain ,
104
+ CHAIN_ID : ChainIdentifier ,
105
+ options : PluginCssMinimizerOptions = { } ,
106
106
) : void {
107
- const { minifier = 'cssnano' , cssnanoOptions, lightningCssOptions } = options ;
107
+ const { minifier = 'cssnano' , cssnanoOptions, lightningCssOptions } = options ;
108
108
109
- if ( minifier === 'cssnano' ) {
110
- const mergedOptions : CssMinimizerPlugin . BasePluginOptions &
111
- CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < CssNanoOptions > = reduceConfigs ( {
112
- initial : {
113
- minify : CssMinimizerWebpackPlugin . cssnanoMinify ,
114
- minimizerOptions : getCssnanoDefaultOptions ( ) ,
115
- } ,
116
- config : cssnanoOptions ,
117
- } ) ;
109
+ if ( minifier === 'cssnano' ) {
110
+ const mergedOptions : CssMinimizerPlugin . BasePluginOptions &
111
+ CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < CssNanoOptions > =
112
+ reduceConfigs ( {
113
+ initial : {
114
+ minify : CssMinimizerWebpackPlugin . cssnanoMinify ,
115
+ minimizerOptions : getCssnanoDefaultOptions ( ) ,
116
+ } ,
117
+ config : cssnanoOptions ,
118
+ } ) ;
118
119
119
- chain . optimization
120
- . minimizer ( CHAIN_ID . MINIMIZER . CSS )
121
- . use ( CssMinimizerWebpackPlugin as Rspack . RspackPluginInstance , [
122
- mergedOptions ,
123
- ] )
124
- . end ( ) ;
125
- } else {
126
- const mergedOptions : CssMinimizerPlugin . BasePluginOptions &
127
- CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < LightningCssOptions > = reduceConfigs ( {
128
- initial : {
129
- minify : CssMinimizerWebpackPlugin . lightningCssMinify ,
130
- minimizerOptions : getLightningCssDefaultOptions ( ) ,
131
- } ,
132
- config : lightningCssOptions ,
133
- } ) ;
120
+ chain . optimization
121
+ . minimizer ( CHAIN_ID . MINIMIZER . CSS )
122
+ . use ( CssMinimizerWebpackPlugin as Rspack . RspackPluginInstance , [
123
+ mergedOptions ,
124
+ ] )
125
+ . end ( ) ;
126
+ } else {
127
+ const mergedOptions : CssMinimizerPlugin . BasePluginOptions &
128
+ CssMinimizerPlugin . DefinedDefaultMinimizerAndOptions < LightningCssOptions > =
129
+ reduceConfigs ( {
130
+ initial : {
131
+ minify : CssMinimizerWebpackPlugin . lightningCssMinify ,
132
+ minimizerOptions : getLightningCssDefaultOptions ( ) ,
133
+ } ,
134
+ config : lightningCssOptions ,
135
+ } ) ;
134
136
135
- chain . optimization
136
- . minimizer ( CHAIN_ID . MINIMIZER . CSS )
137
- . use ( CssMinimizerWebpackPlugin as Rspack . RspackPluginInstance , [
138
- mergedOptions ,
139
- ] )
140
- . end ( ) ;
141
- }
137
+ chain . optimization
138
+ . minimizer ( CHAIN_ID . MINIMIZER . CSS )
139
+ . use ( CssMinimizerWebpackPlugin as Rspack . RspackPluginInstance , [
140
+ mergedOptions ,
141
+ ] )
142
+ . end ( ) ;
143
+ }
142
144
}
143
145
144
146
/**
@@ -171,23 +173,23 @@ export const PLUGIN_CSS_MINIMIZER_NAME = 'rsbuild:css-minimizer';
171
173
* })
172
174
*/
173
175
export const pluginCssMinimizer = (
174
- options ?: PluginCssMinimizerOptions ,
176
+ options ?: PluginCssMinimizerOptions ,
175
177
) : RsbuildPlugin => ( {
176
- name : PLUGIN_CSS_MINIMIZER_NAME ,
178
+ name : PLUGIN_CSS_MINIMIZER_NAME ,
177
179
178
- setup ( api ) {
179
- api . modifyBundlerChain ( async ( chain , { CHAIN_ID , environment, isProd } ) => {
180
- const { config } = environment ;
181
- const { minify } = config . output ;
180
+ setup ( api ) {
181
+ api . modifyBundlerChain ( async ( chain , { CHAIN_ID , environment, isProd } ) => {
182
+ const { config } = environment ;
183
+ const { minify } = config . output ;
182
184
183
- if (
184
- isProd &&
185
- ( minify === true || ( typeof minify === 'object' && minify . css ) )
186
- ) {
187
- applyCSSMinimizer ( chain , CHAIN_ID , options ) ;
188
- }
189
- } ) ;
190
- } ,
185
+ if (
186
+ isProd &&
187
+ ( minify === true || ( typeof minify === 'object' && minify . css ) )
188
+ ) {
189
+ applyCSSMinimizer ( chain , CHAIN_ID , options ) ;
190
+ }
191
+ } ) ;
192
+ } ,
191
193
} ) ;
192
194
193
- export { CssMinimizerWebpackPlugin } ;
195
+ export { CssMinimizerWebpackPlugin } ;
0 commit comments