Spaces:
Running
Running
const resolve = require('path').resolve | |
const config = require('lilconfig') | |
const yaml = require('yaml') | |
const loadOptions = require('./options.js') | |
const loadPlugins = require('./plugins.js') | |
/* istanbul ignore next */ | |
const interopRequireDefault = (obj) => obj && obj.__esModule ? obj : { default: obj } | |
/** | |
* Process the result from cosmiconfig | |
* | |
* @param {Object} ctx Config Context | |
* @param {Object} result Cosmiconfig result | |
* | |
* @return {Object} PostCSS Config | |
*/ | |
const processResult = (ctx, result) => { | |
const file = result.filepath || '' | |
let config = interopRequireDefault(result.config).default || {} | |
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 | |
} | |
} | |
/** | |
* Builds the Config Context | |
* | |
* @param {Object} ctx Config Context | |
* | |
* @return {Object} Config Context | |
*/ | |
const createContext = (ctx) => { | |
/** | |
* @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) | |
if (!ctx.env) { | |
process.env.NODE_ENV = 'development' | |
} | |
return ctx | |
} | |
const addTypeScriptLoader = (options = {}, loader) => { | |
const moduleName = 'postcss' | |
return { | |
...options, | |
searchPlaces: [ | |
...(options.searchPlaces || []), | |
'package.json', | |
`.${moduleName}rc`, | |
`.${moduleName}rc.json`, | |
`.${moduleName}rc.yaml`, | |
`.${moduleName}rc.yml`, | |
`.${moduleName}rc.ts`, | |
`.${moduleName}rc.js`, | |
`.${moduleName}rc.cjs`, | |
`${moduleName}.config.ts`, | |
`${moduleName}.config.js`, | |
`${moduleName}.config.cjs` | |
], | |
loaders: { | |
...options.loaders, | |
'.yaml': (filepath, content) => yaml.parse(content), | |
'.yml': (filepath, content) => yaml.parse(content), | |
'.ts': loader | |
} | |
} | |
} | |
const withTypeScriptLoader = (rcFunc) => { | |
return (ctx, path, options) => { | |
return rcFunc(ctx, path, addTypeScriptLoader(options, (configFile) => { | |
let registerer = { enabled () {} } | |
try { | |
// Register TypeScript compiler instance | |
registerer = require('ts-node').register() | |
return require(configFile) | |
} catch (err) { | |
if (err.code === 'MODULE_NOT_FOUND') { | |
throw new Error( | |
`'ts-node' is required for the TypeScript configuration files. Make sure it is installed\nError: ${err.message}` | |
) | |
} | |
throw err | |
} finally { | |
registerer.enabled(false) | |
} | |
})) | |
} | |
} | |
/** | |
* 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 = withTypeScriptLoader((ctx, path, options) => { | |
/** | |
* @type {Object} The full Config Context | |
*/ | |
ctx = createContext(ctx) | |
/** | |
* @type {String} `process.cwd()` | |
*/ | |
path = path ? resolve(path) : process.cwd() | |
return config.lilconfig('postcss', options) | |
.search(path) | |
.then((result) => { | |
if (!result) { | |
throw new Error(`No PostCSS Config found in: ${path}`) | |
} | |
return processResult(ctx, result) | |
}) | |
}) | |
rc.sync = withTypeScriptLoader((ctx, path, options) => { | |
/** | |
* @type {Object} The full Config Context | |
*/ | |
ctx = createContext(ctx) | |
/** | |
* @type {String} `process.cwd()` | |
*/ | |
path = path ? resolve(path) : process.cwd() | |
const result = config.lilconfigSync('postcss', options).search(path) | |
if (!result) { | |
throw new Error(`No PostCSS Config found in: ${path}`) | |
} | |
return processResult(ctx, result) | |
}) | |
/** | |
* Autoload Config for PostCSS | |
* | |
* @author Michael Ciniawsky @michael-ciniawsky <michael.ciniawsky@gmail.com> | |
* @license MIT | |
* | |
* @module postcss-load-config | |
* @version 2.1.0 | |
* | |
* @requires comsiconfig | |
* @requires ./options | |
* @requires ./plugins | |
*/ | |
module.exports = rc | |