forked from webpack/webpack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCSSParser.js
More file actions
98 lines (81 loc) · 2.09 KB
/
CSSParser.js
File metadata and controls
98 lines (81 loc) · 2.09 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
const postcss = require("postcss");
const { imports, urls } = require("./parser/plugins");
const { selectors } = require("./parser/plugins/modules");
const {
CSSURLDependency,
CSSImportDependency,
CSSExportDependency
} = require("./dependencies");
const { OriginalSource, SourceMapSource } = require("webpack-sources");
class CSSParser {
constructor(options = {}) {
this.postcss = options;
}
parse(source, state, cb) {
const plugins = [
urls({
url: true
}),
imports({
import: true
}),
selectors()
].concat(this.postcss.plugins || []);
const options = Object.assign(
{
to: state.module.resource,
map: {
inline: false,
annotation: false
},
from: state.module.resource
},
this.postcss.options
);
postcss(plugins)
.process(source, options)
.then(({ root, css, map, messages }) => {
state.module._ast = root;
state.module._source = map
? new SourceMapSource(css, state.module.resource, map)
: new OriginalSource(css, state.module.resource);
return messages.filter(msg => msg.type.includes("dependency")).reduce(
(done, dep) =>
new Promise((resolve, reject) => {
if (dep.name.includes("CSS__URL")) {
const dependency = new CSSURLDependency(dep.url, dep.name);
state.module.addDependency(dependency, err => {
if (err) reject(err);
resolve();
});
}
if (dep.name.includes("CSS__IMPORT")) {
const dependency = new CSSImportDependency(
dep.import,
dep.name
);
state.module.addDependency(dependency, err => {
if (err) reject(err);
resolve();
});
}
if (dep.name.includes("CSS__EXPORT")) {
const dependency = new CSSExportDependency(
dep.export(),
dep.name
);
state.module.addDependency(dependency, err => {
if (err) reject(err);
resolve();
});
}
resolve();
}),
Promise.resolve()
);
})
.then(() => cb(null, state))
.catch(err => cb(err));
}
}
module.exports = CSSParser;