stylelint
Version:
A mighty CSS linter that helps you avoid errors and enforce conventions.
66 lines (49 loc) • 1.69 kB
JavaScript
import { readFile } from 'node:fs/promises';
import postcss from 'postcss';
import normalizeFilePath from './utils/normalizeFilePath.mjs';
import normalizeFixMode from './utils/normalizeFixMode.mjs';
/** @import {Result, Syntax} from 'postcss' */
/** @import {GetPostcssOptions, InternalApi as StylelintInternalApi} from 'stylelint' */
const postcssProcessor = postcss();
/**
* @param {StylelintInternalApi} stylelint
* @param {GetPostcssOptions} options
*
* @returns {Promise<Result>}
*/
export default async function getPostcssResult(stylelint, { customSyntax, filePath, code } = {}) {
const normalizedPath = filePath ? normalizeFilePath(filePath) : undefined;
const cached = normalizedPath ? stylelint._postcssResultCache.get(normalizedPath) : undefined;
if (cached) {
return cached;
}
const fix = normalizeFixMode(stylelint._options.fix);
const syntax = customSyntax ?? (await cssSyntax(fix === 'lax'));
const postcssOptions = {
from: filePath,
syntax,
};
/** @type {string | undefined} */
let getCode;
if (code !== undefined) {
getCode = code;
} else if (filePath) {
getCode = await readFile(filePath, 'utf8');
}
if (getCode === undefined) {
throw new Error('code or filePath required');
}
const postcssResult = await postcssProcessor.process(getCode, postcssOptions).async();
if (normalizedPath) {
stylelint._postcssResultCache.set(normalizedPath, postcssResult);
}
return postcssResult;
}
/**
* @param {boolean} fix
* @returns {Promise<Syntax>}
*/
async function cssSyntax(fix) {
const parse = await (fix ? import('postcss-safe-parser').then((m) => m.default) : postcss.parse);
return { parse, stringify: postcss.stringify };
}