plugins.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. 'use strict'
  2. const req = require('import-cwd')
  3. /**
  4. * Plugin Loader
  5. *
  6. * @private
  7. * @method load
  8. *
  9. * @param {String} plugin PostCSS Plugin Name
  10. * @param {Object} options PostCSS Plugin Options
  11. *
  12. * @return {Function} PostCSS Plugin
  13. */
  14. const load = (plugin, options, file) => {
  15. try {
  16. if (
  17. options === null ||
  18. options === undefined ||
  19. Object.keys(options).length === 0
  20. ) {
  21. return req(plugin)
  22. } else {
  23. return req(plugin)(options)
  24. }
  25. } catch (err) {
  26. throw new Error(`Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})`)
  27. }
  28. }
  29. /**
  30. * Load Plugins
  31. *
  32. * @private
  33. * @method plugins
  34. *
  35. * @param {Object} config PostCSS Config Plugins
  36. *
  37. * @return {Array} plugins PostCSS Plugins
  38. */
  39. const plugins = (config, file) => {
  40. let plugins = []
  41. if (Array.isArray(config.plugins)) {
  42. plugins = config.plugins.filter(Boolean)
  43. } else {
  44. plugins = Object.keys(config.plugins)
  45. .filter((plugin) => {
  46. return config.plugins[plugin] !== false ? plugin : ''
  47. })
  48. .map((plugin) => {
  49. return load(plugin, config.plugins[plugin], file)
  50. })
  51. }
  52. if (plugins.length && plugins.length > 0) {
  53. plugins.forEach((plugin, i) => {
  54. if (plugin.default) {
  55. plugin = plugin.default
  56. }
  57. if (plugin.postcss === true) {
  58. plugin = plugin()
  59. } else if (plugin.postcss) {
  60. plugin = plugin.postcss
  61. }
  62. if (
  63. // eslint-disable-next-line
  64. !(
  65. (typeof plugin === 'object' && Array.isArray(plugin.plugins)) ||
  66. (typeof plugin === 'object' && plugin.postcssPlugin) ||
  67. (typeof plugin === 'function')
  68. )
  69. ) {
  70. throw new TypeError(`Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})`)
  71. }
  72. })
  73. }
  74. return plugins
  75. }
  76. module.exports = plugins