-
Notifications
You must be signed in to change notification settings - Fork 343
Expand file tree
/
Copy pathplugin.ts
More file actions
121 lines (108 loc) · 3.26 KB
/
plugin.ts
File metadata and controls
121 lines (108 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import {
cssFileFilter,
type IdentifierOption,
} from '@vanilla-extract/integration';
import type { Compiler, RuleSetRule } from 'webpack';
import { ChildCompiler } from './compiler';
import createCompat, { type WebpackCompat } from './compat';
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const pluginName = 'VanillaExtractPlugin';
function markCSSFilesAsSideEffects(compiler: Compiler, compat: WebpackCompat) {
compiler.hooks.normalModuleFactory.tap(pluginName, (nmf) => {
if (compat.isWebpack5) {
nmf.hooks.createModule.tap(
pluginName,
// @ts-expect-error CreateData is typed as 'object'...
(createData: {
matchResource?: string;
settings: { sideEffects?: boolean };
}) => {
if (
createData.matchResource &&
(createData.matchResource.endsWith('.vanilla.css') ||
createData.matchResource.endsWith('vanilla.virtual.css'))
) {
createData.settings.sideEffects = true;
}
},
);
} else {
nmf.hooks.afterResolve.tap(
pluginName,
// @ts-expect-error Can't be typesafe for webpack 4
(result: {
matchResource?: string;
settings: { sideEffects?: boolean };
}) => {
if (
result.matchResource &&
(result.matchResource.endsWith('.vanilla.css') ||
result.matchResource.endsWith('vanilla.virtual.css'))
) {
result.settings.sideEffects = true;
}
},
);
}
});
}
export interface PluginOptions {
test?: RuleSetRule['test'];
identifiers?: IdentifierOption;
outputCss?: boolean;
/**
* Effectively `ExternalItem[]` from webpack. Currently typed as `any` as this type was
* previously not exposed. The `any` type will be fixed in the next major version.
*/
externals?: any;
/** @deprecated */
allowRuntime?: boolean;
}
export abstract class AbstractVanillaExtractPlugin {
test: RuleSetRule['test'];
outputCss: boolean;
allowRuntime: boolean;
childCompiler: ChildCompiler;
identifiers?: IdentifierOption;
constructor(options: PluginOptions = {}) {
const {
test = cssFileFilter,
outputCss = true,
externals,
allowRuntime,
identifiers,
} = options;
if (allowRuntime !== undefined) {
console.warn('The "allowRuntime" option is deprecated.');
}
this.test = test;
this.outputCss = outputCss;
this.allowRuntime = allowRuntime ?? false;
this.childCompiler = new ChildCompiler(externals);
this.identifiers = identifiers;
}
protected inject(
compiler: Compiler,
virtualLoader: 'virtualFileLoader' | 'virtualNextFileLoader',
): void {
const compat = createCompat(
Boolean(compiler.webpack && compiler.webpack.version),
);
markCSSFilesAsSideEffects(compiler, compat);
compiler.options.module?.rules.splice(0, 0, {
test: this.test,
use: [
{
loader: require.resolve('../loader'),
options: {
outputCss: this.outputCss,
childCompiler: this.childCompiler,
identifiers: this.identifiers,
virtualLoader: virtualLoader,
},
},
],
});
}
}