@contextlint/core 0.3.0 → 0.4.0

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 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 { resolveRule } from "./registry.js";
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
@@ -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,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE3E,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;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,WAAW,EAAE,MAAM,eAAe,CAAC"}
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 { resolveRule } from "./registry.js";
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;AAG5C,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;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,WAAW,EAAE,MAAM,eAAe,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;
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAOA,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,cAAc;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAgBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAkE7D"}
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 relative links (inline and reference-style)
53
- // Skip absolute URLs, anchors, and non-file URI schemes (mailto:, tel:, data:, etc.)
54
- const isRelativeFileLink = (url) => !url.startsWith("#") && !/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(url);
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 (isRelativeFileLink(node.url)) {
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 (isRelativeFileLink(node.url)) {
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { Rule } from "./rule.js";
2
+ export declare const ruleNames: string[];
2
3
  export declare function resolveRule(name: string, options?: Record<string, unknown>): Rule;
3
4
  //# sourceMappingURL=registry.d.ts.map
@@ -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;AA6DtC,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAMN"}
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) {
@@ -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,7 @@
1
+ import type { Rule } from "../rule.js";
2
+ export interface Chk001Options {
3
+ section?: string;
4
+ files?: string;
5
+ }
6
+ export declare function chk001(options?: Chk001Options): Rule;
7
+ //# sourceMappingURL=chk-001.d.ts.map
@@ -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,6 @@
1
+ import type { Rule } from "../rule.js";
2
+ export interface Ref005Options {
3
+ files?: string;
4
+ }
5
+ export declare function ref005(options?: Ref005Options): Rule;
6
+ //# sourceMappingURL=ref-005.d.ts.map
@@ -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,6 @@
1
+ import type { Rule } from "../rule.js";
2
+ export interface Ref006Options {
3
+ exclude?: string[];
4
+ }
5
+ export declare function ref006(options?: Ref006Options): Rule;
6
+ //# sourceMappingURL=ref-006.d.ts.map
@@ -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,9 @@
1
+ import type { Rule } from "../rule.js";
2
+ export interface Sec002Options {
3
+ order: string[];
4
+ level?: number;
5
+ section?: string;
6
+ files?: string;
7
+ }
8
+ export declare function sec002(options: Sec002Options): Rule;
9
+ //# sourceMappingURL=sec-002.d.ts.map
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contextlint/core",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Rule engine and Markdown table parser for contextlint",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",