@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -1
  3. package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
  4. package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
  5. package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
  6. package/bundlers/esbuild-impl/index/package.json +6 -0
  7. package/bundlers/esbuild-impl/package.json +6 -0
  8. package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
  9. package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
  10. package/bundlers/index/package.json +6 -0
  11. package/bundlers/package.json +6 -0
  12. package/dist/lib/cjs/build.cjs +191 -0
  13. package/dist/lib/cjs/build.d.cts +59 -0
  14. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
  15. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
  16. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
  17. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
  18. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
  19. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
  24. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
  26. package/dist/lib/cjs/bundlers/index.cjs +99 -0
  27. package/dist/lib/cjs/bundlers/index.d.cts +2 -0
  28. package/dist/lib/cjs/check-project-types.cjs +163 -0
  29. package/dist/lib/cjs/check-project-types.d.cts +92 -0
  30. package/dist/lib/cjs/cli-utils.cjs +276 -0
  31. package/dist/lib/cjs/cli-utils.d.cts +123 -0
  32. package/dist/lib/cjs/code-generator.cjs +96 -0
  33. package/dist/lib/cjs/code-generator.d.cts +14 -0
  34. package/dist/lib/cjs/commitlint-config.cjs +110 -0
  35. package/dist/lib/cjs/commitlint-config.d.cts +14 -0
  36. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
  37. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
  38. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
  39. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
  40. package/dist/lib/cjs/env-toggle.cjs +133 -0
  41. package/dist/lib/cjs/env-toggle.d.cts +42 -0
  42. package/dist/lib/cjs/exec.cjs +455 -0
  43. package/dist/lib/cjs/exec.d.cts +162 -0
  44. package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
  45. package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
  46. package/dist/lib/cjs/formatters/dprint.cjs +108 -0
  47. package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
  48. package/dist/lib/cjs/formatters/index.cjs +99 -0
  49. package/dist/lib/cjs/formatters/index.d.cts +2 -0
  50. package/dist/lib/cjs/fs.cjs +123 -0
  51. package/dist/lib/cjs/fs.d.cts +80 -0
  52. package/dist/lib/cjs/gate.cjs +140 -0
  53. package/dist/lib/cjs/gate.d.cts +93 -0
  54. package/dist/lib/cjs/git.cjs +109 -0
  55. package/dist/lib/cjs/git.d.cts +37 -0
  56. package/dist/lib/cjs/index.cjs +186 -0
  57. package/dist/lib/cjs/index.d.cts +35 -0
  58. package/dist/lib/cjs/json.cjs +141 -0
  59. package/dist/lib/cjs/json.d.cts +102 -0
  60. package/dist/lib/cjs/library-build.cjs +483 -0
  61. package/dist/lib/cjs/library-build.d.cts +101 -0
  62. package/dist/lib/cjs/library-references.d.cts +5 -0
  63. package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
  64. package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
  65. package/dist/lib/cjs/linters/cspell.cjs +103 -0
  66. package/dist/lib/cjs/linters/cspell.d.cts +36 -0
  67. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
  68. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
  69. package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
  70. package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
  71. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
  72. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
  73. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
  74. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
  75. package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
  76. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
  77. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
  78. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
  79. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
  80. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
  81. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
  82. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
  83. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
  84. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
  85. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
  86. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
  87. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
  88. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
  89. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
  90. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
  91. package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
  92. package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
  93. package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
  94. package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
  95. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
  96. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
  97. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
  98. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
  99. package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
  100. package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
  101. package/dist/lib/cjs/linters/eslint.cjs +196 -0
  102. package/dist/lib/cjs/linters/eslint.d.cts +74 -0
  103. package/dist/lib/cjs/linters/index.cjs +138 -0
  104. package/dist/lib/cjs/linters/index.d.cts +15 -0
  105. package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
  106. package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
  107. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
  108. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
  109. package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
  110. package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
  111. package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
  112. package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
  113. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
  114. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
  115. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
  116. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
  117. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
  118. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
  119. package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
  120. package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
  121. package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
  122. package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
  123. package/dist/lib/cjs/nano-staged-config.cjs +148 -0
  124. package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
  125. package/dist/lib/cjs/npm-publish.cjs +93 -0
  126. package/dist/lib/cjs/npm-publish.d.cts +19 -0
  127. package/dist/lib/cjs/npm-run.cjs +120 -0
  128. package/dist/lib/cjs/npm-run.d.cts +34 -0
  129. package/dist/lib/cjs/npm.cjs +200 -0
  130. package/dist/lib/cjs/npm.d.cts +168 -0
  131. package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
  132. package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
  133. package/dist/lib/cjs/package-manager.cjs +291 -0
  134. package/dist/lib/cjs/package-manager.d.cts +93 -0
  135. package/dist/lib/cjs/released-issues.cjs +178 -0
  136. package/dist/lib/cjs/released-issues.d.cts +79 -0
  137. package/dist/lib/cjs/repo-paths.cjs +167 -0
  138. package/dist/lib/cjs/repo-paths.d.cts +318 -0
  139. package/dist/lib/cjs/root.cjs +150 -0
  140. package/dist/lib/cjs/root.d.cts +107 -0
  141. package/dist/lib/cjs/test-runners/index.cjs +102 -0
  142. package/dist/lib/cjs/test-runners/index.d.cts +3 -0
  143. package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
  144. package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
  145. package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
  146. package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
  147. package/dist/lib/cjs/validate-declarations.cjs +120 -0
  148. package/dist/lib/cjs/validate-declarations.d.cts +37 -0
  149. package/dist/lib/cjs/version.cjs +758 -0
  150. package/dist/lib/cjs/version.d.cts +418 -0
  151. package/dist/lib/esm/build.d.mts +59 -0
  152. package/dist/lib/esm/build.mjs +165 -0
  153. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
  154. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
  155. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
  156. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
  157. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
  158. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
  159. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
  160. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
  161. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
  162. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
  163. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
  164. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
  165. package/dist/lib/esm/bundlers/index.d.mts +2 -0
  166. package/dist/lib/esm/bundlers/index.mjs +52 -0
  167. package/dist/lib/esm/check-project-types.d.mts +92 -0
  168. package/dist/lib/esm/check-project-types.mjs +123 -0
  169. package/dist/lib/esm/cli-utils.d.mts +123 -0
  170. package/dist/lib/esm/cli-utils.mjs +225 -0
  171. package/dist/lib/esm/code-generator.d.mts +14 -0
  172. package/dist/lib/esm/code-generator.mjs +59 -0
  173. package/dist/lib/esm/commitlint-config.d.mts +14 -0
  174. package/dist/lib/esm/commitlint-config.mjs +79 -0
  175. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
  176. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
  177. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
  178. package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
  179. package/dist/lib/esm/env-toggle.d.mts +42 -0
  180. package/dist/lib/esm/env-toggle.mjs +84 -0
  181. package/dist/lib/esm/exec.d.mts +162 -0
  182. package/dist/lib/esm/exec.mjs +410 -0
  183. package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
  184. package/dist/lib/esm/forbidden-patterns.mjs +108 -0
  185. package/dist/lib/esm/formatters/dprint.d.mts +33 -0
  186. package/dist/lib/esm/formatters/dprint.mjs +75 -0
  187. package/dist/lib/esm/formatters/index.d.mts +2 -0
  188. package/dist/lib/esm/formatters/index.mjs +52 -0
  189. package/dist/lib/esm/fs.d.mts +80 -0
  190. package/dist/lib/esm/fs.mjs +89 -0
  191. package/dist/lib/esm/gate.d.mts +93 -0
  192. package/dist/lib/esm/gate.mjs +106 -0
  193. package/dist/lib/esm/git.d.mts +37 -0
  194. package/dist/lib/esm/git.mjs +72 -0
  195. package/dist/lib/esm/index.d.mts +35 -0
  196. package/dist/lib/esm/index.mjs +110 -0
  197. package/dist/lib/esm/json.d.mts +102 -0
  198. package/dist/lib/esm/json.mjs +106 -0
  199. package/dist/lib/esm/library-build.d.mts +101 -0
  200. package/dist/lib/esm/library-build.mjs +443 -0
  201. package/dist/lib/esm/library-references.d.mts +5 -0
  202. package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
  203. package/dist/lib/esm/linters/cspell-content.mjs +87 -0
  204. package/dist/lib/esm/linters/cspell.d.mts +36 -0
  205. package/dist/lib/esm/linters/cspell.mjs +69 -0
  206. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
  207. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
  208. package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
  209. package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
  210. package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
  211. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
  212. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
  213. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
  214. package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
  215. package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
  216. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
  217. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
  218. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
  219. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
  220. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
  221. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
  222. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
  223. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
  224. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
  225. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
  226. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
  227. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
  228. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
  229. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
  230. package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
  231. package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
  232. package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
  233. package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
  234. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
  235. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
  236. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
  237. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
  238. package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
  239. package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
  240. package/dist/lib/esm/linters/eslint.d.mts +74 -0
  241. package/dist/lib/esm/linters/eslint.mjs +159 -0
  242. package/dist/lib/esm/linters/index.d.mts +15 -0
  243. package/dist/lib/esm/linters/index.mjs +78 -0
  244. package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
  245. package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
  246. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
  247. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
  248. package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
  249. package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
  250. package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
  251. package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
  252. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
  253. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
  254. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
  255. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
  256. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
  257. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
  258. package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
  259. package/dist/lib/esm/linters/markdownlint.mjs +124 -0
  260. package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
  261. package/dist/lib/esm/linters/over-exposure.mjs +672 -0
  262. package/dist/lib/esm/nano-staged-config.d.mts +54 -0
  263. package/dist/lib/esm/nano-staged-config.mjs +103 -0
  264. package/dist/lib/esm/npm-publish.d.mts +19 -0
  265. package/dist/lib/esm/npm-publish.mjs +56 -0
  266. package/dist/lib/esm/npm-run.d.mts +34 -0
  267. package/dist/lib/esm/npm-run.mjs +81 -0
  268. package/dist/lib/esm/npm.d.mts +168 -0
  269. package/dist/lib/esm/npm.mjs +155 -0
  270. package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
  271. package/dist/lib/esm/package-lock-integrity.mjs +99 -0
  272. package/dist/lib/esm/package-manager.d.mts +93 -0
  273. package/dist/lib/esm/package-manager.mjs +245 -0
  274. package/dist/lib/esm/released-issues.d.mts +79 -0
  275. package/dist/lib/esm/released-issues.mjs +143 -0
  276. package/dist/lib/esm/repo-paths.d.mts +318 -0
  277. package/dist/lib/esm/repo-paths.mjs +130 -0
  278. package/dist/lib/esm/root.d.mts +107 -0
  279. package/dist/lib/esm/root.mjs +115 -0
  280. package/dist/lib/esm/test-runners/index.d.mts +3 -0
  281. package/dist/lib/esm/test-runners/index.mjs +54 -0
  282. package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
  283. package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
  284. package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
  285. package/dist/lib/esm/test-runners/vitest.mjs +76 -0
  286. package/dist/lib/esm/validate-declarations.d.mts +37 -0
  287. package/dist/lib/esm/validate-declarations.mjs +87 -0
  288. package/dist/lib/esm/version.d.mts +418 -0
  289. package/dist/lib/esm/version.mjs +723 -0
  290. package/formatters/dprint/package.json +6 -0
  291. package/formatters/index/package.json +6 -0
  292. package/formatters/package.json +6 -0
  293. package/linters/cspell/package.json +6 -0
  294. package/linters/cspell-content/package.json +6 -0
  295. package/linters/eslint/package.json +6 -0
  296. package/linters/eslint-agnostic-core-boundary/package.json +6 -0
  297. package/linters/eslint-config/package.json +6 -0
  298. package/linters/eslint-no-restricted-syntax/package.json +6 -0
  299. package/linters/eslint-rules/in-house-plugin/package.json +6 -0
  300. package/linters/eslint-rules/index/package.json +6 -0
  301. package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
  302. package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
  303. package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
  304. package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
  305. package/linters/eslint-rules/package.json +6 -0
  306. package/linters/eslint-rules/params-options-name-match/package.json +6 -0
  307. package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
  308. package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
  309. package/linters/eslint-rules/require-method-template/package.json +6 -0
  310. package/linters/eslint-rules/require-super-call/package.json +6 -0
  311. package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
  312. package/linters/eslint-rules/ts-estree-node/package.json +6 -0
  313. package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
  314. package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
  315. package/linters/index/package.json +6 -0
  316. package/linters/lint-ignores/package.json +6 -0
  317. package/linters/markdownlint/package.json +6 -0
  318. package/linters/markdownlint-cli2-config/package.json +6 -0
  319. package/linters/markdownlint-content/package.json +6 -0
  320. package/linters/markdownlint-ignores/package.json +6 -0
  321. package/linters/markdownlint-rules/index/package.json +6 -0
  322. package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
  323. package/linters/markdownlint-rules/package.json +6 -0
  324. package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
  325. package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
  326. package/linters/over-exposure/package.json +6 -0
  327. package/linters/package.json +6 -0
  328. package/package.json +329 -13
  329. package/test-runners/index/package.json +6 -0
  330. package/test-runners/package.json +6 -0
  331. package/test-runners/vitest/package.json +6 -0
  332. package/test-runners/vitest-config/package.json +6 -0
@@ -0,0 +1,67 @@
1
+ /// <reference path="../../../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The types for `markdownlint-cli2`'s programmatic entry point, which the package itself describes in JSDoc
6
+ * and ships no declaration for. Vendored here, beside the configuration-schema types, for the same reason.
7
+ *
8
+ * Only the parameters {@link lintMarkdownContent} passes are declared. The full parameter object also carries
9
+ * `argv`, `allowStdin`, `fileContents`, `fs`, `noImport` and `optionsOverride`, none of which a caller linting
10
+ * one in-memory document has any use for — and declaring an option nobody passes is a claim about a shape
11
+ * nothing here ever checks.
12
+ */
13
+
14
+ declare module 'markdownlint-cli2' {
15
+ /**
16
+ * The parameters of {@link main}.
17
+ */
18
+ interface MarkdownlintCli2Parameters {
19
+ /**
20
+ * The directory whose `markdownlint-cli2` configuration applies, and the base every reported path is
21
+ * relative to.
22
+ *
23
+ * @default `process.cwd()`
24
+ */
25
+ readonly directory?: string | undefined;
26
+
27
+ /**
28
+ * Called once per finding, with the line the default output formatter would have printed.
29
+ */
30
+ readonly logError?: ((message: string) => void) | undefined;
31
+
32
+ /**
33
+ * Called with the banner and the progress lines — everything that is not a finding.
34
+ */
35
+ readonly logMessage?: ((message: string) => void) | undefined;
36
+
37
+ /**
38
+ * Whether to skip glob expansion entirely, including the `globs` the configuration declares. Set it when
39
+ * the only input is {@link nonFileContents}, so the run cannot wander into the repository's own files.
40
+ *
41
+ * @default `false`
42
+ */
43
+ readonly noGlobs?: boolean | undefined;
44
+
45
+ /**
46
+ * Content to lint that is not read from disk, keyed by the POSIX path it is linted AS. The path decides
47
+ * which directory's configuration applies and how the path-relative rules (such as `relative-links`)
48
+ * resolve, so it should be the path the content is destined for.
49
+ */
50
+ readonly nonFileContents?: Record<string, string> | undefined;
51
+
52
+ /**
53
+ * The options the discovered configuration is merged OVER — a base, not an override. `config` is merged
54
+ * key by key and every other option is replaced wholesale, so anything the repository states itself wins.
55
+ */
56
+ readonly optionsDefault?: import('./markdownlint-cli2-config-schema.d.mjs').MarkdownlintCli2ConfigurationSchema | undefined;
57
+ }
58
+
59
+ /**
60
+ * Runs `markdownlint-cli2`.
61
+ *
62
+ * @param parameters - The {@link MarkdownlintCli2Parameters}.
63
+ * @returns A {@link Promise} that resolves to the process exit code: `0` when nothing was reported, `1`
64
+ * when something was, `2` when the run itself failed.
65
+ */
66
+ export function main(parameters: MarkdownlintCli2Parameters): Promise<number>;
67
+ }
@@ -0,0 +1,32 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Lint markdown documentation using `markdownlint-cli2` and `linkinator`.
6
+ */
7
+ /**
8
+ * Parameters for the {@link lint} function.
9
+ */
10
+ export interface LintOptions {
11
+ /**
12
+ * The configuration file copied to the project root when the project has none. Without it,
13
+ * `markdownlint-cli2` runs with its own defaults.
14
+ */
15
+ readonly defaultConfigFilePath?: string | undefined;
16
+ /**
17
+ * Optional file paths to lint. If omitted, lints the entire project.
18
+ */
19
+ readonly paths?: string[] | undefined;
20
+ /**
21
+ * Whether to fix linting issues automatically.
22
+ *
23
+ * @default `false`
24
+ */
25
+ readonly shouldFix?: boolean | undefined;
26
+ }
27
+ /**
28
+ * Lint markdown documentation using `markdownlint-cli2` and `linkinator`.
29
+ *
30
+ * @param options - The {@link LintOptions}.
31
+ */
32
+ export declare function lint(options?: LintOptions): Promise<void>;
@@ -0,0 +1,124 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ const existingProcess = globalThis.process;
23
+
24
+ if (!existingProcess) {
25
+ globalThis.process = browserProcess;
26
+ return;
27
+ }
28
+
29
+ if (existingProcess.versions?.node) {
30
+ return;
31
+ }
32
+
33
+ const existingProcessRecord = existingProcess;
34
+
35
+ for (const [key, value] of Object.entries(browserProcess)) {
36
+ existingProcessRecord[key] ??= value;
37
+ }
38
+
39
+ existingProcessRecord['browser'] = true;
40
+ }
41
+
42
+ (function initEsm() {
43
+ ensureDisposeSymbols();
44
+ ensureBrowserProcess();
45
+ })();
46
+ })();
47
+
48
+ import { toArray } from "@mnaoumov/typescript-lib/async";
49
+ import { getLibDebugger } from "@mnaoumov/typescript-lib/debug";
50
+ import { basename } from "@mnaoumov/typescript-lib/path";
51
+ import { existsSync } from "node:fs";
52
+ import {
53
+ cp,
54
+ glob
55
+ } from "node:fs/promises";
56
+ import { relative } from "node:path";
57
+ import { getNonIgnoredFiles } from "../git.mjs";
58
+ import { resolveToolCommand } from "../package-manager.mjs";
59
+ import { RepoPaths } from "../repo-paths.mjs";
60
+ import {
61
+ execFromRoot,
62
+ getRootFolder,
63
+ resolvePathFromRootSafe
64
+ } from "../root.mjs";
65
+ import {
66
+ checkIsInNodeModules,
67
+ NODE_MODULES_IGNORE_GLOB
68
+ } from "./markdownlint-ignores.mjs";
69
+ async function lint(options) {
70
+ const { defaultConfigFilePath, paths, shouldFix = false } = options ?? {};
71
+ const configFiles = [
72
+ RepoPaths.MarkdownlintCli2ConfigJsonc,
73
+ RepoPaths.MarkdownlintCli2ConfigYaml,
74
+ RepoPaths.MarkdownlintCli2ConfigCjs,
75
+ RepoPaths.MarkdownlintCli2ConfigMjs,
76
+ RepoPaths.MarkdownlintConfigJsonc,
77
+ RepoPaths.MarkdownlintConfigJson,
78
+ RepoPaths.MarkdownlintConfigYaml,
79
+ RepoPaths.MarkdownlintConfigYml,
80
+ RepoPaths.MarkdownlintConfigCjs,
81
+ RepoPaths.MarkdownlintConfigMjs
82
+ ];
83
+ const doesConfigFileExist = configFiles.some((configFile) => {
84
+ const configFilePath = resolvePathFromRootSafe({ path: configFile });
85
+ return existsSync(configFilePath);
86
+ });
87
+ if (!doesConfigFileExist && defaultConfigFilePath) {
88
+ getLibDebugger("markdownlint:lint")("markdownlint configuration file not found. Creating default config...");
89
+ await cp(defaultConfigFilePath, resolvePathFromRootSafe({ path: basename(defaultConfigFilePath) }));
90
+ }
91
+ const targets = paths?.length ? paths : [RepoPaths.CurrentFolder];
92
+ await execFromRoot([...resolveToolCommand({ tool: "markdownlint-cli2" }), ...shouldFix ? ["--fix"] : [], { batchedArguments: targets }]);
93
+ const rootFolder = getRootFolder() ?? process.cwd();
94
+ const mdFiles = paths?.length ? paths.map((p) => relative(rootFolder, p).replaceAll("\\", "/") || p) : await getMarkdownFiles();
95
+ await execFromRoot([
96
+ ...resolveToolCommand({ tool: "linkinator" }),
97
+ "--retry",
98
+ "--retry-errors",
99
+ "--retry-errors-count",
100
+ "3",
101
+ "--retry-errors-jitter",
102
+ "5",
103
+ "--url-rewrite-search",
104
+ String.raw`https://www\.npmjs\.com/package/`,
105
+ "--url-rewrite-replace",
106
+ "https://registry.npmjs.org/",
107
+ { batchedArguments: mdFiles }
108
+ ]);
109
+ }
110
+ const MARKDOWN_PATHSPEC = "*.md";
111
+ async function getMarkdownFiles() {
112
+ const nonIgnoredFiles = await getNonIgnoredFiles({ patterns: [MARKDOWN_PATHSPEC] });
113
+ return nonIgnoredFiles ? nonIgnoredFiles.filter((path) => !checkIsInNodeModules(path)) : await toArray(glob(["**/*.md"], {
114
+ exclude: [
115
+ ".git/**",
116
+ "dist/**",
117
+ NODE_MODULES_IGNORE_GLOB
118
+ ]
119
+ }));
120
+ }
121
+ export {
122
+ lint
123
+ };
124
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvbWFya2Rvd25saW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTGludCBtYXJrZG93biBkb2N1bWVudGF0aW9uIHVzaW5nIGBtYXJrZG93bmxpbnQtY2xpMmAgYW5kIGBsaW5raW5hdG9yYC5cbiAqL1xuXG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnJztcbmltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgY3AsXG4gIGdsb2Jcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldE5vbklnbm9yZWRGaWxlcyB9IGZyb20gJy4uL2dpdC50cyc7XG5pbXBvcnQgeyByZXNvbHZlVG9vbENvbW1hbmQgfSBmcm9tICcuLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4uL3Jvb3QudHMnO1xuaW1wb3J0IHtcbiAgY2hlY2tJc0luTm9kZU1vZHVsZXMsXG4gIE5PREVfTU9EVUxFU19JR05PUkVfR0xPQlxufSBmcm9tICcuL21hcmtkb3dubGludC1pZ25vcmVzLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIGxpbnR9IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29waWVkIHRvIHRoZSBwcm9qZWN0IHJvb3Qgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm9uZS4gV2l0aG91dCBpdCxcbiAgICogYG1hcmtkb3dubGludC1jbGkyYCBydW5zIHdpdGggaXRzIG93biBkZWZhdWx0cy5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRDb25maWdGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZmlsZSBwYXRocyB0byBsaW50LiBJZiBvbWl0dGVkLCBsaW50cyB0aGUgZW50aXJlIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSBwYXRocz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZpeCBsaW50aW5nIGlzc3VlcyBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIExpbnQgbWFya2Rvd24gZG9jdW1lbnRhdGlvbiB1c2luZyBgbWFya2Rvd25saW50LWNsaTJgIGFuZCBgbGlua2luYXRvcmAuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIExpbnRPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbnQob3B0aW9ucz86IExpbnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmZpZ0ZpbGVQYXRoLCBwYXRocywgc2hvdWxkRml4ID0gZmFsc2UgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGNvbmZpZ0ZpbGVzID0gW1xuICAgIFJlcG9QYXRocy5NYXJrZG93bmxpbnRDbGkyQ29uZmlnSnNvbmMsXG4gICAgUmVwb1BhdGhzLk1hcmtkb3dubGludENsaTJDb25maWdZYW1sLFxuICAgIFJlcG9QYXRocy5NYXJrZG93bmxpbnRDbGkyQ29uZmlnQ2pzLFxuICAgIFJlcG9QYXRocy5NYXJrZG93bmxpbnRDbGkyQ29uZmlnTWpzLFxuICAgIFJlcG9QYXRocy5NYXJrZG93bmxpbnRDb25maWdKc29uYyxcbiAgICBSZXBvUGF0aHMuTWFya2Rvd25saW50Q29uZmlnSnNvbixcbiAgICBSZXBvUGF0aHMuTWFya2Rvd25saW50Q29uZmlnWWFtbCxcbiAgICBSZXBvUGF0aHMuTWFya2Rvd25saW50Q29uZmlnWW1sLFxuICAgIFJlcG9QYXRocy5NYXJrZG93bmxpbnRDb25maWdDanMsXG4gICAgUmVwb1BhdGhzLk1hcmtkb3dubGludENvbmZpZ01qc1xuICBdO1xuXG4gIGNvbnN0IGRvZXNDb25maWdGaWxlRXhpc3QgPSBjb25maWdGaWxlcy5zb21lKChjb25maWdGaWxlKSA9PiB7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGNvbmZpZ0ZpbGUgfSk7XG4gICAgcmV0dXJuIGV4aXN0c1N5bmMoY29uZmlnRmlsZVBhdGgpO1xuICB9KTtcblxuICBpZiAoIWRvZXNDb25maWdGaWxlRXhpc3QgJiYgZGVmYXVsdENvbmZpZ0ZpbGVQYXRoKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ21hcmtkb3dubGludDpsaW50JykoJ21hcmtkb3dubGludCBjb25maWd1cmF0aW9uIGZpbGUgbm90IGZvdW5kLiBDcmVhdGluZyBkZWZhdWx0IGNvbmZpZy4uLicpO1xuICAgIGF3YWl0IGNwKGRlZmF1bHRDb25maWdGaWxlUGF0aCwgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBiYXNlbmFtZShkZWZhdWx0Q29uZmlnRmlsZVBhdGgpIH0pKTtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGUgcGF0aHMtcHJvdmlkZWQgYnJhbmNoZXMgYXJlIG9ubHkgZXhlcmNpc2VkIGJ5IGNvbnN1bWVyIHByb2plY3RzIHBhc3NpbmcgZmlsZSBsaXN0cy4gKi9cbiAgY29uc3QgdGFyZ2V0cyA9IHBhdGhzPy5sZW5ndGggPyBwYXRocyA6IFtSZXBvUGF0aHMuQ3VycmVudEZvbGRlcl07XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbLi4ucmVzb2x2ZVRvb2xDb21tYW5kKHsgdG9vbDogJ21hcmtkb3dubGludC1jbGkyJyB9KSwgLi4uKHNob3VsZEZpeCA/IFsnLS1maXgnXSA6IFtdKSwgeyBiYXRjaGVkQXJndW1lbnRzOiB0YXJnZXRzIH1dKTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhlIHBhdGhzLXByb3ZpZGVkIGJyYW5jaCBpcyBvbmx5IGV4ZXJjaXNlZCBieSBjb25zdW1lciBwcm9qZWN0cyBwYXNzaW5nIGZpbGUgbGlzdHMuICovXG4gIGNvbnN0IHJvb3RGb2xkZXIgPSBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgbWRGaWxlcyA9IHBhdGhzPy5sZW5ndGhcbiAgICA/IHBhdGhzLm1hcCgocCkgPT4gcmVsYXRpdmUocm9vdEZvbGRlciwgcCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJykgfHwgcClcbiAgICA6IGF3YWl0IGdldE1hcmtkb3duRmlsZXMoKTtcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFtcbiAgICAuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAnbGlua2luYXRvcicgfSksXG4gICAgJy0tcmV0cnknLFxuICAgICctLXJldHJ5LWVycm9ycycsXG4gICAgJy0tcmV0cnktZXJyb3JzLWNvdW50JyxcbiAgICAnMycsXG4gICAgJy0tcmV0cnktZXJyb3JzLWppdHRlcicsXG4gICAgJzUnLFxuICAgICctLXVybC1yZXdyaXRlLXNlYXJjaCcsXG4gICAgU3RyaW5nLnJhd2BodHRwczovL3d3d1xcLm5wbWpzXFwuY29tL3BhY2thZ2UvYCxcbiAgICAnLS11cmwtcmV3cml0ZS1yZXBsYWNlJyxcbiAgICAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJyxcbiAgICB7IGJhdGNoZWRBcmd1bWVudHM6IG1kRmlsZXMgfVxuICBdKTtcbn1cblxuLyoqXG4gKiBUaGUgZ2l0IHBhdGhzcGVjIG1hdGNoaW5nIGV2ZXJ5IG1hcmtkb3duIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnksIGF0IGFueSBkZXB0aC5cbiAqL1xuY29uc3QgTUFSS0RPV05fUEFUSFNQRUMgPSAnKi5tZCc7XG5cbi8qKlxuICogTGlzdHMgdGhlIG1hcmtkb3duIGZpbGVzIHRvIGhhbmQgdG8gYGxpbmtpbmF0b3JgLlxuICpcbiAqIGBsaW5raW5hdG9yYCB0YWtlcyBhIGZpbGUgbGlzdCByYXRoZXIgdGhhbiBhbiBpZ25vcmUgY29uZmlndXJhdGlvbiwgc28gdGhlIGdpdGlnbm9yZWQgZmlsZXMgaGF2ZSB0byBiZVxuICogZHJvcHBlZCBiZWZvcmUgaXQgaXMgaW52b2tlZC4gR2l0IGl0c2VsZiBhbnN3ZXJzIHRoYXQgKG5lc3RlZCBpZ25vcmUgZmlsZXMsIGAhYCBuZWdhdGlvbnMgYW5kIGFsbCk7IHRoZVxuICogaGFuZC1tYWludGFpbmVkIGdsb2IgZXhjbHVzaW9ucyBiZWxvdyBhcmUgb25seSB0aGUgZmFsbGJhY2sgZm9yIGEgY2hlY2tvdXQgd2l0aG91dCBnaXQsIGFuZCB0aGV5IGFyZSB0aGVcbiAqIHZlcnkgbGlzdHMgdGhpcyBpbmRpcmVjdGlvbiBleGlzdHMgdG8gc3RvcCBmcm9tIGRyaWZ0aW5nLlxuICpcbiAqIFRoZSBgbm9kZV9tb2R1bGVzYCBmaWx0ZXIgaXMgYXBwbGllZCB0byB0aGUgZ2l0LWRlcml2ZWQgbGlzdCB0b28sIGFuZCBkZWxpYmVyYXRlbHkgc286IGdpdCBvbmx5IHNraXBzXG4gKiB3aGF0IHRoZSByZXBvc2l0b3J5IGFza2VkIGl0IHRvIHNraXAsIGFuZCBhIHJlcG9zaXRvcnkgY2FuIGRlbGliZXJhdGVseSBUUkFDSyBhIHZlbmRvcmVkIGBub2RlX21vZHVsZXNgXG4gKiB0cmVlLiBUaGF0IGlzIHRoZSBvbmUgZXhjbHVzaW9uIGAuZ2l0aWdub3JlYCBjYW5ub3QgYW5zd2VyIFx1MjAxNCBzZWUgYG1hcmtkb3dubGludC1pZ25vcmVzLnRzYC4gQXBwbHlpbmcgaXRcbiAqIGhlcmUga2VlcHMgYGxpbmtpbmF0b3JgIGluIHN0ZXAgd2l0aCB0aGUgbWFya2Rvd25saW50IGhhbGYsIHdoaWNoIGlnbm9yZXMgdGhlIHNhbWUgcGF0aHMgYnkgZ2xvYi5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG1hcmtkb3duIGZpbGUgcGF0aHMsIHJlbGF0aXZlIHRvIHRoZSByb290IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TWFya2Rvd25GaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IG5vbklnbm9yZWRGaWxlcyA9IGF3YWl0IGdldE5vbklnbm9yZWRGaWxlcyh7IHBhdHRlcm5zOiBbTUFSS0RPV05fUEFUSFNQRUNdIH0pO1xuICByZXR1cm4gbm9uSWdub3JlZEZpbGVzXG4gICAgPyBub25JZ25vcmVkRmlsZXMuZmlsdGVyKChwYXRoKSA9PiAhY2hlY2tJc0luTm9kZU1vZHVsZXMocGF0aCkpXG4gICAgOiAoYXdhaXQgdG9BcnJheShnbG9iKFsnKiovKi5tZCddLCB7XG4gICAgICBleGNsdWRlOiBbXG4gICAgICAgICcuZ2l0LyoqJyxcbiAgICAgICAgJ2Rpc3QvKionLFxuICAgICAgICBOT0RFX01PRFVMRVNfSUdOT1JFX0dMT0JcbiAgICAgIF1cbiAgICB9KSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxTQUFTLGVBQWU7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGdCQUFnQjtBQUV6QixTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQThCUCxlQUFzQixLQUFLLFNBQXNDO0FBQy9ELFFBQU0sRUFBRSx1QkFBdUIsT0FBTyxZQUFZLE1BQU0sSUFBSSxXQUFXLENBQUM7QUFDeEUsUUFBTSxjQUFjO0FBQUEsSUFDbEIsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLEVBQ1o7QUFFQSxRQUFNLHNCQUFzQixZQUFZLEtBQUssQ0FBQyxlQUFlO0FBQzNELFVBQU0saUJBQWlCLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25FLFdBQU8sV0FBVyxjQUFjO0FBQUEsRUFDbEMsQ0FBQztBQUVELE1BQUksQ0FBQyx1QkFBdUIsdUJBQXVCO0FBQ2pELG1CQUFlLG1CQUFtQixFQUFFLHVFQUF1RTtBQUMzRyxVQUFNLEdBQUcsdUJBQXVCLHdCQUF3QixFQUFFLE1BQU0sU0FBUyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7QUFBQSxFQUNwRztBQUdBLFFBQU0sVUFBVSxPQUFPLFNBQVMsUUFBUSxDQUFDLFVBQVUsYUFBYTtBQUVoRSxRQUFNLGFBQWEsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUMsR0FBRyxHQUFJLFlBQVksQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFJLEVBQUUsa0JBQWtCLFFBQVEsQ0FBQyxDQUFDO0FBR3pJLFFBQU0sYUFBYSxjQUFjLEtBQUssUUFBUSxJQUFJO0FBQ2xELFFBQU0sVUFBVSxPQUFPLFNBQ25CLE1BQU0sSUFBSSxDQUFDLE1BQU0sU0FBUyxZQUFZLENBQUMsRUFBRSxXQUFXLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFDbkUsTUFBTSxpQkFBaUI7QUFFM0IsUUFBTSxhQUFhO0FBQUEsSUFDakIsR0FBRyxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUFBLElBQzVDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxPQUFPO0FBQUEsSUFDUDtBQUFBLElBQ0E7QUFBQSxJQUNBLEVBQUUsa0JBQWtCLFFBQVE7QUFBQSxFQUM5QixDQUFDO0FBQ0g7QUFLQSxNQUFNLG9CQUFvQjtBQWlCMUIsZUFBZSxtQkFBc0M7QUFDbkQsUUFBTSxrQkFBa0IsTUFBTSxtQkFBbUIsRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUNsRixTQUFPLGtCQUNILGdCQUFnQixPQUFPLENBQUMsU0FBUyxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFDM0QsTUFBTSxRQUFRLEtBQUssQ0FBQyxTQUFTLEdBQUc7QUFBQSxJQUNqQyxTQUFTO0FBQUEsTUFDUDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQyxDQUFDO0FBQ047IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,357 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Over-exposure analyzer.
6
+ *
7
+ * Finds declarations exposed more broadly than their references require, so the exposure can be
8
+ * tightened:
9
+ *
10
+ * - `export`ed symbols referenced only within their own file — the `export` can be dropped.
11
+ * - `public` class members referenced only inside their own class — they can be `private`.
12
+ * - `public` class members referenced only inside their own class and its subclasses — they can be
13
+ * `protected`.
14
+ * - `protected` class members referenced only inside their own class — they can be `private`.
15
+ *
16
+ * The analysis is whole-program and type-aware: it uses the TypeScript language service's
17
+ * find-all-references to locate every use of each declaration, then classifies the tightest
18
+ * exposure that still covers all references. Because `findReferences` does not link a string-literal
19
+ * argument back to a member declaration when the parameter is a conditional/mapped key type (e.g.
20
+ * `bind(component, 'someSetting')` where the key is typed `ConditionalKeys<Settings, …>`), member
21
+ * analysis additionally treats a string literal whose text equals the member name as a reference —
22
+ * but only when its contextual type is a string-literal type (or union of them) all of whose members
23
+ * are keys of the declaring class, so incidental same-named strings (`console.log('name')`) are not
24
+ * miscounted. Members invoked by the framework via registration
25
+ * rather than by visible references (Obsidian lifecycle hooks, settings-tab `display`, etc.) are
26
+ * excluded via {@link LIFECYCLE_ALLOWLIST}, as are `override` and `static` members whose exposure is
27
+ * constrained by a base declaration. ECMAScript hard-private members (`#name`) are also excluded —
28
+ * they are already maximally private and cannot carry a visibility modifier. A declaration carrying
29
+ * a TSDoc (`/** … *\/`) documentation comment is likewise excluded — whether a top-level `export` or
30
+ * a class member, documenting it is a deliberate signal that it is part of the intended public API,
31
+ * regardless of where it currently happens to be referenced.
32
+ *
33
+ * A member referenced only from test files is reported with {@link OverExposureFinding.isForcedByTestOnly}
34
+ * set, surfacing members widened purely for testability — the canonical case for extracting logic
35
+ * into an independently testable component instead.
36
+ *
37
+ * Beyond reporting, passing `shouldFix` to {@link findOverExposure} / {@link analyzeOverExposure}
38
+ * rewrites the source in place: dropping the `export` keyword, or replacing/inserting a `private`
39
+ * or `protected` modifier. Each finding then carries {@link OverExposureFinding.wasFixed} /
40
+ * {@link OverExposureFinding.skipReason}. Changes that cannot be safely automated — those forced
41
+ * only by test references, decorated members, or an `export` shared with a still-exported sibling —
42
+ * are reported as skipped and left untouched.
43
+ *
44
+ * Additionally passing `shouldForce` (only meaningful together with `shouldFix`) tightens the
45
+ * declarations held wide purely by test references too — the production half of the canonical
46
+ * test-only migration: the member becomes `private` / the `export` is dropped, leaving only the
47
+ * test to switch to a cast-based access. Decorated members and exports shared with a still-exported
48
+ * sibling stay skipped even under `shouldForce`, because no edit can be applied safely.
49
+ */
50
+ import type { CompilerOptions, LanguageService, LanguageServiceHost } from 'typescript';
51
+ /**
52
+ * Parameters for {@link analyzeOverExposure}.
53
+ */
54
+ export interface AnalyzeOverExposureParams {
55
+ /**
56
+ The language service to query for references and types.
57
+ */
58
+ readonly languageService: LanguageService;
59
+ /**
60
+ * Optional callback invoked once per analyzed source file, before that file is processed. The
61
+ * whole-program reference analysis is slow, so this lets callers report live progress instead of
62
+ * appearing to hang.
63
+ */
64
+ readonly onProgress?: (progress: OverExposureProgress) => void;
65
+ /**
66
+ * When `true`, each fixable finding is tightened in place via {@link writeFile} (which must then
67
+ * be provided), and the returned findings carry {@link OverExposureFinding.wasFixed} /
68
+ * {@link OverExposureFinding.skipReason}. When `false` or omitted, the analysis only reports.
69
+ *
70
+ * @default `false`
71
+ */
72
+ readonly shouldFix?: boolean | undefined;
73
+ /**
74
+ * When `true` (only meaningful together with {@link shouldFix}), declarations held wide purely by
75
+ * test references are tightened too, instead of being skipped with a `test-only`
76
+ * {@link OverExposureFinding.skipReason}. Decorated members and exports shared with a
77
+ * still-exported sibling stay skipped regardless, because no edit can be applied safely.
78
+ *
79
+ * @default `false`
80
+ */
81
+ readonly shouldForce?: boolean | undefined;
82
+ /**
83
+ * Absolute (canonical) path of the project's `src` folder. Only declarations in non-test files
84
+ * under this folder are analyzed; declarations elsewhere (test files, dependencies) are ignored
85
+ * but still counted as reference sites.
86
+ */
87
+ readonly srcFolder: string;
88
+ /**
89
+ * Writes the tightened contents of a changed file back to disk. Required when {@link shouldFix}
90
+ * is `true`; ignored otherwise.
91
+ *
92
+ * @param path - Absolute path of the file to write (original casing, as stored in the program).
93
+ * @param content - The full new file contents.
94
+ */
95
+ readonly writeFile?: (path: string, content: string) => void;
96
+ }
97
+ /**
98
+ * Parameters for {@link createLanguageServiceHost}.
99
+ */
100
+ export interface CreateLanguageServiceHostParams {
101
+ /**
102
+ The compiler options.
103
+ */
104
+ readonly compilerOptions: CompilerOptions;
105
+ /**
106
+ The files to include in the program.
107
+ */
108
+ readonly fileNames: readonly string[];
109
+ /**
110
+ The file-system operations used to read sources.
111
+ */
112
+ readonly fileSystem: OverExposureFileSystem;
113
+ }
114
+ /**
115
+ * Parameters for {@link createProjectLanguageService}.
116
+ */
117
+ export interface CreateProjectLanguageServiceParams {
118
+ /**
119
+ Absolute path to the project's `tsconfig.json`.
120
+ */
121
+ readonly tsConfigPath: string;
122
+ }
123
+ /**
124
+ * The exposure level a declaration currently has.
125
+ */
126
+ export type CurrentExposure = 'export' | 'protected' | 'public';
127
+ /**
128
+ * Parameters for {@link findOverExposure}.
129
+ */
130
+ export interface FindOverExposureParams {
131
+ /**
132
+ * Optional callback invoked once per analyzed source file, for live progress reporting. Forwarded
133
+ * to {@link analyzeOverExposure}.
134
+ */
135
+ readonly onProgress?: (progress: OverExposureProgress) => void;
136
+ /**
137
+ Absolute path to the project root (the folder containing `tsconfig.json` and `src`).
138
+ */
139
+ readonly projectFolder: string;
140
+ /**
141
+ * When `true`, fixable findings are tightened in place on disk (the `export` keyword is dropped,
142
+ * or a `private` / `protected` modifier is inserted/replaced). When `false` or omitted, the
143
+ * project is only analyzed.
144
+ *
145
+ * @default `false`
146
+ */
147
+ readonly shouldFix?: boolean | undefined;
148
+ /**
149
+ * When `true` (only meaningful together with {@link shouldFix}), declarations held wide purely by
150
+ * test references are tightened too, instead of being skipped. Decorated members and exports
151
+ * shared with a still-exported sibling stay skipped regardless. Forwarded to
152
+ * {@link analyzeOverExposure}.
153
+ *
154
+ * @default `false`
155
+ */
156
+ readonly shouldForce?: boolean | undefined;
157
+ }
158
+ /**
159
+ * Options for {@link formatOverExposureFindings}.
160
+ */
161
+ export interface FormatOverExposureFindingsOptions {
162
+ /**
163
+ * When set, file paths in the report are rendered relative to this folder (typically the current
164
+ * working directory) instead of as absolute paths. Paths outside the folder stay absolute.
165
+ */
166
+ readonly baseFolder?: string;
167
+ }
168
+ /**
169
+ * The subset of file-system operations the language-service host needs. Injecting this (rather than
170
+ * always using `typescript`'s `sys`) lets tests drive the analyzer against in-memory sources with no
171
+ * real file-system access.
172
+ */
173
+ export interface OverExposureFileSystem {
174
+ /**
175
+ * Checks whether a directory exists.
176
+ *
177
+ * @param path - Directory path.
178
+ * @returns `true` when the directory exists.
179
+ */
180
+ directoryExists: (path: string) => boolean;
181
+ /**
182
+ * Checks whether a file exists.
183
+ *
184
+ * @param path - File path.
185
+ * @returns `true` when the file exists.
186
+ */
187
+ fileExists: (path: string) => boolean;
188
+ /**
189
+ * Resolves the directory that relative paths are resolved against.
190
+ *
191
+ * @returns The current working directory.
192
+ */
193
+ getCurrentDirectory: () => string;
194
+ /**
195
+ * Lists the immediate subdirectories of a directory.
196
+ *
197
+ * @param path - Directory path.
198
+ * @returns The immediate subdirectory names.
199
+ */
200
+ getDirectories: (path: string) => string[];
201
+ /**
202
+ * Lists the files under a directory, filtered by extension and include/exclude patterns.
203
+ *
204
+ * @param path - Root directory.
205
+ * @param extensions - Extensions to include.
206
+ * @param exclude - Patterns to exclude.
207
+ * @param include - Patterns to include.
208
+ * @param depth - Maximum recursion depth.
209
+ * @returns The matching file paths.
210
+ */
211
+ readDirectory: (path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number) => string[];
212
+ /**
213
+ * Reads a file as text.
214
+ *
215
+ * @param path - File path.
216
+ * @returns The file contents, or `undefined` when absent.
217
+ */
218
+ readFile: (path: string) => string | undefined;
219
+ }
220
+ /**
221
+ * A single over-exposed declaration.
222
+ */
223
+ export interface OverExposureFinding {
224
+ /**
225
+ 1-based column of the declaration's name.
226
+ */
227
+ readonly column: number;
228
+ /**
229
+ The current exposure level.
230
+ */
231
+ readonly currentExposure: CurrentExposure;
232
+ /**
233
+ Absolute path of the file declaring the symbol.
234
+ */
235
+ readonly filePath: string;
236
+ /**
237
+ `true` when the declaration has no references at all (besides itself).
238
+ */
239
+ readonly hasNoReferences: boolean;
240
+ /**
241
+ * `true` when the declaration would qualify for a tighter exposure if not for references coming
242
+ * exclusively from test files — i.e. it is exposed purely for testability.
243
+ */
244
+ readonly isForcedByTestOnly: boolean;
245
+ /**
246
+ `true` for a class member, `false` for a top-level export.
247
+ */
248
+ readonly isMember: boolean;
249
+ /**
250
+ 1-based line of the declaration's name.
251
+ */
252
+ readonly line: number;
253
+ /**
254
+ The declared name.
255
+ */
256
+ readonly name: string;
257
+ /**
258
+ * In a fix run, why this finding was left untouched instead of tightened; `null` when it was
259
+ * fixed or when the analysis only reported (`shouldFix` off).
260
+ */
261
+ readonly skipReason: null | OverExposureSkipReason;
262
+ /**
263
+ The exposure the declaration could be tightened to.
264
+ */
265
+ readonly suggestedExposure: SuggestedExposure;
266
+ /**
267
+ `true` when a fix run tightened this declaration in place. Always `false` in a report run.
268
+ */
269
+ readonly wasFixed: boolean;
270
+ }
271
+ /**
272
+ * Progress reported while analyzing a project, one event per analyzed source file.
273
+ */
274
+ export interface OverExposureProgress {
275
+ /**
276
+ Number of source files fully analyzed before the current one (0-based).
277
+ */
278
+ readonly analyzedFileCount: number;
279
+ /**
280
+ Absolute (canonical) path of the source file about to be analyzed.
281
+ */
282
+ readonly currentFilePath: string;
283
+ /**
284
+ Total number of source files that will be analyzed.
285
+ */
286
+ readonly totalFileCount: number;
287
+ }
288
+ /**
289
+ * Why a fix run left a finding untouched:
290
+ *
291
+ * - `decorated` — the member carries a decorator, so the modifier insertion point is ambiguous.
292
+ * - `shared-export` — the `export` keyword is shared with a still-exported sibling declarator.
293
+ * - `test-only` — the declaration is exposed purely for tests, so tightening would break the test.
294
+ */
295
+ export type OverExposureSkipReason = 'decorated' | 'shared-export' | 'test-only';
296
+ /**
297
+ * The (tighter) exposure level a declaration could be reduced to.
298
+ */
299
+ export type SuggestedExposure = 'file-local' | 'private' | 'protected';
300
+ /**
301
+ * Lifecycle and framework members invoked by Obsidian or a base class via registration rather than
302
+ * by references the language service can see. Tightening these would break the framework contract,
303
+ * so they are never reported.
304
+ */
305
+ export declare const LIFECYCLE_ALLOWLIST: ReadonlySet<string>;
306
+ /**
307
+ * Analyzes a project (already loaded into a language service) for over-exposed declarations, and —
308
+ * when {@link AnalyzeOverExposureParams.shouldFix} is set — tightens every fixable finding in place
309
+ * via {@link AnalyzeOverExposureParams.writeFile}. Findings that cannot be safely automated (exposed
310
+ * only for tests, decorated, or sharing an `export` keyword with a still-exported sibling) carry a
311
+ * {@link OverExposureFinding.skipReason} and are left untouched — unless
312
+ * {@link AnalyzeOverExposureParams.shouldForce} is set, which additionally tightens the test-only
313
+ * findings (decorated and shared-export ones still stay skipped).
314
+ *
315
+ * @param params - The {@link AnalyzeOverExposureParams}.
316
+ * @returns The over-exposed declarations, in discovery order.
317
+ */
318
+ export declare function analyzeOverExposure(params: AnalyzeOverExposureParams): OverExposureFinding[];
319
+ /**
320
+ * Builds a {@link LanguageServiceHost} backed by an explicit file list and file system.
321
+ *
322
+ * @param params - The {@link CreateLanguageServiceHostParams}.
323
+ * @returns The language-service host.
324
+ */
325
+ export declare function createLanguageServiceHost(params: CreateLanguageServiceHostParams): LanguageServiceHost;
326
+ /**
327
+ * Builds a language service over every file in a project's `tsconfig.json`.
328
+ *
329
+ * @param params - The {@link CreateProjectLanguageServiceParams}.
330
+ * @returns A language service ready for {@link analyzeOverExposure}.
331
+ */
332
+ export declare function createProjectLanguageService(params: CreateProjectLanguageServiceParams): LanguageService;
333
+ /**
334
+ * Finds over-exposed declarations in a project on disk. When
335
+ * {@link FindOverExposureParams.shouldFix} is set, each fixable finding is also tightened in place
336
+ * (rewriting the affected source files via `typescript`'s `sys.writeFile`).
337
+ *
338
+ * @param params - The {@link FindOverExposureParams}.
339
+ * @returns The over-exposed declarations.
340
+ */
341
+ export declare function findOverExposure(params: FindOverExposureParams): OverExposureFinding[];
342
+ /**
343
+ * Formats over-exposure findings as a human-readable report, using the grouped layout of ESLint's
344
+ * `stylish` formatter. Findings are grouped by file and sorted by line: each file is rendered as a
345
+ * `path` header line, followed by one indented ` line:column change -- reason` row per finding (the
346
+ * `line:column` is right-padded so the rows align within a file). Terminals such as VS Code render
347
+ * each indented `line:column` as a clickable link — resolved against the file header above it — that
348
+ * jumps straight to the declaration. File groups are separated by a blank line. In a fix run (findings
349
+ * carrying {@link OverExposureFinding.wasFixed} / {@link OverExposureFinding.skipReason}) each change
350
+ * row is suffixed with `[fixed]` or `[skipped: …]`, and the trailing summary appends the fixed/skipped
351
+ * counts.
352
+ *
353
+ * @param findings - The findings to format.
354
+ * @param options - The {@link FormatOverExposureFindingsOptions}.
355
+ * @returns The report text. Empty-finding input yields a single "no findings" line.
356
+ */
357
+ export declare function formatOverExposureFindings(findings: readonly OverExposureFinding[], options?: FormatOverExposureFindingsOptions): string;