@jasonbelmonti/markdown-engine 0.1.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/LICENSE +21 -0
  3. package/README.md +118 -0
  4. package/SECURITY.md +28 -0
  5. package/dist/api/contracts.d.ts +8 -0
  6. package/dist/api/contracts.d.ts.map +1 -0
  7. package/dist/api/contracts.js +7 -0
  8. package/dist/api/contracts.js.map +1 -0
  9. package/dist/api/diagnostics.d.ts +18 -0
  10. package/dist/api/diagnostics.d.ts.map +1 -0
  11. package/dist/api/diagnostics.js +2 -0
  12. package/dist/api/diagnostics.js.map +1 -0
  13. package/dist/api/document.d.ts +17 -0
  14. package/dist/api/document.d.ts.map +1 -0
  15. package/dist/api/document.js +2 -0
  16. package/dist/api/document.js.map +1 -0
  17. package/dist/api/normalize.d.ts +13 -0
  18. package/dist/api/normalize.d.ts.map +1 -0
  19. package/dist/api/normalize.js +7 -0
  20. package/dist/api/normalize.js.map +1 -0
  21. package/dist/api/parse.d.ts +20 -0
  22. package/dist/api/parse.d.ts.map +1 -0
  23. package/dist/api/parse.js +46 -0
  24. package/dist/api/parse.js.map +1 -0
  25. package/dist/api/serialize.d.ts +10 -0
  26. package/dist/api/serialize.d.ts.map +1 -0
  27. package/dist/api/serialize.js +18 -0
  28. package/dist/api/serialize.js.map +1 -0
  29. package/dist/api/validate.d.ts +21 -0
  30. package/dist/api/validate.d.ts.map +1 -0
  31. package/dist/api/validate.js +21 -0
  32. package/dist/api/validate.js.map +1 -0
  33. package/dist/config/index.d.ts +8 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +53 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/diagnostics/index.d.ts +6 -0
  38. package/dist/diagnostics/index.d.ts.map +1 -0
  39. package/dist/diagnostics/index.js +27 -0
  40. package/dist/diagnostics/index.js.map +1 -0
  41. package/dist/frontmatter/adapter.d.ts +3 -0
  42. package/dist/frontmatter/adapter.d.ts.map +1 -0
  43. package/dist/frontmatter/adapter.js +20 -0
  44. package/dist/frontmatter/adapter.js.map +1 -0
  45. package/dist/frontmatter/extract.d.ts +3 -0
  46. package/dist/frontmatter/extract.d.ts.map +1 -0
  47. package/dist/frontmatter/extract.js +104 -0
  48. package/dist/frontmatter/extract.js.map +1 -0
  49. package/dist/frontmatter/index.d.ts +3 -0
  50. package/dist/frontmatter/index.d.ts.map +1 -0
  51. package/dist/frontmatter/index.js +2 -0
  52. package/dist/frontmatter/index.js.map +1 -0
  53. package/dist/frontmatter/types.d.ts +14 -0
  54. package/dist/frontmatter/types.d.ts.map +1 -0
  55. package/dist/frontmatter/types.js +2 -0
  56. package/dist/frontmatter/types.js.map +1 -0
  57. package/dist/frontmatter/yaml-diagnostics.d.ts +13 -0
  58. package/dist/frontmatter/yaml-diagnostics.d.ts.map +1 -0
  59. package/dist/frontmatter/yaml-diagnostics.js +117 -0
  60. package/dist/frontmatter/yaml-diagnostics.js.map +1 -0
  61. package/dist/frontmatter/yaml-json.d.ts +13 -0
  62. package/dist/frontmatter/yaml-json.d.ts.map +1 -0
  63. package/dist/frontmatter/yaml-json.js +94 -0
  64. package/dist/frontmatter/yaml-json.js.map +1 -0
  65. package/dist/frontmatter/yaml-key-policy.d.ts +3 -0
  66. package/dist/frontmatter/yaml-key-policy.d.ts.map +1 -0
  67. package/dist/frontmatter/yaml-key-policy.js +29 -0
  68. package/dist/frontmatter/yaml-key-policy.js.map +1 -0
  69. package/dist/frontmatter/yaml-options.d.ts +6 -0
  70. package/dist/frontmatter/yaml-options.d.ts.map +1 -0
  71. package/dist/frontmatter/yaml-options.js +20 -0
  72. package/dist/frontmatter/yaml-options.js.map +1 -0
  73. package/dist/frontmatter/yaml.d.ts +9 -0
  74. package/dist/frontmatter/yaml.d.ts.map +1 -0
  75. package/dist/frontmatter/yaml.js +59 -0
  76. package/dist/frontmatter/yaml.js.map +1 -0
  77. package/dist/index.d.ts +2 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +2 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/internal/plain-record.d.ts +3 -0
  82. package/dist/internal/plain-record.d.ts.map +1 -0
  83. package/dist/internal/plain-record.js +11 -0
  84. package/dist/internal/plain-record.js.map +1 -0
  85. package/dist/ir/document.d.ts +5 -0
  86. package/dist/ir/document.d.ts.map +1 -0
  87. package/dist/ir/document.js +56 -0
  88. package/dist/ir/document.js.map +1 -0
  89. package/dist/ir/index.d.ts +2 -0
  90. package/dist/ir/index.d.ts.map +1 -0
  91. package/dist/ir/index.js +2 -0
  92. package/dist/ir/index.js.map +1 -0
  93. package/dist/parser/adapter.d.ts +3 -0
  94. package/dist/parser/adapter.d.ts.map +1 -0
  95. package/dist/parser/adapter.js +33 -0
  96. package/dist/parser/adapter.js.map +1 -0
  97. package/dist/parser/engine-document.d.ts +6 -0
  98. package/dist/parser/engine-document.d.ts.map +1 -0
  99. package/dist/parser/engine-document.js +192 -0
  100. package/dist/parser/engine-document.js.map +1 -0
  101. package/dist/parser/index.d.ts +3 -0
  102. package/dist/parser/index.d.ts.map +1 -0
  103. package/dist/parser/index.js +2 -0
  104. package/dist/parser/index.js.map +1 -0
  105. package/dist/parser/mdast.d.ts +30 -0
  106. package/dist/parser/mdast.d.ts.map +1 -0
  107. package/dist/parser/mdast.js +2 -0
  108. package/dist/parser/mdast.js.map +1 -0
  109. package/dist/parser/types.d.ts +14 -0
  110. package/dist/parser/types.d.ts.map +1 -0
  111. package/dist/parser/types.js +2 -0
  112. package/dist/parser/types.js.map +1 -0
  113. package/dist/rules/code-fence-languages-config.d.ts +11 -0
  114. package/dist/rules/code-fence-languages-config.d.ts.map +1 -0
  115. package/dist/rules/code-fence-languages-config.js +38 -0
  116. package/dist/rules/code-fence-languages-config.js.map +1 -0
  117. package/dist/rules/code-fence-languages.d.ts +5 -0
  118. package/dist/rules/code-fence-languages.d.ts.map +1 -0
  119. package/dist/rules/code-fence-languages.js +44 -0
  120. package/dist/rules/code-fence-languages.js.map +1 -0
  121. package/dist/rules/document-query.d.ts +5 -0
  122. package/dist/rules/document-query.d.ts.map +1 -0
  123. package/dist/rules/document-query.js +21 -0
  124. package/dist/rules/document-query.js.map +1 -0
  125. package/dist/rules/headings-required-config.d.ts +10 -0
  126. package/dist/rules/headings-required-config.d.ts.map +1 -0
  127. package/dist/rules/headings-required-config.js +24 -0
  128. package/dist/rules/headings-required-config.js.map +1 -0
  129. package/dist/rules/headings-required.d.ts +5 -0
  130. package/dist/rules/headings-required.d.ts.map +1 -0
  131. package/dist/rules/headings-required.js +21 -0
  132. package/dist/rules/headings-required.js.map +1 -0
  133. package/dist/rules/index.d.ts +12 -0
  134. package/dist/rules/index.d.ts.map +1 -0
  135. package/dist/rules/index.js +42 -0
  136. package/dist/rules/index.js.map +1 -0
  137. package/dist/rules/links-allowed-schemes-config.d.ts +10 -0
  138. package/dist/rules/links-allowed-schemes-config.d.ts.map +1 -0
  139. package/dist/rules/links-allowed-schemes-config.js +24 -0
  140. package/dist/rules/links-allowed-schemes-config.js.map +1 -0
  141. package/dist/rules/links-allowed-schemes.d.ts +5 -0
  142. package/dist/rules/links-allowed-schemes.d.ts.map +1 -0
  143. package/dist/rules/links-allowed-schemes.js +32 -0
  144. package/dist/rules/links-allowed-schemes.js.map +1 -0
  145. package/dist/rules/raw-html-policy-config.d.ts +9 -0
  146. package/dist/rules/raw-html-policy-config.d.ts.map +1 -0
  147. package/dist/rules/raw-html-policy-config.js +20 -0
  148. package/dist/rules/raw-html-policy-config.js.map +1 -0
  149. package/dist/rules/raw-html-policy.d.ts +5 -0
  150. package/dist/rules/raw-html-policy.d.ts.map +1 -0
  151. package/dist/rules/raw-html-policy.js +29 -0
  152. package/dist/rules/raw-html-policy.js.map +1 -0
  153. package/dist/rules/required-frontmatter-config.d.ts +10 -0
  154. package/dist/rules/required-frontmatter-config.d.ts.map +1 -0
  155. package/dist/rules/required-frontmatter-config.js +24 -0
  156. package/dist/rules/required-frontmatter-config.js.map +1 -0
  157. package/dist/rules/required-frontmatter.d.ts +5 -0
  158. package/dist/rules/required-frontmatter.d.ts.map +1 -0
  159. package/dist/rules/required-frontmatter.js +21 -0
  160. package/dist/rules/required-frontmatter.js.map +1 -0
  161. package/dist/rules/rule-config.d.ts +15 -0
  162. package/dist/rules/rule-config.d.ts.map +1 -0
  163. package/dist/rules/rule-config.js +32 -0
  164. package/dist/rules/rule-config.js.map +1 -0
  165. package/package.json +62 -0
@@ -0,0 +1,24 @@
1
+ import { isPlainRecord } from "../internal/plain-record.js";
2
+ import { invalidRuleConfig, parseNonEmptyStringArray, parseOptionalSeverity, } from "./rule-config.js";
3
+ export const HEADINGS_REQUIRED_RULE_ID = "headings.required";
4
+ export function parseHeadingsRequiredRuleConfig(config) {
5
+ if (!isPlainRecord(config)) {
6
+ return invalidRuleConfig(HEADINGS_REQUIRED_RULE_ID, "Rule headings.required must be an object with a headings array.");
7
+ }
8
+ const headings = parseNonEmptyStringArray(config.headings);
9
+ if (headings === undefined) {
10
+ return invalidRuleConfig(HEADINGS_REQUIRED_RULE_ID, "Rule headings.required headings must be a non-empty string array.");
11
+ }
12
+ const severity = parseOptionalSeverity(HEADINGS_REQUIRED_RULE_ID, config.severity);
13
+ if (severity.diagnostic !== undefined) {
14
+ return severity;
15
+ }
16
+ return {
17
+ rule: {
18
+ ruleId: HEADINGS_REQUIRED_RULE_ID,
19
+ headings,
20
+ severity: severity.rule,
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=headings-required-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings-required-config.js","sourceRoot":"","sources":["../../src/rules/headings-required-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAQ7D,MAAM,UAAU,+BAA+B,CAC7C,MAAe;IAEf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CACtB,yBAAyB,EACzB,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE3D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CACtB,yBAAyB,EACzB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CACpC,yBAAyB,EACzB,MAAM,CAAC,QAAQ,CAChB,CAAC;IAEF,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,MAAM,EAAE,yBAAyB;YACjC,QAAQ;YACR,QAAQ,EAAE,QAAQ,CAAC,IAAI;SACxB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EngineDocument } from "../api/document.js";
2
+ import type { ValidationRuleResult } from "../api/validate.js";
3
+ import type { HeadingsRequiredRuleConfig } from "./headings-required-config.js";
4
+ export declare function evaluateHeadingsRequiredRule(document: EngineDocument, config: HeadingsRequiredRuleConfig): ValidationRuleResult;
5
+ //# sourceMappingURL=headings-required.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings-required.d.ts","sourceRoot":"","sources":["../../src/rules/headings-required.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,0BAA0B,GACjC,oBAAoB,CAsBtB"}
@@ -0,0 +1,21 @@
1
+ import { makeDiagnostic } from "../diagnostics/index.js";
2
+ import { findNodes } from "./document-query.js";
3
+ export function evaluateHeadingsRequiredRule(document, config) {
4
+ const presentHeadings = new Set(findNodes(document, (node) => node.type === "heading")
5
+ .map((node) => node.text)
6
+ .filter((text) => text !== undefined));
7
+ const diagnostics = config.headings
8
+ .filter((heading) => !presentHeadings.has(heading))
9
+ .map((heading) => makeDiagnostic({
10
+ code: "headings.required.missing",
11
+ ruleId: config.ruleId,
12
+ message: `Required heading "${heading}" is missing.`,
13
+ severity: config.severity,
14
+ }));
15
+ return {
16
+ ruleId: config.ruleId,
17
+ passed: diagnostics.length === 0,
18
+ diagnostics,
19
+ };
20
+ }
21
+ //# sourceMappingURL=headings-required.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings-required.js","sourceRoot":"","sources":["../../src/rules/headings-required.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,4BAA4B,CAC1C,QAAwB,EACxB,MAAkC;IAElC,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACnD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CACxD,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ;SAChC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACf,cAAc,CAAC;QACb,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,qBAAqB,OAAO,eAAe;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CACH,CAAC;IAEJ,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAChC,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { EngineDocument } from "../api/document.js";
2
+ import type { ValidationRuleResult } from "../api/validate.js";
3
+ import { type CodeFenceLanguagesRuleConfig } from "./code-fence-languages-config.js";
4
+ import { type HeadingsRequiredRuleConfig } from "./headings-required-config.js";
5
+ import { type LinksAllowedSchemesRuleConfig } from "./links-allowed-schemes-config.js";
6
+ import { type RawHtmlPolicyRuleConfig } from "./raw-html-policy-config.js";
7
+ import { type RequiredFrontmatterRuleConfig } from "./required-frontmatter-config.js";
8
+ import type { ParsedRuleConfig } from "./rule-config.js";
9
+ export type SupportedValidationRuleConfig = CodeFenceLanguagesRuleConfig | HeadingsRequiredRuleConfig | LinksAllowedSchemesRuleConfig | RawHtmlPolicyRuleConfig | RequiredFrontmatterRuleConfig;
10
+ export declare function parseValidationRuleConfig(ruleId: string, config: unknown): ParsedRuleConfig<SupportedValidationRuleConfig> | undefined;
11
+ export declare function evaluateConfiguredRules(document: EngineDocument, rules: readonly SupportedValidationRuleConfig[]): ValidationRuleResult[];
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,6BAA6B,GACrC,4BAA4B,GAC5B,0BAA0B,GAC1B,6BAA6B,GAC7B,uBAAuB,GACvB,6BAA6B,CAAC;AAElC,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,GACd,gBAAgB,CAAC,6BAA6B,CAAC,GAAG,SAAS,CAmB7D;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,SAAS,6BAA6B,EAAE,GAC9C,oBAAoB,EAAE,CAmBxB"}
@@ -0,0 +1,42 @@
1
+ import { CODE_FENCE_LANGUAGES_RULE_ID, parseCodeFenceLanguagesRuleConfig, } from "./code-fence-languages-config.js";
2
+ import { evaluateCodeFenceLanguagesRule } from "./code-fence-languages.js";
3
+ import { HEADINGS_REQUIRED_RULE_ID, parseHeadingsRequiredRuleConfig, } from "./headings-required-config.js";
4
+ import { evaluateHeadingsRequiredRule } from "./headings-required.js";
5
+ import { LINKS_ALLOWED_SCHEMES_RULE_ID, parseLinksAllowedSchemesRuleConfig, } from "./links-allowed-schemes-config.js";
6
+ import { evaluateLinksAllowedSchemesRule } from "./links-allowed-schemes.js";
7
+ import { parseRawHtmlPolicyRuleConfig, RAW_HTML_POLICY_RULE_ID, } from "./raw-html-policy-config.js";
8
+ import { evaluateRawHtmlPolicyRule } from "./raw-html-policy.js";
9
+ import { REQUIRED_FRONTMATTER_RULE_ID, parseRequiredFrontmatterRuleConfig, } from "./required-frontmatter-config.js";
10
+ import { evaluateRequiredFrontmatterRule } from "./required-frontmatter.js";
11
+ export function parseValidationRuleConfig(ruleId, config) {
12
+ switch (ruleId) {
13
+ case CODE_FENCE_LANGUAGES_RULE_ID:
14
+ return parseCodeFenceLanguagesRuleConfig(config);
15
+ case HEADINGS_REQUIRED_RULE_ID:
16
+ return parseHeadingsRequiredRuleConfig(config);
17
+ case LINKS_ALLOWED_SCHEMES_RULE_ID:
18
+ return parseLinksAllowedSchemesRuleConfig(config);
19
+ case RAW_HTML_POLICY_RULE_ID:
20
+ return parseRawHtmlPolicyRuleConfig(config);
21
+ case REQUIRED_FRONTMATTER_RULE_ID:
22
+ return parseRequiredFrontmatterRuleConfig(config);
23
+ }
24
+ return undefined;
25
+ }
26
+ export function evaluateConfiguredRules(document, rules) {
27
+ return rules.map((rule) => {
28
+ switch (rule.ruleId) {
29
+ case CODE_FENCE_LANGUAGES_RULE_ID:
30
+ return evaluateCodeFenceLanguagesRule(document, rule);
31
+ case HEADINGS_REQUIRED_RULE_ID:
32
+ return evaluateHeadingsRequiredRule(document, rule);
33
+ case LINKS_ALLOWED_SCHEMES_RULE_ID:
34
+ return evaluateLinksAllowedSchemesRule(document, rule);
35
+ case RAW_HTML_POLICY_RULE_ID:
36
+ return evaluateRawHtmlPolicyRule(document, rule);
37
+ case REQUIRED_FRONTMATTER_RULE_ID:
38
+ return evaluateRequiredFrontmatterRule(document, rule);
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,GAElC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAEhC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,GAEnC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,+BAA+B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,GAExB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,GAEnC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AAU5E,MAAM,UAAU,yBAAyB,CACvC,MAAc,EACd,MAAe;IAEf,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,4BAA4B;YAC/B,OAAO,iCAAiC,CAAC,MAAM,CAAC,CAAC;QAEnD,KAAK,yBAAyB;YAC5B,OAAO,+BAA+B,CAAC,MAAM,CAAC,CAAC;QAEjD,KAAK,6BAA6B;YAChC,OAAO,kCAAkC,CAAC,MAAM,CAAC,CAAC;QAEpD,KAAK,uBAAuB;YAC1B,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC;QAE9C,KAAK,4BAA4B;YAC/B,OAAO,kCAAkC,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAAwB,EACxB,KAA+C;IAE/C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,4BAA4B;gBAC/B,OAAO,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAExD,KAAK,yBAAyB;gBAC5B,OAAO,4BAA4B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEtD,KAAK,6BAA6B;gBAChC,OAAO,+BAA+B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEzD,KAAK,uBAAuB;gBAC1B,OAAO,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAEnD,KAAK,4BAA4B;gBAC/B,OAAO,+BAA+B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MarkdownDiagnosticSeverity } from "../api/diagnostics.js";
2
+ import { type ParsedRuleConfig } from "./rule-config.js";
3
+ export declare const LINKS_ALLOWED_SCHEMES_RULE_ID = "links.allowedSchemes";
4
+ export interface LinksAllowedSchemesRuleConfig {
5
+ ruleId: typeof LINKS_ALLOWED_SCHEMES_RULE_ID;
6
+ schemes: string[];
7
+ severity: MarkdownDiagnosticSeverity;
8
+ }
9
+ export declare function parseLinksAllowedSchemesRuleConfig(config: unknown): ParsedRuleConfig<LinksAllowedSchemesRuleConfig>;
10
+ //# sourceMappingURL=links-allowed-schemes-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links-allowed-schemes-config.d.ts","sourceRoot":"","sources":["../../src/rules/links-allowed-schemes-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AAEpE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,OAAO,6BAA6B,CAAC;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,0BAA0B,CAAC;CACtC;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,OAAO,GACd,gBAAgB,CAAC,6BAA6B,CAAC,CAiCjD"}
@@ -0,0 +1,24 @@
1
+ import { isPlainRecord } from "../internal/plain-record.js";
2
+ import { invalidRuleConfig, parseNonEmptyStringArray, parseOptionalSeverity, } from "./rule-config.js";
3
+ export const LINKS_ALLOWED_SCHEMES_RULE_ID = "links.allowedSchemes";
4
+ export function parseLinksAllowedSchemesRuleConfig(config) {
5
+ if (!isPlainRecord(config)) {
6
+ return invalidRuleConfig(LINKS_ALLOWED_SCHEMES_RULE_ID, "Rule links.allowedSchemes must be an object with a schemes array.");
7
+ }
8
+ const schemes = parseNonEmptyStringArray(config.schemes);
9
+ if (schemes === undefined) {
10
+ return invalidRuleConfig(LINKS_ALLOWED_SCHEMES_RULE_ID, "Rule links.allowedSchemes schemes must be a non-empty string array.");
11
+ }
12
+ const severity = parseOptionalSeverity(LINKS_ALLOWED_SCHEMES_RULE_ID, config.severity);
13
+ if (severity.diagnostic !== undefined) {
14
+ return severity;
15
+ }
16
+ return {
17
+ rule: {
18
+ ruleId: LINKS_ALLOWED_SCHEMES_RULE_ID,
19
+ schemes: schemes.map((scheme) => scheme.toLowerCase()),
20
+ severity: severity.rule,
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=links-allowed-schemes-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links-allowed-schemes-config.js","sourceRoot":"","sources":["../../src/rules/links-allowed-schemes-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,6BAA6B,GAAG,sBAAsB,CAAC;AAQpE,MAAM,UAAU,kCAAkC,CAChD,MAAe;IAEf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CACtB,6BAA6B,EAC7B,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CACtB,6BAA6B,EAC7B,qEAAqE,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CACpC,6BAA6B,EAC7B,MAAM,CAAC,QAAQ,CAChB,CAAC;IAEF,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,MAAM,EAAE,6BAA6B;YACrC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtD,QAAQ,EAAE,QAAQ,CAAC,IAAI;SACxB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EngineDocument } from "../api/document.js";
2
+ import type { ValidationRuleResult } from "../api/validate.js";
3
+ import type { LinksAllowedSchemesRuleConfig } from "./links-allowed-schemes-config.js";
4
+ export declare function evaluateLinksAllowedSchemesRule(document: EngineDocument, config: LinksAllowedSchemesRuleConfig): ValidationRuleResult;
5
+ //# sourceMappingURL=links-allowed-schemes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links-allowed-schemes.d.ts","sourceRoot":"","sources":["../../src/rules/links-allowed-schemes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAKvF,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,6BAA6B,GACpC,oBAAoB,CAatB"}
@@ -0,0 +1,32 @@
1
+ import { makeDiagnostic } from "../diagnostics/index.js";
2
+ import { findNodes, stringAttribute } from "./document-query.js";
3
+ const SCHEME_PATTERN = /^([A-Za-z][A-Za-z0-9+.-]*):/;
4
+ const LINK_NODE_TYPES = new Set(["definition", "image", "link"]);
5
+ export function evaluateLinksAllowedSchemesRule(document, config) {
6
+ const allowedSchemes = new Set(config.schemes);
7
+ const diagnostics = findNodes(document, (node) => LINK_NODE_TYPES.has(node.type))
8
+ .map((node) => evaluateLinkNode(node, allowedSchemes, config))
9
+ .filter((diagnostic) => {
10
+ return diagnostic !== undefined;
11
+ });
12
+ return {
13
+ ruleId: config.ruleId,
14
+ passed: diagnostics.length === 0,
15
+ diagnostics,
16
+ };
17
+ }
18
+ function evaluateLinkNode(node, allowedSchemes, config) {
19
+ const url = stringAttribute(node, "url");
20
+ const scheme = url?.match(SCHEME_PATTERN)?.[1]?.toLowerCase();
21
+ if (url === undefined || scheme === undefined || allowedSchemes.has(scheme)) {
22
+ return undefined;
23
+ }
24
+ return makeDiagnostic({
25
+ code: "links.allowedSchemes.disallowed",
26
+ ruleId: config.ruleId,
27
+ message: `Link URL scheme "${scheme}" is not allowed.`,
28
+ severity: config.severity,
29
+ ...(node.sourceRange !== undefined ? { sourceRange: node.sourceRange } : {}),
30
+ });
31
+ }
32
+ //# sourceMappingURL=links-allowed-schemes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links-allowed-schemes.js","sourceRoot":"","sources":["../../src/rules/links-allowed-schemes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,cAAc,GAAG,6BAA6B,CAAC;AACrD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjE,MAAM,UAAU,+BAA+B,CAC7C,QAAwB,EACxB,MAAqC;IAErC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9E,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,UAAU,EAAoC,EAAE;QACvD,OAAO,UAAU,KAAK,SAAS,CAAC;IAClC,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAChC,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAgB,EAChB,cAAmC,EACnC,MAAqC;IAErC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAE9D,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,cAAc,CAAC;QACpB,IAAI,EAAE,iCAAiC;QACvC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,oBAAoB,MAAM,mBAAmB;QACtD,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ParsedRuleConfig } from "./rule-config.js";
2
+ export declare const RAW_HTML_POLICY_RULE_ID = "rawHtml.policy";
3
+ export type RawHtmlPolicy = "allow" | "warn" | "deny";
4
+ export interface RawHtmlPolicyRuleConfig {
5
+ ruleId: typeof RAW_HTML_POLICY_RULE_ID;
6
+ policy: RawHtmlPolicy;
7
+ }
8
+ export declare function parseRawHtmlPolicyRuleConfig(config: unknown): ParsedRuleConfig<RawHtmlPolicyRuleConfig>;
9
+ //# sourceMappingURL=raw-html-policy-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-html-policy-config.d.ts","sourceRoot":"","sources":["../../src/rules/raw-html-policy-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,uBAAuB,CAAC;IACvC,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,OAAO,GACd,gBAAgB,CAAC,uBAAuB,CAAC,CAyB3C"}
@@ -0,0 +1,20 @@
1
+ import { isPlainRecord } from "../internal/plain-record.js";
2
+ import { invalidRuleConfig } from "./rule-config.js";
3
+ export const RAW_HTML_POLICY_RULE_ID = "rawHtml.policy";
4
+ export function parseRawHtmlPolicyRuleConfig(config) {
5
+ if (!isPlainRecord(config)) {
6
+ return invalidRuleConfig(RAW_HTML_POLICY_RULE_ID, "Rule rawHtml.policy must be an object with a policy value.");
7
+ }
8
+ if (config.policy !== "allow" &&
9
+ config.policy !== "warn" &&
10
+ config.policy !== "deny") {
11
+ return invalidRuleConfig(RAW_HTML_POLICY_RULE_ID, "Rule rawHtml.policy policy must be allow, warn, or deny.");
12
+ }
13
+ return {
14
+ rule: {
15
+ ruleId: RAW_HTML_POLICY_RULE_ID,
16
+ policy: config.policy,
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=raw-html-policy-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-html-policy-config.js","sourceRoot":"","sources":["../../src/rules/raw-html-policy-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAyB,MAAM,kBAAkB,CAAC;AAE5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AASxD,MAAM,UAAU,4BAA4B,CAC1C,MAAe;IAEf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CACtB,uBAAuB,EACvB,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,IACE,MAAM,CAAC,MAAM,KAAK,OAAO;QACzB,MAAM,CAAC,MAAM,KAAK,MAAM;QACxB,MAAM,CAAC,MAAM,KAAK,MAAM,EACxB,CAAC;QACD,OAAO,iBAAiB,CACtB,uBAAuB,EACvB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,MAAM,EAAE,uBAAuB;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EngineDocument } from "../api/document.js";
2
+ import type { ValidationRuleResult } from "../api/validate.js";
3
+ import type { RawHtmlPolicyRuleConfig } from "./raw-html-policy-config.js";
4
+ export declare function evaluateRawHtmlPolicyRule(document: EngineDocument, config: RawHtmlPolicyRuleConfig): ValidationRuleResult;
5
+ //# sourceMappingURL=raw-html-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-html-policy.d.ts","sourceRoot":"","sources":["../../src/rules/raw-html-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,uBAAuB,GAC9B,oBAAoB,CAgCtB"}
@@ -0,0 +1,29 @@
1
+ import { makeDiagnostic } from "../diagnostics/index.js";
2
+ import { findNodes } from "./document-query.js";
3
+ export function evaluateRawHtmlPolicyRule(document, config) {
4
+ if (config.policy === "allow") {
5
+ return {
6
+ ruleId: config.ruleId,
7
+ passed: true,
8
+ diagnostics: [],
9
+ };
10
+ }
11
+ const severity = config.policy === "deny" ? "error" : "warning";
12
+ const diagnostics = findNodes(document, (node) => node.type === "html").map((node) => makeDiagnostic({
13
+ code: config.policy === "deny"
14
+ ? "rawHtml.policy.denied"
15
+ : "rawHtml.policy.warned",
16
+ ruleId: config.ruleId,
17
+ message: config.policy === "deny"
18
+ ? "Raw HTML is not allowed by policy."
19
+ : "Raw HTML is present.",
20
+ severity,
21
+ ...(node.sourceRange !== undefined ? { sourceRange: node.sourceRange } : {}),
22
+ }));
23
+ return {
24
+ ruleId: config.ruleId,
25
+ passed: diagnostics.length === 0,
26
+ diagnostics,
27
+ };
28
+ }
29
+ //# sourceMappingURL=raw-html-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-html-policy.js","sourceRoot":"","sources":["../../src/rules/raw-html-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,MAAM,UAAU,yBAAyB,CACvC,QAAwB,EACxB,MAA+B;IAE/B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CACzE,CAAC,IAAI,EAAE,EAAE,CACP,cAAc,CAAC;QACb,IAAI,EACF,MAAM,CAAC,MAAM,KAAK,MAAM;YACtB,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,uBAAuB;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EACL,MAAM,CAAC,MAAM,KAAK,MAAM;YACtB,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,sBAAsB;QAC5B,QAAQ;QACR,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC,CACL,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAChC,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MarkdownDiagnosticSeverity } from "../api/diagnostics.js";
2
+ import { type ParsedRuleConfig } from "./rule-config.js";
3
+ export declare const REQUIRED_FRONTMATTER_RULE_ID = "frontmatter.required";
4
+ export interface RequiredFrontmatterRuleConfig {
5
+ ruleId: typeof REQUIRED_FRONTMATTER_RULE_ID;
6
+ fields: string[];
7
+ severity: MarkdownDiagnosticSeverity;
8
+ }
9
+ export declare function parseRequiredFrontmatterRuleConfig(config: unknown): ParsedRuleConfig<RequiredFrontmatterRuleConfig>;
10
+ //# sourceMappingURL=required-frontmatter-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-frontmatter-config.d.ts","sourceRoot":"","sources":["../../src/rules/required-frontmatter-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,4BAA4B,yBAAyB,CAAC;AAEnE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,OAAO,4BAA4B,CAAC;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,0BAA0B,CAAC;CACtC;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,OAAO,GACd,gBAAgB,CAAC,6BAA6B,CAAC,CAiCjD"}
@@ -0,0 +1,24 @@
1
+ import { isPlainRecord } from "../internal/plain-record.js";
2
+ import { invalidRuleConfig, parseNonEmptyStringArray, parseOptionalSeverity, } from "./rule-config.js";
3
+ export const REQUIRED_FRONTMATTER_RULE_ID = "frontmatter.required";
4
+ export function parseRequiredFrontmatterRuleConfig(config) {
5
+ if (!isPlainRecord(config)) {
6
+ return invalidRuleConfig(REQUIRED_FRONTMATTER_RULE_ID, "Rule frontmatter.required must be an object with a fields array.");
7
+ }
8
+ const fields = parseNonEmptyStringArray(config.fields);
9
+ if (fields === undefined) {
10
+ return invalidRuleConfig(REQUIRED_FRONTMATTER_RULE_ID, "Rule frontmatter.required fields must be a non-empty string array.");
11
+ }
12
+ const severity = parseOptionalSeverity(REQUIRED_FRONTMATTER_RULE_ID, config.severity);
13
+ if (severity.diagnostic !== undefined) {
14
+ return severity;
15
+ }
16
+ return {
17
+ rule: {
18
+ ruleId: REQUIRED_FRONTMATTER_RULE_ID,
19
+ fields,
20
+ severity: severity.rule,
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=required-frontmatter-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-frontmatter-config.js","sourceRoot":"","sources":["../../src/rules/required-frontmatter-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;AAQnE,MAAM,UAAU,kCAAkC,CAChD,MAAe;IAEf,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,iBAAiB,CACtB,4BAA4B,EAC5B,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,iBAAiB,CACtB,4BAA4B,EAC5B,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CACpC,4BAA4B,EAC5B,MAAM,CAAC,QAAQ,CAChB,CAAC;IAEF,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,MAAM,EAAE,4BAA4B;YACpC,MAAM;YACN,QAAQ,EAAE,QAAQ,CAAC,IAAI;SACxB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EngineDocument } from "../api/document.js";
2
+ import type { ValidationRuleResult } from "../api/validate.js";
3
+ import type { RequiredFrontmatterRuleConfig } from "./required-frontmatter-config.js";
4
+ export declare function evaluateRequiredFrontmatterRule(document: EngineDocument, config: RequiredFrontmatterRuleConfig): ValidationRuleResult;
5
+ //# sourceMappingURL=required-frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-frontmatter.d.ts","sourceRoot":"","sources":["../../src/rules/required-frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEtF,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,6BAA6B,GACpC,oBAAoB,CAiBtB"}
@@ -0,0 +1,21 @@
1
+ import { makeDiagnostic } from "../diagnostics/index.js";
2
+ import { hasOwnProperty, isPlainRecord } from "../internal/plain-record.js";
3
+ export function evaluateRequiredFrontmatterRule(document, config) {
4
+ const diagnostics = config.fields
5
+ .filter((field) => !hasFrontmatterField(document.frontmatter, field))
6
+ .map((field) => makeDiagnostic({
7
+ code: "frontmatter.required.missing",
8
+ ruleId: config.ruleId,
9
+ message: `Required frontmatter field "${field}" is missing.`,
10
+ severity: config.severity,
11
+ }));
12
+ return {
13
+ ruleId: config.ruleId,
14
+ passed: diagnostics.length === 0,
15
+ diagnostics,
16
+ };
17
+ }
18
+ function hasFrontmatterField(frontmatter, field) {
19
+ return isPlainRecord(frontmatter) && hasOwnProperty(frontmatter, field);
20
+ }
21
+ //# sourceMappingURL=required-frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-frontmatter.js","sourceRoot":"","sources":["../../src/rules/required-frontmatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5E,MAAM,UAAU,+BAA+B,CAC7C,QAAwB,EACxB,MAAqC;IAErC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM;SAC9B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;SACpE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,cAAc,CAAC;QACb,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,+BAA+B,KAAK,eAAe;QAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CACH,CAAC;IAEJ,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,WAAW,CAAC,MAAM,KAAK,CAAC;QAChC,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAoB,EAAE,KAAa;IAC9D,OAAO,aAAa,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { MarkdownDiagnostic, MarkdownDiagnosticSeverity } from "../api/diagnostics.js";
2
+ export type ParsedRuleConfig<T> = {
3
+ rule: T;
4
+ diagnostic?: undefined;
5
+ } | {
6
+ rule?: undefined;
7
+ diagnostic: MarkdownDiagnostic;
8
+ };
9
+ export declare function invalidRuleConfig(ruleId: string, message: string): {
10
+ diagnostic: MarkdownDiagnostic;
11
+ };
12
+ export declare function parseOptionalSeverity(ruleId: string, severity: unknown): ParsedRuleConfig<MarkdownDiagnosticSeverity>;
13
+ export declare function isNonEmptyString(value: unknown): value is string;
14
+ export declare function parseNonEmptyStringArray(value: unknown): string[] | undefined;
15
+ //# sourceMappingURL=rule-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-config.d.ts","sourceRoot":"","sources":["../../src/rules/rule-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,uBAAuB,CAAC;AAG/B,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEzD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,kBAAkB,CAAA;CAAE,CASpC;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,GAChB,gBAAgB,CAAC,0BAA0B,CAAC,CAa9C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,GACb,MAAM,EAAE,GAAG,SAAS,CAUtB"}
@@ -0,0 +1,32 @@
1
+ import { makeDiagnostic } from "../diagnostics/index.js";
2
+ export function invalidRuleConfig(ruleId, message) {
3
+ return {
4
+ diagnostic: makeDiagnostic({
5
+ code: "config.rule.invalid",
6
+ ruleId,
7
+ message,
8
+ severity: "error",
9
+ }),
10
+ };
11
+ }
12
+ export function parseOptionalSeverity(ruleId, severity) {
13
+ if (severity === undefined) {
14
+ return { rule: "error" };
15
+ }
16
+ if (severity === "error" || severity === "warning" || severity === "info") {
17
+ return { rule: severity };
18
+ }
19
+ return invalidRuleConfig(ruleId, `Rule ${ruleId} severity must be error, warning, or info.`);
20
+ }
21
+ export function isNonEmptyString(value) {
22
+ return typeof value === "string" && value.length > 0;
23
+ }
24
+ export function parseNonEmptyStringArray(value) {
25
+ if (!Array.isArray(value) ||
26
+ value.length === 0 ||
27
+ !value.every(isNonEmptyString)) {
28
+ return undefined;
29
+ }
30
+ return value;
31
+ }
32
+ //# sourceMappingURL=rule-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-config.js","sourceRoot":"","sources":["../../src/rules/rule-config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMzD,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAe;IAEf,OAAO;QACL,UAAU,EAAE,cAAc,CAAC;YACzB,IAAI,EAAE,qBAAqB;YAC3B,MAAM;YACN,OAAO;YACP,QAAQ,EAAE,OAAO;SAClB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,QAAiB;IAEjB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO,iBAAiB,CACtB,MAAM,EACN,QAAQ,MAAM,4CAA4C,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAc;IAEd,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAC9B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@jasonbelmonti/markdown-engine",
3
+ "version": "0.1.0",
4
+ "description": "Deterministic Markdown parsing and validation engine package.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/jasonbelmonti/markdown-engine.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/jasonbelmonti/markdown-engine/issues"
13
+ },
14
+ "homepage": "https://github.com/jasonbelmonti/markdown-engine#readme",
15
+ "keywords": [
16
+ "markdown",
17
+ "gfm",
18
+ "frontmatter",
19
+ "validation",
20
+ "diagnostics"
21
+ ],
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js"
26
+ }
27
+ },
28
+ "types": "./dist/index.d.ts",
29
+ "files": [
30
+ "dist",
31
+ "CHANGELOG.md",
32
+ "SECURITY.md"
33
+ ],
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "clean": "node scripts/clean-dist.mjs",
39
+ "build": "npm run clean && tsc -p tsconfig.json",
40
+ "prepack": "npm run release:verify",
41
+ "prepublishOnly": "npm run release:verify",
42
+ "release:verify": "npm run typecheck && npm test && node scripts/check-boundaries.mjs && npm run build && node scripts/prove-repeatability.mjs --runs 10 && npm run release:check-clean",
43
+ "release:check-clean": "git diff --check HEAD -- && git diff --exit-code HEAD --",
44
+ "typecheck": "tsc -p tsconfig.json --noEmit",
45
+ "test": "npm run build && vitest run \"--exclude=.worktrees/**\""
46
+ },
47
+ "engines": {
48
+ "node": "^20.19.0 || >=22.12.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^22.19.17",
52
+ "cmark-gfm": "^0.9.0",
53
+ "typescript": "^5.8.3",
54
+ "vitest": "^3.1.3"
55
+ },
56
+ "dependencies": {
57
+ "remark-gfm": "^4.0.1",
58
+ "remark-parse": "^11.0.0",
59
+ "unified": "^11.0.5",
60
+ "yaml": "^2.8.3"
61
+ }
62
+ }