49 lines
1.3 KiB
Plaintext
49 lines
1.3 KiB
Plaintext
|
import fs from 'fs'
|
||
|
import path from 'path'
|
||
|
|
||
|
/**
|
||
|
* Find the @config at-rule in the given CSS AST and return the relative path to the config file
|
||
|
*
|
||
|
* @param {import('postcss').Root} root
|
||
|
* @param {import('postcss').Result} result
|
||
|
*/
|
||
|
export function findAtConfigPath(root, result) {
|
||
|
let configPath = null
|
||
|
let relativeTo = null
|
||
|
|
||
|
root.walkAtRules('config', (rule) => {
|
||
|
relativeTo = rule.source?.input.file ?? result.opts.from ?? null
|
||
|
|
||
|
if (relativeTo === null) {
|
||
|
throw rule.error(
|
||
|
'The `@config` directive cannot be used without setting `from` in your PostCSS config.'
|
||
|
)
|
||
|
}
|
||
|
|
||
|
if (configPath) {
|
||
|
throw rule.error('Only one `@config` directive is allowed per file.')
|
||
|
}
|
||
|
|
||
|
let matches = rule.params.match(/(['"])(.*?)\1/)
|
||
|
if (!matches) {
|
||
|
throw rule.error('A path is required when using the `@config` directive.')
|
||
|
}
|
||
|
|
||
|
let inputPath = matches[2]
|
||
|
if (path.isAbsolute(inputPath)) {
|
||
|
throw rule.error('The `@config` directive cannot be used with an absolute path.')
|
||
|
}
|
||
|
|
||
|
configPath = path.resolve(path.dirname(relativeTo), inputPath)
|
||
|
if (!fs.existsSync(configPath)) {
|
||
|
throw rule.error(
|
||
|
`The config file at "${inputPath}" does not exist. Make sure the path is correct and the file exists.`
|
||
|
)
|
||
|
}
|
||
|
|
||
|
rule.remove()
|
||
|
})
|
||
|
|
||
|
return configPath ? configPath : null
|
||
|
}
|