diff options
Diffstat (limited to 'node_modules/postcss-load-config/src')
| -rw-r--r-- | node_modules/postcss-load-config/src/index.js | 92 | ||||
| -rw-r--r-- | node_modules/postcss-load-config/src/options.js | 47 | ||||
| -rw-r--r-- | node_modules/postcss-load-config/src/plugins.js | 80 |
3 files changed, 219 insertions, 0 deletions
diff --git a/node_modules/postcss-load-config/src/index.js b/node_modules/postcss-load-config/src/index.js new file mode 100644 index 00000000..d613729f --- /dev/null +++ b/node_modules/postcss-load-config/src/index.js @@ -0,0 +1,92 @@ +'use strict' + +const resolve = require('path').resolve + +const config = require('cosmiconfig') + +const loadOptions = require('./options.js') +const loadPlugins = require('./plugins.js') + +/** + * Load Config + * + * @method rc + * + * @param {Object} ctx Config Context + * @param {String} path Config Path + * @param {Object} options Config Options + * + * @return {Promise} config PostCSS Config + */ +const rc = (ctx, path, options) => { + /** + * @type {Object} + * + * @prop {String} cwd=process.cwd() Config search start location + * @prop {String} env=process.env.NODE_ENV Config Enviroment, will be set to `development` by `postcss-load-config` if `process.env.NODE_ENV` is `undefined` + */ + ctx = Object.assign({ + cwd: process.cwd(), + env: process.env.NODE_ENV + }, ctx) + /** + * @type {String} `process.cwd()` + * + */ + path = path ? resolve(path) : process.cwd() + + /** + * @type {Object} + * + * @prop {Boolean} rcExtensions=true + */ + options = Object.assign({ + rcExtensions: true + }, options) + + if (!ctx.env) { + process.env.NODE_ENV = 'development' + } + + return config('postcss', options) + .load(path) + .then((result) => { + if (!result) { + throw new Error(`No PostCSS Config found in: ${path}`) + } + + let file = result.filepath || '' + let config = result.config || {} + + if (typeof config === 'function') { + config = config(ctx) + } else { + config = Object.assign({}, config, ctx) + } + + if (!config.plugins) { + config.plugins = [] + } + + return { + plugins: loadPlugins(config, file), + options: loadOptions(config, file), + file: file + } + }) +} + +/** + * Autoload Config for PostCSS + * + * @author Michael Ciniawsky @michael-ciniawsky <michael.ciniawsky@gmail.com> + * @license MIT + * + * @module postcss-load-config + * @version 2.0.0 + * + * @requires comsiconfig + * @requires ./options + * @requires ./plugins + */ +module.exports = rc diff --git a/node_modules/postcss-load-config/src/options.js b/node_modules/postcss-load-config/src/options.js new file mode 100644 index 00000000..552d09b4 --- /dev/null +++ b/node_modules/postcss-load-config/src/options.js @@ -0,0 +1,47 @@ +'use strict' + +const req = require('import-cwd') + +/** + * Load Options + * + * @private + * @method options + * + * @param {Object} config PostCSS Config + * + * @return {Object} options PostCSS Options + */ +const options = (config, file) => { + if (config.parser && typeof config.parser === 'string') { + try { + config.parser = req(config.parser) + } catch (err) { + throw new Error(`Loading PostCSS Parser failed: ${err.message}\n\n(@${file})`) + } + } + + if (config.syntax && typeof config.syntax === 'string') { + try { + config.syntax = req(config.syntax) + } catch (err) { + throw new Error(`Loading PostCSS Syntax failed: ${err.message}\n\n(@${file})`) + } + } + + if (config.stringifier && typeof config.stringifier === 'string') { + try { + config.stringifier = req(config.stringifier) + } catch (err) { + throw new Error(`Loading PostCSS Stringifier failed: ${err.message}\n\n(@${file})`) + } + } + + if (config.plugins) { + delete config.plugins + } + + return config +} + +module.exports = options diff --git a/node_modules/postcss-load-config/src/plugins.js b/node_modules/postcss-load-config/src/plugins.js new file mode 100644 index 00000000..923d8c73 --- /dev/null +++ b/node_modules/postcss-load-config/src/plugins.js @@ -0,0 +1,80 @@ +'use strict' + +const req = require('import-cwd') + +/** + * Plugin Loader + * + * @private + * @method load + * + * @param {String} plugin PostCSS Plugin Name + * @param {Object} options PostCSS Plugin Options + * + * @return {Function} PostCSS Plugin + */ +const load = (plugin, options, file) => { + if (options === null || Object.keys(options).length === 0) { + try { + return req(plugin) + } catch (err) { + throw new Error(`Loading PostCSS Plugin failed: ${err.message}\n\n(@${file})`) + } + } else { + try { + return req(plugin)(options) + } 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 {Array} plugins PostCSS Plugins + */ +const plugins = (config, file) => { + let plugins = [] + + if (Array.isArray(config.plugins)) { + plugins = config.plugins.filter(Boolean) + } else { + plugins = Object.keys(config.plugins) + .filter((plugin) => { + return config.plugins[plugin] !== false ? plugin : '' + }) + .map((plugin) => { + return load(plugin, config.plugins[plugin], file) + }) + } + + if (plugins.length && plugins.length > 0) { + plugins.forEach((plugin, i) => { + if (plugin.postcss) { + plugin = plugin.postcss + } + + if (plugin.default) { + plugin = plugin.default + } + + if ( + // eslint-disable-next-line + !(typeof plugin === 'object' && Array.isArray(plugin.plugins) || + typeof plugin === 'function') + ) { + throw new TypeError(`Invalid PostCSS Plugin found at: plugins[${i}]\n\n(@${file})`) + } + }) + } + + return plugins +} + +module.exports = plugins |
