wip
Some checks are pending
Checkers / linkcheck (push) Waiting to run
Checkers / spellcheck (push) Waiting to run
CI / build (20, macos-latest) (push) Waiting to run
CI / build (20, ubuntu-latest) (push) Waiting to run
CI / build (20, windows-latest) (push) Waiting to run
CI / build (22, macos-latest) (push) Waiting to run
CI / build (22, ubuntu-latest) (push) Waiting to run
CI / build (22, windows-latest) (push) Waiting to run
CI / build (24, macos-latest) (push) Waiting to run
CI / build (24, ubuntu-latest) (push) Waiting to run
CI / build (24, windows-latest) (push) Waiting to run
CI / pnpm (push) Waiting to run
CodeQL / Analyze (push) Waiting to run
TestRepos / build (latest, ubuntu-latest) (push) Waiting to run
UpdateTestRepos / update (push) Waiting to run

This commit is contained in:
David Anson 2025-09-19 22:03:06 -07:00
parent 05509da984
commit 8021c087d4
7 changed files with 1507 additions and 753 deletions

File diff suppressed because it is too large Load diff

View file

@ -82,6 +82,19 @@ export function applyFixes(input: string, errors: LintError[]): string;
* @returns {string} SemVer string.
*/
export function getVersion(): string;
/**
* Result object for getEffectiveConfig.
*/
export type GetEffectiveConfigResult = {
/**
* Effective configuration.
*/
effectiveConfig: Configuration;
/**
* Rule severities
*/
ruleSeverities: Map<string, "error" | "warning" | "off">;
};
/**
* Result object for getEnabledRulesPerLineNumber.
*/

View file

@ -236,25 +236,41 @@ function mapAliasToRuleNames(ruleList) {
return aliasToRuleNames;
}
/**
* Result object for getEffectiveConfig.
*
* @typedef {Object} GetEffectiveConfigResult
* @property {Configuration} effectiveConfig Effective configuration.
* @property {Map<string, "error" | "warning" | "off">} ruleSeverities Rule severities
*/
/**
* Apply (and normalize) configuration object.
*
* @param {Rule[]} ruleList List of rules.
* @param {Configuration} config Configuration object.
* @param {Object.<string, string[]>} aliasToRuleNames Map of alias to rule
* names.
* @returns {Configuration} Effective configuration.
* @param {Object.<string, string[]>} aliasToRuleNames Map of alias to rule names.
* @returns {GetEffectiveConfigResult} Effective configuration and rule severities.
*/
function getEffectiveConfig(ruleList, config, aliasToRuleNames) {
const defaultKey = Object.keys(config).filter(
(key) => key.toUpperCase() === "DEFAULT"
);
const ruleDefault = (defaultKey.length === 0) || !!config[defaultKey[0]];
let ruleDefaultEnable = true;
let ruleDefaultSeverity = "error";
Object.entries(config).every(([ key, value ]) => {
if (key.toUpperCase() === "DEFAULT") {
ruleDefaultEnable = !!value;
if (value === "warning") {
ruleDefaultSeverity = "warning";
}
return false;
}
return true;
});
/** @type {Configuration} */
const effectiveConfig = {};
for (const rule of ruleList) {
const ruleName = rule.names[0].toUpperCase();
effectiveConfig[ruleName] = ruleDefault;
const ruleSeverities = new Map();
for (const ruleName of ruleList.map((rule) => rule.names[0].toUpperCase())) {
effectiveConfig[ruleName] = ruleDefaultEnable;
ruleSeverities.set(ruleName, ruleDefaultSeverity);
}
// for (const ruleName of deprecatedRuleNames) {
// effectiveConfig[ruleName] = false;
@ -262,18 +278,33 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) {
for (const key of Object.keys(config)) {
let value = config[key];
if (value) {
value = (value instanceof Object) ?
Object.fromEntries(Object.entries(value).filter(([ k ]) => k !== "severity")) :
{};
if (value instanceof Object) {
// @ts-ignore
const severity = value.severity;
if (severity === "off") {
value = false;
} else {
if (severity === "warning") {
ruleSeverities.set(key.toUpperCase(), "warning");
} else {
ruleSeverities.set(key.toUpperCase(), "error");
}
value = Object.fromEntries(Object.entries(value).filter(([ k ]) => k !== "severity"));
}
} else {
value = {};
}
} else {
value = false;
}
const keyUpper = key.toUpperCase();
for (const ruleName of (aliasToRuleNames[keyUpper] || [])) {
for (const ruleName of (aliasToRuleNames[key.toUpperCase()] || [])) {
effectiveConfig[ruleName] = value;
}
}
return effectiveConfig;
return {
effectiveConfig,
ruleSeverities
};
}
/**
@ -397,8 +428,7 @@ function getEnabledRulesPerLineNumber(
}
// Handle inline comments
handleInlineConfig([ lines.join("\n") ], configureFile);
const effectiveConfig = getEffectiveConfig(
ruleList, config, aliasToRuleNames);
const { effectiveConfig } = getEffectiveConfig(ruleList, config, aliasToRuleNames);
for (const rule of ruleList) {
const ruleName = rule.names[0].toUpperCase();
allRuleNames.push(ruleName);