This commit is contained in:
David Anson 2025-09-20 22:19:47 -07:00
parent 996c0f6b27
commit b3564ea841
12 changed files with 1606 additions and 64 deletions

View file

@ -1865,97 +1865,289 @@ export interface ConfigurationStrict {
/**
* headings : MD001, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043
*/
headings?: boolean | ("error" | "warning");
headings?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* bullet : MD004, MD005, MD007, MD032
*/
bullet?: boolean | ("error" | "warning");
bullet?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* ul : MD004, MD005, MD007, MD030, MD032
*/
ul?: boolean | ("error" | "warning");
ul?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* indentation : MD005, MD007, MD027
*/
indentation?: boolean | ("error" | "warning");
indentation?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* whitespace : MD009, MD010, MD012, MD027, MD028, MD030, MD037, MD038, MD039
*/
whitespace?: boolean | ("error" | "warning");
whitespace?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* hard_tab : MD010
*/
hard_tab?: boolean | ("error" | "warning");
hard_tab?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* links : MD011, MD034, MD039, MD042, MD051, MD052, MD053, MD054, MD059
*/
links?: boolean | ("error" | "warning");
links?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* blank_lines : MD012, MD022, MD031, MD032, MD047
*/
blank_lines?: boolean | ("error" | "warning");
blank_lines?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* line_length : MD013
*/
line_length?: boolean | ("error" | "warning");
line_length?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* code : MD014, MD031, MD038, MD040, MD046, MD048
*/
code?: boolean | ("error" | "warning");
code?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* atx : MD018, MD019
*/
atx?: boolean | ("error" | "warning");
atx?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* spaces : MD018, MD019, MD020, MD021, MD023
*/
spaces?: boolean | ("error" | "warning");
spaces?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* atx_closed : MD020, MD021
*/
atx_closed?: boolean | ("error" | "warning");
atx_closed?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* blockquote : MD027, MD028
*/
blockquote?: boolean | ("error" | "warning");
blockquote?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* ol : MD029, MD030, MD032
*/
ol?: boolean | ("error" | "warning");
ol?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* html : MD033
*/
html?: boolean | ("error" | "warning");
html?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* url : MD034
*/
url?: boolean | ("error" | "warning");
url?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* hr : MD035
*/
hr?: boolean | ("error" | "warning");
hr?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* emphasis : MD036, MD037, MD049, MD050
*/
emphasis?: boolean | ("error" | "warning");
emphasis?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* language : MD040
*/
language?: boolean | ("error" | "warning");
language?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* spelling : MD044
*/
spelling?: boolean | ("error" | "warning");
spelling?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* accessibility : MD045, MD059
*/
accessibility?: boolean | ("error" | "warning");
accessibility?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* images : MD045, MD052, MD053, MD054
*/
images?: boolean | ("error" | "warning");
images?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
/**
* table : MD055, MD056, MD058, MD060
*/
table?: boolean | ("error" | "warning");
table?:
| boolean
| ("error" | "warning")
| {
/**
* Tag severity
*/
severity?: "error" | "warning" | "off";
};
}

View file

@ -111,6 +111,10 @@ export type EnabledRulesPerLineNumberResult = {
* Enabled rule list.
*/
enabledRuleList: Rule[];
/**
* Rule severities
*/
ruleSeverities: Map<string, "error" | "warning" | "off">;
};
/**
* Function to implement rule logic.

View file

@ -276,6 +276,7 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) {
// effectiveConfig[ruleName] = false;
// }
for (const key of Object.keys(config)) {
const keyUpper = key.toUpperCase();
let value = config[key];
if (value) {
if (value instanceof Object) {
@ -284,20 +285,27 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) {
if (severity === "off") {
value = false;
} else {
if (severity === "warning") {
ruleSeverities.set(key.toUpperCase(), "warning");
} else {
ruleSeverities.set(key.toUpperCase(), "error");
for (const ruleName of (aliasToRuleNames[keyUpper] || [])) {
if (severity === "warning") {
ruleSeverities.set(ruleName, "warning");
} else {
ruleSeverities.set(ruleName, "error");
}
}
value = Object.fromEntries(Object.entries(value).filter(([ k ]) => k !== "severity"));
}
} else {
if (value === "warning") {
for (const ruleName of (aliasToRuleNames[keyUpper] || [])) {
ruleSeverities.set(ruleName, "warning");
}
}
value = {};
}
} else {
value = false;
}
for (const ruleName of (aliasToRuleNames[key.toUpperCase()] || [])) {
for (const ruleName of (aliasToRuleNames[keyUpper] || [])) {
effectiveConfig[ruleName] = value;
}
}
@ -314,6 +322,7 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) {
* @property {Configuration} effectiveConfig Effective configuration.
* @property {any[]} enabledRulesPerLineNumber Enabled rules per line number.
* @property {Rule[]} enabledRuleList Enabled rule list.
* @property {Map<string, "error" | "warning" | "off">} ruleSeverities Rule severities
*/
/**
@ -428,7 +437,7 @@ function getEnabledRulesPerLineNumber(
}
// Handle inline comments
handleInlineConfig([ lines.join("\n") ], configureFile);
const { effectiveConfig } = getEffectiveConfig(ruleList, config, aliasToRuleNames);
const { effectiveConfig, ruleSeverities } = getEffectiveConfig(ruleList, config, aliasToRuleNames);
for (const rule of ruleList) {
const ruleName = rule.names[0].toUpperCase();
allRuleNames.push(ruleName);
@ -449,7 +458,8 @@ function getEnabledRulesPerLineNumber(
return {
effectiveConfig,
enabledRulesPerLineNumber,
enabledRuleList
enabledRuleList,
ruleSeverities
};
}
@ -494,7 +504,7 @@ function lintContent(
const { frontMatterLines } = removeFrontMatterResult;
content = removeFrontMatterResult.content;
// Get enabled rules per line (with HTML comments present)
const { effectiveConfig, enabledRulesPerLineNumber, enabledRuleList } =
const { effectiveConfig, enabledRulesPerLineNumber, enabledRuleList, ruleSeverities } =
getEnabledRulesPerLineNumber(
ruleList,
content.split(helpers.newLineRe),
@ -668,7 +678,8 @@ function lintContent(
"errorContext": errorInfo.context?.replace(helpers.newLineRe, " ") || null,
"errorRange": errorInfo.range ? [ ...errorInfo.range ] : null,
"fixInfo": fixInfo ? cleanFixInfo : null,
"severity": "error"
// @ts-ignore
"severity": ruleSeverities.get(ruleName)
});
}
// Call (possibly external) rule function to report errors