|
'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') |
|
|
|
|
|
const interopRequireDefault = (obj) => obj && obj.__esModule ? obj : { default: obj } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const createContext = (ctx) => { |
|
|
|
|
|
|
|
|
|
|
|
|
|
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 { |
|
|
|
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) |
|
} |
|
})) |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const rc = withTypeScriptLoader((ctx, path, options) => { |
|
|
|
|
|
|
|
ctx = createContext(ctx) |
|
|
|
|
|
|
|
|
|
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) => { |
|
|
|
|
|
|
|
ctx = createContext(ctx) |
|
|
|
|
|
|
|
|
|
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) |
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = rc |
|
|