| 'use strict'; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| |
| var _path = require('path'); |
| |
| var _path2 = _interopRequireDefault(_path); |
| |
| var _postcss = require('postcss'); |
| |
| var _postcss2 = _interopRequireDefault(_postcss); |
| |
| var _cosmiconfig = require('cosmiconfig'); |
| |
| var _cosmiconfig2 = _interopRequireDefault(_cosmiconfig); |
| |
| var _isResolvable = require('is-resolvable'); |
| |
| var _isResolvable2 = _interopRequireDefault(_isResolvable); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| const cssnano = 'cssnano'; |
| |
| function initializePlugin(plugin, css, result) { |
| if (Array.isArray(plugin)) { |
| const [processor, opts] = plugin; |
| if (typeof opts === 'undefined' || typeof opts === 'object' && !opts.exclude || typeof opts === 'boolean' && opts === true) { |
| return Promise.resolve(processor(opts)(css, result)); |
| } |
| } else { |
| return Promise.resolve(plugin()(css, result)); |
| } |
| // Handle excluded plugins |
| return Promise.resolve(); |
| } |
| |
| /* |
| * preset can be one of four possibilities: |
| * preset = 'default' |
| * preset = ['default', {}] |
| * preset = function <- to be invoked |
| * preset = {plugins: []} <- already invoked function |
| */ |
| |
| function resolvePreset(preset) { |
| let fn, options; |
| if (Array.isArray(preset)) { |
| fn = preset[0]; |
| options = preset[1]; |
| } else { |
| fn = preset; |
| options = {}; |
| } |
| // For JS setups where we invoked the preset already |
| if (preset.plugins) { |
| return Promise.resolve(preset.plugins); |
| } |
| // Provide an alias for the default preset, as it is built-in. |
| if (fn === 'default') { |
| return Promise.resolve(require('cssnano-preset-default')(options).plugins); |
| } |
| // For non-JS setups; we'll need to invoke the preset ourselves. |
| if (typeof fn === 'function') { |
| return Promise.resolve(fn(options).plugins); |
| } |
| // Try loading a preset from node_modules |
| if ((0, _isResolvable2.default)(fn)) { |
| return Promise.resolve(require(fn)(options).plugins); |
| } |
| const sugar = `cssnano-preset-${fn}`; |
| // Try loading a preset from node_modules (sugar) |
| if ((0, _isResolvable2.default)(sugar)) { |
| return Promise.resolve(require(sugar)(options).plugins); |
| } |
| // If all else fails, we probably have a typo in the config somewhere |
| throw new Error(`Cannot load preset "${fn}". Please check your configuration for errors and try again.`); |
| } |
| |
| /* |
| * cssnano will look for configuration firstly as options passed |
| * directly to it, and failing this it will use cosmiconfig to |
| * load an external file. |
| */ |
| |
| function resolveConfig(css, result, options) { |
| if (options.preset) { |
| return resolvePreset(options.preset); |
| } |
| |
| const inputFile = css.source && css.source.input && css.source.input.file; |
| let searchPath = inputFile ? _path2.default.dirname(inputFile) : process.cwd(); |
| let configPath = null; |
| |
| if (options.configFile) { |
| searchPath = null; |
| configPath = _path2.default.resolve(process.cwd(), options.configFile); |
| } |
| |
| const configExplorer = (0, _cosmiconfig2.default)(cssnano); |
| const searchForConfig = configPath ? configExplorer.load(configPath) : configExplorer.search(searchPath); |
| |
| return searchForConfig.then(config => { |
| if (config === null) { |
| return resolvePreset('default'); |
| } |
| return resolvePreset(config.config.preset || config.config); |
| }); |
| } |
| |
| exports.default = _postcss2.default.plugin(cssnano, (options = {}) => { |
| return (css, result) => { |
| return resolveConfig(css, result, options).then(plugins => { |
| return plugins.reduce((promise, plugin) => { |
| return promise.then(initializePlugin.bind(null, plugin, css, result)); |
| }, Promise.resolve()); |
| }); |
| }; |
| }); |
| module.exports = exports['default']; |