Spaces:
Sleeping
Sleeping
| 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 | |
| } | |