stylelint
Version:
A mighty CSS linter that helps you avoid errors and enforce conventions.
138 lines (114 loc) • 4.24 kB
JavaScript
// NOTICE: This file is generated by Rollup. To modify it,
// please instead edit the ESM counterpart and rebuild with Rollup (npm run build).
'use strict';
const path = require('node:path');
const postcss = require('postcss');
const descriptionlessDisables = require('./descriptionlessDisables.cjs');
const getConfigForFile = require('./getConfigForFile.cjs');
const getPostcssResult = require('./getPostcssResult.cjs');
const invalidScopeDisables = require('./invalidScopeDisables.cjs');
const isPathIgnored = require('./isPathIgnored.cjs');
const isPathNotFoundError = require('./utils/isPathNotFoundError.cjs');
const lintPostcssResult = require('./lintPostcssResult.cjs');
const needlessDisables = require('./needlessDisables.cjs');
const reportDisables = require('./reportDisables.cjs');
const unscopedDisables = require('./unscopedDisables.cjs');
/** @import {Result} from 'postcss' */
/** @import {GetLintSourceOptions as Options, InternalApi as StylelintInternalApi, PostcssResult, StylelintPostcssResult} from 'stylelint' */
/**
* Run stylelint on a PostCSS Result, either one that is provided
* or one that we create
* @param {StylelintInternalApi} stylelint
* @param {Options} options
* @returns {Promise<PostcssResult>}
*/
async function lintSource(stylelint, options = {}) {
if (!options.filePath && options.code === undefined && !options.existingPostcssResult) {
return Promise.reject(new Error('You must provide filePath, code, or existingPostcssResult'));
}
const isCodeNotFile = options.code !== undefined;
const inputFilePath = isCodeNotFile ? options.codeFilename : options.filePath;
if (inputFilePath !== undefined && !path.isAbsolute(inputFilePath)) {
if (isCodeNotFile) {
return Promise.reject(new Error('codeFilename must be an absolute path'));
}
return Promise.reject(new Error('filePath must be an absolute path'));
}
const isIgnored = await isPathIgnored(stylelint, inputFilePath).catch((err) => {
if (isCodeNotFile && isPathNotFoundError(err)) return false;
throw err;
});
if (isIgnored) {
return createEmptyPostcssResult(inputFilePath, options.existingPostcssResult);
}
const configForFile = await getConfigForFile({
stylelint,
searchPath: inputFilePath,
filePath: inputFilePath,
});
if (!configForFile) {
return Promise.reject(new Error('Config file not found'));
}
const config = configForFile.config;
const existingPostcssResult = options.existingPostcssResult;
if (options.cache) {
stylelint._fileCache.calcHashOfConfig(config);
if (options.filePath && !stylelint._fileCache.hasFileChanged(options.filePath)) {
return createEmptyPostcssResult(inputFilePath, existingPostcssResult);
}
}
const postcssResult =
existingPostcssResult ||
(await getPostcssResult(stylelint, {
code: options.code,
codeFilename: options.codeFilename,
filePath: inputFilePath,
customSyntax: config.customSyntax,
}));
const stylelintPostcssResult = Object.assign(postcssResult, {
stylelint: {
ruleSeverities: {},
customMessages: {},
customUrls: {},
ruleMetadata: {},
fixersData: {},
rangesOfComputedEditInfos: [],
disabledRanges: {},
},
});
await lintPostcssResult(stylelint._options, stylelintPostcssResult, config);
reportDisables(stylelintPostcssResult);
needlessDisables(stylelintPostcssResult);
invalidScopeDisables(stylelintPostcssResult);
descriptionlessDisables(stylelintPostcssResult);
unscopedDisables(stylelintPostcssResult);
return stylelintPostcssResult;
}
/**
* @returns {StylelintPostcssResult}
*/
function createEmptyStylelintPostcssResult() {
return {
ruleSeverities: {},
customMessages: {},
customUrls: {},
ruleMetadata: {},
fixersData: {},
rangesOfComputedEditInfos: [],
disabledRanges: {},
ignored: true,
stylelintError: false,
stylelintWarning: false,
};
}
/**
* @param {string | undefined} filePath
* @param {Options['existingPostcssResult']} existingPostcssResult
* @returns {PostcssResult}
*/
function createEmptyPostcssResult(filePath, existingPostcssResult) {
return Object.assign(existingPostcssResult ?? postcss().process('', { from: filePath }).sync(), {
stylelint: createEmptyStylelintPostcssResult(),
});
}
module.exports = lintSource;