123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- 'use strict'
- 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
|