This repository has been archived on 2024-11-13. You can view files and clone it, but cannot push or open issues or pull requests.
fediversity.eu/node_modules/postcss-load-config/src/index.js
2024-03-26 16:28:28 +01:00

165 lines
3.6 KiB
JavaScript

// @ts-check
const { resolve } = require('node:path')
const config = require('lilconfig')
const yaml = require('yaml')
const loadOptions = require('./options.js')
const loadPlugins = require('./plugins.js')
const req = require('./req.js')
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 {Promise<Object>} PostCSS Config
*/
async function processResult(ctx, result) {
let file = result.filepath || ''
let projectConfig = interopRequireDefault(result.config).default || {}
if (typeof projectConfig === 'function') {
projectConfig = projectConfig(ctx)
} else {
projectConfig = Object.assign({}, projectConfig, ctx)
}
if (!projectConfig.plugins) {
projectConfig.plugins = []
}
let res = {
file,
options: await loadOptions(projectConfig, file),
plugins: await loadPlugins(projectConfig, file)
}
delete projectConfig.plugins
return res
}
/**
* Builds the Config Context
*
* @param {Object} ctx Config Context
*
* @return {Object} Config Context
*/
function 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
}
async function loader(filepath) {
return req(filepath)
}
/** @return {import('lilconfig').Options} */
const withLoaders = (options = {}) => {
let moduleName = 'postcss'
return {
...options,
loaders: {
...options.loaders,
'.cjs': loader,
'.cts': loader,
'.js': loader,
'.mjs': loader,
'.mts': loader,
'.ts': loader,
'.yaml': (_, content) => yaml.parse(content),
'.yml': (_, content) => yaml.parse(content)
},
searchPlaces: [
...(options.searchPlaces || []),
'package.json',
`.${moduleName}rc`,
`.${moduleName}rc.json`,
`.${moduleName}rc.yaml`,
`.${moduleName}rc.yml`,
`.${moduleName}rc.ts`,
`.${moduleName}rc.cts`,
`.${moduleName}rc.mts`,
`.${moduleName}rc.js`,
`.${moduleName}rc.cjs`,
`.${moduleName}rc.mjs`,
`${moduleName}.config.ts`,
`${moduleName}.config.cts`,
`${moduleName}.config.mts`,
`${moduleName}.config.js`,
`${moduleName}.config.cjs`,
`${moduleName}.config.mjs`
]
}
}
/**
* Load Config
*
* @method rc
*
* @param {Object} ctx Config Context
* @param {String} path Config Path
* @param {Object} options Config Options
*
* @return {Promise} config PostCSS Config
*/
function rc(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', withLoaders(options))
.search(path)
.then(result => {
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