forked from webpack/webpack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCSSModulesPlugin.js
More file actions
84 lines (66 loc) · 1.88 KB
/
CSSModulesPlugin.js
File metadata and controls
84 lines (66 loc) · 1.88 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
const CSSParser = require("./CSSParser");
const CSSGenerator = require("./CSSGenerator");
const CSSTemplate = require("./CSSTemplate");
const { ConcatSource } = require("webpack-sources");
class CSSModulesPlugin {
constructor() {
this.plugin = {
name: "CSSModulesPlugin"
};
}
apply(compiler) {
const { plugin } = this;
const { compilation } = compiler.hooks;
compilation.tap(plugin, (compilation, { normalModuleFactory }) => {
const { createParser, createGenerator } = normalModuleFactory.hooks;
createParser.for("css/experimental").tap(plugin, options => {
return new CSSParser(options);
});
createGenerator.for("css/experimental").tap(plugin, options => {
return new CSSGenerator(options);
});
const { chunkTemplate } = compilation;
chunkTemplate.hooks.renderManifest.tap(plugin, (result, options) => {
const { chunk, moduleTemplates, dependencyTemplates } = options;
const filenameTemplate = options.outputOptions.cssFilename;
result.push({
render: () =>
this.renderCSS(
chunkTemplate,
chunk,
moduleTemplates.css,
dependencyTemplates
),
filenameTemplate,
pathOptions: {
chunk
},
identifier: `CSSChunk (${chunk.id})`,
hash: chunk.hash
});
return result;
});
});
}
renderCSSModules(module, moduleTemplate, dependencyTemplates) {
return moduleTemplate.render(module, dependencyTemplates, {});
}
renderCSS(chunkTemplate, chunk, moduleTemplate, dependencyTemplates) {
const { modules } = chunkTemplate.hooks;
const sources = CSSTemplate.renderChunk(
chunk,
module => module.type.startsWith("css"),
moduleTemplate,
dependencyTemplates
);
const result = modules.call(
sources,
chunk,
moduleTemplate,
dependencyTemplates
);
chunk.rendered = true;
return new ConcatSource(result);
}
}
module.exports = CSSModulesPlugin;