Refactor configuration schema to use oneOf instead of type:Array for better extensibility.
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-13 15:35:07 -07:00
parent 02a54a2b66
commit 7563a86553
5 changed files with 3780 additions and 2898 deletions

View file

@ -61,13 +61,14 @@ for (const rule of rules) {
"" ""
); );
const ruleData = schema.properties[name]; const ruleData = schema.properties[name];
if (ruleData.properties) { const ruleProperties = ruleData.oneOf.at(-1).properties;
if (ruleProperties) {
section.push( section.push(
"Parameters:", "Parameters:",
"" ""
); );
for (const property of Object.keys(ruleData.properties).toSorted()) { for (const property of Object.keys(ruleProperties).toSorted()) {
const propData = ruleData.properties[property]; const propData = ruleProperties[property];
const propType = [ propData.type ] const propType = [ propData.type ]
.flat() .flat()
.map((type) => ((type === "array") ? `${propData.items.type}[]` : type)) .map((type) => ((type === "array") ? `${propData.items.type}[]` : type))

View file

@ -12,11 +12,12 @@ for (const rule in configSchema.properties) {
const properties = configSchema.properties[rule]; const properties = configSchema.properties[rule];
configExample[rule + "-description"] = properties.description; configExample[rule + "-description"] = properties.description;
configExample[rule] = properties.default; configExample[rule] = properties.default;
if (properties.properties) { const subproperties = properties.oneOf?.at(-1).properties;
if (subproperties) {
const ruleExample = {}; const ruleExample = {};
// eslint-disable-next-line guard-for-in // eslint-disable-next-line guard-for-in
for (const property in properties.properties) { for (const property in subproperties) {
const ruleProperties = properties.properties[property]; const ruleProperties = subproperties[property];
ruleExample[property + "-sub-description"] = ruleProperties.description; ruleExample[property + "-sub-description"] = ruleProperties.description;
ruleExample[property] = ruleProperties.default; ruleExample[property] = ruleProperties.default;
} }

View file

@ -27,7 +27,10 @@ const schema = {
}, },
"default": { "default": {
"description": "Default state for all rules", "description": "Default state for all rules",
"type": "boolean", "oneOf": [
{ "type": "boolean" }
// { "enum": [ "error", "warning" ] }
],
"default": true "default": true
}, },
"extends": { "extends": {
@ -59,13 +62,20 @@ for (const rule of rules) {
const scheme = { const scheme = {
"description": "description":
`${rule.names.join("/")} : ${rule.description} : ${rule.information}`, `${rule.names.join("/")} : ${rule.description} : ${rule.information}`,
"type": "boolean", "oneOf": [
{ "type": "boolean" }
// { "enum": [ "error", "warning" ] }
],
"default": true "default": true
}; };
const subscheme = {
"type": "object",
"additionalProperties": false
};
let custom = true; let custom = true;
switch (ruleName) { switch (ruleName) {
case "MD001": case "MD001":
scheme.properties = { subscheme.properties = {
"front_matter_title": { "front_matter_title": {
"description": "RegExp for matching title in front matter", "description": "RegExp for matching title in front matter",
"type": "string", "type": "string",
@ -74,7 +84,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD003": case "MD003":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "Heading style", "description": "Heading style",
"type": "string", "type": "string",
@ -91,7 +101,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD004": case "MD004":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "List style", "description": "List style",
"type": "string", "type": "string",
@ -107,7 +117,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD007": case "MD007":
scheme.properties = { subscheme.properties = {
"indent": { "indent": {
"description": "Spaces for indent", "description": "Spaces for indent",
"type": "integer", "type": "integer",
@ -129,7 +139,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD009": case "MD009":
scheme.properties = { subscheme.properties = {
"br_spaces": { "br_spaces": {
"description": "Spaces for line break", "description": "Spaces for line break",
"type": "integer", "type": "integer",
@ -149,7 +159,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD010": case "MD010":
scheme.properties = { subscheme.properties = {
"code_blocks": { "code_blocks": {
"description": "Include code blocks", "description": "Include code blocks",
"type": "boolean", "type": "boolean",
@ -172,7 +182,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD012": case "MD012":
scheme.properties = { subscheme.properties = {
"maximum": { "maximum": {
"description": "Consecutive blank lines", "description": "Consecutive blank lines",
"type": "integer", "type": "integer",
@ -182,7 +192,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD013": case "MD013":
scheme.properties = { subscheme.properties = {
"line_length": { "line_length": {
"description": "Number of characters", "description": "Number of characters",
"type": "integer", "type": "integer",
@ -229,7 +239,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD022": case "MD022":
scheme.properties = { subscheme.properties = {
"lines_above": { "lines_above": {
"description": "Blank lines above heading", "description": "Blank lines above heading",
"type": [ "type": [
@ -257,7 +267,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD024": case "MD024":
scheme.properties = { subscheme.properties = {
"siblings_only": { "siblings_only": {
"description": "Only check sibling headings", "description": "Only check sibling headings",
"type": "boolean", "type": "boolean",
@ -267,7 +277,7 @@ for (const rule of rules) {
break; break;
case "MD026": case "MD026":
case "MD036": case "MD036":
scheme.properties = { subscheme.properties = {
"punctuation": { "punctuation": {
"description": "Punctuation characters", "description": "Punctuation characters",
"type": "string", "type": "string",
@ -276,7 +286,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD027": case "MD027":
scheme.properties = { subscheme.properties = {
"list_items": { "list_items": {
"description": "Include list items", "description": "Include list items",
"type": "boolean", "type": "boolean",
@ -285,7 +295,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD029": case "MD029":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "List style", "description": "List style",
"type": "string", "type": "string",
@ -300,7 +310,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD030": case "MD030":
scheme.properties = { subscheme.properties = {
"ul_single": { "ul_single": {
"description": "Spaces for single-line unordered list items", "description": "Spaces for single-line unordered list items",
"type": "integer", "type": "integer",
@ -328,7 +338,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD031": case "MD031":
scheme.properties = { subscheme.properties = {
"list_items": { "list_items": {
"description": "Include list items", "description": "Include list items",
"type": "boolean", "type": "boolean",
@ -337,7 +347,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD033": case "MD033":
scheme.properties = { subscheme.properties = {
"allowed_elements": { "allowed_elements": {
"description": "Allowed elements", "description": "Allowed elements",
"type": "array", "type": "array",
@ -357,7 +367,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD035": case "MD035":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "Horizontal rule style", "description": "Horizontal rule style",
"type": "string", "type": "string",
@ -366,7 +376,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD040": case "MD040":
scheme.properties = { subscheme.properties = {
"allowed_languages": { "allowed_languages": {
"description": "List of languages", "description": "List of languages",
"type": "array", "type": "array",
@ -394,7 +404,7 @@ for (const rule of rules) {
} }
} : } :
{}; {};
scheme.properties = { subscheme.properties = {
...md041Properties, ...md041Properties,
"front_matter_title": { "front_matter_title": {
"description": "RegExp for matching title in front matter", "description": "RegExp for matching title in front matter",
@ -412,7 +422,7 @@ for (const rule of rules) {
} }
break; break;
case "MD043": case "MD043":
scheme.properties = { subscheme.properties = {
"headings": { "headings": {
"description": "List of headings", "description": "List of headings",
"type": "array", "type": "array",
@ -430,7 +440,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD044": case "MD044":
scheme.properties = { subscheme.properties = {
"names": { "names": {
"description": "List of proper names", "description": "List of proper names",
"type": "array", "type": "array",
@ -452,7 +462,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD046": case "MD046":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "Block style", "description": "Block style",
"type": "string", "type": "string",
@ -466,7 +476,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD048": case "MD048":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "Code fence style", "description": "Code fence style",
"type": "string", "type": "string",
@ -481,7 +491,7 @@ for (const rule of rules) {
break; break;
case "MD049": case "MD049":
case "MD050": case "MD050":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": (ruleName === "MD049") ? "Emphasis style" : "Strong style", "description": (ruleName === "MD049") ? "Emphasis style" : "Strong style",
"type": "string", "type": "string",
@ -495,7 +505,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD051": case "MD051":
scheme.properties = { subscheme.properties = {
"ignore_case": { "ignore_case": {
"description": "Ignore case of fragments", "description": "Ignore case of fragments",
"type": "boolean", "type": "boolean",
@ -509,7 +519,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD052": case "MD052":
scheme.properties = { subscheme.properties = {
"ignored_labels": { "ignored_labels": {
"description": "Ignored link labels", "description": "Ignored link labels",
"type": "array", "type": "array",
@ -526,7 +536,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD053": case "MD053":
scheme.properties = { subscheme.properties = {
"ignored_definitions": { "ignored_definitions": {
"description": "Ignored definitions", "description": "Ignored definitions",
"type": "array", "type": "array",
@ -538,7 +548,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD054": case "MD054":
scheme.properties = { subscheme.properties = {
"autolink": { "autolink": {
"description": "Allow autolinks", "description": "Allow autolinks",
"type": "boolean", "type": "boolean",
@ -572,7 +582,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD055": case "MD055":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "Table pipe style", "description": "Table pipe style",
"type": "string", "type": "string",
@ -588,7 +598,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD059": case "MD059":
scheme.properties = { subscheme.properties = {
"prohibited_texts": { "prohibited_texts": {
"description": "Prohibited link texts", "description": "Prohibited link texts",
"type": "array", "type": "array",
@ -605,7 +615,7 @@ for (const rule of rules) {
}; };
break; break;
case "MD060": case "MD060":
scheme.properties = { subscheme.properties = {
"style": { "style": {
"description": "Table column style", "description": "Table column style",
"type": "string", "type": "string",
@ -624,9 +634,7 @@ for (const rule of rules) {
break; break;
} }
if (custom) { if (custom) {
// @ts-ignore scheme.oneOf.push(subscheme);
scheme.type = [ "boolean", "object" ];
scheme.additionalProperties = false;
} }
for (const name of rule.names) { for (const name of rule.names) {
schema.properties[name] = scheme; schema.properties[name] = scheme;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff