@contextlint/core 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/parser.d.ts +18 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +37 -5
- package/dist/parser.js.map +1 -1
- package/dist/registry.d.ts +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +11 -0
- package/dist/registry.js.map +1 -1
- package/dist/rules/chk-001.d.ts +7 -0
- package/dist/rules/chk-001.d.ts.map +1 -0
- package/dist/rules/chk-001.js +32 -0
- package/dist/rules/chk-001.js.map +1 -0
- package/dist/rules/ref-005.d.ts +6 -0
- package/dist/rules/ref-005.d.ts.map +1 -0
- package/dist/rules/ref-005.js +79 -0
- package/dist/rules/ref-005.js.map +1 -0
- package/dist/rules/ref-006.d.ts +6 -0
- package/dist/rules/ref-006.d.ts.map +1 -0
- package/dist/rules/ref-006.js +35 -0
- package/dist/rules/ref-006.js.map +1 -0
- package/dist/rules/sec-002.d.ts +9 -0
- package/dist/rules/sec-002.d.ts.map +1 -0
- package/dist/rules/sec-002.js +73 -0
- package/dist/rules/sec-002.js.map +1 -0
- package/dist/rules/tbl-005.d.ts +22 -0
- package/dist/rules/tbl-005.d.ts.map +1 -0
- package/dist/rules/tbl-005.js +99 -0
- package/dist/rules/tbl-005.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { parseDocument } from "./parser.js";
|
|
2
|
-
export type { ParsedLink, ParsedTable, ParsedDocument } from "./parser.js";
|
|
2
|
+
export type { ParsedCheckItem, ParsedHeading, ParsedImage, ParsedLink, ParsedTable, ParsedDocument, } from "./parser.js";
|
|
3
3
|
export { runRules } from "./rule.js";
|
|
4
4
|
export type { Severity, LintMessage, RuleContext, Rule, RunOptions, } from "./rule.js";
|
|
5
5
|
export { tbl001 } from "./rules/tbl-001.js";
|
|
@@ -12,8 +12,12 @@ export { str001 } from "./rules/str-001.js";
|
|
|
12
12
|
export type { Str001Options } from "./rules/str-001.js";
|
|
13
13
|
export { sec001 } from "./rules/sec-001.js";
|
|
14
14
|
export type { Sec001Options } from "./rules/sec-001.js";
|
|
15
|
+
export { sec002 } from "./rules/sec-002.js";
|
|
16
|
+
export type { Sec002Options } from "./rules/sec-002.js";
|
|
15
17
|
export { tbl004 } from "./rules/tbl-004.js";
|
|
16
18
|
export type { Tbl004Options } from "./rules/tbl-004.js";
|
|
19
|
+
export { tbl005 } from "./rules/tbl-005.js";
|
|
20
|
+
export type { Tbl005Options, Tbl005Condition, Tbl005Constraint, } from "./rules/tbl-005.js";
|
|
17
21
|
export { tbl006 } from "./rules/tbl-006.js";
|
|
18
22
|
export type { Tbl006Options } from "./rules/tbl-006.js";
|
|
19
23
|
export { ref001 } from "./rules/ref-001.js";
|
|
@@ -23,5 +27,11 @@ export { ref003 } from "./rules/ref-003.js";
|
|
|
23
27
|
export type { Ref003Options } from "./rules/ref-003.js";
|
|
24
28
|
export { ref004 } from "./rules/ref-004.js";
|
|
25
29
|
export type { Ref004Options } from "./rules/ref-004.js";
|
|
26
|
-
export {
|
|
30
|
+
export { ref005 } from "./rules/ref-005.js";
|
|
31
|
+
export type { Ref005Options } from "./rules/ref-005.js";
|
|
32
|
+
export { ref006 } from "./rules/ref-006.js";
|
|
33
|
+
export type { Ref006Options } from "./rules/ref-006.js";
|
|
34
|
+
export { chk001 } from "./rules/chk-001.js";
|
|
35
|
+
export type { Chk001Options } from "./rules/chk-001.js";
|
|
36
|
+
export { resolveRule, ruleNames } from "./registry.js";
|
|
27
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,YAAY,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,IAAI,EACJ,UAAU,GACX,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,11 +5,16 @@ export { tbl002 } from "./rules/tbl-002.js";
|
|
|
5
5
|
export { tbl003 } from "./rules/tbl-003.js";
|
|
6
6
|
export { str001 } from "./rules/str-001.js";
|
|
7
7
|
export { sec001 } from "./rules/sec-001.js";
|
|
8
|
+
export { sec002 } from "./rules/sec-002.js";
|
|
8
9
|
export { tbl004 } from "./rules/tbl-004.js";
|
|
10
|
+
export { tbl005 } from "./rules/tbl-005.js";
|
|
9
11
|
export { tbl006 } from "./rules/tbl-006.js";
|
|
10
12
|
export { ref001 } from "./rules/ref-001.js";
|
|
11
13
|
export { ref002 } from "./rules/ref-002.js";
|
|
12
14
|
export { ref003 } from "./rules/ref-003.js";
|
|
13
15
|
export { ref004 } from "./rules/ref-004.js";
|
|
14
|
-
export {
|
|
16
|
+
export { ref005 } from "./rules/ref-005.js";
|
|
17
|
+
export { ref006 } from "./rules/ref-006.js";
|
|
18
|
+
export { chk001 } from "./rules/chk-001.js";
|
|
19
|
+
export { resolveRule, ruleNames } from "./registry.js";
|
|
15
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AASrC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/parser.d.ts
CHANGED
|
@@ -8,10 +8,28 @@ export interface ParsedLink {
|
|
|
8
8
|
url: string;
|
|
9
9
|
line: number;
|
|
10
10
|
}
|
|
11
|
+
export interface ParsedHeading {
|
|
12
|
+
text: string;
|
|
13
|
+
level: number;
|
|
14
|
+
line: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ParsedCheckItem {
|
|
17
|
+
text: string;
|
|
18
|
+
checked: boolean;
|
|
19
|
+
line: number;
|
|
20
|
+
section: string | null;
|
|
21
|
+
}
|
|
22
|
+
export interface ParsedImage {
|
|
23
|
+
url: string;
|
|
24
|
+
line: number;
|
|
25
|
+
}
|
|
11
26
|
export interface ParsedDocument {
|
|
12
27
|
tables: ParsedTable[];
|
|
28
|
+
headings: ParsedHeading[];
|
|
13
29
|
sections: string[];
|
|
14
30
|
links: ParsedLink[];
|
|
31
|
+
images: ParsedImage[];
|
|
32
|
+
checkItems: ParsedCheckItem[];
|
|
15
33
|
content: string;
|
|
16
34
|
}
|
|
17
35
|
export declare function parseDocument(content: string): ParsedDocument;
|
package/dist/parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAgBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAoG7D"}
|
package/dist/parser.js
CHANGED
|
@@ -19,9 +19,12 @@ export function parseDocument(content) {
|
|
|
19
19
|
const headings = [];
|
|
20
20
|
const tables = [];
|
|
21
21
|
const links = [];
|
|
22
|
+
const images = [];
|
|
23
|
+
const checkItems = [];
|
|
22
24
|
visit(tree, "heading", (node) => {
|
|
23
25
|
headings.push({
|
|
24
26
|
text: extractText(node),
|
|
27
|
+
level: node.depth,
|
|
25
28
|
line: node.position?.start.line ?? 0,
|
|
26
29
|
});
|
|
27
30
|
});
|
|
@@ -49,23 +52,52 @@ export function parseDocument(content) {
|
|
|
49
52
|
}
|
|
50
53
|
tables.push({ line: tableLine, section, headers, rows });
|
|
51
54
|
});
|
|
52
|
-
// Collect
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
// Collect checklist items (listItem nodes with checked property from remark-gfm)
|
|
56
|
+
visit(tree, "listItem", (node) => {
|
|
57
|
+
if (node.checked === null || node.checked === undefined) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const itemLine = node.position?.start.line ?? 0;
|
|
61
|
+
let section = null;
|
|
62
|
+
for (let i = headings.length - 1; i >= 0; i--) {
|
|
63
|
+
if (headings[i].line < itemLine) {
|
|
64
|
+
section = headings[i].text;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
checkItems.push({
|
|
69
|
+
text: extractText(node).trim(),
|
|
70
|
+
checked: node.checked,
|
|
71
|
+
line: itemLine,
|
|
72
|
+
section,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// Collect relative links (inline and reference-style), including anchor-only links
|
|
76
|
+
// Skip absolute URLs and non-file URI schemes (mailto:, tel:, data:, etc.)
|
|
77
|
+
const isRelativeLink = (url) => !/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(url);
|
|
55
78
|
visit(tree, "link", (node) => {
|
|
56
|
-
if (
|
|
79
|
+
if (isRelativeLink(node.url)) {
|
|
57
80
|
links.push({ url: node.url, line: node.position?.start.line ?? 0 });
|
|
58
81
|
}
|
|
59
82
|
});
|
|
60
83
|
visit(tree, "definition", (node) => {
|
|
61
|
-
if (
|
|
84
|
+
if (isRelativeLink(node.url)) {
|
|
62
85
|
links.push({ url: node.url, line: node.position?.start.line ?? 0 });
|
|
63
86
|
}
|
|
64
87
|
});
|
|
88
|
+
// Collect relative image references
|
|
89
|
+
visit(tree, "image", (node) => {
|
|
90
|
+
if (isRelativeLink(node.url)) {
|
|
91
|
+
images.push({ url: node.url, line: node.position?.start.line ?? 0 });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
65
94
|
return {
|
|
66
95
|
tables,
|
|
96
|
+
headings,
|
|
67
97
|
sections: headings.map((h) => h.text),
|
|
68
98
|
links,
|
|
99
|
+
images,
|
|
100
|
+
checkItems,
|
|
69
101
|
content,
|
|
70
102
|
};
|
|
71
103
|
}
|
package/dist/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts
CHANGED
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgGtC,eAAO,MAAM,SAAS,UAAwB,CAAC;AAE/C,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAMN"}
|
package/dist/registry.js
CHANGED
|
@@ -8,7 +8,12 @@ import { tbl006 } from "./rules/tbl-006.js";
|
|
|
8
8
|
import { ref002 } from "./rules/ref-002.js";
|
|
9
9
|
import { ref003 } from "./rules/ref-003.js";
|
|
10
10
|
import { ref001 } from "./rules/ref-001.js";
|
|
11
|
+
import { tbl005 } from "./rules/tbl-005.js";
|
|
11
12
|
import { ref004 } from "./rules/ref-004.js";
|
|
13
|
+
import { ref005 } from "./rules/ref-005.js";
|
|
14
|
+
import { sec002 } from "./rules/sec-002.js";
|
|
15
|
+
import { chk001 } from "./rules/chk-001.js";
|
|
16
|
+
import { ref006 } from "./rules/ref-006.js";
|
|
12
17
|
const registry = {
|
|
13
18
|
tbl001: (options) => tbl001(options),
|
|
14
19
|
tbl002: (options) => tbl002(options),
|
|
@@ -16,12 +21,18 @@ const registry = {
|
|
|
16
21
|
tbl004: (options) => tbl004(options),
|
|
17
22
|
str001: (options) => str001(options),
|
|
18
23
|
sec001: (options) => sec001(options),
|
|
24
|
+
tbl005: (options) => tbl005(options),
|
|
19
25
|
tbl006: (options) => tbl006(options),
|
|
20
26
|
ref002: (options) => ref002(options),
|
|
21
27
|
ref001: (options) => ref001(options),
|
|
22
28
|
ref004: (options) => ref004(options),
|
|
23
29
|
ref003: (options) => ref003(options),
|
|
30
|
+
ref005: (options) => ref005(options),
|
|
31
|
+
sec002: (options) => sec002(options),
|
|
32
|
+
chk001: (options) => chk001(options),
|
|
33
|
+
ref006: (options) => ref006(options),
|
|
24
34
|
};
|
|
35
|
+
export const ruleNames = Object.keys(registry);
|
|
25
36
|
export function resolveRule(name, options) {
|
|
26
37
|
const factory = registry[name];
|
|
27
38
|
if (!factory) {
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,MAAM,QAAQ,GAAgC;IAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAA0E,CAAC;IACpF,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAA6D,CAAC;IACvE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAA+D,CAAC;IACzE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAA8D,CAAC;IACxE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAA8B,CAAC;IACxC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAAiD,CAAC;IAC3D,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAAgE,CAAC;IAC1E,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CACJ,OAKC,CACF;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,OAA6C,CAAC;IACvD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CACJ,OAGC,CACF;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CACJ,OAOC,CACF;CACJ,CAAC;AAEF,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,OAAiC;IAEjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chk-001.d.ts","sourceRoot":"","sources":["../../src/rules/chk-001.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAiCpD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import picomatch from "picomatch";
|
|
2
|
+
export function chk001(options) {
|
|
3
|
+
const fileMatcher = options?.files
|
|
4
|
+
? picomatch(options.files)
|
|
5
|
+
: undefined;
|
|
6
|
+
return {
|
|
7
|
+
id: "CHK-001",
|
|
8
|
+
description: "All checklist items in the specified section must be checked",
|
|
9
|
+
severity: "warning",
|
|
10
|
+
check: (context) => {
|
|
11
|
+
if (fileMatcher && !fileMatcher(context.filePath)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const item of context.document.checkItems) {
|
|
15
|
+
if (options?.section !== undefined && item.section !== options.section) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (!item.checked) {
|
|
19
|
+
const location = item.section
|
|
20
|
+
? ` in section "${item.section}"`
|
|
21
|
+
: "";
|
|
22
|
+
context.report({
|
|
23
|
+
severity: "warning",
|
|
24
|
+
message: `Unchecked item "${item.text}"${location}`,
|
|
25
|
+
line: item.line,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=chk-001.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chk-001.js","sourceRoot":"","sources":["../../src/rules/chk-001.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAQlC,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,MAAM,WAAW,GAAG,OAAO,EAAE,KAAK;QAChC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;QAC1B,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,EAAE,EAAE,SAAS;QACb,WAAW,EACT,8DAA8D;QAChE,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YACjB,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC/C,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;oBACvE,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO;wBAC3B,CAAC,CAAC,gBAAgB,IAAI,CAAC,OAAO,GAAG;wBACjC,CAAC,CAAC,EAAE,CAAC;oBACP,OAAO,CAAC,MAAM,CAAC;wBACb,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,mBAAmB,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE;wBACnD,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-005.d.ts","sourceRoot":"","sources":["../../src/rules/ref-005.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BD,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAwDpD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { resolve, dirname } from "node:path";
|
|
2
|
+
import picomatch from "picomatch";
|
|
3
|
+
/**
|
|
4
|
+
* Generate GitHub-style anchor slugs from heading texts.
|
|
5
|
+
* Follows the same algorithm as GitHub:
|
|
6
|
+
* - Lowercase
|
|
7
|
+
* - Remove combining diacritical marks
|
|
8
|
+
* - Keep letters, marks, numbers, connector punctuations, spaces, hyphens
|
|
9
|
+
* - Spaces → hyphens
|
|
10
|
+
* - Duplicate headings get suffixed: #foo, #foo-1, #foo-2
|
|
11
|
+
*/
|
|
12
|
+
function generateAnchors(sections) {
|
|
13
|
+
const anchors = new Set();
|
|
14
|
+
const counts = new Map();
|
|
15
|
+
for (const heading of sections) {
|
|
16
|
+
const base = heading
|
|
17
|
+
.toLowerCase()
|
|
18
|
+
.replace(/[\u0300-\u036F]/g, "")
|
|
19
|
+
.replace(/[^\p{L}\p{M}\p{N}\p{Pc} -]/gu, "")
|
|
20
|
+
.replace(/ /g, "-");
|
|
21
|
+
const count = counts.get(base) ?? 0;
|
|
22
|
+
const anchor = count === 0 ? base : `${base}-${count}`;
|
|
23
|
+
anchors.add(anchor);
|
|
24
|
+
counts.set(base, count + 1);
|
|
25
|
+
}
|
|
26
|
+
return anchors;
|
|
27
|
+
}
|
|
28
|
+
export function ref005(options) {
|
|
29
|
+
const fileMatcher = options?.files ? picomatch(options.files) : undefined;
|
|
30
|
+
return {
|
|
31
|
+
id: "REF-005",
|
|
32
|
+
description: "Anchor fragments in Markdown links must point to headings that exist in the target file",
|
|
33
|
+
severity: "error",
|
|
34
|
+
check: (context) => {
|
|
35
|
+
if (!context.documents) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (fileMatcher && !fileMatcher(context.filePath)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
for (const link of context.document.links) {
|
|
42
|
+
const hashIndex = link.url.indexOf("#");
|
|
43
|
+
if (hashIndex === -1) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const filePart = link.url.slice(0, hashIndex);
|
|
47
|
+
const anchor = link.url.slice(hashIndex + 1);
|
|
48
|
+
if (!anchor) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
let targetDoc;
|
|
52
|
+
if (filePart) {
|
|
53
|
+
// Cross-file anchor: ./file.md#section
|
|
54
|
+
const resolved = resolve(dirname(context.filePath), filePart);
|
|
55
|
+
targetDoc = context.documents.get(resolved);
|
|
56
|
+
if (!targetDoc) {
|
|
57
|
+
// File doesn't exist — that's REF-001's concern
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Same-file anchor: #section
|
|
63
|
+
targetDoc = context.document;
|
|
64
|
+
}
|
|
65
|
+
const validAnchors = generateAnchors(targetDoc.sections);
|
|
66
|
+
if (!validAnchors.has(anchor)) {
|
|
67
|
+
context.report({
|
|
68
|
+
severity: "error",
|
|
69
|
+
message: filePart
|
|
70
|
+
? `Anchor "#${anchor}" does not match any heading in ${filePart}`
|
|
71
|
+
: `Anchor "#${anchor}" does not match any heading in this file`,
|
|
72
|
+
line: link.line,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ref-005.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-005.js","sourceRoot":"","sources":["../../src/rules/ref-005.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-006.d.ts","sourceRoot":"","sources":["../../src/rules/ref-006.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAsCpD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { resolve, dirname } from "node:path";
|
|
2
|
+
import picomatch from "picomatch";
|
|
3
|
+
export function ref006(options) {
|
|
4
|
+
const excludeMatchers = options?.exclude?.map((p) => picomatch(`**/${p}`)) ?? [];
|
|
5
|
+
return {
|
|
6
|
+
id: "REF-006",
|
|
7
|
+
description: "Image references must point to files that exist",
|
|
8
|
+
severity: "error",
|
|
9
|
+
check: (context) => {
|
|
10
|
+
if (!context.documents) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const allPaths = new Set(context.documents.keys());
|
|
14
|
+
for (const image of context.document.images) {
|
|
15
|
+
const urlWithoutAnchor = image.url.split("#")[0];
|
|
16
|
+
if (!urlWithoutAnchor) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const stripped = urlWithoutAnchor.replace(/^(\.\.?\/)+/, "");
|
|
20
|
+
if (excludeMatchers.some((m) => m(stripped))) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const resolved = resolve(dirname(context.filePath), urlWithoutAnchor);
|
|
24
|
+
if (!allPaths.has(resolved)) {
|
|
25
|
+
context.report({
|
|
26
|
+
severity: "error",
|
|
27
|
+
message: `Image target "${image.url}" does not exist`,
|
|
28
|
+
line: image.line,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ref-006.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-006.js","sourceRoot":"","sources":["../../src/rules/ref-006.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,SAAS,MAAM,WAAW,CAAC;AAOlC,MAAM,UAAU,MAAM,CAAC,OAAuB;IAC5C,MAAM,eAAe,GACnB,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3D,OAAO;QACL,EAAE,EAAE,SAAS;QACb,WAAW,EAAE,iDAAiD;QAC9D,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAEnD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC5C,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC7D,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC7C,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAEtE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC;wBACb,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,iBAAiB,KAAK,CAAC,GAAG,kBAAkB;wBACrD,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sec-002.d.ts","sourceRoot":"","sources":["../../src/rules/sec-002.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoDD,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAsCnD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import picomatch from "picomatch";
|
|
2
|
+
function groupByParent(headings, level) {
|
|
3
|
+
const groups = [];
|
|
4
|
+
let current = { parent: null, headings: [] };
|
|
5
|
+
for (const heading of headings) {
|
|
6
|
+
if (heading.level < level) {
|
|
7
|
+
if (current.parent !== null || current.headings.length > 0) {
|
|
8
|
+
groups.push(current);
|
|
9
|
+
}
|
|
10
|
+
current = { parent: heading.text, headings: [] };
|
|
11
|
+
}
|
|
12
|
+
else if (heading.level === level) {
|
|
13
|
+
current.headings.push(heading);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (current.parent !== null || current.headings.length > 0) {
|
|
17
|
+
groups.push(current);
|
|
18
|
+
}
|
|
19
|
+
return groups;
|
|
20
|
+
}
|
|
21
|
+
function checkOrder(headings, order, report) {
|
|
22
|
+
const matched = headings.filter((h) => order.includes(h.text));
|
|
23
|
+
let maxIndex = -1;
|
|
24
|
+
let maxText = "";
|
|
25
|
+
for (const heading of matched) {
|
|
26
|
+
const index = order.indexOf(heading.text);
|
|
27
|
+
if (index < maxIndex) {
|
|
28
|
+
report(heading.line, heading.text, maxText);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
maxIndex = index;
|
|
32
|
+
maxText = heading.text;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function sec002(options) {
|
|
37
|
+
const fileMatcher = options.files ? picomatch(options.files) : undefined;
|
|
38
|
+
return {
|
|
39
|
+
id: "SEC-002",
|
|
40
|
+
description: "Sections must appear in the specified order",
|
|
41
|
+
severity: "error",
|
|
42
|
+
check: (context) => {
|
|
43
|
+
if (fileMatcher && !fileMatcher(context.filePath)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const report = (line, text, after) => {
|
|
47
|
+
context.report({
|
|
48
|
+
severity: "error",
|
|
49
|
+
message: `Section "${text}" must appear before "${after}"`,
|
|
50
|
+
line,
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
if (options.level !== undefined) {
|
|
54
|
+
const groups = groupByParent(context.document.headings, options.level);
|
|
55
|
+
if (options.section !== undefined) {
|
|
56
|
+
const group = groups.find((g) => g.parent === options.section);
|
|
57
|
+
if (group) {
|
|
58
|
+
checkOrder(group.headings, options.order, report);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (const group of groups) {
|
|
63
|
+
checkOrder(group.headings, options.order, report);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
checkOrder(context.document.headings, options.order, report);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=sec-002.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sec-002.js","sourceRoot":"","sources":["../../src/rules/sec-002.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Rule } from "../rule.js";
|
|
2
|
+
export interface Tbl005Condition {
|
|
3
|
+
column: string;
|
|
4
|
+
equals?: string;
|
|
5
|
+
oneOf?: string[];
|
|
6
|
+
matches?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Tbl005Constraint {
|
|
9
|
+
column: string;
|
|
10
|
+
notEmpty?: boolean;
|
|
11
|
+
equals?: string;
|
|
12
|
+
oneOf?: string[];
|
|
13
|
+
matches?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface Tbl005Options {
|
|
16
|
+
when: Tbl005Condition;
|
|
17
|
+
then: Tbl005Constraint;
|
|
18
|
+
section?: string;
|
|
19
|
+
files?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function tbl005(options: Tbl005Options): Rule;
|
|
22
|
+
//# sourceMappingURL=tbl-005.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tbl-005.d.ts","sourceRoot":"","sources":["../../src/rules/tbl-005.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BD,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAkDnD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import picomatch from "picomatch";
|
|
2
|
+
function matchesCondition(value, condition) {
|
|
3
|
+
if (condition.equals !== undefined) {
|
|
4
|
+
return value === condition.equals;
|
|
5
|
+
}
|
|
6
|
+
if (condition.oneOf !== undefined) {
|
|
7
|
+
return condition.oneOf.includes(value);
|
|
8
|
+
}
|
|
9
|
+
if (condition.matches !== undefined) {
|
|
10
|
+
return new RegExp(condition.matches).test(value);
|
|
11
|
+
}
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
function violatesConstraint(value, constraint) {
|
|
15
|
+
if (constraint.notEmpty) {
|
|
16
|
+
return !value || value.trim() === "";
|
|
17
|
+
}
|
|
18
|
+
if (constraint.equals !== undefined) {
|
|
19
|
+
return value !== constraint.equals;
|
|
20
|
+
}
|
|
21
|
+
if (constraint.oneOf !== undefined) {
|
|
22
|
+
return !value || !constraint.oneOf.includes(value);
|
|
23
|
+
}
|
|
24
|
+
if (constraint.matches !== undefined) {
|
|
25
|
+
return !value || !new RegExp(constraint.matches).test(value);
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
export function tbl005(options) {
|
|
30
|
+
const isMatch = options.files ? picomatch(`**/${options.files}`) : null;
|
|
31
|
+
return {
|
|
32
|
+
id: "TBL-005",
|
|
33
|
+
description: "When a condition on one column is met, another column must satisfy a specified constraint",
|
|
34
|
+
severity: "error",
|
|
35
|
+
check: (context) => {
|
|
36
|
+
if (isMatch && !isMatch(context.filePath)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
for (const table of context.document.tables) {
|
|
40
|
+
if (options.section && !table.section?.includes(options.section)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (!table.headers.includes(options.when.column)) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!table.headers.includes(options.then.column)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
for (const row of table.rows) {
|
|
50
|
+
const conditionValue = row[options.when.column];
|
|
51
|
+
if (!conditionValue) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (!matchesCondition(conditionValue, options.when)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const constraintValue = row[options.then.column];
|
|
58
|
+
if (violatesConstraint(constraintValue, options.then)) {
|
|
59
|
+
const conditionDesc = describeCondition(options.when);
|
|
60
|
+
const constraintDesc = describeConstraint(options.then);
|
|
61
|
+
context.report({
|
|
62
|
+
severity: "error",
|
|
63
|
+
message: `Row where ${conditionDesc}: column "${options.then.column}" ${constraintDesc}`,
|
|
64
|
+
line: table.line,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function describeCondition(condition) {
|
|
73
|
+
if (condition.equals !== undefined) {
|
|
74
|
+
return `${condition.column}="${condition.equals}"`;
|
|
75
|
+
}
|
|
76
|
+
if (condition.oneOf !== undefined) {
|
|
77
|
+
return `${condition.column} is one of [${condition.oneOf.join(", ")}]`;
|
|
78
|
+
}
|
|
79
|
+
if (condition.matches !== undefined) {
|
|
80
|
+
return `${condition.column} matches /${condition.matches}/`;
|
|
81
|
+
}
|
|
82
|
+
return condition.column;
|
|
83
|
+
}
|
|
84
|
+
function describeConstraint(constraint) {
|
|
85
|
+
if (constraint.notEmpty) {
|
|
86
|
+
return "must not be empty";
|
|
87
|
+
}
|
|
88
|
+
if (constraint.equals !== undefined) {
|
|
89
|
+
return `must equal "${constraint.equals}"`;
|
|
90
|
+
}
|
|
91
|
+
if (constraint.oneOf !== undefined) {
|
|
92
|
+
return `must be one of [${constraint.oneOf.join(", ")}]`;
|
|
93
|
+
}
|
|
94
|
+
if (constraint.matches !== undefined) {
|
|
95
|
+
return `must match /${constraint.matches}/`;
|
|
96
|
+
}
|
|
97
|
+
return "violates constraint";
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=tbl-005.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tbl-005.js","sourceRoot":"","sources":["../../src/rules/tbl-005.ts"],"names":[],"mappings":"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"}
|