-
-
Notifications
You must be signed in to change notification settings - Fork 71
/
plugins.js
90 lines (82 loc) · 1.9 KB
/
plugins.js
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
// @ts-check
const req = require('./req.js')
/**
* Plugin Loader
*
* @private
* @method load
*
* @param {String} plugin PostCSS Plugin Name
* @param {Object} options PostCSS Plugin Options
*
* @return {Promise<Function>} PostCSS Plugin
*/
async function load(plugin, options, file) {
try {
if (
options === null ||
options === undefined ||
Object.keys(options).length === 0
) {
return await req(plugin, file)
} else {
return (await req(plugin, file))(options)
/* c8 ignore next */
}
} catch (err) {
throw new Error(
`Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})`
)
}
}
/**
* Load Plugins
*
* @private
* @method plugins
*
* @param {Object} config PostCSS Config Plugins
*
* @return {Promise<Array>} plugins PostCSS Plugins
*/
async function plugins(config, file) {
let list = []
if (Array.isArray(config.plugins)) {
list = config.plugins.filter(Boolean)
} else {
list = Object.entries(config.plugins)
.filter(([, options]) => {
return options !== false
})
.map(([plugin, options]) => {
return load(plugin, options, file)
})
list = await Promise.all(list)
}
if (list.length && list.length > 0) {
list.forEach((plugin, i) => {
if (plugin.default) {
plugin = plugin.default
}
if (plugin.postcss === true) {
plugin = plugin()
} else if (plugin.postcss) {
plugin = plugin.postcss
}
if (
// eslint-disable-next-line
!(
(typeof plugin === 'object' && Array.isArray(plugin.plugins)) ||
(typeof plugin === 'object' && plugin.postcssPlugin) ||
typeof plugin === 'function'
)
) {
throw new TypeError(
`Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})`
)
}
})
}
return list
}
module.exports = plugins