@@ -4,7 +4,7 @@ import { tmpdir } from 'node:os';
4
4
import path from 'node:path' ;
5
5
import { pathToFileURL } from 'node:url' ;
6
6
7
- import type { Rspack } from '@rsbuild/core' ;
7
+ import type { PostCSSLoaderOptions , Rspack } from '@rsbuild/core' ;
8
8
9
9
/**
10
10
* The options for {@link TailwindRspackPlugin}.
@@ -15,10 +15,6 @@ interface TailwindRspackPluginOptions {
15
15
/**
16
16
* The path to the configuration of Tailwind CSS.
17
17
*
18
- * @remarks
19
- *
20
- * The default value is `tailwind.config.js`.
21
- *
22
18
* @example
23
19
*
24
20
* Use absolute path:
@@ -58,7 +54,36 @@ interface TailwindRspackPluginOptions {
58
54
* }
59
55
* ```
60
56
*/
61
- config ?: string ;
57
+ config : string ;
58
+
59
+ /**
60
+ * The postcss options to be applied.
61
+ *
62
+ * @example
63
+ *
64
+ * Use `cssnano`:
65
+ *
66
+ * ```js
67
+ * // rspack.config.js
68
+ * import { TailwindRspackPlugin } from '@rsbuild/plugin-tailwindcss'
69
+ *
70
+ * export default {
71
+ * plugins: [
72
+ * new TailwindRspackPlugin({
73
+ * postcssOptions: {
74
+ * plugins: {
75
+ * cssnano: process.env['NODE_ENV'] === 'production' ? {} : false,
76
+ * },
77
+ * },
78
+ * }),
79
+ * ],
80
+ * }
81
+ * ```
82
+ */
83
+ postcssOptions : Exclude <
84
+ PostCSSLoaderOptions [ 'postcssOptions' ] ,
85
+ ( loaderContext : Rspack . LoaderContext ) => void
86
+ > ;
62
87
}
63
88
64
89
/**
@@ -67,9 +92,7 @@ interface TailwindRspackPluginOptions {
67
92
* @public
68
93
*/
69
94
class TailwindRspackPlugin {
70
- constructor (
71
- private readonly options ?: TailwindRspackPluginOptions | undefined ,
72
- ) { }
95
+ constructor ( private readonly options : TailwindRspackPluginOptions ) { }
73
96
74
97
/**
75
98
* `defaultOptions` is the default options that the {@link TailwindRspackPlugin} uses.
@@ -79,33 +102,27 @@ class TailwindRspackPlugin {
79
102
static defaultOptions : Readonly < Required < TailwindRspackPluginOptions > > =
80
103
Object . freeze < Required < TailwindRspackPluginOptions > > ( {
81
104
config : 'tailwind.config.js' ,
105
+ postcssOptions : { } ,
82
106
} ) ;
83
107
84
108
/**
85
109
* The entry point of a Rspack plugin.
86
110
* @param compiler - the Rspack compiler
87
111
*/
88
112
apply ( compiler : Rspack . Compiler ) : void {
89
- new TailwindRspackPluginImpl (
90
- compiler ,
91
- Object . assign ( { } , TailwindRspackPlugin . defaultOptions , this . options ) ,
92
- ) ;
113
+ new TailwindRspackPluginImpl ( compiler , this . options ) ;
93
114
}
94
115
}
95
116
96
117
export { TailwindRspackPlugin } ;
97
118
export type { TailwindRspackPluginOptions } ;
98
119
99
- type NoUndefinedField < T > = {
100
- [ P in keyof T ] -?: NoUndefinedField < NonNullable < T [ P ] > > ;
101
- } ;
102
-
103
120
class TailwindRspackPluginImpl {
104
121
name = 'TailwindRspackPlugin' ;
105
122
106
123
constructor (
107
124
private compiler : Rspack . Compiler ,
108
- private options : NoUndefinedField < TailwindRspackPluginOptions > ,
125
+ private options : TailwindRspackPluginOptions ,
109
126
) {
110
127
const { RawSource } = compiler . webpack . sources ;
111
128
compiler . hooks . thisCompilation . tap ( this . name , ( compilation ) => {
@@ -146,6 +163,7 @@ class TailwindRspackPluginImpl {
146
163
] ) ;
147
164
148
165
const postcssTransform = postcss ( [
166
+ ...( options . postcssOptions ?. plugins ?? [ ] ) ,
149
167
// We use a config path to avoid performance issue of TailwindCSS
150
168
// See: https://github.com/tailwindlabs/tailwindcss/issues/14229
151
169
tailwindcss ( {
@@ -161,7 +179,7 @@ class TailwindRspackPluginImpl {
161
179
// FIXME: add custom postcss config
162
180
const transformResult = await postcssTransform . process (
163
181
content ,
164
- { from : asset . name } ,
182
+ { from : asset . name , ... options . postcssOptions } ,
165
183
) ;
166
184
// FIXME: add sourcemap support
167
185
compilation . updateAsset (
0 commit comments