@codeperfect/eslint-plugin 1.0.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 (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts +16 -0
  5. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.d.ts.map +1 -0
  6. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-listeners.js +131 -0
  7. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts +48 -0
  8. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.d.ts.map +1 -0
  9. package/dist/architecture/consistent-barrel-files/consistent-barrel-files-options.js +126 -0
  10. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts +40 -0
  11. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.d.ts.map +1 -0
  12. package/dist/architecture/consistent-barrel-files/exports-only-rule-test-utilities.js +90 -0
  13. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts +11 -0
  14. package/dist/architecture/consistent-barrel-files/exports-only-rule.d.ts.map +1 -0
  15. package/dist/architecture/consistent-barrel-files/exports-only-rule.js +218 -0
  16. package/dist/architecture/consistent-barrel-files/index.d.ts +5 -0
  17. package/dist/architecture/consistent-barrel-files/index.d.ts.map +1 -0
  18. package/dist/architecture/consistent-barrel-files/index.js +4 -0
  19. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts +11 -0
  20. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.d.ts.map +1 -0
  21. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-rule.js +100 -0
  22. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts +40 -0
  23. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.d.ts.map +1 -0
  24. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-test-utilities.js +90 -0
  25. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts +65 -0
  26. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.d.ts.map +1 -0
  27. package/dist/architecture/consistent-barrel-files/no-reexports-outside-barrels-utilities.js +154 -0
  28. package/dist/architecture/consistent-barrel-files/rule.d.ts +11 -0
  29. package/dist/architecture/consistent-barrel-files/rule.d.ts.map +1 -0
  30. package/dist/architecture/consistent-barrel-files/rule.js +58 -0
  31. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts +141 -0
  32. package/dist/architecture/consistent-barrel-files/test-helpers.d.ts.map +1 -0
  33. package/dist/architecture/consistent-barrel-files/test-helpers.js +229 -0
  34. package/dist/architecture/consistent-barrel-files/types.d.ts +25 -0
  35. package/dist/architecture/consistent-barrel-files/types.d.ts.map +1 -0
  36. package/dist/architecture/consistent-barrel-files/types.js +2 -0
  37. package/dist/architecture/index.d.ts +2 -0
  38. package/dist/architecture/index.d.ts.map +1 -0
  39. package/dist/architecture/index.js +2 -0
  40. package/dist/benchmark-rules.d.ts +83 -0
  41. package/dist/benchmark-rules.d.ts.map +1 -0
  42. package/dist/benchmark-rules.js +175 -0
  43. package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
  44. package/dist/codeperfect-plugin.d.ts +46 -0
  45. package/dist/codeperfect-plugin.d.ts.map +1 -0
  46. package/dist/codeperfect-plugin.js +29 -0
  47. package/dist/core/index.d.ts +3 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +3 -0
  50. package/dist/core/no-multiple-declarators/index.d.ts +2 -0
  51. package/dist/core/no-multiple-declarators/index.d.ts.map +1 -0
  52. package/dist/core/no-multiple-declarators/index.js +2 -0
  53. package/dist/core/no-multiple-declarators/rule.d.ts +4 -0
  54. package/dist/core/no-multiple-declarators/rule.d.ts.map +1 -0
  55. package/dist/core/no-multiple-declarators/rule.js +100 -0
  56. package/dist/core/prefer-interface-types/index.d.ts +2 -0
  57. package/dist/core/prefer-interface-types/index.d.ts.map +1 -0
  58. package/dist/core/prefer-interface-types/index.js +2 -0
  59. package/dist/core/prefer-interface-types/rule.d.ts +5 -0
  60. package/dist/core/prefer-interface-types/rule.d.ts.map +1 -0
  61. package/dist/core/prefer-interface-types/rule.js +145 -0
  62. package/dist/core/prefer-interface-types/test-helpers.d.ts +110 -0
  63. package/dist/core/prefer-interface-types/test-helpers.d.ts.map +1 -0
  64. package/dist/core/prefer-interface-types/test-helpers.js +116 -0
  65. package/dist/custom-rule-documentation.d.ts +36 -0
  66. package/dist/custom-rule-documentation.d.ts.map +1 -0
  67. package/dist/custom-rule-documentation.js +35 -0
  68. package/dist/custom-rules.d.ts +61 -0
  69. package/dist/custom-rules.d.ts.map +1 -0
  70. package/dist/custom-rules.js +70 -0
  71. package/dist/docs/index.d.ts +4 -0
  72. package/dist/docs/index.d.ts.map +1 -0
  73. package/dist/docs/index.js +4 -0
  74. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts +89 -0
  75. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.d.ts.map +1 -0
  76. package/dist/docs/no-interface-member-docs/comment-utilities-test-helpers.js +129 -0
  77. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts +48 -0
  78. package/dist/docs/no-interface-member-docs/comment-utilities.d.ts.map +1 -0
  79. package/dist/docs/no-interface-member-docs/comment-utilities.js +146 -0
  80. package/dist/docs/no-interface-member-docs/index.d.ts +2 -0
  81. package/dist/docs/no-interface-member-docs/index.d.ts.map +1 -0
  82. package/dist/docs/no-interface-member-docs/index.js +2 -0
  83. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts +13 -0
  84. package/dist/docs/no-interface-member-docs/parameter-tags.d.ts.map +1 -0
  85. package/dist/docs/no-interface-member-docs/parameter-tags.js +101 -0
  86. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts +24 -0
  87. package/dist/docs/no-interface-member-docs/parameter-utilities.d.ts.map +1 -0
  88. package/dist/docs/no-interface-member-docs/parameter-utilities.js +125 -0
  89. package/dist/docs/no-interface-member-docs/rule.d.ts +5 -0
  90. package/dist/docs/no-interface-member-docs/rule.d.ts.map +1 -0
  91. package/dist/docs/no-interface-member-docs/rule.js +168 -0
  92. package/dist/docs/no-interface-member-docs/test-helpers.d.ts +103 -0
  93. package/dist/docs/no-interface-member-docs/test-helpers.d.ts.map +1 -0
  94. package/dist/docs/no-interface-member-docs/test-helpers.js +157 -0
  95. package/dist/docs/no-interface-member-docs/types.d.ts +30 -0
  96. package/dist/docs/no-interface-member-docs/types.d.ts.map +1 -0
  97. package/dist/docs/no-interface-member-docs/types.js +2 -0
  98. package/dist/docs/require-example-language/empty-fence-fixes.d.ts +29 -0
  99. package/dist/docs/require-example-language/empty-fence-fixes.d.ts.map +1 -0
  100. package/dist/docs/require-example-language/empty-fence-fixes.js +169 -0
  101. package/dist/docs/require-example-language/example-utilities.d.ts +70 -0
  102. package/dist/docs/require-example-language/example-utilities.d.ts.map +1 -0
  103. package/dist/docs/require-example-language/example-utilities.js +76 -0
  104. package/dist/docs/require-example-language/examples.d.ts +36 -0
  105. package/dist/docs/require-example-language/examples.d.ts.map +1 -0
  106. package/dist/docs/require-example-language/examples.js +181 -0
  107. package/dist/docs/require-example-language/fixes.d.ts +49 -0
  108. package/dist/docs/require-example-language/fixes.d.ts.map +1 -0
  109. package/dist/docs/require-example-language/fixes.js +182 -0
  110. package/dist/docs/require-example-language/index.d.ts +3 -0
  111. package/dist/docs/require-example-language/index.d.ts.map +1 -0
  112. package/dist/docs/require-example-language/index.js +2 -0
  113. package/dist/docs/require-example-language/reporting.d.ts +60 -0
  114. package/dist/docs/require-example-language/reporting.d.ts.map +1 -0
  115. package/dist/docs/require-example-language/reporting.js +145 -0
  116. package/dist/docs/require-example-language/rule.d.ts +7 -0
  117. package/dist/docs/require-example-language/rule.d.ts.map +1 -0
  118. package/dist/docs/require-example-language/rule.js +34 -0
  119. package/dist/docs/require-example-language/types.d.ts +22 -0
  120. package/dist/docs/require-example-language/types.d.ts.map +1 -0
  121. package/dist/docs/require-example-language/types.js +2 -0
  122. package/dist/docs/single-line-jsdoc/index.d.ts +2 -0
  123. package/dist/docs/single-line-jsdoc/index.d.ts.map +1 -0
  124. package/dist/docs/single-line-jsdoc/index.js +2 -0
  125. package/dist/docs/single-line-jsdoc/rule.d.ts +5 -0
  126. package/dist/docs/single-line-jsdoc/rule.d.ts.map +1 -0
  127. package/dist/docs/single-line-jsdoc/rule.js +196 -0
  128. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts +16 -0
  129. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.d.ts.map +1 -0
  130. package/dist/docs/single-line-jsdoc/single-line-jsdoc-content.js +95 -0
  131. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts +25 -0
  132. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.d.ts.map +1 -0
  133. package/dist/docs/single-line-jsdoc/single-line-jsdoc-utilities.js +140 -0
  134. package/dist/docs/test-helpers.d.ts +50 -0
  135. package/dist/docs/test-helpers.d.ts.map +1 -0
  136. package/dist/docs/test-helpers.js +107 -0
  137. package/dist/index.d.ts +6 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +6 -0
  140. package/dist/presets.d.ts +10 -0
  141. package/dist/presets.d.ts.map +1 -0
  142. package/dist/presets.js +50 -0
  143. package/dist/rules/index.d.ts +5 -0
  144. package/dist/rules/index.d.ts.map +1 -0
  145. package/dist/rules/index.js +6 -0
  146. package/dist/testing/aaa/analyzer.d.ts +36 -0
  147. package/dist/testing/aaa/analyzer.d.ts.map +1 -0
  148. package/dist/testing/aaa/analyzer.js +490 -0
  149. package/dist/testing/aaa/index.d.ts +3 -0
  150. package/dist/testing/aaa/index.d.ts.map +1 -0
  151. package/dist/testing/aaa/index.js +2 -0
  152. package/dist/testing/aaa/types.d.ts +31 -0
  153. package/dist/testing/aaa/types.d.ts.map +1 -0
  154. package/dist/testing/aaa/types.js +2 -0
  155. package/dist/testing/assert-actual-expected-names/index.d.ts +2 -0
  156. package/dist/testing/assert-actual-expected-names/index.d.ts.map +1 -0
  157. package/dist/testing/assert-actual-expected-names/index.js +2 -0
  158. package/dist/testing/assert-actual-expected-names/rule.d.ts +4 -0
  159. package/dist/testing/assert-actual-expected-names/rule.d.ts.map +1 -0
  160. package/dist/testing/assert-actual-expected-names/rule.js +54 -0
  161. package/dist/testing/enforce-aaa-phase-purity/index.d.ts +2 -0
  162. package/dist/testing/enforce-aaa-phase-purity/index.d.ts.map +1 -0
  163. package/dist/testing/enforce-aaa-phase-purity/index.js +2 -0
  164. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts +4 -0
  165. package/dist/testing/enforce-aaa-phase-purity/rule.d.ts.map +1 -0
  166. package/dist/testing/enforce-aaa-phase-purity/rule.js +110 -0
  167. package/dist/testing/enforce-aaa-structure/index.d.ts +2 -0
  168. package/dist/testing/enforce-aaa-structure/index.d.ts.map +1 -0
  169. package/dist/testing/enforce-aaa-structure/index.js +2 -0
  170. package/dist/testing/enforce-aaa-structure/rule.d.ts +4 -0
  171. package/dist/testing/enforce-aaa-structure/rule.d.ts.map +1 -0
  172. package/dist/testing/enforce-aaa-structure/rule.js +48 -0
  173. package/dist/testing/index.d.ts +9 -0
  174. package/dist/testing/index.d.ts.map +1 -0
  175. package/dist/testing/index.js +9 -0
  176. package/dist/testing/prefer-vi-mocked-import/fix.d.ts +16 -0
  177. package/dist/testing/prefer-vi-mocked-import/fix.d.ts.map +1 -0
  178. package/dist/testing/prefer-vi-mocked-import/fix.js +224 -0
  179. package/dist/testing/prefer-vi-mocked-import/index.d.ts +2 -0
  180. package/dist/testing/prefer-vi-mocked-import/index.d.ts.map +1 -0
  181. package/dist/testing/prefer-vi-mocked-import/index.js +2 -0
  182. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts +16 -0
  183. package/dist/testing/prefer-vi-mocked-import/match-bindings.d.ts.map +1 -0
  184. package/dist/testing/prefer-vi-mocked-import/match-bindings.js +52 -0
  185. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts +16 -0
  186. package/dist/testing/prefer-vi-mocked-import/match-declarations.d.ts.map +1 -0
  187. package/dist/testing/prefer-vi-mocked-import/match-declarations.js +99 -0
  188. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts +66 -0
  189. package/dist/testing/prefer-vi-mocked-import/match-helpers.d.ts.map +1 -0
  190. package/dist/testing/prefer-vi-mocked-import/match-helpers.js +102 -0
  191. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts +17 -0
  192. package/dist/testing/prefer-vi-mocked-import/match-imports.d.ts.map +1 -0
  193. package/dist/testing/prefer-vi-mocked-import/match-imports.js +156 -0
  194. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts +42 -0
  195. package/dist/testing/prefer-vi-mocked-import/match-rewrites.d.ts.map +1 -0
  196. package/dist/testing/prefer-vi-mocked-import/match-rewrites.js +119 -0
  197. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts +13 -0
  198. package/dist/testing/prefer-vi-mocked-import/match-walk.d.ts.map +1 -0
  199. package/dist/testing/prefer-vi-mocked-import/match-walk.js +62 -0
  200. package/dist/testing/prefer-vi-mocked-import/match.d.ts +15 -0
  201. package/dist/testing/prefer-vi-mocked-import/match.d.ts.map +1 -0
  202. package/dist/testing/prefer-vi-mocked-import/match.js +193 -0
  203. package/dist/testing/prefer-vi-mocked-import/rule.d.ts +5 -0
  204. package/dist/testing/prefer-vi-mocked-import/rule.d.ts.map +1 -0
  205. package/dist/testing/prefer-vi-mocked-import/rule.js +32 -0
  206. package/dist/testing/prefer-vi-mocked-import/types.d.ts +83 -0
  207. package/dist/testing/prefer-vi-mocked-import/types.d.ts.map +1 -0
  208. package/dist/testing/prefer-vi-mocked-import/types.js +2 -0
  209. package/dist/testing/require-aaa-sections/index.d.ts +2 -0
  210. package/dist/testing/require-aaa-sections/index.d.ts.map +1 -0
  211. package/dist/testing/require-aaa-sections/index.js +2 -0
  212. package/dist/testing/require-aaa-sections/rule.d.ts +4 -0
  213. package/dist/testing/require-aaa-sections/rule.d.ts.map +1 -0
  214. package/dist/testing/require-aaa-sections/rule.js +111 -0
  215. package/dist/testing/require-act-result-capture/index.d.ts +2 -0
  216. package/dist/testing/require-act-result-capture/index.d.ts.map +1 -0
  217. package/dist/testing/require-act-result-capture/index.js +2 -0
  218. package/dist/testing/require-act-result-capture/rule.d.ts +4 -0
  219. package/dist/testing/require-act-result-capture/rule.d.ts.map +1 -0
  220. package/dist/testing/require-act-result-capture/rule.js +34 -0
  221. package/dist/testing/require-test-companion/index.d.ts +3 -0
  222. package/dist/testing/require-test-companion/index.d.ts.map +1 -0
  223. package/dist/testing/require-test-companion/index.js +3 -0
  224. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts +16 -0
  225. package/dist/testing/require-test-companion/require-test-companion-listeners.d.ts.map +1 -0
  226. package/dist/testing/require-test-companion/require-test-companion-listeners.js +145 -0
  227. package/dist/testing/require-test-companion/require-test-companion-options.d.ts +54 -0
  228. package/dist/testing/require-test-companion/require-test-companion-options.d.ts.map +1 -0
  229. package/dist/testing/require-test-companion/require-test-companion-options.js +112 -0
  230. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts +51 -0
  231. package/dist/testing/require-test-companion/require-test-companion-test-helpers.d.ts.map +1 -0
  232. package/dist/testing/require-test-companion/require-test-companion-test-helpers.js +183 -0
  233. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts +28 -0
  234. package/dist/testing/require-test-companion/require-test-companion-utilities.d.ts.map +1 -0
  235. package/dist/testing/require-test-companion/require-test-companion-utilities.js +26 -0
  236. package/dist/testing/require-test-companion/rule.d.ts +5 -0
  237. package/dist/testing/require-test-companion/rule.d.ts.map +1 -0
  238. package/dist/testing/require-test-companion/rule.js +57 -0
  239. package/dist/testing/require-test-companion/types.d.ts +11 -0
  240. package/dist/testing/require-test-companion/types.d.ts.map +1 -0
  241. package/dist/testing/require-test-companion/types.js +2 -0
  242. package/dist/testing/single-act-statement/index.d.ts +2 -0
  243. package/dist/testing/single-act-statement/index.d.ts.map +1 -0
  244. package/dist/testing/single-act-statement/index.js +2 -0
  245. package/dist/testing/single-act-statement/rule.d.ts +4 -0
  246. package/dist/testing/single-act-statement/rule.d.ts.map +1 -0
  247. package/dist/testing/single-act-statement/rule.js +33 -0
  248. package/package.json +106 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Closes a fence and updates the state.
3
+ * @param state Current fence state.
4
+ * @param line Fence line being processed.
5
+ * @returns Updated fence state.
6
+ * @example
7
+ * ```typescript
8
+ * const next = closeFence(state, " * ```");
9
+ * ```
10
+ */
11
+ function closeFence(state, line) {
12
+ const fenceLines = [...state.currentFence, line];
13
+ const shouldRemove = !state.hasFenceContent;
14
+ const hasNonEmptyFence = state.hasNonEmptyFence || state.hasFenceContent;
15
+ const output = shouldRemove ? state.output : [...state.output, ...fenceLines];
16
+ return {
17
+ ...state,
18
+ currentFence: [],
19
+ hasFenceContent: false,
20
+ hasNonEmptyFence,
21
+ inFence: false,
22
+ output,
23
+ removed: state.removed || shouldRemove,
24
+ };
25
+ }
26
+ /**
27
+ * Finalizes fence output, including any unclosed fences.
28
+ * @param state Current fence state.
29
+ * @returns Finalized fence state.
30
+ * @example
31
+ * ```typescript
32
+ * const next = finalizeFenceState(state);
33
+ * ```
34
+ */
35
+ function finalizeFenceState(state) {
36
+ if (state.inFence) {
37
+ return {
38
+ ...state,
39
+ currentFence: [],
40
+ hasFenceContent: false,
41
+ hasNonEmptyFence: state.hasNonEmptyFence || state.hasFenceContent,
42
+ inFence: false,
43
+ output: [...state.output, ...state.currentFence],
44
+ };
45
+ }
46
+ return state;
47
+ }
48
+ /**
49
+ * Determines whether a line contains non-empty content.
50
+ * @param line Line text to check.
51
+ * @returns True when the line contains content.
52
+ * @example
53
+ * ```typescript
54
+ * const ok = isContentLine(" * const ok = true;");
55
+ * ```
56
+ */
57
+ function isContentLine(line) {
58
+ const trimmed = line.replace(/^\s*\*?\s?/u, "").trim();
59
+ return trimmed.length > 0;
60
+ }
61
+ /**
62
+ * Opens a new fenced block.
63
+ * @param state Current fence state.
64
+ * @param line Fence line being processed.
65
+ * @returns Updated fence state.
66
+ * @example
67
+ * ```typescript
68
+ * const next = openFence(state, " * ```typescript");
69
+ * ```
70
+ */
71
+ function openFence(state, line) {
72
+ return {
73
+ ...state,
74
+ currentFence: [line],
75
+ hasFenceContent: false,
76
+ hasNonEmptyFence: state.hasNonEmptyFence,
77
+ inFence: true,
78
+ };
79
+ }
80
+ /**
81
+ * Parses a fence line for its leading prefix and language.
82
+ * @param line Fence line to parse.
83
+ * @returns Parsed fence info when matched.
84
+ * @example
85
+ * ```typescript
86
+ * const info = parseFenceLine(" * ```typescript");
87
+ * ```
88
+ */
89
+ function parseFenceLine(line) {
90
+ const fenceMatch = /^(?<leading>\s*\*?\s*)```(?<lang>[^\s`]+)?[ \t]*$/u.exec(line);
91
+ if (fenceMatch === null) {
92
+ return void 0;
93
+ }
94
+ const groups = fenceMatch.groups ?? {};
95
+ const leading = typeof groups["leading"] === "string" ? groups["leading"] : "";
96
+ const language = typeof groups["lang"] === "string" ? groups["lang"] : "";
97
+ return { language, leading };
98
+ }
99
+ /**
100
+ * Removes fenced blocks that contain no content.
101
+ * @param original Original comment text.
102
+ * @returns Updated comment text when a fence is removed.
103
+ * @example
104
+ * ```typescript
105
+ * const updated = removeEmptyFences("* ```typescript\n* ```\n* ok");
106
+ * ```
107
+ */
108
+ function removeEmptyFences(original) {
109
+ const lineBreak = original.includes("\r\n") ? "\r\n" : "\n";
110
+ const lines = original.split(/\r?\n/u);
111
+ const initialState = {
112
+ currentFence: [],
113
+ hasFenceContent: false,
114
+ hasNonEmptyFence: false,
115
+ inFence: false,
116
+ output: [],
117
+ removed: false,
118
+ };
119
+ let state = initialState;
120
+ for (const line of lines) {
121
+ const fenceInfo = parseFenceLine(line);
122
+ state =
123
+ fenceInfo === void 0
124
+ ? updateContentState(state, line)
125
+ : updateFenceState(state, line);
126
+ }
127
+ const finalState = finalizeFenceState(state);
128
+ return finalState.removed && finalState.hasNonEmptyFence
129
+ ? finalState.output.join(lineBreak)
130
+ : void 0;
131
+ }
132
+ /**
133
+ * Updates the state with a non-fence line.
134
+ * @param state Current fence state.
135
+ * @param line Line being processed.
136
+ * @returns Updated fence state.
137
+ * @example
138
+ * ```typescript
139
+ * const next = updateContentState(state, " * const ok = true;");
140
+ * ```
141
+ */
142
+ function updateContentState(state, line) {
143
+ if (state.inFence) {
144
+ return {
145
+ ...state,
146
+ currentFence: [...state.currentFence, line],
147
+ hasFenceContent: state.hasFenceContent || isContentLine(line),
148
+ };
149
+ }
150
+ return { ...state, output: [...state.output, line] };
151
+ }
152
+ /**
153
+ * Opens or closes a fence based on the current state.
154
+ * @param state Current fence state.
155
+ * @param line Fence line being processed.
156
+ * @returns Updated fence state.
157
+ * @example
158
+ * ```typescript
159
+ * const next = updateFenceState(state, " * ```");
160
+ * ```
161
+ */
162
+ function updateFenceState(state, line) {
163
+ if (state.inFence) {
164
+ return closeFence(state, line);
165
+ }
166
+ return openFence(state, line);
167
+ }
168
+ export { parseFenceLine, removeEmptyFences };
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktZmVuY2UtZml4ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jcy9yZXF1aXJlLWV4YW1wbGUtbGFuZ3VhZ2UvZW1wdHktZmVuY2UtZml4ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOEJBOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQXNCLEVBQUUsSUFBWTtJQUN0RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7SUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQztJQUN6RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFFOUUsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGVBQWUsRUFBRSxLQUFLO1FBQ3RCLGdCQUFnQjtRQUNoQixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU07UUFDTixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxZQUFZO0tBQ3ZDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQXNCO0lBQ2hELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixZQUFZLEVBQUUsRUFBRTtZQUNoQixlQUFlLEVBQUUsS0FBSztZQUN0QixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGVBQWU7WUFDakUsT0FBTyxF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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixLQUFzQixFQUN0QixJQUFZO0lBRVosSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLFlBQVksRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUM7WUFDM0MsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQztTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsS0FBc0IsRUFDdEIsSUFBWTtJQUVaLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgRW1wdHlGZW5jZVN0YXRlIHtcbiAgLyoqIEN1cnJlbnRGZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgY3VycmVudEZlbmNlOiBzdHJpbmdbXTtcblxuICAvKiogSGFzRmVuY2VDb250ZW50IGZpZWxkIHZhbHVlLiAqL1xuICBoYXNGZW5jZUNvbnRlbnQ6IGJvb2xlYW47XG5cbiAgLyoqIEhhc05vbkVtcHR5RmVuY2UgZmllbGQgdmFsdWUuICovXG4gIGhhc05vbkVtcHR5RmVuY2U6IGJvb2xlYW47XG5cbiAgLyoqIEluRmVuY2UgZmllbGQgdmFsdWUuICovXG4gIGluRmVuY2U6IGJvb2xlYW47XG5cbiAgLyoqIE91dHB1dCBmaWVsZCB2YWx1ZS4gKi9cbiAgb3V0cHV0OiBzdHJpbmdbXTtcblxuICAvKiogUmVtb3ZlZCBmaWVsZCB2YWx1ZS4gKi9cbiAgcmVtb3ZlZDogYm9vbGVhbjtcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEZlbmNlTGluZUluZm8ge1xuICAvKiogTGFuZ3VhZ2UgZmllbGQgdmFsdWUuICovXG4gIGxhbmd1YWdlOiBzdHJpbmc7XG5cbiAgLyoqIExlYWRpbmcgZmllbGQgdmFsdWUuICovXG4gIGxlYWRpbmc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDbG9zZXMgYSBmZW5jZSBhbmQgdXBkYXRlcyB0aGUgc3RhdGUuXG4gKiBAcGFyYW0gc3RhdGUgQ3VycmVudCBmZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSBsaW5lIEZlbmNlIGxpbmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVXBkYXRlZCBmZW5jZSBzdGF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0ID0gY2xvc2VGZW5jZShzdGF0ZSwgXCIgKiBgYGBcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY2xvc2VGZW5jZShzdGF0ZTogRW1wdHlGZW5jZVN0YXRlLCBsaW5lOiBzdHJpbmcpOiBFbXB0eUZlbmNlU3RhdGUge1xuICBjb25zdCBmZW5jZUxpbmVzID0gWy4uLnN0YXRlLmN1cnJlbnRGZW5jZSwgbGluZV07XG4gIGNvbnN0IHNob3VsZFJlbW92ZSA9ICFzdGF0ZS5oYXNGZW5jZUNvbnRlbnQ7XG4gIGNvbnN0IGhhc05vbkVtcHR5RmVuY2UgPSBzdGF0ZS5oYXNOb25FbXB0eUZlbmNlIHx8IHN0YXRlLmhhc0ZlbmNlQ29udGVudDtcbiAgY29uc3Qgb3V0cHV0ID0gc2hvdWxkUmVtb3ZlID8gc3RhdGUub3V0cHV0IDogWy4uLnN0YXRlLm91dHB1dCwgLi4uZmVuY2VMaW5lc107XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjdXJyZW50RmVuY2U6IFtdLFxuICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgaGFzTm9uRW1wdHlGZW5jZSxcbiAgICBpbkZlbmNlOiBmYWxzZSxcbiAgICBvdXRwdXQsXG4gICAgcmVtb3ZlZDogc3RhdGUucmVtb3ZlZCB8fCBzaG91bGRSZW1vdmUsXG4gIH07XG59XG5cbi8qKlxuICogRmluYWxpemVzIGZlbmNlIG91dHB1dCwgaW5jbHVkaW5nIGFueSB1bmNsb3NlZCBmZW5jZXMuXG4gKiBAcGFyYW0gc3RhdGUgQ3VycmVudCBmZW5jZSBzdGF0ZS5cbiAqIEByZXR1cm5zIEZpbmFsaXplZCBmZW5jZSBzdGF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0ID0gZmluYWxpemVGZW5jZVN0YXRlKHN0YXRlKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBmaW5hbGl6ZUZlbmNlU3RhdGUoc3RhdGU6IEVtcHR5RmVuY2VTdGF0ZSk6IEVtcHR5RmVuY2VTdGF0ZSB7XG4gIGlmIChzdGF0ZS5pbkZlbmNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgY3VycmVudEZlbmNlOiBbXSxcbiAgICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgICBoYXNOb25FbXB0eUZlbmNlOiBzdGF0ZS5oYXNOb25FbXB0eUZlbmNlIHx8IHN0YXRlLmhhc0ZlbmNlQ29udGVudCxcbiAgICAgIGluRmVuY2U6IGZhbHNlLFxuICAgICAgb3V0cHV0OiBbLi4uc3RhdGUub3V0cHV0LCAuLi5zdGF0ZS5jdXJyZW50RmVuY2VdLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbGluZSBjb250YWlucyBub24tZW1wdHkgY29udGVudC5cbiAqIEBwYXJhbSBsaW5lIExpbmUgdGV4dCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgbGluZSBjb250YWlucyBjb250ZW50LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG9rID0gaXNDb250ZW50TGluZShcIiAqIGNvbnN0IG9rID0gdHJ1ZTtcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaXNDb250ZW50TGluZShsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUucmVwbGFjZSgvXlxccypcXCo/XFxzPy91LCBcIlwiKS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogT3BlbnMgYSBuZXcgZmVuY2VkIGJsb2NrLlxuICogQHBhcmFtIHN0YXRlIEN1cnJlbnQgZmVuY2Ugc3RhdGUuXG4gKiBAcGFyYW0gbGluZSBGZW5jZSBsaW5lIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgZmVuY2Ugc3RhdGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmV4dCA9IG9wZW5GZW5jZShzdGF0ZSwgXCIgKiBgYGB0eXBlc2NyaXB0XCIpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG9wZW5GZW5jZShzdGF0ZTogRW1wdHlGZW5jZVN0YXRlLCBsaW5lOiBzdHJpbmcpOiBFbXB0eUZlbmNlU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGN1cnJlbnRGZW5jZTogW2xpbmVdLFxuICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgaGFzTm9uRW1wdHlGZW5jZTogc3RhdGUuaGFzTm9uRW1wdHlGZW5jZSxcbiAgICBpbkZlbmNlOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGZlbmNlIGxpbmUgZm9yIGl0cyBsZWFkaW5nIHByZWZpeCBhbmQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0gbGluZSBGZW5jZSBsaW5lIHRvIHBhcnNlLlxuICogQHJldHVybnMgUGFyc2VkIGZlbmNlIGluZm8gd2hlbiBtYXRjaGVkLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGluZm8gPSBwYXJzZUZlbmNlTGluZShcIiAqIGBgYHR5cGVzY3JpcHRcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gcGFyc2VGZW5jZUxpbmUobGluZTogc3RyaW5nKTogRmVuY2VMaW5lSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZlbmNlTWF0Y2ggPSAvXig/PGxlYWRpbmc+XFxzKlxcKj9cXHMqKWBgYCg/PGxhbmc+W15cXHNgXSspP1sgXFx0XSokL3UuZXhlYyhcbiAgICBsaW5lLFxuICApO1xuXG4gIGlmIChmZW5jZU1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuXG4gIGNvbnN0IGdyb3VwcyA9IGZlbmNlTWF0Y2guZ3JvdXBzID8/IHt9O1xuICBjb25zdCBsZWFkaW5nID1cbiAgICB0eXBlb2YgZ3JvdXBzW1wibGVhZGluZ1wiXSA9PT0gXCJzdHJpbmdcIiA/IGdyb3Vwc1tcImxlYWRpbmdcIl0gOiBcIlwiO1xuICBjb25zdCBsYW5ndWFnZSA9IHR5cGVvZiBncm91cHNbXCJsYW5nXCJdID09PSBcInN0cmluZ1wiID8gZ3JvdXBzW1wibGFuZ1wiXSA6IFwiXCI7XG5cbiAgcmV0dXJuIHsgbGFuZ3VhZ2UsIGxlYWRpbmcgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGZlbmNlZCBibG9ja3MgdGhhdCBjb250YWluIG5vIGNvbnRlbnQuXG4gKiBAcGFyYW0gb3JpZ2luYWwgT3JpZ2luYWwgY29tbWVudCB0ZXh0LlxuICogQHJldHVybnMgVXBkYXRlZCBjb21tZW50IHRleHQgd2hlbiBhIGZlbmNlIGlzIHJlbW92ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdXBkYXRlZCA9IHJlbW92ZUVtcHR5RmVuY2VzKFwiKiBgYGB0eXBlc2NyaXB0XFxuKiBgYGBcXG4qIG9rXCIpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RmVuY2VzKG9yaWdpbmFsOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBsaW5lQnJlYWsgPSBvcmlnaW5hbC5pbmNsdWRlcyhcIlxcclxcblwiKSA/IFwiXFxyXFxuXCIgOiBcIlxcblwiO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsLnNwbGl0KC9cXHI/XFxuL3UpO1xuICBjb25zdCBpbml0aWFsU3RhdGU6IEVtcHR5RmVuY2VTdGF0ZSA9IHtcbiAgICBjdXJyZW50RmVuY2U6IFtdLFxuICAgIGhhc0ZlbmNlQ29udGVudDogZmFsc2UsXG4gICAgaGFzTm9uRW1wdHlGZW5jZTogZmFsc2UsXG4gICAgaW5GZW5jZTogZmFsc2UsXG4gICAgb3V0cHV0OiBbXSxcbiAgICByZW1vdmVkOiBmYWxzZSxcbiAgfTtcbiAgbGV0IHN0YXRlID0gaW5pdGlhbFN0YXRlO1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGZlbmNlSW5mbyA9IHBhcnNlRmVuY2VMaW5lKGxpbmUpO1xuICAgIHN0YXRlID1cbiAgICAgIGZlbmNlSW5mbyA9PT0gdm9pZCAwXG4gICAgICAgID8gdXBkYXRlQ29udGVudFN0YXRlKHN0YXRlLCBsaW5lKVxuICAgICAgICA6IHVwZGF0ZUZlbmNlU3RhdGUoc3RhdGUsIGxpbmUpO1xuICB9XG5cbiAgY29uc3QgZmluYWxTdGF0ZSA9IGZpbmFsaXplRmVuY2VTdGF0ZShzdGF0ZSk7XG5cbiAgcmV0dXJuIGZpbmFsU3RhdGUucmVtb3ZlZCAmJiBmaW5hbFN0YXRlLmhhc05vbkVtcHR5RmVuY2VcbiAgICA/IGZpbmFsU3RhdGUub3V0cHV0LmpvaW4obGluZUJyZWFrKVxuICAgIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHN0YXRlIHdpdGggYSBub24tZmVuY2UgbGluZS5cbiAqIEBwYXJhbSBzdGF0ZSBDdXJyZW50IGZlbmNlIHN0YXRlLlxuICogQHBhcmFtIGxpbmUgTGluZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcmV0dXJucyBVcGRhdGVkIGZlbmNlIHN0YXRlLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG5leHQgPSB1cGRhdGVDb250ZW50U3RhdGUoc3RhdGUsIFwiICogY29uc3Qgb2sgPSB0cnVlO1wiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1cGRhdGVDb250ZW50U3RhdGUoXG4gIHN0YXRlOiBFbXB0eUZlbmNlU3RhdGUsXG4gIGxpbmU6IHN0cmluZyxcbik6IEVtcHR5RmVuY2VTdGF0ZSB7XG4gIGlmIChzdGF0ZS5pbkZlbmNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgY3VycmVudEZlbmNlOiBbLi4uc3RhdGUuY3VycmVudEZlbmNlLCBsaW5lXSxcbiAgICAgIGhhc0ZlbmNlQ29udGVudDogc3RhdGUuaGFzRmVuY2VDb250ZW50IHx8IGlzQ29udGVudExpbmUobGluZSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBvdXRwdXQ6IFsuLi5zdGF0ZS5vdXRwdXQsIGxpbmVdIH07XG59XG5cbi8qKlxuICogT3BlbnMgb3IgY2xvc2VzIGEgZmVuY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gc3RhdGUgQ3VycmVudCBmZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSBsaW5lIEZlbmNlIGxpbmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHJldHVybnMgVXBkYXRlZCBmZW5jZSBzdGF0ZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBuZXh0ID0gdXBkYXRlRmVuY2VTdGF0ZShzdGF0ZSwgXCIgKiBgYGBcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXBkYXRlRmVuY2VTdGF0ZShcbiAgc3RhdGU6IEVtcHR5RmVuY2VTdGF0ZSxcbiAgbGluZTogc3RyaW5nLFxuKTogRW1wdHlGZW5jZVN0YXRlIHtcbiAgaWYgKHN0YXRlLmluRmVuY2UpIHtcbiAgICByZXR1cm4gY2xvc2VGZW5jZShzdGF0ZSwgbGluZSk7XG4gIH1cblxuICByZXR1cm4gb3BlbkZlbmNlKHN0YXRlLCBsaW5lKTtcbn1cblxuZXhwb3J0IHsgcGFyc2VGZW5jZUxpbmUsIHJlbW92ZUVtcHR5RmVuY2VzIH07XG4iXX0=
@@ -0,0 +1,70 @@
1
+ /** Type definition for rule data. */
2
+ interface LineMeta {
3
+ /** EndIndex field value. */
4
+ endIndex: number;
5
+ /** EndOffset field value. */
6
+ endOffset: number;
7
+ /** LineIndex field value. */
8
+ lineIndex: number;
9
+ }
10
+ /** Type definition for rule data. */
11
+ interface LineMetaContext {
12
+ /** CommentValue field value. */
13
+ commentValue: string;
14
+ /** Full field value. */
15
+ full: string;
16
+ /** StartOffset field value. */
17
+ startOffset: number;
18
+ }
19
+ /**
20
+ * Extracts the language from a fence line when present.
21
+ * @param line Fence line to inspect.
22
+ * @returns Language tag when present.
23
+ * @example
24
+ * ```typescript
25
+ * const lang = getFenceLanguage(" * ```typescript");
26
+ * ```
27
+ */
28
+ declare function getFenceLanguage(line: string): string | undefined;
29
+ /**
30
+ * Extracts inline example content from the header line.
31
+ * @param header Example header line.
32
+ * @returns Inline example content.
33
+ * @example
34
+ * ```typescript
35
+ * const text = getInlineContent("* @example hello");
36
+ * ```
37
+ */
38
+ declare function getInlineContent(header: string): string;
39
+ /**
40
+ * Computes line metadata from the raw comment value.
41
+ * @param context Comment metadata context.
42
+ * @returns Line metadata for the example.
43
+ * @example
44
+ * ```typescript
45
+ * const meta = getLineMeta({ commentValue: "* ok", full: "* ok", startOffset: 0 });
46
+ * ```
47
+ */
48
+ declare function getLineMeta(context: LineMetaContext): LineMeta;
49
+ /**
50
+ * Resolves the leading prefix used by example lines.
51
+ * @param header Example header line.
52
+ * @returns The leading prefix string.
53
+ * @example
54
+ * ```typescript
55
+ * const prefix = getPrefix(" * @example");
56
+ * ```
57
+ */
58
+ declare function getPrefix(header: string): string;
59
+ /**
60
+ * Determines whether a content line contains non-empty example text.
61
+ * @param line Line text to check.
62
+ * @returns True when the line contains content.
63
+ * @example
64
+ * ```typescript
65
+ * const ok = hasLineContent(" * const value = 1;");
66
+ * ```
67
+ */
68
+ declare function hasLineContent(line: string): boolean;
69
+ export { getFenceLanguage, getInlineContent, getLineMeta, getPrefix, hasLineContent, };
70
+ //# sourceMappingURL=example-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-utilities.d.ts","sourceRoot":"","sources":["../../../src/docs/require-example-language/example-utilities.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,UAAU,QAAQ;IAChB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,UAAU,eAAe;IACvB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IAEb,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU1D;AAED;;;;;;;;GAQG;AACH,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAQvD;AAED;;;;;;;;GAQG;AACH,iBAAS,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzC;AAED;;;;;;;;GAQG;AACH,iBAAS,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG7C;AAED,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,cAAc,GACf,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Extracts the language from a fence line when present.
3
+ * @param line Fence line to inspect.
4
+ * @returns Language tag when present.
5
+ * @example
6
+ * ```typescript
7
+ * const lang = getFenceLanguage(" * ```typescript");
8
+ * ```
9
+ */
10
+ function getFenceLanguage(line) {
11
+ const fenceMatch = /^(?<leading>\s*\*?\s*)```(?<lang>[^\s`]+)?[ \t]*$/u.exec(line);
12
+ if (fenceMatch === null) {
13
+ return void 0;
14
+ }
15
+ return fenceMatch.groups?.["lang"] ?? "";
16
+ }
17
+ /**
18
+ * Extracts inline example content from the header line.
19
+ * @param header Example header line.
20
+ * @returns Inline example content.
21
+ * @example
22
+ * ```typescript
23
+ * const text = getInlineContent("* @example hello");
24
+ * ```
25
+ */
26
+ function getInlineContent(header) {
27
+ const inlineMatch = /^.*@example\b\s?(?<c>.*)$/u.exec(header);
28
+ return inlineMatch?.groups?.["c"] ?? "";
29
+ }
30
+ /**
31
+ * Computes line metadata from the raw comment value.
32
+ * @param context Comment metadata context.
33
+ * @returns Line metadata for the example.
34
+ * @example
35
+ * ```typescript
36
+ * const meta = getLineMeta({ commentValue: "* ok", full: "* ok", startOffset: 0 });
37
+ * ```
38
+ */
39
+ function getLineMeta(context) {
40
+ const { commentValue, full, startOffset } = context;
41
+ const lineIndex = commentValue.slice(0, startOffset).split(/\r?\n/u).length - 1;
42
+ const endOffset = startOffset + full.length;
43
+ const endIndex = lineIndex + full.split(/\r?\n/u).length - 1;
44
+ return { endIndex, endOffset, lineIndex };
45
+ }
46
+ /**
47
+ * Resolves the leading prefix used by example lines.
48
+ * @param header Example header line.
49
+ * @returns The leading prefix string.
50
+ * @example
51
+ * ```typescript
52
+ * const prefix = getPrefix(" * @example");
53
+ * ```
54
+ */
55
+ function getPrefix(header) {
56
+ const prefixMatch = header.indexOf("@example");
57
+ if (prefixMatch === -1) {
58
+ return "";
59
+ }
60
+ return header.slice(0, prefixMatch);
61
+ }
62
+ /**
63
+ * Determines whether a content line contains non-empty example text.
64
+ * @param line Line text to check.
65
+ * @returns True when the line contains content.
66
+ * @example
67
+ * ```typescript
68
+ * const ok = hasLineContent(" * const value = 1;");
69
+ * ```
70
+ */
71
+ function hasLineContent(line) {
72
+ const trimmed = line.replace(/^\s*\*?\s?/u, "").trim();
73
+ return trimmed.length > 0;
74
+ }
75
+ export { getFenceLanguage, getInlineContent, getLineMeta, getPrefix, hasLineContent, };
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZS11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jcy9yZXF1aXJlLWV4YW1wbGUtbGFuZ3VhZ2UvZXhhbXBsZS11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0JBOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFZO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLG9EQUFvRCxDQUFDLElBQUksQ0FDMUUsSUFBSSxDQUNMLENBQUM7SUFFRixJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QixPQUFPLEtBQUssQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5RCxPQUFPLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxXQUFXLENBQUMsT0FBd0I7SUFDM0MsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ3BELE1BQU0sU0FBUyxHQUNiLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBYztJQUMvQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxTQUFTLEVBQ1QsY0FBYyxHQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgTGluZU1ldGEge1xuICAvKiogRW5kSW5kZXggZmllbGQgdmFsdWUuICovXG4gIGVuZEluZGV4OiBudW1iZXI7XG5cbiAgLyoqIEVuZE9mZnNldCBmaWVsZCB2YWx1ZS4gKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqIExpbmVJbmRleCBmaWVsZCB2YWx1ZS4gKi9cbiAgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKiBUeXBlIGRlZmluaXRpb24gZm9yIHJ1bGUgZGF0YS4gKi9cbmludGVyZmFjZSBMaW5lTWV0YUNvbnRleHQge1xuICAvKiogQ29tbWVudFZhbHVlIGZpZWxkIHZhbHVlLiAqL1xuICBjb21tZW50VmFsdWU6IHN0cmluZztcblxuICAvKiogRnVsbCBmaWVsZCB2YWx1ZS4gKi9cbiAgZnVsbDogc3RyaW5nO1xuXG4gIC8qKiBTdGFydE9mZnNldCBmaWVsZCB2YWx1ZS4gKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgbGFuZ3VhZ2UgZnJvbSBhIGZlbmNlIGxpbmUgd2hlbiBwcmVzZW50LlxuICogQHBhcmFtIGxpbmUgRmVuY2UgbGluZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgTGFuZ3VhZ2UgdGFnIHdoZW4gcHJlc2VudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBsYW5nID0gZ2V0RmVuY2VMYW5ndWFnZShcIiAqIGBgYHR5cGVzY3JpcHRcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0RmVuY2VMYW5ndWFnZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmZW5jZU1hdGNoID0gL14oPzxsZWFkaW5nPlxccypcXCo/XFxzKilgYGAoPzxsYW5nPlteXFxzYF0rKT9bIFxcdF0qJC91LmV4ZWMoXG4gICAgbGluZSxcbiAgKTtcblxuICBpZiAoZmVuY2VNYXRjaCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gZmVuY2VNYXRjaC5ncm91cHM/LltcImxhbmdcIl0gPz8gXCJcIjtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBpbmxpbmUgZXhhbXBsZSBjb250ZW50IGZyb20gdGhlIGhlYWRlciBsaW5lLlxuICogQHBhcmFtIGhlYWRlciBFeGFtcGxlIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMgSW5saW5lIGV4YW1wbGUgY29udGVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0ZXh0ID0gZ2V0SW5saW5lQ29udGVudChcIiogQGV4YW1wbGUgaGVsbG9cIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0SW5saW5lQ29udGVudChoZWFkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlubGluZU1hdGNoID0gL14uKkBleGFtcGxlXFxiXFxzPyg/PGM+LiopJC91LmV4ZWMoaGVhZGVyKTtcblxuICByZXR1cm4gaW5saW5lTWF0Y2g/Lmdyb3Vwcz8uW1wiY1wiXSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGxpbmUgbWV0YWRhdGEgZnJvbSB0aGUgcmF3IGNvbW1lbnQgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dCBDb21tZW50IG1ldGFkYXRhIGNvbnRleHQuXG4gKiBAcmV0dXJucyBMaW5lIG1ldGFkYXRhIGZvciB0aGUgZXhhbXBsZS5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRhID0gZ2V0TGluZU1ldGEoeyBjb21tZW50VmFsdWU6IFwiKiBva1wiLCBmdWxsOiBcIiogb2tcIiwgc3RhcnRPZmZzZXQ6IDAgfSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZ2V0TGluZU1ldGEoY29udGV4dDogTGluZU1ldGFDb250ZXh0KTogTGluZU1ldGEge1xuICBjb25zdCB7IGNvbW1lbnRWYWx1ZSwgZnVsbCwgc3RhcnRPZmZzZXQgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGxpbmVJbmRleCA9XG4gICAgY29tbWVudFZhbHVlLnNsaWNlKDAsIHN0YXJ0T2Zmc2V0KS5zcGxpdCgvXFxyP1xcbi91KS5sZW5ndGggLSAxO1xuICBjb25zdCBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIGZ1bGwubGVuZ3RoO1xuICBjb25zdCBlbmRJbmRleCA9IGxpbmVJbmRleCArIGZ1bGwuc3BsaXQoL1xccj9cXG4vdSkubGVuZ3RoIC0gMTtcblxuICByZXR1cm4geyBlbmRJbmRleCwgZW5kT2Zmc2V0LCBsaW5lSW5kZXggfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbGVhZGluZyBwcmVmaXggdXNlZCBieSBleGFtcGxlIGxpbmVzLlxuICogQHBhcmFtIGhlYWRlciBFeGFtcGxlIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMgVGhlIGxlYWRpbmcgcHJlZml4IHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwcmVmaXggPSBnZXRQcmVmaXgoXCIgKiBAZXhhbXBsZVwiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRQcmVmaXgoaGVhZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhNYXRjaCA9IGhlYWRlci5pbmRleE9mKFwiQGV4YW1wbGVcIik7XG5cbiAgaWYgKHByZWZpeE1hdGNoID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIGhlYWRlci5zbGljZSgwLCBwcmVmaXhNYXRjaCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29udGVudCBsaW5lIGNvbnRhaW5zIG5vbi1lbXB0eSBleGFtcGxlIHRleHQuXG4gKiBAcGFyYW0gbGluZSBMaW5lIHRleHQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIGxpbmUgY29udGFpbnMgY29udGVudC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBvayA9IGhhc0xpbmVDb250ZW50KFwiICogY29uc3QgdmFsdWUgPSAxO1wiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBoYXNMaW5lQ29udGVudChsaW5lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUucmVwbGFjZSgvXlxccypcXCo/XFxzPy91LCBcIlwiKS50cmltKCk7XG4gIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB7XG4gIGdldEZlbmNlTGFuZ3VhZ2UsXG4gIGdldElubGluZUNvbnRlbnQsXG4gIGdldExpbmVNZXRhLFxuICBnZXRQcmVmaXgsXG4gIGhhc0xpbmVDb250ZW50LFxufTtcbiJdfQ==
@@ -0,0 +1,36 @@
1
+ import type { Example, Problem } from "./types";
2
+ /**
3
+ * Builds an Example from a regex match and raw comment value.
4
+ * @param match Regex match from the example pattern.
5
+ * @param commentValue Raw comment value.
6
+ * @returns Example metadata extracted from the match.
7
+ * @example
8
+ * ```typescript
9
+ * const example = buildExampleFromMatch(match, commentValue);
10
+ * ```
11
+ */
12
+ declare function buildExampleFromMatch(match: RegExpMatchArray, commentValue: string): Example;
13
+ /**
14
+ * Checks example content for required fences and language.
15
+ * @param content Example content to inspect.
16
+ * @returns Problem identifier when the content is invalid.
17
+ * @example
18
+ * ```typescript
19
+ * const problem = checkExampleContent("```typescript\nconst ok = true;\n```");
20
+ * ```
21
+ */
22
+ declare function checkExampleContent(content: string): Problem | undefined;
23
+ /**
24
+ * Extracts all `@example` entries from a JSDoc comment value.
25
+ * Uses a multiline regex to capture the header and following lines
26
+ * until the next JSDoc tag or the end of the comment.
27
+ * @param commentValue Raw comment value.
28
+ * @returns Extracted examples.
29
+ * @example
30
+ * ```typescript
31
+ * const examples = getExamples("* @example\n* ```typescript\n* ok\n* ```");
32
+ * ```
33
+ */
34
+ declare function getExamples(commentValue: string): Example[];
35
+ export { buildExampleFromMatch, checkExampleContent, getExamples };
36
+ //# sourceMappingURL=examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../../src/docs/require-example-language/examples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA6KhD;;;;;;;;;GASG;AACH,iBAAS,qBAAqB,CAC5B,KAAK,EAAE,gBAAgB,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAqBT;AAED;;;;;;;;GAQG;AACH,iBAAS,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAoBjE;AAED;;;;;;;;;;GAUG;AACH,iBAAS,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,EAAE,CAQpD;AAED,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,181 @@
1
+ import { getFenceLanguage, getInlineContent, getLineMeta, getPrefix, hasLineContent, } from "./example-utilities";
2
+ /** Captures `@example` headers and bodies for analysis. */
3
+ const examplePattern = /^(?<header>\s*\*?\s*@example\b[^\n]*)(?<body>[\s\S]*?)(?=^\s*\*?\s*@\w+|(?![\s\S]))/gmu;
4
+ /**
5
+ * Updates fence state based on the detected language.
6
+ * @param state Current fence tracking state.
7
+ * @param language Fence language string.
8
+ * @returns Updated fence tracking state.
9
+ * @example
10
+ * ```typescript
11
+ * const next = updateFenceState(state, "typescript");
12
+ * ```
13
+ */
14
+ const updateFenceState = (state, language) => {
15
+ if (!state.inFence) {
16
+ if (language.length === 0) {
17
+ return { ...state, missingLanguage: true, sawFence: true };
18
+ }
19
+ return {
20
+ ...state,
21
+ currentFenceHasContent: false,
22
+ inFence: true,
23
+ missingLanguage: false,
24
+ sawFence: true,
25
+ };
26
+ }
27
+ return {
28
+ ...state,
29
+ currentFenceHasContent: false,
30
+ hasEmptyFence: state.hasEmptyFence || !state.currentFenceHasContent,
31
+ inFence: false,
32
+ missingLanguage: false,
33
+ sawFence: true,
34
+ };
35
+ };
36
+ /**
37
+ * Updates fence tracking for a single example line.
38
+ * @param state Current fence tracking state.
39
+ * @param line Example line to inspect.
40
+ * @returns Updated fence tracking state.
41
+ * @example
42
+ * ```typescript
43
+ * const next = updateFenceStateForLine(state, " * ok");
44
+ * ```
45
+ */
46
+ const updateFenceStateForLine = (state, line) => {
47
+ const language = getFenceLanguage(line);
48
+ if (language !== void 0) {
49
+ return updateFenceState(state, language);
50
+ }
51
+ if (state.inFence && hasLineContent(line)) {
52
+ return { ...state, currentFenceHasContent: true };
53
+ }
54
+ return state;
55
+ };
56
+ /**
57
+ * Analyzes fenced code blocks for missing language identifiers.
58
+ * @param content Example content to analyze.
59
+ * @returns Fence analysis results.
60
+ * @example
61
+ * ```typescript
62
+ * const analysis = analyzeFenceContent("```typescript\nconst value = 1;\n```");
63
+ * ```
64
+ */
65
+ function analyzeFenceContent(content) {
66
+ const lines = content.split(/\r?\n/u);
67
+ let state = {
68
+ currentFenceHasContent: false,
69
+ hasEmptyFence: false,
70
+ inFence: false,
71
+ missingLanguage: false,
72
+ sawFence: false,
73
+ };
74
+ for (const line of lines) {
75
+ state = updateFenceStateForLine(state, line);
76
+ if (state.missingLanguage) {
77
+ break;
78
+ }
79
+ }
80
+ if (state.inFence && !state.currentFenceHasContent) {
81
+ state = { ...state, hasEmptyFence: true };
82
+ }
83
+ return {
84
+ hasEmptyFence: state.hasEmptyFence,
85
+ missingLanguage: state.missingLanguage,
86
+ sawFence: state.sawFence,
87
+ };
88
+ }
89
+ /**
90
+ * Builds example content from an inline header and body lines.
91
+ * @param context Example header and body lines.
92
+ * @returns Combined example content.
93
+ * @example
94
+ * ```typescript
95
+ * const content = buildExampleContent({ body: "* ok", header: "* @example" });
96
+ * ```
97
+ */
98
+ function buildExampleContent(context) {
99
+ const { body, header } = context;
100
+ const inlineContent = getInlineContent(header);
101
+ if (inlineContent.length > 0) {
102
+ return `${inlineContent}\n${body}`;
103
+ }
104
+ return body;
105
+ }
106
+ /**
107
+ * Builds an Example from a regex match and raw comment value.
108
+ * @param match Regex match from the example pattern.
109
+ * @param commentValue Raw comment value.
110
+ * @returns Example metadata extracted from the match.
111
+ * @example
112
+ * ```typescript
113
+ * const example = buildExampleFromMatch(match, commentValue);
114
+ * ```
115
+ */
116
+ function buildExampleFromMatch(match, commentValue) {
117
+ const [full] = match;
118
+ const header = match.groups?.["header"] ?? "";
119
+ const body = match.groups?.["body"] ?? "";
120
+ const startOffset = match.index ?? 0;
121
+ const content = buildExampleContent({ body, header });
122
+ const prefix = getPrefix(header);
123
+ const { endIndex, endOffset, lineIndex } = getLineMeta({
124
+ commentValue,
125
+ full,
126
+ startOffset,
127
+ });
128
+ return {
129
+ content: content.trim(),
130
+ endIndex,
131
+ endOffset,
132
+ lineIndex,
133
+ prefix,
134
+ startOffset,
135
+ };
136
+ }
137
+ /**
138
+ * Checks example content for required fences and language.
139
+ * @param content Example content to inspect.
140
+ * @returns Problem identifier when the content is invalid.
141
+ * @example
142
+ * ```typescript
143
+ * const problem = checkExampleContent("```typescript\nconst ok = true;\n```");
144
+ * ```
145
+ */
146
+ function checkExampleContent(content) {
147
+ if (content.trim().length === 0) {
148
+ return "emptyExample";
149
+ }
150
+ const { hasEmptyFence, missingLanguage, sawFence } = analyzeFenceContent(content);
151
+ if (missingLanguage) {
152
+ return "missingLanguage";
153
+ }
154
+ if (sawFence && hasEmptyFence) {
155
+ return "emptyExample";
156
+ }
157
+ if (!sawFence) {
158
+ return "missingFence";
159
+ }
160
+ return void 0;
161
+ }
162
+ /**
163
+ * Extracts all `@example` entries from a JSDoc comment value.
164
+ * Uses a multiline regex to capture the header and following lines
165
+ * until the next JSDoc tag or the end of the comment.
166
+ * @param commentValue Raw comment value.
167
+ * @returns Extracted examples.
168
+ * @example
169
+ * ```typescript
170
+ * const examples = getExamples("* @example\n* ```typescript\n* ok\n* ```");
171
+ * ```
172
+ */
173
+ function getExamples(commentValue) {
174
+ const examples = [];
175
+ for (const match of commentValue.matchAll(examplePattern)) {
176
+ examples.push(buildExampleFromMatch(match, commentValue));
177
+ }
178
+ return examples;
179
+ }
180
+ export { buildExampleFromMatch, checkExampleContent, getExamples };
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbXBsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jcy9yZXF1aXJlLWV4YW1wbGUtbGFuZ3VhZ2UvZXhhbXBsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLFNBQVMsRUFDVCxjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QiwyREFBMkQ7QUFDM0QsTUFBTSxjQUFjLEdBQ2xCLHdGQUF3RixDQUFDO0FBb0IzRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBaUIsRUFBRSxRQUFnQixFQUFjLEVBQUU7SUFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1Isc0JBQXNCLEVBQUUsS0FBSztZQUM3QixPQUFPLEVBQUUsSUFBSTtZQUNiLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxLQUFLO1FBQ1Isc0JBQXNCLEVBQUUsS0FBSztRQUM3QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0I7UUFDbkUsT0FBTyxFQUFFLEtBQUs7UUFDZCxlQUFlLEVBQUUsS0FBSztRQUN0QixRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQzlCLEtBQWlCLEVB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XCI7XG5cbmltcG9ydCB7XG4gIGdldEZlbmNlTGFuZ3VhZ2UsXG4gIGdldElubGluZUNvbnRlbnQsXG4gIGdldExpbmVNZXRhLFxuICBnZXRQcmVmaXgsXG4gIGhhc0xpbmVDb250ZW50LFxufSBmcm9tIFwiLi9leGFtcGxlLXV0aWxpdGllc1wiO1xuXG4vKiogQ2FwdHVyZXMgYEBleGFtcGxlYCBoZWFkZXJzIGFuZCBib2RpZXMgZm9yIGFuYWx5c2lzLiAqL1xuY29uc3QgZXhhbXBsZVBhdHRlcm4gPVxuICAvXig/PGhlYWRlcj5cXHMqXFwqP1xccypAZXhhbXBsZVxcYlteXFxuXSopKD88Ym9keT5bXFxzXFxTXSo/KSg/PV5cXHMqXFwqP1xccypAXFx3K3woPyFbXFxzXFxTXSkpL2dtdTtcblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEZlbmNlU3RhdGUge1xuICAvKiogQ3VycmVudEZlbmNlSGFzQ29udGVudCBmaWVsZCB2YWx1ZS4gKi9cbiAgY3VycmVudEZlbmNlSGFzQ29udGVudDogYm9vbGVhbjtcblxuICAvKiogSGFzRW1wdHlGZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgaGFzRW1wdHlGZW5jZTogYm9vbGVhbjtcblxuICAvKiogSW5GZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgaW5GZW5jZTogYm9vbGVhbjtcblxuICAvKiogTWlzc2luZ0xhbmd1YWdlIGZpZWxkIHZhbHVlLiAqL1xuICBtaXNzaW5nTGFuZ3VhZ2U6IGJvb2xlYW47XG5cbiAgLyoqIFNhd0ZlbmNlIGZpZWxkIHZhbHVlLiAqL1xuICBzYXdGZW5jZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGZlbmNlIHN0YXRlIGJhc2VkIG9uIHRoZSBkZXRlY3RlZCBsYW5ndWFnZS5cbiAqIEBwYXJhbSBzdGF0ZSBDdXJyZW50IGZlbmNlIHRyYWNraW5nIHN0YXRlLlxuICogQHBhcmFtIGxhbmd1YWdlIEZlbmNlIGxhbmd1YWdlIHN0cmluZy5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgZmVuY2UgdHJhY2tpbmcgc3RhdGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmV4dCA9IHVwZGF0ZUZlbmNlU3RhdGUoc3RhdGUsIFwidHlwZXNjcmlwdFwiKTtcbiAqIGBgYFxuICovXG5jb25zdCB1cGRhdGVGZW5jZVN0YXRlID0gKHN0YXRlOiBGZW5jZVN0YXRlLCBsYW5ndWFnZTogc3RyaW5nKTogRmVuY2VTdGF0ZSA9PiB7XG4gIGlmICghc3RhdGUuaW5GZW5jZSkge1xuICAgIGlmIChsYW5ndWFnZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBtaXNzaW5nTGFuZ3VhZ2U6IHRydWUsIHNhd0ZlbmNlOiB0cnVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgY3VycmVudEZlbmNlSGFzQ29udGVudDogZmFsc2UsXG4gICAgICBpbkZlbmNlOiB0cnVlLFxuICAgICAgbWlzc2luZ0xhbmd1YWdlOiBmYWxzZSxcbiAgICAgIHNhd0ZlbmNlOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGN1cnJlbnRGZW5jZUhhc0NvbnRlbnQ6IGZhbHNlLFxuICAgIGhhc0VtcHR5RmVuY2U6IHN0YXRlLmhhc0VtcHR5RmVuY2UgfHwgIXN0YXRlLmN1cnJlbnRGZW5jZUhhc0NvbnRlbnQsXG4gICAgaW5GZW5jZTogZmFsc2UsXG4gICAgbWlzc2luZ0xhbmd1YWdlOiBmYWxzZSxcbiAgICBzYXdGZW5jZTogdHJ1ZSxcbiAgfTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBmZW5jZSB0cmFja2luZyBmb3IgYSBzaW5nbGUgZXhhbXBsZSBsaW5lLlxuICogQHBhcmFtIHN0YXRlIEN1cnJlbnQgZmVuY2UgdHJhY2tpbmcgc3RhdGUuXG4gKiBAcGFyYW0gbGluZSBFeGFtcGxlIGxpbmUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgZmVuY2UgdHJhY2tpbmcgc3RhdGUuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbmV4dCA9IHVwZGF0ZUZlbmNlU3RhdGVGb3JMaW5lKHN0YXRlLCBcIiAqIG9rXCIpO1xuICogYGBgXG4gKi9cbmNvbnN0IHVwZGF0ZUZlbmNlU3RhdGVGb3JMaW5lID0gKFxuICBzdGF0ZTogRmVuY2VTdGF0ZSxcbiAgbGluZTogc3RyaW5nLFxuKTogRmVuY2VTdGF0ZSA9PiB7XG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0RmVuY2VMYW5ndWFnZShsaW5lKTtcblxuICBpZiAobGFuZ3VhZ2UgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiB1cGRhdGVGZW5jZVN0YXRlKHN0YXRlLCBsYW5ndWFnZSk7XG4gIH1cblxuICBpZiAoc3RhdGUuaW5GZW5jZSAmJiBoYXNMaW5lQ29udGVudChsaW5lKSkge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCBjdXJyZW50RmVuY2VIYXNDb250ZW50OiB0cnVlIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKiogVHlwZSBkZWZpbml0aW9uIGZvciBydWxlIGRhdGEuICovXG5pbnRlcmZhY2UgRXhhbXBsZUNvbnRlbnRDb250ZXh0IHtcbiAgLyoqIEJvZHkgZmllbGQgdmFsdWUuICovXG4gIGJvZHk6IHN0cmluZztcblxuICAvKiogSGVhZGVyIGZpZWxkIHZhbHVlLiAqL1xuICBoZWFkZXI6IHN0cmluZztcbn1cblxuLyoqIFR5cGUgZGVmaW5pdGlvbiBmb3IgcnVsZSBkYXRhLiAqL1xuaW50ZXJmYWNlIEZlbmNlQW5hbHlzaXMge1xuICAvKiogSGFzRW1wdHlGZW5jZSBmaWVsZCB2YWx1ZS4gKi9cbiAgaGFzRW1wdHlGZW5jZTogYm9vbGVhbjtcblxuICAvKiogTWlzc2luZ0xhbmd1YWdlIGZpZWxkIHZhbHVlLiAqL1xuICBtaXNzaW5nTGFuZ3VhZ2U6IGJvb2xlYW47XG5cbiAgLyoqIFNhd0ZlbmNlIGZpZWxkIHZhbHVlLiAqL1xuICBzYXdGZW5jZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbmFseXplcyBmZW5jZWQgY29kZSBibG9ja3MgZm9yIG1pc3NpbmcgbGFuZ3VhZ2UgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0gY29udGVudCBFeGFtcGxlIGNvbnRlbnQgdG8gYW5hbHl6ZS5cbiAqIEByZXR1cm5zIEZlbmNlIGFuYWx5c2lzIHJlc3VsdHMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYW5hbHlzaXMgPSBhbmFseXplRmVuY2VDb250ZW50KFwiYGBgdHlwZXNjcmlwdFxcbmNvbnN0IHZhbHVlID0gMTtcXG5gYGBcIik7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYW5hbHl6ZUZlbmNlQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBGZW5jZUFuYWx5c2lzIHtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuL3UpO1xuICBsZXQgc3RhdGU6IEZlbmNlU3RhdGUgPSB7XG4gICAgY3VycmVudEZlbmNlSGFzQ29udGVudDogZmFsc2UsXG4gICAgaGFzRW1wdHlGZW5jZTogZmFsc2UsXG4gICAgaW5GZW5jZTogZmFsc2UsXG4gICAgbWlzc2luZ0xhbmd1YWdlOiBmYWxzZSxcbiAgICBzYXdGZW5jZTogZmFsc2UsXG4gIH07XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVGZW5jZVN0YXRlRm9yTGluZShzdGF0ZSwgbGluZSk7XG5cbiAgICBpZiAoc3RhdGUubWlzc2luZ0xhbmd1YWdlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUuaW5GZW5jZSAmJiAhc3RhdGUuY3VycmVudEZlbmNlSGFzQ29udGVudCkge1xuICAgIHN0YXRlID0geyAuLi5zdGF0ZSwgaGFzRW1wdHlGZW5jZTogdHJ1ZSB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNFbXB0eUZlbmNlOiBzdGF0ZS5oYXNFbXB0eUZlbmNlLFxuICAgIG1pc3NpbmdMYW5ndWFnZTogc3RhdGUubWlzc2luZ0xhbmd1YWdlLFxuICAgIHNhd0ZlbmNlOiBzdGF0ZS5zYXdGZW5jZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgZXhhbXBsZSBjb250ZW50IGZyb20gYW4gaW5saW5lIGhlYWRlciBhbmQgYm9keSBsaW5lcy5cbiAqIEBwYXJhbSBjb250ZXh0IEV4YW1wbGUgaGVhZGVyIGFuZCBib2R5IGxpbmVzLlxuICogQHJldHVybnMgQ29tYmluZWQgZXhhbXBsZSBjb250ZW50LlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbnRlbnQgPSBidWlsZEV4YW1wbGVDb250ZW50KHsgYm9keTogXCIqIG9rXCIsIGhlYWRlcjogXCIqIEBleGFtcGxlXCIgfSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYnVpbGRFeGFtcGxlQ29udGVudChjb250ZXh0OiBFeGFtcGxlQ29udGVudENvbnRleHQpOiBzdHJpbmcge1xuICBjb25zdCB7IGJvZHksIGhlYWRlciB9ID0gY29udGV4dDtcbiAgY29uc3QgaW5saW5lQ29udGVudCA9IGdldElubGluZUNvbnRlbnQoaGVhZGVyKTtcblxuICBpZiAoaW5saW5lQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2lubGluZUNvbnRlbnR9XFxuJHtib2R5fWA7XG4gIH1cblxuICByZXR1cm4gYm9keTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gRXhhbXBsZSBmcm9tIGEgcmVnZXggbWF0Y2ggYW5kIHJhdyBjb21tZW50IHZhbHVlLlxuICogQHBhcmFtIG1hdGNoIFJlZ2V4IG1hdGNoIGZyb20gdGhlIGV4YW1wbGUgcGF0dGVybi5cbiAqIEBwYXJhbSBjb21tZW50VmFsdWUgUmF3IGNvbW1lbnQgdmFsdWUuXG4gKiBAcmV0dXJucyBFeGFtcGxlIG1ldGFkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBtYXRjaC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleGFtcGxlID0gYnVpbGRFeGFtcGxlRnJvbU1hdGNoKG1hdGNoLCBjb21tZW50VmFsdWUpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRXhhbXBsZUZyb21NYXRjaChcbiAgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXksXG4gIGNvbW1lbnRWYWx1ZTogc3RyaW5nLFxuKTogRXhhbXBsZSB7XG4gIGNvbnN0IFtmdWxsXSA9IG1hdGNoO1xuICBjb25zdCBoZWFkZXIgPSBtYXRjaC5ncm91cHM/LltcImhlYWRlclwiXSA/PyBcIlwiO1xuICBjb25zdCBib2R5ID0gbWF0Y2guZ3JvdXBzPy5bXCJib2R5XCJdID8/IFwiXCI7XG4gIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gbWF0Y2guaW5kZXggPz8gMDtcbiAgY29uc3QgY29udGVudCA9IGJ1aWxkRXhhbXBsZUNvbnRlbnQoeyBib2R5LCBoZWFkZXIgfSk7XG4gIGNvbnN0IHByZWZpeCA9IGdldFByZWZpeChoZWFkZXIpO1xuICBjb25zdCB7IGVuZEluZGV4LCBlbmRPZmZzZXQsIGxpbmVJbmRleCB9ID0gZ2V0TGluZU1ldGEoe1xuICAgIGNvbW1lbnRWYWx1ZSxcbiAgICBmdWxsLFxuICAgIHN0YXJ0T2Zmc2V0LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnQudHJpbSgpLFxuICAgIGVuZEluZGV4LFxuICAgIGVuZE9mZnNldCxcbiAgICBsaW5lSW5kZXgsXG4gICAgcHJlZml4LFxuICAgIHN0YXJ0T2Zmc2V0LFxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBleGFtcGxlIGNvbnRlbnQgZm9yIHJlcXVpcmVkIGZlbmNlcyBhbmQgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0gY29udGVudCBFeGFtcGxlIGNvbnRlbnQgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFByb2JsZW0gaWRlbnRpZmllciB3aGVuIHRoZSBjb250ZW50IGlzIGludmFsaWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcHJvYmxlbSA9IGNoZWNrRXhhbXBsZUNvbnRlbnQoXCJgYGB0eXBlc2NyaXB0XFxuY29uc3Qgb2sgPSB0cnVlO1xcbmBgYFwiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBjaGVja0V4YW1wbGVDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IFByb2JsZW0gfCB1bmRlZmluZWQge1xuICBpZiAoY29udGVudC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiZW1wdHlFeGFtcGxlXCI7XG4gIH1cbiAgY29uc3QgeyBoYXNFbXB0eUZlbmNlLCBtaXNzaW5nTGFuZ3VhZ2UsIHNhd0ZlbmNlIH0gPVxuICAgIGFuYWx5emVGZW5jZUNvbnRlbnQoY29udGVudCk7XG5cbiAgaWYgKG1pc3NpbmdMYW5ndWFnZSkge1xuICAgIHJldHVybiBcIm1pc3NpbmdMYW5ndWFnZVwiO1xuICB9XG5cbiAgaWYgKHNhd0ZlbmNlICYmIGhhc0VtcHR5RmVuY2UpIHtcbiAgICByZXR1cm4gXCJlbXB0eUV4YW1wbGVcIjtcbiAgfVxuXG4gIGlmICghc2F3RmVuY2UpIHtcbiAgICByZXR1cm4gXCJtaXNzaW5nRmVuY2VcIjtcbiAgfVxuXG4gIHJldHVybiB2b2lkIDA7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYWxsIGBAZXhhbXBsZWAgZW50cmllcyBmcm9tIGEgSlNEb2MgY29tbWVudCB2YWx1ZS5cbiAqIFVzZXMgYSBtdWx0aWxpbmUgcmVnZXggdG8gY2FwdHVyZSB0aGUgaGVhZGVyIGFuZCBmb2xsb3dpbmcgbGluZXNcbiAqIHVudGlsIHRoZSBuZXh0IEpTRG9jIHRhZyBvciB0aGUgZW5kIG9mIHRoZSBjb21tZW50LlxuICogQHBhcmFtIGNvbW1lbnRWYWx1ZSBSYXcgY29tbWVudCB2YWx1ZS5cbiAqIEByZXR1cm5zIEV4dHJhY3RlZCBleGFtcGxlcy5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleGFtcGxlcyA9IGdldEV4YW1wbGVzKFwiKiBAZXhhbXBsZVxcbiogYGBgdHlwZXNjcmlwdFxcbiogb2tcXG4qIGBgYFwiKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBnZXRFeGFtcGxlcyhjb21tZW50VmFsdWU6IHN0cmluZyk6IEV4YW1wbGVbXSB7XG4gIGNvbnN0IGV4YW1wbGVzOiBFeGFtcGxlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbW1lbnRWYWx1ZS5tYXRjaEFsbChleGFtcGxlUGF0dGVybikpIHtcbiAgICBleGFtcGxlcy5wdXNoKGJ1aWxkRXhhbXBsZUZyb21NYXRjaChtYXRjaCwgY29tbWVudFZhbHVlKSk7XG4gIH1cblxuICByZXR1cm4gZXhhbXBsZXM7XG59XG5cbmV4cG9ydCB7IGJ1aWxkRXhhbXBsZUZyb21NYXRjaCwgY2hlY2tFeGFtcGxlQ29udGVudCwgZ2V0RXhhbXBsZXMgfTtcbiJdfQ==
@@ -0,0 +1,49 @@
1
+ import type { Rule } from "eslint";
2
+ import type { Example, Problem } from "./types";
3
+ /** Type definition for rule data. */
4
+ interface FixerContext {
5
+ /** AbsoluteEnd field value. */
6
+ absoluteEnd: number;
7
+ /** AbsoluteStart field value. */
8
+ absoluteStart: number;
9
+ /** Example field value. */
10
+ example: Example;
11
+ /** HasOtherExamples field value. */
12
+ hasOtherExamples: boolean;
13
+ /** Problem field value. */
14
+ problem: Problem;
15
+ /** SourceText field value. */
16
+ sourceText: string;
17
+ }
18
+ /**
19
+ * Builds a full example with a fenced block when missing entirely.
20
+ * @param example Example metadata.
21
+ * @returns Example text with a fenced block.
22
+ * @example
23
+ * ```typescript
24
+ * const text = buildMissingFenceFix(example);
25
+ * ```
26
+ */
27
+ declare function buildMissingFenceFix(example: Example): string;
28
+ /**
29
+ * Adds missing languages to existing fenced blocks.
30
+ * @param original Original comment text.
31
+ * @returns Updated comment text when changes are made.
32
+ * @example
33
+ * ```typescript
34
+ * const updated = buildMissingLanguageFix("* ```\n* ok\n* ```");
35
+ * ```
36
+ */
37
+ declare function buildMissingLanguageFix(original: string): string | undefined;
38
+ /**
39
+ * Builds a fixer function for the report.
40
+ * @param context Fixer context details.
41
+ * @returns Fixer function for ESLint.
42
+ * @example
43
+ * ```typescript
44
+ * const fixer = createFixer(context);
45
+ * ```
46
+ */
47
+ declare function createFixer(context: FixerContext): (fixer: Rule.RuleFixer) => null | Rule.Fix;
48
+ export { buildMissingFenceFix, buildMissingLanguageFix, createFixer };
49
+ //# sourceMappingURL=fixes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixes.d.ts","sourceRoot":"","sources":["../../../src/docs/require-example-language/fixes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA8BhD,qCAAqC;AACrC,UAAU,YAAY;IACpB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AA2CD;;;;;;;;GAQG;AACH,iBAAS,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBtD;AAED;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBrE;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAClB,OAAO,EAAE,YAAY,GACpB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,CAY5C;AAwHD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAE,CAAC"}