@redocly/recheck 0.1.0 → 0.2.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 (591) hide show
  1. package/README.md +1006 -56
  2. package/dist/cli.js +27 -7
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/markdoc-schema.d.ts +17 -0
  5. package/dist/commands/markdoc-schema.d.ts.map +1 -0
  6. package/dist/commands/markdoc-schema.js +127 -0
  7. package/dist/commands/markdoc-schema.js.map +1 -0
  8. package/dist/commands/run.d.ts +0 -1
  9. package/dist/commands/run.d.ts.map +1 -1
  10. package/dist/commands/run.js +68 -5
  11. package/dist/commands/run.js.map +1 -1
  12. package/dist/config/load.d.ts +11 -0
  13. package/dist/config/load.d.ts.map +1 -1
  14. package/dist/config/load.js +12 -2
  15. package/dist/config/load.js.map +1 -1
  16. package/dist/config/presets/google.d.ts +3 -0
  17. package/dist/config/presets/google.d.ts.map +1 -0
  18. package/dist/config/presets/google.js +1671 -0
  19. package/dist/config/presets/google.js.map +1 -0
  20. package/dist/config/presets/inclusive-language.d.ts +3 -0
  21. package/dist/config/presets/inclusive-language.d.ts.map +1 -0
  22. package/dist/config/presets/inclusive-language.js +321 -0
  23. package/dist/config/presets/inclusive-language.js.map +1 -0
  24. package/dist/config/presets/index.d.ts +67 -0
  25. package/dist/config/presets/index.d.ts.map +1 -0
  26. package/dist/config/presets/index.js +137 -0
  27. package/dist/config/presets/index.js.map +1 -0
  28. package/dist/config/presets/markdoc.d.ts +21 -0
  29. package/dist/config/presets/markdoc.d.ts.map +1 -0
  30. package/dist/config/presets/markdoc.js +101 -0
  31. package/dist/config/presets/markdoc.js.map +1 -0
  32. package/dist/config/presets/markdown-relaxed.d.ts +3 -0
  33. package/dist/config/presets/markdown-relaxed.d.ts.map +1 -0
  34. package/dist/config/presets/markdown-relaxed.js +98 -0
  35. package/dist/config/presets/markdown-relaxed.js.map +1 -0
  36. package/dist/config/presets/markdown.d.ts +43 -0
  37. package/dist/config/presets/markdown.d.ts.map +1 -0
  38. package/dist/config/presets/markdown.js +132 -0
  39. package/dist/config/presets/markdown.js.map +1 -0
  40. package/dist/config/presets/microsoft.d.ts +3 -0
  41. package/dist/config/presets/microsoft.d.ts.map +1 -0
  42. package/dist/config/presets/microsoft.js +2268 -0
  43. package/dist/config/presets/microsoft.js.map +1 -0
  44. package/dist/config/presets/minimal.d.ts +3 -0
  45. package/dist/config/presets/minimal.d.ts.map +1 -0
  46. package/dist/config/presets/minimal.js +21 -0
  47. package/dist/config/presets/minimal.js.map +1 -0
  48. package/dist/config/presets/plain-language.d.ts +3 -0
  49. package/dist/config/presets/plain-language.d.ts.map +1 -0
  50. package/dist/config/presets/plain-language.js +351 -0
  51. package/dist/config/presets/plain-language.js.map +1 -0
  52. package/dist/config/presets/prose.d.ts +52 -0
  53. package/dist/config/presets/prose.d.ts.map +1 -0
  54. package/dist/config/presets/prose.js +138 -0
  55. package/dist/config/presets/prose.js.map +1 -0
  56. package/dist/config/schema.d.ts +128 -22
  57. package/dist/config/schema.d.ts.map +1 -1
  58. package/dist/config/schema.js +105 -21
  59. package/dist/config/schema.js.map +1 -1
  60. package/dist/config/validate.d.ts +12 -2
  61. package/dist/config/validate.d.ts.map +1 -1
  62. package/dist/config/validate.js +1200 -44
  63. package/dist/config/validate.js.map +1 -1
  64. package/dist/core/auto-fix.d.ts +8 -13
  65. package/dist/core/auto-fix.d.ts.map +1 -1
  66. package/dist/core/auto-fix.js +94 -75
  67. package/dist/core/auto-fix.js.map +1 -1
  68. package/dist/core/case-preserve.d.ts +46 -0
  69. package/dist/core/case-preserve.d.ts.map +1 -0
  70. package/dist/core/case-preserve.js +57 -0
  71. package/dist/core/case-preserve.js.map +1 -0
  72. package/dist/core/directives.d.ts +9 -0
  73. package/dist/core/directives.d.ts.map +1 -0
  74. package/dist/core/directives.js +73 -0
  75. package/dist/core/directives.js.map +1 -0
  76. package/dist/core/files.d.ts +63 -0
  77. package/dist/core/files.d.ts.map +1 -1
  78. package/dist/core/files.js +185 -0
  79. package/dist/core/files.js.map +1 -1
  80. package/dist/core/inline-code.d.ts +87 -0
  81. package/dist/core/inline-code.d.ts.map +1 -0
  82. package/dist/core/inline-code.js +104 -0
  83. package/dist/core/inline-code.js.map +1 -0
  84. package/dist/core/line-endings.d.ts +32 -0
  85. package/dist/core/line-endings.d.ts.map +1 -0
  86. package/dist/core/line-endings.js +65 -0
  87. package/dist/core/line-endings.js.map +1 -0
  88. package/dist/core/markdoc-tags.d.ts +79 -0
  89. package/dist/core/markdoc-tags.d.ts.map +1 -0
  90. package/dist/core/markdoc-tags.js +131 -0
  91. package/dist/core/markdoc-tags.js.map +1 -0
  92. package/dist/core/runner.d.ts +92 -3
  93. package/dist/core/runner.d.ts.map +1 -1
  94. package/dist/core/runner.js +348 -110
  95. package/dist/core/runner.js.map +1 -1
  96. package/dist/core/timing.d.ts.map +1 -1
  97. package/dist/data/markdoc-realm-schema.d.ts +3 -0
  98. package/dist/data/markdoc-realm-schema.d.ts.map +1 -0
  99. package/dist/data/markdoc-realm-schema.js +760 -0
  100. package/dist/data/markdoc-realm-schema.js.map +1 -0
  101. package/dist/data/proper-nouns.d.ts +2 -0
  102. package/dist/data/proper-nouns.d.ts.map +1 -0
  103. package/dist/data/proper-nouns.js +208 -0
  104. package/dist/data/proper-nouns.js.map +1 -0
  105. package/dist/index.d.ts +90 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +152 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/metrics/formulas.d.ts +17 -0
  110. package/dist/metrics/formulas.d.ts.map +1 -0
  111. package/dist/metrics/formulas.js +70 -0
  112. package/dist/metrics/formulas.js.map +1 -0
  113. package/dist/metrics/index.d.ts +5 -0
  114. package/dist/metrics/index.d.ts.map +1 -0
  115. package/dist/metrics/index.js +3 -0
  116. package/dist/metrics/index.js.map +1 -0
  117. package/dist/metrics/statistics.d.ts +27 -0
  118. package/dist/metrics/statistics.d.ts.map +1 -0
  119. package/dist/metrics/statistics.js +56 -0
  120. package/dist/metrics/statistics.js.map +1 -0
  121. package/dist/parser/index.d.ts +18 -0
  122. package/dist/parser/index.d.ts.map +1 -0
  123. package/dist/parser/index.js +168 -0
  124. package/dist/parser/index.js.map +1 -0
  125. package/dist/parser/markdoc/extract-statics.d.ts +45 -0
  126. package/dist/parser/markdoc/extract-statics.d.ts.map +1 -0
  127. package/dist/parser/markdoc/extract-statics.js +139 -0
  128. package/dist/parser/markdoc/extract-statics.js.map +1 -0
  129. package/dist/parser/markdoc/pairing.d.ts +63 -0
  130. package/dist/parser/markdoc/pairing.d.ts.map +1 -0
  131. package/dist/parser/markdoc/pairing.js +94 -0
  132. package/dist/parser/markdoc/pairing.js.map +1 -0
  133. package/dist/parser/markdoc/schema.d.ts +85 -0
  134. package/dist/parser/markdoc/schema.d.ts.map +1 -0
  135. package/dist/parser/markdoc/schema.js +86 -0
  136. package/dist/parser/markdoc/schema.js.map +1 -0
  137. package/dist/parser/markdoc/span.d.ts +64 -0
  138. package/dist/parser/markdoc/span.d.ts.map +1 -0
  139. package/dist/parser/markdoc/span.js +729 -0
  140. package/dist/parser/markdoc/span.js.map +1 -0
  141. package/dist/parser/markdoc/structure.d.ts +28 -0
  142. package/dist/parser/markdoc/structure.d.ts.map +1 -0
  143. package/dist/parser/markdoc/structure.js +153 -0
  144. package/dist/parser/markdoc/structure.js.map +1 -0
  145. package/dist/parser/markdoc/syntax.d.ts +44 -0
  146. package/dist/parser/markdoc/syntax.d.ts.map +1 -0
  147. package/dist/parser/markdoc/syntax.js +317 -0
  148. package/dist/parser/markdoc/syntax.js.map +1 -0
  149. package/dist/parser/types.d.ts +18 -0
  150. package/dist/parser/types.d.ts.map +1 -0
  151. package/dist/parser/types.js.map +1 -0
  152. package/dist/reporter/fixes.d.ts.map +1 -1
  153. package/dist/reporter/fixes.js +22 -1
  154. package/dist/reporter/fixes.js.map +1 -1
  155. package/dist/reporter/statistics.d.ts +1 -8
  156. package/dist/reporter/statistics.d.ts.map +1 -1
  157. package/dist/reporter/statistics.js.map +1 -1
  158. package/dist/rules/registry.d.ts +15 -0
  159. package/dist/rules/registry.d.ts.map +1 -0
  160. package/dist/rules/registry.js +81 -0
  161. package/dist/rules/registry.js.map +1 -0
  162. package/dist/rules/scope/capitalization.d.ts +3 -0
  163. package/dist/rules/scope/capitalization.d.ts.map +1 -0
  164. package/dist/rules/scope/capitalization.js +161 -0
  165. package/dist/rules/scope/capitalization.js.map +1 -0
  166. package/dist/rules/scope/conditional.d.ts +3 -0
  167. package/dist/rules/scope/conditional.d.ts.map +1 -0
  168. package/dist/rules/scope/conditional.js +112 -0
  169. package/dist/rules/scope/conditional.js.map +1 -0
  170. package/dist/rules/scope/consistency.d.ts +3 -0
  171. package/dist/rules/scope/consistency.d.ts.map +1 -0
  172. package/dist/rules/scope/consistency.js +178 -0
  173. package/dist/rules/scope/consistency.js.map +1 -0
  174. package/dist/rules/scope/length.d.ts +3 -0
  175. package/dist/rules/scope/length.d.ts.map +1 -0
  176. package/dist/rules/scope/length.js +69 -0
  177. package/dist/rules/scope/length.js.map +1 -0
  178. package/dist/rules/scope/max-image-size.d.ts +3 -0
  179. package/dist/rules/scope/max-image-size.d.ts.map +1 -0
  180. package/dist/rules/scope/max-image-size.js +65 -0
  181. package/dist/rules/scope/max-image-size.js.map +1 -0
  182. package/dist/rules/scope/metric.d.ts +17 -0
  183. package/dist/rules/scope/metric.d.ts.map +1 -0
  184. package/dist/rules/scope/metric.js +216 -0
  185. package/dist/rules/scope/metric.js.map +1 -0
  186. package/dist/rules/scope/occurrence.d.ts +3 -0
  187. package/dist/rules/scope/occurrence.d.ts.map +1 -0
  188. package/dist/rules/scope/occurrence.js +48 -0
  189. package/dist/rules/scope/occurrence.js.map +1 -0
  190. package/dist/rules/scope/pattern.d.ts +3 -0
  191. package/dist/rules/scope/pattern.d.ts.map +1 -0
  192. package/dist/rules/scope/pattern.js +75 -0
  193. package/dist/rules/scope/pattern.js.map +1 -0
  194. package/dist/rules/scope/repetition.d.ts +3 -0
  195. package/dist/rules/scope/repetition.d.ts.map +1 -0
  196. package/dist/rules/scope/repetition.js +139 -0
  197. package/dist/rules/scope/repetition.js.map +1 -0
  198. package/dist/rules/scope/semantic-line-breaks.d.ts +3 -0
  199. package/dist/rules/scope/semantic-line-breaks.d.ts.map +1 -0
  200. package/dist/rules/scope/semantic-line-breaks.js +213 -0
  201. package/dist/rules/scope/semantic-line-breaks.js.map +1 -0
  202. package/dist/rules/scope/spelling.d.ts +27 -0
  203. package/dist/rules/scope/spelling.d.ts.map +1 -0
  204. package/dist/rules/scope/spelling.js +227 -0
  205. package/dist/rules/scope/spelling.js.map +1 -0
  206. package/dist/rules/scope/swap.d.ts +3 -0
  207. package/dist/rules/scope/swap.d.ts.map +1 -0
  208. package/dist/rules/scope/swap.js +149 -0
  209. package/dist/rules/scope/swap.js.map +1 -0
  210. package/dist/rules/scope/title-case.d.ts +42 -0
  211. package/dist/rules/scope/title-case.d.ts.map +1 -0
  212. package/dist/rules/scope/title-case.js +264 -0
  213. package/dist/rules/scope/title-case.js.map +1 -0
  214. package/dist/rules/token/blanks-around-fences.d.ts +3 -0
  215. package/dist/rules/token/blanks-around-fences.d.ts.map +1 -0
  216. package/dist/rules/token/blanks-around-fences.js +44 -0
  217. package/dist/rules/token/blanks-around-fences.js.map +1 -0
  218. package/dist/rules/token/blanks-around-headings.d.ts +3 -0
  219. package/dist/rules/token/blanks-around-headings.d.ts.map +1 -0
  220. package/dist/rules/token/blanks-around-headings.js +108 -0
  221. package/dist/rules/token/blanks-around-headings.js.map +1 -0
  222. package/dist/rules/token/blanks-around-lists.d.ts +3 -0
  223. package/dist/rules/token/blanks-around-lists.d.ts.map +1 -0
  224. package/dist/rules/token/blanks-around-lists.js +56 -0
  225. package/dist/rules/token/blanks-around-lists.js.map +1 -0
  226. package/dist/rules/token/blanks-around-tables.d.ts +3 -0
  227. package/dist/rules/token/blanks-around-tables.d.ts.map +1 -0
  228. package/dist/rules/token/blanks-around-tables.js +42 -0
  229. package/dist/rules/token/blanks-around-tables.js.map +1 -0
  230. package/dist/rules/token/code-block-style.d.ts +3 -0
  231. package/dist/rules/token/code-block-style.d.ts.map +1 -0
  232. package/dist/rules/token/code-block-style.js +30 -0
  233. package/dist/rules/token/code-block-style.js.map +1 -0
  234. package/dist/rules/token/code-fence-style.d.ts +3 -0
  235. package/dist/rules/token/code-fence-style.d.ts.map +1 -0
  236. package/dist/rules/token/code-fence-style.js +35 -0
  237. package/dist/rules/token/code-fence-style.js.map +1 -0
  238. package/dist/rules/token/commands-show-output.d.ts +3 -0
  239. package/dist/rules/token/commands-show-output.d.ts.map +1 -0
  240. package/dist/rules/token/commands-show-output.js +38 -0
  241. package/dist/rules/token/commands-show-output.js.map +1 -0
  242. package/dist/rules/token/descriptive-link-text.d.ts +3 -0
  243. package/dist/rules/token/descriptive-link-text.d.ts.map +1 -0
  244. package/dist/rules/token/descriptive-link-text.js +53 -0
  245. package/dist/rules/token/descriptive-link-text.js.map +1 -0
  246. package/dist/rules/token/emphasis-style.d.ts +3 -0
  247. package/dist/rules/token/emphasis-style.d.ts.map +1 -0
  248. package/dist/rules/token/emphasis-style.js +51 -0
  249. package/dist/rules/token/emphasis-style.js.map +1 -0
  250. package/dist/rules/token/fenced-code-language.d.ts +3 -0
  251. package/dist/rules/token/fenced-code-language.d.ts.map +1 -0
  252. package/dist/rules/token/fenced-code-language.js +35 -0
  253. package/dist/rules/token/fenced-code-language.js.map +1 -0
  254. package/dist/rules/token/first-line-h1.d.ts +3 -0
  255. package/dist/rules/token/first-line-h1.d.ts.map +1 -0
  256. package/dist/rules/token/first-line-h1.js +107 -0
  257. package/dist/rules/token/first-line-h1.js.map +1 -0
  258. package/dist/rules/token/heading-increment.d.ts +3 -0
  259. package/dist/rules/token/heading-increment.d.ts.map +1 -0
  260. package/dist/rules/token/heading-increment.js +27 -0
  261. package/dist/rules/token/heading-increment.js.map +1 -0
  262. package/dist/rules/token/heading-start-left.d.ts +3 -0
  263. package/dist/rules/token/heading-start-left.d.ts.map +1 -0
  264. package/dist/rules/token/heading-start-left.js +31 -0
  265. package/dist/rules/token/heading-start-left.js.map +1 -0
  266. package/dist/rules/token/heading-style.d.ts +3 -0
  267. package/dist/rules/token/heading-style.d.ts.map +1 -0
  268. package/dist/rules/token/heading-style.js +41 -0
  269. package/dist/rules/token/heading-style.js.map +1 -0
  270. package/dist/rules/token/helpers.d.ts +313 -0
  271. package/dist/rules/token/helpers.d.ts.map +1 -0
  272. package/dist/rules/token/helpers.js +746 -0
  273. package/dist/rules/token/helpers.js.map +1 -0
  274. package/dist/rules/token/hr-style.d.ts +3 -0
  275. package/dist/rules/token/hr-style.d.ts.map +1 -0
  276. package/dist/rules/token/hr-style.js +28 -0
  277. package/dist/rules/token/hr-style.js.map +1 -0
  278. package/dist/rules/token/index.d.ts +75 -0
  279. package/dist/rules/token/index.d.ts.map +1 -0
  280. package/dist/rules/token/index.js +226 -0
  281. package/dist/rules/token/index.js.map +1 -0
  282. package/dist/rules/token/line-length.d.ts +3 -0
  283. package/dist/rules/token/line-length.d.ts.map +1 -0
  284. package/dist/rules/token/line-length.js +120 -0
  285. package/dist/rules/token/line-length.js.map +1 -0
  286. package/dist/rules/token/link-fragments.d.ts +3 -0
  287. package/dist/rules/token/link-fragments.d.ts.map +1 -0
  288. package/dist/rules/token/link-fragments.js +145 -0
  289. package/dist/rules/token/link-fragments.js.map +1 -0
  290. package/dist/rules/token/link-image-reference-definitions.d.ts +3 -0
  291. package/dist/rules/token/link-image-reference-definitions.d.ts.map +1 -0
  292. package/dist/rules/token/link-image-reference-definitions.js +50 -0
  293. package/dist/rules/token/link-image-reference-definitions.js.map +1 -0
  294. package/dist/rules/token/link-image-style.d.ts +3 -0
  295. package/dist/rules/token/link-image-style.d.ts.map +1 -0
  296. package/dist/rules/token/link-image-style.js +131 -0
  297. package/dist/rules/token/link-image-style.js.map +1 -0
  298. package/dist/rules/token/list-indent.d.ts +3 -0
  299. package/dist/rules/token/list-indent.d.ts.map +1 -0
  300. package/dist/rules/token/list-indent.js +60 -0
  301. package/dist/rules/token/list-indent.js.map +1 -0
  302. package/dist/rules/token/list-length.d.ts +3 -0
  303. package/dist/rules/token/list-length.d.ts.map +1 -0
  304. package/dist/rules/token/list-length.js +55 -0
  305. package/dist/rules/token/list-length.js.map +1 -0
  306. package/dist/rules/token/list-marker-space.d.ts +3 -0
  307. package/dist/rules/token/list-marker-space.d.ts.map +1 -0
  308. package/dist/rules/token/list-marker-space.js +52 -0
  309. package/dist/rules/token/list-marker-space.js.map +1 -0
  310. package/dist/rules/token/markdoc-attributes.d.ts +3 -0
  311. package/dist/rules/token/markdoc-attributes.d.ts.map +1 -0
  312. package/dist/rules/token/markdoc-attributes.js +269 -0
  313. package/dist/rules/token/markdoc-attributes.js.map +1 -0
  314. package/dist/rules/token/markdoc-pairing.d.ts +3 -0
  315. package/dist/rules/token/markdoc-pairing.d.ts.map +1 -0
  316. package/dist/rules/token/markdoc-pairing.js +73 -0
  317. package/dist/rules/token/markdoc-pairing.js.map +1 -0
  318. package/dist/rules/token/markdoc-syntax.d.ts +3 -0
  319. package/dist/rules/token/markdoc-syntax.d.ts.map +1 -0
  320. package/dist/rules/token/markdoc-syntax.js +119 -0
  321. package/dist/rules/token/markdoc-syntax.js.map +1 -0
  322. package/dist/rules/token/markdoc-unknown-tag.d.ts +3 -0
  323. package/dist/rules/token/markdoc-unknown-tag.d.ts.map +1 -0
  324. package/dist/rules/token/markdoc-unknown-tag.js +64 -0
  325. package/dist/rules/token/markdoc-unknown-tag.js.map +1 -0
  326. package/dist/rules/token/messages.d.ts +4 -0
  327. package/dist/rules/token/messages.d.ts.map +1 -0
  328. package/dist/rules/token/messages.js +20 -0
  329. package/dist/rules/token/messages.js.map +1 -0
  330. package/dist/rules/token/no-alt-text.d.ts +3 -0
  331. package/dist/rules/token/no-alt-text.d.ts.map +1 -0
  332. package/dist/rules/token/no-alt-text.js +47 -0
  333. package/dist/rules/token/no-alt-text.js.map +1 -0
  334. package/dist/rules/token/no-bare-urls.d.ts +3 -0
  335. package/dist/rules/token/no-bare-urls.d.ts.map +1 -0
  336. package/dist/rules/token/no-bare-urls.js +88 -0
  337. package/dist/rules/token/no-bare-urls.js.map +1 -0
  338. package/dist/rules/token/no-blanks-blockquote.d.ts +3 -0
  339. package/dist/rules/token/no-blanks-blockquote.d.ts.map +1 -0
  340. package/dist/rules/token/no-blanks-blockquote.js +39 -0
  341. package/dist/rules/token/no-blanks-blockquote.js.map +1 -0
  342. package/dist/rules/token/no-duplicate-heading.d.ts +3 -0
  343. package/dist/rules/token/no-duplicate-heading.d.ts.map +1 -0
  344. package/dist/rules/token/no-duplicate-heading.js +101 -0
  345. package/dist/rules/token/no-duplicate-heading.js.map +1 -0
  346. package/dist/rules/token/no-duplicate-link-destinations.d.ts +3 -0
  347. package/dist/rules/token/no-duplicate-link-destinations.d.ts.map +1 -0
  348. package/dist/rules/token/no-duplicate-link-destinations.js +65 -0
  349. package/dist/rules/token/no-duplicate-link-destinations.js.map +1 -0
  350. package/dist/rules/token/no-emphasis-as-heading.d.ts +3 -0
  351. package/dist/rules/token/no-emphasis-as-heading.d.ts.map +1 -0
  352. package/dist/rules/token/no-emphasis-as-heading.js +44 -0
  353. package/dist/rules/token/no-emphasis-as-heading.js.map +1 -0
  354. package/dist/rules/token/no-empty-headings.d.ts +3 -0
  355. package/dist/rules/token/no-empty-headings.d.ts.map +1 -0
  356. package/dist/rules/token/no-empty-headings.js +28 -0
  357. package/dist/rules/token/no-empty-headings.js.map +1 -0
  358. package/dist/rules/token/no-empty-links.d.ts +3 -0
  359. package/dist/rules/token/no-empty-links.d.ts.map +1 -0
  360. package/dist/rules/token/no-empty-links.js +67 -0
  361. package/dist/rules/token/no-empty-links.js.map +1 -0
  362. package/dist/rules/token/no-hard-tabs.d.ts +3 -0
  363. package/dist/rules/token/no-hard-tabs.d.ts.map +1 -0
  364. package/dist/rules/token/no-hard-tabs.js +76 -0
  365. package/dist/rules/token/no-hard-tabs.js.map +1 -0
  366. package/dist/rules/token/no-inline-html.d.ts +3 -0
  367. package/dist/rules/token/no-inline-html.d.ts.map +1 -0
  368. package/dist/rules/token/no-inline-html.js +45 -0
  369. package/dist/rules/token/no-inline-html.js.map +1 -0
  370. package/dist/rules/token/no-missing-space-atx.d.ts +3 -0
  371. package/dist/rules/token/no-missing-space-atx.d.ts.map +1 -0
  372. package/dist/rules/token/no-missing-space-atx.js +36 -0
  373. package/dist/rules/token/no-missing-space-atx.js.map +1 -0
  374. package/dist/rules/token/no-missing-space-closed-atx.d.ts +3 -0
  375. package/dist/rules/token/no-missing-space-closed-atx.d.ts.map +1 -0
  376. package/dist/rules/token/no-missing-space-closed-atx.js +45 -0
  377. package/dist/rules/token/no-missing-space-closed-atx.js.map +1 -0
  378. package/dist/rules/token/no-multiple-blanks.d.ts +3 -0
  379. package/dist/rules/token/no-multiple-blanks.d.ts.map +1 -0
  380. package/dist/rules/token/no-multiple-blanks.js +35 -0
  381. package/dist/rules/token/no-multiple-blanks.js.map +1 -0
  382. package/dist/rules/token/no-multiple-space-atx.d.ts +13 -0
  383. package/dist/rules/token/no-multiple-space-atx.d.ts.map +1 -0
  384. package/dist/rules/token/no-multiple-space-atx.js +50 -0
  385. package/dist/rules/token/no-multiple-space-atx.js.map +1 -0
  386. package/dist/rules/token/no-multiple-space-blockquote.d.ts +3 -0
  387. package/dist/rules/token/no-multiple-space-blockquote.d.ts.map +1 -0
  388. package/dist/rules/token/no-multiple-space-blockquote.js +43 -0
  389. package/dist/rules/token/no-multiple-space-blockquote.js.map +1 -0
  390. package/dist/rules/token/no-multiple-space-closed-atx.d.ts +3 -0
  391. package/dist/rules/token/no-multiple-space-closed-atx.d.ts.map +1 -0
  392. package/dist/rules/token/no-multiple-space-closed-atx.js +19 -0
  393. package/dist/rules/token/no-multiple-space-closed-atx.js.map +1 -0
  394. package/dist/rules/token/no-reversed-links.d.ts +3 -0
  395. package/dist/rules/token/no-reversed-links.d.ts.map +1 -0
  396. package/dist/rules/token/no-reversed-links.js +52 -0
  397. package/dist/rules/token/no-reversed-links.js.map +1 -0
  398. package/dist/rules/token/no-space-in-code.d.ts +3 -0
  399. package/dist/rules/token/no-space-in-code.d.ts.map +1 -0
  400. package/dist/rules/token/no-space-in-code.js +75 -0
  401. package/dist/rules/token/no-space-in-code.js.map +1 -0
  402. package/dist/rules/token/no-space-in-emphasis.d.ts +3 -0
  403. package/dist/rules/token/no-space-in-emphasis.d.ts.map +1 -0
  404. package/dist/rules/token/no-space-in-emphasis.js +79 -0
  405. package/dist/rules/token/no-space-in-emphasis.js.map +1 -0
  406. package/dist/rules/token/no-space-in-links.d.ts +3 -0
  407. package/dist/rules/token/no-space-in-links.d.ts.map +1 -0
  408. package/dist/rules/token/no-space-in-links.js +48 -0
  409. package/dist/rules/token/no-space-in-links.js.map +1 -0
  410. package/dist/rules/token/no-trailing-punctuation.d.ts +3 -0
  411. package/dist/rules/token/no-trailing-punctuation.d.ts.map +1 -0
  412. package/dist/rules/token/no-trailing-punctuation.js +38 -0
  413. package/dist/rules/token/no-trailing-punctuation.js.map +1 -0
  414. package/dist/rules/token/no-trailing-spaces.d.ts +3 -0
  415. package/dist/rules/token/no-trailing-spaces.d.ts.map +1 -0
  416. package/dist/rules/token/no-trailing-spaces.js +89 -0
  417. package/dist/rules/token/no-trailing-spaces.js.map +1 -0
  418. package/dist/rules/token/ol-prefix.d.ts +3 -0
  419. package/dist/rules/token/ol-prefix.d.ts.map +1 -0
  420. package/dist/rules/token/ol-prefix.js +70 -0
  421. package/dist/rules/token/ol-prefix.js.map +1 -0
  422. package/dist/rules/token/proper-names.d.ts +3 -0
  423. package/dist/rules/token/proper-names.d.ts.map +1 -0
  424. package/dist/rules/token/proper-names.js +93 -0
  425. package/dist/rules/token/proper-names.js.map +1 -0
  426. package/dist/rules/token/reference-links-images.d.ts +3 -0
  427. package/dist/rules/token/reference-links-images.d.ts.map +1 -0
  428. package/dist/rules/token/reference-links-images.js +36 -0
  429. package/dist/rules/token/reference-links-images.js.map +1 -0
  430. package/dist/rules/token/required-headings.d.ts +3 -0
  431. package/dist/rules/token/required-headings.d.ts.map +1 -0
  432. package/dist/rules/token/required-headings.js +83 -0
  433. package/dist/rules/token/required-headings.js.map +1 -0
  434. package/dist/rules/token/single-h1.d.ts +3 -0
  435. package/dist/rules/token/single-h1.d.ts.map +1 -0
  436. package/dist/rules/token/single-h1.js +56 -0
  437. package/dist/rules/token/single-h1.js.map +1 -0
  438. package/dist/rules/token/single-trailing-newline.d.ts +3 -0
  439. package/dist/rules/token/single-trailing-newline.d.ts.map +1 -0
  440. package/dist/rules/token/single-trailing-newline.js +25 -0
  441. package/dist/rules/token/single-trailing-newline.js.map +1 -0
  442. package/dist/rules/token/strong-style.d.ts +3 -0
  443. package/dist/rules/token/strong-style.d.ts.map +1 -0
  444. package/dist/rules/token/strong-style.js +51 -0
  445. package/dist/rules/token/strong-style.js.map +1 -0
  446. package/dist/rules/token/table-column-count.d.ts +3 -0
  447. package/dist/rules/token/table-column-count.d.ts.map +1 -0
  448. package/dist/rules/token/table-column-count.js +44 -0
  449. package/dist/rules/token/table-column-count.js.map +1 -0
  450. package/dist/rules/token/table-column-style.d.ts +3 -0
  451. package/dist/rules/token/table-column-style.d.ts.map +1 -0
  452. package/dist/rules/token/table-column-style.js +179 -0
  453. package/dist/rules/token/table-column-style.js.map +1 -0
  454. package/dist/rules/token/table-pipe-style.d.ts +3 -0
  455. package/dist/rules/token/table-pipe-style.d.ts.map +1 -0
  456. package/dist/rules/token/table-pipe-style.js +54 -0
  457. package/dist/rules/token/table-pipe-style.js.map +1 -0
  458. package/dist/rules/token/ul-indent.d.ts +3 -0
  459. package/dist/rules/token/ul-indent.d.ts.map +1 -0
  460. package/dist/rules/token/ul-indent.js +72 -0
  461. package/dist/rules/token/ul-indent.js.map +1 -0
  462. package/dist/rules/token/ul-style.d.ts +3 -0
  463. package/dist/rules/token/ul-style.d.ts.map +1 -0
  464. package/dist/rules/token/ul-style.js +80 -0
  465. package/dist/rules/token/ul-style.js.map +1 -0
  466. package/dist/rules/types.d.ts +81 -0
  467. package/dist/rules/types.d.ts.map +1 -0
  468. package/dist/rules/types.js +2 -0
  469. package/dist/rules/types.js.map +1 -0
  470. package/dist/rules/utils.d.ts +29 -0
  471. package/dist/rules/utils.d.ts.map +1 -0
  472. package/dist/{assertions → rules}/utils.js +27 -0
  473. package/dist/rules/utils.js.map +1 -0
  474. package/dist/scopes/extractor.d.ts +7 -0
  475. package/dist/scopes/extractor.d.ts.map +1 -0
  476. package/dist/scopes/extractor.js +475 -0
  477. package/dist/scopes/extractor.js.map +1 -0
  478. package/dist/scopes/selector.d.ts +51 -0
  479. package/dist/scopes/selector.d.ts.map +1 -0
  480. package/dist/scopes/selector.js +121 -0
  481. package/dist/scopes/selector.js.map +1 -0
  482. package/dist/scopes/sentences.d.ts +7 -0
  483. package/dist/scopes/sentences.d.ts.map +1 -0
  484. package/dist/scopes/sentences.js +115 -0
  485. package/dist/scopes/sentences.js.map +1 -0
  486. package/dist/scopes/types.d.ts +44 -0
  487. package/dist/scopes/types.d.ts.map +1 -0
  488. package/dist/scopes/types.js +2 -0
  489. package/dist/scopes/types.js.map +1 -0
  490. package/dist/scopes/vocabulary.d.ts +16 -0
  491. package/dist/scopes/vocabulary.d.ts.map +1 -0
  492. package/dist/scopes/vocabulary.js +70 -0
  493. package/dist/scopes/vocabulary.js.map +1 -0
  494. package/dist/types/assertions.d.ts +95 -32
  495. package/dist/types/assertions.d.ts.map +1 -1
  496. package/dist/types/problems.d.ts +4 -5
  497. package/dist/types/problems.d.ts.map +1 -1
  498. package/dist/types/rules.d.ts +4 -6
  499. package/dist/types/rules.d.ts.map +1 -1
  500. package/examples/appendices/google.appendix.yaml +91 -0
  501. package/examples/appendices/inclusive-language.appendix.yaml +61 -0
  502. package/examples/appendices/microsoft.appendix.yaml +99 -0
  503. package/examples/appendices/plain-language.appendix.yaml +88 -0
  504. package/examples/google.yaml +1525 -0
  505. package/examples/inclusive-language.yaml +304 -0
  506. package/examples/microsoft.yaml +1542 -0
  507. package/examples/plain-language.yaml +325 -0
  508. package/package.json +49 -16
  509. package/presets/google/PROVENANCE.md +1022 -0
  510. package/presets/google/sources.json +192 -0
  511. package/presets/inclusive-language/PROVENANCE.md +174 -0
  512. package/presets/inclusive-language/sources.json +107 -0
  513. package/presets/microsoft/PROVENANCE.md +1555 -0
  514. package/presets/microsoft/sources.json +494 -0
  515. package/presets/plain-language/PROVENANCE.md +364 -0
  516. package/presets/plain-language/sources.json +108 -0
  517. package/dist/assertions/bullet-style.d.ts +0 -3
  518. package/dist/assertions/bullet-style.d.ts.map +0 -1
  519. package/dist/assertions/bullet-style.js +0 -60
  520. package/dist/assertions/bullet-style.js.map +0 -1
  521. package/dist/assertions/index.d.ts +0 -21
  522. package/dist/assertions/index.d.ts.map +0 -1
  523. package/dist/assertions/index.js +0 -30
  524. package/dist/assertions/index.js.map +0 -1
  525. package/dist/assertions/max-image-size.d.ts +0 -3
  526. package/dist/assertions/max-image-size.d.ts.map +0 -1
  527. package/dist/assertions/max-image-size.js +0 -73
  528. package/dist/assertions/max-image-size.js.map +0 -1
  529. package/dist/assertions/max-line-length.d.ts +0 -3
  530. package/dist/assertions/max-line-length.d.ts.map +0 -1
  531. package/dist/assertions/max-line-length.js +0 -68
  532. package/dist/assertions/max-line-length.js.map +0 -1
  533. package/dist/assertions/no-broken-fragment-links.d.ts +0 -3
  534. package/dist/assertions/no-broken-fragment-links.d.ts.map +0 -1
  535. package/dist/assertions/no-broken-fragment-links.js +0 -79
  536. package/dist/assertions/no-broken-fragment-links.js.map +0 -1
  537. package/dist/assertions/no-duplicate-headings.d.ts +0 -3
  538. package/dist/assertions/no-duplicate-headings.d.ts.map +0 -1
  539. package/dist/assertions/no-duplicate-headings.js +0 -66
  540. package/dist/assertions/no-duplicate-headings.js.map +0 -1
  541. package/dist/assertions/no-hard-tabs.d.ts +0 -3
  542. package/dist/assertions/no-hard-tabs.d.ts.map +0 -1
  543. package/dist/assertions/no-hard-tabs.js +0 -63
  544. package/dist/assertions/no-hard-tabs.js.map +0 -1
  545. package/dist/assertions/no-trailing-spaces.d.ts +0 -3
  546. package/dist/assertions/no-trailing-spaces.d.ts.map +0 -1
  547. package/dist/assertions/no-trailing-spaces.js +0 -72
  548. package/dist/assertions/no-trailing-spaces.js.map +0 -1
  549. package/dist/assertions/pattern.d.ts +0 -3
  550. package/dist/assertions/pattern.d.ts.map +0 -1
  551. package/dist/assertions/pattern.js +0 -39
  552. package/dist/assertions/pattern.js.map +0 -1
  553. package/dist/assertions/semantic-line-breaks.d.ts +0 -3
  554. package/dist/assertions/semantic-line-breaks.d.ts.map +0 -1
  555. package/dist/assertions/semantic-line-breaks.js +0 -152
  556. package/dist/assertions/semantic-line-breaks.js.map +0 -1
  557. package/dist/assertions/swap.d.ts +0 -3
  558. package/dist/assertions/swap.d.ts.map +0 -1
  559. package/dist/assertions/swap.js +0 -39
  560. package/dist/assertions/swap.js.map +0 -1
  561. package/dist/assertions/utils.d.ts +0 -8
  562. package/dist/assertions/utils.d.ts.map +0 -1
  563. package/dist/assertions/utils.js.map +0 -1
  564. package/dist/core/scope-parser.d.ts +0 -26
  565. package/dist/core/scope-parser.d.ts.map +0 -1
  566. package/dist/core/scope-parser.js +0 -110
  567. package/dist/core/scope-parser.js.map +0 -1
  568. package/dist/files.d.ts +0 -2
  569. package/dist/files.d.ts.map +0 -1
  570. package/dist/files.js +0 -39
  571. package/dist/files.js.map +0 -1
  572. package/dist/load-config.d.ts +0 -25
  573. package/dist/load-config.d.ts.map +0 -1
  574. package/dist/load-config.js +0 -104
  575. package/dist/load-config.js.map +0 -1
  576. package/dist/load.d.ts +0 -25
  577. package/dist/load.d.ts.map +0 -1
  578. package/dist/load.js +0 -112
  579. package/dist/load.js.map +0 -1
  580. package/dist/scope.d.ts +0 -26
  581. package/dist/scope.d.ts.map +0 -1
  582. package/dist/scope.js +0 -110
  583. package/dist/scope.js.map +0 -1
  584. package/dist/types.d.ts +0 -109
  585. package/dist/types.d.ts.map +0 -1
  586. package/dist/types.js.map +0 -1
  587. package/dist/validate.d.ts +0 -31
  588. package/dist/validate.d.ts.map +0 -1
  589. package/dist/validate.js +0 -154
  590. package/dist/validate.js.map +0 -1
  591. /package/dist/{types.js → parser/types.js} +0 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Plain-prose text statistics feeding the readability formulas in
3
+ * `formulas.ts`. This module is pure -- no rules/, core/runner, or config/
4
+ * imports, and no markdown parsing: callers (e.g. the `metric` assertion)
5
+ * extract a plain prose string out of markdown first.
6
+ */
7
+ export interface TextStatistics {
8
+ words: number;
9
+ sentences: number;
10
+ syllables: number;
11
+ /** Letters + digits only -- excludes punctuation and whitespace. Used by the automated-readability and coleman-liau formulas. */
12
+ characters: number;
13
+ /**
14
+ * Words with 3+ syllables per the `countSyllables` heuristic below (no
15
+ * proper-noun or suffix carve-outs).
16
+ */
17
+ complexWords: number;
18
+ }
19
+ export declare function tokenizeWords(prose: string): string[];
20
+ /**
21
+ * Computes word/sentence/syllable/character/complex-word statistics for a
22
+ * plain prose string. `sentences` is delegated to `scopes/sentences.ts`'s
23
+ * `splitSentences` so the whole codebase shares one sentence-boundary
24
+ * definition.
25
+ */
26
+ export declare function computeTextStatistics(prose: string): TextStatistics;
27
+ //# sourceMappingURL=statistics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../src/metrics/statistics.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iIAAiI;IACjI,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAmBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAgBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAcnE"}
@@ -0,0 +1,56 @@
1
+ import { splitSentences } from '../scopes/sentences.js';
2
+ // A "word" is a maximal whitespace-delimited token containing at least one
3
+ // ASCII letter or digit: punctuation-only tokens (a lone "--" or "...")
4
+ // don't count, while hyphenated compounds ("well-known") and contractions
5
+ // ("don't") count as ONE word each. Tokenization is ASCII-only throughout
6
+ // this module (here, the syllable heuristic, and the `characters` count),
7
+ // so scores are meaningful for English prose.
8
+ //
9
+ // Exported deliberately -- there are exactly two consumers, and they must
10
+ // share one implementation: `computeTextStatistics` below (readability
11
+ // formulas) and the `length` scope assertion's `unit: 'words'` measurement
12
+ // (rules/scope/length.ts). If `length` grew its own word-counting regex,
13
+ // its word counts could silently drift from `metric`'s (e.g. a Microsoft
14
+ // preset rule capping alt text at N words would disagree with a readability
15
+ // rule scoring the same text) -- a duplicate here would be a correctness
16
+ // bug, not just repeated code, so this is a shared-utility export, not the
17
+ // "new rule's only consumer" shape a reviewer should otherwise flag (see
18
+ // task-6-resolutions.md item 4).
19
+ export function tokenizeWords(prose) {
20
+ return prose.split(/\s+/).filter((token) => /[A-Za-z0-9]/.test(token));
21
+ }
22
+ // Syllable heuristic: count vowel groups (/[aeiouy]+/, lowercase); subtract
23
+ // one for a silent trailing 'e' unless the word ends in 'le' ("table");
24
+ // minimum of 1. The token is first reduced to lowercase letters, hyphens,
25
+ // and apostrophes so attached punctuation ("make,") can't defeat the
26
+ // trailing-e check; hyphens/apostrophes are kept because they act as real
27
+ // syllable boundaries ("co-op" is 2 vowel groups, "coop" is 1).
28
+ function countSyllables(word) {
29
+ const clean = word.toLowerCase().replace(/[^a-z'-]/g, '');
30
+ const groups = clean.match(/[aeiouy]+/g) ?? [];
31
+ let count = groups.length;
32
+ if (clean.endsWith('e') && !clean.endsWith('le'))
33
+ count -= 1;
34
+ return Math.max(1, count);
35
+ }
36
+ /**
37
+ * Computes word/sentence/syllable/character/complex-word statistics for a
38
+ * plain prose string. `sentences` is delegated to `scopes/sentences.ts`'s
39
+ * `splitSentences` so the whole codebase shares one sentence-boundary
40
+ * definition.
41
+ */
42
+ export function computeTextStatistics(prose) {
43
+ const words = tokenizeWords(prose);
44
+ const sentences = splitSentences(prose).length;
45
+ const characters = (prose.match(/[A-Za-z0-9]/g) ?? []).length;
46
+ let syllables = 0;
47
+ let complexWords = 0;
48
+ for (const word of words) {
49
+ const count = countSyllables(word);
50
+ syllables += count;
51
+ if (count >= 3)
52
+ complexWords += 1;
53
+ }
54
+ return { words: words.length, sentences, syllables, characters, complexWords };
55
+ }
56
+ //# sourceMappingURL=statistics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../src/metrics/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAqBxD,2EAA2E;AAC3E,wEAAwE;AACxE,0EAA0E;AAC1E,0EAA0E;AAC1E,0EAA0E;AAC1E,8CAA8C;AAC9C,EAAE;AACF,0EAA0E;AAC1E,uEAAuE;AACvE,2EAA2E;AAC3E,yEAAyE;AACzE,yEAAyE;AACzE,4EAA4E;AAC5E,yEAAyE;AACzE,2EAA2E;AAC3E,yEAAyE;AACzE,iCAAiC;AACjC,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,4EAA4E;AAC5E,wEAAwE;AACxE,0EAA0E;AAC1E,qEAAqE;AACrE,0EAA0E;AAC1E,gEAAgE;AAChE,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1B,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAE9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACnC,SAAS,IAAI,KAAK,CAAC;QACnB,IAAI,KAAK,IAAI,CAAC;YAAE,YAAY,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACjF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Token, TokenTree } from './types.js';
2
+ export type { Token, TokenTree } from './types.js';
3
+ export interface ParseOptions {
4
+ markdoc?: boolean;
5
+ }
6
+ export declare function parseMarkdown(content: string, options?: ParseOptions): TokenTree;
7
+ /**
8
+ * Filters the tree's flat token list by type. By default, tokens produced
9
+ * by reparsing an `htmlFlow` block (see `reparseHtmlFlow` above) are
10
+ * EXCLUDED -- matching upstream markdownlint's own `filterByTypes(tokens,
11
+ * types, htmlFlow)` helper, whose `htmlFlow` parameter defaults to falsy.
12
+ * Pass `includeHtmlFlow: true` for rules that explicitly want to see
13
+ * inside HTML blocks too (upstream's MD033/no-inline-html and
14
+ * MD045/no-alt-text opt in this way; see their recheck ports for the same
15
+ * opt-in).
16
+ */
17
+ export declare function filterByTypes(tree: TokenTree, types: readonly string[], includeHtmlFlow?: boolean): Token[];
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAInD,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA8InD,MAAM,WAAW,YAAY;IAI3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,SAAS,CAUpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,eAAe,UAAQ,GACtB,KAAK,EAAE,CAIT"}
@@ -0,0 +1,168 @@
1
+ // Micromark wrapper producing Recheck's public TokenTree.
2
+ // Event-to-tree construction adapted from markdownlint's lib/micromark-parse.mjs
3
+ // (https://github.com/DavidAnson/markdownlint, MIT © David Anson).
4
+ import { parse, postprocess, preprocess } from 'micromark';
5
+ import { directive } from 'micromark-extension-directive';
6
+ import { frontmatter } from 'micromark-extension-frontmatter';
7
+ import { gfmAutolinkLiteral } from 'micromark-extension-gfm-autolink-literal';
8
+ import { gfmFootnote } from 'micromark-extension-gfm-footnote';
9
+ import { gfmTable } from 'micromark-extension-gfm-table';
10
+ import { math } from 'micromark-extension-math';
11
+ import { markdocSyntax } from './markdoc/syntax.js';
12
+ import { structureMarkdocTags } from './markdoc/structure.js';
13
+ const baseExtensions = [
14
+ directive(),
15
+ gfmAutolinkLiteral(),
16
+ gfmFootnote(),
17
+ gfmTable(),
18
+ math(),
19
+ frontmatter(['yaml']),
20
+ ];
21
+ // Forces htmlFlow (block HTML) regions to be reparsed as if they were
22
+ // regular inline content -- disabling the `codeIndented`/`htmlFlow` block
23
+ // constructs makes micromark fall through to paragraph/inline tokenization
24
+ // for the same text, which is exactly what upstream markdownlint's own
25
+ // `micromark-parse.mjs` shim does (it disables the identical pair) to
26
+ // produce real `htmlText` tokens for tags inside HTML blocks. See
27
+ // `reparseHtmlFlow` below.
28
+ const htmlFlowReparseExtension = { disable: { null: ['codeIndented', 'htmlFlow'] } };
29
+ function getEvents(content, extensions) {
30
+ const parseContext = parse({ extensions });
31
+ const chunks = preprocess()(content, undefined, true);
32
+ return postprocess(parseContext.document().write(chunks));
33
+ }
34
+ /**
35
+ * Builds a Token tree from a flat micromark event list. `lineOffset` and
36
+ * `firstLineColumnOffset` translate positions that are relative to
37
+ * `content` (starting at line 1, column 1) into the surrounding
38
+ * document's coordinate space -- used by `reparseHtmlFlow` below to splice
39
+ * a reparsed `htmlFlow` block's tokens back in at their real position.
40
+ * `content` itself must already be the exact document (or sub-region)
41
+ * text so `start.offset`/`end.offset` slicing stays correct.
42
+ */
43
+ function buildTree(events, content, lineOffset = 0, firstLineColumnOffset = 0) {
44
+ const children = [];
45
+ const flat = [];
46
+ const stack = [];
47
+ const adjustLine = (line) => line + lineOffset;
48
+ const adjustColumn = (line, column) => line === 1 ? column + firstLineColumnOffset : column;
49
+ for (const event of events) {
50
+ const [kind, mmToken] = event;
51
+ if (kind === 'enter') {
52
+ const parent = stack[stack.length - 1] ?? null;
53
+ const token = {
54
+ type: mmToken.type,
55
+ startLine: adjustLine(mmToken.start.line),
56
+ startColumn: adjustColumn(mmToken.start.line, mmToken.start.column),
57
+ endLine: adjustLine(mmToken.end.line),
58
+ endColumn: adjustColumn(mmToken.end.line, mmToken.end.column),
59
+ text: '',
60
+ children: [],
61
+ parent,
62
+ };
63
+ (parent ? parent.children : children).push(token);
64
+ flat.push(token);
65
+ stack.push(token);
66
+ }
67
+ else {
68
+ const token = stack.pop();
69
+ if (token) {
70
+ // Slice from the original content via absolute offsets rather than
71
+ // `context.sliceSerialize`. Nested/subtokenized content (e.g. list
72
+ // items containing sublists) can leave an exit event's `context`
73
+ // pointing at a tokenizer buffer that no longer covers this token,
74
+ // crashing `sliceSerialize`. `start.offset`/`end.offset` are stable
75
+ // document-absolute positions, so slicing `content` directly avoids
76
+ // depending on which context object emitted the event, matching
77
+ // markdownlint's lib/micromark-parse.mjs `getText` helper (MIT).
78
+ token.text = content.slice(mmToken.start.offset, mmToken.end.offset);
79
+ token.endLine = adjustLine(mmToken.end.line);
80
+ token.endColumn = adjustColumn(mmToken.end.line, mmToken.end.column);
81
+ }
82
+ }
83
+ }
84
+ return { children, flat };
85
+ }
86
+ /**
87
+ * Returns true iff the token is an HTML comment (`<!-- ... -->`) that is
88
+ * valid per the CommonMark spec. Duplicated (narrowly) from
89
+ * rules/token/helpers.ts's `isHtmlFlowComment` rather than imported --
90
+ * that module is rule-layer code that itself depends on parser types, and
91
+ * this parser module must not depend back on the rules layer.
92
+ */
93
+ function isHtmlFlowComment(token) {
94
+ const { text, type } = token;
95
+ if (type === 'htmlFlow' && text.startsWith('<!--') && text.endsWith('-->')) {
96
+ const comment = text.slice(4, -3);
97
+ return !comment.startsWith('>') && !comment.startsWith('->') && !comment.endsWith('-');
98
+ }
99
+ return false;
100
+ }
101
+ /**
102
+ * Re-tokenizes every non-comment `htmlFlow` (block HTML) token's own text
103
+ * as inline content, splicing the result in as that token's children (and
104
+ * into `flat`) so rules that look for `htmlText` tokens (e.g. MD033
105
+ * no-inline-html) see tags inside HTML blocks -- not just genuinely
106
+ * inline HTML -- exactly like upstream markdownlint (see
107
+ * `htmlFlowReparseExtension`'s doc comment). Mutates `tree.flat` in place;
108
+ * `tree.children` already references the same token objects, so no
109
+ * further mutation is needed there.
110
+ *
111
+ * A block like:
112
+ * <details>
113
+ * <summary>Text</summary>
114
+ * is ONE `htmlFlow` token whose raw text spans both lines; reparsing it
115
+ * with `codeIndented`/`htmlFlow` disabled naturally produces `htmlText`
116
+ * tokens for `<details>`, `<summary>`, and `</summary>` as descendants,
117
+ * which is what makes the fix work even when multiple tags/lines are
118
+ * inside a single flow block.
119
+ */
120
+ function reparseHtmlFlow(tree) {
121
+ const htmlFlowTokens = tree.flat.filter((token) => token.type === 'htmlFlow' && !isHtmlFlowComment(token));
122
+ for (const token of htmlFlowTokens) {
123
+ const events = getEvents(token.text, [...baseExtensions, htmlFlowReparseExtension]);
124
+ const reparsed = buildTree(events, token.text, token.startLine - 1, token.startColumn - 1);
125
+ // Re-parent every reparsed token onto the original htmlFlow token, mark
126
+ // it `inHtmlFlow` (see Token's doc comment -- lets `filterByTypes`
127
+ // exclude this synthetic content by default, matching upstream), and
128
+ // add them all to the shared flat list. The htmlFlow token's OWN
129
+ // top-level type/text/position are left untouched -- only its
130
+ // (previously empty-of-inline-tags) children are replaced.
131
+ for (const descendant of reparsed.flat)
132
+ descendant.inHtmlFlow = true;
133
+ for (const child of reparsed.children)
134
+ child.parent = token;
135
+ token.children = reparsed.children;
136
+ // Push one-by-one: spreading an unbounded array as arguments overflows
137
+ // the call stack on huge HTML blocks (tens of thousands of lines), and
138
+ // this pass must never throw on a large document.
139
+ for (const descendant of reparsed.flat)
140
+ tree.flat.push(descendant);
141
+ }
142
+ }
143
+ export function parseMarkdown(content, options = {}) {
144
+ // With the flag off, the extension list and the post-passes are identical to
145
+ // a parse that knows nothing about Markdoc -- `markdocSyntax()` is never even
146
+ // instantiated -- so the tree stays byte-identical by construction.
147
+ const extensions = options.markdoc ? [...baseExtensions, markdocSyntax(content)] : baseExtensions;
148
+ const events = getEvents(content, extensions);
149
+ const tree = buildTree(events, content);
150
+ reparseHtmlFlow(tree);
151
+ if (options.markdoc)
152
+ structureMarkdocTags(tree);
153
+ return tree;
154
+ }
155
+ /**
156
+ * Filters the tree's flat token list by type. By default, tokens produced
157
+ * by reparsing an `htmlFlow` block (see `reparseHtmlFlow` above) are
158
+ * EXCLUDED -- matching upstream markdownlint's own `filterByTypes(tokens,
159
+ * types, htmlFlow)` helper, whose `htmlFlow` parameter defaults to falsy.
160
+ * Pass `includeHtmlFlow: true` for rules that explicitly want to see
161
+ * inside HTML blocks too (upstream's MD033/no-inline-html and
162
+ * MD045/no-alt-text opt in this way; see their recheck ports for the same
163
+ * opt-in).
164
+ */
165
+ export function filterByTypes(tree, types, includeHtmlFlow = false) {
166
+ return tree.flat.filter((token) => types.includes(token.type) && (includeHtmlFlow || !token.inHtmlFlow));
167
+ }
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { MarkdocAttributeSchema, MarkdocSchema } from './schema.js';
2
+ /** Enough of a real Markdoc `Config['tags'][name]['attributes'][name]` entry to extract statics from. */
3
+ export interface RawMarkdocAttribute {
4
+ type?: unknown;
5
+ required?: boolean;
6
+ default?: unknown;
7
+ matches?: unknown;
8
+ }
9
+ /** Enough of a real Markdoc `Config['tags'][name]` entry to extract statics from. */
10
+ export interface RawMarkdocTag {
11
+ selfClosing?: boolean;
12
+ attributes?: Record<string, RawMarkdocAttribute>;
13
+ validate?: unknown;
14
+ }
15
+ export type RawMarkdocTagMap = Record<string, RawMarkdocTag>;
16
+ /**
17
+ * Converts one raw Markdoc attribute definition into recheck's
18
+ * `MarkdocAttributeSchema`.
19
+ *
20
+ * `tagHasValidate` forces `dynamic: true` regardless of this attribute's own
21
+ * type. A tag-level `validate()` -- for example `img`'s src/srcSet/images
22
+ * mutual-exclusivity check, `code-snippet`'s from/after and to/before checks,
23
+ * or `diagram`'s type/align re-checks -- can read and reject any of the tag's
24
+ * attributes for reasons this generator can't discover from the schema object
25
+ * alone, since that would mean analyzing an arbitrary JS function body. So
26
+ * every attribute of a `validate()`-carrying tag is conservatively marked
27
+ * dynamic, even one with a plain `String`/`Number`/`Boolean` type and a
28
+ * `matches` array (`img.align`, `diagram.type`).
29
+ *
30
+ * Recorded facets (`required`, `default`, `enum`) are kept even when dynamic:
31
+ * `dynamic` only tells a value-checking rule to skip them, it doesn't make the
32
+ * facet itself unknown.
33
+ */
34
+ export declare function extractAttribute(rawAttribute: RawMarkdocAttribute, tagHasValidate: boolean): MarkdocAttributeSchema;
35
+ /**
36
+ * Composes three raw Markdoc tag maps in caller-chosen precedence order
37
+ * (later arguments win a name collision) and converts every tag to recheck's
38
+ * statics-only `MarkdocSchema`. Both callers share this precedence-then-convert
39
+ * shape: the built-in generator composes markdoc + portal + theme in Realm's
40
+ * own override order; the `recheck markdoc-schema` command extracts one
41
+ * project module's tags at a time and passes empty maps for the other two, so
42
+ * the composition is a no-op and only that module's tags come out.
43
+ */
44
+ export declare function extractStatics(themeTagMap: RawMarkdocTagMap, markdocBuiltinTags: RawMarkdocTagMap, portalBuiltInTagMap: RawMarkdocTagMap): MarkdocSchema;
45
+ //# sourceMappingURL=extract-statics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-statics.d.ts","sourceRoot":"","sources":["../../../src/parser/markdoc/extract-statics.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,sBAAsB,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3F,yGAAyG;AACzG,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAe7D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,mBAAmB,EACjC,cAAc,EAAE,OAAO,GACtB,sBAAsB,CAoDxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,gBAAgB,EAC7B,kBAAkB,EAAE,gBAAgB,EACpC,mBAAmB,EAAE,gBAAgB,GACpC,aAAa,CA+Bf"}
@@ -0,0 +1,139 @@
1
+ // The single implementation of "a real Markdoc tag map -> recheck's
2
+ // statics-only MarkdocSchema". Two callers share it and must never define
3
+ // "what counts as a static facet" two different ways:
4
+ // - `scripts/generate-markdoc-schema.mjs`, which resolves Realm's composed
5
+ // built-in schema (markdoc + portal + theme) for the committed
6
+ // `src/data/markdoc-realm-schema.ts`, and re-exports these functions
7
+ // unchanged so its own drift test keeps working.
8
+ // - `src/commands/markdoc-schema.ts`, the `recheck markdoc-schema` CLI
9
+ // command, which extracts statics from a project's own schema module(s).
10
+ //
11
+ // Lives under `src/` (not `scripts/`) so the built CLI can import it at
12
+ // runtime: `scripts/`'s own generator imports `@redocly/theme` and
13
+ // `@redocly/portal`, both devDependencies-only, and this module must stay
14
+ // free of any such import so requiring it from a published package never
15
+ // drags those in.
16
+ //
17
+ // Raw tag/attribute shapes are typed loosely here rather than imported from
18
+ // `@markdoc/markdoc` (also a devDependency-only): this module's declaration
19
+ // file ships with the published package, and a type-only import still leaves
20
+ // a reference downstream consumers' own type-checking would need
21
+ // `@markdoc/markdoc` installed to resolve.
22
+ // The three attribute-type constructors recheck's own format can represent
23
+ // (see MarkdocAttributeSchema's doc comment in ./schema.ts). Every other
24
+ // upstream type -- `Object`, `Array`, a union like `[String, Number]`, a
25
+ // custom class implementing `CustomAttributeTypeInterface` (`RelativePath`,
26
+ // `PartialFile`, ...), or no `type` at all (`debug`'s bare `{ value: {} }`) --
27
+ // has no faithful single-primitive representative, so it's recorded
28
+ // `dynamic: true` instead of guessing.
29
+ const PRIMITIVE_TYPE_NAMES = new Map([
30
+ [String, 'string'],
31
+ [Number, 'number'],
32
+ [Boolean, 'boolean'],
33
+ ]);
34
+ /**
35
+ * Converts one raw Markdoc attribute definition into recheck's
36
+ * `MarkdocAttributeSchema`.
37
+ *
38
+ * `tagHasValidate` forces `dynamic: true` regardless of this attribute's own
39
+ * type. A tag-level `validate()` -- for example `img`'s src/srcSet/images
40
+ * mutual-exclusivity check, `code-snippet`'s from/after and to/before checks,
41
+ * or `diagram`'s type/align re-checks -- can read and reject any of the tag's
42
+ * attributes for reasons this generator can't discover from the schema object
43
+ * alone, since that would mean analyzing an arbitrary JS function body. So
44
+ * every attribute of a `validate()`-carrying tag is conservatively marked
45
+ * dynamic, even one with a plain `String`/`Number`/`Boolean` type and a
46
+ * `matches` array (`img.align`, `diagram.type`).
47
+ *
48
+ * Recorded facets (`required`, `default`, `enum`) are kept even when dynamic:
49
+ * `dynamic` only tells a value-checking rule to skip them, it doesn't make the
50
+ * facet itself unknown.
51
+ */
52
+ export function extractAttribute(rawAttribute, tagHasValidate) {
53
+ const rawType = rawAttribute.type;
54
+ const primitiveName = typeof rawType === 'function' ? PRIMITIVE_TYPE_NAMES.get(rawType) : undefined;
55
+ // `type` is non-optional in MarkdocAttributeSchema, and 'string' is the
56
+ // placeholder for anything non-primitive. It's a faithful placeholder
57
+ // rather than an arbitrary one: every custom attribute type in
58
+ // packages/theme (RelativePath, PartialFile, CodeSnippetFile, ...)
59
+ // implements `validate(value: string)`, so the wire value is always a
60
+ // string even when the class does extra work with it. A dynamic attribute
61
+ // is never value-checked anyway -- only the presence of `type` satisfies
62
+ // the interface.
63
+ const out = { type: primitiveName ?? 'string' };
64
+ if (rawAttribute.required === true)
65
+ out.required = true;
66
+ // `MarkdocAttributeSchema.default` can only hold a JSON primitive, and some
67
+ // defaults aren't one: `connect-mcp`'s `options` attribute defaults to an
68
+ // array (`['cursor', 'vscode', 'copy']`), which the interface has no slot
69
+ // for. Recording it would produce a schema that doesn't type-check against
70
+ // its own interface, so drop it rather than guess a representation.
71
+ // Nothing is lost: a non-primitive default always pairs with a
72
+ // non-primitive `type`, so the attribute is already `dynamic: true` and no
73
+ // value check reads its default.
74
+ const defaultType = typeof rawAttribute.default;
75
+ if (defaultType === 'string' || defaultType === 'number' || defaultType === 'boolean') {
76
+ out.default = rawAttribute.default;
77
+ }
78
+ // Markdoc's `matches` isn't always an array -- it can also be a RegExp or a
79
+ // predicate function -- and even when it is an array, its entries aren't
80
+ // guaranteed to be strings. `MarkdocAttributeSchema.enum` is
81
+ // `readonly string[]`, so:
82
+ // - A non-array `matches` can't be represented as an enum at all, so it
83
+ // falls back to `dynamic: true` like a class-typed attribute or a
84
+ // `validate()`-carrying tag. Don't guess at a constraint this can't
85
+ // statically resolve.
86
+ // - An array `matches` with non-string entries is representable, just not
87
+ // verbatim, so coerce it with `String(...)` rather than marking it
88
+ // dynamic. The enum value check compares a parsed attribute literal's
89
+ // source text against the declared enum -- a string comparison either
90
+ // way -- so a coerced `'1'`/`'true'` is exactly what it needs.
91
+ if (rawAttribute.matches !== undefined) {
92
+ if (Array.isArray(rawAttribute.matches)) {
93
+ if (rawAttribute.matches.length > 0) {
94
+ out.enum = rawAttribute.matches.map((value) => String(value));
95
+ }
96
+ }
97
+ else {
98
+ out.dynamic = true;
99
+ }
100
+ }
101
+ if (primitiveName === undefined || tagHasValidate)
102
+ out.dynamic = true;
103
+ return out;
104
+ }
105
+ /**
106
+ * Composes three raw Markdoc tag maps in caller-chosen precedence order
107
+ * (later arguments win a name collision) and converts every tag to recheck's
108
+ * statics-only `MarkdocSchema`. Both callers share this precedence-then-convert
109
+ * shape: the built-in generator composes markdoc + portal + theme in Realm's
110
+ * own override order; the `recheck markdoc-schema` command extracts one
111
+ * project module's tags at a time and passes empty maps for the other two, so
112
+ * the composition is a no-op and only that module's tags come out.
113
+ */
114
+ export function extractStatics(themeTagMap, markdocBuiltinTags, portalBuiltInTagMap) {
115
+ const composed = { ...markdocBuiltinTags, ...portalBuiltInTagMap, ...themeTagMap };
116
+ const tagNames = Object.keys(composed).sort();
117
+ const tags = {};
118
+ for (const tagName of tagNames) {
119
+ const rawSchema = composed[tagName];
120
+ const tagHasValidate = typeof rawSchema.validate === 'function';
121
+ const tagOut = {};
122
+ if (rawSchema.selfClosing === true)
123
+ tagOut.selfClosing = true;
124
+ const rawAttributes = rawSchema.attributes;
125
+ if (rawAttributes) {
126
+ const attributeNames = Object.keys(rawAttributes).sort();
127
+ if (attributeNames.length > 0) {
128
+ const attributesOut = {};
129
+ for (const attributeName of attributeNames) {
130
+ attributesOut[attributeName] = extractAttribute(rawAttributes[attributeName], tagHasValidate);
131
+ }
132
+ tagOut.attributes = attributesOut;
133
+ }
134
+ }
135
+ tags[tagName] = tagOut;
136
+ }
137
+ return { tags };
138
+ }
139
+ //# sourceMappingURL=extract-statics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-statics.js","sourceRoot":"","sources":["../../../src/parser/markdoc/extract-statics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Token, TokenTree } from '../types.js';
2
+ export interface MarkdocPair {
3
+ open: Token;
4
+ close: Token;
5
+ /**
6
+ * Nesting depth of `open` at the moment it was pushed: 0 for a top-level tag,
7
+ * 1 for a tag opened inside exactly one other, and so on. It stays fixed even
8
+ * when `close` jumps over an intervening unmatched open (see `crossed`), since
9
+ * it describes where `open` appeared, not where its match landed.
10
+ */
11
+ depth: number;
12
+ }
13
+ /**
14
+ * The five buckets are disjoint: a pair lands in `pairs` or `crossed` but never
15
+ * both, and a token appears in at most one bucket.
16
+ */
17
+ export interface MarkdocPairing {
18
+ /** Cleanly matched open/close pairs (no crossing involved on either side). */
19
+ pairs: MarkdocPair[];
20
+ /** Opens with no close by EOF (excluding schema-known void tags, below). */
21
+ unclosed: Token[];
22
+ /** Closes that match no open anywhere on the stack. */
23
+ orphaned: Token[];
24
+ /** Matched pairs whose open or close jumped, or was jumped by, another pair. */
25
+ crossed: MarkdocPair[];
26
+ /** Opens whose name is schema-declared self-closing, written without `/%}`. */
27
+ voidMissingSlash: Token[];
28
+ }
29
+ /**
30
+ * A "nothing was paired" result for callers that must still supply a
31
+ * `MarkdocPairing` but have no reason to run the pass -- the runner uses it when
32
+ * the Markdoc flag is on but no active rule can read the buckets anyway. A
33
+ * factory rather than a shared constant, because the buckets are mutable arrays
34
+ * and one shared instance would let an accidental push leak across files.
35
+ */
36
+ export declare function emptyMarkdocPairing(): MarkdocPairing;
37
+ export interface PairingOptions {
38
+ /**
39
+ * Tag names a schema declares self-closing. A plain `Set<string>` rather than
40
+ * a dependency on the schema module, so the schema's shape can change without
41
+ * this pass knowing anything beyond which names never take a close tag.
42
+ */
43
+ selfClosingTags?: ReadonlySet<string>;
44
+ }
45
+ /**
46
+ * Computes open/close pairing for a document's `markdocTag` tokens with a single
47
+ * stack walk in document order. The filtered list is sorted by position rather
48
+ * than trusting whatever order `tree.flat` happens to be in, since
49
+ * `structureMarkdocTags` (structure.ts) appends its own synthesized children to
50
+ * the end of that same array.
51
+ *
52
+ * Deliberate divergence from upstream Markdoc, which tests a close only against
53
+ * the immediate top of its stack and never searches deeper: for
54
+ * `{% a %}{% b %}{% /a %}{% /b %}` upstream reports a missing-closing plus a
55
+ * missing-opening and lets `a`'s node swallow everything to EOF, while this pass
56
+ * searches the whole stack innermost-first and reports both pairs as `crossed`.
57
+ * "These two pairs are interleaved" is the more actionable diagnostic, and a
58
+ * crossing can never silently land in `pairs`, so no error upstream reports is
59
+ * lost. The cost is that consumers relying on pair ranges see a narrower range
60
+ * for a crossed `open` than upstream's AST would give.
61
+ */
62
+ export declare function computeMarkdocPairing(tree: TokenTree, options?: PairingOptions): MarkdocPairing;
63
+ //# sourceMappingURL=pairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../../src/parser/markdoc/pairing.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;IACb;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,uDAAuD;IACvD,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,gFAAgF;IAChF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,+EAA+E;IAC/E,gBAAgB,EAAE,KAAK,EAAE,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC;AAmCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,cAAmB,GAC3B,cAAc,CAsDhB"}