@zxyycom/vibe-check 0.0.1 → 0.0.2

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 (950) hide show
  1. package/README.md +47 -74
  2. package/dist/esm/cache/cache-json-by-key.mjs +189 -0
  3. package/dist/esm/cache/cache-json-by-key.mjs.map +1 -0
  4. package/dist/esm/check/check.mjs.map +1 -1
  5. package/dist/esm/check/finding-presentation.mjs +40 -0
  6. package/dist/esm/check/finding-presentation.mjs.map +1 -0
  7. package/dist/esm/check/inherited-collection.mjs +1 -1
  8. package/dist/esm/check/inherited-collection.mjs.map +1 -1
  9. package/dist/esm/check-settlement/fact-validation.mjs +17 -23
  10. package/dist/esm/check-settlement/fact-validation.mjs.map +1 -1
  11. package/dist/esm/check-settlement/outcome-normalization.mjs +9 -19
  12. package/dist/esm/check-settlement/outcome-normalization.mjs.map +1 -1
  13. package/dist/esm/check-settlement/reason-shape.mjs +12 -0
  14. package/dist/esm/check-settlement/reason-shape.mjs.map +1 -0
  15. package/dist/esm/check-settlement/record-store.mjs +14 -17
  16. package/dist/esm/check-settlement/record-store.mjs.map +1 -1
  17. package/dist/esm/check-settlement/session.mjs +8 -2
  18. package/dist/esm/check-settlement/session.mjs.map +1 -1
  19. package/dist/esm/data-boundary/closed-values.mjs +16 -0
  20. package/dist/esm/data-boundary/closed-values.mjs.map +1 -1
  21. package/dist/esm/data-boundary/value-shapes.mjs +9 -0
  22. package/dist/esm/data-boundary/value-shapes.mjs.map +1 -1
  23. package/dist/esm/index.mjs +9 -2
  24. package/dist/esm/index.mjs.map +1 -1
  25. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs +56 -0
  26. package/dist/esm/learned-critical-path/duration-model/bounded-history.mjs.map +1 -0
  27. package/dist/esm/learned-critical-path/duration-model/prediction.mjs +122 -0
  28. package/dist/esm/learned-critical-path/duration-model/prediction.mjs.map +1 -0
  29. package/dist/esm/learned-critical-path/duration-model/preparation.mjs +41 -0
  30. package/dist/esm/learned-critical-path/duration-model/preparation.mjs.map +1 -0
  31. package/dist/esm/learned-critical-path/duration-model/recording.mjs +109 -0
  32. package/dist/esm/learned-critical-path/duration-model/recording.mjs.map +1 -0
  33. package/dist/esm/learned-critical-path/duration-model/storage.mjs +187 -0
  34. package/dist/esm/learned-critical-path/duration-model/storage.mjs.map +1 -0
  35. package/dist/esm/learned-critical-path/selection-layers.mjs +28 -0
  36. package/dist/esm/learned-critical-path/selection-layers.mjs.map +1 -0
  37. package/dist/esm/learned-critical-path/static-decision.mjs +55 -0
  38. package/dist/esm/learned-critical-path/static-decision.mjs.map +1 -0
  39. package/dist/esm/learned-critical-path/strategy.mjs +179 -0
  40. package/dist/esm/learned-critical-path/strategy.mjs.map +1 -0
  41. package/dist/esm/machine-output/v4/atomic-publication.mjs +1 -15
  42. package/dist/esm/machine-output/v4/atomic-publication.mjs.map +1 -1
  43. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs +40 -0
  44. package/dist/esm/package-checks/code-quality-findings/finding-waiver-authoring.mjs.map +1 -0
  45. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs +48 -0
  46. package/dist/esm/package-checks/code-quality-findings/finding-waiver-evidence.mjs.map +1 -0
  47. package/dist/esm/package-checks/code-quality-findings/policy.mjs +20 -0
  48. package/dist/esm/package-checks/code-quality-findings/policy.mjs.map +1 -1
  49. package/dist/esm/package-checks/duplicate-detection/area-policy.mjs +15 -7
  50. package/dist/esm/package-checks/duplicate-detection/area-policy.mjs.map +1 -1
  51. package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs +1 -1
  52. package/dist/esm/package-checks/duplicate-detection/cache/identity.mjs.map +1 -1
  53. package/dist/esm/package-checks/duplicate-detection/default-check.mjs +1 -1
  54. package/dist/esm/package-checks/duplicate-detection/default-check.mjs.map +1 -1
  55. package/dist/esm/package-checks/duplicate-detection/execution.mjs +44 -18
  56. package/dist/esm/package-checks/duplicate-detection/execution.mjs.map +1 -1
  57. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs +59 -0
  58. package/dist/esm/package-checks/duplicate-detection/finding-messages.mjs.map +1 -0
  59. package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs +55 -0
  60. package/dist/esm/package-checks/duplicate-detection/finding-waiver-identity.mjs.map +1 -0
  61. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs +1 -1
  62. package/dist/esm/package-checks/duplicate-detection/jscpd/availability.mjs.map +1 -1
  63. package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs +1 -1
  64. package/dist/esm/package-checks/duplicate-detection/jscpd/command-resolution.mjs.map +1 -1
  65. package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs +15 -5
  66. package/dist/esm/package-checks/duplicate-detection/jscpd/json-report.mjs.map +1 -1
  67. package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs +5 -4
  68. package/dist/esm/package-checks/duplicate-detection/jscpd/scanner.mjs.map +1 -1
  69. package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs +22 -47
  70. package/dist/esm/package-checks/duplicate-detection/options-resolution.mjs.map +1 -1
  71. package/dist/esm/package-checks/duplicate-detection/options-validation.mjs +20 -25
  72. package/dist/esm/package-checks/duplicate-detection/options-validation.mjs.map +1 -1
  73. package/dist/esm/package-checks/duplicate-detection/options.mjs.map +1 -1
  74. package/dist/esm/package-checks/duplicate-detection/records.mjs +27 -6
  75. package/dist/esm/package-checks/duplicate-detection/records.mjs.map +1 -1
  76. package/dist/esm/package-checks/file-metrics/execution.mjs +10 -17
  77. package/dist/esm/package-checks/file-metrics/execution.mjs.map +1 -1
  78. package/dist/esm/package-checks/file-metrics/finding-messages.mjs +22 -0
  79. package/dist/esm/package-checks/file-metrics/finding-messages.mjs.map +1 -0
  80. package/dist/esm/package-checks/file-metrics/options-resolution.mjs +11 -43
  81. package/dist/esm/package-checks/file-metrics/options-resolution.mjs.map +1 -1
  82. package/dist/esm/package-checks/file-metrics/options-validation.mjs +15 -25
  83. package/dist/esm/package-checks/file-metrics/options-validation.mjs.map +1 -1
  84. package/dist/esm/package-checks/file-metrics/records.mjs +2 -9
  85. package/dist/esm/package-checks/file-metrics/records.mjs.map +1 -1
  86. package/dist/esm/package-checks/file-metrics/scc/availability.mjs +1 -1
  87. package/dist/esm/package-checks/file-metrics/scc/availability.mjs.map +1 -1
  88. package/dist/esm/package-checks/file-metrics/scc/parser.mjs +4 -4
  89. package/dist/esm/package-checks/file-metrics/scc/parser.mjs.map +1 -1
  90. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs +2 -2
  91. package/dist/esm/package-checks/file-metrics/scc/scanner.mjs.map +1 -1
  92. package/dist/esm/package-checks/function-metrics/analysis.mjs +56 -15
  93. package/dist/esm/package-checks/function-metrics/analysis.mjs.map +1 -1
  94. package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs +550 -0
  95. package/dist/esm/package-checks/function-metrics/analyzer/analysis-context.mjs.map +1 -0
  96. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs +332 -0
  97. package/dist/esm/package-checks/function-metrics/analyzer/analysis-model.mjs.map +1 -0
  98. package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs +7 -0
  99. package/dist/esm/package-checks/function-metrics/analyzer/contracts.mjs.map +1 -0
  100. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs +24 -0
  101. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.mjs.map +1 -0
  102. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs +113 -0
  103. package/dist/esm/package-checks/function-metrics/analyzer/extensions/lizardnd.mjs.map +1 -0
  104. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs +180 -0
  105. package/dist/esm/package-checks/function-metrics/analyzer/extensions/protocol.mjs.map +1 -0
  106. package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs +121 -0
  107. package/dist/esm/package-checks/function-metrics/analyzer/extensions/registry.mjs.map +1 -0
  108. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs +217 -0
  109. package/dist/esm/package-checks/function-metrics/analyzer/pipeline.mjs.map +1 -0
  110. package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs +96 -0
  111. package/dist/esm/package-checks/function-metrics/analyzer/port-facade.mjs.map +1 -0
  112. package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs +76 -0
  113. package/dist/esm/package-checks/function-metrics/analyzer/reader-registry.mjs.map +1 -0
  114. package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs +88 -0
  115. package/dist/esm/package-checks/function-metrics/analyzer/readers/csharp.mjs.map +1 -0
  116. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs +466 -0
  117. package/dist/esm/package-checks/function-metrics/analyzer/readers/erlang.mjs.map +1 -0
  118. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs +289 -0
  119. package/dist/esm/package-checks/function-metrics/analyzer/readers/fortran.mjs.map +1 -0
  120. package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs +38 -0
  121. package/dist/esm/package-checks/function-metrics/analyzer/readers/gdscript.mjs.map +1 -0
  122. package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs +44 -0
  123. package/dist/esm/package-checks/function-metrics/analyzer/readers/go.mjs.map +1 -0
  124. package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs +113 -0
  125. package/dist/esm/package-checks/function-metrics/analyzer/readers/java-body-states.mjs.map +1 -0
  126. package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs +247 -0
  127. package/dist/esm/package-checks/function-metrics/analyzer/readers/java.mjs.map +1 -0
  128. package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs +16 -0
  129. package/dist/esm/package-checks/function-metrics/analyzer/readers/javascript.mjs.map +1 -0
  130. package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs +103 -0
  131. package/dist/esm/package-checks/function-metrics/analyzer/readers/kotlin.mjs.map +1 -0
  132. package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs +55 -0
  133. package/dist/esm/package-checks/function-metrics/analyzer/readers/lua.mjs.map +1 -0
  134. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs +100 -0
  135. package/dist/esm/package-checks/function-metrics/analyzer/readers/objc.mjs.map +1 -0
  136. package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs +367 -0
  137. package/dist/esm/package-checks/function-metrics/analyzer/readers/perl.mjs.map +1 -0
  138. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs +260 -0
  139. package/dist/esm/package-checks/function-metrics/analyzer/readers/php-states.mjs.map +1 -0
  140. package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs +53 -0
  141. package/dist/esm/package-checks/function-metrics/analyzer/readers/php.mjs.map +1 -0
  142. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs +306 -0
  143. package/dist/esm/package-checks/function-metrics/analyzer/readers/plsql.mjs.map +1 -0
  144. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs +402 -0
  145. package/dist/esm/package-checks/function-metrics/analyzer/readers/python.mjs.map +1 -0
  146. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs +214 -0
  147. package/dist/esm/package-checks/function-metrics/analyzer/readers/r.mjs.map +1 -0
  148. package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs +75 -0
  149. package/dist/esm/package-checks/function-metrics/analyzer/readers/ruby.mjs.map +1 -0
  150. package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs +32 -0
  151. package/dist/esm/package-checks/function-metrics/analyzer/readers/rust.mjs.map +1 -0
  152. package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs +47 -0
  153. package/dist/esm/package-checks/function-metrics/analyzer/readers/scala.mjs.map +1 -0
  154. package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs +22 -0
  155. package/dist/esm/package-checks/function-metrics/analyzer/readers/solidity.mjs.map +1 -0
  156. package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs +142 -0
  157. package/dist/esm/package-checks/function-metrics/analyzer/readers/st.mjs.map +1 -0
  158. package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs +94 -0
  159. package/dist/esm/package-checks/function-metrics/analyzer/readers/swift.mjs.map +1 -0
  160. package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs +149 -0
  161. package/dist/esm/package-checks/function-metrics/analyzer/readers/tsx.mjs.map +1 -0
  162. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs +79 -0
  163. package/dist/esm/package-checks/function-metrics/analyzer/readers/ttcn.mjs.map +1 -0
  164. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs +606 -0
  165. package/dist/esm/package-checks/function-metrics/analyzer/readers/typescript.mjs.map +1 -0
  166. package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs +31 -0
  167. package/dist/esm/package-checks/function-metrics/analyzer/readers/vue.mjs.map +1 -0
  168. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs +23 -0
  169. package/dist/esm/package-checks/function-metrics/analyzer/readers/zig.mjs.map +1 -0
  170. package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs +492 -0
  171. package/dist/esm/package-checks/function-metrics/analyzer/shared/clike.mjs.map +1 -0
  172. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs +542 -0
  173. package/dist/esm/package-checks/function-metrics/analyzer/shared/code-reader.mjs.map +1 -0
  174. package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs +141 -0
  175. package/dist/esm/package-checks/function-metrics/analyzer/shared/golike.mjs.map +1 -0
  176. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs +62 -0
  177. package/dist/esm/package-checks/function-metrics/analyzer/shared/js-style-regex.mjs.map +1 -0
  178. package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs +154 -0
  179. package/dist/esm/package-checks/function-metrics/analyzer/shared/rubylike.mjs.map +1 -0
  180. package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs +36 -0
  181. package/dist/esm/package-checks/function-metrics/analyzer/shared/script-language.mjs.map +1 -0
  182. package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs +56 -0
  183. package/dist/esm/package-checks/function-metrics/analyzer-adapter.mjs.map +1 -0
  184. package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs +2 -0
  185. package/dist/esm/package-checks/function-metrics/analyzer-worker-contract.mjs.map +1 -0
  186. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs +108 -0
  187. package/dist/esm/package-checks/function-metrics/analyzer-worker-port.mjs.map +1 -0
  188. package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs +24 -0
  189. package/dist/esm/package-checks/function-metrics/analyzer-worker.mjs.map +1 -0
  190. package/dist/esm/package-checks/function-metrics/constructor.mjs +2 -2
  191. package/dist/esm/package-checks/function-metrics/constructor.mjs.map +1 -1
  192. package/dist/esm/package-checks/function-metrics/execution.mjs +51 -33
  193. package/dist/esm/package-checks/function-metrics/execution.mjs.map +1 -1
  194. package/dist/esm/package-checks/function-metrics/finding-messages.mjs +75 -0
  195. package/dist/esm/package-checks/function-metrics/finding-messages.mjs.map +1 -0
  196. package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs +28 -0
  197. package/dist/esm/package-checks/function-metrics/finding-waiver-identity.mjs.map +1 -0
  198. package/dist/esm/package-checks/function-metrics/measurement-model.mjs.map +1 -1
  199. package/dist/esm/package-checks/function-metrics/measurement.mjs +161 -26
  200. package/dist/esm/package-checks/function-metrics/measurement.mjs.map +1 -1
  201. package/dist/esm/package-checks/function-metrics/options-resolution.mjs +30 -63
  202. package/dist/esm/package-checks/function-metrics/options-resolution.mjs.map +1 -1
  203. package/dist/esm/package-checks/function-metrics/options-validation.mjs +27 -32
  204. package/dist/esm/package-checks/function-metrics/options-validation.mjs.map +1 -1
  205. package/dist/esm/package-checks/function-metrics/options.mjs.map +1 -1
  206. package/dist/esm/package-checks/function-metrics/records.mjs +31 -1
  207. package/dist/esm/package-checks/function-metrics/records.mjs.map +1 -1
  208. package/dist/esm/package-checks/function-metrics/target-files.mjs +6 -67
  209. package/dist/esm/package-checks/function-metrics/target-files.mjs.map +1 -1
  210. package/dist/esm/package-checks/{file-metrics/scc → host-environment}/csv.mjs +1 -0
  211. package/dist/esm/package-checks/host-environment/csv.mjs.map +1 -0
  212. package/dist/esm/package-checks/host-environment/git.mjs +1 -1
  213. package/dist/esm/package-checks/host-environment/git.mjs.map +1 -1
  214. package/dist/esm/package-checks/host-environment/process.mjs +5 -0
  215. package/dist/esm/package-checks/host-environment/process.mjs.map +1 -0
  216. package/dist/esm/package-checks/json-schema-validation/final-data.mjs.map +1 -1
  217. package/dist/esm/package-checks/json-schema-validation/options-validation.mjs +15 -17
  218. package/dist/esm/package-checks/json-schema-validation/options-validation.mjs.map +1 -1
  219. package/dist/esm/package-checks/json-schema-validation/options.mjs.map +1 -1
  220. package/dist/esm/package-checks/json-validation/final-data.mjs.map +1 -1
  221. package/dist/esm/package-checks/json-validation/options-validation.mjs +4 -10
  222. package/dist/esm/package-checks/json-validation/options-validation.mjs.map +1 -1
  223. package/dist/esm/package-checks/maintenance-reminders/final-data.mjs.map +1 -1
  224. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs +9 -3
  225. package/dist/esm/package-checks/markdown-link-validation/default-check.mjs.map +1 -1
  226. package/dist/esm/package-checks/markdown-link-validation/execution.mjs +27 -24
  227. package/dist/esm/package-checks/markdown-link-validation/execution.mjs.map +1 -1
  228. package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs +82 -53
  229. package/dist/esm/package-checks/markdown-link-validation/filesystem-probes.mjs.map +1 -1
  230. package/dist/esm/package-checks/markdown-link-validation/final-data.mjs.map +1 -1
  231. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs +36 -0
  232. package/dist/esm/package-checks/markdown-link-validation/finding-messages.mjs.map +1 -0
  233. package/dist/esm/package-checks/markdown-link-validation/local-resolution.mjs.map +1 -1
  234. package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs +2 -2
  235. package/dist/esm/package-checks/markdown-link-validation/local-resolver.mjs.map +1 -1
  236. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs +26 -4
  237. package/dist/esm/package-checks/markdown-link-validation/options-resolution.mjs.map +1 -1
  238. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs +24 -11
  239. package/dist/esm/package-checks/markdown-link-validation/options-validation.mjs.map +1 -1
  240. package/dist/esm/package-checks/markdown-link-validation/options.mjs.map +1 -1
  241. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs +185 -0
  242. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache-payload.mjs.map +1 -0
  243. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs +131 -0
  244. package/dist/esm/package-checks/markdown-link-validation/parse-facts-cache.mjs.map +1 -0
  245. package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs +58 -57
  246. package/dist/esm/package-checks/markdown-link-validation/resolver-engine.mjs.map +1 -1
  247. package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs +54 -0
  248. package/dist/esm/package-checks/markdown-link-validation/source-reader.mjs.map +1 -0
  249. package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs +16 -0
  250. package/dist/esm/package-checks/markdown-link-validation/unavailable-reasons.mjs.map +1 -0
  251. package/dist/esm/package-checks/project-files/collection.mjs +1 -1
  252. package/dist/esm/package-checks/project-files/collection.mjs.map +1 -1
  253. package/dist/esm/package-checks/project-files/configuration.mjs +2 -10
  254. package/dist/esm/package-checks/project-files/configuration.mjs.map +1 -1
  255. package/dist/esm/package-checks/project-files/gitlink-revision.mjs +1 -1
  256. package/dist/esm/package-checks/project-files/gitlink-revision.mjs.map +1 -1
  257. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs +1 -1
  258. package/dist/esm/package-checks/project-files/gitlink-worktree.mjs.map +1 -1
  259. package/dist/esm/package-checks/project-files/public-collection.mjs +56 -0
  260. package/dist/esm/package-checks/project-files/public-collection.mjs.map +1 -0
  261. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs +1 -1
  262. package/dist/esm/package-checks/project-files/revision-worktree-files.mjs.map +1 -1
  263. package/dist/esm/package-checks/secret-detection/classification.mjs +15 -0
  264. package/dist/esm/package-checks/secret-detection/classification.mjs.map +1 -0
  265. package/dist/esm/package-checks/secret-detection/default-check.mjs +39 -0
  266. package/dist/esm/package-checks/secret-detection/default-check.mjs.map +1 -0
  267. package/dist/esm/package-checks/secret-detection/execution.mjs +172 -0
  268. package/dist/esm/package-checks/secret-detection/execution.mjs.map +1 -0
  269. package/dist/esm/package-checks/secret-detection/final-data.mjs +33 -0
  270. package/dist/esm/package-checks/secret-detection/final-data.mjs.map +1 -0
  271. package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs +30 -0
  272. package/dist/esm/package-checks/secret-detection/finding-waiver-identity.mjs.map +1 -0
  273. package/dist/esm/package-checks/secret-detection/input-preparation.mjs +153 -0
  274. package/dist/esm/package-checks/secret-detection/input-preparation.mjs.map +1 -0
  275. package/dist/esm/package-checks/secret-detection/options-resolution.mjs +40 -0
  276. package/dist/esm/package-checks/secret-detection/options-resolution.mjs.map +1 -0
  277. package/dist/esm/package-checks/secret-detection/options-validation.mjs +22 -0
  278. package/dist/esm/package-checks/secret-detection/options-validation.mjs.map +1 -0
  279. package/dist/esm/package-checks/secret-detection/options.mjs +2 -0
  280. package/dist/esm/package-checks/secret-detection/options.mjs.map +1 -0
  281. package/dist/esm/package-checks/secret-detection/records.mjs +31 -0
  282. package/dist/esm/package-checks/secret-detection/records.mjs.map +1 -0
  283. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs +85 -0
  284. package/dist/esm/package-checks/secret-detection/secretlint/adapter.mjs.map +1 -0
  285. package/dist/esm/project-definition/check-tree/authoring.mjs +12 -172
  286. package/dist/esm/project-definition/check-tree/authoring.mjs.map +1 -1
  287. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs +171 -0
  288. package/dist/esm/project-definition/check-tree/check-fields-authoring.mjs.map +1 -0
  289. package/dist/esm/project-definition/check-tree/collection-authoring.mjs +16 -0
  290. package/dist/esm/project-definition/check-tree/collection-authoring.mjs.map +1 -0
  291. package/dist/esm/project-definition/check-tree/materialization.mjs +9 -1
  292. package/dist/esm/project-definition/check-tree/materialization.mjs.map +1 -1
  293. package/dist/esm/project-definition/check-tree/resolution.mjs +45 -13
  294. package/dist/esm/project-definition/check-tree/resolution.mjs.map +1 -1
  295. package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs +73 -0
  296. package/dist/esm/project-definition/check-tree/scheduling-authoring.mjs.map +1 -0
  297. package/dist/esm/project-definition/declarative-snapshot.mjs +73 -0
  298. package/dist/esm/project-definition/declarative-snapshot.mjs.map +1 -0
  299. package/dist/esm/project-definition/output-defaults.mjs +18 -1
  300. package/dist/esm/project-definition/output-defaults.mjs.map +1 -1
  301. package/dist/esm/project-definition/output-validation.mjs +15 -15
  302. package/dist/esm/project-definition/output-validation.mjs.map +1 -1
  303. package/dist/esm/project-definition/progress-rendering-output.mjs +52 -0
  304. package/dist/esm/project-definition/progress-rendering-output.mjs.map +1 -0
  305. package/dist/esm/project-definition/project-definition-validation.mjs +100 -16
  306. package/dist/esm/project-definition/project-definition-validation.mjs.map +1 -1
  307. package/dist/esm/project-definition/project-definition.mjs +52 -47
  308. package/dist/esm/project-definition/project-definition.mjs.map +1 -1
  309. package/dist/esm/project-definition/resource-unit-mapping.mjs +21 -0
  310. package/dist/esm/project-definition/resource-unit-mapping.mjs.map +1 -0
  311. package/dist/esm/project-definition/scheduler-policy.mjs +2 -0
  312. package/dist/esm/project-definition/scheduler-policy.mjs.map +1 -0
  313. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs +54 -0
  314. package/dist/esm/project-run/admission-strategy-provider/custom-strategy-preparation.mjs.map +1 -0
  315. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs +2 -0
  316. package/dist/esm/project-run/admission-strategy-provider/prepared-admission-strategy.mjs.map +1 -0
  317. package/dist/esm/project-run/admission-strategy-provider/provider.mjs +23 -0
  318. package/dist/esm/project-run/admission-strategy-provider/provider.mjs.map +1 -0
  319. package/dist/esm/project-run/aggregation.mjs +7 -5
  320. package/dist/esm/project-run/aggregation.mjs.map +1 -1
  321. package/dist/esm/project-run/check-execution/callback.mjs +35 -8
  322. package/dist/esm/project-run/check-execution/callback.mjs.map +1 -1
  323. package/dist/esm/project-run/check-execution/console-capture.mjs +220 -0
  324. package/dist/esm/project-run/check-execution/console-capture.mjs.map +1 -0
  325. package/dist/esm/project-run/check-execution/dependencies.mjs +21 -3
  326. package/dist/esm/project-run/check-execution/dependencies.mjs.map +1 -1
  327. package/dist/esm/project-run/check-execution/execution-finalization.mjs +54 -13
  328. package/dist/esm/project-run/check-execution/execution-finalization.mjs.map +1 -1
  329. package/dist/esm/project-run/check-execution/execution-settlement.mjs +13 -9
  330. package/dist/esm/project-run/check-execution/execution-settlement.mjs.map +1 -1
  331. package/dist/esm/project-run/check-execution/flag-controls.mjs +87 -0
  332. package/dist/esm/project-run/check-execution/flag-controls.mjs.map +1 -0
  333. package/dist/esm/project-run/check-execution/lifecycle.mjs +2 -0
  334. package/dist/esm/project-run/check-execution/lifecycle.mjs.map +1 -0
  335. package/dist/esm/project-run/check-execution/messages.mjs +5 -0
  336. package/dist/esm/project-run/check-execution/messages.mjs.map +1 -1
  337. package/dist/esm/project-run/check-execution/plan.mjs +9 -5
  338. package/dist/esm/project-run/check-execution/plan.mjs.map +1 -1
  339. package/dist/esm/project-run/check-execution/preflight.mjs +18 -32
  340. package/dist/esm/project-run/check-execution/preflight.mjs.map +1 -1
  341. package/dist/esm/project-run/check-execution/resolved-checks.mjs +100 -58
  342. package/dist/esm/project-run/check-execution/resolved-checks.mjs.map +1 -1
  343. package/dist/esm/project-run/check-execution/resolved-execution-result.mjs +2 -0
  344. package/dist/esm/project-run/check-execution/resolved-execution-result.mjs.map +1 -0
  345. package/dist/esm/project-run/{completion.mjs → completion/completion.mjs} +16 -38
  346. package/dist/esm/project-run/completion/completion.mjs.map +1 -0
  347. package/dist/esm/project-run/{machine-publication.mjs → completion/machine-publication.mjs} +1 -1
  348. package/dist/esm/project-run/completion/machine-publication.mjs.map +1 -0
  349. package/dist/esm/project-run/completion/result-resolver.mjs +36 -0
  350. package/dist/esm/project-run/completion/result-resolver.mjs.map +1 -0
  351. package/dist/esm/project-run/controls/contract.mjs.map +1 -1
  352. package/dist/esm/project-run/controls/outputs-override-validation.mjs +67 -47
  353. package/dist/esm/project-run/controls/outputs-override-validation.mjs.map +1 -1
  354. package/dist/esm/project-run/controls/validation-result.mjs.map +1 -1
  355. package/dist/esm/project-run/controls/validation.mjs +75 -11
  356. package/dist/esm/project-run/controls/validation.mjs.map +1 -1
  357. package/dist/esm/project-run/diagnostic-logging/logger.mjs +100 -161
  358. package/dist/esm/project-run/diagnostic-logging/logger.mjs.map +1 -1
  359. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs +159 -0
  360. package/dist/esm/project-run/diagnostic-logging/observation-rendering.mjs.map +1 -0
  361. package/dist/esm/project-run/invocation/candidate.mjs +61 -0
  362. package/dist/esm/project-run/invocation/candidate.mjs.map +1 -0
  363. package/dist/esm/project-run/invocation/creation.mjs +79 -0
  364. package/dist/esm/project-run/invocation/creation.mjs.map +1 -0
  365. package/dist/esm/project-run/invocation/paths.mjs +77 -0
  366. package/dist/esm/project-run/invocation/paths.mjs.map +1 -0
  367. package/dist/esm/project-run/invocation/progress.mjs +30 -0
  368. package/dist/esm/project-run/invocation/progress.mjs.map +1 -0
  369. package/dist/esm/project-run/{invocation.mjs → invocation/run.mjs} +78 -92
  370. package/dist/esm/project-run/invocation/run.mjs.map +1 -0
  371. package/dist/esm/project-run/invocation/scheduler.mjs +57 -0
  372. package/dist/esm/project-run/invocation/scheduler.mjs.map +1 -0
  373. package/dist/esm/project-run/{output-configuration.mjs → outputs/configuration.mjs} +3 -2
  374. package/dist/esm/project-run/outputs/configuration.mjs.map +1 -0
  375. package/dist/esm/project-run/outputs/status.mjs +105 -0
  376. package/dist/esm/project-run/outputs/status.mjs.map +1 -0
  377. package/dist/esm/project-run/progress-rendering/presentation.mjs +112 -18
  378. package/dist/esm/project-run/progress-rendering/presentation.mjs.map +1 -1
  379. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs +108 -19
  380. package/dist/esm/project-run/progress-rendering/renderer-formatting.mjs.map +1 -1
  381. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs +30 -4
  382. package/dist/esm/project-run/progress-rendering/renderer-lifecycle.mjs.map +1 -1
  383. package/dist/esm/project-run/progress-rendering/renderer.mjs +5 -2
  384. package/dist/esm/project-run/progress-rendering/renderer.mjs.map +1 -1
  385. package/dist/esm/project-run/project-context.mjs +1 -1
  386. package/dist/esm/project-run/project-context.mjs.map +1 -1
  387. package/dist/esm/project-run/result.mjs +2 -0
  388. package/dist/esm/project-run/result.mjs.map +1 -1
  389. package/dist/esm/project-run/run.mjs +1 -1
  390. package/dist/esm/project-run/run.mjs.map +1 -1
  391. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs +166 -0
  392. package/dist/esm/project-run/task-scheduler/admission-core/compiled-graph.mjs.map +1 -0
  393. package/dist/esm/project-run/task-scheduler/admission-core/core.mjs +163 -0
  394. package/dist/esm/project-run/task-scheduler/admission-core/core.mjs.map +1 -0
  395. package/dist/esm/project-run/task-scheduler/admission-core/input.mjs +119 -0
  396. package/dist/esm/project-run/task-scheduler/admission-core/input.mjs.map +1 -0
  397. package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs +124 -0
  398. package/dist/esm/project-run/task-scheduler/admission-core/projection.mjs.map +1 -0
  399. package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs +99 -0
  400. package/dist/esm/project-run/task-scheduler/admission-core/selection-index.mjs.map +1 -0
  401. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs +198 -0
  402. package/dist/esm/project-run/task-scheduler/admission-core/selection-query.mjs.map +1 -0
  403. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs +151 -0
  404. package/dist/esm/project-run/task-scheduler/admission-core/selection-seed.mjs.map +1 -0
  405. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs +121 -0
  406. package/dist/esm/project-run/task-scheduler/admission-core/selection-transition.mjs.map +1 -0
  407. package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs +65 -0
  408. package/dist/esm/project-run/task-scheduler/admission-core/selection.mjs.map +1 -0
  409. package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs +25 -0
  410. package/dist/esm/project-run/task-scheduler/admission-scope-layers.mjs.map +1 -0
  411. package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs +55 -0
  412. package/dist/esm/project-run/task-scheduler/admission-selection-policy.mjs.map +1 -0
  413. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs +46 -0
  414. package/dist/esm/project-run/task-scheduler/critical-path-ranking.mjs.map +1 -0
  415. package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs +110 -0
  416. package/dist/esm/project-run/task-scheduler/custom-admission-policy.mjs.map +1 -0
  417. package/dist/esm/project-run/task-scheduler/execution-state.mjs +34 -5
  418. package/dist/esm/project-run/task-scheduler/execution-state.mjs.map +1 -1
  419. package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs +46 -0
  420. package/dist/esm/project-run/task-scheduler/forced-block-effect-replay.mjs.map +1 -0
  421. package/dist/esm/project-run/task-scheduler/graph-validation.mjs +54 -26
  422. package/dist/esm/project-run/task-scheduler/graph-validation.mjs.map +1 -1
  423. package/dist/esm/project-run/task-scheduler/graph.mjs +79 -3
  424. package/dist/esm/project-run/task-scheduler/graph.mjs.map +1 -1
  425. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs +207 -0
  426. package/dist/esm/project-run/task-scheduler/measurement/diagnostics.mjs.map +1 -0
  427. package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs +116 -0
  428. package/dist/esm/project-run/task-scheduler/measurement/integrals.mjs.map +1 -0
  429. package/dist/esm/project-run/task-scheduler/measurement/policy.mjs +67 -0
  430. package/dist/esm/project-run/task-scheduler/measurement/policy.mjs.map +1 -0
  431. package/dist/esm/project-run/task-scheduler/measurement/summary.mjs +123 -0
  432. package/dist/esm/project-run/task-scheduler/measurement/summary.mjs.map +1 -0
  433. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs +158 -0
  434. package/dist/esm/project-run/task-scheduler/measurement/timing.mjs.map +1 -0
  435. package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs +90 -62
  436. package/dist/esm/project-run/task-scheduler/scheduler-admission-decision.mjs.map +1 -1
  437. package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs +20 -6
  438. package/dist/esm/project-run/task-scheduler/scheduler-blocker-summary.mjs.map +1 -1
  439. package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs +5 -105
  440. package/dist/esm/project-run/task-scheduler/scheduler-decision-inspection.mjs.map +1 -1
  441. package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs +0 -9
  442. package/dist/esm/project-run/task-scheduler/scheduler-decision-model.mjs.map +1 -1
  443. package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs +48 -28
  444. package/dist/esm/project-run/task-scheduler/scheduler-decision.mjs.map +1 -1
  445. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs +89 -0
  446. package/dist/esm/project-run/task-scheduler/scheduler-observation.mjs.map +1 -0
  447. package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs +94 -0
  448. package/dist/esm/project-run/task-scheduler/scheduler-task-lifecycle.mjs.map +1 -0
  449. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs +66 -0
  450. package/dist/esm/project-run/task-scheduler/scheduler-terminal-measurement.mjs.map +1 -0
  451. package/dist/esm/project-run/task-scheduler/scheduler.mjs +171 -114
  452. package/dist/esm/project-run/task-scheduler/scheduler.mjs.map +1 -1
  453. package/docs/api-mechanics.md +64 -137
  454. package/docs/changelog.md +157 -0
  455. package/docs/checks/duplicate-detection.md +111 -59
  456. package/docs/checks/file-metrics.md +46 -43
  457. package/docs/checks/function-metrics.md +100 -163
  458. package/docs/checks/json-schema-validation.md +43 -36
  459. package/docs/checks/json-validation.md +38 -25
  460. package/docs/checks/maintenance-reminders.md +41 -29
  461. package/docs/checks/markdown-link-validation.md +82 -54
  462. package/docs/checks/secret-detection.md +129 -0
  463. package/docs/examples/artifacts/mixed-outcomes/definition.ts +5 -5
  464. package/docs/guides/cache-results.md +63 -0
  465. package/docs/guides/callbacks.md +34 -0
  466. package/docs/guides/check-dependencies.md +121 -0
  467. package/docs/guides/collecting-project-files.md +59 -0
  468. package/docs/guides/extending-check-lifecycle.md +112 -0
  469. package/docs/guides/finding-waivers.md +45 -0
  470. package/docs/guides/learned-scheduling.md +83 -0
  471. package/docs/guides/presenting-findings.md +54 -0
  472. package/docs/guides/run-outputs.md +145 -0
  473. package/docs/guides/scheduling.md +208 -0
  474. package/docs/guides/simulating-admission.md +55 -0
  475. package/docs/output.md +11 -20
  476. package/licenses/Lizard-1.24.0-MIT.txt +30 -0
  477. package/{third-party-licenses/momoa-3.3.12-LICENSE → licenses/Lizard-1.24.0-lizard.py-Apache-2.0.txt} +1 -0
  478. package/licenses/Pygments-2.18.0-BSD-2-Clause.txt +25 -0
  479. package/licenses/analyzer-translations-NOTICE.md +24 -0
  480. package/licenses/lizard-1.24.0-provenance.json +957 -0
  481. package/package.json +18 -6
  482. package/src/cache/cache-json-by-key.ts +304 -0
  483. package/src/check/check.ts +67 -17
  484. package/src/check/finding-presentation.ts +67 -0
  485. package/src/check/inherited-collection.ts +1 -1
  486. package/src/check-settlement/fact-validation.ts +29 -39
  487. package/src/check-settlement/outcome-normalization.ts +17 -35
  488. package/src/check-settlement/reason-shape.ts +20 -0
  489. package/src/check-settlement/record-store.ts +18 -15
  490. package/src/check-settlement/session.ts +12 -3
  491. package/src/data-boundary/closed-values.ts +29 -0
  492. package/src/data-boundary/value-shapes.ts +12 -0
  493. package/src/index.ts +70 -2
  494. package/src/learned-critical-path/duration-model/bounded-history.ts +108 -0
  495. package/src/learned-critical-path/duration-model/prediction.ts +181 -0
  496. package/src/learned-critical-path/duration-model/preparation.ts +77 -0
  497. package/src/learned-critical-path/duration-model/recording.ts +208 -0
  498. package/src/learned-critical-path/duration-model/storage.ts +252 -0
  499. package/src/learned-critical-path/selection-layers.ts +72 -0
  500. package/src/learned-critical-path/static-decision.ts +105 -0
  501. package/src/learned-critical-path/strategy.ts +299 -0
  502. package/src/machine-output/v4/atomic-publication.ts +1 -16
  503. package/src/package-checks/code-quality-findings/finding-waiver-authoring.ts +46 -0
  504. package/src/package-checks/code-quality-findings/finding-waiver-evidence.ts +95 -0
  505. package/src/package-checks/code-quality-findings/policy.ts +23 -0
  506. package/src/package-checks/duplicate-detection/area-policy.ts +24 -13
  507. package/src/package-checks/duplicate-detection/cache/identity.ts +1 -1
  508. package/src/package-checks/duplicate-detection/default-check.ts +1 -1
  509. package/src/package-checks/duplicate-detection/execution.ts +82 -22
  510. package/src/package-checks/duplicate-detection/finding-messages.ts +75 -0
  511. package/src/package-checks/duplicate-detection/finding-waiver-identity.ts +68 -0
  512. package/src/package-checks/duplicate-detection/jscpd/availability.ts +1 -1
  513. package/src/package-checks/duplicate-detection/jscpd/command-resolution.ts +1 -1
  514. package/src/package-checks/duplicate-detection/jscpd/json-report.ts +24 -5
  515. package/src/package-checks/duplicate-detection/jscpd/scanner.ts +6 -7
  516. package/src/package-checks/duplicate-detection/options-resolution.ts +32 -57
  517. package/src/package-checks/duplicate-detection/options-validation.ts +23 -31
  518. package/src/package-checks/duplicate-detection/options.ts +21 -1
  519. package/src/package-checks/duplicate-detection/records.ts +65 -12
  520. package/src/package-checks/file-metrics/execution.ts +16 -17
  521. package/src/package-checks/file-metrics/finding-messages.ts +29 -0
  522. package/src/package-checks/file-metrics/options-resolution.ts +19 -52
  523. package/src/package-checks/file-metrics/options-validation.ts +23 -32
  524. package/src/package-checks/file-metrics/records.ts +11 -23
  525. package/src/package-checks/file-metrics/scc/availability.ts +1 -1
  526. package/src/package-checks/file-metrics/scc/parser.ts +4 -4
  527. package/src/package-checks/file-metrics/scc/scanner.ts +2 -2
  528. package/src/package-checks/function-metrics/analysis.ts +76 -21
  529. package/src/package-checks/function-metrics/analyzer/analysis-context.ts +749 -0
  530. package/src/package-checks/function-metrics/analyzer/analysis-model.ts +421 -0
  531. package/src/package-checks/function-metrics/analyzer/contracts.ts +54 -0
  532. package/src/package-checks/function-metrics/analyzer/extension-output.ts +261 -0
  533. package/src/package-checks/function-metrics/analyzer/extensions/extension-base.ts +33 -0
  534. package/src/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.ts +27 -0
  535. package/src/package-checks/function-metrics/analyzer/extensions/lizardnd.ts +144 -0
  536. package/src/package-checks/function-metrics/analyzer/extensions/protocol.ts +345 -0
  537. package/src/package-checks/function-metrics/analyzer/extensions/registry.ts +157 -0
  538. package/src/package-checks/function-metrics/analyzer/pipeline.ts +311 -0
  539. package/src/package-checks/function-metrics/analyzer/port-facade.ts +142 -0
  540. package/src/package-checks/function-metrics/analyzer/reader-registry.ts +84 -0
  541. package/src/package-checks/function-metrics/analyzer/readers/csharp.ts +110 -0
  542. package/src/package-checks/function-metrics/analyzer/readers/erlang.ts +501 -0
  543. package/src/package-checks/function-metrics/analyzer/readers/fortran.ts +294 -0
  544. package/src/package-checks/function-metrics/analyzer/readers/gdscript.ts +42 -0
  545. package/src/package-checks/function-metrics/analyzer/readers/go.ts +53 -0
  546. package/src/package-checks/function-metrics/analyzer/readers/java-body-states.ts +141 -0
  547. package/src/package-checks/function-metrics/analyzer/readers/java.ts +270 -0
  548. package/src/package-checks/function-metrics/analyzer/readers/javascript.ts +19 -0
  549. package/src/package-checks/function-metrics/analyzer/readers/kotlin.ts +120 -0
  550. package/src/package-checks/function-metrics/analyzer/readers/lua.ts +68 -0
  551. package/src/package-checks/function-metrics/analyzer/readers/objc.ts +107 -0
  552. package/src/package-checks/function-metrics/analyzer/readers/perl.ts +340 -0
  553. package/src/package-checks/function-metrics/analyzer/readers/php-states.ts +246 -0
  554. package/src/package-checks/function-metrics/analyzer/readers/php.ts +63 -0
  555. package/src/package-checks/function-metrics/analyzer/readers/plsql.ts +306 -0
  556. package/src/package-checks/function-metrics/analyzer/readers/python.ts +431 -0
  557. package/src/package-checks/function-metrics/analyzer/readers/r.ts +234 -0
  558. package/src/package-checks/function-metrics/analyzer/readers/ruby.ts +88 -0
  559. package/src/package-checks/function-metrics/analyzer/readers/rust.ts +47 -0
  560. package/src/package-checks/function-metrics/analyzer/readers/scala.ts +60 -0
  561. package/src/package-checks/function-metrics/analyzer/readers/solidity.ts +32 -0
  562. package/src/package-checks/function-metrics/analyzer/readers/st.ts +161 -0
  563. package/src/package-checks/function-metrics/analyzer/readers/swift.ts +116 -0
  564. package/src/package-checks/function-metrics/analyzer/readers/tsx.ts +165 -0
  565. package/src/package-checks/function-metrics/analyzer/readers/ttcn.ts +90 -0
  566. package/src/package-checks/function-metrics/analyzer/readers/typescript.ts +593 -0
  567. package/src/package-checks/function-metrics/analyzer/readers/vue.ts +43 -0
  568. package/src/package-checks/function-metrics/analyzer/readers/zig.ts +35 -0
  569. package/src/package-checks/function-metrics/analyzer/shared/clike.ts +541 -0
  570. package/src/package-checks/function-metrics/analyzer/shared/code-reader.ts +682 -0
  571. package/src/package-checks/function-metrics/analyzer/shared/golike.ts +143 -0
  572. package/src/package-checks/function-metrics/analyzer/shared/js-style-regex.ts +75 -0
  573. package/src/package-checks/function-metrics/analyzer/shared/rubylike.ts +161 -0
  574. package/src/package-checks/function-metrics/analyzer/shared/script-language.ts +50 -0
  575. package/src/package-checks/function-metrics/analyzer-adapter.ts +84 -0
  576. package/src/package-checks/function-metrics/analyzer-worker-contract.ts +10 -0
  577. package/src/package-checks/function-metrics/analyzer-worker-port.ts +150 -0
  578. package/src/package-checks/function-metrics/analyzer-worker.ts +31 -0
  579. package/src/package-checks/function-metrics/constructor.ts +2 -2
  580. package/src/package-checks/function-metrics/execution.ts +94 -39
  581. package/src/package-checks/function-metrics/finding-messages.ts +95 -0
  582. package/src/package-checks/function-metrics/finding-waiver-identity.ts +36 -0
  583. package/src/package-checks/function-metrics/measurement-model.ts +15 -1
  584. package/src/package-checks/function-metrics/measurement.ts +221 -36
  585. package/src/package-checks/function-metrics/options-resolution.ts +39 -75
  586. package/src/package-checks/function-metrics/options-validation.ts +30 -39
  587. package/src/package-checks/function-metrics/options.ts +27 -11
  588. package/src/package-checks/function-metrics/records.ts +73 -7
  589. package/src/package-checks/function-metrics/target-files.ts +10 -70
  590. package/src/package-checks/{file-metrics/scc → host-environment}/csv.ts +1 -2
  591. package/src/package-checks/host-environment/git.ts +2 -2
  592. package/src/package-checks/host-environment/process.ts +10 -0
  593. package/src/package-checks/json-schema-validation/final-data.ts +8 -0
  594. package/src/package-checks/json-schema-validation/options-validation.ts +16 -23
  595. package/src/package-checks/json-schema-validation/options.ts +23 -0
  596. package/src/package-checks/json-validation/final-data.ts +5 -0
  597. package/src/package-checks/json-validation/options-validation.ts +4 -18
  598. package/src/package-checks/maintenance-reminders/final-data.ts +18 -0
  599. package/src/package-checks/markdown-link-validation/default-check.ts +9 -3
  600. package/src/package-checks/markdown-link-validation/execution.ts +51 -57
  601. package/src/package-checks/markdown-link-validation/filesystem-probes.ts +108 -51
  602. package/src/package-checks/markdown-link-validation/final-data.ts +5 -0
  603. package/src/package-checks/markdown-link-validation/finding-messages.ts +48 -0
  604. package/src/package-checks/markdown-link-validation/local-resolution.ts +17 -9
  605. package/src/package-checks/markdown-link-validation/local-resolver.ts +5 -2
  606. package/src/package-checks/markdown-link-validation/options-resolution.ts +31 -3
  607. package/src/package-checks/markdown-link-validation/options-validation.ts +27 -19
  608. package/src/package-checks/markdown-link-validation/options.ts +15 -0
  609. package/src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts +246 -0
  610. package/src/package-checks/markdown-link-validation/parse-facts-cache.ts +154 -0
  611. package/src/package-checks/markdown-link-validation/resolver-engine.ts +75 -65
  612. package/src/package-checks/markdown-link-validation/source-reader.ts +86 -0
  613. package/src/package-checks/markdown-link-validation/unavailable-reasons.ts +42 -0
  614. package/src/package-checks/project-files/collection.ts +1 -1
  615. package/src/package-checks/project-files/configuration.ts +3 -14
  616. package/src/package-checks/project-files/gitlink-revision.ts +1 -1
  617. package/src/package-checks/project-files/gitlink-worktree.ts +1 -1
  618. package/src/package-checks/project-files/public-collection.ts +92 -0
  619. package/src/package-checks/project-files/revision-worktree-files.ts +1 -1
  620. package/src/package-checks/secret-detection/classification.ts +30 -0
  621. package/src/package-checks/secret-detection/default-check.ts +50 -0
  622. package/src/package-checks/secret-detection/execution.ts +247 -0
  623. package/src/package-checks/secret-detection/final-data.ts +57 -0
  624. package/src/package-checks/secret-detection/finding-waiver-identity.ts +37 -0
  625. package/src/package-checks/secret-detection/input-preparation.ts +233 -0
  626. package/src/package-checks/secret-detection/options-resolution.ts +65 -0
  627. package/src/package-checks/secret-detection/options-validation.ts +27 -0
  628. package/src/package-checks/secret-detection/options.ts +36 -0
  629. package/src/package-checks/secret-detection/records.ts +77 -0
  630. package/src/package-checks/secret-detection/secretlint/adapter.ts +123 -0
  631. package/src/project-definition/check-tree/authoring.ts +29 -230
  632. package/src/project-definition/check-tree/check-fields-authoring.ts +227 -0
  633. package/src/project-definition/check-tree/collection-authoring.ts +13 -0
  634. package/src/project-definition/check-tree/materialization.ts +9 -1
  635. package/src/project-definition/check-tree/resolution.ts +80 -22
  636. package/src/project-definition/check-tree/scheduling-authoring.ts +114 -0
  637. package/src/project-definition/declarative-snapshot.ts +87 -0
  638. package/src/project-definition/output-defaults.ts +32 -1
  639. package/src/project-definition/output-validation.ts +15 -15
  640. package/src/project-definition/progress-rendering-output.ts +121 -0
  641. package/src/project-definition/project-definition-validation.ts +117 -18
  642. package/src/project-definition/project-definition.ts +198 -61
  643. package/src/project-definition/resource-unit-mapping.ts +25 -0
  644. package/src/project-definition/scheduler-policy.ts +553 -0
  645. package/src/project-run/admission-strategy-provider/custom-strategy-preparation.ts +80 -0
  646. package/src/project-run/admission-strategy-provider/prepared-admission-strategy.ts +27 -0
  647. package/src/project-run/admission-strategy-provider/provider.ts +45 -0
  648. package/src/project-run/aggregation.ts +10 -5
  649. package/src/project-run/check-execution/callback.ts +50 -8
  650. package/src/project-run/check-execution/console-capture.ts +262 -0
  651. package/src/project-run/check-execution/dependencies.ts +43 -6
  652. package/src/project-run/check-execution/execution-finalization.ts +99 -25
  653. package/src/project-run/check-execution/execution-settlement.ts +19 -11
  654. package/src/project-run/check-execution/flag-controls.ts +132 -0
  655. package/src/project-run/check-execution/lifecycle.ts +21 -0
  656. package/src/project-run/check-execution/messages.ts +8 -0
  657. package/src/project-run/check-execution/plan.ts +12 -8
  658. package/src/project-run/check-execution/preflight.ts +23 -43
  659. package/src/project-run/check-execution/resolved-checks.ts +165 -126
  660. package/src/project-run/check-execution/resolved-execution-result.ts +22 -0
  661. package/src/project-run/{completion.ts → completion/completion.ts} +17 -57
  662. package/src/project-run/{machine-publication.ts → completion/machine-publication.ts} +4 -4
  663. package/src/project-run/completion/result-resolver.ts +60 -0
  664. package/src/project-run/controls/contract.ts +25 -2
  665. package/src/project-run/controls/outputs-override-validation.ts +83 -60
  666. package/src/project-run/controls/validation-result.ts +17 -6
  667. package/src/project-run/controls/validation.ts +107 -12
  668. package/src/project-run/diagnostic-logging/logger.ts +132 -207
  669. package/src/project-run/diagnostic-logging/observation-rendering.ts +203 -0
  670. package/src/project-run/invocation/candidate.ts +86 -0
  671. package/src/project-run/invocation/creation.ts +116 -0
  672. package/src/project-run/invocation/paths.ts +154 -0
  673. package/src/project-run/invocation/progress.ts +38 -0
  674. package/src/project-run/{invocation.ts → invocation/run.ts} +125 -120
  675. package/src/project-run/invocation/scheduler.ts +75 -0
  676. package/src/project-run/{output-configuration.ts → outputs/configuration.ts} +6 -5
  677. package/src/project-run/outputs/status.ts +161 -0
  678. package/src/project-run/progress-rendering/presentation.ts +118 -26
  679. package/src/project-run/progress-rendering/renderer-formatting.ts +166 -19
  680. package/src/project-run/progress-rendering/renderer-lifecycle.ts +38 -3
  681. package/src/project-run/progress-rendering/renderer.ts +13 -2
  682. package/src/project-run/project-context.ts +3 -2
  683. package/src/project-run/result.ts +49 -3
  684. package/src/project-run/run.ts +7 -6
  685. package/src/project-run/task-scheduler/admission-core/compiled-graph.ts +316 -0
  686. package/src/project-run/task-scheduler/admission-core/core.ts +278 -0
  687. package/src/project-run/task-scheduler/admission-core/input.ts +138 -0
  688. package/src/project-run/task-scheduler/admission-core/projection.ts +164 -0
  689. package/src/project-run/task-scheduler/admission-core/selection-index.ts +165 -0
  690. package/src/project-run/task-scheduler/admission-core/selection-query.ts +295 -0
  691. package/src/project-run/task-scheduler/admission-core/selection-seed.ts +252 -0
  692. package/src/project-run/task-scheduler/admission-core/selection-transition.ts +236 -0
  693. package/src/project-run/task-scheduler/admission-core/selection.ts +140 -0
  694. package/src/project-run/task-scheduler/admission-core/trace.ts +177 -0
  695. package/src/project-run/task-scheduler/admission-scope-layers.ts +44 -0
  696. package/src/project-run/task-scheduler/admission-selection-policy.ts +116 -0
  697. package/src/project-run/task-scheduler/critical-path-ranking.ts +76 -0
  698. package/src/project-run/task-scheduler/custom-admission-policy.ts +128 -0
  699. package/src/project-run/task-scheduler/execution-state.ts +97 -6
  700. package/src/project-run/task-scheduler/forced-block-effect-replay.ts +68 -0
  701. package/src/project-run/task-scheduler/graph-validation.ts +77 -31
  702. package/src/project-run/task-scheduler/graph.ts +111 -3
  703. package/src/project-run/task-scheduler/measurement/diagnostics.ts +261 -0
  704. package/src/project-run/task-scheduler/measurement/integrals.ts +177 -0
  705. package/src/project-run/task-scheduler/measurement/policy.ts +105 -0
  706. package/src/project-run/task-scheduler/measurement/summary.ts +175 -0
  707. package/src/project-run/task-scheduler/measurement/timing.ts +190 -0
  708. package/src/project-run/task-scheduler/scheduler-admission-decision.ts +143 -134
  709. package/src/project-run/task-scheduler/scheduler-blocker-summary.ts +34 -9
  710. package/src/project-run/task-scheduler/scheduler-decision-inspection.ts +28 -170
  711. package/src/project-run/task-scheduler/scheduler-decision-model.ts +36 -40
  712. package/src/project-run/task-scheduler/scheduler-decision.ts +68 -36
  713. package/src/project-run/task-scheduler/scheduler-observation.ts +124 -0
  714. package/src/project-run/task-scheduler/scheduler-task-lifecycle.ts +150 -0
  715. package/src/project-run/task-scheduler/scheduler-terminal-measurement.ts +95 -0
  716. package/src/project-run/task-scheduler/scheduler.ts +216 -171
  717. package/types/cache/cache-json-by-key.d.ts +53 -0
  718. package/types/check/check.d.ts +62 -17
  719. package/types/check/finding-presentation.d.ts +25 -0
  720. package/types/check/inherited-collection.d.ts +1 -1
  721. package/types/check-settlement/reason-shape.d.ts +5 -0
  722. package/types/check-settlement/record-store.d.ts +2 -2
  723. package/types/check-settlement/session.d.ts +3 -1
  724. package/types/data-boundary/closed-values.d.ts +8 -0
  725. package/types/data-boundary/value-shapes.d.ts +3 -0
  726. package/types/index.d.ts +22 -7
  727. package/types/learned-critical-path/duration-model/bounded-history.d.ts +34 -0
  728. package/types/learned-critical-path/duration-model/prediction.d.ts +32 -0
  729. package/types/learned-critical-path/duration-model/preparation.d.ts +28 -0
  730. package/types/learned-critical-path/duration-model/recording.d.ts +28 -0
  731. package/types/learned-critical-path/duration-model/storage.d.ts +12 -0
  732. package/types/learned-critical-path/selection-layers.d.ts +14 -0
  733. package/types/learned-critical-path/static-decision.d.ts +3 -0
  734. package/types/learned-critical-path/strategy.d.ts +35 -0
  735. package/types/package-checks/code-quality-findings/finding-waiver-authoring.d.ts +7 -0
  736. package/types/package-checks/code-quality-findings/finding-waiver-evidence.d.ts +34 -0
  737. package/types/package-checks/code-quality-findings/policy.d.ts +4 -0
  738. package/types/package-checks/duplicate-detection/area-policy.d.ts +1 -1
  739. package/types/package-checks/duplicate-detection/finding-messages.d.ts +7 -0
  740. package/types/package-checks/duplicate-detection/finding-waiver-identity.d.ts +3 -0
  741. package/types/package-checks/duplicate-detection/jscpd/command-resolution.d.ts +1 -1
  742. package/types/package-checks/duplicate-detection/options.d.ts +18 -1
  743. package/types/package-checks/duplicate-detection/records.d.ts +20 -3
  744. package/types/package-checks/file-metrics/finding-messages.d.ts +4 -0
  745. package/types/package-checks/file-metrics/records.d.ts +5 -10
  746. package/types/package-checks/file-metrics/scc/parser.d.ts +4 -4
  747. package/types/package-checks/function-metrics/analysis.d.ts +1 -1
  748. package/types/package-checks/function-metrics/analyzer/analysis-context.d.ts +174 -0
  749. package/types/package-checks/function-metrics/analyzer/analysis-model.d.ts +135 -0
  750. package/types/package-checks/function-metrics/analyzer/contracts.d.ts +48 -0
  751. package/types/package-checks/function-metrics/analyzer/extensions/lizardcomplextags.d.ts +13 -0
  752. package/types/package-checks/function-metrics/analyzer/extensions/lizardnd.d.ts +28 -0
  753. package/types/package-checks/function-metrics/analyzer/extensions/protocol.d.ts +99 -0
  754. package/types/package-checks/function-metrics/analyzer/extensions/registry.d.ts +34 -0
  755. package/types/package-checks/function-metrics/analyzer/pipeline.d.ts +67 -0
  756. package/types/package-checks/function-metrics/analyzer/port-facade.d.ts +38 -0
  757. package/types/package-checks/function-metrics/analyzer/reader-registry.d.ts +18 -0
  758. package/types/package-checks/function-metrics/analyzer/readers/csharp.d.ts +22 -0
  759. package/types/package-checks/function-metrics/analyzer/readers/erlang.d.ts +22 -0
  760. package/types/package-checks/function-metrics/analyzer/readers/fortran.d.ts +29 -0
  761. package/types/package-checks/function-metrics/analyzer/readers/gdscript.d.ts +18 -0
  762. package/types/package-checks/function-metrics/analyzer/readers/go.d.ts +18 -0
  763. package/types/package-checks/function-metrics/analyzer/readers/java-body-states.d.ts +18 -0
  764. package/types/package-checks/function-metrics/analyzer/readers/java.d.ts +44 -0
  765. package/types/package-checks/function-metrics/analyzer/readers/javascript.d.ts +14 -0
  766. package/types/package-checks/function-metrics/analyzer/readers/kotlin.d.ts +23 -0
  767. package/types/package-checks/function-metrics/analyzer/readers/lua.d.ts +16 -0
  768. package/types/package-checks/function-metrics/analyzer/readers/objc.d.ts +18 -0
  769. package/types/package-checks/function-metrics/analyzer/readers/perl.d.ts +28 -0
  770. package/types/package-checks/function-metrics/analyzer/readers/php-states.d.ts +41 -0
  771. package/types/package-checks/function-metrics/analyzer/readers/php.d.ts +22 -0
  772. package/types/package-checks/function-metrics/analyzer/readers/plsql.d.ts +24 -0
  773. package/types/package-checks/function-metrics/analyzer/readers/python.d.ts +50 -0
  774. package/types/package-checks/function-metrics/analyzer/readers/r.d.ts +22 -0
  775. package/types/package-checks/function-metrics/analyzer/readers/ruby.d.ts +16 -0
  776. package/types/package-checks/function-metrics/analyzer/readers/rust.d.ts +20 -0
  777. package/types/package-checks/function-metrics/analyzer/readers/scala.d.ts +20 -0
  778. package/types/package-checks/function-metrics/analyzer/readers/solidity.d.ts +19 -0
  779. package/types/package-checks/function-metrics/analyzer/readers/st.d.ts +37 -0
  780. package/types/package-checks/function-metrics/analyzer/readers/swift.d.ts +30 -0
  781. package/types/package-checks/function-metrics/analyzer/readers/tsx.d.ts +15 -0
  782. package/types/package-checks/function-metrics/analyzer/readers/ttcn.d.ts +22 -0
  783. package/types/package-checks/function-metrics/analyzer/readers/typescript.d.ts +35 -0
  784. package/types/package-checks/function-metrics/analyzer/readers/vue.d.ts +18 -0
  785. package/types/package-checks/function-metrics/analyzer/readers/zig.d.ts +19 -0
  786. package/types/package-checks/function-metrics/analyzer/shared/clike.d.ts +101 -0
  787. package/types/package-checks/function-metrics/analyzer/shared/code-reader.d.ts +176 -0
  788. package/types/package-checks/function-metrics/analyzer/shared/golike.d.ts +39 -0
  789. package/types/package-checks/function-metrics/analyzer/shared/js-style-regex.d.ts +16 -0
  790. package/types/package-checks/function-metrics/analyzer/shared/rubylike.d.ts +40 -0
  791. package/types/package-checks/function-metrics/analyzer/shared/script-language.d.ts +17 -0
  792. package/types/package-checks/function-metrics/analyzer-adapter.d.ts +26 -0
  793. package/types/package-checks/function-metrics/analyzer-worker-contract.d.ts +5 -0
  794. package/types/package-checks/function-metrics/analyzer-worker-port.d.ts +24 -0
  795. package/types/package-checks/function-metrics/analyzer-worker.d.ts +1 -0
  796. package/types/package-checks/function-metrics/constructor.d.ts +1 -1
  797. package/types/package-checks/function-metrics/execution.d.ts +5 -2
  798. package/types/package-checks/function-metrics/finding-messages.d.ts +9 -0
  799. package/types/package-checks/function-metrics/finding-waiver-identity.d.ts +2 -0
  800. package/types/package-checks/function-metrics/measurement-model.d.ts +13 -1
  801. package/types/package-checks/function-metrics/measurement.d.ts +22 -7
  802. package/types/package-checks/function-metrics/options.d.ts +23 -10
  803. package/types/package-checks/function-metrics/records.d.ts +24 -5
  804. package/types/package-checks/function-metrics/target-files.d.ts +4 -3
  805. package/types/package-checks/host-environment/csv.d.ts +2 -0
  806. package/types/package-checks/host-environment/git.d.ts +1 -1
  807. package/types/package-checks/host-environment/process.d.ts +5 -0
  808. package/types/package-checks/json-schema-validation/final-data.d.ts +8 -0
  809. package/types/package-checks/json-schema-validation/options.d.ts +31 -3
  810. package/types/package-checks/json-validation/final-data.d.ts +5 -0
  811. package/types/package-checks/maintenance-reminders/final-data.d.ts +18 -0
  812. package/types/package-checks/markdown-link-validation/default-check.d.ts +9 -3
  813. package/types/package-checks/markdown-link-validation/execution.d.ts +1 -3
  814. package/types/package-checks/markdown-link-validation/final-data.d.ts +5 -0
  815. package/types/package-checks/markdown-link-validation/finding-messages.d.ts +4 -0
  816. package/types/package-checks/markdown-link-validation/local-resolution.d.ts +12 -6
  817. package/types/package-checks/markdown-link-validation/local-resolver.d.ts +2 -1
  818. package/types/package-checks/markdown-link-validation/options.d.ts +15 -0
  819. package/types/package-checks/markdown-link-validation/parse-facts-cache-payload.d.ts +24 -0
  820. package/types/package-checks/markdown-link-validation/parse-facts-cache.d.ts +13 -0
  821. package/types/package-checks/markdown-link-validation/resolver-engine.d.ts +6 -4
  822. package/types/package-checks/markdown-link-validation/source-reader.d.ts +11 -0
  823. package/types/package-checks/markdown-link-validation/unavailable-reasons.d.ts +4 -0
  824. package/types/package-checks/project-files/public-collection.d.ts +16 -0
  825. package/types/package-checks/secret-detection/classification.d.ts +12 -0
  826. package/types/package-checks/secret-detection/default-check.d.ts +11 -0
  827. package/types/package-checks/secret-detection/execution.d.ts +14 -0
  828. package/types/package-checks/secret-detection/final-data.d.ts +15 -0
  829. package/types/package-checks/secret-detection/finding-waiver-identity.d.ts +5 -0
  830. package/types/package-checks/secret-detection/input-preparation.d.ts +24 -0
  831. package/types/package-checks/secret-detection/options-resolution.d.ts +6 -0
  832. package/types/package-checks/secret-detection/options-validation.d.ts +3 -0
  833. package/types/package-checks/secret-detection/options.d.ts +32 -0
  834. package/types/package-checks/secret-detection/records.d.ts +35 -0
  835. package/types/package-checks/secret-detection/secretlint/adapter.d.ts +28 -0
  836. package/types/project-definition/check-tree/authoring.d.ts +11 -14
  837. package/types/project-definition/check-tree/check-fields-authoring.d.ts +25 -0
  838. package/types/project-definition/check-tree/collection-authoring.d.ts +2 -0
  839. package/types/project-definition/check-tree/resolution.d.ts +8 -3
  840. package/types/project-definition/check-tree/scheduling-authoring.d.ts +19 -0
  841. package/types/project-definition/declarative-snapshot.d.ts +7 -0
  842. package/types/project-definition/output-defaults.d.ts +7 -0
  843. package/types/project-definition/output-validation.d.ts +2 -1
  844. package/types/project-definition/progress-rendering-output.d.ts +41 -0
  845. package/types/project-definition/project-definition.d.ts +61 -16
  846. package/types/project-definition/resource-unit-mapping.d.ts +4 -0
  847. package/types/project-definition/scheduler-policy.d.ts +497 -0
  848. package/types/project-run/admission-strategy-provider/custom-strategy-preparation.d.ts +9 -0
  849. package/types/project-run/admission-strategy-provider/prepared-admission-strategy.d.ts +23 -0
  850. package/types/project-run/admission-strategy-provider/provider.d.ts +13 -0
  851. package/types/project-run/aggregation.d.ts +1 -1
  852. package/types/project-run/check-execution/callback.d.ts +5 -1
  853. package/types/project-run/check-execution/console-capture.d.ts +18 -0
  854. package/types/project-run/check-execution/dependencies.d.ts +1 -1
  855. package/types/project-run/check-execution/execution-finalization.d.ts +17 -7
  856. package/types/project-run/check-execution/execution-settlement.d.ts +5 -2
  857. package/types/project-run/check-execution/flag-controls.d.ts +27 -0
  858. package/types/project-run/check-execution/lifecycle.d.ts +20 -0
  859. package/types/project-run/check-execution/messages.d.ts +2 -0
  860. package/types/project-run/check-execution/plan.d.ts +2 -3
  861. package/types/project-run/check-execution/preflight.d.ts +6 -5
  862. package/types/project-run/check-execution/resolved-checks.d.ts +32 -38
  863. package/types/project-run/check-execution/resolved-execution-result.d.ts +21 -0
  864. package/types/project-run/{completion.d.ts → completion/completion.d.ts} +4 -4
  865. package/types/project-run/{machine-publication.d.ts → completion/machine-publication.d.ts} +3 -3
  866. package/types/project-run/completion/result-resolver.d.ts +4 -0
  867. package/types/project-run/controls/contract.d.ts +25 -2
  868. package/types/project-run/controls/outputs-override-validation.d.ts +2 -1
  869. package/types/project-run/controls/validation-result.d.ts +12 -4
  870. package/types/project-run/diagnostic-logging/logger.d.ts +34 -4
  871. package/types/project-run/diagnostic-logging/observation-rendering.d.ts +7 -0
  872. package/types/project-run/invocation/candidate.d.ts +12 -0
  873. package/types/project-run/{invocation-creation.d.ts → invocation/creation.d.ts} +3 -3
  874. package/types/project-run/invocation/paths.d.ts +40 -0
  875. package/types/project-run/invocation/progress.d.ts +11 -0
  876. package/types/project-run/invocation/run.d.ts +43 -0
  877. package/types/project-run/invocation/scheduler.d.ts +16 -0
  878. package/types/project-run/outputs/configuration.d.ts +3 -0
  879. package/types/project-run/outputs/status.d.ts +48 -0
  880. package/types/project-run/progress-rendering/presentation.d.ts +9 -5
  881. package/types/project-run/progress-rendering/renderer-formatting.d.ts +8 -0
  882. package/types/project-run/progress-rendering/renderer-lifecycle.d.ts +6 -1
  883. package/types/project-run/progress-rendering/renderer.d.ts +7 -1
  884. package/types/project-run/project-context.d.ts +2 -1
  885. package/types/project-run/result.d.ts +37 -3
  886. package/types/project-run/run.d.ts +6 -5
  887. package/types/project-run/task-scheduler/admission-core/compiled-graph.d.ts +31 -0
  888. package/types/project-run/task-scheduler/admission-core/core.d.ts +57 -0
  889. package/types/project-run/task-scheduler/admission-core/input.d.ts +4 -0
  890. package/types/project-run/task-scheduler/admission-core/projection.d.ts +22 -0
  891. package/types/project-run/task-scheduler/admission-core/selection-index.d.ts +61 -0
  892. package/types/project-run/task-scheduler/admission-core/selection-query.d.ts +28 -0
  893. package/types/project-run/task-scheduler/admission-core/selection-seed.d.ts +9 -0
  894. package/types/project-run/task-scheduler/admission-core/selection-transition.d.ts +4 -0
  895. package/types/project-run/task-scheduler/admission-core/selection.d.ts +20 -0
  896. package/types/project-run/task-scheduler/admission-scope-layers.d.ts +8 -0
  897. package/types/project-run/task-scheduler/admission-selection-policy.d.ts +31 -0
  898. package/types/project-run/task-scheduler/critical-path-ranking.d.ts +19 -0
  899. package/types/project-run/task-scheduler/custom-admission-policy.d.ts +6 -0
  900. package/types/project-run/task-scheduler/execution-state.d.ts +43 -1
  901. package/types/project-run/task-scheduler/forced-block-effect-replay.d.ts +9 -0
  902. package/types/project-run/task-scheduler/graph-validation.d.ts +3 -2
  903. package/types/project-run/task-scheduler/graph.d.ts +15 -0
  904. package/types/project-run/task-scheduler/measurement/diagnostics.d.ts +47 -0
  905. package/types/project-run/task-scheduler/measurement/integrals.d.ts +27 -0
  906. package/types/project-run/task-scheduler/measurement/policy.d.ts +10 -0
  907. package/types/project-run/task-scheduler/measurement/summary.d.ts +3 -0
  908. package/types/project-run/task-scheduler/measurement/timing.d.ts +33 -0
  909. package/types/project-run/task-scheduler/scheduler-admission-decision.d.ts +13 -1
  910. package/types/project-run/task-scheduler/scheduler-decision-inspection.d.ts +20 -19
  911. package/types/project-run/task-scheduler/scheduler-decision-model.d.ts +38 -22
  912. package/types/project-run/task-scheduler/scheduler-decision.d.ts +4 -1
  913. package/types/project-run/task-scheduler/scheduler-observation.d.ts +14 -0
  914. package/types/project-run/task-scheduler/scheduler-task-lifecycle.d.ts +18 -0
  915. package/types/project-run/task-scheduler/scheduler-terminal-measurement.d.ts +9 -0
  916. package/dist/esm/package-checks/file-metrics/scc/csv.mjs.map +0 -1
  917. package/dist/esm/package-checks/function-metrics/lizard/availability.mjs +0 -64
  918. package/dist/esm/package-checks/function-metrics/lizard/availability.mjs.map +0 -1
  919. package/dist/esm/package-checks/function-metrics/lizard/csv.mjs +0 -17
  920. package/dist/esm/package-checks/function-metrics/lizard/csv.mjs.map +0 -1
  921. package/dist/esm/package-checks/function-metrics/lizard/parser.mjs +0 -138
  922. package/dist/esm/package-checks/function-metrics/lizard/parser.mjs.map +0 -1
  923. package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs +0 -35
  924. package/dist/esm/package-checks/function-metrics/lizard/scanner.mjs.map +0 -1
  925. package/dist/esm/package-checks/host-environment/process/command.mjs +0 -13
  926. package/dist/esm/package-checks/host-environment/process/command.mjs.map +0 -1
  927. package/dist/esm/project-run/completion.mjs.map +0 -1
  928. package/dist/esm/project-run/invocation-creation.mjs +0 -111
  929. package/dist/esm/project-run/invocation-creation.mjs.map +0 -1
  930. package/dist/esm/project-run/invocation.mjs.map +0 -1
  931. package/dist/esm/project-run/machine-publication.mjs.map +0 -1
  932. package/dist/esm/project-run/output-configuration.mjs.map +0 -1
  933. package/dist/esm/project-run/output-status.mjs +0 -43
  934. package/dist/esm/project-run/output-status.mjs.map +0 -1
  935. package/src/package-checks/function-metrics/lizard/availability.ts +0 -90
  936. package/src/package-checks/function-metrics/lizard/csv.ts +0 -20
  937. package/src/package-checks/function-metrics/lizard/parser.ts +0 -179
  938. package/src/package-checks/function-metrics/lizard/scanner.ts +0 -62
  939. package/src/package-checks/host-environment/process/command.ts +0 -21
  940. package/src/project-run/invocation-creation.ts +0 -160
  941. package/src/project-run/output-status.ts +0 -69
  942. package/types/package-checks/file-metrics/scc/csv.d.ts +0 -1
  943. package/types/package-checks/function-metrics/lizard/availability.d.ts +0 -11
  944. package/types/package-checks/function-metrics/lizard/csv.d.ts +0 -1
  945. package/types/package-checks/function-metrics/lizard/parser.d.ts +0 -17
  946. package/types/package-checks/function-metrics/lizard/scanner.d.ts +0 -15
  947. package/types/package-checks/host-environment/process/command.d.ts +0 -7
  948. package/types/project-run/invocation.d.ts +0 -34
  949. package/types/project-run/output-configuration.d.ts +0 -3
  950. package/types/project-run/output-status.d.ts +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-messages.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/finding-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAMnC,2FAA2F;AAC3F,MAAM,UAAU,uBAAuB,CACrC,UAAkD,EAClD,aAAgC,EAChC,QAAiB;IAEjB,MAAM,QAAQ,GAA+B;QAC3C,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;KACzF,CAAC;IACF,OAAO,oBAAoB,CAAC;QAC1B,QAAQ;QACR,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACtC,OAAO,MAAM,CAAC,MAAM,CAAC;oBACnB,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,SAAkB;oBACzB,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,sDAAsD;iBAC/E,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7E,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;gBAC3D,OAAO,EAAE,GAAG,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc,KAAK,MAAM,GAAG;aACjG,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,EAAE,EAAE,CACpD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC;gBAC3E,CAAC,CAAE,OAAiB;gBACpB,CAAC,CAAE,SAAmB;YACxB,OAAO,EAAE,GAAG,YAAY,yGAAyG;SAClI,CAAC;KACL,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { CheckMessage } from \"../../check/check.ts\";\nimport { presentCheckFindings } from \"../../check/finding-presentation.ts\";\nimport type { MarkdownLinkRecordCandidate } from \"./records.ts\";\n\nconst PRESENTED_FINDING_LIMIT = 10;\n\ntype PresentedMarkdownFinding =\n | Readonly<{ readonly kind: \"link\"; readonly candidate: MarkdownLinkRecordCandidate }>\n | Readonly<{ readonly kind: \"input-rejected\"; readonly path: string }>;\n\n/** Projects completed Link findings without copying raw destinations into presentation. */\nexport function markdownFindingMessages(\n candidates: readonly MarkdownLinkRecordCandidate[],\n rejectedPaths: readonly string[],\n blocking: boolean\n): readonly CheckMessage[] {\n const findings: PresentedMarkdownFinding[] = [\n ...candidates.map((candidate) => Object.freeze({ kind: \"link\" as const, candidate })),\n ...rejectedPaths.map((path) => Object.freeze({ kind: \"input-rejected\" as const, path }))\n ];\n return presentCheckFindings({\n findings,\n limit: PRESENTED_FINDING_LIMIT,\n message: (finding) => {\n if (finding.kind === \"input-rejected\") {\n return Object.freeze({\n code: \"finding-detail\",\n level: \"warning\" as const,\n message: `${finding.path}: selected input is not a supported Markdown source.`\n });\n }\n const { occurrenceKind, range, reason, sourcePath } = finding.candidate.data;\n return Object.freeze({\n code: \"finding-detail\",\n level: blocking ? (\"error\" as const) : (\"warning\" as const),\n message: `${sourcePath}:${range.start.line}:${range.start.column} ${occurrenceKind}: ${reason}.`\n });\n },\n omittedMessage: ({ omittedCount, omittedFindings }) =>\n Object.freeze({\n code: \"findings-omitted\",\n level: omittedFindings.some((finding) => finding.kind === \"link\" && blocking)\n ? (\"error\" as const)\n : (\"warning\" as const),\n message: `${omittedCount} additional Markdown link finding(s) were not shown; inspect this Check's Records for the complete set.`\n })\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"local-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/local-resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\n\nimport type { MarkdownHeading, ParsedMarkdownLinkFacts } from \"./markdown-parser.ts\";\n\ntype RootExternalTargetMode = \"ignore\" | \"report\" | \"validate\";\nconst NOT_LOCAL_FILE_URI: unique symbol = Symbol(\"not-local-file-uri\");\n\n/** Markdown local-link finding Record 的稳定 reason。 */\nexport type MarkdownLinkFindingReason =\n | \"anchor-on-directory\"\n | \"anchor-target-not-markdown\"\n | \"empty-directory\"\n | \"missing-anchor\"\n | \"missing-target\"\n | \"target-outside-project-root\"\n | \"unsupported-target-type\";\n\ntype MarkdownLocalResolutionReason =\n | \"invalid-local-destination\"\n | \"target-read-limit-exceeded\"\n | \"target-unavailable\";\n\ntype MarkdownSourceReadFailureReason =\n | \"markdown-parse-failed\"\n | \"source-unavailable\"\n | \"source-too-large\";\n\ninterface MarkdownLinkSource {\n readonly path: string;\n readonly facts: ParsedMarkdownLinkFacts;\n}\n\ninterface MarkdownLocalResolver {\n readSource(rootRelativePath: string, maxMarkdownBytes: number): Promise<MarkdownSourceReadResult>;\n resolve(request: MarkdownLocalResolutionRequest): Promise<MarkdownLocalResolution>;\n readonly targetReadCount: number;\n}\n\ninterface MarkdownLocalResolutionRequest {\n readonly source: MarkdownLinkSource;\n readonly rawDestination: string;\n readonly rootExternalTargetMode: RootExternalTargetMode;\n readonly requireExistingTargets: boolean;\n readonly requireNonEmptyDirectories: boolean;\n readonly validateSameDocumentAnchors: boolean;\n readonly validateCrossDocumentAnchors: boolean;\n readonly maxMarkdownBytes: number;\n}\n\ntype MarkdownLocalResolverCreation =\n | Readonly<{ readonly ok: true; readonly resolver: MarkdownLocalResolver }>\n | Readonly<{ readonly ok: false; readonly reason: \"project-root-unavailable\" }>;\n\ntype MarkdownSourceReadResult =\n | Readonly<{ readonly ok: true; readonly source: MarkdownLinkSource }>\n | Readonly<{\n readonly ok: false;\n readonly reason: MarkdownSourceReadFailureReason;\n }>;\n\ntype MarkdownLocalResolution =\n | Readonly<{ readonly kind: \"not-local\" | \"ignored\" }>\n | Readonly<{ readonly kind: \"valid\"; readonly target: MarkdownSafeTargetDescriptor }>\n | Readonly<{\n readonly kind: \"finding\";\n readonly reason: MarkdownLinkFindingReason;\n readonly target: MarkdownSafeTargetDescriptor;\n }>\n | Readonly<{ readonly kind: \"unavailable\"; readonly reason: MarkdownLocalResolutionReason }>;\n\ntype MarkdownSafeTargetDescriptor =\n | Readonly<{\n readonly kind: \"same-document\" | \"project-file\" | \"project-directory\" | \"project-path\";\n readonly path: string;\n readonly fragment: string | null;\n }>\n | Readonly<{ readonly kind: \"outside-project-root\" }>;\n\ninterface ParsedLocalDestination {\n readonly path: string;\n readonly fragment: string | null;\n readonly isAbsolute: boolean;\n}\n\ninterface RootContainedPath {\n readonly kind: \"contained\" | \"missing\";\n readonly absolutePath: string;\n}\n\ntype RootProbe =\n | RootContainedPath\n | Readonly<{ readonly kind: \"outside\" }>\n | Readonly<{ readonly kind: \"unavailable\" }>;\n\ntype EndpointProbe =\n | Readonly<{ readonly kind: \"missing\" }>\n | Readonly<{ readonly kind: \"directory\" | \"file\" | \"unsupported\" | \"unavailable\" }>;\n\nexport function parseLocalDestination(\n rawDestination: string\n): ParsedLocalDestination | \"not-local\" | null {\n if (rawDestination.startsWith(\"//\") || rawDestination.startsWith(\"\\\\\\\\\")) {\n return \"not-local\";\n }\n if (isHostWindowsDriveAbsolute(rawDestination)) {\n return parsePathAndFragment(rawDestination, false);\n }\n const scheme = /^([A-Za-z][A-Za-z\\d+.-]*):/u.exec(rawDestination);\n if (scheme !== null) {\n if (scheme[1]?.toLowerCase() !== \"file\") {\n return \"not-local\";\n }\n return parseFileDestination(rawDestination);\n }\n if (path.sep !== \"\\\\\" && /^[A-Za-z]:[\\\\/]/u.test(rawDestination)) {\n return \"not-local\";\n }\n return parsePathAndFragment(rawDestination, false);\n}\n\nfunction parseFileDestination(rawDestination: string): ParsedLocalDestination | \"not-local\" | null {\n const match = /^file:\\/\\/(\\/.*)$/iu.exec(rawDestination);\n if (match === null) {\n return \"not-local\";\n }\n const uriPathAndFragment = match[1];\n if (uriPathAndFragment === undefined || uriPathAndFragment.startsWith(\"//\")) {\n return \"not-local\";\n }\n if (hasUriQuery(uriPathAndFragment) || containsUnsafeRawFileCharacter(uriPathAndFragment)) {\n return \"not-local\";\n }\n const parsed = parsePathAndFragment(uriPathAndFragment, true);\n if (parsed === null || parsed === \"not-local\") {\n return parsed;\n }\n return Object.freeze({ ...parsed, isAbsolute: true });\n}\n\nfunction parsePathAndFragment(\n rawDestination: string,\n isFileUri: boolean\n): ParsedLocalDestination | \"not-local\" | null {\n const hashIndex = rawDestination.indexOf(\"#\");\n const queryIndex = rawDestination.indexOf(\"?\");\n const pathEnd = [hashIndex, queryIndex]\n .filter((index) => index >= 0)\n .reduce((smallest, index) => Math.min(smallest, index), rawDestination.length);\n const rawPath = rawDestination.slice(0, pathEnd);\n const rawFragment = hashIndex >= 0 ? rawDestination.slice(hashIndex + 1) : null;\n const decodedPath = decodeLocalComponent(rawPath);\n const decodedFragment = rawFragment === null ? null : decodeLocalComponent(rawFragment);\n if (decodedPath === null || (decodedFragment === null && rawFragment !== null)) {\n return null;\n }\n const resolvedPath = isFileUri ? hostFileUriPath(decodedPath) : decodedPath;\n if (resolvedPath === null) return null;\n if (resolvedPath === NOT_LOCAL_FILE_URI) return \"not-local\";\n return Object.freeze({\n path: resolvedPath,\n fragment: decodedFragment,\n isAbsolute: isFileUri || path.isAbsolute(resolvedPath)\n });\n}\n\nfunction decodeLocalComponent(rawComponent: string): string | null {\n if (containsControlCharacter(rawComponent) || /%(?:2f|5c|00|0[0-9a-f]|7f)/iu.test(rawComponent)) {\n return null;\n }\n try {\n const decoded = decodeURIComponent(rawComponent);\n return containsControlCharacter(decoded) ? null : decoded;\n } catch {\n return null;\n }\n}\n\nfunction isHostWindowsDriveAbsolute(value: string): boolean {\n return path.sep === \"\\\\\" && /^[A-Za-z]:[\\\\/]/u.test(value);\n}\n\nfunction hostFileUriPath(decodedPath: string): string | typeof NOT_LOCAL_FILE_URI | null {\n if (decodedPath.includes(\"\\\\\")) return null;\n if (path.sep === \"\\\\\") {\n if (!/^\\/[A-Za-z]:\\//u.test(decodedPath)) return NOT_LOCAL_FILE_URI;\n return path.normalize(decodedPath.slice(1));\n }\n if (/^\\/[A-Za-z]:\\//u.test(decodedPath)) return NOT_LOCAL_FILE_URI;\n return path.isAbsolute(decodedPath) ? decodedPath : null;\n}\n\nfunction hasUriQuery(uriPathAndFragment: string): boolean {\n const queryIndex = uriPathAndFragment.indexOf(\"?\");\n if (queryIndex < 0) return false;\n const fragmentIndex = uriPathAndFragment.indexOf(\"#\");\n return fragmentIndex < 0 || queryIndex < fragmentIndex;\n}\n\nexport function anchorResolution(\n headings: readonly MarkdownHeading[],\n fragment: string,\n target: MarkdownSafeTargetDescriptor\n): MarkdownLocalResolution {\n return headings.some((heading) => heading.slug === fragment)\n ? valid(target)\n : finding(\"missing-anchor\", target);\n}\n\nexport function isRootRelativePath(\n canonicalProjectRoot: string,\n rootRelativePath: string\n): boolean {\n return (\n !path.isAbsolute(rootRelativePath) &&\n isWithinRoot(canonicalProjectRoot, path.resolve(canonicalProjectRoot, rootRelativePath))\n );\n}\n\nexport function isWithinRoot(root: string, candidate: string): boolean {\n const relativePath = path.relative(root, candidate);\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(`..${path.sep}`) &&\n relativePath !== \"..\" &&\n !path.isAbsolute(relativePath))\n );\n}\n\nexport function relativeSegments(root: string, candidate: string): string[] {\n const relativePath = path.relative(root, candidate);\n return relativePath === \"\"\n ? []\n : relativePath.split(path.sep).filter((segment) => segment !== \"\");\n}\n\nexport function sameRootRelativePath(\n rootRelativePath: string,\n targetPath: string,\n canonicalProjectRoot: string\n): boolean {\n return toSlashPath(path.relative(canonicalProjectRoot, targetPath)) === rootRelativePath;\n}\n\nexport function isMarkdownPath(targetPath: string): boolean {\n const extension = path.extname(targetPath).toLowerCase();\n return extension === \".md\" || extension === \".markdown\";\n}\n\nexport function toSlashPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nfunction containsUnsafeRawFileCharacter(value: string): boolean {\n return value.includes(\"\\\\\") || containsControlCharacter(value) || /\\s/u.test(value);\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0);\n if (\n codePoint !== undefined &&\n (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport function isNotFound(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nexport function sourceUnavailable(): MarkdownSourceReadResult {\n return Object.freeze({ ok: false as const, reason: \"source-unavailable\" as const });\n}\n\nexport function valid(target: MarkdownSafeTargetDescriptor): MarkdownLocalResolution {\n return Object.freeze({ kind: \"valid\" as const, target });\n}\n\nexport function finding(\n reason: MarkdownLinkFindingReason,\n target: MarkdownSafeTargetDescriptor\n): MarkdownLocalResolution {\n return Object.freeze({ kind: \"finding\" as const, reason, target });\n}\n\nexport function unavailable(reason: MarkdownLocalResolutionReason): MarkdownLocalResolution {\n return Object.freeze({ kind: \"unavailable\" as const, reason });\n}\n\nexport type {\n MarkdownLinkSource,\n MarkdownLocalResolution,\n MarkdownLocalResolutionReason,\n MarkdownLocalResolver,\n MarkdownLocalResolverCreation,\n MarkdownLocalResolutionRequest,\n MarkdownSafeTargetDescriptor,\n MarkdownSourceReadResult,\n MarkdownSourceReadFailureReason,\n RootProbe,\n EndpointProbe,\n RootExternalTargetMode\n};\n"]}
1
+ {"version":3,"file":"local-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/local-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,MAAM,kBAAkB,GAAkB,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAoGvE,MAAM,UAAU,qBAAqB,CACnC,cAAsB;IAEtB,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzE,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,0BAA0B,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,OAAO,oBAAoB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACxC,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,OAAO,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACjE,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,oBAAoB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,oBAAoB,CAAC,cAAsB;IAClD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,kBAAkB,KAAK,SAAS,IAAI,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,IAAI,WAAW,CAAC,kBAAkB,CAAC,IAAI,8BAA8B,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1F,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,oBAAoB,CAC3B,cAAsB,EACtB,SAAkB;IAElB,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC;SACpC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;SAC7B,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChF,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACxF,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAC5E,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,YAAY,KAAK,kBAAkB;QAAE,OAAO,WAAW,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,eAAe;QACzB,UAAU,EAAE,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB;IAChD,IAAI,wBAAwB,CAAC,YAAY,CAAC,IAAI,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAChG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAa;IAC/C,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB;IAC1C,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,kBAAkB,CAAC;QACpE,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACnE,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,WAAW,CAAC,kBAA0B;IAC7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,aAAa,GAAG,CAAC,IAAI,UAAU,GAAG,aAAa,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAoC,EACpC,QAAgB,EAChB,MAAoC;IAEpC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC1D,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACf,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,oBAA4B,EAC5B,gBAAwB;IAExB,OAAO,CACL,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAClC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,CACzF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,CACL,YAAY,KAAK,EAAE;QACnB,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,YAAY,KAAK,IAAI;YACrB,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAiB;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,YAAY,KAAK,EAAE;QACxB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,gBAAwB,EACxB,UAAkB,EAClB,oBAA4B;IAE5B,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,KAAK,gBAAgB,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,OAAO,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,WAAW,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAa;IACnD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,wBAAwB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa;IAC7C,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3C,IACE,SAAS,KAAK,SAAS;YACvB,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,EAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,oBAA6B,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,MAAoC;IACxD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,MAAiC,EACjC,MAAoC;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,MAAM,EAAE,CAAC,CAAC;AACjE,CAAC","sourcesContent":["import path from \"node:path\";\n\nimport type { MarkdownHeading, ParsedMarkdownLinkFacts } from \"./markdown-parser.ts\";\n\ntype RootExternalTargetMode = \"ignore\" | \"report\" | \"validate\";\nconst NOT_LOCAL_FILE_URI: unique symbol = Symbol(\"not-local-file-uri\");\n\n/** Markdown local-link finding Record 的稳定 reason。 */\nexport type MarkdownLinkFindingReason =\n | \"anchor-on-directory\"\n | \"anchor-target-not-markdown\"\n | \"empty-directory\"\n | \"missing-anchor\"\n | \"missing-target\"\n | \"target-outside-project-root\"\n | \"unsupported-target-type\";\n\ntype MarkdownLocalResolutionReason =\n | \"invalid-local-destination\"\n | \"target-read-limit-exceeded\"\n | \"target-unavailable\";\n\ntype MarkdownSourceReadFailureReason =\n | \"markdown-parse-failed\"\n | \"source-unavailable\"\n | \"source-too-large\";\n\ninterface MarkdownLinkSource {\n readonly path: string;\n readonly facts: ParsedMarkdownLinkFacts;\n}\n\ninterface MarkdownLocalResolver {\n readSource(rootRelativePath: string, maxMarkdownBytes: number): Promise<MarkdownSourceReadResult>;\n resolve(request: MarkdownLocalResolutionRequest): Promise<MarkdownLocalResolution>;\n finalize(): Promise<void>;\n readonly targetReadCount: number;\n}\n\ninterface MarkdownLocalResolutionRequest {\n readonly source: MarkdownLinkSource;\n readonly rawDestination: string;\n readonly rootExternalTargetMode: RootExternalTargetMode;\n readonly requireExistingTargets: boolean;\n readonly requireNonEmptyDirectories: boolean;\n readonly validateSameDocumentAnchors: boolean;\n readonly validateCrossDocumentAnchors: boolean;\n readonly maxMarkdownBytes: number;\n}\n\ntype MarkdownLocalResolverCreation =\n | Readonly<{ readonly ok: true; readonly resolver: MarkdownLocalResolver }>\n | Readonly<{ readonly ok: false; readonly reason: \"project-root-unavailable\" }>;\n\ntype MarkdownSourceReadResult =\n | Readonly<{ readonly ok: true; readonly source: MarkdownLinkSource }>\n | Readonly<{\n readonly ok: false;\n readonly reason: MarkdownSourceReadFailureReason;\n }>;\n\ntype MarkdownLocalResolution =\n | Readonly<{ readonly kind: \"not-local\" | \"ignored\" }>\n | Readonly<{ readonly kind: \"valid\"; readonly target: MarkdownSafeTargetDescriptor }>\n | Readonly<{\n readonly kind: \"finding\";\n readonly reason: MarkdownLinkFindingReason;\n readonly target: MarkdownSafeTargetDescriptor;\n }>\n | Readonly<{ readonly kind: \"unavailable\"; readonly reason: MarkdownLocalResolutionReason }>;\n\ntype MarkdownSafeTargetDescriptor =\n | Readonly<{\n readonly kind: \"same-document\" | \"project-file\" | \"project-directory\" | \"project-path\";\n readonly path: string;\n readonly fragment: string | null;\n }>\n | Readonly<{ readonly kind: \"outside-project-root\" }>;\n\ninterface ParsedLocalDestination {\n readonly path: string;\n readonly fragment: string | null;\n readonly isAbsolute: boolean;\n}\n\ntype RootProbe =\n | Readonly<{\n readonly kind: \"contained\";\n readonly absolutePath: string;\n /** The final component observation is present when containment walked it. */\n readonly endpoint?: ExistingEndpointProbe;\n }>\n | Readonly<{\n readonly kind: \"missing\";\n readonly absolutePath: string;\n }>\n | Readonly<{ readonly kind: \"outside\" }>\n | Readonly<{ readonly kind: \"unavailable\" }>;\n\ntype EndpointProbe = Readonly<{ readonly kind: \"missing\" }> | ExistingEndpointProbe;\n\ntype ExistingEndpointProbe = Readonly<{\n readonly kind: \"directory\" | \"file\" | \"unsupported\" | \"unavailable\";\n}>;\n\nexport function parseLocalDestination(\n rawDestination: string\n): ParsedLocalDestination | \"not-local\" | null {\n if (rawDestination.startsWith(\"//\") || rawDestination.startsWith(\"\\\\\\\\\")) {\n return \"not-local\";\n }\n if (isHostWindowsDriveAbsolute(rawDestination)) {\n return parsePathAndFragment(rawDestination, false);\n }\n const scheme = /^([A-Za-z][A-Za-z\\d+.-]*):/u.exec(rawDestination);\n if (scheme !== null) {\n if (scheme[1]?.toLowerCase() !== \"file\") {\n return \"not-local\";\n }\n return parseFileDestination(rawDestination);\n }\n if (path.sep !== \"\\\\\" && /^[A-Za-z]:[\\\\/]/u.test(rawDestination)) {\n return \"not-local\";\n }\n return parsePathAndFragment(rawDestination, false);\n}\n\nfunction parseFileDestination(rawDestination: string): ParsedLocalDestination | \"not-local\" | null {\n const match = /^file:\\/\\/(\\/.*)$/iu.exec(rawDestination);\n if (match === null) {\n return \"not-local\";\n }\n const uriPathAndFragment = match[1];\n if (uriPathAndFragment === undefined || uriPathAndFragment.startsWith(\"//\")) {\n return \"not-local\";\n }\n if (hasUriQuery(uriPathAndFragment) || containsUnsafeRawFileCharacter(uriPathAndFragment)) {\n return \"not-local\";\n }\n const parsed = parsePathAndFragment(uriPathAndFragment, true);\n if (parsed === null || parsed === \"not-local\") {\n return parsed;\n }\n return Object.freeze({ ...parsed, isAbsolute: true });\n}\n\nfunction parsePathAndFragment(\n rawDestination: string,\n isFileUri: boolean\n): ParsedLocalDestination | \"not-local\" | null {\n const hashIndex = rawDestination.indexOf(\"#\");\n const queryIndex = rawDestination.indexOf(\"?\");\n const pathEnd = [hashIndex, queryIndex]\n .filter((index) => index >= 0)\n .reduce((smallest, index) => Math.min(smallest, index), rawDestination.length);\n const rawPath = rawDestination.slice(0, pathEnd);\n const rawFragment = hashIndex >= 0 ? rawDestination.slice(hashIndex + 1) : null;\n const decodedPath = decodeLocalComponent(rawPath);\n const decodedFragment = rawFragment === null ? null : decodeLocalComponent(rawFragment);\n if (decodedPath === null || (decodedFragment === null && rawFragment !== null)) {\n return null;\n }\n const resolvedPath = isFileUri ? hostFileUriPath(decodedPath) : decodedPath;\n if (resolvedPath === null) return null;\n if (resolvedPath === NOT_LOCAL_FILE_URI) return \"not-local\";\n return Object.freeze({\n path: resolvedPath,\n fragment: decodedFragment,\n isAbsolute: isFileUri || path.isAbsolute(resolvedPath)\n });\n}\n\nfunction decodeLocalComponent(rawComponent: string): string | null {\n if (containsControlCharacter(rawComponent) || /%(?:2f|5c|00|0[0-9a-f]|7f)/iu.test(rawComponent)) {\n return null;\n }\n try {\n const decoded = decodeURIComponent(rawComponent);\n return containsControlCharacter(decoded) ? null : decoded;\n } catch {\n return null;\n }\n}\n\nfunction isHostWindowsDriveAbsolute(value: string): boolean {\n return path.sep === \"\\\\\" && /^[A-Za-z]:[\\\\/]/u.test(value);\n}\n\nfunction hostFileUriPath(decodedPath: string): string | typeof NOT_LOCAL_FILE_URI | null {\n if (decodedPath.includes(\"\\\\\")) return null;\n if (path.sep === \"\\\\\") {\n if (!/^\\/[A-Za-z]:\\//u.test(decodedPath)) return NOT_LOCAL_FILE_URI;\n return path.normalize(decodedPath.slice(1));\n }\n if (/^\\/[A-Za-z]:\\//u.test(decodedPath)) return NOT_LOCAL_FILE_URI;\n return path.isAbsolute(decodedPath) ? decodedPath : null;\n}\n\nfunction hasUriQuery(uriPathAndFragment: string): boolean {\n const queryIndex = uriPathAndFragment.indexOf(\"?\");\n if (queryIndex < 0) return false;\n const fragmentIndex = uriPathAndFragment.indexOf(\"#\");\n return fragmentIndex < 0 || queryIndex < fragmentIndex;\n}\n\nexport function anchorResolution(\n headings: readonly MarkdownHeading[],\n fragment: string,\n target: MarkdownSafeTargetDescriptor\n): MarkdownLocalResolution {\n return headings.some((heading) => heading.slug === fragment)\n ? valid(target)\n : finding(\"missing-anchor\", target);\n}\n\nexport function isRootRelativePath(\n canonicalProjectRoot: string,\n rootRelativePath: string\n): boolean {\n return (\n !path.isAbsolute(rootRelativePath) &&\n isWithinRoot(canonicalProjectRoot, path.resolve(canonicalProjectRoot, rootRelativePath))\n );\n}\n\nexport function isWithinRoot(root: string, candidate: string): boolean {\n const relativePath = path.relative(root, candidate);\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(`..${path.sep}`) &&\n relativePath !== \"..\" &&\n !path.isAbsolute(relativePath))\n );\n}\n\nexport function relativeSegments(root: string, candidate: string): string[] {\n const relativePath = path.relative(root, candidate);\n return relativePath === \"\"\n ? []\n : relativePath.split(path.sep).filter((segment) => segment !== \"\");\n}\n\nexport function sameRootRelativePath(\n rootRelativePath: string,\n targetPath: string,\n canonicalProjectRoot: string\n): boolean {\n return toSlashPath(path.relative(canonicalProjectRoot, targetPath)) === rootRelativePath;\n}\n\nexport function isMarkdownPath(targetPath: string): boolean {\n const extension = path.extname(targetPath).toLowerCase();\n return extension === \".md\" || extension === \".markdown\";\n}\n\nexport function toSlashPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nfunction containsUnsafeRawFileCharacter(value: string): boolean {\n return value.includes(\"\\\\\") || containsControlCharacter(value) || /\\s/u.test(value);\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0);\n if (\n codePoint !== undefined &&\n (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport function isNotFound(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nexport function sourceUnavailable(): MarkdownSourceReadResult {\n return Object.freeze({ ok: false as const, reason: \"source-unavailable\" as const });\n}\n\nexport function valid(target: MarkdownSafeTargetDescriptor): MarkdownLocalResolution {\n return Object.freeze({ kind: \"valid\" as const, target });\n}\n\nexport function finding(\n reason: MarkdownLinkFindingReason,\n target: MarkdownSafeTargetDescriptor\n): MarkdownLocalResolution {\n return Object.freeze({ kind: \"finding\" as const, reason, target });\n}\n\nexport function unavailable(reason: MarkdownLocalResolutionReason): MarkdownLocalResolution {\n return Object.freeze({ kind: \"unavailable\" as const, reason });\n}\n\nexport type {\n MarkdownLinkSource,\n MarkdownLocalResolution,\n MarkdownLocalResolutionReason,\n MarkdownLocalResolver,\n MarkdownLocalResolverCreation,\n MarkdownLocalResolutionRequest,\n MarkdownSafeTargetDescriptor,\n MarkdownSourceReadResult,\n MarkdownSourceReadFailureReason,\n RootProbe,\n EndpointProbe,\n ExistingEndpointProbe,\n RootExternalTargetMode\n};\n"]}
@@ -1,12 +1,12 @@
1
1
  import { realpath } from "node:fs/promises";
2
2
  import { LinkLocalResolver } from "./resolver-engine.mjs";
3
3
  /** Link-private, per-invocation state for source reads and direct local targets. */
4
- export async function createMarkdownLocalResolver(projectRoot, maxTargetReads) {
4
+ export async function createMarkdownLocalResolver(projectRoot, maxTargetReads, cache, signal) {
5
5
  try {
6
6
  const canonicalProjectRoot = await realpath(projectRoot);
7
7
  return Object.freeze({
8
8
  ok: true,
9
- resolver: new LinkLocalResolver(canonicalProjectRoot, maxTargetReads)
9
+ resolver: new LinkLocalResolver(canonicalProjectRoot, maxTargetReads, cache, signal)
10
10
  });
11
11
  }
12
12
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"local-resolver.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/local-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB,EACnB,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,oBAAoB,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,IAAa;YACjB,QAAQ,EAAE,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,cAAc,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,0BAAmC,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,KAAK,EACN,MAAM,uBAAuB,CAAC","sourcesContent":["import { realpath } from \"node:fs/promises\";\n\nimport { LinkLocalResolver } from \"./resolver-engine.ts\";\nimport type { MarkdownLocalResolverCreation } from \"./local-resolution.ts\";\n\n/** Link-private, per-invocation state for source reads and direct local targets. */\nexport async function createMarkdownLocalResolver(\n projectRoot: string,\n maxTargetReads: number\n): Promise<MarkdownLocalResolverCreation> {\n try {\n const canonicalProjectRoot = await realpath(projectRoot);\n return Object.freeze({\n ok: true as const,\n resolver: new LinkLocalResolver(canonicalProjectRoot, maxTargetReads)\n });\n } catch {\n return Object.freeze({ ok: false as const, reason: \"project-root-unavailable\" as const });\n }\n}\n\nexport {\n anchorResolution,\n finding,\n isMarkdownPath,\n isNotFound,\n isRootRelativePath,\n isWithinRoot,\n parseLocalDestination,\n relativeSegments,\n sameRootRelativePath,\n sourceUnavailable,\n toSlashPath,\n unavailable,\n valid\n} from \"./local-resolution.ts\";\nexport type {\n EndpointProbe,\n MarkdownLinkFindingReason,\n MarkdownLinkSource,\n MarkdownLocalResolution,\n MarkdownLocalResolutionReason,\n MarkdownLocalResolutionRequest,\n MarkdownLocalResolver,\n MarkdownLocalResolverCreation,\n MarkdownSafeTargetDescriptor,\n MarkdownSourceReadFailureReason,\n MarkdownSourceReadResult,\n RootExternalTargetMode,\n RootProbe\n} from \"./local-resolution.ts\";\n"]}
1
+ {"version":3,"file":"local-resolver.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/local-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB,EACnB,cAAsB,EACtB,KAAqD,EACrD,MAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,oBAAoB,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,IAAa;YACjB,QAAQ,EAAE,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC;SACrF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,0BAAmC,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED,OAAO,EACL,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,KAAK,EACN,MAAM,uBAAuB,CAAC","sourcesContent":["import { realpath } from \"node:fs/promises\";\n\nimport { LinkLocalResolver } from \"./resolver-engine.ts\";\nimport type { MarkdownLocalResolverCreation } from \"./local-resolution.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\n\n/** Link-private, per-invocation state for source reads and direct local targets. */\nexport async function createMarkdownLocalResolver(\n projectRoot: string,\n maxTargetReads: number,\n cache: ResolvedMarkdownLinkValidationOptions[\"cache\"],\n signal: AbortSignal\n): Promise<MarkdownLocalResolverCreation> {\n try {\n const canonicalProjectRoot = await realpath(projectRoot);\n return Object.freeze({\n ok: true as const,\n resolver: new LinkLocalResolver(canonicalProjectRoot, maxTargetReads, cache, signal)\n });\n } catch {\n return Object.freeze({ ok: false as const, reason: \"project-root-unavailable\" as const });\n }\n}\n\nexport {\n anchorResolution,\n finding,\n isMarkdownPath,\n isNotFound,\n isRootRelativePath,\n isWithinRoot,\n parseLocalDestination,\n relativeSegments,\n sameRootRelativePath,\n sourceUnavailable,\n toSlashPath,\n unavailable,\n valid\n} from \"./local-resolution.ts\";\nexport type {\n EndpointProbe,\n MarkdownLinkFindingReason,\n MarkdownLinkSource,\n MarkdownLocalResolution,\n MarkdownLocalResolutionReason,\n MarkdownLocalResolutionRequest,\n MarkdownLocalResolver,\n MarkdownLocalResolverCreation,\n MarkdownSafeTargetDescriptor,\n MarkdownSourceReadFailureReason,\n MarkdownSourceReadResult,\n RootExternalTargetMode,\n RootProbe\n} from \"./local-resolution.ts\";\n"]}
@@ -1,5 +1,5 @@
1
1
  import { canonicalizeJsonObject } from "../../data-boundary/canonical-data.mjs";
2
- import { hasRequiredAndOptionalRecordKeys, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
2
+ import { hasExactPlainRecordKeys, hasRequiredAndOptionalRecordKeys, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
3
3
  import { defaultProjectFileSelection, resolveProjectFileSelection, snapshotProjectFileSelection } from "../project-files/configuration.mjs";
4
4
  import { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from "../code-quality-findings/policy.mjs";
5
5
  import { validMarkdownLinkValidationOptions } from "./options-validation.mjs";
@@ -21,14 +21,18 @@ export function resolveMarkdownLinkValidationOptions(value) {
21
21
  const limits = resolvedLimits(input.limits);
22
22
  const files = resolvedFiles(input.files);
23
23
  const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);
24
- if (limits === undefined || files === undefined || findingPolicy === undefined)
24
+ const cache = resolvedCache(input.cache);
25
+ if (limits === undefined ||
26
+ files === undefined ||
27
+ findingPolicy === undefined ||
28
+ cache === undefined)
25
29
  return undefined;
26
- const candidate = optionsCandidate(input, files, findingPolicy, limits);
30
+ const candidate = optionsCandidate(input, files, findingPolicy, limits, cache);
27
31
  return candidate !== undefined && validMarkdownLinkValidationOptions(candidate)
28
32
  ? candidate
29
33
  : undefined;
30
34
  }
31
- function optionsCandidate(input, files, findingPolicy, limits) {
35
+ function optionsCandidate(input, files, findingPolicy, limits, cache) {
32
36
  return canonicalizeJsonObject({
33
37
  files,
34
38
  findingPolicy,
@@ -37,6 +41,7 @@ function optionsCandidate(input, files, findingPolicy, limits) {
37
41
  validateCrossDocumentAnchors: input.validateCrossDocumentAnchors === undefined ? true : input.validateCrossDocumentAnchors,
38
42
  rootExternalTargetMode: input.rootExternalTargetMode === undefined ? "report" : input.rootExternalTargetMode,
39
43
  requireNonEmptyDirectories: input.requireNonEmptyDirectories === undefined ? false : input.requireNonEmptyDirectories,
44
+ cache,
40
45
  limits
41
46
  });
42
47
  }
@@ -51,11 +56,28 @@ function isMarkdownLinkValidationInput(input) {
51
56
  "validateCrossDocumentAnchors",
52
57
  "rootExternalTargetMode",
53
58
  "requireNonEmptyDirectories",
59
+ "cache",
54
60
  "limits"
55
61
  ],
56
62
  required: []
57
63
  }));
58
64
  }
65
+ function resolvedCache(value) {
66
+ if (value === undefined)
67
+ return Object.freeze({ enabled: false });
68
+ const cache = snapshotClosedRecord(value);
69
+ if (cache === undefined)
70
+ return undefined;
71
+ if (hasExactPlainRecordKeys(cache, ["enabled"]) && cache.enabled === false) {
72
+ return Object.freeze({ enabled: false });
73
+ }
74
+ if (hasExactPlainRecordKeys(cache, ["enabled", "directory"]) &&
75
+ cache.enabled === true &&
76
+ typeof cache.directory === "string") {
77
+ return Object.freeze({ enabled: true, directory: cache.directory });
78
+ }
79
+ return undefined;
80
+ }
59
81
  function resolvedFiles(value) {
60
82
  return value === undefined
61
83
  ? snapshotProjectFileSelection(DEFAULT_FILES)
@@ -1 +1 @@
1
- {"version":3,"file":"options-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import { canonicalizeJsonObject } from \"../../data-boundary/canonical-data.ts\";\nimport {\n hasRequiredAndOptionalRecordKeys,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport {\n defaultProjectFileSelection,\n resolveProjectFileSelection,\n snapshotProjectFileSelection\n} from \"../project-files/configuration.ts\";\nimport { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\nconst DEFAULT_LIMITS = Object.freeze({\n maxMarkdownBytes: 1_048_576,\n maxOccurrences: 10_000,\n maxTargetReads: 1_000\n});\nconst DEFAULT_FILES = Object.freeze({\n exclude: defaultProjectFileSelection.exclude,\n include: Object.freeze([\"**/*.[mM][dD]\", \"**/*.[mM][aA][rR][kK][dD][oO][wW][nN]\"]),\n source: defaultProjectFileSelection.source\n});\n\n/** 将可省略 Markdown link policy 物化为完整、冻结的 execution options。 */\nexport function resolveMarkdownLinkValidationOptions(\n value: unknown\n): ResolvedMarkdownLinkValidationOptions | undefined {\n const input = snapshotClosedRecord(value);\n if (!isMarkdownLinkValidationInput(input)) return undefined;\n const limits = resolvedLimits(input.limits);\n const files = resolvedFiles(input.files);\n const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);\n if (limits === undefined || files === undefined || findingPolicy === undefined) return undefined;\n const candidate = optionsCandidate(input, files, findingPolicy, limits);\n return candidate !== undefined && validMarkdownLinkValidationOptions(candidate)\n ? candidate\n : undefined;\n}\n\nfunction optionsCandidate(\n input: Readonly<Record<string, unknown>>,\n files: Exclude<ReturnType<typeof resolvedFiles>, undefined>,\n findingPolicy: Exclude<ReturnType<typeof resolveFindingPolicy>, undefined>,\n limits: Readonly<Record<string, unknown>>\n) {\n return canonicalizeJsonObject({\n files,\n findingPolicy,\n requireExistingTargets:\n input.requireExistingTargets === undefined ? true : input.requireExistingTargets,\n validateSameDocumentAnchors:\n input.validateSameDocumentAnchors === undefined ? true : input.validateSameDocumentAnchors,\n validateCrossDocumentAnchors:\n input.validateCrossDocumentAnchors === undefined ? true : input.validateCrossDocumentAnchors,\n rootExternalTargetMode:\n input.rootExternalTargetMode === undefined ? \"report\" : input.rootExternalTargetMode,\n requireNonEmptyDirectories:\n input.requireNonEmptyDirectories === undefined ? false : input.requireNonEmptyDirectories,\n limits\n });\n}\n\nfunction isMarkdownLinkValidationInput(\n input: Readonly<Record<string, unknown>> | undefined\n): input is Readonly<Record<string, unknown>> {\n return (\n input !== undefined &&\n hasRequiredAndOptionalRecordKeys(input, {\n optional: [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"limits\"\n ],\n required: []\n })\n );\n}\n\nfunction resolvedFiles(value: unknown) {\n return value === undefined\n ? snapshotProjectFileSelection(DEFAULT_FILES)\n : resolveProjectFileSelection(value, DEFAULT_FILES);\n}\n\nfunction resolvedLimits(value: unknown): Readonly<Record<string, unknown>> | undefined {\n if (value === undefined) return DEFAULT_LIMITS;\n const limits = snapshotClosedRecord(value);\n if (\n limits === undefined ||\n !hasRequiredAndOptionalRecordKeys(limits, {\n optional: [\"maxMarkdownBytes\", \"maxOccurrences\", \"maxTargetReads\"],\n required: []\n })\n ) {\n return undefined;\n }\n return Object.freeze({\n maxMarkdownBytes:\n limits.maxMarkdownBytes === undefined\n ? DEFAULT_LIMITS.maxMarkdownBytes\n : limits.maxMarkdownBytes,\n maxOccurrences:\n limits.maxOccurrences === undefined ? DEFAULT_LIMITS.maxOccurrences : limits.maxOccurrences,\n maxTargetReads:\n limits.maxTargetReads === undefined ? DEFAULT_LIMITS.maxTargetReads : limits.maxTargetReads\n });\n}\n"]}
1
+ {"version":3,"file":"options-resolution.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAElG,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAC;AAE7E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AACH,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,2BAA2B,CAAC,OAAO;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,uCAAuC,CAAC,CAAC;IAClF,MAAM,EAAE,2BAA2B,CAAC,MAAM;CAC3C,CAAC,CAAC;AAEH,6DAA6D;AAC7D,MAAM,UAAU,oCAAoC,CAClD,KAAc;IAEd,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,IACE,MAAM,KAAK,SAAS;QACpB,KAAK,KAAK,SAAS;QACnB,aAAa,KAAK,SAAS;QAC3B,KAAK,KAAK,SAAS;QAEnB,OAAO,SAAS,CAAC;IACnB,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,SAAS,KAAK,SAAS,IAAI,kCAAkC,CAAC,SAAS,CAAC;QAC7E,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAwC,EACxC,KAA2D,EAC3D,aAA0E,EAC1E,MAAyC,EACzC,KAAqD;IAErD,OAAO,sBAAsB,CAAC;QAC5B,KAAK;QACL,aAAa;QACb,sBAAsB,EACpB,KAAK,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,sBAAsB;QAClF,2BAA2B,EACzB,KAAK,CAAC,2BAA2B,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B;QAC5F,4BAA4B,EAC1B,KAAK,CAAC,4BAA4B,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B;QAC9F,sBAAsB,EACpB,KAAK,CAAC,sBAAsB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,sBAAsB;QACtF,0BAA0B,EACxB,KAAK,CAAC,0BAA0B,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B;QAC3F,KAAK;QACL,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,SAAS,6BAA6B,CACpC,KAAoD;IAEpD,OAAO,CACL,KAAK,KAAK,SAAS;QACnB,gCAAgC,CAAC,KAAK,EAAE;YACtC,QAAQ,EAAE;gBACR,OAAO;gBACP,eAAe;gBACf,wBAAwB;gBACxB,6BAA6B;gBAC7B,8BAA8B;gBAC9B,wBAAwB;gBACxB,4BAA4B;gBAC5B,OAAO;gBACP,QAAQ;aACT;YACD,QAAQ,EAAE,EAAE;SACb,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,uBAAuB,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAc,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IACE,uBAAuB,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACxD,KAAK,CAAC,OAAO,KAAK,IAAI;QACtB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EACnC,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,4BAA4B,CAAC,aAAa,CAAC;QAC7C,CAAC,CAAC,2BAA2B,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC;IAC/C,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,IACE,MAAM,KAAK,SAAS;QACpB,CAAC,gCAAgC,CAAC,MAAM,EAAE;YACxC,QAAQ,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC;YAClE,QAAQ,EAAE,EAAE;SACb,CAAC,EACF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,gBAAgB,EACd,MAAM,CAAC,gBAAgB,KAAK,SAAS;YACnC,CAAC,CAAC,cAAc,CAAC,gBAAgB;YACjC,CAAC,CAAC,MAAM,CAAC,gBAAgB;QAC7B,cAAc,EACZ,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc;QAC7F,cAAc,EACZ,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc;KAC9F,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { canonicalizeJsonObject } from \"../../data-boundary/canonical-data.ts\";\nimport {\n hasExactPlainRecordKeys,\n hasRequiredAndOptionalRecordKeys,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport {\n defaultProjectFileSelection,\n resolveProjectFileSelection,\n snapshotProjectFileSelection\n} from \"../project-files/configuration.ts\";\nimport { DEFAULT_FINDING_POLICY, resolveFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\nimport { validMarkdownLinkValidationOptions } from \"./options-validation.ts\";\n\nconst DEFAULT_LIMITS = Object.freeze({\n maxMarkdownBytes: 1_048_576,\n maxOccurrences: 10_000,\n maxTargetReads: 1_000\n});\nconst DEFAULT_FILES = Object.freeze({\n exclude: defaultProjectFileSelection.exclude,\n include: Object.freeze([\"**/*.[mM][dD]\", \"**/*.[mM][aA][rR][kK][dD][oO][wW][nN]\"]),\n source: defaultProjectFileSelection.source\n});\n\n/** 将可省略 Markdown link policy 物化为完整、冻结的 execution options。 */\nexport function resolveMarkdownLinkValidationOptions(\n value: unknown\n): ResolvedMarkdownLinkValidationOptions | undefined {\n const input = snapshotClosedRecord(value);\n if (!isMarkdownLinkValidationInput(input)) return undefined;\n const limits = resolvedLimits(input.limits);\n const files = resolvedFiles(input.files);\n const findingPolicy = resolveFindingPolicy(input.findingPolicy, DEFAULT_FINDING_POLICY);\n const cache = resolvedCache(input.cache);\n if (\n limits === undefined ||\n files === undefined ||\n findingPolicy === undefined ||\n cache === undefined\n )\n return undefined;\n const candidate = optionsCandidate(input, files, findingPolicy, limits, cache);\n return candidate !== undefined && validMarkdownLinkValidationOptions(candidate)\n ? candidate\n : undefined;\n}\n\nfunction optionsCandidate(\n input: Readonly<Record<string, unknown>>,\n files: Exclude<ReturnType<typeof resolvedFiles>, undefined>,\n findingPolicy: Exclude<ReturnType<typeof resolveFindingPolicy>, undefined>,\n limits: Readonly<Record<string, unknown>>,\n cache: ResolvedMarkdownLinkValidationOptions[\"cache\"]\n) {\n return canonicalizeJsonObject({\n files,\n findingPolicy,\n requireExistingTargets:\n input.requireExistingTargets === undefined ? true : input.requireExistingTargets,\n validateSameDocumentAnchors:\n input.validateSameDocumentAnchors === undefined ? true : input.validateSameDocumentAnchors,\n validateCrossDocumentAnchors:\n input.validateCrossDocumentAnchors === undefined ? true : input.validateCrossDocumentAnchors,\n rootExternalTargetMode:\n input.rootExternalTargetMode === undefined ? \"report\" : input.rootExternalTargetMode,\n requireNonEmptyDirectories:\n input.requireNonEmptyDirectories === undefined ? false : input.requireNonEmptyDirectories,\n cache,\n limits\n });\n}\n\nfunction isMarkdownLinkValidationInput(\n input: Readonly<Record<string, unknown>> | undefined\n): input is Readonly<Record<string, unknown>> {\n return (\n input !== undefined &&\n hasRequiredAndOptionalRecordKeys(input, {\n optional: [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"cache\",\n \"limits\"\n ],\n required: []\n })\n );\n}\n\nfunction resolvedCache(value: unknown): ResolvedMarkdownLinkValidationOptions[\"cache\"] | undefined {\n if (value === undefined) return Object.freeze({ enabled: false as const });\n const cache = snapshotClosedRecord(value);\n if (cache === undefined) return undefined;\n if (hasExactPlainRecordKeys(cache, [\"enabled\"]) && cache.enabled === false) {\n return Object.freeze({ enabled: false as const });\n }\n if (\n hasExactPlainRecordKeys(cache, [\"enabled\", \"directory\"]) &&\n cache.enabled === true &&\n typeof cache.directory === \"string\"\n ) {\n return Object.freeze({ enabled: true as const, directory: cache.directory });\n }\n return undefined;\n}\n\nfunction resolvedFiles(value: unknown) {\n return value === undefined\n ? snapshotProjectFileSelection(DEFAULT_FILES)\n : resolveProjectFileSelection(value, DEFAULT_FILES);\n}\n\nfunction resolvedLimits(value: unknown): Readonly<Record<string, unknown>> | undefined {\n if (value === undefined) return DEFAULT_LIMITS;\n const limits = snapshotClosedRecord(value);\n if (\n limits === undefined ||\n !hasRequiredAndOptionalRecordKeys(limits, {\n optional: [\"maxMarkdownBytes\", \"maxOccurrences\", \"maxTargetReads\"],\n required: []\n })\n ) {\n return undefined;\n }\n return Object.freeze({\n maxMarkdownBytes:\n limits.maxMarkdownBytes === undefined\n ? DEFAULT_LIMITS.maxMarkdownBytes\n : limits.maxMarkdownBytes,\n maxOccurrences:\n limits.maxOccurrences === undefined ? DEFAULT_LIMITS.maxOccurrences : limits.maxOccurrences,\n maxTargetReads:\n limits.maxTargetReads === undefined ? DEFAULT_LIMITS.maxTargetReads : limits.maxTargetReads\n });\n}\n"]}
@@ -1,18 +1,13 @@
1
- import { hasExactPlainRecordKeys, snapshotClosedRecord } from "../../data-boundary/closed-values.mjs";
1
+ import { isAbsolute } from "node:path";
2
+ import { snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
3
+ import { isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
2
4
  import { validProjectFileSelection } from "../project-files/configuration.mjs";
3
5
  import { validFindingPolicy } from "../code-quality-findings/policy.mjs";
4
- function exactRecord(value, keys) {
5
- const record = snapshotClosedRecord(value);
6
- return record !== undefined && hasExactPlainRecordKeys(record, keys) ? record : undefined;
7
- }
8
- function positiveSafeInteger(value) {
9
- return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
10
- }
11
6
  function boundedPositiveSafeInteger(value, maximum) {
12
- return positiveSafeInteger(value) && value <= maximum;
7
+ return isPositiveSafeInteger(value) && value <= maximum;
13
8
  }
14
9
  export function validMarkdownLinkValidationOptions(value) {
15
- const options = exactRecord(value, [
10
+ const options = snapshotExactClosedRecord(value, [
16
11
  "files",
17
12
  "findingPolicy",
18
13
  "requireExistingTargets",
@@ -20,6 +15,7 @@ export function validMarkdownLinkValidationOptions(value) {
20
15
  "validateCrossDocumentAnchors",
21
16
  "rootExternalTargetMode",
22
17
  "requireNonEmptyDirectories",
18
+ "cache",
23
19
  "limits"
24
20
  ]);
25
21
  return options !== undefined && validOptionFields(options);
@@ -28,8 +24,21 @@ function validOptionFields(options) {
28
24
  return (validProjectFileSelection(options.files) &&
29
25
  validFindingPolicy(options.findingPolicy) &&
30
26
  validAnchorValidationOptions(options) &&
27
+ validMarkdownLinkCache(options.cache) &&
31
28
  validMarkdownLinkLimits(options.limits));
32
29
  }
30
+ function validMarkdownLinkCache(value) {
31
+ const disabled = snapshotExactClosedRecord(value, ["enabled"]);
32
+ if (disabled !== undefined && disabled.enabled === false)
33
+ return true;
34
+ const enabled = snapshotExactClosedRecord(value, ["enabled", "directory"]);
35
+ return (enabled !== undefined &&
36
+ enabled.enabled === true &&
37
+ typeof enabled.directory === "string" &&
38
+ enabled.directory.length > 0 &&
39
+ !enabled.directory.includes("\0") &&
40
+ isAbsolute(enabled.directory));
41
+ }
33
42
  function validAnchorValidationOptions(options) {
34
43
  return (typeof options.requireExistingTargets === "boolean" &&
35
44
  typeof options.validateSameDocumentAnchors === "boolean" &&
@@ -41,7 +50,11 @@ function validRootExternalTargetMode(value) {
41
50
  return value === "ignore" || value === "report" || value === "validate";
42
51
  }
43
52
  function validMarkdownLinkLimits(value) {
44
- const limits = exactRecord(value, ["maxMarkdownBytes", "maxOccurrences", "maxTargetReads"]);
53
+ const limits = snapshotExactClosedRecord(value, [
54
+ "maxMarkdownBytes",
55
+ "maxOccurrences",
56
+ "maxTargetReads"
57
+ ]);
45
58
  return (limits !== undefined &&
46
59
  boundedPositiveSafeInteger(limits.maxMarkdownBytes, 16_777_216) &&
47
60
  boundedPositiveSafeInteger(limits.maxOccurrences, 100_000) &&
@@ -1 +1 @@
1
- {"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE,SAAS,WAAW,CAClB,KAAc,EACd,IAAuB;IAEvB,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,MAAM,KAAK,SAAS,IAAI,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5F,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc,EAAE,OAAe;IACjE,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAChD,KAAc;IAEd,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE;QACjC,OAAO;QACP,eAAe;QACf,wBAAwB;QACxB,6BAA6B;QAC7B,8BAA8B;QAC9B,wBAAwB;QACxB,4BAA4B;QAC5B,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,OAAO,KAAK,SAAS,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA0C;IACnE,OAAO,CACL,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC;QACzC,4BAA4B,CAAC,OAAO,CAAC;QACrC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,OAA0C;IAC9E,OAAO,CACL,OAAO,OAAO,CAAC,sBAAsB,KAAK,SAAS;QACnD,OAAO,OAAO,CAAC,2BAA2B,KAAK,SAAS;QACxD,OAAO,OAAO,CAAC,4BAA4B,KAAK,SAAS;QACzD,2BAA2B,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC3D,OAAO,OAAO,CAAC,0BAA0B,KAAK,SAAS,CACxD,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IACjD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,CAAC;AAC1E,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC5F,OAAO,CACL,MAAM,KAAK,SAAS;QACpB,0BAA0B,CAAC,MAAM,CAAC,gBAAgB,EAAE,UAAU,CAAC;QAC/D,0BAA0B,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC;QAC1D,0BAA0B,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAC1D,CAAC;AACJ,CAAC","sourcesContent":["import {\n hasExactPlainRecordKeys,\n snapshotClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { validFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\n\nfunction exactRecord(\n value: unknown,\n keys: readonly string[]\n): Readonly<Record<string, unknown>> | undefined {\n const record = snapshotClosedRecord(value);\n return record !== undefined && hasExactPlainRecordKeys(record, keys) ? record : undefined;\n}\n\nfunction positiveSafeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction boundedPositiveSafeInteger(value: unknown, maximum: number): value is number {\n return positiveSafeInteger(value) && value <= maximum;\n}\n\nexport function validMarkdownLinkValidationOptions(\n value: unknown\n): value is ResolvedMarkdownLinkValidationOptions {\n const options = exactRecord(value, [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"limits\"\n ]);\n return options !== undefined && validOptionFields(options);\n}\n\nfunction validOptionFields(options: Readonly<Record<string, unknown>>): boolean {\n return (\n validProjectFileSelection(options.files) &&\n validFindingPolicy(options.findingPolicy) &&\n validAnchorValidationOptions(options) &&\n validMarkdownLinkLimits(options.limits)\n );\n}\n\nfunction validAnchorValidationOptions(options: Readonly<Record<string, unknown>>): boolean {\n return (\n typeof options.requireExistingTargets === \"boolean\" &&\n typeof options.validateSameDocumentAnchors === \"boolean\" &&\n typeof options.validateCrossDocumentAnchors === \"boolean\" &&\n validRootExternalTargetMode(options.rootExternalTargetMode) &&\n typeof options.requireNonEmptyDirectories === \"boolean\"\n );\n}\n\nfunction validRootExternalTargetMode(value: unknown): boolean {\n return value === \"ignore\" || value === \"report\" || value === \"validate\";\n}\n\nfunction validMarkdownLinkLimits(value: unknown): boolean {\n const limits = exactRecord(value, [\"maxMarkdownBytes\", \"maxOccurrences\", \"maxTargetReads\"]);\n return (\n limits !== undefined &&\n boundedPositiveSafeInteger(limits.maxMarkdownBytes, 16_777_216) &&\n boundedPositiveSafeInteger(limits.maxOccurrences, 100_000) &&\n boundedPositiveSafeInteger(limits.maxTargetReads, 10_000)\n );\n}\n"]}
1
+ {"version":3,"file":"options-validation.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { isAbsolute } from \"node:path\";\n\nimport { snapshotExactClosedRecord } from \"../../data-boundary/closed-values.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport { validProjectFileSelection } from \"../project-files/configuration.ts\";\nimport { validFindingPolicy } from \"../code-quality-findings/policy.ts\";\nimport type { ResolvedMarkdownLinkValidationOptions } from \"./options.ts\";\n\nfunction boundedPositiveSafeInteger(value: unknown, maximum: number): value is number {\n return isPositiveSafeInteger(value) && value <= maximum;\n}\n\nexport function validMarkdownLinkValidationOptions(\n value: unknown\n): value is ResolvedMarkdownLinkValidationOptions {\n const options = snapshotExactClosedRecord(value, [\n \"files\",\n \"findingPolicy\",\n \"requireExistingTargets\",\n \"validateSameDocumentAnchors\",\n \"validateCrossDocumentAnchors\",\n \"rootExternalTargetMode\",\n \"requireNonEmptyDirectories\",\n \"cache\",\n \"limits\"\n ]);\n return options !== undefined && validOptionFields(options);\n}\n\nfunction validOptionFields(options: Readonly<Record<string, unknown>>): boolean {\n return (\n validProjectFileSelection(options.files) &&\n validFindingPolicy(options.findingPolicy) &&\n validAnchorValidationOptions(options) &&\n validMarkdownLinkCache(options.cache) &&\n validMarkdownLinkLimits(options.limits)\n );\n}\n\nfunction validMarkdownLinkCache(value: unknown): boolean {\n const disabled = snapshotExactClosedRecord(value, [\"enabled\"]);\n if (disabled !== undefined && disabled.enabled === false) return true;\n const enabled = snapshotExactClosedRecord(value, [\"enabled\", \"directory\"]);\n return (\n enabled !== undefined &&\n enabled.enabled === true &&\n typeof enabled.directory === \"string\" &&\n enabled.directory.length > 0 &&\n !enabled.directory.includes(\"\\0\") &&\n isAbsolute(enabled.directory)\n );\n}\n\nfunction validAnchorValidationOptions(options: Readonly<Record<string, unknown>>): boolean {\n return (\n typeof options.requireExistingTargets === \"boolean\" &&\n typeof options.validateSameDocumentAnchors === \"boolean\" &&\n typeof options.validateCrossDocumentAnchors === \"boolean\" &&\n validRootExternalTargetMode(options.rootExternalTargetMode) &&\n typeof options.requireNonEmptyDirectories === \"boolean\"\n );\n}\n\nfunction validRootExternalTargetMode(value: unknown): boolean {\n return value === \"ignore\" || value === \"report\" || value === \"validate\";\n}\n\nfunction validMarkdownLinkLimits(value: unknown): boolean {\n const limits = snapshotExactClosedRecord(value, [\n \"maxMarkdownBytes\",\n \"maxOccurrences\",\n \"maxTargetReads\"\n ]);\n return (\n limits !== undefined &&\n boundedPositiveSafeInteger(limits.maxMarkdownBytes, 16_777_216) &&\n boundedPositiveSafeInteger(limits.maxOccurrences, 100_000) &&\n boundedPositiveSafeInteger(limits.maxTargetReads, 10_000)\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\n\nexport type MarkdownRootExternalTargetMode = \"ignore\" | \"report\" | \"validate\";\n\n/** 可省略的 Markdown validation work limits。 */\nexport interface MarkdownLinkValidationLimitOptions {\n readonly maxMarkdownBytes?: number;\n readonly maxOccurrences?: number;\n readonly maxTargetReads?: number;\n}\n\n/** `markdownLinkValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface MarkdownLinkValidationOptions {\n /** 参与本 Check 的 Markdown source selection;省略字段使用 package defaults。 */\n readonly files?: ProjectFileSelectionOptions;\n /** local-reference finding 是否使本 Check failed;省略时为 non-blocking。 */\n readonly findingPolicy?: FindingPolicy;\n /** `false` 时缺失的本地文件或目录不构成 finding。 */\n readonly requireExistingTargets?: boolean;\n /** 是否检查 `#anchor` 对当前 Markdown 文档标题的引用。 */\n readonly validateSameDocumentAnchors?: boolean;\n /** 是否检查直接指向的 Markdown 文件中的 `#anchor`。 */\n readonly validateCrossDocumentAnchors?: boolean;\n /** root 外本机目标的授权模式;不授权网络请求。 */\n readonly rootExternalTargetMode?: MarkdownRootExternalTargetMode;\n /** 是否将空目录目标视为 finding。 */\n readonly requireNonEmptyDirectories?: boolean;\n /** 每次运行的 Markdown 内容、occurrence 和 direct target work 上限。 */\n readonly limits?: MarkdownLinkValidationLimitOptions;\n}\n\n/** `markdown-link-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedMarkdownLinkValidationOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly requireExistingTargets: boolean;\n readonly validateSameDocumentAnchors: boolean;\n readonly validateCrossDocumentAnchors: boolean;\n readonly rootExternalTargetMode: MarkdownRootExternalTargetMode;\n readonly requireNonEmptyDirectories: boolean;\n readonly limits: Readonly<{\n readonly maxMarkdownBytes: number;\n readonly maxOccurrences: number;\n readonly maxTargetReads: number;\n }>;\n}\n"]}
1
+ {"version":3,"file":"options.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/options.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ProjectFileSelection,\n ProjectFileSelectionOptions\n} from \"../project-files/configuration.ts\";\nimport type { FindingPolicy } from \"../code-quality-findings/policy.ts\";\n\nexport type MarkdownRootExternalTargetMode = \"ignore\" | \"report\" | \"validate\";\n\n/** 调用方显式拥有的 Link-private parse-facts local cache policy。 */\ntype MarkdownLinkValidationCacheOptions =\n | Readonly<{ readonly enabled: false }>\n | Readonly<{\n readonly enabled: true;\n readonly directory: string;\n }>;\n\n/** 可省略的 Markdown validation work limits。 */\nexport interface MarkdownLinkValidationLimitOptions {\n readonly maxMarkdownBytes?: number;\n readonly maxOccurrences?: number;\n readonly maxTargetReads?: number;\n}\n\n/** `markdownLinkValidation(options?)` 接受的可省略 authoring policy。 */\nexport interface MarkdownLinkValidationOptions {\n /** 参与本 Check 的 Markdown source selection;省略字段使用 package defaults。 */\n readonly files?: ProjectFileSelectionOptions;\n /** local-reference finding 是否使本 Check failed;省略时为 non-blocking。 */\n readonly findingPolicy?: FindingPolicy;\n /** `false` 时缺失的本地文件或目录不构成 finding。 */\n readonly requireExistingTargets?: boolean;\n /** 是否检查 `#anchor` 对当前 Markdown 文档标题的引用。 */\n readonly validateSameDocumentAnchors?: boolean;\n /** 是否检查直接指向的 Markdown 文件中的 `#anchor`。 */\n readonly validateCrossDocumentAnchors?: boolean;\n /** root 外本机目标的授权模式;不授权网络请求。 */\n readonly rootExternalTargetMode?: MarkdownRootExternalTargetMode;\n /** 是否将空目录目标视为 finding。 */\n readonly requireNonEmptyDirectories?: boolean;\n /** 每次运行的 Markdown 内容、occurrence 和 direct target work 上限。 */\n readonly limits?: MarkdownLinkValidationLimitOptions;\n /**\n * 显式启用的、调用方拥有的 Link parse-facts persistent cache。省略时关闭;enabled directory 必须 absolute、可信且可删除。\n * 本 Check 只在其中使用 `markdown-link-parse-facts-v1.jsonl` 保存 source-derived facts;调用方负责容量和删除,且不提供\n * confidentiality、automatic cleanup、concurrency 或 durability guarantees。cache 不可用时 fresh-parse,Check 结果不变。\n */\n readonly cache?: MarkdownLinkValidationCacheOptions;\n}\n\n/** `markdown-link-validation` execution 消费的完整、冻结 options。 */\nexport interface ResolvedMarkdownLinkValidationOptions {\n readonly files: ProjectFileSelection;\n readonly findingPolicy: FindingPolicy;\n readonly requireExistingTargets: boolean;\n readonly validateSameDocumentAnchors: boolean;\n readonly validateCrossDocumentAnchors: boolean;\n readonly rootExternalTargetMode: MarkdownRootExternalTargetMode;\n readonly requireNonEmptyDirectories: boolean;\n readonly cache: MarkdownLinkValidationCacheOptions;\n readonly limits: Readonly<{\n readonly maxMarkdownBytes: number;\n readonly maxOccurrences: number;\n readonly maxTargetReads: number;\n }>;\n}\n"]}
@@ -0,0 +1,185 @@
1
+ import { createHash } from "node:crypto";
2
+ import { snapshotClosedArray, snapshotExactClosedRecord } from "../../data-boundary/closed-values.mjs";
3
+ import { canonicalJsonText } from "../../data-boundary/canonical-data.mjs";
4
+ import { isPositiveSafeInteger } from "../../data-boundary/value-shapes.mjs";
5
+ const CACHE_FORMAT_VERSION = "markdown-link-parse-facts-jsonl-v1";
6
+ const CACHE_PAYLOAD_VERSION = "1";
7
+ /** Version the resolver memo and persistent identity share when parser facts change. */
8
+ export const MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION = "mdast-gfm-frontmatter-github-slug-v1";
9
+ const MAX_FACTS_PER_DOCUMENT = 100_000;
10
+ const MAX_FACT_STRING_LENGTH = 16_777_216;
11
+ /**
12
+ * Serializes one complete Link-private JSONL envelope from immutable parser facts.
13
+ * The session owns when this line is appended; this codec owns its shape and identity.
14
+ */
15
+ export function cacheEnvelopeLine(identityDigest, facts) {
16
+ return `${canonicalJsonText({
17
+ cacheFormatVersion: CACHE_FORMAT_VERSION,
18
+ identityDigest,
19
+ parserContractVersion: MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION,
20
+ payloadVersion: CACHE_PAYLOAD_VERSION,
21
+ payload: projectMarkdownLinkParseFactsPayload(facts)
22
+ })}\n`;
23
+ }
24
+ /** Restores one complete, current-version JSONL envelope or rejects it as a cache miss. */
25
+ export function parseCacheEnvelopeLine(line) {
26
+ try {
27
+ const envelope = snapshotExactClosedRecord(JSON.parse(line), [
28
+ "cacheFormatVersion",
29
+ "identityDigest",
30
+ "parserContractVersion",
31
+ "payloadVersion",
32
+ "payload"
33
+ ]);
34
+ if (!isCurrentCacheEnvelope(envelope))
35
+ return undefined;
36
+ return Object.freeze({
37
+ identityDigest: envelope.identityDigest,
38
+ facts: parseMarkdownLinkParseFactsPayload(envelope.payload)
39
+ });
40
+ }
41
+ catch {
42
+ return undefined;
43
+ }
44
+ }
45
+ /** SHA-256 identity over the current, exact authorized Markdown bytes. */
46
+ export function markdownBytesDigest(bytes) {
47
+ return createHash("sha256").update(bytes).digest("hex");
48
+ }
49
+ /** Converts parser-owned immutable facts to the closed persistent JSON payload. */
50
+ export function projectMarkdownLinkParseFactsPayload(facts) {
51
+ return Object.freeze({
52
+ occurrences: Object.freeze(facts.occurrences.map((occurrence) => Object.freeze({
53
+ kind: occurrence.kind,
54
+ rawDestination: occurrence.rawDestination,
55
+ range: projectSourceRange(occurrence.range)
56
+ }))),
57
+ headings: Object.freeze(facts.headings.map((heading) => Object.freeze({ slug: heading.slug, range: projectSourceRange(heading.range) })))
58
+ });
59
+ }
60
+ /** Strictly restores the Link-private persistent JSON payload to immutable parser facts. */
61
+ export function parseMarkdownLinkParseFactsPayload(value) {
62
+ const payload = snapshotExactClosedRecord(value, ["occurrences", "headings"]);
63
+ if (payload === undefined)
64
+ throw new TypeError("Markdown Link cache payload must be closed");
65
+ const occurrences = parseOccurrences(payload.occurrences);
66
+ const headings = parseHeadings(payload.headings);
67
+ if (occurrences === undefined || headings === undefined) {
68
+ throw new TypeError("Markdown Link cache payload contains invalid parse facts");
69
+ }
70
+ return Object.freeze({ occurrences, headings });
71
+ }
72
+ function isCurrentCacheEnvelope(envelope) {
73
+ return (envelope !== undefined &&
74
+ envelope.cacheFormatVersion === CACHE_FORMAT_VERSION &&
75
+ validIdentityDigest(envelope.identityDigest) &&
76
+ envelope.parserContractVersion === MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION &&
77
+ envelope.payloadVersion === CACHE_PAYLOAD_VERSION);
78
+ }
79
+ function validIdentityDigest(value) {
80
+ return typeof value === "string" && /^[a-f0-9]{64}$/u.test(value);
81
+ }
82
+ function parseOccurrences(value) {
83
+ const values = boundedPayloadArray(value);
84
+ if (values === undefined)
85
+ return undefined;
86
+ const occurrences = [];
87
+ for (const candidate of values) {
88
+ const occurrence = snapshotExactClosedRecord(candidate, ["kind", "rawDestination", "range"]);
89
+ if (occurrence === undefined ||
90
+ (occurrence.kind !== "image" && occurrence.kind !== "link") ||
91
+ !validFactString(occurrence.rawDestination)) {
92
+ return undefined;
93
+ }
94
+ const range = parseSourceRange(occurrence.range);
95
+ if (range === undefined)
96
+ return undefined;
97
+ occurrences.push(Object.freeze({ kind: occurrence.kind, rawDestination: occurrence.rawDestination, range }));
98
+ }
99
+ return Object.freeze(occurrences);
100
+ }
101
+ function parseHeadings(value) {
102
+ const values = boundedPayloadArray(value);
103
+ if (values === undefined)
104
+ return undefined;
105
+ const headings = [];
106
+ for (const candidate of values) {
107
+ const heading = snapshotExactClosedRecord(candidate, ["slug", "range"]);
108
+ if (heading === undefined || !validFactString(heading.slug))
109
+ return undefined;
110
+ const range = parseSourceRange(heading.range);
111
+ if (range === undefined)
112
+ return undefined;
113
+ headings.push(Object.freeze({ slug: heading.slug, range }));
114
+ }
115
+ return Object.freeze(headings);
116
+ }
117
+ function boundedPayloadArray(value) {
118
+ const values = snapshotClosedArray(value);
119
+ return values !== undefined && values.length <= MAX_FACTS_PER_DOCUMENT ? values : undefined;
120
+ }
121
+ function validFactString(value) {
122
+ return (typeof value === "string" &&
123
+ value.length <= MAX_FACT_STRING_LENGTH &&
124
+ !hasUnpairedSurrogate(value));
125
+ }
126
+ function parseSourceRange(value) {
127
+ const range = snapshotExactClosedRecord(value, ["startOffset", "endOffset", "start", "end"]);
128
+ if (range === undefined ||
129
+ !boundedNonNegativeSafeInteger(range.startOffset) ||
130
+ !boundedNonNegativeSafeInteger(range.endOffset) ||
131
+ range.endOffset < range.startOffset) {
132
+ return undefined;
133
+ }
134
+ const start = parseSourcePosition(range.start);
135
+ const end = parseSourcePosition(range.end);
136
+ if (start === undefined || end === undefined || !sourcePositionFollows(end, start)) {
137
+ return undefined;
138
+ }
139
+ return Object.freeze({ startOffset: range.startOffset, endOffset: range.endOffset, start, end });
140
+ }
141
+ function sourcePositionFollows(end, start) {
142
+ return end.line > start.line || (end.line === start.line && end.column >= start.column);
143
+ }
144
+ function parseSourcePosition(value) {
145
+ const position = snapshotExactClosedRecord(value, ["line", "column"]);
146
+ if (position === undefined ||
147
+ !boundedPositiveSafeInteger(position.line) ||
148
+ !boundedPositiveSafeInteger(position.column)) {
149
+ return undefined;
150
+ }
151
+ return Object.freeze({ line: position.line, column: position.column });
152
+ }
153
+ function projectSourceRange(range) {
154
+ return Object.freeze({
155
+ startOffset: range.startOffset,
156
+ endOffset: range.endOffset,
157
+ start: Object.freeze({ line: range.start.line, column: range.start.column }),
158
+ end: Object.freeze({ line: range.end.line, column: range.end.column })
159
+ });
160
+ }
161
+ function boundedNonNegativeSafeInteger(value) {
162
+ return (typeof value === "number" &&
163
+ Number.isSafeInteger(value) &&
164
+ value >= 0 &&
165
+ value <= MAX_FACT_STRING_LENGTH);
166
+ }
167
+ function boundedPositiveSafeInteger(value) {
168
+ return isPositiveSafeInteger(value) && value <= MAX_FACT_STRING_LENGTH + 1;
169
+ }
170
+ function hasUnpairedSurrogate(value) {
171
+ for (let index = 0; index < value.length; index += 1) {
172
+ const codeUnit = value.charCodeAt(index);
173
+ if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
174
+ const nextCodeUnit = value.charCodeAt(index + 1);
175
+ if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff))
176
+ return true;
177
+ index += 1;
178
+ continue;
179
+ }
180
+ if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff)
181
+ return true;
182
+ }
183
+ return false;
184
+ }
185
+ //# sourceMappingURL=parse-facts-cache-payload.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-facts-cache-payload.mjs","sourceRoot":"","sources":["../../../../src/package-checks/markdown-link-validation/parse-facts-cache-payload.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n snapshotClosedArray,\n snapshotExactClosedRecord\n} from \"../../data-boundary/closed-values.ts\";\nimport { canonicalJsonText } from \"../../data-boundary/canonical-data.ts\";\nimport { isPositiveSafeInteger } from \"../../data-boundary/value-shapes.ts\";\nimport type {\n MarkdownHeading,\n MarkdownLinkOccurrence,\n MarkdownSourcePosition,\n MarkdownSourceRange,\n ParsedMarkdownLinkFacts\n} from \"./markdown-parser.ts\";\n\nconst CACHE_FORMAT_VERSION = \"markdown-link-parse-facts-jsonl-v1\";\nconst CACHE_PAYLOAD_VERSION = \"1\";\n/** Version the resolver memo and persistent identity share when parser facts change. */\nexport const MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION =\n \"mdast-gfm-frontmatter-github-slug-v1\";\nconst MAX_FACTS_PER_DOCUMENT = 100_000;\nconst MAX_FACT_STRING_LENGTH = 16_777_216;\n\ntype MarkdownLinkParseFactsPayload = Readonly<{\n readonly occurrences: readonly MarkdownLinkOccurrence[];\n readonly headings: readonly MarkdownHeading[];\n}>;\n\n/**\n * Serializes one complete Link-private JSONL envelope from immutable parser facts.\n * The session owns when this line is appended; this codec owns its shape and identity.\n */\nexport function cacheEnvelopeLine(identityDigest: string, facts: ParsedMarkdownLinkFacts): string {\n return `${canonicalJsonText({\n cacheFormatVersion: CACHE_FORMAT_VERSION,\n identityDigest,\n parserContractVersion: MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION,\n payloadVersion: CACHE_PAYLOAD_VERSION,\n payload: projectMarkdownLinkParseFactsPayload(facts)\n })}\\n`;\n}\n\n/** Restores one complete, current-version JSONL envelope or rejects it as a cache miss. */\nexport function parseCacheEnvelopeLine(\n line: string\n):\n | Readonly<{ readonly identityDigest: string; readonly facts: ParsedMarkdownLinkFacts }>\n | undefined {\n try {\n const envelope = snapshotExactClosedRecord(JSON.parse(line), [\n \"cacheFormatVersion\",\n \"identityDigest\",\n \"parserContractVersion\",\n \"payloadVersion\",\n \"payload\"\n ]);\n if (!isCurrentCacheEnvelope(envelope)) return undefined;\n return Object.freeze({\n identityDigest: envelope.identityDigest,\n facts: parseMarkdownLinkParseFactsPayload(envelope.payload)\n });\n } catch {\n return undefined;\n }\n}\n\n/** SHA-256 identity over the current, exact authorized Markdown bytes. */\nexport function markdownBytesDigest(bytes: Uint8Array): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\n/** Converts parser-owned immutable facts to the closed persistent JSON payload. */\nexport function projectMarkdownLinkParseFactsPayload(\n facts: ParsedMarkdownLinkFacts\n): MarkdownLinkParseFactsPayload {\n return Object.freeze({\n occurrences: Object.freeze(\n facts.occurrences.map((occurrence) =>\n Object.freeze({\n kind: occurrence.kind,\n rawDestination: occurrence.rawDestination,\n range: projectSourceRange(occurrence.range)\n })\n )\n ),\n headings: Object.freeze(\n facts.headings.map((heading) =>\n Object.freeze({ slug: heading.slug, range: projectSourceRange(heading.range) })\n )\n )\n });\n}\n\n/** Strictly restores the Link-private persistent JSON payload to immutable parser facts. */\nexport function parseMarkdownLinkParseFactsPayload(value: unknown): ParsedMarkdownLinkFacts {\n const payload = snapshotExactClosedRecord(value, [\"occurrences\", \"headings\"]);\n if (payload === undefined) throw new TypeError(\"Markdown Link cache payload must be closed\");\n const occurrences = parseOccurrences(payload.occurrences);\n const headings = parseHeadings(payload.headings);\n if (occurrences === undefined || headings === undefined) {\n throw new TypeError(\"Markdown Link cache payload contains invalid parse facts\");\n }\n return Object.freeze({ occurrences, headings });\n}\n\nfunction isCurrentCacheEnvelope(\n envelope: Readonly<Record<string, unknown>> | undefined\n): envelope is Readonly<{\n readonly identityDigest: string;\n readonly payload: unknown;\n}> {\n return (\n envelope !== undefined &&\n envelope.cacheFormatVersion === CACHE_FORMAT_VERSION &&\n validIdentityDigest(envelope.identityDigest) &&\n envelope.parserContractVersion === MARKDOWN_LINK_PARSE_FACTS_PARSER_CONTRACT_VERSION &&\n envelope.payloadVersion === CACHE_PAYLOAD_VERSION\n );\n}\n\nfunction validIdentityDigest(value: unknown): value is string {\n return typeof value === \"string\" && /^[a-f0-9]{64}$/u.test(value);\n}\n\nfunction parseOccurrences(value: unknown): readonly MarkdownLinkOccurrence[] | undefined {\n const values = boundedPayloadArray(value);\n if (values === undefined) return undefined;\n const occurrences: MarkdownLinkOccurrence[] = [];\n for (const candidate of values) {\n const occurrence = snapshotExactClosedRecord(candidate, [\"kind\", \"rawDestination\", \"range\"]);\n if (\n occurrence === undefined ||\n (occurrence.kind !== \"image\" && occurrence.kind !== \"link\") ||\n !validFactString(occurrence.rawDestination)\n ) {\n return undefined;\n }\n const range = parseSourceRange(occurrence.range);\n if (range === undefined) return undefined;\n occurrences.push(\n Object.freeze({ kind: occurrence.kind, rawDestination: occurrence.rawDestination, range })\n );\n }\n return Object.freeze(occurrences);\n}\n\nfunction parseHeadings(value: unknown): readonly MarkdownHeading[] | undefined {\n const values = boundedPayloadArray(value);\n if (values === undefined) return undefined;\n const headings: MarkdownHeading[] = [];\n for (const candidate of values) {\n const heading = snapshotExactClosedRecord(candidate, [\"slug\", \"range\"]);\n if (heading === undefined || !validFactString(heading.slug)) return undefined;\n const range = parseSourceRange(heading.range);\n if (range === undefined) return undefined;\n headings.push(Object.freeze({ slug: heading.slug, range }));\n }\n return Object.freeze(headings);\n}\n\nfunction boundedPayloadArray(value: unknown): readonly unknown[] | undefined {\n const values = snapshotClosedArray(value);\n return values !== undefined && values.length <= MAX_FACTS_PER_DOCUMENT ? values : undefined;\n}\n\nfunction validFactString(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= MAX_FACT_STRING_LENGTH &&\n !hasUnpairedSurrogate(value)\n );\n}\n\nfunction parseSourceRange(value: unknown): MarkdownSourceRange | undefined {\n const range = snapshotExactClosedRecord(value, [\"startOffset\", \"endOffset\", \"start\", \"end\"]);\n if (\n range === undefined ||\n !boundedNonNegativeSafeInteger(range.startOffset) ||\n !boundedNonNegativeSafeInteger(range.endOffset) ||\n range.endOffset < range.startOffset\n ) {\n return undefined;\n }\n const start = parseSourcePosition(range.start);\n const end = parseSourcePosition(range.end);\n if (start === undefined || end === undefined || !sourcePositionFollows(end, start)) {\n return undefined;\n }\n return Object.freeze({ startOffset: range.startOffset, endOffset: range.endOffset, start, end });\n}\n\nfunction sourcePositionFollows(\n end: MarkdownSourcePosition,\n start: MarkdownSourcePosition\n): boolean {\n return end.line > start.line || (end.line === start.line && end.column >= start.column);\n}\n\nfunction parseSourcePosition(value: unknown): MarkdownSourcePosition | undefined {\n const position = snapshotExactClosedRecord(value, [\"line\", \"column\"]);\n if (\n position === undefined ||\n !boundedPositiveSafeInteger(position.line) ||\n !boundedPositiveSafeInteger(position.column)\n ) {\n return undefined;\n }\n return Object.freeze({ line: position.line, column: position.column });\n}\n\nfunction projectSourceRange(range: MarkdownSourceRange): MarkdownSourceRange {\n return Object.freeze({\n startOffset: range.startOffset,\n endOffset: range.endOffset,\n start: Object.freeze({ line: range.start.line, column: range.start.column }),\n end: Object.freeze({ line: range.end.line, column: range.end.column })\n });\n}\n\nfunction boundedNonNegativeSafeInteger(value: unknown): value is number {\n return (\n typeof value === \"number\" &&\n Number.isSafeInteger(value) &&\n value >= 0 &&\n value <= MAX_FACT_STRING_LENGTH\n );\n}\n\nfunction boundedPositiveSafeInteger(value: unknown): value is number {\n return isPositiveSafeInteger(value) && value <= MAX_FACT_STRING_LENGTH + 1;\n}\n\nfunction hasUnpairedSurrogate(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const nextCodeUnit = value.charCodeAt(index + 1);\n if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff)) return true;\n index += 1;\n continue;\n }\n if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) return true;\n }\n return false;\n}\n"]}